这是近期我阅读的第二本关于软件工程的书籍,第一本是《构建之法》;虽然两本书都是关于软件工程方面,但各有侧重。《构建之法》一定程度是为了解决老师在具体教授知识上的一些难点和问题,所以在软件工程中的各个领域如构建、开发、测试、项目管理 都有具体的探讨和对应的实践,侧重于术; 《人月神话》的中心论点是在大型编程项目中,由于人员的分工和软件固有的内在困难,在十年内无法是生产率、可靠性、简洁性 取得数量级上的进步,侧重于道。
从学习的递进层次关系来看,应该先懂「道」,再学习「术」,这样才能够获得更深的认识。不过对于高难度学科的学习过程而言,我们更倾向于先学习术,在实践的同时不断强化,逐步获得更深的理解,最终在脑海中形成全面的「系统」。所以要想学会一门技术或技能,最好的方法就是马上开始行动,并且坚持「做中学」。
接下来我将根据自己的理解把整本书的框架梳理出来,受限于自身的能力,不免会这样或那样的不足,欢迎批评和建议。
名词解释
「银弹」: 银色子弹,在欧洲民间传说及19世纪以来哥特小说风潮的影响下,银色子弹往往被描绘成具有驱魔功效的武器,是针对狼人等超自然怪物的特效武器。后来也被比喻为具有极端有效性的解决方法,作为杀手锏、最强杀招、王牌等的代称。
文中的「没有银弹」:没有任何技术或管理上的进展, 能够独立地许诺十年内使软件系统项目生产率、 可靠性或简洁性获得数量级上的进步。
1. 现象
软件系统项目中的「焦油坑」:表面上看起来好像没有任何一个单独的问题会导致困难, 每个都能被解决, 但是当它们相互纠缠和累积在一起的时候, 团队的行动就会变得越来越慢。 对问题的麻烦程度, 每个人似乎都会感到惊讶, 并且很难看清问题的本质。 最终导致项目进度严重滞后或者干脆以失败而告终。
2. 原因
- 缺乏合理的时间进度是主要原因,它比其他所有因素加起来的影响都还大。
- 对进度缺少跟踪和监督(如何进行跟踪和监督??)。其他工程领域中,经过验证的跟踪技术和常规监督程序,在软件工程中常常被认为是无谓的举动。
- 意识到进度偏移时,固有(传统)的反应是增加人力。这就像使用汽油灭火一样, 只会使事情更糟。 越来越大的火势需要更多的油, 从而进入了一场注定会导致灾难的循环。
- 传统团队(按任务分解)的结构组成无法保证系统「概念的完整性」
- 软件的系统内在(根本)困难:复杂性、一致性、可变性和不可见性。
- 软件的次要困难: 不能相对较容易地使用编程语言表达这些抽象实体, 在空间和时间限制内将它们映射成机器语言。
3. 现行的解决办法
- 定义清晰、具体、可度量的项目里程碑;制定合理的时间进度表,并及时更新修正。
- 大型项目的每一个部分由一个团队解决,但是该队伍以类似外科手术的方式建立,而并非一拥而上。也就是说, 同每个成员截取问题某个部分的做法相反, 由一个人来进行问题的分解, 其他人给予他所需要的支持,以提高效率和生产力。具体成员的职责见文末「《人月神话》原文摘要」
- 系统设计中,概念完整性应该是最重要的考虑因素,也就是说由团队中的外科医生或者非常少数互有默契的人员来实现。 这可以一定程度上尽量规避问题的出现。
- 保证交流和交流的结果--组织
- 必备的文档手册和更新机制
- 各种形式的会议
- 工具的合理利用,包括「高级语言」和「交互式编程」。
- 建立软件系统开发中的「实验性工厂」:化学工程师很早就认识到, 在实验室可以进行的反应过程, 并不能在工厂中一步实现。一个被称为“实验性工厂”的中间步骤是非常必要的,它会为提高产量和在缺乏保护的环境下运作提供宝贵经验。
4. 结论
-
「没有银弹」:没有任何技术或管理上的进展, 能够独立地许诺十年内使软件系统项目生产率、 可靠性或简洁性获得数量级上的进步。
-
软件工程的焦油坑在将来很长一段时间内会继续地使人们举步维艰,无法自拔。只能期待人们在力所能及的或者刚刚超越力所能及的范围内进行探索和尝试。这个复杂的行业需要: 进行持续的发展; 学习使用更大的要素来开发; 新工具的最佳使用; 经论证的管理方法的最佳应用; 良好判断的自由发挥; 以及能够使我们认识到自己不足和容易犯错的——上帝所赐予的谦卑。
作为软件行业从业者中的一员,更准确的说是作为一名开发人员,我们需要学习的不仅仅是学习开发相关的技术,更需要全面性的去了解和学习软件工程,这将有助于我们建立全面系统的认知。在工作过程中也应该时刻注意到焦油坑带来的束缚,去思考未来软件工程的更多可能的出路。
还有一点必须承认,由于受限于自身的经验不足,以及本书部分翻译上的生硬,有一部分的内容我并不能完全理解。不过庆幸的是即便如此书中的观点已然给予我关于软件工程更宏观的认识,在以后的工作学习中必然对我有所裨益,我有理由相信随着自身能力和各方面经验的积累,我将获得更深层次的认知。
附:
网友评论