本文主要是一本老书《黑客与画家》部分章节的读后感,包括了我个人最最喜欢的两章《Hackers and Painters》和《Taste for Makers》。两个观点深入我心:
黑客与画家,看似没有什么关联,实际从广义来说两者都是创造者(Makers),同理还有作曲家、建筑师、作家等等。对于黑客来说,计算机只是表达工具,就是建筑师的混凝土、画家手中的画笔。所以,最重要的是创造,在作品中表达自己。这不禁让我想起奥斯卡获奖电影《鸟人》里,那个叛逆女孩对老父亲说的话,大意是我们没有什么不同,你只是以另外一种方式表达自己活着,获得一些关注,而非安静地湮没于茫茫宇宙之中。
画家可以先用素描打草稿,我们程序员也可以用代码构建原型。原型的思想不少见,但细想之下,设计时克制不过早写代码,其实代码也可以是验证设计的一部分,重点在于掌握好分寸。
一提到品味,很多人一定会说:品味是私人的、主观的。每个人都有自己的想法,都有自己觉得美的东西。然而,当你在博物馆、美术馆深入体会时,人们却自相矛盾地说:达芬奇是伟大的艺术家,你要好好欣赏他的作品。而当你开始思考这个问题,从各行各业中汲取想法时,你会发现不同的美却有着共同之处。也许,品味、美是客观存在的,是有绝对的标准。
去深入探索宏观意义上的美之前,我们先思考一下编程领域中的美都有哪些?个人觉得代码之美可以总结成三部分:
虽然我们不用去手写代码,可是即便是用键盘去打字,从字里行间也是能看出一个人对细节的重视,对整洁度的追求。从命名、缩进这些最基本的代码规范,到IDE中字体高亮等主题的选择。虽然最终都是要编程机器码去执行,可从人的感官上来说,差别是巨大的。考究的命名,优美的排版,酷炫的配置会让人心情愉悦,仿佛在进行艺术创作(编程的确应该算是创作)。后来人阅读代码时,也会“朗朗伤口”,从细节之中得以窥见你当时编码时的良苦用心。
很多算法书在开篇都会强调,算法是思想,几千年前由来已久,代码只是其载体。因为计算机计算能力的强大,才有了这么多用代码来实现算法的算法书。比如插入排序,比如长乘/除法,都可以手动完成。下面一位作者的观点则更为激进:美于表面,丑入骨髓,代码的优美是无法掩饰算法的丑陋。代码的简洁、易读只是美的弱证据,就好比欣赏名画《蒙娜丽莎》时却一直关注其绘画工具和技术一样顾此失彼。
Code Isn’t Beautiful "Ideas are beautiful. Algorithms are beautiful. Well executed ideas and algorithms are even more beautiful. But the code itself is not beautiful. The beauty of code lies in the architecture, the ideas, the grander algorithms and strategies that code represents. The code samples presented are indeed clear, readable, and well written. But they are weak evidence of beauty; it’s not the language that is inherently beautiful. Barroom doggerel expressed in French or Russian is never automatically elevated to the level of poetry.
So when the Beautiful Code authors proffer pages of code-- real live production code-- and ask us to see the beauty, the code doesn’t help. It gets in the way. ‘It’s been a long time since I found *dst++ = *src++ beautiful’. Focusing on the code is exactly the wrong approach. It’s like a detailed technical description of the paints, brushes, and techniques used to paint the Mona Lisa, without any of the historical or artistic context that makes it such an important painting."
“Beauty is skin deep, but ugly goes to the bone… Pretty skin can hide an ugly algorithm, but no amount of beauty at the algorithmic level can hide the ugliness that is some languages.”
参与过一定量的项目之后,就可以理解软件工程与建筑等其他工程项目的相似。前面提到的文字排版和算法思想存在于每个源文件之中,可是要想构建出好的软件,就要做好代码的层次感,将一个个螺丝钉组装起来。这种费心考虑代码之间的关系,文件如何放置,层次如何组织,就是软件工程中特有的美感。
好的设计是简洁的。从数学到绘画,简洁的证明往往是更好的证明,公理越少的系统往往越好。编程、绘画、写作都是如此,用仔细设计的组件去构建软件系统,用精心描绘的物体做底板,用最少的语言表达你想说的东西。
对这一点最为走火入魔的可能就是数学家了。“丑陋的数学是没有容身之处的”,“如果一个解是丑陋的,那一定还有更好的,最终一定会有人发现它”。如果你立志于让自己的作品成为永恒,那么你就要想象后人如何追赶超越你,而你就要做到最好,不给后人任何超越的空间。历史上著名的建筑奇迹,故宫长城,数学史上的证明,欧几里德的“风车”证明。
在其他领域都如此之难,就更别提新兴的软件行业了。尤其是我们大多数服务于的商业软件,可以说我们的代码与永恒是根本不沾边的。软件行业的历史之短,代码服务于客户而非任何真理,都让永恒这一条变成了不可能。不敢说Google的三驾马车,全文搜索领域的Lucene等能算作这一类,也许比特币背后的思想与工程实现可以勉强沾边。
前面说的可能有些浪漫主义,对于好的工程设计来说,解决对了问题才是根本。简洁的答案可能回答了错误的问题。
好玩有趣这一点感觉是对我们正讨论问题的升华,美好的东西不一定幽默有趣。但幽默的确是对美的有力支撑。
大自然是美的,所以我们很自然地会想模仿它。最明显的一点就是大自然的对称之美,具体来说就是重复与递归。比如雪花图案中的递归,在程序设计中也是无处不在的。
美好的东西也不一定就是一蹴而就的。不断犯错,不断完善,最终变得美好的例子比比皆是。也许是达芬奇发明了素描,因为即便是大师也会经常犯错。为了降低失败的成本,他先画好轮廓,不断修正,最终成画。大师亦如此,更何况我们凡人。