design

来源:互联网 发布:万方医学数据网 编辑:程序博客网 时间:2024/05/08 21:13

好的设计源于对一小批关键设计概念的理解。这一节将会讨论“复杂度”所扮演的角色、设计应具有的特征,以及设计的层次。

Software’s Primary Technical Imperative: Managing Complexity软件的首要技术使命:管理复杂度

为了理解管理复杂度的重要性,我们有必要引用Fred Brooks的那篇具有里程碑意义的文章——《没有银弹:软件工程中本质性和偶然性》(1987)。

Accidental and Essential Difficulties

偶然的难题和本质的难题

Brooks认为,两类不同的问题导致软件开发变得困难——本质的问题和偶然的问题。关于这两个术语,Brooks引用了亚里士多德时代的一个哲学传统。在哲学界,本质的(essential)属性是一件事物必须具备、如果不具备就不再是该事物的属性。汽车必须具有引擎、轮子和车门,不然就不能称其为汽车。如果不具备这其中任何一个本质的属性,它就不再是一辆汽车。

偶然的(accidental)属性则是指一件事物碰巧具有的属性,有没有这些属性都并不影响这件事物本身。一辆汽车可能有台V8发动机,或是涡轮增压四缸发动机,或其他什么种类的发动机,无论这些细节如何,它总是一辆汽车。一辆汽车也可能是两门或四门的;它可能有粗劣或豪华的轮毂。所有这些细节都是次要的偶然属性。你也可以把偶然属性想成是附属的、任意的、非必要的或偶然出现的性质。

Brooks观察到,软件开发中大部分的偶然性难题在很久以前就已得到解决了。比如说,与笨拙的语法相关的那些偶然性难题大多已在从汇编语言到第三代编程语言的演进过程中被解决了,而且这类问题的重要性也渐渐下降了。与非交互式计算机相关的偶然性难题也随着分时(time-share)操作系统取代批模式(batch-mode)系统而被解决。集成编程环境更是进一步解决了由于开发工具之间无法很好地协作而带来的效率问题。

Brooks论述说,在软件开发剩下的那些本质性困难上的进展将会变得相对缓慢。究其原因,是因为从本质上说软件开发就是不断地去发掘错综复杂、相互连接的整套概念的所有细节。其本质性的困难来自很多方面:必须去面对复杂、无序的现实世界;精确而完整地识别出各种依赖关系与例外情况;设计出完全正确而不是大致正确的解决方案;诸如此类。即使我们能发明出一种与现实中亟待解决的问题有着相同术语的编程语言,但是人们要想清楚地认清现实世界到底如何运作仍有很多挑战,因此编程仍会十分困难。当软件要解决更大规模的现实问题时,现实的实体(entities)之间的交互行为就变得更为复杂,这些转而又增加软件解决方案的本质性困难。

所有这些本质性困难的根源都在于复杂性——不论是本质的,还是偶然的。