千层饼代码

千层饼

任何一个跟计算机专业沾点儿边的人都知道“意大利面条代码(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,字典的解释是,“烤奶酪肉馅面条:通过烘烤带有一层层的番茄汁和填有如奶酪和肉馅等调料的面团而制成的菜肴”,但这解释我听起来更像是月饼沾大酱。这里暂且用一个比较形象的东西:千层饼。

[英文原文:Lasagna Code ]
分享这篇文章:

30 Responses to 千层饼代码

  1. ernest says:

    有同感啊。。。。

  2. ernest says:

    大道至簡。

  3. dreamersdw says:

    原作者似乎把简练的代码、精巧的编译器、清爽的可执行文件混在一起谈论了。虽然很可能用简练的代码可以写出一个精巧的编译器,后者又可以编译出清爽的可执行文件。但分开讨论会使得得逻辑更清晰一些。

    编程界的浮夸风来很可能起源于设计模式的流行。

    自从设计模式普及以后,几乎所有的程序员都会在给类起名时加上以下后缀 Factory,Adapter,Builder …噢,还有随处可以的 Manager。

    有人鼓吹要消除一切 Switch Case, 多态是才是救世良药;全局变量是恶魔,让我们把它们封印在 Class 里的 Static Method 里吧;对象的内部状态不应被外力破坏,加上 getter 和 setter ,不好看?那就再引入 attribute;拆分拆分,一个类一个文件,不用打开你就知道内含和文件名同名的类;反射反射,程序员的快乐,记得要经常修改 XmL 配置文件哟。

    设计模式是一种宗教,由那些最聪明的家伙创立,他们相信它可以某些棘手的问题,而那皯狂热的信徒们则认定它可以解决一切问题。设计模式帮助前者更好的思考,却抑制了后者的思想。

    永远都是这样,少数的创新者后面跟着一大群盲目的追求者,他们只要最容易模仿然形式,不要深邃然内蕴。

  4. dreamersdw says:

    提交后才发现上面的评论居然有好多别字,作为一个五笔用户,表示鸭梨很大。

  5. mz says:

    汇编万岁!

  6. zero says:

    作者是在藐视最近十年来IT界的集体智慧吗?简直是愚蠢的观点。

  7. evan says:

    aqee, 看看《加菲猫2》,你就知道lasagna是什么东东了。

  8. dreamersdw says:

    建议 aqee 给评论回复加上邮件提醒啥的。或者用 disqus 也不错。

  9. 依云 says:

    看了下,zcat、bzip2、cut、tr、wc 都不到 40K,vi 有点大,209K。我的 busybox 1.6M,包含了 333 个子程序,平均每个不到 5K。

  10. liuu says:

    过度的层层抽象结果。。。

  11. cer says:

    接受不了新事物 迟早被淘汰,搞IT更是如此

  12. maddrone says:

    深有同感,现在很多项目的代码看起来就是一堆bullshit,比如android

  13. i-robot says:

    函数式控的Aqee又发飙了~

  14. new Coder says:

    Aqee是神马程序员

  15. LiaWind says:

    40K的程序很好,但问题是,如果功能增加100倍,能简单的把40K的程序扩展100倍,用4M的程序搞定吗?
    算法很重要,没有算法就没有程序。但是如果只有算法,那计算机最终也只能是科学家的玩具,而无法成为千家万户的必需品。

  16. Leo says:

    编程进化的结果吧!

  17. lost_alien says:

    文中好像没提java和c#,估计是怕被喷。。。。其实很多开源的java程序里,都有很多算法。面向对象跟算法又不冲突,真是的!从cobol,c到面向对象的ruby,java,这些演变不仅仅是商业目的的忽悠。面向对象的方式被证明是解决复杂领域问题的一种比较好的方式之一,所以发明一种面向对象语言也是势在必行的。作者应该有多年开发经验了,应该能认识到:不同领域都有适合的语言,嵌入式开发,用精巧高效的C,网站可以用ror,java等。

  18. ffffsky says:

    其实只是想诟病面向对象吗。。。。。

  19. suns says:

    对java四人帮的批评也不是一天两天了 但他依然流行 这是有原因的 在某些场景中千层饼代码依旧是最好的方式

发表评论

电子邮件地址不会被公开。 必填项已用*标注