软件之梦与现实之痛
《梦断代码》读后感
张峥东
程序员,在大众心目中,似乎如同黑客帝国中的高手一般,弹指一挥间便重塑一个世界。但是程序员自身,却常常自嘲为码农。
如果只是码农还好,就如同单纯的搬砖工人一样,即使辛苦一些,夜以继日日复一日年复一年挥汗如雨地劳动,至少他们心理清楚,他们搬了多少匹砖,就可以从平地建起一座宏伟的大楼。每搬了一匹,剩下的需要搬的砖便少了一匹。
可是抱着对完美软件的憧憬的程序员们,永远也不会知道为了实现这样美好的梦想,甚至是完成下一个特性,他们需要写多少行代码。以至于每写一行,剩余的工作量是因此减少,还是增加,也难以成竹在胸。
软件难做,即使对算法透彻通晓如Knuth,真正上手实现LaTex的时候,仍然感叹其难度超乎寻常。《梦断代码》一次又一次地引经据典旁征博引贯穿全文反复论证该观点,除了对于程序员们一直以来所从事的复杂工作的致敬,也隐隐透露出一丝悲凉与无奈。
程序员们仿佛活在另一个时间维度之中,姑且称之为“软件时间”。这个维度中,倘若一切顺利,则时间飞快流逝程序员浑然不知;但一旦事有不谐,则举步维艰仿佛度日如年。这样的维度里,常识的团队构建、工程管理等等统统支离破碎。整本《梦断代码》,通过CHANDLER这个软件实例的尸体解剖,把所有正常的人们所期望的有规律可循的软件工程模式甚至是基本的对软件的认知抽丝剥茧逐一粉碎,完整地展现出整个软件时间超乎寻常的诡异乖离。
当然,该书俯视着软件的历史,选择了站在尸体上细细品味死因,而不是选择整理出一套完整的方法论,告诉人们应该怎么做才能够把软件做好。当然,这个问题似乎本身没有统一的答案。该书后段的方法论部分,详尽地列举了从经典的瀑布模型到现代的敏捷方法极限编程种种,无一例外地尖锐地指出了各自方法也有着瑕疵。“方法论真正的目的在于卖书,而不是解决实际问题。”虽然有些偏激,但是也部分真实地反映了实际中软件工程的复杂。
从事如此复杂的职业的程序员也绝非凡夫俗子。相当部分的程序员自称极客,他们对特殊知识有着超乎常人的狂热,书中甚至半开玩笑地戏称他们坚信“问题第一,人类第二”,堪称“理性独行侠”。他们从事软件工作,往往开始时抱着一鸣惊人改变世界的理想,单纯而狂热地憧憬着自己能够萌发前人未曾想到的灵感,写出不同于任何人的设计。
很多时候,他们是典型的完美主义者,软件对于他们不仅仅是产品,更是一种至高无上的艺术。不可否认这样的心理一定的场合中能够孕育出震惊世界的精品软件,但是同时很多时候,这样会使得幻想多于代码。相较于解决用户的需求,他们会优先地从个人美学的角度考虑如何设计地漂亮,对需求不断变更,添加新项。而且如书中所说,这样的变更更像是慢动作式的出轨,积年累月不经意间便已膨胀地远远超出了他们实际中能够实现的程度。书中的Chandler,初始定位便是模糊的继承“Agenda”之魂的个人日程管理软件,在起跑线上就在指导思想上偏离了正确的方向,而且在未来的版本之中相较于做出一个可用的版本,该团队更倾向于从对“Agenda”之魂的美好憧憬出发设计添加功能。
“标靶移来移去,目的忽上忽下,计划不切实际,期限一拖再拖,预算膨胀超值,绝望不已,混乱不堪。”不知不觉之中,追逐梦想的程序员们发现自己已经与初始的预期渐行渐远,陷入了软件时间里梦想与现实难以跨越的鸿沟之中,却不愿舍弃梦想,转身离去,回头是岸,而是在绝望的泥沼之中越陷越深。
而且程序员们难以逃避一种从头发明一切的情节,他们需要解决一个问题的时候,总会犹豫是否站在巨人的肩膀上,与其使用前人的工作作为基础涂涂改改,他们更倾向于自己另辟蹊径从头写出一套自己能够掌控一切的代码。这大大地满足他们的乖离的掌控一切发明一切的良好的自我感觉,而且还透露着浓浓的文人相轻的意味。殊不知这很多时候会让整个工程陷入何等的深渊。抛弃前人完成的久经测试的相对稳定的系统,而使用自己白手起家搭起的没有经过充分测试的代码,无异于异常灾难。
同时,软件难做不仅仅是因为程序员们对自己异常严苛的要求与过分脱离现实的目标设定,软件时间本身固有的不确定性就使得软件工程不同于传统工程。它不像修桥铺路,背后有一套完整的物理理论做坚实的支撑,只要事先计算好,便可以迅速准确地按照确定的进度进行。它也不像是乐高的玩具,每一块都可以事先完美地定义清楚接口与内部性能,之后简单地把他们拼接即可大功告成。确定自顶向下的探究更多出于期望与断言,但初始设计的不确定性以及实现过程中几乎不可避免的频繁更改,使得软件,特别是大型软件很难按时限,按预算完成。毕竟,时间——特性——金钱这一黄金三角之中往往只能选二,而不得不抛弃第三个。
所以书中提到,“For iTer, the definition of destination better to be vague.”
管理上,CHANDLER选择的开源模式也是最后埋葬自己的掘墓人。没有组织架构,没有承诺期限,对参与的志愿者也没有给予金钱的鼓励。要知道,不拿工资无异于不受限制。这样松散的管理也只能是流于形式。
我们可以欣赏欣赏CHANDLER苟延残喘到最后1.0的效果图:
且不提整个布局的混乱,单说其死机的概率,开始程序的时间,以及很多时候程序无法关掉的现象。很难相信这是一个汇聚了如此多优秀的程序员耗时多年完成的产品。
当然,除了批判CHANDLER中暴露出的大量问题之外,该书也巧妙地提出了一些貌似诡异值得深思的软件时间中与常识相悖的妙论,一下做一些简单的摘录:
“往已延误的项目中补充人力,只会使其继续延误。”
“理智上悲观,意志上乐观。”
“好的程序员知道写什么,而卓越的程序员知道改写什么。”
“手上有锤子,到处是钉子。十月怀胎,欲速不达。”
“方法论真正的目的在于卖书,而不是解决实际问题。”(前文已经提到)
“直觉很多时候管用。”
“最小实用主义管用。”
……
当然,书中另一个比较有意思的细节是对软件工程方法的打分表,总共12项,而书中明确提到微软满分。该书风趣地比喻这就像是军队中整理内务一样虽然繁琐但是却保证程序员随时在最佳状态,进入这种状态充分说明微软帝国目前的庞大以及维系这种庞大需要多么繁琐的工序。
总的来说,该书细致入微地分析了为什么软件难做,为什么程序员的梦和实际有着巨大的鸿沟。在软件时间之中生存与管理都很难遵循一个已知的常理,很多时候必须十分灵活,不惜走到极端。“这个世上没有典型的软件项目。”相信直觉,而不是已经存在的公式条文或者案例,是这个无序的世界中一个无奈的生存之道吧。
(坦白地说,读完之后对自己要成为一个程序员活在软件时间之中缺乏实感。)