Tom DeMarco:软件工程这个概念已过时?

2023-10-31

原文作者:Tom Demarco,写于2009年7月

作者简介:Tom DeMarco是大西洋系统协会(www.atlsysguild.com)的负责人。他的职业生涯开始于贝尔实验室,是结构化分析和设计的创始人之一,研究领域主要集中在对软件组织和项目的风险管理。已经出版了好几本经典图书,包括《人件》、《最后期限》、《与熊共舞》等。

遥想当年在德国的加米施举行的NATO(North Atlantic Treaty Organization,即北大西洋公约组织)软件工程大会,迄今已有40载了。在那次会议上,软件工程(Software Engineering)作为一门学科被首次提出。因为我早年的一些工作成果被吸收入那个新学科,现在似乎是时候来重新评估一下了。

我早年写过一本关于软件度量的书,书名叫《Controlling Software Projects: Management, Measurement, and Estimates》(由Prentice Hall出版社于1986年出版)。很多初露头角的软件工程师在量化工作和规划项目时都把那本书奉为圭璧。如今我在反思之中,我想知道:书里的建议在那时候正确吗?现在还有用吗?我现在仍然相信“度量”是任何成功的软件开发活动所必需的吗?我的回答全部是否定的。

在我看来,那本书是一种古怪的组合——书里每一页上写的东西大体都是正确的,但把它们组合起来形成的中心思想却走向了谬误。似乎年轻的作者从未遇到过一个他不喜欢的度量。那本书诠释的内涵似乎是:度量是好东西,多多益善,我们应该来者不拒。现如今,我们都已经明白:软件度量是要花费金钱和时间的,使用起来要小心、有节制。另外,软件开发在本质上与自然科学(比如物理)是不同的;相应地,软件度量在获取它们要求的东西时会不精确得多。它们是值得怀疑的——我们不能毫无保留地相信它们。

控制是出于无奈

那本书被引用得最多的是它的第一句话:“你无法控制一个不能度量的东西。”这是一句大实话,但我越来越感受到它的不妥。这句话(其实还有那本书的书名)暗示着,“控制”是任何软件项目里很重要的一方面,也许还是最重要的。其实不然!很多项目都没有引入大量的控制,但它们开展得很好,而且还产出了绝妙的成果,比如Google Earth或Wikipedia。

为了真正地理解控制的作用,你必须区分两种截然不同的项目:

  • A项目:最终花费的成本将是100万美元,而创造的价值大概是110万美元;
  • B项目:最终花费的成本将是100万美元,但创造的价值超过5000万美元。

我们的第一反应是,控制对于A项目来说非常重要,但对于B项目几乎就是无所谓的。于是,我们得出了一个奇怪的结论:严格的控制对于相对而言无用的项目意义重大,而对于有用的项目的意义要小得多。这也暗示着,你在控制方面投入得越多,你越可能在累死累活地做着一个产出卑微的项目。

在我看来,与其纠结在“如何控制一个软件项目”,我们须面对的比那重要得多的问题是:我们究竟为什么要做这么多价值不高的项目?

项目无须控制,或者只需要相对而言很少的控制——我真的可以这么说吗?也差不多吧。我的建议是,我们首先应该选择做那些不太需要精确控制的项目。然后,不管我们将如何在控制方面施力,我们必须降低对自己控制能力的期望。

一个令人不安的类比

想象一下,你正在尽力抚养一个10几岁的少年。你想要控制你的孩子,这必定让你感到有些不适。然而,你不能加大控制的力度。搞不好的话,你会彻底失败,生活也就毁了。毋庸置疑的是,你不能完全放任自流。你就像是一个正在学习握剑的剑客,应该把手中之剑视作为一只小鸟——如果握得太紧,它会受伤;如果握得太松,它便飞走了。

接下来,把“你无法控制一个不能度量的东西”这句话用到你的孩子身上。你会发现,大部分重要的东西(比如荣誉、尊严、纪律、品格、压力下的风度、价值、道德、智慧、忠诚、幽默、善良等)都是无法度量的。你必须在没有很多反馈的情况下竭尽全力去指导你的孩子。这做起来很难,但为人父母本来就不是一件易事。说起来,你可以通过学校里的成绩来获取一些度量,你还为此暗自庆幸。不过,你也知道,与孩子的西班牙语成绩比起来,他的数学成绩更能反映他的学习情况,因为对数学的掌握程度更易于度量。他在举止风度上的“成绩”更可能反映的是老师的教学水平(而不是孩子的学习情况)。

那么,怎样才能在没有控制的情况下管理项目呢?其实,你要管理的是人,而你要控制的是时间和资金投入。举例来说,你要对团队主管这么说,“我已经想好了项目的交付日期,但我现在不会告诉你。将来有一天,我会去找你,告诉你需要在一周之内结束项目。你必须时刻准备着收拾局面,把已经完成的东西打包成最终产品交付出来。你要做的工作是,以递增的方式来开展项目,根据各块功能的价值高低顺序依次叠加进主产品,持续不断地做集成、文档以及验收测试。”

我建议的应对之策听起来像敏捷方法吧。不过,如今的我已经离软件开发前线很远很远,由我来推荐具体的方法是不合适的。我所主张的是一种管理方法,它可能恰恰把团队引向了敏捷方法(至少是敏捷流派提倡的增量开发模式)。

到目前为止,我谈论的几乎都是软件工程的度量这一部分。那么,其他方面怎么样呢?我慢慢地得出这样的结论:软件工程——这个概念流行过,但现在已经过时了。我仍然相信软件值得精耕细作。但是,那与软件工程并不完全是一回事。软件工程的范畴包含一系列特定的学科,包括明确的流程、检验与走查、需求工程、可追溯性模型、度量、精确的质量控制、严格的计划与追踪、编码与文档规范等等。所有这一切都为了追求实践的一致性和可预测性。

一致性和可预测性仍然是吸引人的,但它们从来就不是最重要的东西。要知道,在过去的40年里,我们一直在折磨着自己——我们始终无法在预算之内按时完成一个软件项目。但是,正如我前面暗示的那样,这也绝不应该成为最高的目标。实际上,更重要的目标是“改革”——创建能够改变世界、或者让一个公司脱胎换骨或改变其运营方式的软件。我们在改革方面是相当成功的,但这时常发生在控制的包围圈之外。无论是现在还是将来,软件开发总是带有点试验性质的。尽管实际的软件构造未必是试验,但它的概念却是。这是我们应该专注的地方。我们原本也应该一直专注在这方面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tom DeMarco:软件工程这个概念已过时? 的相关文章

  • 眼睁睁看着乙方把项目作死是一种什么感受(项目作死10大方法)

    刚跟乙方开完会回来 在会议的后半程我感觉快要窒息了 基于本次项目合作浓郁的 政治因素 作为 掮客 的我们只能要求不再延期跳票 尽快处理等嘴皮子功夫 其它的实在力不从心 这种感觉就真真是眼睁睁看着甲方作死 极力想拉住它 它还嫌 累 我是如何看
  • Open Source Game Clones

    Open Source Game Clones This site tries to gather open source reimplementations of great old games in one place If you t
  • 服务计算:简单的web程序

    CloudGo 框架选择 看了go的一些框架如beego和iris觉得挺好的 本来想用 但是虚拟机出了点问题装不成 windows上装成了没ab指令 所以使用官方的net http库做简单的实验 看完beego和iris的特性我还是比较想用
  • android获取缓存大小并清理缓存

    本文主要注重介绍实战操作 理论知识可能介绍的不多 勿喷 简单说两句缓存的好处 采用缓存 可以进一步大大缓解数据交互的压力 又能提供一定的离线浏览 下边我简略列举一下缓存管理的适用环境 1 提供网络服务的应用 2 数据更新不需要实时更新 哪怕
  • 软件设计(十四)-UML建模(上)

    软件设计 十三 原码 反码 补码 移码https blog csdn net ke1ying article details 129115844 spm 1001 2014 3001 5501 UML建模包含 用例图 类图与对象图 顺序图
  • 小米盒子打开adb调试模式

    1 先打开开发者模式 进入小米电视设置 gt 进入关于 gt 找到产品型号 gt 在产品型号上面连续多次按ok 确认 键 gt 然后就会提示 您已处于开发者模式 2 开启adb 经过第一步开启开发者模式之后 现在可以返回到设置页面 进入 账
  • 软件工程——软件实现

    在我们做好对软件的需求分析 设计之后 就是软件的实施部分了 主要包括软件实现 软件测试 测试方法 黑盒测试 主要是检查功能 数据 以及接口的问题 具体方法有等价划分 边界值分析 错误推断法 白盒测试 对程序所有逻辑路径进行测试 测试方法按覆
  • 推荐111个软件工程本科的计算机毕业设计,有手就会

    对于即将挑战计算机专业毕业设计的学子们 是否已经为选题和项目感到焦虑 今天 我们为即将毕业的学生提供了大量的毕业设计项目 期望对于正在为毕业设计挠头的同学们有所助益 一 成品列表 以下所有springboot框架项目的源码博主已经打包好上传
  • 程序员要不断学习

    2016 10 20 计算机技术的发展速度还是很快的 当个人电脑赶上10年前的超算时 我们不得不感叹硬件的发展编程开发带来了很大的影响 对世界带来了很大的影响 知识和工具的更新速度还是比较快的 这就要求程序员始终需要学习 我在知乎上看到一个
  • 软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

    软考 中级软件设计师 程序语言基础 表达式 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域
  • Go 语言输出文本函数详解

    Go语言拥有三个用于输出文本的函数 Print Println Printf Print 函数以其默认格式打印其参数 示例 打印 i 和 j 的值 package main import fmt func main var i j stri
  • thinkphp+vue教学互动课程资源网站

    软件工程课程建设通篇文章的撰写基础是实际的应用需要 然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程 以软件工程课程建设的实际应用需要出发 架构系统来改善现软件工程课程建设工作流程繁琐等问题 不仅如此以操作者的角度来
  • git 的碎步浪荡,添加仓库子项目,迁移仓库

    1 git仓库迁移 将他人的代码仓库 xxxx 移为自己的 yyyy 仓库 先创建自己的yyyy空仓库 假设url为 yyyy git 将 xxxx 的全部数据 包括分支和 tag 都 download 到本地 git clone recu
  • thinkphp+vue教学互动课程资源网站

    软件工程课程建设通篇文章的撰写基础是实际的应用需要 然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程 以软件工程课程建设的实际应用需要出发 架构系统来改善现软件工程课程建设工作流程繁琐等问题 不仅如此以操作者的角度来
  • 68 | 软件工程的宏观视角

    软件工程 今天开始 我们进入第六章 谈谈软件工程 我理解的架构师的职责其实是从软件工程出发的 也许大家都学过软件工程 但如果我们把软件工程这门课重新看待 这门学科到底谈的是什么 是软件项目管理的方法论 无论如何 软件工程是一门最年轻的学科
  • 组建一家IT公司的一些事项

    组建一家IT公司需要考虑多个方面 包括确定公司名称 选择注册地点 确定公司类型 组建团队 选择合适的技术和平台以及建立良好的客户关系等 以下是一些详细的步骤和建议 一 组建事项 确定公司名称 在选择公司名称时 需要考虑名称的含义和市场竞争性
  • 【软件测试】学习笔记-脚本与数据的解耦 + Page Object模型

    本篇文章介绍GUI测试中两个非常重要的概念 测试脚本和数据的解耦 以及页面对象 Page Object 模型 测试脚本和数据的解耦 GUI自动化测试适用的场景 尤其适用于需要回归测试页面功能的场景 如果在测试脚本中硬编码 hardcode
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • Python - 字典4

    复制字典 您不能简单地通过输入 dict2 dict1 来复制一个字典 因为 dict2 只会成为 dict1 的引用 对 dict1 的更改也会自动应用于 dict2 有多种方法可以复制字典 一种方法是使用内置的 copy 方法 示例 使
  • [机缘参悟-132] :《洞见》:为什么佛学是真的 -3- 冥想,洞见自己的内心

    目录 一 佛家修行的方法 二 冥想 2 1 冥想步骤 2 2 冥想的好处 2 3 冥想的方法 一 佛家修行的方法 佛教修行是指追求智慧 慈悲和解脱 以最终实现觉悟和解脱的过程 它包含了广泛的修行方法 以下是一些常见的佛教修行方法 冥想 冥想

随机推荐