【阅读笔记】《人月神话》思想提炼

news2024/10/6 12:32:13

文章目录

    • 前言
    • 1. 衡量工作量
      • 1.1. 单位
      • 1.2. 工作量与人月(人天)的关系
        • 1.2.1 忽略了沟通成本
        • 1.2.2 忽略了需求的特征
    • 2. 外科手术团队 —— 少部分人主导项目
      • 2.1. 执行方式
      • 2.2. 遵守的理念
    • 3. 警惕“遗留需求”
    • 4. 管理进度
      • 4.1 不要泄气
      • 4.2. 设定合适的里程碑并记录完成过程
    • 5. 怎么写文档 P169
      • 5.1. 怎么对待流程图
      • 5.2. 自文档化的程序
    • 6. 没有银弹 —— 软件开发的核心困难
    • 7. 软件开发次要困难的解决方案(已知的)
    • 后记

前言

由于《代码大全2》好几处引用了 《人月神话》的的内容,遂周末把《人月神话》看完了。总的来说,这本书更适合有管理经验的人阅读。目前我还处于开发人员的角色,学习软件工程为初衷,保持一个学习的心态总结本书有趣的思想。值得一提的是,这本书要完完整整的看完,后续的章节会对前面的章节进行补充。不进行章节的重写而是通过补充的手法,猜测其背后的原因是保留了那个年代的上下文语境。

1. 衡量工作量

1.1. 单位

“人月” —— Man Month
衡量工作量的单位,表示一个功能由一个人开发需要多少个月。

1.2. 工作量与人月(人天)的关系

管理层需要一个宏观数据,如果一个功能要超过半年才能进行业务验证,一定是不能接受的。那么往往考虑的是“加人”解决。
《人月神话》认为以“加人”为导向的缩短工期方法,是不可行的,是一种神话(点题了书名)。主要论据是:

1.2.1 忽略了沟通成本

  • 把工作量与人月等价互换,会忽略人与人的沟通成本,导致预估不准
    等价互换,是一种过于美好的假设。它假设人与人之间是不需要沟通交流的,而现实世界是,两人及以上的协作需要对齐很多概念、需要调和可能出现的编码风格、需要在任务量上面进行扯皮。同样的,团队间的合作如是。

    P80: “如果项目有n个工作人员,则有(n^2 - n) / 2 个相互交流的接口,有将近2n个必须合作的潜在团队”

1.2.2 忽略了需求的特征

需求如果是不易拆分的,由多个人进行协作,会产生大量的重复劳动。特别是对需要短时间的攻坚战,更不应该加人手。如两周的任务拆给4个人,需要3天完成。4个人都在第1天完成了需求理解,本质上是进行了4次重复劳动,浪费掉了3天。

2. 外科手术团队 —— 少部分人主导项目

主刀医生是经验最丰富的,接着是副手。

2.1. 执行方式

  • 1 / 7 左右的人充当关键 (1个主刀医生 + n副手) 角色
  • 关键角色对产品的概念完整性负责
  • 其他角色负责遵守概念并将需求落地

2.2. 遵守的理念

  • 个体差异可能是指数级的

    只有少部分人能成为主刀医生,同样年限的医生工作效率也截然不同。

  • 提高效率

    文档的简洁能为程序员减少学习、记忆、搜索成本。许多需求,往往是若干个简洁的表述进行组合 。所以提高整体开发效率,主旨就是让表述更加简洁。简洁和直白来自于概念完整性

  • 必须将需求与实现区分出来

    需求是用来代表用户的核心利益。如果规定了如何实现,等同于扼杀了工程师的创造力。

  • 不需要为独裁而惭愧

    少部分人负责概念的完整性,是因为这部分人才的流动性没有实施人员大,且有更丰富的经验,决策不用下沉至其他人,也避免了大量的沟通成本。

  • 概念未完整的时候,不要动手编码
    《人月神话》自述,不同的程序员对需求有不同的理解,编码上自然难以统一,后期的调试和修改至少多花了一年时间。

3. 警惕“遗留需求”

开发第一个系统时,产品经理力求简练,一定会剔除掉某些功能。等第一版本上线后,又极其期待被砍掉的功能补充上。但是这是危险的。

  • 做第一个系统时候特有的素质
    对正在进行的任务不够了解,所以会谨慎、仔细的工作。第二版本则不太拘谨了
  • 如何决策
    第二版本中是否要实现遗留需求,需要由 至少两名,有系统二次开发经验的产品经理 决策

4. 管理进度

4.1 不要泄气

程序员延期后,会产生“其他的部分反正会落后”的想法,实则从整体项目来看是不一定的。项目中的任务进度推进是一个网状的关系,只要延期的事项不在“关键路径”上,依旧能保证整体按期交付。所以不要泄气,专注于眼前的任务,解决它。
目前待过的公司都没用上关键路径来管理项目,曾经理论学习过,写过一篇博客 。

4.2. 设定合适的里程碑并记录完成过程

  • 里程碑一定要具体

    设定具体的指标,好处是避免汇报扯皮

  • 记录完成过程有利于决策下一个里程碑的内容

5. 怎么写文档 P169

不同的用户需要的文档详细程度不同,具体的内容书中已经总结的很好了。

5.1. 怎么对待流程图

“逐一记录的详细流程图过时而令人生厌,它只适合启蒙初学者的算法思维”
我十分赞同这句话,流程图一般是用于理解代码用的,自己写的代码往往不需要先生成流程图。
有一个例外,我认为ER图、时序图 还是很好用的,并且是足够简单的时序图。在评审环节可以让评审人更直观的了解程序交互的系统、角色。在代码完成后绘制时序图曾让我看出代码质量不好的地方,并以出现简洁时序图为宗旨,最后把代码改造的更加可读。

5.2. 自文档化的程序

原则是代码的说明最后跟代码放在一起。所以有了 self-documenting 的说法。

  • 规范
    JavaDoc
  • 语言
    XML、Groovy DSL 本身就具有较高的可读性

6. 没有银弹 —— 软件开发的核心困难

“比起对概念进行表达和对实现逼真程度进行验证,以下的事项更为困难”

  • 规格说明
  • 设计
  • 测试

现代软件系统无法规避的内在特性

  • 复杂度
    数学家和物理学家为复杂的现象建立简化的模型,从而论证特性。但是这一套方法在软件开发中行不通,软件系统
    中的多种状态、语言特性、依赖的环境特性等因素都是构成软件复杂度的重要因素,无一可以被剥离出去。

  • 一致性
    软件开发的目标之一是兼容性,如果要保持兼容性,代码上就要做大量的妥协。对软件的任何再设计,都无法简化这些复杂性

  • 可变性
    需求变了、实现也一定变。这跟建筑工程完全不同。软件工程会遭受持续变更的压力

  • 不可见性
    硬件有电路图,但是试图用图形来描述软件时,发现它是有很多互相关联、重叠在一起的图形。

7. 软件开发次要困难的解决方案(已知的)

  • 高级语言

  • 分时
    这个指为不同的团队设定共享资源的使用时间段,减少硬件资源竞争带来的部署缓慢、不稳定。

  • 面向对象编程
    本质上是 “信息隐藏”。采用良好的接口封装、利用继承来表达层次关系、而不用交代实现,尽可能避免原来过程化编程曲解他人代码而造成的bug

  • 需求精炼和快速原型
    敏捷开发、极限编程。旨在把跟用户的沟通频率提高。

  • 增量开发
    小步快走,能提高正反馈。小版本之间构成产品族树,以最低限度控制版本失败的成本(可以按照树回溯到上个版本)
    在这里插入图片描述

后记

《人月神话》一定要全部看完。主要是因为这本书的编排方式,后文会对前文进行补充,甚至是否定。比如 P176 的内容 关于信息隐藏,Parnas 是正确的,我是错误的。 如果看完书抓不住重点,P339 开始的内容会帮助我们找到重点,可以回头再看看相关内容。这本书的内容应该作为“课外读物”,提炼出思想是为了更好的理解管理工作以及看看大佬的眼界。看完这本书对软件工程更加敬畏了,保持谦虚,一路学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目_第170期ssm二手手机回收平台系统_ssm毕业设计_计算机毕业设计

java项目-第170期ssm二手手机回收平台系统-ssm毕业设计_计算机毕业设计 【源码请到下载专栏下载】 今天分享的项目是《ssm二手手机回收平台系统》 该项目分为2个角色,管理员和用户。 用户可以浏览前台,包含功能有: 首页、手机商城、新闻资讯、跳转到后台…

MRR和ICP

MRR和ICPMulti-Range Read优化ICP索引下推优化Multi-Range Read优化 MySQL5.6版本开始支持Multi-Range Read(MRR)优化。Multi-Range Read优化的目的就是为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,这对于IO…

每天进步一点点 -- pytorch学习:张量的介绍与创建

推荐查看的文档:机器视觉全栈|机器视觉教程|docsify|pytorch官方教程中文版|opencv-python官方教程中文版|open3D(0.15.1)官方教程中文版 Tensors个人理解为在GPU上工作的数组和矩阵,既然是数组和矩阵,那么里面也保存一些类型的内容&#xf…

圣天诺加密狗(HASP)破解

圣天诺加密狗&#xff08;HASP&#xff09;破解 一、编写测试程序 dll代码&#xff1a; #include "pch.h" #include<stdlib.h> BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case D…

[附源码]计算机毕业设计和vue的茶文化交流平台的设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

SVG 实现拟物态圆环进度条

前言 &#x1f44f;SVG 实现拟物态圆环进度条&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义一个圆角矩形作为父容器&#xff0c;背景色为–bg --bg: #edf1f5;<div class"container">&l…

lunar.js 基本使用学习笔记

文章目录lunar 基本使用学习笔记介绍基本使用部分文档 API 转载阳历相关的方法 APISolar 阳历阳历实例化阳历对象可以使用多种字符串输出方式&#xff1a;获取年、月、日儒略日获取星期判断是否闰年获取节日星座阳历日期推移&#xff08;可**跳过节假日、周六周日**&#xff09…

[附源码]Nodejs计算机毕业设计基于Java的医院预约挂号系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

SpringMVC的传参方式?

Request参数传递 1. Servlet传统API 2. Map/Model/ModelMap 作用域&#xff1a;request Map 是原生态的JDK类 Model/ModelMap 是Spring的类 除了来源不同&#xff0c;传递参数的功能都一致&#xff0c;用哪个都可以 Session参数传递 1. 传统方法HttpServletSession 2. …

[附源码]计算机毕业设计工程施工多层级管理架构Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python列表(list)原址反序的4种方法

Python列表(list)原址反序的方法 (本文获得CSDN质量评分【x】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 自学并不是什么神秘的东西&a…

利用图文和代码深度解析操作系统OS内存泄漏检测实现原理与算法机制以及常见的泄露原因和解决方案

利用图文和代码深度解析操作系统OS内存泄漏检测实现原理与算法机制以及常见的泄露原因和解决方案。 计算机科学中,内存泄漏是一种资源泄漏。发生这种情况时,不再需要的内存未被释放,计算机程序以错误的方式管理内存分配。当对象存储在内存中但不能被运行代码无法访问时,也…

[附源码]Python计算机毕业设计殡仪馆管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

mha

MySQL MHA 报错处理 ​​​​​​- 走看看安装环境&#xff1a;CentOS 6.5 MySQL 5.7.22 MHA 0.56 1、找不到mysql 命令 Sat Mar 23 07:17:50 2019 - [info] Connecting tohttp://t.zoukankan.com/102x-p-10583959.html 实验 详解MHA搭建过程中的遇到的各种问题_时代广场的蟋蟀…

竞赛题-6257. 删除每行中的最大值

题目&#xff1a; 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其中任何一个。将删除元素中的最大值与答案相加。 注意 每…

[附源码]Python计算机毕业设计大型零售电商平台——购物车管理子系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

[附源码]Python计算机毕业设计SSM基于的砂石矿山管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[Linux学习笔记] 浅谈信号(文章含不少学习资源)

百金买骏马,千金买美人,万金买爵禄,何处买青春? 目录 信号的概念 信号的种类: kill -l 命令可以查看信号列表 man 7 signal 查看信号详细内容 信号的产生 补充知识 Core Dump(转储内存) 补充知识:与信号相关的数据结构 对于不可靠信号 接收信号 信号的处理: 阻塞信号集: 未决信…

qt之QCustomPlot动态更改曲线数量,单光标查看数值,选中曲线单独显示查看趋势

一、前言 本博客介绍如何由浅入深的使用一些qcustomplot的用法&#xff0c;对于开源的qcustomplot来说&#xff0c;功能实在实在是太强大了&#xff0c;如果只用于显示简单的曲线真是太浪费前人的心血了&#xff0c;本文就来介绍一些好玩的用法&#xff0c;可以实现的功能有&am…

基于javaweb的学籍管理系统计算机专业毕业论文java毕业设计开题报告

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之基于javaweb的学籍管理系统-IT实战营_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzy…