千层饼代码
任何一个跟计算机专业沾点儿边的人都知道“意大利面条代码(spaghetti code)”指的是什么。很遗憾,这种风格的代码如今还是不少。但现在我们又有了—找不到其它更好的词汇,还是沿用面食的比喻—“千层饼代码(lasagna code)”。
千层饼代码是指代码被一层层的抽象,一层层的对象继承和引用,以及其它一些毫无意义的修饰,最终导致代码臃肿不堪,难于维护,完全跟“清晰”这个词不沾边。看着如今有些代码写成这个样子,我不由抓狂。而当你看到Turbo Pascal v3 的体积是如此的微小,而且明白这是一个功能完整的Pascal语言编译器时,你不能不问,为什么如今的应用程序和编译器会全都如此的巨大。
Turbo Pascal v3的体积小于40k,不错,4万个字节码。今天你还能找到体积这么小的有用的软件吗。大多数人甚至不能编译出一个小于1M的“Hello World”程序,这都是受我们追捧的面向对象编程的恩赐,人们似乎对“代码行数”的要求胜过代码清晰性,对“抽象和对象化”的要求胜过代码的简洁和优雅。
回想起我初进入计算机行业时,我们写很少的代码能完成很多的事。而如今,我们写了成千上万行代码,能完成的事却变少了。如此的悲哀,让人想哭,或无奈的的甩甩手,走开。
还有几点亮光。还有一些人在写短小漂亮的代码。但他们显得越来越稀有,尤其是在最近热衷于写优雅、短小、漂亮的代码的人过世的时候。Dennis Ritchie(C语言的创始人)会告诉你可以用小程序做大事。他强调说:算法是你要解决的问题的核心。创造漂亮和精心设计的东西,值得人们永远研究,就像Thompson版的正则表达式算法!
也许只有像我这样的年龄和天生的坏脾气的人才会这样的抱怨,但这些年来很多系统都让我痛苦。它们写的如此的丑陋,设计的如此糟糕。也有亮点,但少之又少。无怪乎,现在的孩子都不愿意去研究计算机科学。以前我们对各种算法的固有的美丽的追求,现在变成了在键盘上的一痛乱敲,输入成百上千行代码,期望编译器能编译通过。Lisp,Smalltalk或APL等语言的优雅哪里去了?甚至Fortran也比现在的许多受人追捧的那些烂编程语言优雅的多。为什么没有人回去研究那些面向算法的语言、去改进它们?
我曾经对我的孩子说,这么多好的语言如今只剩下C语言,这真是悲哀。不错,一些特定领域还有一些很漂亮很小的语言存在,但会成为主流吗?不会。这就是一场灾难。有些东西,比如Python,如果它不把一个面向对象的系统嵌入到体内,也许它会很不错。唉。
译者注:lasagna,字典的解释是,“烤奶酪肉馅面条:通过烘烤带有一层层的番茄汁和填有如奶酪和肉馅等调料的面团而制成的菜肴”,但这解释我听起来更像是月饼沾大酱。这里暂且用一个比较形象的东西:千层饼。