《人月神话》读书笔记

2025.4.13 - 2025.4.17,笔者拜读了软件工程领域的名作《人月神话》,在此写下读书笔记与心得。


1. 书籍介绍

《人月神话》的行文以比喻见长,将软件工程中的各种问题以比喻的形式呈现

同时,本书表面上是讲软件工程,真正的内核是软件工程背后的社会学原理

遗憾的是,笔者才学疏浅,无法全部理解书中的各种概念,加之年代久远和翻译的误差,很多说法与如今有所出入

比如说系统设计与开发,在书中应该是指的是软件项目的架构的设计与实现

而在如今的语境中,指的是操作系统的设计与开发

尽管有所偏差,但笔者仍然想写下对书中经典比喻的分析


2. 内核分析

  • 焦油坑:在大型的软件开发中,实际进度会被各种问题耽搁
    这些问题可以分为项目本身的代码问题和项目外的管理问题
    从项目本身来看,如果一个项目前期的技术选型,代码规范,开发流程等没有事前安排好
    那么随着项目的开发,这些问题会逐渐暴露,最终成为拖延进度的焦油坑;
    从项目外来看,一个开发团队的组织与管理也会影响到项目的进度,一个好的团队可以参考后面的“外科手术队伍”这个比喻。
    在笔者目前的认知中,最广为人知的焦油坑就是Windows操作系统。win系统从面世至今,经历了大大小小无数次内核改动。
    可以说对于微软系统维护人员来说,Windows无疑是一座屎山,也是整个公司的焦油坑

  • 人月神话:人月(Man-Month)指的是一名程序员一个月全职的工作量
    而人月神话则是说在项目开发中不能简单的用人数换取时间进度,因而将这个说法称为人月神话
    这里,笔者想讨论为什么不能用“人”来换“月”。
    在一个软件项目中,如果一个项目的进度落后于规划,项目负责人想的第一件事很可能是增加人手
    但软件行业不同于其它行业,增加的新人需要花时间熟悉项目的代码和开发流程
    需要老成员来指导培训,甚至可能要处理新人开发不规范带来的问题。这样一来,项目的进度不但没有加快,反而被拖慢了。
    但是在现实中,项目的进度遇到问题,负责人要么无休止的招新人,要么让老成员陷入加班的无底洞
    这无疑是现代软件工程的可悲之处

  • 外科手术队伍:不同于扁平化的团队模式,外科手术队伍指团队有一个核心开发(书中称之为首席程序员),也可以理解为CTO
    整个团队的人员配置都是围绕这个核心开发展开的,比如要为核心开发配备一个副手,几个文员等等,再往下的就是普通程序员
    这样的人员配置可能会遇到一些问题,这将在下面的“贵族专制”中提到,在现代公司的软件开发团队中,似乎与书中的外科手术队伍有所不同
    这里由于笔者经验不足,无法获得更高层面的认知,就将此话题按下不表
    不过在小型初创团队中,扁平化的管理方案似乎更能够提高效率

  • 贵族专制和民主政治:贵族专制指的就是在外科手术团队的配置下,可能整个项目的走向都被首席程序员所决定
    没有充分发挥下面普通程序员的主观能动性,下面的人也很难为团队建言献策
    在这种情况下,民主政治的必要性就体现了出来,它使得所有人都能为项目提供建议,改善方向
    但是在现代公司体系下,一个互联网公司/一个软件开发团队,究竟能发挥多少民主政治,这要打一个大大的问好了

  • 巴比伦塔的失败:在神话故事中,神让人们语言不通,通天塔的建造就此失败
    在软件开发中,巴比伦塔的失败指的是团队成员之间的沟通不畅
    那如何提高沟通次数效率呢?频繁的开会未必是个好主意
    更需要的或许是精简团队人员,让整个团队保持同频

  • 银弹:银弹(Silver Bullet)是由国外的人狼民间传说翻译而来
    在故事中,人狼是个能从熟悉的面孔变成可怕怪物的东西,为了对付人狼,要寻找能消灭它们的银弹
    银弹的本质就是解决某一个问题的方法,在中文语境下,可以理解为“灵丹妙药”、“尚方宝剑”或是“万精油”,但是不能等同
    任何一个软件项目中几乎都存在人狼,比如对开发人员的技术高估,对项目的复杂度低估,预算的不充足等等
    在这种情况下,开发人员迫切的渴求银弹,能解决这些问题,但是现实就是“没有银弹”

  • 没有银弹:在书中,作者断言软件行业至少十年内不可能出现一种技术或是方法能大幅提升生产效率,简称“没有银弹”
    这一说法首先要从软件的本质说起,首先软件本身就存在复杂度,可以分为本质复杂度和附加复杂度
    本质复杂度指的是把现实世界的事物抽象成软件、编程语言的复杂程度
    附加复杂度是指方法、工具和编程语言的落后等等带来的复杂度
    从软件工程发展至今,从汇编,到c语言,再到面对对象和各种框架
    人们用诸如oop、设计模式、敏捷开发等方法来降低复杂度
    但究其根本,降低的都是附件复杂度,软件的本质复杂度始终没有改变,银弹始终没有找到
    显然现代软件工程面临的问题是如何找到降低本质复杂度的方法
    但最有可能的结果是,世界上根本不存在这样的方法,现实本身就是没有银弹


3. 总结

软件工程背后的社会学原理着实丰富,以目前笔者的经历与见识,可以说是管中窥豹

希望未来的某一天,当笔者能真正在一个软件项目团队独当一面时,能回想起人月神话中的道理