各种色香味俱全的意大利面如图所示,尤其是左下角的“千层面”好吃极了 :D...

意大利面
四种美味的意大利面

​言归正传,尽管意大利面灰常好吃,但是“意大利面式的代码”却让程序员吃尽了苦头(程序员,你懂的)。正如种类繁多的意大利面一样,“意大利面式的代码”更是玲琅满目、五花八门!

既然人们喜欢拿意大利面与代码作比较(又称隐喻),想必二者多少有些相似之处。

那就先从美味的意大利面说起吧,如图所示,色香味俱全的意大利是最终状态,是厨师精心烹调的结果。而在烹调之前,它们只是面粉、肉末、番茄酱、食盐等等一系列主辅料,是厨师根据顾客的要求把它们按比例混合、加工成为各种口味的意大利面。

既然意大利面做好了,那么“意大利面式的代码”又是如何加工出来的呢?作为程序员,俺非常清楚这个加工过程:首先,客户将功能需求以口头或书面形式告知客户经理;接着,经客户经理对需求进行简单分析(分解为输入和输出),并将分析结果告知程序员;然后,程序员根据分析结果进行“填空”,即实现从输入转换到输出之间的空白;最后,层层提交给客户验收功能。若幸运的话(验收通过),“意大利面式的代码”就算大功告成了。若更幸运的话(需求变更),程序员很快就能品尝到亲手制作的“美味佳肴”了!

为什么意大利面如此诱人,而“意大利面式的代码”却惨不忍睹?!——请程序员仔细回忆“填空”的过程,我们把编程语言作为被加工的原料,尝试用语言提供的各种基本元素及结构来“烹调”,尽管我们最终实现了用户需求,而得到的却是一坨“意大利面式的代码”。其中的问题在于,我们用“元素”合成了“意大利面”。而更恰当的做法则是,先用“元素”合成“原料”,然后将“原料”混合、加工成为“意大利面”。这样,只需适当调整原料的配比及加工工艺即可烹调出多种口味的“意大利面”。简单地说,“元素”即编程语言,“意大利面”即客户需求,而缺失的“原料”不仅包括领域知识,而且还有对程序的设计时及运行时概念模型的设计和认知!

美味的意大利面本该盛在餐盘里供人品尝,而不应出现在代码中!