瞎子摸象,自顶向下和面向目标


头两天为生计所迫,改别人写的代码改得头疼,终于忍无可忍,推翻了重来。回头看看,从来米国上学那天起,写代码已经写了二十多年,其间所见的怪事怪人,算起来也真不少。

到硅谷后的第一个上司是个学硬件出身的英国人,他的口号是:代码谁都能写,代码携带的技术才是真正有价值的。他雇用的一个硬件工程师,根本没有FUNCTION的概念,两百行就能解决的问题,他弄出了一千多行,里边大部分是重复的代码。那时候面向目标技术还没诞生,但是他至少应该有点模块的概念。此公的另一绝活是变量名都用得特神秘:XYZ用完了,便是ABCD,要不是我们逼着他加上了IN-LINE COMMENTS,谁也看不懂他那充满XYZ的天书,他还振振有词:短的变量名占内存小。这是1992年,几千个BYTE就算大内存了,我们一时还真驳不倒他。

苏联人的教学方法和教科书组织影响了我们至少两代人。我们的教科书总是以系统的、结构严谨的方式出现的。目录本身就是一个大纲,教学大纲基本就遵循目录。曾经有几个懒蛋老师,就是这么做的,抄目录给我们。到了美国,我才发现,目录完全可以以另一种面貌出现。一本程序员熟知的书,Programming Pearls的目录就是这样,让人完全不知所云,彻底淹没在程序设计的汪洋里。请看:

Column 1: Cracking the Oyster

Column 2: Aha! Algorithms

Column 3: Data Structures Programs

Column 4: Writing Correct Programs

作者本人可能对程序设计概念很清楚,也不是成心让读者坠入五里云雾之中,只是不喜欢板着面孔教训人式的系统方法,就别出心裁地弄出这样一本艺海拾贝式的拼图游戏。可怜我们这些初学者,只好跟着他老人家瞎子摸象,好在坚持不懈地摸下去,终将摸遍象身上的每个部分。

循着这样的教学方式,我的美国同事把艺海拾贝也带到工作场合里来,结果只能是一盘毫无头绪的意大利面条。

大约在1999年,我见到了平生所见最漂亮的代码,是两个莫斯科大学物理系的博士共同写的。巧合吗?当然不是。只有我们的“老大哥”才能写出那样的代码,也只有我这个“小弟弟”才能欣赏它。那段程序美极了。标准的自顶向下的设计,从一个树根开始,分出两三个树叉,然后再分,变量名都是有意义的,加上适当的IN-LINE COMMENTS和文件,非常易于弄懂和维护。他们两人合作紧密,连FUNCTION名都采用统一的规则,长度都弄成一样的,眯缝起眼睛来看,一排排的代码长短划一,好像一篇漂亮的乐谱。那时面向目标的技术已经开始推广,但是那家公司仍旧采用C。我以为,单用C一样也能写出漂亮的易于维护的程序,两个老大哥就是明证。

然后面向目标的罐头盒打开了,什么虫子都跑了出来。有些人天生就缺乏系统性和组织能力,可惜这些人也牙缝里夹着面向目标的菜叶混进了程序员的队伍。结果就是脱裤子放屁的一大堆CLASS的定义,毫无用处的FUNCTION名OVERLAPPING,定义了却从来不用的OPERATIONS,庸才穿上了面向目标的外衣也还是庸才,只是危险性更大了。

登录后才可评论.