在《人月神话》里看到引用的一篇论文,《没有银弹:软件工程的本质性与附属性工作》(英语:No Silver Bullet—Essence and Accidents of Software Engineering), 这是IDM工程师的一篇关于软件工程的经典论文. (论文链接: http://www.cs.unc.edu/techreports/86-020.pdf)

该论文中强调由于软件的复杂性本质,而使真正的"银弹"并不存在;所谓的"没有银弹"是指没有任何一项技术或方法可使软件工程的生产力在十年内提高十倍。好了, 看看这篇论文摘要.

所有软件创作都包括了本质性工作(essential task)和附属性工作(accidental task)。前者是去创造出一种由抽象的软件实体所组成的复杂概念结构,后者则是用编程语言来表现这些抽象的实体,并在某些空间和速度的限制之下,将程序对应至机器语言。

现在,若跟本质性的工作相比,软件工程人员所做的事,还有多少算是花在附属性的工作上呢?除非附属性工作要耗费的心力超过全部工作的9/10,否则就算是将所有的附属性工作降至零,也无法将整个开发工作的轻松程度提升一个数量级。

因此,似乎是时候解决软件任务的本质性部分了,这部分涉及形成非常复杂的抽象概念结构。我建议:
- 开拓大众市场,避免构建可以购买的东西。
- 在建立软件需求时,将快速原型(rapid prototyping)作为计划迭代的一部分。
- 有组织地增长软件,为系统增加越来越多的功能运行,使用和测试。
- 确定并培养新一代的优秀概念设计师。

这篇文章的主要观点是: 把软件一分为二, 软件 = 本质性工作 + 附属性工作. 并且附属性工作的复杂性已经大大降低, 如今的程序员大部分时间都花在解决本质性工作.

我的观点

我觉得这篇论文有一定的道理, 大多数程序员, 至少就我而言, 编写代码的时间占用很少, 大部分时间都在思考解决问题的方式. 一旦处理问题的逻辑清晰下来, 接下来编码实现的速度是很快. 但是这篇论文并没有抓住软件开发的重点: 文章把软件开发的焦点集中在生产力上,也就是软件每单位的时间投入成本能得到多少输出效果. 比起关注生产力, 我更认同Caper Jones的观点: "Focus on quality rather than quantity and program will follow." (把重点放在质量上,生产力将随之而来).

从个人在公司开发软件的经验, 我们过去两三个月以及更多的时间, 都在修复旧的bug和优化原先的功能缺陷. 试想如果每个软件开发者都是认真负责的, 那整个项目的生产力会在一个新的台阶上. 正因为我们的代码库里存在太多不负责的代码, 这些代码大多并不是--编程技术上的bug(容易发现, 并且容易修正), 而是--实现上的敷衍(不容易发现, 并且不容易修正). 如果在编程时只是为了完成任务, 并没有为自己的代码抱有认真负责的态度, 那么这样的代码将在后续的维护和迭代升级中造成灾难.

引用王垠在《怎样尊重一个程序员》的一段话

如果你明白我在说什么,从今天起就对自己的代码负起责任来,不要再让其它人修补自己的BUG,不要再修补其他人的BUG

当我持有这样的观点时, 我就开始觉得《人月神话》这本书没有读下去的必要性了, 因为我们关注软件开发的侧重点截然不同.

软件开发的生产力vs质量的更多相关文章

  1. atitit.提升软件开发的效率and 质量的那些强大概念and方法总结

    atitit.提升软件开发的效率and 质量的那些强大概念and方法总结 1. 主流编程中三个最糟糕的问题 1 1.1. 从理解问题后到实现的时间很长 1 1.2. 理解和维护代码  2 1.3. 学 ...

  2. atitit.提升软件开发的生产力关健点-------大型开发工具最关健

    atitit.提升软件开发的生产力关健点-------大型开发工具最关健 1. 可以创作出更好的工具遍历自己 1 2. 大型工具包括哪些方面 2 2.1. ide 2 2.2. dsl 2 2.3.  ...

  3. 软件开发:速度 vs 质量

    程序开发项目进行过程中,通常会冒出这样的困惑:应该选择速度,还是选择质量?很多程序猿都会有偷懒的思维,觉得把一些摸不清头绪.不知道怎么写的代码片段去掉,可以节省很多时间,更早完成项目计划. 其实过去几 ...

  4. 高质量,高效率的多国语言软件开发(Web/PC/Mobile),使用接口约束/调用不同语言资源

    偶然间翻出了几年前写的一个小程序,把当时的资料整理整理分享一下. 当时为了给自己的软件实现多国语言功能,而开发的辅助工具:SE String Resource. 这是当时基于自己另一款 IDE 软件抽 ...

  5. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  6. 每一个人都懂得敏捷开发 (软件project), 为何产品开发的效率与质量还是这么的烂?

    敏捷开发(软件project)是 "设计" 出来的.不是 "学" 来的-- 很多人都一直在质疑敏捷开发能否提高效率与质量? 更有不少人以嘲讽.不屑的口吻看待软件 ...

  7. DevOps时代的软件过程改进探讨 杨振涛 云加社区 今天 作者:杨振涛,腾讯云TVP 本文从Jenkins,DevOps,云原生等视角探讨了软件过程改进在各个时代的挑战和价值,重新审视了SPI在软件开发和交付的效率和质量提升方面的意义

    DevOps时代的软件过程改进探讨 杨振涛 云加社区 今天 作者:杨振涛,腾讯云TVP 本文从Jenkins,DevOps,云原生等视角探讨了软件过程改进在各个时代的挑战和价值,重新审视了SPI在软件 ...

  8. 敏捷软件开发VS传统软件工程

    敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同 ...

  9. python基础之迭代器、装饰器、软件开发目录结构规范

    生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大 ...

随机推荐

  1. pdfium 代码执行流程

    1.FPDF_InitLibrary(NULL); CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess) {     i ...

  2. XML 配置文件,知识点

    namespace 属性:配置成接口的全限定名称,将 Mapper 接口和 XML 文件关联起来: select 标签的 id 属性值,对应定义的接口方法名. insert 标签的属性 paramet ...

  3. python27期day09:函数的初始、函数的定义、函数的调用、函数的返回值、函数的参数、作业题。

    1.函数的作用:封装代码.大量的减少了重复的代码. 2.全局空间:顶行写的就是全局空间. 图解 : 3.函数的定义: def 是一个关键字.申明要定义一个函数 my_len 函数的名字.遵循变量命名的 ...

  4. LG4819/BZOJ2438 「中山市选2011」杀人游戏 Tarjan缩点+概率

    问题描述 LG4819 BZOJ2438 题解 发现如果有一些人之间认识关系形成环,只需要问一个人就能把控整个环. \(\mathrm{Tarjan}\)缩点. 缩点之后所有入度为\(0\)的点,必须 ...

  5. 基于OpenVINO的多输入model optimizer(Tensorflow)

    Step I:下载预训练模型 wget -O - https://github.com/mozilla/DeepSpeech/releases/download/v0.3.0/deepspeech-0 ...

  6. struct和class内存大小的计算

    以下均是在VS2017下的结果 结构体内存大小的计算: 用例一: #include<stdio.h> union ss { int a; char b; }; struct MyStruc ...

  7. Spring Cloud Gateway的全局异常处理

    Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求. 网关都是给接口 ...

  8. @PostConstruct、@Autowired以及构造函数的执行顺序

    结论先行:构造函数 -> PostConstruct -> @Autowired 依次执行 由于项目需要启动时加载一个配置信息,所以想到了用@PostConstruct,如下所示: @Co ...

  9. 国家虚拟仿真实验教学项目共享平台(实验空间)PHP SDK

    使用XJWT标准,此标准基于JSON Web Token (JWT)开发.XJWT包含三个参数:header, payload, signature,因此生成token就要先获得这三个参数. clas ...

  10. 基于opencv+python的二维码识别

    花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...