《人月神话》第十七章阅读笔记:再论“没有银弹”
1,含糊的表达将会导致误解
我并不是贬低软件构建中的次要部分,相反,我认同英国剧作家、侦探小说作者和神 学家桃乐丝·赛尔丝看待创造性活动的观点,创造性活动包括:(1)概念性结构的形式规格化,(2)使用现实的介质来实现,(3)在实际的使用中,与用户交互。在软件开发中,我称为“必要(essence)”的部分是构思这些概念上的结构;我称为“次要(accident)”的部分指它的实现过程。
1.1 现实问题
1,对我而言(尽管不是所有人),关键论点的正确与否归结为一个现实问题:整个软件开发工作中的哪些部分与概念性结构的精确和有序表达相关,哪些部分是创造那些结构的思维活动?根据缺陷是概念性的(例如未能识别某些异常),或者是表达上的问题(例如指针错误或者内存分配错误)等,可以将这些缺陷的寻找和修复工作进行相应的划分。
2,在我看来,开发的次要或者表达部分现在已经下降到整个工作的一半或一半以下。
3,《没有银弹》无可争辩地指出,如果开发的次要部分少于整个工作的 9/10,那么即使 不占用任何时间(除非出现奇迹),也不会给生产率带来数量级的提高。因此,必须着手解 决开发的根本问题。
3,环境和次要因素,无论起到多么积极的作用,仍无法提高生产率。但是在产生负面影响时,它们会使生产率降低。《没有银弹》认为很多软件开发过程已经消除了以下负面因素:十分笨拙的机器语言、漫长的批处理周转时间以及无法忍受的内存限制。
1.2 因为是根本困难所以没有希望?
作为本质上的困难,构思软件概念性的结构本身就有复杂性、一致性、可变性及不可见性的特点。不过实际上,每一种困难产生的麻烦都是可以改善的。
1.3 复杂性是层次化的
1,复杂性是最严重的内在困难,并不是所有的复杂性都是不可避免的。
2,作为对 Lukasik 的简单回应,我认为系统复杂性是无数细节的函数,这些细节必须精确而且详细地说明——或者是借助某种通用规则,或者是逐一阐述,但决不仅仅是统计说明。仅靠若干人不相干的工作,是不大可能产生足够的一致性,能用通用规律进行精确描述。
3,《没有银弹》提出了全力解决复杂性问题的方法,这种方法可以在现实中取得十分乐观的进展。它倡导向软件系统增加必要的复杂性:
层次化,通过分层的模块或者对象。
增量化,从而系统可以持续地运行。
2 Harel 的分析
2.1 银弹就在这里
Harel 接着提出了他自己的银弹,一种称为“香草(Vanilla)框架” 的建模技术。建模所针对的确实是软件开发的根本困难,即概念性要素的设计和调试,因此 Vanilla 框架有可能是革命性的。我也希望如此。Ken Brooks 在报告中提到,在实际工作中应用时,它的确是一种颇有帮助的方法学。
2.2 不可见性
1,首先,我们会使用“合适的”实体和关系来形成概念,然后表达成一系列逐步完善的模型,不断地系统化阐明和精化设计概念。模型用若干可视化语言的适当组合来描述,它必须是多种语言的组合,因为系统模型具有若干方面的内容,每方面象变戏法般产生不同类型的思维图像。
2,我和 Harel 颇为一致。我认为软件要素并不存在于三维空间中,因此并不存在概念性设计到图形简单两维或三维上的映射。他承认,我也同意——这需要多种图形,每种图形覆盖某个特定的方面,而且有些方面无法用图形来表达。
3 Jones 的观点--质量带来生产率
1,Jone 提出,“不。关注质量,生产率自然会随着提高。”他认为,很多代价高昂的后续项目投入了大量的时间和精力来寻找和修复规格说明中、 设计和实现上的错误。他提供的数据显示了缺乏系统化质量控制和进度灾难之间的密切关系。
2,Coqui 也提出相似的主张:系统化软件开发方法的发展是为了解决质量问题(特别是避免大型的灾难),而不是出于生产率方面的考虑。
4 面向对象编程--这颗铜质子弹可以吗
4.1 使用更大的零件来构建
面向对象编程的第一个特征是,它强制的模块化和清晰的接口。其次,它强调了封装,即外界无法看到组件的内部结构;它还强调了继承和层次化类结构以及虚函数。面向对象还强调了强抽象数据类型化,它确保某种特定的数据类型只能由它自身的相应函数来操作。
4.2 面向对象技术为什么发展缓慢
1,James Coggins 回归到基本的软件问题,主张一种解决软件不能满足要求的方法,即通过客户的参与和协作来提高脑力劳动的规模。
2,如果我们设计大粒度的类,关注用户已经接触的概念,则在进行设计的时候,他们能够理解设计并提出问题,并且可以帮助设计测试用例。我的眼科客户并不关心堆栈,他们关心描述眼角膜形状的勒让德多项式。
3,人们并没有被告诉 OO 是一种设计的方法,并向他们讲授设计方法和原理,大家只是被告知 OO 是一种特殊工具。而我们可以用任何工具写出优质或低劣的代码。除非我们给人们讲解如何设计,否则语言所起 的作用非常小。结果是人们使用这种语言做出不好的设计,没有从中获得什么价值。而一旦获得的价值少,它就不会流行。
4.3 资金的先行投入,收益的后期获得
1,面向对象技术的前期投入很多——主要是培训程序员用很新的方法思考,同时还要把函数打造成
通用的类。面向对象应用在整个开发周期中,但是真正的获益只有在后续开发、扩展和维护活动中才能体现出来。Coggin 说:“面向对象技术不会加快首次或第二次的开发,产品族中第五个项目的开发才会异乎寻常的迅速。”
2,为了预期中的,但是有些不确定的收益,冒着风险投入金钱是投资人每天在做的事情。 不过,在很多软件公司中,这需要真正的管理勇气,一种比技术竞争力或者优秀管理能力更少有的精神。我认为极度的前期投入和收益的推后是使 OO 技术应用迟缓的最大原因。
5 重用的情况怎样
1,解决软件构建根本困难的最佳方法是不进行任何开发。软件包只是达到上述目标的方法之一,另外的方法是程序重用。
2,重用是一件说起来容易,做起来难的事情。它同时需要良好的设计和文档。即使我们看到了并不十分常见的优秀设计,但如果没有好的文档,我们也不会看到能重用的构件。
6 学习大量的词汇--对软件重用的一个可预见,但没有被预言的问题
1,思索的层次越高,所需要处理的基本思考要素也就越多。因此,编程语言比机器语言更加复杂,而自然语言的复杂程度更高。高级语言有更广泛的词汇量、更复杂的语法以及更加丰富的语义。
2,对软件重用问题,一些经验教训是显而易见的:
人们在上下文中学习,所以我们需要出版一些复合产品的例子,而不仅仅是零部件的库。
人们只会记忆背诵单词。语法和语义是在上下文中,通过使用逐渐地学习。
人们根据语义上的分类对词汇组合规则进行分组,而不是通过比较对象子集。
评论