[人月神话]读书笔记10--20年后的人月神话(The Mythical Man-Month after 20 Years)_进击的横打的博客-程序员秘密

技术标签: 人月神话  

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

★为什么会出现二十周年纪念版本?
反常的并不是软件发展得太慢,而是计算机硬件技术以一种与人类历史不相配的方式爆发出来。
与生产制造相比,硬件和软件开发保持着固有的劳动密集型特征。
软件项目管理并不像大多数程序员起初所认为的那样,而更加类似于其他类型的管理。
人月神话是关于人与团队的书,所以它的淘汰过程会是缓慢的。

★核心观点:概念完整性和结构师
□概念完整性
 一个整洁、优雅的编程产品必须向它的每个用户提供一个条理分明的概念模型,这个模型描述了应用、实现应用的方法以及用来指明操作和各种参数的用户界面使用策略。
 任何规模很大或者非常紧急,并需要很多人力的项目,都会碰到一个特别的困难:必须由很多人来设计,但与此同时,还需要在概念上保持与单个使用人员的一致。如何组织设计队伍来获得上述的概念一致性?这是《人月神话》关注的主要问题。

□结构师
 结构师开发用于向用户解释使用的产品概念模型,概念模型包括所有功能的详细说明以及调用和控制的方法。结构师是这些模型的所有者,同时也是用户的代理。在不可避免地对功能、性能、规模、成本和进度进行平衡时,卓有成效地体现用户的利益。
 这个角色是全职工作,只有在最小的团队中,才能和团队经理的角色合并。结构师就像电影的导演,而经理类似于制片人。

□将体系结构和设计实现、物理实现相分离。
  体系结构和实现的划分在各个设计任务重形成了清晰的边界,边界两边都有大量的工作。
□体系结构的递归。
 由一位主结构师把系统分解成子系统,系统边界应该划分在使子系统间接口最小化和最容易严格定义的地方。
 每个部分拥有自己的结构师,他必须就体系结构向主结构师汇报。这个过程可以根据需要重复递归地进行。
□今天,我比以往更加确信。
 概念完整性是产品质量的核心。拥有一位结构师是迈向概念完整性的最重要一步。 
 每4个学生左右的小组就选择不同的经理和结构师。在如此小的队伍中定义截然不同的角色可能是有点极端,但我仍然发现这种方法即使对小型团队也运作良好,并且促使了设计的成功。

★开发第二个系统所引起的后果:盲目的功能和频率猜测
□为大型用户群设计
 在商业数据处理领域中,客户应用程序越来越多地被商用软件包所代替。
 
□盲目的功能(Featuritis)
 功能建议的吸引力在初期阶段是很明显的,性能代价在系统测试时才会出现。而随着功能一点一点地添加,手册慢慢地增厚,易用性损失以不易察觉的方式蔓延。

□定义用户群。
  用户群越大和越不确定,就越有必要明确地定义用户群,以获得概念完整性。
 结构师的用户图像会有意或者无意地影响每个结构决策,因此有必要使设计队伍共享一幅相同的用户图像。这需要把用户群的属性记录下来。
1)他们是谁
2)他们需要(need)什么
3)他们认为自己需要(need)什么
4)他们想要(want)的是什么

□频率
  对于软件产品,任何用户群属性实际上都是一种概率分布,每个属性具有若干可能的值,每个值有自己的发生频率。
 为了得到完整、明确和共有的用户群描述,结构师应该猜测(guess),或者假设(postulate)完整的一系列属性和频率值。
1)这种不是很可靠的过程有很多好处。首先,仔细猜测频率的过程会使结构师非常细致地考虑对象用户群。
2)把它们写下来一般会引发讨论,这能起到解释的作用,以及澄清不同设计人员对用户图像认识上的差异。
3)明确地列举频率能帮助大家认识到哪些决策依赖于哪些用户群属性。
 这种非正式的敏感性分析也是颇有价值的。当某些非常重要的决策需要取决于一些特殊的猜测时,很值得为那些数值花费精力来取得更好的估计。

总结:为用户群的属性明确地记载各种猜测。清晰和错误都比模糊不清好得多。

□“开发第二系统所引起的后果(second-system effect)”情况怎样?

★图形(WIMP)界面的成功
□通过类比获得的概念完整性。
 WIMP是一个充分体现了概念完整性的用户界面例子。
 哪些地方使WIMP界面远远超越了桌面的比喻?主要是在两个方面:菜单和单手操作。
□用户功能和易用性。
 软件结构师所面临的最困难问题是如何确切地平衡用户功能和易用性。是为初学者或偶尔使用的用户设计简单操作,还是为专业用户设计强大的功能?理想的答案是通过概念一致的方式把两者都提供给用户。 
□WIMP的命运:过时被淘汰。


★没有构建舍弃原型——瀑布模型是错误的!
  瀑布模型的基本谬误是它假设项目只经历一次过程,而且体系结构出色并易于使用,设计是合理可靠的,随着测试的进行,编码实现是可以修改和调整的。换句话说,瀑布模型假设所有错误发生在编码实现阶段,因此它们的修复可以很顺畅地穿插在单元和系统测试中。
  应该一块块地丢弃和重新设计系统,而不是一次性地完成替换。
  瀑布模型的第二个谬误是它假设整个系统一次性地被构建,在所有的设计,大部分编码,部分单元测试完成之后,才为闭环的系统测试合并各个部分。
□必须存在逆向移动
 在开发过程“下游”的经验和想法必须跃行而上,有时会超过一个阶段,来影响“上游”的活动。
  在把任何东西实现成代码之前,可能要往复迭代两个或更多的体系结构-设计-实现循环。

★增量开发模型更佳——渐进地精化
 早期曾提倡我们首先应该构建实时系统的基本轮训回路,为每个功能都提供子函数调用。但仅仅是空的子函数。对它进行编译,测试,使它可以不断运行。它不直接完成任何事情,但至少是正常运行的。一个可运行的系统出现了,尽管只是一个框架。在每个功能基本可以运行之后,我们一个接一个地精化或者重写每个模块--增量地开发整个系统。

 □构建闭环的框架系统
  我们可以很早开始用户测试,以及我们可以采用按预算开发的策略,来彻底保证不会出现进度或者预算的超支(以允许的功能牺牲作为代价)。
  第一个可运行的系统对团队士气产生的鼓舞效果而感到震惊。
 
 □Parnas产品族
  Parnas力劝设计人员对产品的后期扩展和后续版本进行预测,定义它们在功能或者平台上的差异,从而搭建一棵相关产品的家族树。设计类似一棵树的技巧是将那些变化可能性较小的设计决策放置在树的根部。这样的设计使得模块的重用最大化。

 □Microsoft的“每晚重建”方法
  在每次重建之后,我们会获得一个可运行的系统。如果重建失败,我们将停下整个过程,直到找到问题所在并进行修复。在任何时间,团队中的每个人都了解项目的状态。
  这是非常困难的。你必须投入大量的资源,而且它是一个规范化、可跟踪、开诚布公的流程。它向团队提供了自身的可信度,而可信度决定了你的士气和情绪状态。
 
 □增量式开发和快速原型
  增量式开发:能使真正的用户较早地参与测试。
 快速原型:仅仅反映了概念模型准备过程中所做的设计决策[的一个程序版本],它并未反映受实现考虑所驱使的设计决策。
 这种原型化对获取早期的用户反馈非常有用。
 “从第一个里程碑开始构建”的微软流程和快速原型之间的差别是什么?
  功能。第一个里程碑产品可能不包含足够的功能使任何人对它产生兴趣,而可发布产品和定义中的一样,在完整性上——配备了一系列实用的功能集,在质量上——它可以健壮地运行。


★关于信息隐藏,Parnas是正确的,我是错误的
 Harlan Mills颇有说服力地指出“编程是个开放性的公共过程”。把所有工作都暴露在每个人的凝视之下,能够帮助质量控制,这既源于其他人优秀工作的压力,也由于同伴能直接发现缺陷和bug。
 David Parnas认为代码模块应该采用定义良好的接口来封装,这些模块的内部结构应该是程序员的私有财产,外部是不可见的。编程人员被屏蔽而不是暴露在他人模块内部结构面前。这种情况下,工作效率最高。
  关于每个团队成员应该在多大程度上被允许和鼓励相互设计和代码的问题,上面两种方法Parnas是正确的。
 1.过去在软件生产率上取得的进展大多数来自消除非内在的困难,如笨拙的编程语言、漫长的批处理周转时间等。
 2.像这些比较容易解决的困难已经不多了。
 3.彻底的进展将来自对根本困难的处理——打造和组装复杂概念性结构要素。


★人月到底有多少神话色彩?Boehm的模型和数据
 人力(人)和时间(月)之间的平衡远不是线性关系,使用人月作为生产率的衡量标准实际是一个神话。特别的,他发现
 第一次发布的成本最优进度时间,T = 2.5(MM)1/3。即,月单位的最优时间是估计工作量(人月)的立方根,估计工作量则由规模估计和模型中的其他因子导出。最优人员配备曲线是由推导得出的。
 当计划进度比最优进度长时,成本曲线会缓慢攀升。时间越充裕,花的时间也越长。
 当计划进度比最优进度短时,成本曲线急剧升高。
 无论安排多少人手,几乎没有任何项目能够在少于3/4的最优时间内获得成功!当高级经理向项目经理要求不可能的进度担保时,这段结论可以充分地作为项目经理的理论依据。
  向进度落后的软件项目中添加人手只会使进度更加落后。向进度落后的项目中添加人手总会增加项目成本,但并不一定会使项目更加落后。特别的,由于新成员总会立刻带来需要数周来弥补的负面效应,所以在项目早期添加额外的人力比在后期加入更加安全一些。

★人就是一切(或者说,几乎是一切)
即对于项目的成功而言,项目人员的素质、人员的组织管理是比使用的工具或采用的技术方法更重要的因素。

□人件
管理人员的职责不是要人们去工作,而是是创造工作的可能
□项目转移。
团队融合是一个无形的,但是非常关键的特性。很多地点分散的公司,项目从一个实验室转移到另一个。从中,我认为团队融合正是管理上被忽视的因素。
任务可以成功地转移,但是对于项目的转移,即使拥有良好的文档、先进的设计以及保留部分原有人员,新队伍实际上依然是重新开始。我认为正是由于破坏了原有团队的整体性,导致了产品雏形的夭折,项目重新开始。

★放弃权力的力量
授权是朝着正确方向迈出的一大步,:通过权力委派,中心的权威实际上是得到了加强;从整体而言,组织机构实际上更加融洽和繁荣。
每个队伍(30至40人)拥有自己的任务、进度,甚至如何定义、构建、发布的过程。团队由4或5个专家组成,包括开发、测试和书写文档等。由团队而不是老板对争论进行仲裁。我无法形容授权和由团队自行负责项目的成功与否的重要性。
关键的措施是将权力向下委派。这就像是魔术!改进的质量、提高的生产率、高涨的士气。我们的小型团队,没有中心控制。团队是流程的所有者,并且必须拥有一个流程。他们有不同的流程。他们是进度计划的所有者,因此感受到市场的压力。这种压力导致他们使用和利用自己的工具。

□元编程。
为部分软件包用户进行功能定制的过程。元编程并不是新概念,仅仅是重新被提出和重新命名。

★软件工程的状态和未来
 软件工程的焦油坑在将来很长一段时间内会继续地使人们举步维艰,无法自拔。软件系统可能是人类创造中最错综复杂的事物,只能期待人们在力所能及的或者刚刚超越力所能及的范围内进行探索和尝试。这个复杂的行业需要:进行持续的发展;学习使用更大的要素来开发;新工具的最佳使用;经论证的管理方法的最佳应用;良好判断的自由发挥;以及能够使我们认识到自己不足和容易犯错的---上帝所赐予的谦卑。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Last_Impression/article/details/48417305

智能推荐

mysql中各种类型变量的定义以及赋值使用_分类变量赋值_一只笨鸟的博客-程序员秘密

mysql中各种类型变量的定义以及赋值使用该文总体框架http://www.cnblogs.com/zhuawang/p/4090916.html第一节http://blog.csdn.net/seteor/article/details/17682551MySQL存储过程中,定义变量有两种方式: 1.使用set或select直接赋值,变量名以 @ 开头. 例如:set @var=1; 可以在一个...

vue+element+sts临时授权上传大文件到阿里云OSS时踩过的坑。_vue 获取oss sts凭证_SmileHan666的博客-程序员秘密

参考原文地址:参考原文地址阿里云js分片上传官方文档:阿里云js分片上传官方文档STS临时授权访问OSS:STS临时授权访问OSSSTS接入地址:STS接入地址报错Error: Please set the etag of expose-headers in OSS解决:报错Error: Please set the etag of expose-headers in OSS"npm ERR! Error: EPERM: operation not permitted"问题解决:"npm ERR!

(12)mongodb replcation与shard结合使用_weixin_30249203的博客-程序员秘密

  replcation 复制集保证了每个节点中的数据都是一样的,将相同的数据备份到不同的节点,shard 分片是按照某种规则将不同数据写到不同的节点中。replcation与shard结合使用只需将复制集添加到 shard 中就可以了,每一个复制集看做一个整体,当成一个节点对待,如图所示:一般来说如果数剧量很大的话就会用到分片,同时也会用到复制集了,实现步骤记录如下:1、准...

王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019_华为云开发者联盟的博客-程序员秘密

演讲嘉宾 |王晶(华为云人工智能高级算法工程师王晶)出品 |AI科技大本营(ID:rgznai100)近期,由CSDN主办的2019中国AI开发者大会(AI ProCon 2019)在北京举办。在计算机视觉技术专题,华为云OCR人工智能高级算法工程师王晶分享了“文字识别服务的技术实践、底层框架及应用场景”的主题演讲。演讲的第一部分,他分享了文字检测和识别的基础知识以及难点...

Redis-hash算法、rehash及如何解决键冲突_redis hash rehash_See_NUMB的博客-程序员秘密

文章目录1. hash算法2. rehash3. 哈希表的扩展和收缩4. 解决哈希冲突5. 渐进式rehash1. hash算法学过数据结构的知道,当要将一个新的键值对添加到字典里面时, 程序需要先根据键值对的键计算出哈希值和索引值, 然后再根据索引值, 将包含新键值对的哈希表节点放到哈希表数组的指定索引上面。计算hash值和索引值的方法如下# 使用字典设置的哈希函数,计算键 key 的哈希值hash = dict->type->hashFunction(key);# 使用哈希

第十一届蓝桥杯省赛第二场JavaC组数字三角形_zz_zz__zz_zz的博客-程序员秘密

目录试题 H: 数字三角形内存限制: 512.0MB 本题总分:20【问题描述】上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。【输入格式】输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的N 行给出数字三角形。数字三角形上的数都是

随便推点

PHP中使用Redis长连接笔记_i-neojos的博客-程序员秘密

php中使用redis长连接踩过的坑,pconnect连接创建的redis实例,因为select db操作修改了redis实例,导致出现意想不到的问题

Linux 下使用 Swift MQTT_weixin_33856370的博客-程序员秘密

作者:Joe,原文链接,原文日期:2016-06-12译者:shanks;校对:CMB;定稿:Cee在过去几年的时间里,我一直从事物联网(Internet of Things,IoT)软件的开发项目。在这段时间里面,我学到了不少关于和云端通信传感以及遥感的协议方案。在物联网领域最通用的方案是 MQTT ,一个轻量级的协议,用于发布消...

AJAX_商晓沐的博客-程序员秘密

AJAX关于ajax和异步什么是ajax?交互式网站开发技术实现动态更新(局部)的内容优点:提升浏览器的加载速度实现了局部刷新表单验证(增强用户体验)Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术本质:是在HTTP协议的基础上以异步的方式通过XMLHttp...

几个基本排序算法总结( C语言实现 )_c语言完成排序心得_zomoe的博客-程序员秘密

最近由于长时间没写过基本的排序算法,结果导致只知道大概思想便不知怎么去编写这些算法的代码了,所以借着一下午的时间把基本的几个排序算法的代码写了一边,算是对它的复习吧!  一  .「冒泡排序」:  冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数

【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!..._weixin_30865427的博客-程序员秘密

本文转自知乎作者:苏格兰折耳喵—————————————————————————————————————————————————————在本文中,作者引出了“外部数据”这一概念,并实例分析,如何从海量的外部数据中获取可以对自身业务起到指导作用和借鉴意义的insight,并借助外部环境数据来优化自己。现在互联网上关于“增长黑客”...

python去除空行_python剔除空行_weixin_39622399的博客-程序员秘密

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!if line.split(): print(idx, line)r_file.close()打印结果:0 hello2 nanjing4 100...版权声明:本文为博主原创文章,遵循 cc 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https:bl...