《人月神话》中Brooks一直很是强调“概念完整性”对于系统的重要性。十年前看这本书的时候老是以为不懂,是一种说不清,朦朦胧胧的感受。html
【转载自http://blog.sina.com.cn/s/blog_a49b04f601017533.html】程序员
概念的完整性,是指针对于一个领域,不只了解该领域的全部对象,而且了解全部对象之间的关系。好比,小学数学中的四则运算。全部的对象就是指有理数,全部的关系就是由加减乘除四种运算而可以产生另一个有理数。若是对这样的计算彻底了解的话,那么使用这样的领域来解决问题就不成问题。测试
概念的完整性在一本20年了仍是很是深入的软件工程书中被重点提出。这本书叫作《人月神话》。做者经过本身的经验及大量的数据而找到软件开发出现问题的主要缘由——概念不完整。网站
概念不完整,就在开始注定一个软件项目要失败了。就本人的经验来看,不少项目都由于没有对问题了解得足够细致,而后就进行了软件开发,结果所写的代码不能实际解决问题,因而又改代码,而且是不断地去改代码,指望经过改代码来达到解决问题的目的。设计
其实,问题的根本在于,概念不完整,换言之,就是,始终都没有搞明白问题域有那些对象,各个对象之间是什么样的联系。可以考虑这样的问题的人,通常都是对完整的概念有着强烈的要求而且在这方面具有至关经验的人。写代码的人很难考虑到所写的这一部分代码是否真的解决了问题。在被要求改写代码的时候,只是大概了解别人要改一个需求。指针
可是,需求历来就不须要改,须要改需求,只说明一点——没有真正搞清楚对象及对象之间的联系。从而没有办法了解问题。在没有真正了解问题的时候,只能被动地等待问题的出现,而后去改代码,以头痛医头,脚痛医脚的方式去解决问题。htm
而概念的完整性,是创建在已经彻底了解领域的对象及对象之间的关联。这种彻底了解,并非感性地了解,而是理性地了解。如,在小学数学这个领域,加法与乘法具备交换律。即,对象
a + b = b + a
那么在考虑加法与乘法的时候,能够只考虑将小的数放在前面,大的数放在后面这样的情形。从而能够获得简化的加法与乘法口诀。即,只要知道 2+3=5 就能够知道 3+2 必定等于 5。blog
这样的例子是为了说明,在了解关系的时候,要上升到理性认识,而不是停留在表象上。开发
又如,考虑社交网站的例子。表象上来看,社交网站要记录每一个人的兴趣爱好,职业,曾经就读的学校等。这就致使须要创建一个用户表,创建一个爱好表,职业表,学校表:
而这样的关联彻底能够抽象成:
User <--> User_Object <--> Object name user_id name object_id type time
社交网站所须要记录的是人与物的关系,及人与人的关系。一我的喜欢一个物(爱好),作一个物的事(职业),读书于一个物(学校)。以上的抽象,就能够将人与物的关系及时间概念完整地表达出来。
也就是说,概念的完整性,并非将全部的东西都知道就能够了,还须要真正达到必定的理性认识。达到必定的抽象才行。
软件是一个修改起来代价相对较小的东西,比起造一辆车,一个软件作得再差,也不会形成巨大的现实世界的变化,它最多改变的只是硬盘中某一个区域的磁性。而造一辆车子,须要现实世界中不少物质发生变化才能够作成。从而,这推进了人不把问题想清楚的惰性。一个软件再也不依赖于设计人员有着完整的概念,而依赖于开发人员不断地去改。
于是,概念的完整性不只仅由于要作到概念的完整性不容易,同时由于软件失败的代价很小,更由于根本就没有认识到概念的完整性的意义,从而在软件项目中被忽略了。其结果就是,花费大量时间作着重复的事情,改着冗余复杂的代码。这就是为何《人月神话》中重点提出:由于没有概念的完整性,从而形成大多数项目失败。
保证概念的完整性,一方面须要设计人员具有良好的经验。同时,不要尝试着去将全部人的意见都融入其中。
如,一个软件,要考虑的是大多数人的使用场景,或者重要人物的使用场景。对于个别人物或者次要的使用者,能够少考虑或者不考虑。本人在多个项目需求讨论中都会遇到这样的状况:某我的提到要一个功能,其理由是:我就是喜欢这样的功能。这样的“我”每每是表明着极少数使用者。
而做为一个要求概念完整的人,若是这样的功能影响概念的完整性,就须要果断放弃。而不能牵就于极个别的“我”。
在《人月神话》中,提到解决概念完整性的方法——外科手术团队式开发方法。在这样的团队中,外科医生(首席程序员)一我的来决定一个软件要作成什么样子,而且去写主要的代码。
也就是说,为了保证概念的统一性,须要有一我的或者一个团队(解决巨大问题的时候须要一个团队)来决定什么东西作,什么东西不作。而不是去牵就全部人的要求。这我的或者团队是要有经验的。
在制造一批汽车或者制造一栋楼房以前,设计人员都会作好详细完整的设计。以后再进行实施。一批汽车或者一栋楼房,若是没有造好,会形成很大的损失(这里的损失不是算钱,而是计算对现实世界的改变有效性)。
本人所遇到作得好的软件,其基本流程是:原型→确认原型→开发→测试。原型与原型的确认,就是在实施以前想把概念了解得更加完整,而不是在实施以后不断地去更改。
本文介绍了软件开发失败的主要缘由——没有完整的概念。而且不少项目都还在不断地由于这样的缘由继续失败。在考虑一个领域的概念完整性的时候,会由于各类缘由而考虑不全,但努力方面是明确的——搞清楚完整的概念。