Perl 之父 Larry Wall 曾说过,程序员的三大美德是「懒惰」、「不耐烦」、以及「傲慢」,其中「懒惰」高居三大美德之首,这一回就让我们来看看程序代码设计的懒人之道。
这字面上的「懒惰」,或许叫人误解,以为这是在暗示好的程序员是因为不愿意尽心投入代码设计工作,才会想要偷懒,尽量让自己少做点工作。不过,能成为卓越程序员的人,几乎没有例外的热爱程序代码设计工作,对他们来说,程序代码设计本身就是乐趣所在,只可能深陷于其中无法自拔,而没有不愿意多写点程序代码的。
我们可以把「懒惰」分为两种,一种是单纯的不想做事,而另一种则是希望尽量少做点事,却达到一样的目标。同样是想要少做点事,后者却有着截然不同的正面、积极意义。而程序员的「懒惰」美德,也是建立在此种「懒惰」基础之上。
知名的手机制造商 Nokia 说「科技始终来自于人性」,而这句话中的「人性」其实意味着人性中的需要,所以人们都说「需要是发明之母」,许多有用的科技,都是源自于人性中各式各样的需求及欲望,而在这些需求及欲望中,想要「偷懒」的念头,绝对是具有相当重要的地位。
倘若说「懒惰是发明之母」,实在是一点也不为过。人类发明马车、牛车,就是希望藉由兽力提供额外的动作,好让人类在交通运输上能够更为轻松,这当然完全是出自于「懒惰」的想法。人类之后更发明了火车、汽车、甚至飞机,大幅提升了「懒惰」的程度。
许多工程师绞尽脑汁、苦心孤诣的设计,最终便是希望得到一个让自己、也让所有人都能够偷懒的产物。从这个观点来看,惰性实在是人类科技持续进步的最大动力。
所以说,倘若从正向的角度来解读「懒惰」,工作偷工减料,其更积极的意义,应该是「以最小的力气达成目标,同时保持不变的品质,或是提升至更好的品质」。从这样的定义来看,「懒惰」的确可以做为程序员的美德之首。
程序代码设计并不是一种单靠认真工作就能够开花结果的工作。一名程序员的工作成效,往往很难单纯地只倚靠工时的长短来评估。
工作时间长的程序员,可能是工作能力出了问题,才会需要花费更多的时间。有许多优秀的程序员,只需要花上少许的时间,就能得到和别人一样、甚至更好的工作成果,原因之一便在于优秀的程序员懂得如何偷懒,而偷懒的真正意义,是以最小的力气达到一样的结果。
程序代码设计的懒人之道便是四两拨千斤。施四两之力,得千斤之结果。掌握这懒人之道,便能掌握提升时间效率以及生产力的关键。
想要偷懒,你可以从许多面向来着手,而第一个会被大家所先想到的,便是开发工具上的辅助。的确,如果你想要偷懒,第一件事便是要试着尽可能地自动化所有的事物。
在程序代码撰写的过程中,有太多具重复性、单纯只是劳力性质的工作。所有具有规则性的事物,都可以利用自动化的方式,让工具为我们代劳。例如善用程序代码的产生器,便可以免去人工撰写那些机器便有能力产生出来的程序代码。
又好比一些自动化的建构工具,例如在 Java 社群广泛被使用的 ANT,便是一套透过让你描述建构软件的程序,借以自动化执行此一程序的工具。透过这样的工具,在建构过程中的许多动作,例如自版本控制系统中取出原始码、编译原始码、部署至测试环境、单元测试,及寄发测试报告等,都可以轻易地自动执行。
降低人力介入的程度,不仅省时省力,也不易犯错。此外,许多 IDE 也都提供了像程序代码自动补全(Automatic Code Completion)、或自动 API 提示的功能,都可以省掉许多打字及查询 API 文件的时间。
尽管许多工具都能提升撰写程序代码的效率。但许多程序员都存在着对工具的迷思。并不是每种工具都适合每个程序员,原因在于每个工具的定位不同。工具并不是威力越强大就越好,你必须挑选适合用途的工具,正所谓杀鸡焉用牛刀,杀鸡不仅不需要动用到牛刀,用了牛刀,鸡反而可能也杀得不好。
真正优秀的程序员并不完全倚靠工具来达到偷懒的目的,事实上,工具所能节省的,往往并不是关键,真正的关键还是在于程序员自己如何进行设计。
真正偷懒的程序员,会持续地让自己的设计保持在一种很容易可以偷懒的状态,也就是说,只需要花费一点点力气,就能得到自己所需要的东西。这就是我所说的四两拨千斤。
如何让自己的设计尽可能的保持在一种很容易可以偷懒的状态呢?关键之一说穿了,还是要让自己的设计尽可能地可以被重复运用,而且是跨专案的重复运用。许多专案开发的系统,或许与最终呈现出来的面貌有着很大的不同,但内部会运用的元素,往往都落在一定的范畴之内。化学元素周期表中的元素总数仅有一百余个,但却也能组成了我们所见到的无数种物品。
设计出能够跨专桉重复使用的程序代码,需要持续重构,并且让自己的代码朝着更佳的通用性持续演化。当你在执行重构时,会找出形态相似的程序代码,并且利用提炼函式或类别的技巧,将它们以更为通用的型式整理出来。你(或你的团队)需要建立一个自有的程序代码库,放置这些通用的代码。而且,必须在专案中持续使用程序代码库中的代码。唯有如此,才能持续考验它们并且让它们有演化的机会。
虽然我鼓励人们建立自有的程序代码库,容纳在开发过程中所找出来的通用程序代码,但却不鼓励人们反覆地重造轮子。懒惰成性的程序员,是不会浪费时间去重新建造轮子的,一定是从既有的轮子中挑选出适用的,再施以最小的力气,添加一些程序代码码,使得所选出来的轮子,能够顺利地接上自己所开发的车子。
所以,把「懒惰」视为美德的程序员,绝不轻易地重新开发已经存在的东西,而是会尽可能加以利用──尤其是开放源码的成品,因为这代表你可以自行加工或修缮的空间较大。现成的产物就是你能够得到的千斤,而四两就是你所施加的额外力气。倘若每个轮子都自己重头来过,那么施千斤力,或许反而只会有四两重的效果。
随着时间的过程,懒惰的程序员会累积出相当多的资产,这些资产是可以被灵活地运用在各种专案中。懒惰的程序员在面临一个新的开发需求时,所做的事情,往往不是将程序代码重头写过,而比较像是把可被重复运用的程序代码,当做积木一般堆积起来,生产力自然大大的不同。
偷懒的程序员更不会犯了设计过度工程化(Over-Engineering)的毛病,因为过度工程化,会浪费无谓的力气在不会发生的需求上。懒惰的程序员只会专注在面前以及可见的近端未来。
你瞧,偷懒的天性竟会对程序代码设计带来这么多的好处,难怪它是那么重要的美德了。
王建兴
清华大学资讯工程系的博士研究生,研究兴趣包括电脑网路、点对点网路、分散式网路管理、以及行动式代理人,专长则是 Internet 应用系统的开发。曾参与过的开发专桉性质十分广泛而且不同,从 ERP、PC Game 到 P2P 网路电话都在他的涉猎范围之内。