读《人月神话》之感受

中国科学技术大学软件      朱秀秀           原创作品转载请注明出处

自暑假以来,就认识到这本书几乎成了软件行业不可或缺的一碗鸡汤,不过在我刚一看到“神话”两个字,两眼顿时放光,觉得闲暇之余还可以看看神话之类的小说,煞是惬意,可是暑假档期排得实在是不能再满了,于是乎,决定开学之后再看吧。

暑假的课程紧锣密鼓的进行着,一天,两天、、、。只能说从来没有如此充实的度过长达一个月的起早贪黑的学习生活,好在这段难忘的时间终究还是离我而去,几场考试过后,向往已久的研究生生活开始了。

于是在老师的再次提醒下,《人月神话》终究还是进入了我的眼帘,刚开始看,感觉跟我对软件尤其是编程的认识还是基本相符的,越往后看,越觉得我之前对软件的认识彻底被颠覆了,以前觉得写一个程序,只要能跑,达到我想要的结果,就万事大吉了,现在,我觉得写一个程序,就像上帝在创建一个小型社会一样,这个“小型社会”随着运行的次数多了,用到的人越来越多,其中暴漏出来的矛盾也会越来越严重,就像一个社会的发展,刚开始是农业社会,自给自足,人们相安无事,这就像程序的初期,只要能运行,很少有人会关心其中是否有潜在的bugs,但是随着人们欲望的膨胀—对计算机越来越依赖的本性(实际上是为了减少成本,对于个人来说可以节省更多的时间去做其他事情),就会不由自主的使程序复杂化,这就难免会引入越来越多的bugs,这个阶段就像是工业社会阶段的发展,为了追求发展,也不可避免的会引起越来越多的问题—空气污染,水土流失、、、。

就像孕育婴儿一样,它们的生母—程序员同样需要健康的心理和良好的情绪,只有这样,孕育出来的程序缺陷才会比较少,生命周期才会比较长。要时刻注意,程序不是“产品”,他更不是“项目”,他只是组装“产品”或“项目”中必不可少的一组零件。

之前,我一直以为,当个项目经理挺简单的:每天早上开个小会,催促一下大家的进度,其他结构神马的当然就由架构师全权负责喽,没想到细细品味这本书之后,又再次让我大跌眼镜,有多大的权利就意味着你应当承担多大的责任,尤其是作者提到的“人月”问题,彻底让我醉了,多亏了那个生动的例子:一个女人生孩子要十个月,十个女人生孩子还是要十个月。以前我认为,就像毛爷爷说的:“人多力量大”,再大的项目,只要有足够的人手还怕完不成吗,现在一想到“错误的设定项目周期是最大的错误,项目的发起、评审和预估都需要项目经理的精心考虑和思量 “还心有余悸。作为一个项目经理,如果不能摆脱我之前传统的认识的束缚,就会在项目周期不断缩短的诱惑下,投入更多的人力,以至于有可能使事情变得更糟,进入一个万劫不复的恶性循环中。

就像社会的核心是人类一样,软件这个”小型社会“的核心终究也是我们人类(只不过是其中的少数),之前我认为一个项目中的重头戏应该就是密密麻麻的代码以及对他们夜以继日地调试,更让我吃惊的是:所有软件活动的根本任务竟然是——打造由抽象软件实体构成的复杂概念结构,我一直以为最关键的使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言竟然只是跑龙套的。当我认识到人是软件行业的主角的时候,我顿时感觉天空变亮了一些,我们的前景好像没有那么压力山大,细细品味之后,我认识到:一个好的项目必须依附于一个出色的团队,而一个出色的团队绝对离不开最出色的人员,在以前,我相信”三个臭皮匠,赛过诸葛亮“,但在软件行业,放眼望去,那些卓越的产品虽然出自于众人之手,但源泉绝对来自最优秀的设计人员。

这就给我们一个提示,就像牛顿所说的:站在巨人的肩膀之上。我们可以通过遵循优秀而不是拙劣的实践,来得到良好的设计。优秀的设计是可以传授的。程序员的周围往往是最出色的人员,因此我们可以学习到良好的实践。这种策略,很像我们小学的时候,老师把那些模范作业展示给我们看,别忘了模范的作用可是不可小觑的。像软件工程研究所SEI等新机构的出现都是为了把我们的实践从不足提升到更高的水平。其正确性是勿庸置疑的。

与此同时,贯穿于我们软件设计始终的是:致力于获得和维护概念的完整性,只要遵循了这一条,将会省去很多令人抓狂的问题。这个目标的实现就依靠团队的建设了,在这方面,作者竟然把我们熟悉的外科手术队伍引进软件行业,为此,把项目中的每一个角色与外科手术队伍中的每一个角色一一对应,这样,每个人的任务就一目了然了,同时,软件队伍中的每一个人员必须竭尽全力地配合外科医生——首席程序员,把项目完成的尽量漂亮。

团队建设完成了,相应的对团队的管理一直以来是软件工程行业的一个热点话题,管理人员一蹴而就的想法是造成这种趋势的源头,为此,这本书教育我们应该用“微生物理论”代替“巨无霸理论”让我们知道进步是逐步取得的,伴随着辛勤的劳动,对规范化过程应进行持续不懈的努力,才有了我们今天的软件工程。这就像俗话说的“没有规矩,不成方圆”,我们的社会必须有规章制度才能有条不紊,同样程序这个小型社会的诞生成长也需要”规章制度“,那就是实现他的团队尤其是管理人员和架构师所必须遵循的软件设计原则。

   人与人之间解决矛盾最有效的方法就是要及时沟通,相应的团队管理中最重要的也是要做到队员之间及时沟通。

这本书中有很多我喜欢的至理名言,不过这一句让我印象最深:虽然没有通天大道,但是路就在脚下。

在开发一件产品时,一定要做到仔细地进行市场调研,避免开发已上市的产品。在这个时代,概念设计人员是稀缺人才,一旦有了新概念,一定要在市场调研之后再进行开发,因为即使你开发出了更好的产品,如果有相同功能的先驱,开发的也还行的话,那么推广开来将会很难,所以我们一定要认识到市场调研的重要性。

我之前因为学的都是硬件,所以很想找一个软件和硬件的契合点,然而我却发现:软件和硬件的一个很大的区别在于前者是诸多不同元素实体的集合,即使有相同的部分我们也会想办法,将其合并成一个可供调用的子程序。我觉得这一点是软件设计中优于硬件设计的地方,只要稍加修改,就可以直接调用,当然实现重用性没有那么简单。

软件的生母是——不同的人,而不是上帝,所以就铸就了他不遵循自然科学中的规律:一定存在着简化的解释。在软件开发中,唯一不变的是变化本身。简言之,软件产品扎根于文化的母体中,如各种应用、用户、自然及社会规律、计算机硬件等等。后者持续不断地变化着,这些变化无情地强迫着软件随之变化。软件的客观存在不具有空间的形体特征。因此,没有已有的表达方式,就像陆地海洋有地图、硅片有膜片图、计算机有电路图一样。当我们试图用图形来描述软件结构时,我们发现它不仅仅包含一个,而是很多相互关联、重叠在一起的图形。

勿庸置疑,软件生产率、可靠性和简洁性上最有力的突破是使用高级语言编程。大多数观察者相信开发生产率至少提高了五倍,同时可靠性、简洁性和理解程度也大为提高。高级语言最可能实现的是提供所有编程人员在抽象程序中能想到的要素。可以肯定的是,我们思考数据结构、数据类型和操作的速度稳固提高,不过是以非常缓慢的速度。另外,程序开发方法越来越接近用户的复杂度。然而,对于较少使用那些复杂深奥语言要素的用户,高级语言在某种程度上增加而不是减少了脑力劳动上的负担。这一点我深有感触,以前用汇编语言写代码的时候,很少有需要考虑那么久的语句实现。统一编程环境也使生产率提高了5倍,这一点我们在软件开发的过程中也要时刻注意。

银弹似乎出现了? 然而Ada仍然不是消灭软件生产率怪兽的银弹。毕竟,它只是另一种高级语言,这类语言出现最大的回报来自出现时的冲击,它通过使用更加抽象的语句来开发,降低了机器的次要复杂度。一旦这些难题被解决,就只剩下非常少的问题,解决剩余部分的获益必然也要少一些。必须仔细地区别两个不同的概念:抽象数据类型和层次化类型,后者也被称为类(class)。抽象数据类型的概念是指对象类型应该通过一个名称、一系列合适的值和操作来定义,而不是理应被隐藏的存储结构。这一点颠覆了之前我对面向对象编程的认识。

它们的出现都消除了开发过程中的非本质困难,允许设计人员表达自己设计的内在特性,而不需要表达大量句法上的内容,这些内容并没有添加什么新的信息。对于抽象数据类型和层次化类型,它们都是解决了高级别的次要困难和允许采用较高层次的表现形式来表达设计。
    不过,这些提高仅仅能消除所有设计表达上的次要困难。软件的内在问题是设计的复杂度,上述方法并没有对它有任何的促进。除非我们现在的编程语言中,不必要的低层次类型说明占据了软件产品设计90%,面向对象编程才能带来数量级上的提高。对面向对象编程这颗“银弹”,我觉得夸大了面向对象编程的威力。
    随着多媒体技术的发展,多媒体也应用于软件开发。然而——软件开发上的困难是决定说什么,而不是如何说。表达的简化仅仅能提供少量的促进作用。

之前一直听说专家系统,也搜了很多关于他的解释,但仍然处于懵懂状态。现在, 终于揭开了专家系统的真面目  :专家系统是包含归纳推论引擎和规则基础的程序,它接收输入数据和假设条件,通过从基础规则推导逻辑结果,提出结论和建议,向用户展示前因后果,并解释最终的结果。推论引擎除了处理推理逻辑以外,通常还包括复杂逻辑或者概率数据和规则。

认识到这种系统的能力不是来自某种前所未有的推导机制,而是来自非常丰富的知识积累基础,所以更加精确地反映了现实世界。这种技术提供的最重要进步是具体应用的复杂性与程序本身相分离,这是很大的一个进步。

专家系统最强有力的贡献是给缺乏经验的开发人员提供服务,用最优秀开发者的经验和知识积累为他们提供了指导。这是非常大的贡献。最优秀和一般的软件工程实践之间的差距是非常大的,可能比其他工程领域中的差距都要大,一种传播优秀实践的工具特别重要。再一次让我对优秀开发者的产生无限兴趣。
    还有一些实现自动编程的论断,我支持作者的观点:自动编程总是成为一种热情,使用现在并不可用的更高级语言编程的热情。因为大多数情况下所给出的技术说明本质上是问题的解决方法,而不是问题自身。当然也不排除存在少数特例。,例如:数据发生器的开发技术就非常实用,并经常地用于排序程序中。一个很受欢迎的主题是图形化和可视化编程,计算机图形在软件设计上的应用,如同文中提出的,流程图是一种非常差劲软件结构表达方法程序验证。这使我之前对流程图熟练使用人员的崇拜感顿时荡然无存了。现代编程的许多工作是测试和修复bug。那些期待有可能出现银弹,能够在系统设计级别、源代码级别消除bug,可以在大量工作被投入到实现和测试之前,通过采用证实设计正确性的“深奥”策略,彻底提高软件的生产率和产品的可靠性的开发者,我觉得应该还有很漫长的路要走,至于能否走到路的尽头,亦或是成功的实现这个期望,目前前我觉得希望很渺茫。

当我们向更好的编程开发环境开发中投入时,我们可以期待得到多少回报呢?人们的本能反应是首先着手解决高回报的问题。随着工作站的处理能力和内存容量的稳固和快速提高,我们能期望在软件领域取得多大的收获呢?现在的运算速度已经可以完全满足程序编制和文档书写的需要。编译还需要一些提高,即使在现在的机器运算速度下,程序开发人员的思考活动已然成为日常工作的主要活动。

山重水复疑无路,柳暗花明又一村。当我们必须考虑那些解决软件上必要困难的活动——准确地表达复杂概念结构时,幸运地发现,其中的一些非常有希望。购买和自行开发。构建软件最可能的彻底解决方案是不开发任何软件。这一点是我从来没有过的认识。

需求精炼和快速原型。开发软件系统的过程中,最困难的部分是确切地决定搭建什么样的系统。概念性工作中,没有其他任何一个部分比确定详细的技术需求更加困难,详细的需求包括了所有的人机界面、与机器和其他软件系统的接口。需求工作对系统的影响比其他任何一个部分的失误都大,当然纠正需求的困难也比其他任何一个部分要大。因此,软件开发人员为客户所承担的最重要的职能是不断重复地抽取和细化产品的需求。事实上,客户不知道他们自己需要什么。复杂的软件系统往往是活动的、变化的系统。活动的动态部分是很难想象的。所以,在计划任何软件活动时,要让客户和设计人员之间进行多次广泛的交流沟通,并将其作为系统定义的一种方式。这一点有种醍醐灌顶的感觉:终了解了老师上课说的原始化模型有助于需求挖掘和系统设计。因此,现在的技术中最有希望的,并且解决了软件的根本而非次要问题的技术,是开发作为迭代需求过程的一部分——快速原型化系统的方法和工具。
    软件系统的快速原型对重要的系统界面进行模拟,并演示待开发系统的主要功能。原型不必受到相同硬件速度、规模或者成本约束的限制。原型通常展示了应用程序的功能主线,但不处理任何如无效输入、退出清除等异常情况。原型的目的是明确实际的概念结构,从而客户可以测试一致性和可用性。增量开发——增长,而非搭建系统,正如作者所说,。一瞬间,我的整个软件开发流程的视野也开阔了,这一点就像自然界中的生物,研究一下生物的复杂性,而不是人们的僵硬工作。我们会发现它们的复杂程度令我们敬畏。光是大脑本身,就比任何对它的描述都要复杂,比任何的模拟仿真都要强大,它的多样性、自我保护和自我更新能力异常丰富和有力。其中的秘密就是逐步发育成长,而不是一次性搭建。

最让我瞠目结舌的一点就是:卓越和一般之间的差异竟然接近于一个数量级。

最后,为了让自己能够安心的学习软件知识,最重要的是能够脚踏实地的锻炼编写代码的能力,我在心中默念:软件行业真的没有“银弹”!!!

时间: 2024-08-05 19:36:03

读《人月神话》之感受的相关文章

读<<人月神话>>

这本书在软件领域知名度很高,每次看到年度推荐的文章里面都有这本书且强烈推荐.出版30年了,可谓经典. 但我在读的过程中并没有那么深的体会.书中很多章节都是基于大型项目或者大型系统的经验总结,至今为止我还没有参与大于30人的项目.只能说自己的境界还不够. 第一章,焦油坑 再也找不到一个词比焦油坑更能形容,软件开发的过程了.我们都在挣扎.计划,计划,不断计划,但还是拖延,拖延,拖延.... 职业的乐趣: 创造性,贡献助人为乐,过程的魅力或者解决问题的成就感或写代码的快感,持续学习新事物,驾驭感. 职

读“人月神话”有感

在软件工程这门课中我们学到,一个软件的开发过程不是简单的一个选择编程语言编码实现的过程,而是一个要经过可行性研究分析.需求分析.形式化说明.总体设计.详细设计再到编码实现的过程,后期还需要对软件进行维护,整个软件的开发过程需要开发成员之间的密切而有效的合作. 这个学期,经同学的推荐,我读了一下<人月神话>这本书,一开始并不知道这是一本关于软件工程的书,毕竟这书名迷惑性太大,一般的人都会理解为是人跟月亮的神话,完全不会像软件工程的方向靠近.不过当你读了这本书之后会发现,整本书都是在以一种非常幽默

读人月神话有感

人月神话书如其名一样震撼人心,它引起了许多别的领域的读者对此进行评价. 律师,医生,社会学家,心里学家,和软件人员一样对此书提出评论和建议.人们经常通过比较计算机软件开发生产率和硬件制造生产率来支持这个观点,后者在 20 年内至少翻了 1000 倍.正像第 16 章所解释的,反常的并不是软件发展得太慢,而是计算机硬件技术以一种与人类历史不相配的方式爆发出来.很多年后作者还是会被道“你现在认为哪些在当时就 是错误的?哪些是现在才过时的?哪些是软件工程领域中新近出现的?”很多年来人们对软件生产率和影

人月神话

读人月神话给我感受最深刻的是作者以焦油坑为例向我们抛出了大型系统开发的问题,简短的说出了作为程序员的乐趣与苦恼.人月即产品开发的人数和时间,文章指出了人月并不能衡量一项工作的规模,即人与月是不能相互转换的,在程序开发过程中在某个条件下可以通过增加人数来提高工作效率但到一定情况下再增加人数只会使效率越来越低同时给出了作者自身关于软件任务进度的安排1/3用于计划,1/6用于编码,1/4用于构件测试和早期系统测试,1/4用于系统测试,对于项目开发而言提前的计划非常重要会避免进度的拖延,对于一个进度落后

人月神话阅读笔记—序言及第一、二章

初读人月神话这本书的前言和序言,觉得这本书在关于软件体系结构思想层次方面应该是很高的,而且它流传甚广,并且经过了40余年的沉淀,仍然经久不衰,可见此书的影响是相当深远的. 从目录来看,此书说的不是如何进行程序代码的编写,更多的是关于软件工程中的管理问题,从很多的具体事例,和软件工程历史上发生的一些著名事件来引出章节的内容,以及通过这些具体事件,反映了一些什么样的问题和解决的办法. 第一章的标题名为焦油坑,以开发过程中遇到的很多问题来比喻.介绍了编程系统产品所耗费的时间其实是很多的,接着介绍了作为

读《人月神话》所感

<人月神话> 读书心得: 因为现在还是学生,且没有什么真正在应用项目的开发经验,所以读<人月神话>这本书,与其说是在学习这位计算机先驱的经验,不如说是在了解一个大型软件系统的开发过程以及在开发过程中将会遇到的困难.但是,通过一些小项目的练习经验,还是有很多感触. 如果以后工作了,从事软件编程这个行业,在拿起这本书读一读,有了实际的经历,一定会有更多的收获. 读<人月神话>所感,布布扣,bubuko.com

阅读《人月神话》的感受

老师推荐了这本书读起来收获很大,这里分享一下自己的感悟.首先我感到软件工程领域是个新的领域,发展的前景很广,对社会的影响也深渊,本书人月神话作者从自己的经历实践中阐述了自己的观点,从作者对自己的经历的自述中我发现作者也并非一路平坦有过成功有过失败但总的算是成功,“过去几十年的大型系统开发就犹如这样一个焦油坑,其中只有非常少数的项目满足了目标.时间进度和预算的要求.各种团队,大型的和小型的,庞杂的和精干的,一个接一个淹没在了焦油坑中”确实在以往的例子中有不少失败的就像淹没在了焦油坑,诚然有许多许多

读《人月神话》有感

<人月神话>是IBM360系统之父布鲁克斯所著的经典,它为人们管理复杂项目提供了颇具洞察力的见解,既有很多发人深省的观点,也有大量的软件工程实践,读后受益匪浅,倍受启发. 本书分为15节,其中焦油坑,人月神话,外科手术队伍,贵族专制,民主政治和系统设计以及没有银弹是我最喜欢的几章,以下是我从这几个章节所获得的知识和见解:从(焦油坑)一节中,我认识到了 编程系统产品开发的工作量是供个人使用的.独立开发的构件程序的九倍:编程行业也存在一些苦恼:(1) 将做事方式调整到追求完美,是学习编程的最困难部

读《人月神话》所感所思

近日,读了老师推荐的<人月神话>,深感项目开发的艰辛.<人月神话>这本书最开始的版本是1975年的,四十年过去,当下看来书中有些观点依旧适用,而有些观念已经过时.以下列举看过这本书之后两个印象十分深刻的观点:  “人月是危险和带有欺骗性的神话,因为它暗示人员数量和时间是可以相互替换的.” 诚然,这个观点至今还是毋庸置疑的. 人月之所以是危险和带有欺骗性的,原因是人们混淆了工作量和项目进展.根据Brook 法则,向进度落后的项目中增加人手,只会使进度更加落后.向软件项目中增派人手从三