前些日子在熊节先生的blog上看到一段文章“Why Ruby is Simple”,试着翻译了一下,译文如下(原文摘自《The Ruby Way》一书):
Ruby的一大优点就是简单。对于这一点我想引用一个思想家的话来说明——正如Antoine de St. Exupéry所说“所谓完美,并不是说不需要加入新的内容了,而是说没有什么应该被去掉的了。”
然而Ruby语言实际上也有它复杂的一面。那么为什么我还要说它是简单的呢?
如果你对宇宙感兴趣的话,那你应该听说过“复杂性守恒定律”——即,事实上我们不可能完全避免复杂性,不过我们却可以对它进行重新分配。
这就是问题的关键——复杂性不可能被完全避免,但我们却可以在某一阶段对它置之不理,视而不见。这也就是现在流行的传统的“黑箱”理论,一个“黑箱”可以在内部完成一个相当复杂的任务,但是对于外部使用者来说它却又非常易于操作。
就像爱因斯坦说的:“每件事情都应该尽可能的简单,但也不能过分简单。”
在Ruby当中我们会发现,程序员的想法可以以非常简单的形式表现出来(当然对于维护解释器的那些程序员而言,情况也许不是这样)。不过,Ruby也作了一些折衷的处理。毕竟在现实世界中,我们多少要做一点妥协。比如,在一段Ruby程序中每一个实体(entity)都应该是一个真正的对象(true object),然而在实际执行的时候,某些象整数(integer)这样的值却是以直接值(immediate value)的形式存储的。在计算机科学发展的数十年间,类似的折衷对我们来说并不陌生,为了获得能够运转起来的实际作品,我们往往会放弃优雅的设计。事实上我们总是以牺牲一种简洁性(理论的简洁性)为代价来换取另一种简洁性(实现的简洁性)。
“当你用一个较小的语言表述你的思想的时候,你会写出一大堆东西来。而当你用一个较大的语言来做同样事情的时候,你只需要写一点就够了。”Larry Wall的这一段关于Perl语言的评论同样也适用于英语(以及大多数编程语言)。比如生物学家Ernst Haeckel就曾经用“Ontogeny recapitulates phylogeny”这3个单词来概括他的工作,当然我们知道在这3个高度浓缩的单词背后,包含着大量具体而复杂的意义——而这也正是我们程序员要做的工作——我们应该让语言具有“内在的复杂性”,这样我们才能保持简单的表达方式,而把复杂的细节隐藏起来。
我个人对简洁性的理解是:如果你能用10行代码搞定一个程序,那就不要把它写成200行。
我相信简短通常来说是一件好事。对于程序员来说,一段短小精悍的程序更容易记忆,也更容易把握其整体思路。同时它还会带来一个好的“副作用”——写代码的时候,不容易出现bug。
当然我们也不能忘记爱因斯坦的警告。如果过于强调简洁性,那我们的代码最终也许会变成一堆没人能够理解的垃圾。信息论的研究结果表明:信息被过分“压缩”的时候往往会令人费解——如果你见过或者亲自用C、APL之类的常规表达式语言编写过程序的话,你就会体会到恶劣的编码方式带来的危害。简单,但不过于简单;让代码尽量简短,同时又保持可读性。这才是我们应该做的。