这两个活动之间还有什么类似之处呢?在建房子中,你不会去建造那些你可以现成买来的
东西,比如洗衣机、烘干机,电冰箱、吸尘器等,除非你是个机械迷。同时,你也会去购买已
经做好的地毯、门、窗和浴室用品,而不是自己动手建。如果你正在建造一个软件,你也会这
样做。你会推广使用高级语言的特点,而不是去编写操作系统一级的代码。你也会利用已经存
在的显示控制和数据库处理系统,利用已经通过的子程序。如果样样都自己动手是很不明智的。
如果你想修建一幢陈设一流的别墅,情况就不同了,你可能定做全套家具,因为希望洗碗
机、冰箱等与你的协调一致,同时你还会定做别具风格的门和窗户。这种定做化的方式与一流
软件开发也是非常类似的。为了这一目的,你可能创建精度更高、速度更快的科学公式。你也
会设计自己的显示控制、数据库处理系统和自己的子程序,以使整个软件给人以一气呵成,天
衣无缝的感觉。
当然这两种建造方法也要付出代价,工作的每一步都要依据事先制定好的计划进行。如果
软件开发工作的顺序有误,那么这个软件将是难以编码、难以测试和难以调试的。这可能会使
整个计划延误甚至失败,因为每个人从事的工作都非常复杂,把它们综合到一起后会使人无所
适从。
如果你在盖办公楼时工作做得不好,那么在楼内办公的人便可能面临危险。同样,如果你
在创建医药、航空电子、空中交通管制、加工控制等软件时工作做得不好,后果也可能是灾难
性的。危及别人生命是劣质软件的最可怕后果,但并不是它的唯一危害。如果公司的股东们因
为你编写了错误软件而赔钱,那也是令人遗憾的。无论如何,无辜的人们没有义务为你的工作
失误而付出代价。
对于软件作修改与建造建筑物也有类似之处。如果你要移走的那面墙壁还要支撑其它东西
而不仅仅是隔开两个房间,那么你要付出的成本将会更高。同样,对软件做结构性的修改也将
比增加或减少外设特征付出更高昂的代价。
最后,建筑类比对于超大型软件也是同样适用的。一幢超大型建筑物存在错误的后果将是
灾难性的,整个工程可能不得不返工。建筑师们在制定和审查计划时是非常仔细的,他们往往
留出安全裕度,多用10%的材料来加强结构总比一幢大楼坍塌要好得多,同时还必须仔细注意
工时计划,在修建帝国大厦时,每辆卡车的每次卸货时间都留出了十五分钟的裕度。因为如果
有一辆卡车不能在指定时间到达指定的位置,整个计划就有可能被延误。
同样,对于超大型软件来说,计划工作需要比一般的大型软件在更高的层次上进行。1977
年,CapersJones 估计说,对于一个拥有750,000 行代码的系统来说,可能需要多达600 页的
功能定义文件。对于一个人来说,不要说理解这种规模全部的设计,就是读完它也是非常困难
的。安全系数对于这种项目是必须的,制定该系统的工时计划尤为重要。当我们在建造与帝国
大厦同等经济规模的软件时,我们也需要同等严密的计划。而我们现在才刚刚开始考虑这种规
模项目的计划技术。
这两者之间的相似还可以推广到其它方面,这就是为什么建筑物创建隐喻是如此强有力的
原因。许多常用的软件词汇来源于建筑学,如:软件体系结构、搭结构架、构造、分割代码、
插入子程序等等。
2.3.5 实用软件技术:智能工具箱( The Intellectual Toolbox)
在过去的十几年中,优秀的软件开发人员们积累了几十条关于开发软件的技术和技巧,有