目 录CONTENT

文章目录

《人月神话》读书笔记

Nicholas
2023-05-27 / 0 评论 / 1 点赞 / 102 阅读 / 3512 字

版本说明:本文最后更新于2023-06-02,详细更新记录参见文末表格。

若链接或图片失效,对文中内容有任何疑义和勘误意见,欢迎留言反馈。

精选程度:★★★★☆|博文状态:已完结|本地标签:是|书籍评分:★★★★☆


《人月神话》读书感悟

《人月神话》是一本我在前些年就听说并且一直想读的软件工程经典著作,也是软件工程中人尽皆知的一本书。它第一版成书于1975年,在2015年推出了40周年纪念版,这样的历久不衰足以证明它对于软工领域的影响之大和见解之深刻。这次恰逢课程作业的机会有幸一览,觉得确实有所收获,本文谈谈我对这本书的读书感悟。(本文最初撰写于2022-10-06)

总体来说,我认为全书聚焦的问题主要就在于对大型的软件开发项目而言,如何保证项目的顺利进行及提高效率。大型项目和小型项目开发是完全不一样的,这种不同表面上只是体现在规模的不同,然而当这种规模的扩大反映到实际的任务中,往往会导致工作量呈现指数型的上升,这可能是出于人员的分工不合理、缺乏有效的沟通等各种问题,最终导致进度拖延、预算超标、没有达到预期的需求等后果。就像一个焦油坑,各种大型的项目在其中艰难地垂死挣扎。

就小型的开发任务而言,比如基础的Web平台工具,我们或许一个人就可以高效地进行编程开发。但是随着项目规模的增大,单人虽然仍然可以完成,但需要的时间相应会变得非常久(比如60个人月),这时由于软件项目本身的完成期限限制,项目就必须增加人手。然而增加人手并非像想象中的一般,一个60人月的任务分配到5个人就会变成每人12人月完成。实际上,人月的概念具有欺骗性,因为在很多情况下(例如当任务由于次序的限制不能分解时),人数和时间是不可相互替换的,它会造成培训和相互交流的额外负担。在延期的项目中增加人手更是如此,而且状况只会更加糟糕。这是因为人员增加之后就会出现任务的分工和沟通问题,每个人的工作并不是像割稻子一样孤立地完成其中的一部分,而是所有人需要共同为了一个软件的实现而协调地设计和开发,这不仅需要保证各自的部分正确,同时也需要保证每个人的工作可以合理地融入在整体中,保证系统测试可以顺利通过,并且体现良好的概念一致性。因此分配“结构师”的职务来安排好总体的架构和概念尤为重要。

对于大型项目的开发,以下列出部分我认为书中提出的重要观点:

其一、大型软件开发项目的团队需要做出分工,并且有效的分工往往是专业化的分工,即每个人专注于自己特定的领域(如结构师、管理员、编辑、工具维护人员、测试人员等)。这也使得团队成员之间简单形式的沟通成为可能,节约了沟通的成本。

其二、软件的设计实现需要注重概念的完整性,需要有连贯的设计思路,不能有独立不协调的系统,不然就算其中有很好的设计,也会影响到用户体验。对大型项目来说,体系结构的设计和具体的程序实现分离是达成这一点的有效方式。团队中的每一个成员也应该从系统的整体出发,保持系统的连续性和完整性。

其三、团队成员之间的交流沟通非常重要,交流的途径包括但不限于非正式途径、会议、工作手册等。

其四、规范化的文档工作对项目的顺利有序进行非常重要,而其中少数文档是关键枢纽,有利于我们理清思路,因此需要提纲挈领。我们需要认识到文档的普遍性和重要性,将文档友好地利用起来而不是将其视作洪水猛兽,并遵循它开展工作。

其五、对原有系统的修复和维护工作,倾向于破坏原有系统的架构,会使得系统的熵不断增加,而且不管是机器、配置还是用户需求都在不断地变化,因此基于原有系统重新设计新系统是非常必要的。

其六、保证项目计划执行的一项有力措施是用具体的、可度量的事件制定里程碑,并明确关键路径。可能的减少交流成本的方法是限定职责范围,信息隐藏(编程人员被屏蔽在他人程序的内部结构前)情况下的工作效率最高。

归结起来,书中描述的很多问题是非常具有前瞻性的,到现在都仍然适用,今天的组织或者程序员仍然会存在书中提出的问题,并仍可以参考其提出的解决方案。我在阅读的过程中,也发现了很多在自己的学习及开发经验等中遇到过的问题,抑或是现今的各种软件工程书籍和其他地方都经常被人提起并已然成为普遍共识的观念,并惊异于这些问题和注意点竟然在40多年前就已经被作者所提出,并至今历久弥新。

这说明,一方面作者对软件工程的本质问题具有很深的理解,并准确地阐述了出来,这些问题(例如文档工作对于项目的重要性)一直贯彻在大型软件的开发项目中。无论是过往、现在还是未来,都需要在每个项目中予以重视并进行合理的安排。另一方面,作者的很多分析都着眼于对于人类行为的分析,软件开发的参与者归根究底是人,具有人类活动的共性,因此这种经验是跨时空、跨领域而存在的。据此,作者也指出其中的很多经验不只对于软件工程适用,对于其他领域可能同样适用。而我也认为,其中的部分启示不仅对于项目适用,对于个人的工作也很有启发。出于篇幅原因,在这里不尽列举如下:

第一,编程的乐趣。作者详细归纳了编程的乐趣,它来源于我们使用自己的纯粹的思考,在计算机上创建自己的“城堡”。它满足了我们内心进行创造的渴望,同样满足了每次解决新的问题和学习新的知识的乐趣。计算机领域的飞速发展给编程带来了越来越多的可能性,在现在硬件和软件都发展到非常强健和充裕的时代,虽然仍然存在着一些编程固有的苦恼,但我对于这种创造的乐趣的感受非常强烈,对于身处现在的时代感到非常幸运,也崇敬于前辈们的付出和成果。

第二、不切实际的乐观主义。对于程序,我们总是倾向于认为“一切都将运作良好,每一项任务仅花费它所应该花费的时间”,然而,不管是对于项目而言,还是对于个人而言,这种估计都常常过于乐观。我在刚开始接触程序以及一些Web开发项目的时候,总是倾向于把程序编写完毕才会去运行和调试,实际经验证明这并不是一种良好的习惯。相反,我们应该在构建每一个小的功能的时候就进行仔细的检验和测试。

构想和实现的关系往往如此,我们在大脑中构想,往往忽视了很多很多具体实现过程中可能出现的细节的问题。而只有在实现的过程中,我们才会发现构想的过程中所疏忽的问题。这是两种思维的方式,而在软件的开发中,这种体现也尤其突出,因为编程的实现尤其复杂和追求完美。

第三、我们编写的程序需要带有详细的注释。就算是完全给自己开发用的程序,注释也是非常必要的,因为随着时间的推移,我们也会忘记自己当时书写的程序,当需要修改和维护的时候,没有注释就意味着我们必须重新去理解当时的想法。

总览全书,本书没有提及太多技术性的内容,而是重点论述软件工程中的管理问题,它和其他类型的管理具有很多的相通之处,同时也包含了软件领域中特有的概念。软件作为人类所能创造的最复杂的制品,其中研究得到的很多理论和经验,在其他领域以至个人学习生活中都可用作借鉴。


Q & A

暂无

更新记录

时间修改内容
2023-05-27首次发布版本
2023-06-02修改了引言部分的介绍
1

评论区