编程是一门技术,更加是一门艺术

2023-10-27




最近一段时间在学习“大话设计模式”,书籍开篇就提到“编程是一门技术,更加是一门艺术”这句经典。读罢,我不得不被作者程序设计模式这种与众不同的思维所折服。其实软件编程真的是一门了不起的艺术。


谈及“艺术”,人们自然会联想到“美”、“技艺”、“灵感”等词,但很少会把它和“计算机编程”这听起来似乎聒噪的词组联系在一起。呵呵!你如果那样想就错了,下面由我来为大家揭开“编程之美”这层美丽的面纱。


什么样的程序才是美的程序?这个问题似乎没有确切的答案。一个很酷的Demo或一个很炫的视频游戏都能让我们赞叹不已。Doom和HalfLife可以说把3D技术推向了极至,这种程序总能给人一种视觉上的美,就像画家手中的美丽油画,只是程序员们的画布在电脑屏幕上,画笔是键盘。Linux也是一种美,一种开放的美,从Unix那里继承来的优雅的设计,强大的可移植性,丰富的工具,这让它看起来像优秀建筑师们设计的一座富丽堂皇的教堂。这些美是显而易见的。还有一种美,隐藏在程序背后,流动于源代码之间。什么又是美的代码呢?可能它们一看上去就很美。这里有一个“C#代码集合宏观定义”:允许程序建立常量,使它们看上去像是屏幕上的图形,程序的自描述能力大大加强!


这种只能在C#代码竞赛中才能见到的代码虽然没有多少实用价值,但它的确能让我们感受到代码 ——“一堆有规则的符号”——也能创造出视觉上的美。也可能是程序使用的技巧 —— 算法很美,快速排序程序,自然而然地使用递归让它们看起来很紧凑,易读,这当然也是一种美,是只有程序员才能体会到的美。还有一种美,深藏在代码之后,是程序的设计思想之美,一种需要领悟的美。

人们都喜欢美的东西,程序员们更是珍视美的程序,我们把那些创造美好程序的人尊称为“尖端程序员”。尖端程序员和画家的共同之处是,他们都是创造者。他们和作曲家,建筑师,作家一样,尖端程序员和画家尝试去做的也是创造好的东西。他们本身并不做研究,但是如果在创造好东西的过程中发现了一些新的技术,那就更好了。



好的画家是艺术家,那么好的程序员——也是艺术家。像我们熟知的Microsoft、Oracle、Amazon、Google、Facebook等的创始人、李彦宏、马化腾、周鸿祎等等他们一样,都是一些了不起的艺术大家。难怪有人说:最顶尖的5%的程序员写出了全世界99%的优秀软件。

编写优美的程序需要灵感和高超的技巧,就像诗人写诗,画家作画,建筑师构筑,充满了乐趣、挑战和美。优雅的程序会像诗歌一样耐人寻味,像名画那样大开眼界,像教堂一样堂皇华丽。所以,计算机编程也同样是一门艺术,程序员就是创造这种艺术的艺术家。


计算机给人的乐趣在于,如果你有什么好的想法,你可以马上实验去得到结果。当然,你可能不会立刻得到正确答案,而必须坐下来,盯着电脑屏幕,苦思冥想求解问题的有效方法,通过不断的尝试去验证你的结果。可以通过找到正确的方法,使问题突然消失,也可以换一个角度,突然灵光闪现:原来是这样!


编程是对创造力的训练,好的程序员不会循规蹈矩,不会使用平庸的方法去解决问题,而是根据自己的见解去寻找更简单的方法,因为他们能看到隐藏在问题背后的实质。然后他们会写出全新而漂亮的程序去验证他们的方法。“不过还是很难说清楚,闭门苦思冥想地要找到解决某个问题的漂亮答案,为什么竟会有如此巨大的魅力。但是,你要是曾经有过找到更好方法的经历,你就会明白,这简直是无以伦比的感觉。”这种感觉能让我们快乐得像一个孩子,乐不知疲。


这种“无以伦比”的感觉,流动在程序员体内,让程序员们为之痴迷,疯狂。而痴迷的程序员从他艺术性的创造中得到了难以言传的乐趣,并让为之上瘾。

正如他们如是说:「电影人似乎不能理解程序员创建一样东西纯粹的是因为他们喜欢创建东西。」 ——马克•扎克伯格评电影《社交网络》。

「我们不停地添加代码,像画家添加色彩,作曲家添加音符,每一个小细节都必须有依据……努力使每件事情完美地组合在一起,以一种前人未曾做过的方式。这使得工程师称为真正的艺术家。」——斯蒂夫•沃兹尼亚克

硅谷创业孵化公司Y.Combinator创始人保罗•格雷厄姆的说法则更为直接:「程序员是现存最大的手工艺人群体,程序员你与画家的共同之处,在于他们都是创作者,都试图创作出优秀的作品。」

「光有科技是不够的。科技要和人文、艺术联姻,才能产生让我们的心为之歌唱的结果。」——史蒂夫•乔布斯



编程给人带来最初的兴奋很好解释:那就是通过编程你可以支配一台计算机,你叫计算机做什么,它就做什么,永远准确无误,而且毫无怨言。这本身就很有意思。

它比下棋之类的游戏更有乐趣得多,因为它可以由你自己来制定游戏规则。而你制定什么样的规则,也就会导出与此规则相符合的结果。

在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝——在一个较小的层面上。

无疑,乐在其中,外行人永远体会不到,毕竟“子非鱼安知鱼之乐”。无穷无尽的乐趣让程序员们模糊地体会到了作为艺术家的快乐,并且开始享受他们的工作。

“我们已经看到,计算机编程是一门艺术,因为它把积累的知识应用于世界,因为它需要技巧和灵巧,尤其是因为它创造出了美的目标。模糊地意识到自己是一个艺术家的程序员将会享受他所做的工作,而且将会把它做得更好。”




下面是一些编程黄金法则,很美很犀利,望各大程序员好好体会和领悟。

 “小巧就是美的。”(Small is beautiful.

“让每个程序都擅长做一件事。”(Make each programdo one thing well.

“一切都是文件。”(Everything is a file.

“沉默是金。”(Silence is golden.

“让操作系统内核小而轻巧。”(Make operatingsystem kernels small and lightweight.

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程是一门技术,更加是一门艺术 的相关文章

  • 一张图告诉你,MES系统是什么

    MES系统 就要说到生产 涉及到人 钱 货 信息等资源 产 供 销 还有供应商 客户 合作伙伴 其中 产 就是生产 而生产管理就是通过对生产系统的战略规划 组织 指挥 实施 协调和控制 实现生产系统的物质转化 产品生产和价值提升的过程 擅长
  • 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题

    解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1 问题 2 解决 3 源代码 参考 1 问题 读取H264视频 抽帧视频并保存 报错如下 aac 00000220b9a07fc0 Input
  • 华为OD机试 - 火星文计算(Java)

    目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 已知火星人使用的运算符为 其与地球人的等价公式如下 x y 2 x 3 y 4 x y 3 x y 2 其中x y是无符号整数 地球人公式按C语言规则计算 火星人公式中
  • Work with shaders and shader resources

    It s time to learn how to work with shaders and shader resources in developing your Microsoft DirectX game for Windows 8
  • 如何输出*.ply文件

    所谓ply文件格式 是由斯坦福大学开发的一套三维mesh模型数据格式 图形学领域内很多著名的模型数据 比如斯坦福的三维扫描数据库 其中包括很多文章中会见到的Happy Buddha Dragon Bunny兔子 最初的模型都是基于这个格式的
  • 夜莺(Nightingale)企业级监控平台

    元芳算法服务部署 监控篇 内部 简介 夜莺 Nightingale 是滴滴基础平台联合滴滴云研发和开源的企业级监控解决方案 旨在满足云原生时代企业级的监控需求 Nightingale在产品完成度 系统高可用 以及用户体验方面 达到了企业级的
  • java压缩文件工具类

    java压缩文件的各种方式及速度对比 1使用场景 2 maven依赖 3 压缩文件工具类 4 对比结果查看 1使用场景 开发过程中可能会用到压缩文件的需求 是用什么方式更快呢 本次就对几种常见的压缩方式做一个对比 2 maven依赖 引用c
  • java.lang.NoClassDefFoundError: org/springframework/jdbc/core/JdbcTemplate dao.EmployeeDAO.addEmplo

    文章目录 报错 java lang NoClassDefFoundError org springframework jdbc core JdbcTemplate lib文件要放到WEB INF下 jar包文件夹的名字一定要是lib 如果是
  • 树的后序遍历(递归和非递归)

    树的后序遍历 左右根 代码写起来还是很简单的 就几行代码 public void postOrder Node node if node getLeft null postOrder node getLeft if node getRigh
  • 关于arxiv的PDF加载过慢的解决办法

    arxiv 的 PDF 下载速度很慢 下面是一些加速方法 1 命令行直接下载 我们知道可以用wget命令下载一些网络文件 不过arxiv 上的论文使用wget下载时需要加参数 user agent Lynx 速度才能较快 下面是使用的例子
  • 自学测试半年,我终于收到了腾讯的offer,收到消息的那一刻我激动的哭出了声...

    我是一名毕业于普通一本的化学专业学生 毕业的两年时间里 我一直奔波在化工厂里 每天工作三班倒 下了班就是一包烟一瓶酒 生活过得非常堕落 原本想着虽然每天很累 但是至少稳定 然而没有想到的是 化工行业也有职业危机 越来越多的高科技代替人工 我
  • public class Solution { public int JumpFloorII(int target) { int a=1; int b=2; if(target...

    类似于青蛙跳台阶 当n 1时 只有一种横向排列的方式 当n等于二时 2 2有两种选择 横向或者是竖向 当n等于3的时候对于2 3来说 如果选择的是竖向排列 则剩下的就是2 2排列 如果选择的是横向 则对于2 n剩下的则只有1 n的一种选择
  • 总结内存(RAM或ROM)和FLASH存储的真正区别

    本文主要向大家介绍了内存 RAM或ROM 和FLASH存储的真正区别 通过具体的分析 让大家能够了解它们 希望对大家学习内存 RAM或ROM 和FLASH存储有所帮助 1 什么是内存 什么是内存呢 在计算机的组成结构中 有一个很重要的部分
  • C++ 迭代器,常用五种迭代器

    一文读懂C 五种常用的迭代器 c STL迭代器 iterator C 迭代器 什么是迭代器 好怪异的名词 搞了好多年都没有搞懂 说白了 迭代器 就是 开瓶器 而已 开瓶器的种类 有开啤酒瓶的 有开红酒瓶的 还有其他xx的 它们的目的 都是为
  • 再谈优雅重试(retry)机制

    业务场景 应用中需要实现一个功能 需要将数据上传到远程存储服务 同时在返回处理成功情况下做其他操作 这个功能不复杂 分为两个步骤 第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果 第二步拿到第一步结果或者捕捉异常 如果出现错误或异
  • 顾客端我的订单开发心得与体会

    顾客端中有一个我的订单 显示已经点了的菜品 点了菜的话会把这个菜品的信息放入到餐桌的缓存中 我的订单的菜品是从这个缓存中取出来的 进入我的订单是个刷页 就是把需要的信息放在model里返回给jsp页面 jsp页面中有input标签 刚弄好了
  • OutPutStream输出文件

    package zmx Io import java io File import java io FileNotFoundException import java io FileOutputStream import java io I
  • 地理信息安全在线培训考试系统题库-单选题

    根据 测绘成果管理条例 利用涉及国家秘密测绘成果开发生产的产品 未经 A 进行保密技术处理的 其秘密等级不得低于所用测绘成果的秘密等级 A 国务院测绘行政主管部门或者省 自治区 直辖市人民政府测绘行政主管部门 B 省级以上保密管理部门 C
  • 超市运营情况分析

    超市运营情况分析 本文选取的数据源涵盖了2017年至今的客户 订单 地点和产品数据 本文主要聚焦出现负利润的省 自治区的运营情况 对其出现负利润的原因加以探讨 并分析预测这些省 自治区未来的利润情况 对超市的运营管理决策提供有效的数据支持

随机推荐

  • Shell数组:shell数组的定义、数组长度

    Shell在编程方面比Windows批处理强大很多 无论是在循环 运算 bash支持一维数组 不支持多维数组 并且没有限定数组的大小 类似与C语言 数组元素的下标由0开始编号 获取数组中的元素要利用下标 下标可以是整数或算术表达式 其值应大
  • qt超易实现录屏程序的方法

    QT录屏程序的实现 1 获取桌面的图像 The QApplication desktop function is used to get an instance of QDesktopWidget QApplication desktop
  • Git删除本地在远端已经删除的分支

    git remote prune origin
  • python gzipped source tarball,下载及安装Python详细步骤

    安装python分三个步骤 下载python 安装python 检查是否安装成功 1 下载Python 2 选择下载的版本 3 点开Download后 找到下载文件 Gzipped source tarball 是Linux系统下载的版本
  • python3.7成功换虚拟环境python3.6

    目录 1 打开CMD 查看自己有多少虚拟环境 2 打开anaconda prompt 终端 创建 3 6环境 3 在pycharm中从3 7正确换配置为3 6环境 1 打开CMD 查看自己有多少虚拟环境 C Users Administra
  • shell 中的单行注释和多行注释

    今天在学习shell编程的时候 当自己想对多行进行注释时 发现自己不会 所以在网上去查询下 参考 作者 lansesl2008 地址 http blog csdn net lansesl2008 article details 205583
  • 疯传全网网络10个运维巡检脚本以及使用小技巧

    哈喽大家好 欢迎来到虚拟化时代君 XNHCYL 大家好 我是虚拟化时代君 一位潜心于互联网的技术宅男 这里每天为你分享各种你感兴趣的技术 教程 软件 资源 福利 每天更新不间断 福利不见不散 第1章 前言 巡检脚本在网络运维中非常重要 近期
  • Jenkins远程命令执行漏洞(CVE-2018-1000861)

    声明 好好学习 天天向上 漏洞描述 Jenkins使用Stapler框架开发 其允许用户通过URL PATH来调用一次public方法 由于这个过程没有做限制 攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法 通过这个漏洞 我们
  • C单元测试框架——CMockery (1) 简介

    cmockery 是google发布的用于C单元测试的一个轻量级的框架 主要特点 免费且开源 google提供技术支持 轻量级的框架 使测试更加快速简单 避免使用复杂的编译器特性 对老版本的编译器来讲 兼容性好 并不强制要求待测代码必须依赖
  • 【设计模式】-设计模式总目录

    设计模式 重要性不多说了 之前在简书上简单总结过 这次再来总结一次 更详细版 以此加深印象和帮助理解 01 单例模式 https blog csdn net lovexiaotaozi article details 83896573 02
  • Java并发编程——ReentrantLock重入锁解析

    重入锁 所谓重入锁 即支持重入性 表示能够对共享资源重复加锁 即当前线程获取该锁再次获取不会被阻塞 重入性 在线程获取锁的时候 如果已经获取锁的线程是当前线程的话则直接再次获取成功 由于锁会被获取n次 那么只有锁在被释放同样的n次之后 该锁
  • 二叉树的层序遍历,以及求层数

    二叉树的中序遍历 最主要的一种方法是用队列 Queue 来实现 下面贴出一份实现代码 class Tree int data Tree lchild 左孩子 Tree rchild 右孩子 以下是主要方法 public static voi
  • 自己实现telnet程序

    转自 http blog csdn net gujintong1110 article details 44278535 include
  • Metasploitable渗透测试实战:ms17-010

    漏洞简介 永恒之蓝 即ms17 010 是指2017年4月14日晚 黑客团体Shadow Brokers 影子经纪人 公布一大批网络攻击工具 其中包含 永恒之蓝 工具 永恒之蓝 利用Windows系统的SMB漏洞可以获取系统最高权限 5月1
  • 论文解读:Improving Nighttime Driving-Scene Segmentation via Dual Image-adaptive Learnable Filters

    论文地址 https arxiv org abs 2207 01331 发表时间 Submitted on 4 Jul 2022 v1 last revised 20 Mar 2023 this version v2 项目地址 https
  • C语言穷举解决最大子序列含测试

    题目再现 设给定一个整数序列 a 1 a 2
  • Python语言:列表初体验

    列表是Python中的一个对象 他类似于C语言中的数组 可以存储许多数据 也可以称之为数据集合 他原则是可以存储不同类型的数据 一般不建议这样使用 有点奇怪 一般情况下一个列表中保存的都是同一种类型的数据 列表的创建 列表 list 是把数
  • qml界面参数传递、返回

    背景 设计设置界面时需要在键盘上设置数值 设定完返回时需要知道返回值是什么 如果用上下级关系实现可能很方便 但是会重复加载按键模块 觉得这样不好 想用stackView push url 初始值 设定后的值 这样的方式 1 想过用带参数信号
  • Java事件机制简介 内含面试题

    面试题分享 云数据解决事务回滚问题 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转clo
  • 编程是一门技术,更加是一门艺术

    最近一段时间在学习 大话设计模式 书籍开篇就提到 编程是一门技术 更加是一门艺术 这句经典 读罢 我不得不被作者程序设计模式这种与众不同的思维所折服 其实软件编程真的是一门了不起的艺术 谈及 艺术 人们自然会联想到 美 技艺 灵感 等词 但