编程美学

首先要声明的是,我之所以作这篇东西是与好莱坞大导演吴宇森没什么关系, 虽然最近他标榜的所谓“暴力美学”的电影《MI2》(译名:不可能的任务2 或 谍中谍续)的票房相当好, 不过我一点也不想沾他的光,倒不是因为我反对他用枪炮与白鸽作为他的标准道具,主要是因为对此人忘本之言颇为不能苟同, 据说他已公开宣称不再拍华语电影,在这点上倒是同为好莱坞大导演的李安更让人喜欢,就是闹出“龙种”绯闻的成龙也比他强。

从哲学角度上说,美学应该是一种形而上的唯心主义,与编程这样一种“唯物”的科学没什么关系才对, 我之所以会想到这个题目是有原因的。前几天,厦门在新落成的会展中心举办了一次书展,上周末下午, 我也跑去凑了个热闹,在书展上买了本书:基普.S.索恩《黑洞与时间弯曲--爱因斯坦的幽灵》 2000 湖南科学技术出版社, 书中在讨论狭义相对论诞生的过程时,说了一些典故,并且其中有一句话:“物理学定律本应是优美的。”。 因为在经典的牛顿力学中,麦克斯韦电磁学的定律在运动时有复杂而丑陋的表现形式,这一点深深地刺激了菲兹杰拉德(George.F.Fitzgerald)、 洛伦兹(Hendrik.A.Lorentz)、彭加勒(Henri.Poincare)、拉莫(Joseph.Larmor)还有爱因斯坦(Albert.Einstein)。 他们为了追求一个更加优美的理论,推翻了牛顿创立的以绝对时空观为基础的经典力学,并最终创立了狭义相对论, 使麦克斯韦电磁学的定律在任情况下都有简单而优美的形式。甚至于作为爱因斯坦相对论的核心的“相对性原理” 本身就是一个“形而上(metaprinciple)”的原理。对于“美”与物理学(或其它科学)的关系,我还想引用另一本书: 刘华杰《分形艺术》 1998 湖南科学技术出版社,书中的序一《科学探索也是对美的追求》赵凯华(北大非线性科学中心主任 /中国物理学会副理事长)97/4 中引用了几位物理学家的话来说明这个题目,[法]庞加莱(即上文所说的彭加勒)说: “科学家研究自然是因为他们从中得到了乐趣,而他们得到乐趣是因为它美。如果自然不美,它就不值得去探求, 生命也不值得存在。”物理学家魏尔(H.Weyl)则说:“我的工作总是尽力把真和美统一起来;但当我必须在两者之中挑选一个时, 我通常选择美。”正是这个魏尔在提出“引力规范”理论时,自已也觉得它不真,但仅仅因为它美,他保留了这个理论,若干年后, 新的理论证明了他是对的。

“唯物”如物理学尚且如此祟尚美,我将此引入编程应该并不为过,我曾经说过编程的艺术问题, 美作为艺术的重要元素,可以说将美学引入编程技术是所谓编程艺术的一种实践。既是实践就要有方法,我以为美在编程中的表现, 主要在于两个方面:用户界面和源程序。用户界面是不用说的,现在的个人作品的界面是越来越花俏,相比之下我做的东东就比较土了, 只怪自己艺术细胞不够多。源程序的美学又表现为两个方面:编辑和编程方法。这两个方面我就比较可以自吹一下。

我们的源程序编辑风格成形于95年,那一年我认识了卡曼奇,要知道在没有网络的时代碰上一个志同道合的程序员是多不容易啊, 即使是现在的网络时代,要在人海中找到一个爱好编程,思路相近,喜欢 C/C++ ,爱用 Borland 产品的同道中人也决非易事, 就是找对象也比这容易(^_^)。但所有编程序的人都知道,要读一个别人写的程序是多么困难的事,即使是自已写的程序, 过上一段长的时间后,也多半读来头晕,这里其实就涉及到编程的源程序美学问题,当然那时我们还决没有这种想法, 我们只是认为我们要统一一下源程序书写的风格以便交流,于是在我们刚认识的95年夏天,我们对各自编程的格式作了一些约定, 口头制定了我们的第一个编程风格规范,也是从那时起,我们的程序就基本上遵循这个规范。96年夏天的一个晚上, 我与回家过暑假的卡曼奇再次讨论了这个规范的细节,那天晚上我们谈到22点多,我送他回去(我们家相距不远), 走到半路我们对规范的细节上还有很多意见不能统一,因为每个人都有自已根深蒂固的习惯,制定这样一个规范难免双方都要作出一些妥协, 我感觉就像在谈判,我们就这样站在路边谈到将近0点,我们才基本达成一致,之后的一段时间里我们还在对细节作进一步完善,到96年秋, 我把这这个规范形成文字,并把原稿给在福州上学的卡曼奇寄去,另外还有几页源程序,是关于我们写的一个 C++ 模板类库, 共用了十一张16开的纸,那可能是我写过的最长的一封信。正因为有这个规范,我们多年来的合作一直进行得很好, 而且我们的程序代码重用性也相当好,比如我整理发表的 PCX 图像格式处理程序就是从我去年初写的几个程序修改而来, 而那个程序又是根据我和卡曼奇96年夏天写的几个图像处理的类改写的,原来的这几个程序几乎没有注释! 我现在正在改写一个关于 LZW 算法的类,原类是卡曼奇98年夏天写的,因为本站上到目前为止尚未有卡曼奇的作品发表, 我决定将这个东东公布出来,这毕竟是我们的合作站点。本来我还想把那个规范的全文发表出来,只是我不喜欢对着手稿打字, 这让我觉得自已像个打字员,所以一直没有输入完,如果输完我将第一时间公布在本站上。

统一编程风格并不能算是“美”,但我可以比较得意地说,我们的风格是相当“美”的。 这并是我自吹,一位IT业的朋友在看过我的多个源程序后,多次赞叹我的编程风格是“漂亮”的。 更令我得意的是98年,一位在软件公司做文秘工作的朋友在看过我写的程序后对我说:“虽然我对编程完全不懂, 但我可以说,你写的程序是我看过的最好看的程序。”

至于编程方法,我们有一个原则,套上面魏尔的话来说就是:“我们编程时尽力把短小高效和简单优美统一起来; 但当我们必须在两者之中挑选一个时,我们通常选择后者”,关于这点的细节,前辈们早有总结,如“模块要单入单出”、 “尽量不用GOTO(除非是为了简单优美的目的,但这种情况相当罕见)”等。这点又是与所用的语言有相当的关系, 也许这就是著名前辈E.W.Dijkstra(世界上最好的程序设计员)在1975年说:“学了那些不好的语言会使你的脑筋致残”的原因吧。 这点看似容易,其实很难做到,比如本站那个计算 CRC 的程序,应该说是一个相当短小高效而又简单优美的程序, 但因为它用了一种与众不同的思路,如果不能理解,就会认为这是个丑陋的程序。一般来说,经典的算法通常都是“美”的。 比如 GIF 编码/解码程序,我手头上有好几个,但除了在 PCX 图像格式处理一文中所提到的那个 GIF89a 的程序外, 都很相似,据说来自一个叫作 GIF85.C(作者:Kyle Powell) 的程序,GIF89a 的程序虽然短小,但与传统代码相比却不够“美”。

就在我写此文时,我在 CSDN 上看到有人在对此问题作讨论, 我把其中部分看法COPY过来,放在 《关于编程风格的讨论》一文中,供参考。另外,我也希望各位能对此问题在本站留言,发表自已的看法。