软件系统最重要的一点 - 概念完整性

《人月神话》中Brooks一直非常强调“概念完整性”对于系统的重要性。十年前看这本书的时候总是觉得不懂,是一种说不清,朦朦胧胧的感觉。

【转载自http://blog.sina.com.cn/s/blog_a49b04f601017533.html

定义

概念的完整性,是指针对于一个领域,不仅了解该领域的所有对象,并且了解所有对象之间的关系。比如,小学数学中的四则运算。所有的对象就是指有理数,所有的关系就是由加减乘除四种运算而能够产生另外一个有理数。如果对这样的计算完全了解的话,那么使用这样的领域来解决问题就不成问题。

人月神话

概念的完整性在一本20年了还是非常深刻的软件工程书中被重点提出。这本书叫做《人月神话》。作者通过自己的经验及大量的数据而找到软件开发出现问题的主要原因——概念不完整。

概念不完整,就在开始注定一个软件项目要失败了。就本人的经验来看,很多项目都因为没有对问题了解得足够细致,然后就进行了软件开发,结果所写的代码不能实际解决问题,于是又改代码,并且是不断地去改代码,期望通过改代码来达到解决问题的目的。

其实,问题的根本在于,概念不完整,换言之,就是,始终都没有搞明白问题域有那些对象,各个对象之间是什么样的联系。能够考虑这样的问题的人,一般都是对完整的概念有着强烈的要求并且在这方面具备相当经验的人。写代码的人很难考虑到所写的这一部分代码是否真的解决了问题。在被要求改写代码的时候,只是大概了解别人要改一个需求。

但是,需求从来就不需要改,需要改需求,只说明一点——没有真正搞清楚对象及对象之间的联系。从而没有办法了解问题。在没有真正了解问题的时候,只能被动地等待问题的出现,然后去改代码,以头痛医头,脚痛医脚的方式去解决问题。

而概念的完整性,是建立在已经完全了解领域的对象及对象之间的关联。这种完全了解,并不是感性地了解,而是理性地了解。如,在小学数学这个领域,加法与乘法具有交换律。即,

a + b = b + a

那么在考虑加法与乘法的时候,可以只考虑将小的数放在前面,大的数放在后面这样的情形。从而可以得到简化的加法与乘法口诀。即,只要知道 2+3=5 就可以知道 3+2 一定等于 5。

这样的例子是为了说明,在了解关系的时候,要上升到理性认识,而不是停留在表象上。

又如,考虑社交网站的例子。表象上来看,社交网站要记录每个人的兴趣爱好,职业,曾经就读的学校等。这就导致需要建立一个用户表,建立一个爱好表,职业表,学校表:

而这样的关联完全可以抽象成:

User <--> User_Object <--> Object
name      user_id          name
          object_id
          type
          time

社交网站所需要记录的是人与物的关系,及人与人的关系。一个人喜欢一个物(爱好),做一个物的事(职业),读书于一个物(学校)。以上的抽象,就可以将人与物的关系及时间概念完整地表达出来。

也就是说,概念的完整性,并不是将所有的东西都知道就可以了,还需要真正达到一定的理性认识。达到一定的抽象才行。

软件是一个修改起来代价相对较小的东西,比起造一辆车,一个软件做得再差,也不会造成巨大的现实世界的变化,它最多改变的只是硬盘中某一个区域的磁性。而造一辆车子,需要现实世界中很多物质发生变化才可以做成。从而,这推动了人不把问题想清楚的惰性。一个软件不再依赖于设计人员有着完整的概念,而依赖于开发人员不断地去改。

因而,概念的完整性不仅仅因为要做到概念的完整性不容易,同时因为软件失败的代价很小,更因为根本就没有认识到概念的完整性的意义,从而在软件项目中被忽略了。其结果就是,花费大量时间做着重复的事情,改着冗余复杂的代码。这就是为什么《人月神话》中重点提出:因为没有概念的完整性,从而造成大多数项目失败。

如何完整

保证概念的完整性,一方面需要设计人员具备良好的经验。同时,不要尝试着去将所有人的意见都融入其中。

如,一个软件,要考虑的是大多数人的使用场景,或者重要人物的使用场景。对于个别人物或者次要的使用者,可以少考虑或者不考虑。本人在多个项目需求讨论中都会遇到这样的情况:某个人提到要一个功能,其理由是:我就是喜欢这样的功能。这样的“我”往往是代表着极少数使用者。

而作为一个要求概念完整的人,如果这样的功能影响概念的完整性,就需要果断放弃。而不能牵就于极个别的“我”。

在《人月神话》中,提到解决概念完整性的方法——外科手术团队式开发方法。在这样的团队中,外科医生(首席程序员)一个人来决定一个软件要做成什么样子,并且去写主要的代码。

也就是说,为了保证概念的统一性,需要有一个人或者一个团队(解决巨大问题的时候需要一个团队)来决定什么东西做,什么东西不做。而不是去牵就所有人的要求。这个人或者团队是要有经验的。

在哪里用

在制造一批汽车或者制造一栋楼房之前,设计人员都会做好详细完整的设计。之后再进行实施。一批汽车或者一栋楼房,如果没有造好,会造成很大的损失(这里的损失不是算钱,而是计算对现实世界的改变有效性)。

本人所遇到做得好的软件,其基本流程是:原型→确认原型→开发→测试。原型与原型的确认,就是在实施之前想把概念了解得更加完整,而不是在实施之后不断地去更改。

小结

本文介绍了软件开发失败的主要原因——没有完整的概念。并且很多项目都还在不断地因为这样的原因继续失败。在考虑一个领域的概念完整性的时候,会因为各种原因而考虑不全,但努力方面是明确的——搞清楚完整的概念。

时间: 2024-10-29 14:39:04

软件系统最重要的一点 - 概念完整性的相关文章

概念完整性

?在<人月神话>中,布鲁克斯老先生将维护软件的" 概念完整性" 作为软件开发的核心问题.软件之所以很复杂.难以维护,根本原因就在于软件的概念完整性遭到了破坏,甚至开发团队的成员从来就没有意识到有必要去维护软件的概念完整性,他们并不是一个真正的团队,只是一些自行其事的开发人员,碰巧在一个团队中一起堆代码而已.代码的质量如果不加以控制,就一定会迅速腐烂变质.这是一个客观规律,就像在热力学第三定律中,熵总是会增加一样.对于软件开发而言," 概念完整性" 就相当

如何去实现概念完整性

????? 很多问题,一开始你就不知道要干什么?一个模糊的需求介绍,概念是什么都不知道,这时候谈什么完整性,因为概念的完整性?,最核心的是从根需求一直细化到最底层的叶子需求.????? 很多时候,开始你无法得到根的概念,客户也是零零散散的描述,这时候无所谓完整性,把每个小巧"用户故事"一个一个地实现,展示给用户,慢慢地会形成一个模糊的大概需求,这时候对需求的概念开始有了整体化(当然这个阶段可能很长),这时候你总是会觉得这里少什么,那里少什么,有时候踌躇不前,从这里起,就应该对整体的概念

Java中泛型通配符的一点概念

以List<T>为例,通常如果我们想在List中存储某种类型的数据,我们会用下面的语法进行声明和使用: 1 List<String> allMsg = new ArrayList<String>(); 2 allMsg.add("hello"); 3 allMsg.add("world"); 4 5 for(String msg : allMsg) 6 { 7 System.out.println("[类型:"

产品质量的核心——概念的完整性

产品质量的核心——概念的完整性 ——读<人月神话>有感 转眼本学期已进入尾声,通过十几周对于“软件工程概论”这门课程的学习,我对软件开发的实现过程也有了一定程度的认识和了解.在此环境下,为了能够更好地理解和学习软件工程项目知识,也为了储备专业知识以应对之后的工作需求,通过查阅我接触到<人月神话>这本书——一本在发行四十年之后仍然继续流行.在软件管理领域堪称经典的著作. <人月神话>的作者Brooks在这本书中总结了自己在IBM公司任职项目经理时的实践经验,他详细地阐述了

架构一、核心概念

架构是系统运行时的高层抽象. 架构是系统设计的一部分.它突出了某些细节,并通过抽象省略掉另外一些细节.所以,架构是设计的一个子集.关注实现系统组件的开发者可能不会特别关心所有组件如何装配在一起,而是关注少数组件的设计和开发,包括他们必须遵守的架构约束和可以应用的规则.开发者和架构师面对的是系统设计的不同方面. 1.架构原则与特性 原则或特性 能够...... 功能多样性 ...提供"足够好"的机制,利用简洁的表达来处理各种问题 概念完整性 ...提供单一的.最优的.无冗余的方式来表示一

关于C语言里指针的基本概念

C是很强大的一门语言,然而C语言的强大并不是强大在他的语法和“.h”文件,而是指针.    对指针通用的认知都是:指针是指向内存地址的一个变量.对于这句话,我是这么理解的:核心有两点,第一个是“指向内存地址”,第二个是“一个变量”.在继续写下去之前,我们来看一下指针的定义:    //定义一个整形指针p,定义一个变量a,并且给a赋值a=1    int *p;    int a=1;    printf("a=%d\n",a);    //取a的地址    p=&a;    p

概念数据模型、逻辑数据模型、物理数据模型(转)

最近在系统的学习数据库存储方面的知识加上在公司经常听同事们说起CDM,结合前段时间对MySQL的使用的心得将概念数据模型(Concept Data Model,CDM).逻辑数据模型(Logical Data Model,LDM).物理数据模型(Physical Data Model,PDM)做个简单的介绍.本文将介绍这三种模型的基本概念以及他们之间的不同. 在讨论三种数据模型之前,我们首先学习一下所谓的数据模型.数据模型由三部分组成:数据结构.数据操作和数据约束. 数据结构:数据结构主要描述数

人月神话03

这两周我把<人月神话>剩下的章节看完了. “整体部分”这章讲了 我们的构思是有缺陷的,因此总会有bug.但我们可以利用一些方法来减少bug的出现,细致的功能定义.详细的规格说明.规范化的功能描述说明以及这些方法的实施,大大减少了系统中必须查找的bug 数量. 构件的单元测试,单元测试这一概念在这学期学习软件工程课时老师经常提到,作者很有先见性,测试对于发影藏的bug起着很大作用. “祸起萧墙”,本章讲了软件开发的不可与预测性.对计划和控制职能进行适度的技术人力投资是非常值得赞赏的.它对项目的贡

windows类书的学习心得(转载)

原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,