前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【笔记】《人月神话》——从"削足适履"到"另外一面"

【笔记】《人月神话》——从"削足适履"到"另外一面"

作者头像
ZifengHuang
发布于 2020-07-29 08:10:13
发布于 2020-07-29 08:10:13
5700
举报
文章被收录于专栏:未竟东方白未竟东方白

这是最近看《人月神话》时中途记录的一些笔记,稍稍改变下计划,这个是9-15章节的笔记,这样后面的银弹和记录能记录得比较连贯些。

这次篇幅不长,一下就看完了。感觉应该来给文章加个好看点的模板,说不定能吸引更多人呢?这次先试着修改下常用的字体大小试试。

削足适履

  1. 应该从整体上来评价软件的规模,不应该仅仅就规模本身对软件进行批评
  2. 规模目标的设置应该是在项目经理在对每个可用方案有了深刻的了解后设定的,聪明的经理还会给自己预留一些目标以在工作进行时分配
  3. 必须对项目每个地方进行规模预算,而且要注意各个部分间规模的变化可能造成的互相影响
  4. 应该制定好整体的规模预算
  5. 应该在指明模块规模时,同时清晰指出模块的功能,防止每个人的局部优化不经意间损害了全局
  6. 即架构师应该确保开发中的概念完整性
  7. 开发不仅是做加法,适度的减法减少用户的选择可以换来更高的效率
  8. 牢记时间换空间与空间换时间,达到削足适履
  9. 要意识到在项目过程中开发公共库事半功倍

提纲挈领

  1. 软件需要的文档内容: 目标,技术说明,进度,预算,组织结构图,工作空间安排,报价预测与价格循环
  2. 其中报价预测与价格循环是决定项目成败的关键,预测决定报价,报价决定成本得到价格,价格高于预测时又需要调整预测。项目经理就如同一个调度轮稳定这个循环,经理的经验决策惯性管理着人员是否按照正确的速度执行
  1. 管理的关注点永远是时间,地点,人员,项目内容,资金
  2. 无论项目多小,都要立即生成若干小文档来作为自己进度和人员安排的数据的基础并要求其他人也给出基础小文档
  3. 最初的文档不会是正确的,需要随时改变
  4. 书面记录下决策内容和过程是必要的,记录下来才能看到分歧和矛盾
  5. 文档也是人员的交流渠道和自己的数据基础和记录列表
  6. 项目经理最基本的职责是沟通好每个人让之朝着正确的方向前进
  7. 项目经理的直接任务是制定计划并安排人去实现计划,要利用文档来辅助自己快速设定好自己的方向和与人沟通
未雨绸缪
  1. “普遍的做法是选择一种做法,试试看;如果失败了,没关系,再试试别的。不管怎么样,最重要的是先去尝试”——罗斯福
  2. 一个称为“试验性工厂”的步骤是必要的,能在缺乏保护的情况下用典型数据来测试我们的项目是否能正确运行
  3. 项目做出来的第一个版本常常是不合用的,如果我们把这个原型发布给用户虽然可以得到时间和回报但是常常会影响声誉和分散接下来的精力
  4. 所以一定要构建一个生来用来抛弃的系统,也就是第一个版本,为舍弃而计划项目的进度
  5. 产品的变化是与生俱来的,不是不合时宜令人讨厌的东西,开发人员最终交给用户的不仅仅是产品还是用户的满意程度,用户的需求和感觉会随着产品的构建和使用不断变化。而软件产品易于掌控又不可见的特性使开发者面临永恒的变更
  6. 很多软件开发小组失败的原因是管理得太少而不是太多,详尽的文档方便控制
  7. 开发人员通常不愿意提交尝试性的决策文档,因为这会使他们暴露于批评下,除非对他们做好保护
  8. 人员结构要做好变化的准备,时刻准备几个可变动的顶级程序员可短时间去某些部门帮手
  9. 不要认为管理岗高于开发岗,给人们相同的待遇或废除头衔或创造两条并行的晋升线
  10. 管理者也应该学技术,开发者也应该学管理,项目的进度,管理问题等信息应该在整体高级人员间共享
  11. 软件维护不仅包含修复漏洞还包括增加新功能
  12. 用户越多维护所需的投入就越多,维护的成本将占到全部成本的40%甚至更多,所以要做好规划
  1. 对缺陷的修复会以一定的几率(20%-50%)引入新的bug,所以开发维护的过程是走两步退一步
  2. 每次维护后要进行一次整体的重新测试,因为修复缺陷可能带来新的缺陷,维护人员也常常由不稳定的新手负责,可能带来更大范围的问题
  3. 随着时间的推移,软件的模块数量会呈线性增长,系统的混乱程度会不断提高,就算有再好的维护系统也只是放缓了这个过程,一段时间后基于原本系统进行重新设计是必要的

干将莫邪

  1. 即使是现在很多软件仍然像是五金店,熟练的开发人员则搜集创造自己的一套工具集作为自己的技能证明,但要明白这样的行为其实是阻碍了软件开发时的沟通,开发公共的工具会让编程效率更高
  2. 项目经理必须意识到工具的重要性,不能吝啬财力物力开发公共工具
  3. 有些软件运行在数量有限的开发平台上,对平台调试进行时间分配时,时间片模式会高效于批处理模式,因为提供给小组更长的连续调试时间和间隔的总结计划时间能提高效率,比批处理提高的利用率更重要
  4. 开发机可能有很多的bug,要将这些bug记录起来,后续的使用人员遇到时才能快速意识到
  5. 项目的每个小组应该有属于自己的独立的开发区,程序在里面自由地调试,当经理需要时小组再提交自己那部分的成果,由集成小组负责组合并测试,发布更新正式的版本
  6. 创造一个性能仿真工具是必要的

整体与部分

  1. 开发一个完整可用的软件需要剔除bug保证稳定,有完整的测试保证可用,不是那么简单的事情
  2. 产品需要有概念的完整性来保证开发有序和较少的bug
  3. 很多项目的失败来自于定义的不精确,编写任何代码前应该把规格说明详尽地提交给测试组来准备检查工作
  4. 采用自上而下的设计可以更好地对抗bug并方便对设计进行调整,让我们能清楚自己所作出的调整是属于整体的哪部分和其中的缘由
  5. 当要把部件组合在一起时,使用尽量没有bug的部件防止加大测试的难度
  6. 对于暂时还排不上解决的bug,将其文档化使后继者方便跳过
  7. 测试通常使用传输设定好的假数据的假接口,包含各种典型记录和特殊值的假数据文件
  8. 必须有专门的小组负责整体的组合和版本的变更,且每改动一个部件就要进行一次版本记录和文档修改,且进行一次子系统的测试,不要懒惰,这样能避免之后的很多bug
  9. 在每个大版本更新间隔中内部都要使用快速补丁来进行更新,每个变更都要文档化

祸起萧墙

  1. 和直觉不同,项目常常是因为大量的小问题而产生难以察觉的漫长的进度落后,而非因为重大的事故
  2. 所以在一开始就要制定一个完整的进度表,进度表中每个安排好的事情称为里程碑
  3. 里程碑必须是具体,特定,可度量的事情,具体的里程碑是百分百的事件,不能有模糊的地方
  4. 在实际实施中,现状应该比进度超前,只有不断地保持超前才有能力处理突发的灾祸并有时间进行计划调整和进度的重新度量
  5. 使用关键路径图来做项目的准备工作,关心每一天中对进度的偏离
  6. 关键路径图的准备是图最有意义的部分,在项目早期就完成非常专业的关键路径图可理清整个任务的关系,第一份图常常很混乱低效,不要害怕,在工作中不断完善它
  7. 让进度信息公开的窍门是减少角色的冲突,必须让执行者明白它的进度需要被评审者了解但评审者不会干扰它的执行,
  8. 关键路径图中详细的里程碑是最终进度的评审来源,最好每周一次小评审,每月一次大评审
  9. 关键的文档是里程碑实现情况的一大依据,负责某个里程碑的经理必须在评审的时候说出当前的正确进度和解决延迟的方法
  10. 产品线总经理负责了解当前进度的情况并将重点放在如何获得更准确的进度估计并监督不要漏报瞒报

另外一面

  1. 即使是开发给自己的产品也应该写文档,因为自己在未来也会失去对产品的理解
  2. 给用户看的内容与给机器的编码一样重要
  3. 不同的用户需要看不同的文档,对于每个文档都要有包含以下内容的一段基础总结性文字
  1. 发布的产品应附带测试程序,证明自己的可用性并作为一份简单的教程
  2. 测试用例的数据主要是下面三方面:代表性的正常数据,合法的边界数据,非法的数据
  3. 对于目标是修改此程序的用户,提供的文档应有以下的进一步文字
  1. 流程图被严重高估了,软件的流程图不应多于1页,且只是大略的介绍数据流即可
  2. 新时代更适合的是自文档化的程序,让程序拥有详尽的注释,规范的编码风格和注释之间易用的跳转或指引,修改程序时也要同时修改程序,让程序和文档一起产生
  3. 应对使用的基础算法提供参考引用和算法书籍的位置,方便索引并减少篇幅
  4. 在程序总列表中应加入箭头之类的关系表
  5. 功能处于同样逻辑中的短代码可写作一行
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未竟东方白 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kotlin学习日志(三)控制语句
最简单的分支莫过于if…else了吧,Java中相信都用过,那么在Kotlin中又是怎么用的呢?其实也比较类似,来看看吧! 布局文件中:
晨曦_LLW
2020/09/25
1K0
Kotlin学习之路(3)控制语句
任何编程语言都会有自己的条件控制语句,这样才能使其逻辑更加的完整。Kotlin的控制语句与Java类似但也有些不同,本节将对条件 循环 以及运算符号表达式进行详细的介绍。
全栈程序员站长
2021/04/07
6830
Kotlin入门(7)循环语句的操作
上一篇文章介绍了简单分支与多路分支的实现,控制语句除了这两种条件分支之外,还有对循环处理的控制,那么本文接下来继续阐述Kotlin如何对循环语句进行操作。 Koltin处理循环语句依旧采纳了for和while关键字,只是在具体用法上有所微调。首先来看for循环,Java遍历某个队列,可以通过“for (item : list)”形式的语句进行循环操作。同样Kotlin也能使用类似形式的循环,区别在于把冒号“:”换成了关键字“in”,具体语句形如“for (item in list)”。下面是Kotlin对数组进行循环处理的代码例子:
aqi00
2019/01/18
8420
Kotlin入门(6)条件分支的实现
上一篇文章介绍了字符串的相关操作,其中示例代码用到了if和for语句,表面上看,Kotlin对控制语句的处理与Java很像,可实际上,Kotlin在这方面做了不少的改进,所以本篇和下一篇文章就分别介绍Kotlin如何操作条件判断和循环语句。 说起条件判断,最简单的莫过于人尽皆知的if...else...了,这个东东从C语言延续到Java,再进化到Kotlin,基本用法仍是一样的,看看下面的示例代码就知道了:
aqi00
2019/01/18
9500
Kotlin入门(8)空值的判断与处理
上一篇文章介绍了如何对循环语句进行操作,末尾还演示了发现空串时直接继续下一循环,只是在初始化字符串数组时使用了“val poem2Array:Array<String?> = ***”,该表达式不免令
aqi00
2019/01/18
4.4K0
Kotlin入门(11)江湖绝技之特殊函数
上一篇文章介绍了Kotlin对函数的输入参数所做的增强之处,其实函数这块Kotlin还有好些重大改进,集中体现在几类特殊函数,比如泛型函数、内联函数、扩展函数、尾递归函数、高阶函数等等,因此本篇文章就对这几种特殊函数进行详细的说明。
aqi00
2019/01/18
1.2K0
Kotlin 基础语法
以上例中 test() 的全名是 com.runoob.main.test、Runoob 的全名是 com.runoob.main.Runoob。
zhangjiqun
2024/12/16
1300
Kotlin入门教程,快使用Kotlin吧
数组用Array类实现,和Java不同的地方在于,Array类有一个size属性表示数组长度,还有get和set方法,但是也可以使用array[position]的方式获取
用户2802329
2018/08/07
1.1K0
Kotlin入门教程,快使用Kotlin吧
Kotlin热身篇: 简介与基本用法
改不完的 Bug,写不完的矫情。公众号 杨正友 现在专注移动基础平台开发 ,涵盖音视频, APM和信息安全等各个知识领域;只做全网最 Geek 的公众号,欢迎您的关注!精彩内容不容错过~ 一. kotlin 简介 Kotlin 拥有强大的生态,因为 Kotlin 是一门跑在 Java 虚拟机上的函数式语言,完全符合 JVM 的设计规范,如: 类型擦除,装箱和拆箱等等。所以也可以像 Java 一样支持 Android 原生环境开发,服务端,甚至大前端方向。那么 Kotlin 和 Java 有什么共同点
小木箱
2020/11/25
1.6K0
开心档-Kotlin 基础语法
以上例中 test() 的全名是 com.kxdang.main.test、Runoob 的全名是 com.kxdang.main.Runoob。
爱学iOS的小麦子
2023/02/08
6990
Kotlin入门(15)独门秘笈之特殊类
上一篇文章介绍了Kotlin的几种开放性修饰符,以及如何从基类派生出子类,其中提到了被abstract修饰的抽象类。除了与Java共有的抽象类,Kotlin还新增了好几种特殊类,这些特殊类分别适应不同的使用场景,极大地方便了开发者的编码工作,下面就来看看Kotlin究竟提供了哪些独门秘笈。
aqi00
2019/01/18
1.3K0
Kotlin入门(16)容器的遍历方式
Kotlin号称全面兼容Java,于是乎Java的容器类仍可在Kotlin中正常使用,包括大家熟悉的队列ArrayList、映射HashMap等等。不过Kotlin作为一门全新的语言,肯定还是要有自己的容器类,不然哪天Java跟Kotlin划清界限,那麻烦就大了。与Java类似,Kotlin也拥有三类基本的容器,分别是集合Set、队列List、映射Map,然后每类容器又分作只读与可变两种类型,这是为了判断该容器能否进行增删改等变更操作。Kotlin对修改操作很慎重,比如变量用val前缀表示不可修改,用var前缀表示允许修改;类默认是不允许继承的,只有添加open前缀才允许该类被继承;至于容器默认为只读容器,如果需要进行修改则需加上Mutable形成新的容器,比如MutableSet表示可变集合,MutableList表示可变队列,MutableMap表示可变映射。 既然Set/List/Map都属于容器,那么必定拥有相同的基本容器方法,具体说明如下: isEmpty : 判断该容器是否为空。 isNotEmpty : 判断该容器是否非空。 clear : 清空该容器。 contains : 判断该容器是否包含指定元素。 iterator : 获取该容器的迭代器。 count : 获取该容器包含的元素个数,也可通过size属性获得元素数量。 初始化赋值 : Kotlin允许在声明容器变量之时进行初始赋值,这点很方便比Java先进,当然不同容器的初始化方法有所区别,具体的对应关系见下表: 只读集合Set    setOf 可变集合    mutableSetOf 只读队列List    listOf 可变队列MutableList    mutableListOf 只读映射Map    mapOf 可变映射MutableMap    mutableMapOf 以上是Kotlin容器的基本方法,更具体的增删改查等用法则有所不同,下面分别介绍这三类六种容器的详细用法。
aqi00
2019/01/18
2.4K0
Kotlin学习日志(二)数据类型
Kotlin的基本数据类型和其他高级语言得分类一样,包括整型、长整型、浮点型、双精度、布尔类型、字符型、字符串这几种常见类型,这样说可能过于抽象,那就和java中的基础数据类型来对比一下吧。
晨曦_LLW
2020/09/25
3.4K0
Kotlin入门(9)函数的基本用法
上一篇文章介绍了Kotlin新增的空安全机制,控制语句部分可算是讲完了,接下来将连续描述Kotlin如何定义和调用函数,本篇文章先介绍函数的基本用法。 前面几篇文章介绍控制语句之时,在setOnClickListener里面写了大段的代码,这不但导致onCreate方法变得很臃肿,而且代码的可读性也变差了。对于这种情况,通常的解决办法是把某段代码挪到一个独立的函数中,然后在原位置调用该函数,这样做的好处很多,不仅增强了代码的可读性,还能多次重复调用函数。那么Kotlin对函数的使用跟Java相比,有哪些区别呢?先从最常见的onCreate方法入手,Java编写的onCreate函数代码如下:
aqi00
2019/01/18
5080
Kotlin学习日志(五)类与对象
通过上述的代码比较,Kotlin对类的写法与Java之间有以下几点区别: (1)Kotlin省略了关键字public,因为Kotlin默认类是开放的,所以不需要这个关键字。 (2)Kotlin用冒号“:”代替extends,也就是通过冒号表示继承关系。 (3)Kotlin进行继承时,父类后面多了括号“()”。
晨曦_LLW
2020/09/25
1.2K0
Kotlin学习日志(四)函数
函数这个词相信各位不会陌生,而Kotlin中也是使用了众多函数的,正所谓面向函数编程。
晨曦_LLW
2020/09/25
1.9K0
Kotlin入门(17)等式判断的情况
话说等式可是编程语言最基本的表达式之一,不管哪种高级语言,无一例外都采用双等号“==”判断两个变量是否相等;就算是复杂的对象,在Java中也可通过equals函数判断两个实例是否相等。按理说这些能够满足绝大多数场合的要求了,那么Kotlin又给等式判断加入了哪些新概念呢?下面就让我们好好探讨一下具体业务中的等式判断。
aqi00
2019/01/18
8940
抱歉!不要用Java的语法思维来写Kotlin
如果你是像我一样是一名 优秀的Java开发者 ^_^,而且已经想用kotlin来实现你的程序,那么,抱歉!不要用Java的语法思维来写Kotlin,不要让kotlin的优雅埋没。如果你没有Java开发经验,下面的内容也对你会有帮助。。。
全科
2018/08/15
3K0
Kotlin实用的语法糖:空安全、类型转换 & 相等性判断
Kotlin被Google官方认为是Android开发的一级编程语言。今天,我将主要讲解,关于Kotlin的一些实用语法糖,主要包括:
Carson.Ho
2020/03/25
1.3K0
Kotlin实用的语法糖:空安全、类型转换 & 相等性判断
Kotlin---控制流程
在if-else的控制流中,可以使用表达是来获取结果,也可以通过闭包来获取表达式结果
None_Ling
2018/12/05
4300
相关推荐
Kotlin学习日志(三)控制语句
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档