《人月神话》读毕。十年前,我在读本科,当时看完后印象不深。现在有了一定工作经验后,读起来颇多共鸣与收获。
软件开发是个大坑
软件开发的乐趣在于:
1. 以上帝视角创造一个事物
2. 做出对他人有用的东西
3. 用零部件组装出一个能够运行的系统
4. 持续学习
5. 程序很灵活。基于纯粹的思考,可以轻松地做各种实验。
软件开发的痛苦在于:
1. 必须完美。计算机难以成容错。代码中很小的错误,就能造成很大的问题。
2. 由他人设定目标,工作严重依赖于他人的资源,信息,以及成果。
3. 修改bug枯燥而耗时,而且修复bug会导致新的bug,收敛过程很长。
4.开发时间有限。如果太慢,那么产品完成后就已经过时。
5. 软件开发人员越多,沟通和学习时间就越长,出错概率也越大,于是平均每人的生产率就越多。
从代码到完整的产品,需要做很多工作,包括规范化,编写文档,集成测试,修改bug等等。这些工作是编写代码时间的8倍。
缺乏合理的进度安排,是项目进度落后的最主要原因,它的严重程度大于其他因素的总和。项目越晚期增加人手,项目进度就越不可控,所以要对项目进度有清醒认识,加入要趁早,最好预先算清楚。
对于项目进度规划,作者的经验法则是:
- 1/3计划
- 1/6编码
- 1/4 构件测试和早期系统测试
- 1/4 系统测试(所有的构件已完成)
经验之谈
作者提倡一个软件团队应该有一个架构师,兼任产品负责人,保证软件整体的“概念完整性”,即保证软件是一个风格一致的整体,而不是七拼八凑的混合物。这样的软件,用户容易使用,团队成员容易理解。
作者告诫架构师不要过度设计,添加过多不必要的功能,增加软件复杂度,增加项目严重延期的风险。
作者强调文档很重要,测试很重要,需要尽早开始,做到极致。
作者认为,软件的数据结构比流程更重要。根据清晰的数据结构,很容易推导出程序流程。
软件开发中,唯一不变的就是变。软件结构越复杂,修改风险越大。
软件变更应当一步一个脚印,某次增加少量功能,并且充分测试。跟现在的敏捷开发思想类似。
软件开发应当规划尽量多的,明确定义的里程碑,这样项目成员随时能了解项目进度,尽力避免延期。
没有银弹
软件开发工作分为两部分:
- 根本任务:设计软件复杂的概念结构。
- 次要任务:写代码。
作者提出,由于次要任务只占软件开发中1/9到1/6的时间,而各种编程语言,软件管理方法,主要提供次要任务的效率;因此软件开发效率在十年内无法得到数量级的提升。
作者的观点基本正确,只有一点错了:现在软件框架,可复用组件比当时增加许多,云计算也蓬勃发展,所以我们开发软件时,很多设计工作和代码开发工作都可以省略。现在开发一些常见的软件,效率已经大幅提升。
作者提出改善软件开发效率的方法有:
1. 快速创建原型,及时确认需求细节,避免返工
2. 逐渐迭代版本,不憋大招
3. 招聘和培养杰出的设计人员,人才比工具,流程重要得多。