焦油坑(The Tar Pit)

  • 如果我们想解决问题,就必须试图先去理解他们。
  • 编程系统产品的演进?
  • 编程的乐趣(编程非常有趣,它不仅满足了我们内心深处进行创造的渴望,而且还愉悦了每个人内在的感情)
    • 创造事物的快乐;
    • 开发对其他人有用的东西;
    • 将相互啮合的零部件组装在一起,看到它们精妙地运行,得到预先期望的结果;
    • 不断地学习新的事物(实践、理论);
    • 工作在非常易于驾驭的介质上;
  • 编程的苦恼
    • 必须追求完美;
    • 个人的权威和他所承担的责任不匹配(由别人设定目标、提供资源、提供信息);
    • 依赖其他人的程序;
    • 调试程序、修复bug;
    • 产品在即将完成或终于完成时,却已经显得陈旧或过时;

人月神话(The Mythical Man-Month)

  • 创造性活动分为三个阶段:构思、实现、交流(From 《The Mind of the Maker》);
  • 向进度落后的项目中增加人手,只会使进度更加落后;

外科手术队伍(The Surgical Team)

  • 最好的程序员和最差的程序员在生产率上的差距能够达到数量居水平;
  • 对于效率和概念完整性来说,最好由少数干练的人员来设计和开发;而对于大型系统,则要求大量的人手,以使产品能在时间上满足要求;

贵族专制、民主政治和系统设计(Aristocracy,Democracy,and System Design)

  • 概念完整性应该是最重要的考虑因素。 为了反映一系列连贯的设计思路,宁可省略一些不规则的特性和改进,也不提倡独立和无法整合的系统,哪怕他们其实包含着许多很好的设计。
  • 易用性。易用性实际上需要设计的一致性和概念上的完整性。
  • 概念的完整性要求设计必须由一个人,或者非常少数互有默契的人员来实现。
  • 产品的成本性能比很大程序上依靠实现人员,就如同易用性很大程度上依赖结构师一样。
  • 外部的体系结构规定实际上是增强,而不是限制实现小组的创造性。 一旦他们将注意力集中在没有人解决过的问题上,创意就开始奔涌而出。
  • 开发人员在等待时可以做什么?(时机:只要有一些最终将并入外部说明的系统功能雏形,开发人员就可以开始工作了)
    • 设定良好定义的时间和空间目标,了解产品运行的平台配置;
    • 设计模块的边界、表结构、算法以及涉及的工具;
    • 花一些时间和系统结构师沟通;

画蛇添足(The Second-System Effect)

  • 架构师负责的第二个系统,往往会存在一些冗余或者不必要的功能;

贯彻执行(Passing the World)

  • 系统结构设计人员必须为自己描述的任何特性准备一种实现方法,但是他们不应该试图支配具体的实现过程;
  • 软件使用手册的表现形式: 形式化定义、记叙性定义?
  • 形式化定义可以是一种设计实现,反之,设计实现也可以作为一种形式化定义的方法;

  使用实现来作为一种定义的方式有一些有点。所有问题可以通过实验清晰地得到答案,从来不需要争辩和商讨,回答是快捷迅速的。

  通过定义得出的答案,总是痛所要求的一样精确和正确。

  • 周例会 + 年例会。年例会用来解决周例会遗留、堆积的问题;
  • 当软件功能存在多重实现时,需要严格地遵守手册的约束(相当于同一接口);
  • 产品是必要的,并且需要很好的独立性?

为什么巴比伦塔会失败(Why Did the Tower of Babel Fail)

  • 交流和交流的结果——组织(?)是成功得关键;
  • 交流非常重要。缺乏交流导致了争辩、沮丧和群体猜忌。很快,部落开始分裂——大家选择了孤立,而不是互相争吵;
  • 团队结构(树状结构有利于减少交流成本)
    • 产品负责人
    • 技术主管(攻坚小组中的独行侠),负责的工作几乎完全是技术性的;
    • 交流和组织的技能需要管理者仔细考虑,相关经验的积累和能力的提高同软件技术本身一样重要;

胸有成竹(Calling the Shot)

  • 实践是最好的老师,但是如果不能从中学习,再多的实践也没有用;
  • 对常用的编程语句而言,生产率似乎是固定的,这个固定的生产率包括了编程中需要注释,并可能存在错误的情况;
  • 使用适当的高级语言,编程的生产率可以提高倍;

削足适履(Ten Pounds in a Five-Pound Sack)

  • 同任何开销一样,规模本身不是坏事,但不必要的规模是不可取的;
  • 和制订驻留空间预算一样,应该制订总体规模的预算;和制订规模预算一样,应该制订后台存储访问的预算;
  • 在指明模块有多大的同时,确切定义模块的功能;
  • 项目规模本身很大,缺乏管理和沟通,以至于每个团队成员认为自己是争取小红花的小学生,而不是构建系统软件产品的人员;
  • 软件编程管理人员最重要的职能:为开发人员培养从系统整体出发、面向用户的态度;
  • 空间技能:
    • 用功能交换空间(裁剪程序功能);
    • 空间-时间折衷;
    • 开发公共单元构件库(对每项功能,库应该至少提供两个实现:运行速度较快的 和 短小精炼的);
  • 数据的表现形式是编程的根本?

提纲掣领(The Documentary Hypothesis)

  • 任何管理任务的焦点都是时间、地点、人物、做什么、资金;
  • 项目文档内容:目标、产品说明、时间安排、资金分配、空间分派和人员划分;

未雨绸缪(Plan to Throw One Away)

  • 永远不变的是变化本身;
  • It is common sense to take a method and try it. If it fails, admit it frankly and try another. But above all, try something.
  • 实验性工厂和增大规模(为舍弃而计划)?
  • **开发人员交付的是用户的满意程度,而不仅仅是实际的产品。**用户的实际需要和用户感觉会随着程序的构建、测试和使用而变化;
  • 为变更计划系统——将变更阶段化(设置软件版本,每个版本都应该有自己的日程表和冻结日期,在此之后的变更属于下一个版本的范畴)。
  • 系统软件的开发是熵减的过程,所以它本身是处于亚稳态的。软件维护是熵增的过程,即使是最熟练的软件维护工作,也只是放缓了系统退化到非稳态的进程。

干将莫邪(Sharp Tools)

  • 巧匠因为他的工具而出名。
  • 高级语言交互式语言 是很重要的编程工具。

整体部分(The Whole and the Parts)

  • 我们召唤遥远的精灵;

    那又怎样,我也可以,谁都可以,问题是你真的召唤的时候,它们会来吗?

  • 好的 自顶向下设计 从几个方面不免了bug

    • 清晰的结构和表达方式更容易对需求和模块功能进行精确的描述;
    • 模块分割和模块独立性避免了系统级的bug;
    • 细节的隐藏使结构上的缺陷更加容易识别;
    • 设计在每个精化步骤的层次上是可以测试的,所以测试可以尽早开始,并且每个步骤的重点可以放在合适的级别上;
  • 结构化编程;


祸起萧墙(Hatching a Catastrophe)

  • 带来坏消息的人不受欢迎;
  • 项目是怎样延迟了整整一年的时间的?一次一天(积少成多);
  • 里程碑的选择只有一个原则:里程碑必须是具体的、特定的、可度量的事件、能够进行清晰定义;
  • 关于项目里程碑的研究结果
    • 如果在某项活动开始之前就着手估计,并且每两周进行一次仔细的修订,随着开始时间的临近,无论最后情况变得如何糟糕,它都不会有太大变化;
    • 活动期间,对于时间长短的过高估计,会随着活动的进行持续下降;
    • 过低估计在活动中不会有太大的变化,一直到计划的结束日期之前大约三周左右;
  • 好的里程碑对团队来说实际上是一项服务,可以用来向项目经理提出合理建议的一项服务,而不好的里程碑是难以处理的负担;
  • 把污垢展现在老板面前的方法
    • 减少角色冲突和鼓励状态共享。老板必须区别行动信息和状态信息,他必须规范自己,不对项目经理可以解决的问题作出反应,并且决不在检查状态报告时做安排;
    • 猛地拉开地毯。不论协作与否、拥有能了解状态真相的评审机制是必要的;

另一面(The other Face)

  • 不了解,就无法真正拥有;
  • 程序的 可读性可执行性 同样重要;
  • 程序使用方法说明文档包含的内容
    1. 目的。主要目的是什么?开发程序的原因是什么?
    2. 环境。程序运行在什么样的机器、硬件配置和操作系统上?
    3. 范围。输入的有效范围是什么?允许显示的合法范围是什么?
    4. 实现功能和使用的算法。精确地阐述它做了什么。
    5. 输入-输出格式。必须是确切和完整的。
    6. 操作指令。包括控制台及输出内容中正常和异常结束的行为。
    7. 选项。用户的功能选项有哪些?如何在选项之间进行挑选?
    8. 运行时间。在指定配置下,解决特性规模问题所需要的时间。
    9. 精度和校验。期望结果的精确程度?如何进行精度的检测?
  • 程序自文档化(参考 《Clean Code》);

没有银弹——软件工程中的根本和次要问题(No Silver Bullet - Essence and Accident in Software Engineering)

  • 软件活动的任务

    • 根本任务——打造由抽象软件实体构成的复杂概念结构;
    • 次要任务——使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言;
  • 软件的内在特性(根本困难):复杂度、一致性、可变性、不可见性;
  • 软件领域中最富有成效的三次进步:高级语言、分时、统一编程环境;
  • 面向对象的两个概念:
    • 抽象数据类型——是指对象类型应该通过一个名称、一系列合适的值操作来定义,而不是数据结构;
    • 层次化类型(类)——允许定义可以被后续子类型精化的通用接口;
  • 增量式开发;
  • 软件行业的核心——人员(卓越设计人员)
  • 软件开发是一个创造性的过程。完备的方法学可以培养和释放创造性的思维,但它无法孕育或激发创造性的过程?
  • 非常卓越的设计者产生的成果更快、更小、更简单、更优雅,实现的代价更少;
  • 如何培养出杰出的设计人员
    • 尽可能早地、有系统地识别顶级的设计人员。最好的通常不是那些最有经验的人员;
    • 为设计人员指派一位职业导师,负责他们技术方面的成长,仔细地为他们规划职业生涯;
    • 为每个方面制订和维护一份职业计划,包括与设计大师经过仔细挑选的学习过程、正式的高级教育和短期课程;
    • 为成长中的设计人员提供相互交流和学习的会;

再论《没有银弹》(“No Silver Bullet” Refired)

  • 那些想看到完美方案的人,其实心底里就认为它们以前不存在,以后也不会出现;
  • 乐观主义是里程碑的职业病;
  • 解决软件构建根本困难的最佳方法是不进行任何开发(复用代码,而不是新开发代码);
  • 面向对象技术最吸引人的地方
    • 类容易复用;
    • 可以通过集成方便地定制;

20年后的人月神话(The Mythical Man-Month after 20 Years)

  • 只能根据过去判断将来;
  • 永远无法根据过去规划将来;
  • 核心观点:概念完整性和架构师的重要性;
  • 开发第二个系统所引起的后果:盲目的功能和凭空猜测;
  • 用户群的属性
    • 他们是谁?
    • 他们需要什么?
    • 他们认为自己需要什么?
    • 他们想要的是什么?
  • 没有构建舍弃原型——瀑布模型是错的?
  • 人就是一切;
  • 对于每项社会活动,就其本质而言,应该配备对社会个体成员的帮助,而不是去破坏和吸收它们;
  • 附属职能行使原理? 如果较低级别组织的自由和责任得以保留,中心权威实际上是得到了加强;

《人月神话》学习笔记相关推荐

  1. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  2. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

  3. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  4. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  5. 第一行代码学习笔记第三章——UI开发的点点滴滴

    知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...

  6. 第一行代码学习笔记第十章——探究服务

    知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...

  7. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  8. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  9. 第一行代码学习笔记第九章——使用网络技术

    知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...

  10. 安卓教程----第一行代码学习笔记

    安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...

最新文章

  1. “;“分号空语句的使用
  2. Leetcode 144. 二叉树的前序遍历 (每日一题 20210820)
  3. HTTP_响应消息_响应行_状态码
  4. linux 查看下挂磁盘,linux下磁盘挂载与查看
  5. 实例22:python
  6. php转化IP为整形
  7. HDOJ 1002 A + B Problem II 解题报告
  8. js ajax异步提交,jquery ajax异步提交表单数据的方法
  9. 时光机特效什么app好?建议收藏这些软件
  10. 【编程题】【Scratch四级】2022.03 早餐组合
  11. 牛顿下山法(C语言实现)
  12. HTML,img标签src路径错误及src路径图片无法显示问题,相对路径和绝对路径,超级详细的新手教程。
  13. Ubuntu Qt无法使用搜狗输入法
  14. R语言使用逻辑回归分类算法
  15. 计算机专业买什么u盘好,大容量u盘要格式化要选择哪种格式比较好用?-win7之家...
  16. 记录下安装matlab 2021a踩过的坑~
  17. Win8消费者预览版
  18. linux下hadoop集群常用命令
  19. python爬取12306实现按车次查询余票
  20. 复数的物理意义是什么?

热门文章

  1. WPS 表格 身份证 提取生日 判断性别 计算年龄 15位身份证与18位身份证转换 18位身份证号校验
  2. 自己用服务器搭建网盘,三步轻松搞定,还包括应用测试哦!
  3. python再计算无限循环小数的循环节
  4. movieclip_Flash脚本-在Flash中更改Movieclip的颜色
  5. Scrapy-spiders下项目运行方法
  6. 赠人玫瑰,手有余香,今日份黑科技软件五款奉上
  7. 练气第一层 踏入计算机修真界
  8. 服务器自带的ftp报错505,使用Delphi带的FTP控件删除服务器上的文件,该文件正在被使用(ASF格式影片,正在被点播)(100分)...
  9. Win7 每天定时关机
  10. 各大洲时区以及Linux环境下修改时区