阅读作业
没有银弹 No Silver Bullet – Essence and Accidents of Software Engineering – Brooks
在这篇论文中,作者阐述了软件的四个本质:Complexity
,Conformity
,Changeablity
, Invisibility
在解释复杂性
时,作者首先把软件和其他的人类建造物做对比:
Software entities are more complex for their size than perhaps any other human construct, because no two parts are alike (at least above the statement level). If they are, we make the two similar parts into one, a subroutine, open or closed. In this respect software systems differ profoundly from computers, buildings, or automobiles, where repeated elements abound.
在软件开发中,如果我们遇到两个相同的部分,我们一般的做法是把他们写成一个函数,以便于重用,因此软件的每个组成部分可以说是互不相同的,不可替代的。而在人类的其他建造物,例如楼房,则是由重复的砖块,或者是钢筋混凝土搭建而成,因此软件的复杂性远超于普通的事物。
而作者又把软件的复杂性与基础科学例如数学物理的复杂性做对比,我觉得这里的对比真的让人豁然开朗,它突出了软件的复杂性
的本质性
Mathematics and the physical sciences made great strides for three centuries by constructing simplified models of complex phenomena, deriving properties from the models, and verifying those properties experimentally. This worked because the complexities ignored in the models were not the essential properties of the phenomena. It does not work when the complexities are the essence.
物理和数学学科之所以在建立了基本概念和模型后,可以快速发展的原因就是物理和数学的“本质”并不复杂,但是为什么软件工程没有这样的基础模型和概念呢?就是因为软件的复杂性
就是软件的本质之一!
软件的可变性也是软件的本质之一,为什么软件一直在被改变呢?就是因为软件是一个embedded system
,它和硬件有关,和写软件的人有关,和需求有关,一旦这些影响因素发生变化,例如硬件更新换代,需求变更,那么软件就需要随之更新,所以软件是在一直变化的。
软件也是“不可见”的,一个软件实体不能用一张图或者一个立体模型给表现出来,因为它的复杂性和易变性,如果尝试为一个软件建立一个可视化的模型,那么可能需要几个图模型,有的表示数据流向,有的表示依赖关系等等,但是这些都无法像现实世界的实体一样,通过一个立体模型直观的表现出来。
在之后作者提出的一些建议中,我觉得这个建议很关键:
Incremental development−grow, not build, software.
我们要做的不是建造软件,而是不断的更新软件,关于这一点,神策数据的CEO桑文锋老师就在α阶段的总结会上提到过类似的,就是不要想着一开始就造一个大工程,好的软件是靠不断的更新换代产生的,可惜的是,我们在这个学期的软件开发过程中并没有很好的贯彻这个原则,不过我是非常赞同这个观点的。虽然在我们的团队开发中没有实现不断迭代版本,但是我自己在写一些个人项目,例如我们的编译大作业,再比如之前的计组等的过程中可以感受到 迭代的重要性。我们无法在一开始写出一个软件就保证它是最好的,只有在不断的根据用户反馈或者自己的重构中不断的提高软件的质量。