原文:The Hungry Programmer

编程和进餐实在神似。

晚上,我饥肠辘辘,不在家,没法下厨犒劳自己。我环顾四周,徒见街对面有家麦当劳。

于是,我又一次进退两难,每次离家外出时间一长,就会面临这种困境:我该马上吃垃圾快餐填饱肚子?还是再挨会儿饿,回家吃一顿健康的?

面对这种困境,仔细一想,我不禁注意到它跟代码质量的关系有多紧密。不过,下面还是先继续聊聊食物。

别人怎么想我不知道,我只能代表自己讲话,我并不认为麦当劳能为自己提供健康膳食。作为一个忠实的生食主义者,或者说关心自己吃什么的人,麦当劳的食物和我眼里的健康膳食相去甚远。不过,我是吃着麦当劳快餐长大的,很长一段时间都没想过它是否健康,相信许多读者也一样。我肚子饿了,而麦当劳就有吃的。

既然明白了麦当劳快餐对自己身体的短期和长期影响,我就会尽全力避开它。对一般的熟食也是如此。我为此熬了相当长一段时间。决定改变自己的饮食习惯并非一日之功,健康饮食是连续体(continuum)

很快就会谈到编程了。:)

健康饮食是连续体?

麦当劳快餐不是健康膳食。但是,巨无霸加配菜沙拉总比巨无霸加薯条来得健康。星巴克金枪鱼卷要比巨无霸之类的食物更加健康。去本地精品咖啡馆喝碗汤则要比星巴克的金枪鱼卷更健康。在家用新鲜食材做的膳食则要比前面这些食物都更健康。

通过观察食物,我们可以提炼出下面两点:

  1. 一切都是相对的。你总是可以做得更好,也可以做得更糟。吃个巨无霸死不了人,但为了回家吃一顿而一整天不吃东西显然也不健康。
  2. 每一餐都是全新的。人们很容易误入陷阱:既然我昨天吃了巨无霸,今天再吃一个也无所谓。这种想法不合逻辑,也毫无益处。每次用餐都是新的抉择。即使你早饭吃了巨无霸,午饭自己做吃的也是迈向连续体的一小步。

代码如食物

代码就像食物,也是连续体。

基本上,我们可以断定,相比有测试和文档的程序库,未经测试和没有文档就发布的同一个库质量要差。

然而,许多事情并不是那么黑白分明的。何为“健康”代码,仁者见仁,智者见智。有些人非常注意自己的编程习惯,不断加以改进。有些人却经年累月地编写同样的垃圾代码,至于那些代码“健康”与否,则不闻不问。

健康的选择

视代码如食物。

就像人总得吃东西,代码也必须发布。但是,具体怎么做会有短期和长期影响。

如果采取麦当劳做法,发布垃圾,那也只是满足了短期需求。但你将切身体会到长期影响。你的代码维护起来将会更难,后续也需要更多精力。它不会健康长久。

如果采取自制膳食的做法,需求可能暂时得不到满足。短期影响是你会饿肚子,不过这么做很值得:长期影响将是正面积极的。你的代码将更易维护,缺陷更易修正,也更容易进行变更。你的代码会健康而长久。

决定

编写健康代码跟健康饮食的要求一样:识别不足和全力以赴。从吃得不健康到吃得健康得先识别出不足之处。改进不足则要求全力以赴执行决定。

要改进编程习惯也一样:识别有待改进的地方,然后全力以赴加以改进。

一如既往,你的选择必须务实。人总要吃东西,代码总得发布。找到健康膳食替代之前,还得吃一阵麦当劳。我不清楚你的软件项目有什么限制,有时候,就算是垃圾也要发布。只不过要记住健康编程是连续体。吃巨无霸时搭配沙拉,而不是薯条。

世上没有“最健康”的膳食。你可以一整天都用来准备你所能想象的最健康的膳食,但它要是不进你的肚子,你便得不到什么好处。代码质量很重要,但倘若不发布,它就什么也不是。

要编写更健康的代码,最靠谱的做法是持续不断的改进。每一天编程都更加健康一点,别想着一下子摒弃旧习惯,希冀它们马上为新的健康习惯所替代。