也读《人月神话》:没有银弹的软件工程


一、关于人月神话这本书

640?wx_fmt=jpeg

  记得在上大学的时候,就经常听学长和老师讲起《人月神话》,但是却一直没有阅读。记得当时一听到这个书名,还以为是个神马科幻类别的书,结果是个软件工程方面的书籍。这本书是“图灵奖得主、“IBM360系统之父”作者Brooks写的,人们都说它颠覆了项目管理领域,是一本长久不衰的传奇经典,畅销了40多年。的确,在我们熟悉的豆瓣读书上面,它的评分达到了8.6(满分10分),不可不畏是一本好书。最近快速地阅读完后,按照我的老规矩,也需要总结总结,写一篇笔记来日后回顾之用。

二、什么是“人月神话”?

  “人月”这个词英文原文是“Man Month”,代表一个人一个月的时间内能够完成的工作量,在软件开发项目管理中,常用来估算任务量,比如“这个项目需要多少个人月?”。很多时候我们或多或少都有过这样的经历,很多的项目管理人员总是希望通过增加更多的人手来加快软件工程的完成进度。比如,一个工作量为10个人月的项目,如果只有一个人做,需要10个月才能完成。于是,我们的项目管理人员认为,只要再加入9个人,那么10个人一起做,就只需要一个月啦。然而,实际情况并非如此,因此软件工程的各项工作之间,往往存在着一个前后继承的关系,完成了这一项,下一项才能开始。那么,加进来的人手呢,他并不能立即开始工作。所以,想要通过增加人手来缩短工程时间,其实只是一个“神话”而已。这里,就不得不提经常被拿来举例的一个例子,一个孕妇生一个小孩需要10个月,那么请10个孕妇来就只需要1个月啦?显然是不可能完成的任务。

  而“人月神话”反映出的,就是软件开发在项目管理中所遇到的难题:管理人员因为盲目乐观,对项目开发过程中的困难没有充分的认识,在计算项目的工作量和交付时间上采用了错误的计算方法,忽略了细节对整体的巨大影响,而这很可能会导致项目延期。

三、如何处理“人月神话”的难题?

首先,作者建议,以小团队的方式开展工作

  这里不得不说,作者在当时提出了一个类似于外科手术团队的组织结构来开展工作。外科手术团队的奥秘就在于,它是以主刀医生为核心,其他像负责助理医生、麻醉师、护士等人都是为主刀医生服务的,大家各司其职、齐心协力,从而保证手术顺利完成。那么,反映到软件工程上面,就是以架构师或者高级程序员充当主刀医生的角色,而团队管理者充当副手或者服务人员,其他团队成员则分别负责单元代码编写,功能单元测试,文档管理,工具开发及技术支持等等。即使整个项目团队的人数庞大,但只要根据工作边界,将大家划分到一个个类似于外科手术队伍那样的小团队当中去,就可以保障在一定程度上的效率提升。

其次,要进行行之有效的沟通

  定期召开项目进度例会,对数据结构进行监督和全员反馈等等,都是常见的增进沟通的手段。而近年来流行的敏捷开发模式,例如Scrum这种敏捷开发流派,就特别倡导小团队的高频率的沟通,每个迭代(大概2周一个迭代)都会完整经历计划会议、每日站立会议、项目评审会议、团队回顾会议等,特别是每日站立会议,虽然一般只有短短15分钟,但是确是增进沟通的主要行之有效的方式。

  此外,作者还在特别强调了两个点:

  • 使用产品文档

  • “手把手带”的沟通方式

最后,要“防微杜渐

  关于“防微杜渐”,作者具体给出了几点建议:

  • 在项目推进的过程中设立一些关键节点,作者称之为“里程碑事件” => 我所在的团队每天的站立会议都会设立“今日目标”,也就是一些里程碑,在每天下班时后看看这些里程碑事件完成了多少,如果完成100%那么久擦掉,如果没有就说明情况和问题,留到下一个工作日继续完成。

  • 为项目设立一个专门的规划和控制小组

  • 项目管理必须认清一个现实:“唯一不变的就是变化” => 我所在的团队经历过多次需求大改的情况,迫使我们每次修改都要面向未来考虑变化点和可扩展性

  • 为了避免项目延迟和失败,要尽可能地提前集成测试 => 只有尽快集成测试,才能暴露前后端在对于backlog的理解上存在的问题,有没有完成AC(验收条件)

四、“人月神话”为何无法彻底解决?

  “人月神话”中的一些问题,其根源在于软件工程本身的特性,是无法彻底解决的,这也是广大IT从业人士的共识。其原因归根结底有以下几点:

  • 计算机技术的发展实在是太快了 => 想想摩尔定律到现在前后端的框架变化,我们时常感叹前一阵子学的东西现在又被淘汰了,是否要开始学习AI了?

  • 软件研发本身的内在的特性也制约了软件工程的进展 => 作者用了4个词来概括这种特性:复杂性、一致性、可变性和不可见性。

五、改善软件开发根本难题的建议

  虽然作者说到上面提到的这些困境是软件开发的根本困难,无法彻底解决。但是,它还是给出了三方面的建议,来尽可能改善这种困难造成的困境:

  • 采用新技术 => 使用高级语言总比低级语言方便吧,使用.NET Core总比.NET Framework程序性能和跨平台好吧?

  • “快速开发原型”,然后再做“增量开发” => 其实跟我们的敏捷开发思想一致,通过在不断地迭代反复中堆成一个完整的系统,在精益创业中,也有一个MVP(最小可用产品)的概念,它提倡快速原型试错,快速获取市场反馈,然后再慢慢完成最后的完整的产品。

  • 聘用卓越人才 => 这一点毋庸置疑,有了新的技术和敏捷开发,还需要合格的、追求卓越的程序员人才,这让我想起了ThoughtWorks这家公司,它是一个尊重技术,提倡敏捷并且积极追求卓业人才的代表性企业,Martin Fowler是其首席科学家,无数的咨询师走上了技术布道之路,敏捷开发,DDD,微服务等实践总结和分享雨后春笋般地出来,向ThoughtWorks致敬。

整体脑图

640?wx_fmt=png

参考资料

弗雷德里克·布鲁克斯,《人月神话》

王福强,《喜马讲书:人月神话》



640?wx_fmt=jpeg


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

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

相关文章

P6154 游走 概率dp

传送门 题意: 思路: 给你个DAGDAGDAG,由于每一条路径出现概率相等,那么期望就是总长度路径个数\frac{总长度}{路径个数}路径个数总长度​。设f[i]f[i]f[i]表示到iii这个点的总长度,g[i]g[i]g[i]表示到iii这个点路径的…

[译]如何在C#中调试LINQ查询

LINQ是我在C#中最喜欢的功能之一。它让代码看起来更漂亮美观。我们得到了一个易于编写和理解的简洁函数式语法。好吧,至少我们可以使用LINQ方法的语法风格。LINQ很难进行调试。我们无法知道该查询内部发生了什么。我们可以看到输入和输出,但这就是它的全…

CodeForces - 375D Tree and Queries 树启 + 思维

传送门 题意: 思路: 很明显子树问题会想到树启,让后如何updateupdateupdate呢?一个显然的思路就是维护一个树状数组,查询次数>kj>k_j>kj​的个数。但是这样复杂度是O(nlog2n)O(nlog^2n)O(nlog2n)的&#xf…

WebSocket数据加密——AES与RSA混合加密

前言之前在写“一套简单的web即时通讯”,写到第三版的时候没什么思路,正好微信公众号看到一篇讲API交互加密,于是就自己搞了一套AES与RSA混合加密,无意中产生应用在WebSocket想法,好在思路都差不多,稍微改动…

基于 EntityFramework 生成 Repository 模式代码

借助 WeihanLi.EntityFramework 实现简单的 RepositoryIntro很多时候一些简单的业务都是简单的增删改查,动态生成一些代码完成基本的增删改查,而这些增删改查代码大多类似,只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF …

P3168 [CQOI2015]任务查询系统 主席树 + 差分

传送门 题意: 思路: 题目中(si,ei,pi)(s_i,e_i,p_i)(si​,ei​,pi​)转换成操作即为在[si,ei][s_i,e_i][si​,ei​]区间内加上pip_ipi​的优先级,让后查询的话就是查询第xix_ixi​秒优先级最小的kik_iki​个任务的优先级之和。可知这两个操…

asp.net core 系列之Performance的 Response compression(响应压缩)

本文,帮助了解响应压缩的一些知识及用法(大部分翻译于官网,英文水平有限,不准确之处,欢迎指正)。什么是响应压缩?响应压缩简单的说就是为了减少网络带宽,而把返回的响应压缩,使之体积缩小,从而加快响应的一种技术(个人…

Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列

传送门 文章目录题意:思路:题意: 思路: 首先一个括号序列合法的条件可以转化成两个(左括号代价为111,右括号代价为−1-1−1): (1) 左括号个数等于右括号个数。 (2) 括号的前缀和非负。 所以我们直接用线段…

从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

前言在阅读这篇文章:Announcing Net Core 3 Preview3的时候,我看到了这样一个特性:Docker and cgroup memory LimitsWe concluded that the primary fix is to set a GC heap maximum significantly lower than the overall memory limit as …

asp.net core使用serilog将日志推送到腾讯云日志服务

为什么是serilog?Serilog是 .NET 中最著名的结构化日志类库。基于日志事件log events,而不是日志消息log message。你可以将日志事件格式化为控制台的可读文本或者可以将相同的事件格式化为JSON并将其发送到远程日志服务器。应用程序中的日志语句会创建L…

P5787 二分图 /【模板】线段树分治

传送门 文章目录题意:思路:题意: 思路: 线段树分治就是在线段树上进行遍历,到每个点都加上它对子节点的贡献,最后到叶子节点的时候算一下贡献。 对于这个题先考虑维护二分图的话,可以用扩展域并…

微软发布 VS Code Java 安装程序,一键安装所有 Java 开发环境

北京时间 2019 年 6 月 14 日 ,微软发布了 VS Code Java 安装程序,方便开发者能一键安装所有 Java 开发环境。几乎是在三年前,在微软苏黎世办公室的编程马拉松中,来自 Red Hat,IBM,Codenvy 和 Microsoft 的…

[译]C#中的条件断点

这只是你们许多人中可能使用的一个简单技巧。这是一个小但非常强大的技巧,在你调试大型代码库时尤其有用。这是条件断点的概念。正如名称本身所暗示的那样,只有在满足某个条件时才会设置被击中的断点。它也很容易实现。创建一个新的应用程序并设置一个普…

前菜---二叉树+堆的小练习

目录 前言🏜️ 1. 二叉树性质总结⛱️ 1.2 性质3⏰ 2. 二叉树性质小练习🏕️ 3. 答案解析💡 4. 堆概念结构小练习🪔 5. 答案解析🧿 6. 前/中/后/层序遍历小练习🔫 7. 答案解析🧺 后语…

牛客 CCA的区间 dp + 补集转移

传送门 文章目录题意:思路:题意: 思路: 首先翻转一个区间意味着可以将任意两段不相交的区间组合,所以问题变成了选两端不相交的区间,使得合并后区间和最大。那么我们就处理出来区间,让后进行转…

ASP.NET Core IP 请求频率限制

在网站或API应用中,我们为了防止无聊人士或恶意攻击,通常希望屏蔽某一IP短时间的内高频率请求。在ASP.NET Core中,限制IP请求频率非常简单,我们来看看吧。轮子一个.NET Core 目前的生态发展十分迅猛,轮子也越来越多。只…

Exceptionless - .Net Core开源日志框架

作者:markjiang7m2原文地址:https://www.cnblogs.com/markjiang7m2/p/11020140.html官网地址:http://letyouknow.net今天要给大家介绍的Exceptionless是一个基于 .net core的开源日志框架,Exceptionless的意思是:没有异…

CF981E Addition on Segments 线段树分治 + bitset优化

传送门 文章目录题意:思路:题意: 思路: 我们考虑如果我们选择的区间都包含某个位置,那么这个位置一定是最大值。那么对于每个位置,我们枚举包含其的区间,让后每次加xxx都用bitsetbitsetbitset来…

开源基于Canal的开源增量数据订阅消费中间件

canal 是阿里巴巴开源的一款基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB)。我开发的这个CanalSync项目 https://github.com/yuzd/CanalSync >觉得不错帮忙给个star谢谢是基于canal-server之上的数据库同步&消费中间件&#…

不装 VS 自己编译安装 Windows Terminal

Windows Terminal 一直没有发布可以直接安装的二进制文件,想自行编译的时候,看到系统需求中包含体积巨大的 Visual Studio 和 Windows SDK,脑袋都大了。直接下载其他人编译好的安装包又不放心,那么就想个办法避免在本地环境编译吧…