《人月神话》读书笔记

前言

《人月神话》是一本永不过时的经典,尽管写在四十多年前,然而书中的观点和方法论,放到如今的软件开发中仍然适用,甚至有一些可以作为今后软件开发的指导。笔者拜读完《人月神话》这本软件开发届的神品之作,不禁感慨其思想博大精深,字字真言,精读之有不尽的趣味,因此作读书笔记一篇,记录引起笔者共鸣的佳句与笔者的思考。


焦油坑

编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐
首先,这种快乐是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到快乐一样,成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种呈现在每片独特的、崭新的树叶和雪花上的喜悦。
......
编程的快乐在于它不仅满足了我们内心对于创造的渴望,而且还唤醒了每个人内心的情感。

相信绝大多数同学在高考结束后,填报志愿时都有纠结过专业的选择。今后要做什么工作,从事什么行业,笔者在茫茫专业中选择了软件工程,当时觉得软件开发是一件相当具有创造性的活动,能够通过编程把脑海中的想法加以实现,能够通过编程解决生活中的实际问题,能够通过编程完善一些APP的功能......

经过大学期间紧凑的软件开发技术训练,以及课外项目实践,笔者编程能力和软件开发能力有了一定的提升,而自己对软件开发的乐趣也发生了一些变化,不再满足于单纯的创造带给笔者的乐趣,屏幕上输出的“Hello, world!”已经不能让笔者眼前一亮,而是追求将高复杂度的模块组件拼装在一起,形成完整的系统。例如在某次课程作业中,为了满足多种非功能需求,需要对整体系统进行详细的架构设计,并应用多种未接触过的技术和框架,尽管开发过程充满了挑战,bug频出,接口易变,但是在克服完重重障碍后,得到一个高可用、高性能的完整系统,完成时的成就感是无可比拟的。

本科毕业阶段,笔者以实习生的身份加入到腾讯公司,参加企业级别的真实系统开发,体验到真实生产环境与学校内实验环境的巨大差别,企业团队的规模往往比学校课程作业团队的规模大的多,10-15人的规模较为常见,这种情况下进行软件开发的流程与小规模团队大相径庭,首先团队需要频繁的进行会议交流,确定开发进度、商讨下阶段开发计划、解决问题冲突等等,因此分配给系统计划和设计的时间大大增加了,此外还需要协同编写各种文档和说明,用于规范需求、架构、接口等,虽然系统开发的复杂度高出了几个数量级,但是规范化后的团队合作给笔者带来了莫大的乐趣,团队中每个人都在制作零件,并根据严谨的接口定义,将这些零件有效地啮合在一起,所有的零件都以精妙的方式运行着,构成了企业级的真实系统,这种高度规范化的团队合作使笔者乐在其中。


人月神话

所有的编程人员都是乐观主义者: "一切都将运行良好"。
由于编程人员通过纯粹的思维活动来开发,我们期待在实现过程中不会遇到困难,但是我们的构思本身是有缺陷的,因此总会有bug。

对于编程人员的乐观主义,笔者深有体会。在完成课程作业时,经常会出现这么一个现象: 在只有大体思路,而没有做出清晰详细的设计方案时,就开始盲目的编程,写一段看一段,再进行大量的调试,得到最终方案,然而耗费的时间总是远远超过预计。因此笔者认为,不论是设计课程作业这种规模较小的程序,还是参与企业级开发的大规模程序,编程前的精细设计都是必须的,并且需要摒弃"一切都将运行良好"这种过于乐观的观念,并为编程后的测试工作预留充足的时间,不论是单元测试、集成测试还是系统测试。


贯彻执行

手册或者是书面规格说明,是一个非常必要的工具,仅有文档是不够的。手册是产品的外部规格说明,它描述和规定了用户所见的每一个细节;同样地,它也是结构师主要的工作产物。
修改的阶段话是很重要的 -- 在进度表上应该有带日期的版本信息。
手册的作者必须注意到自己的思路和语言,达到所需要的精确程度。

实习期间,编写文档和手册的时间不亚于编写代码的时间。不同开发阶段,不同职责的开发人员需要编写不同的文档手册,并作为团队开发的标准。笔者作为基础的编程开发成员,参与了下表中的 3. 和 4. 文档手册的编写,在需要与他人模块交互时,可以通过文档手册快速明确交互的方法和各种条件。

  1. 产品经理制订出需求文档
  2. 开发组长(1-2人)制作体系架构文档,UI设计组制作原型
  3. 系统详细设计,确定模块功能,进行接口定义,形成详细设计文档
  4. 实际开发过程中,编程人员制作功能说明概要设计,详细定义接口,例如接口输入和输出的格式和边界条件、各种异常处理、各种情况的测试用例等
  5. 开发完成,测试组制定测试流程,生成测试报告和文档
  6. 所有的文档更新时,都需要明确标注,进行版本控制,版本兼容等

未雨绸缪

唯一不变的就是变化本身
为变更设计系统,为变更计划组织架构
软件维护主要包含对设计缺陷的修复,软件变更通常包含了更多的新增功能

软件发布的越久,用户越多,用户提出的新需求也就更多,因此系统应当具备易拓展的特性。因此,在初始设计整个系统时,就应当把易扩展列入考虑范围内。

  1. 体系架构设计,比如设计网站架构时,针对100人同时在线的网站,可能无法处理10000人同时在线访问,那设计时应当如何进行负载均衡和集群设计
  2. 数据访问设计,当前的数据库可以做到读取KB-MB级别的数据,用户多了数据也多了,如何快速扩展成可以处理PB级别的数据
  3. 模块设计,Release Reuse Equivalency Principle (重用发布等价原则)和The Common ClosurePrinciple(共同封闭原则)作为面向对象开发中模块开发的重要原则,可以有效地将包组织成易扩展的形式
  4. 类设计,Single Responsibility Principle(单一职责原则)和The Open-Closed Principle (开闭原则)作为面向对象开发中类开发的重要原则,可以有效地将代码组织成易扩展的形式

没有银弹

人工智能AI-2:使用启发式或基于规则的特定编程技术。在这种方法中,对人类专家进行了研究,判断他们解决方法的启发性思维或者经验法则,程序被设计成以人类解决问题的方式来运行......

专家系统是人工智能领域最先进的、被最广泛使用的部分,是包含归纳推纳引擎和规则基础的程序,它接收输入数据和假设条件,通过从基础规则推导逻辑结果,提出结论和建议。

人工智能领域近几年又重回人们的视角,人工智能里许多方法的确能很大程度的提升软件开发的效率,然而其是否能够泛化成一套解决软件开发问题的系统,还值得商榷。不过机器学习中,不少算法正朝着人工智能AI-2中的定义发展,笔者认为最具特色的是Neural Networks(神经网络),神经网络模仿了人类大脑的神经元的工作方式,以人类解决问题的方式来处理各种复杂的非线性问题。

基于最初始的ANN,机器学习领域的研究者们不断优化神经网络,开发了卷积神经网络(CNN)、循环神经网络(RNN)、R-CNN等一些高级的深度学习模型,并且可以运用于计算机视觉、自然语言处理等等领域中,目前还有很大的提升空间,即使人工智能不能成为解决软件开发问题的银弹,但其在提升效率方面做出了很大贡献,值得我们在这方面继续深入。


总结

《人月神话》涉及广泛,笔者只摘取了某些章节中引起共鸣的语句,实在是一本值得不断回味的经典之作。

你可能感兴趣的:(《人月神话》读书笔记)