没有银弹——软件工程中的根本和次要问题
没有任何技术或管理上的进展,能够独立地许诺十年内使生产率、可靠性或简洁性获得数量级上的进步。——软件工程领域最著名的论断。所有软件活动包括根本任务——打造由抽象软件实体构成的复杂概念结构,次要任务——使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言。软件工程领域的根本难题在于复杂度,一致性,可变性和不可见性。值得注意的是,文章末尾提出了一些可能的银弹,比如面向对象编程,只能解决软件工程中的非本质困难,而对于软件工程根本的问题于事无补。就是说,我们某种程度上能够解决使用编程语言表达抽象的实体,或者将其变得结构化,构建起完整的概念结构,但是仍然没有解决软件工程的根本难题——复杂度、一致性、可变性和不可见性。因此,现在的技术中最有希望的,并且解决了软件的根本而非次要问题的技术,是开发作为迭代需求过程的一部分——快速原型化系统的方法和工具。快速原型之所以可以解决根本问题,是因为快速原型有助于澄清软件工程的概念结构,从而降低了后期变更的幅度。基于快速原型进行增量开发,目前已经成为实际开发的标准流程。
再论《没有银弹》
Brooks在这篇文章里面再次讨论了很多潜在的银弹。因为自从《没有银弹》发表以后,遭到了大量的误解、批评和质疑,Brooks专门写了这篇文章来继续解释他的观点和回应批评。首先一个可能的银弹是Harel提出的一种叫做Vanilla的框架,有助于程序的概念设计和图形化呈现,看上去确实直面软件工程开发的根本困难:复杂性和不可见性。Brooks甚至也赞同如果Vanilla框架得到发展应用,也许就是银弹。但是今天看来,20年过去了似乎Vanilla已经遭人遗忘。显然它并非软件开发的银弹。另一个可能的银弹是定制软件包的开发。基本上今天的开源社区已经这样做了。大量的公共库被开发出来,确实提高了通用需求的开发效率。Brooks也承认,他低估了软件包客户化的程度和重要性。面向对象编程,被称为“铜制子弹”。但是面向对象技术“不会加快首次或第二次的开发,产品族中第五个项目的开发才会异乎寻常的迅速”。不过经过20年再来看,面向对象虽然发展缓慢,但是的确已经统治了软件开发行业,称得上一颗“铜制子弹”。软件重用,也是一个可能的解决方案。
20年后的人月神话
今天,我比以往更加确信。概念完整性是产品质量的核心。拥有一位结构式是迈向概念完整性的最重要一步。这个原理不仅限于软件系统,它适用于所有的复杂事物。如果要我用一个词语来概括人月神话,我想我会说“沟通代价”;如果可以有两个词,那就加上“概念完整性”。20年后的人月神话有些结论得到验证,有些情况已经变化,下面是这些情况的简单概括:第二系统定律得到验证:开发第二个系统总是因为盲目的功能导致易用性、甚至是可用性的灾难。图形界面的成功。瀑布模型被证明是错的了,因为没有构建舍弃原型。事实上增量开发与快速迭代才是理想的开发方式。增量开发和快速原型,渐进地精华,让软件像生物进化那样逐渐演化成更为复杂的结构,演化出更多的功能。信息隐藏:Parnas是正确的,我是错误的。20年前关于信息隐藏的两大观念,其一是Brooks主张的,所有的程序员应该了解所有的材料。而Parnas则认为代码模块应该采用定义良好的接口来封装,这些模块内部结构应该是程序员的私有财产。Brooks承认,Parnas所主张的方案确实更符合实际。对人月神话实际研究发现,向进度落后的项目中添加人手会增加项目的成本,但是不一定会使项目更加落后。如果在项目早期添加额外的人比在后期添加额外的人更安全些。人就是一切。这一点可以从《人件:高生产率的项目和团队》可以见出。放弃权利的力量——公司通过将权利下放到具体的团队,事实上使得组织机构变得更加“融洽和繁荣”。最令人惊讶的新事物——数百万的计算机使用塑料包装的成品软件包作为构建:成熟的模块和对象组合提升了软件复用的层次。借鉴:https://www.jianshu.com/p/da8a68354caa