在过去的20年中,真的没有一件事可以带来巨大的软件开发收益吗?[关闭]


45

Fred Brooks 在《No Silver Bullet》中对软件工程的未来做出了各种预测,最好的总结是:

无论是技术还是管理技术,都没有一个单独的发展可以使生产率,可靠性和简单性提高甚至一个数量级

他的论点很有说服力。布鲁克斯在1986年写作:他是对的吗?2014年的开发人员生产软件的速度是否比1986年的开发人员快10倍?通过某种适当的指标-生产力的提高实际上有多大?


4
评论不作进一步讨论;此对话已转移至聊天
世界工程师

Answers:


58

2014年的开发人员生产软件的速度是否比1986年的开发人员快10倍?

我可以想象,自那时以来,生产率至少提高了一个数量级。但是,不能通过单一技术或管理技术来开发。

多种因素共同导致了生产率的提高。注意:这不是完整的列表:

  1. 更好的编译器
  2. 功能更强大的计算机
  3. 智能感知
  4. 面向对象
  5. 功能定位
  6. 更好的内存管理技术
  7. 边界检查
  8. 静态代码分析
  9. 强大的打字
  10. 单元测试
  11. 更好的编程语言设计
  12. 代码生成
  13. 源代码控制系统
  14. 代码重用

等等。所有这些技术结合起来可以提高生产率。没有一个银子弹可以产生一个数量级的加速。

请注意,其中一些技术自60年代就已经存在,但是直到最近才得到广泛的认可和采用。


15
不要忘记更好的源/版本控制系统。
Doval 2014年

7
嗯对 我想我们可以在此列表中再添加十二(或一百)个东西。
罗伯特·哈维

44
@ user61852:因为期望总是超过现实。
罗伯特·哈维


1
@RossPatterson:至此,我们已经基本满足了开发人员工具的需求。这些天,我们甚至在通过编译CPU周期来做愚蠢的浪费事情,因为我们可以--查看模板元编程。请记住,我们正在与80年代进行比较;那时我当然不是开发人员,但我确实学会了在1990
制造

71

罗伯特·哈维(Robert Harvey)的回答很好,但是我认为他没有提到程序员比以往更高效的最大原因:软件库的广泛可用性。

当我开始我的职业生涯时,没有STL,.NET,QT等。您拥有原始的C或C ++,仅此而已。

现在可以用几行C#代码完成过去需要数天或数周才能完成的工作(XML解析,TCP / IP连接,HTTP通讯)。在这方面,我们在整体开发人员的生产率方面提高了几个数量级。

我们当前的产品使用从供应商处购买的对接窗口框架。这让我在几分钟内就拥有了功能齐全的停靠窗口UI。我不禁思索在使用win32 API的日子里需要做什么。


19
我将在此添加文档和帮助的可用性。二十年前,您有一个邮件列表和您的直属同事。现在,几乎可以通过单个界面立即获得世界各地几乎所有主题的编程专业知识。
2014年

15
@NWard,所以基本上是堆栈溢出=)
克里斯(Chris

2
@tmyklebu people just found other (generally better) solutions[需要引用]。使用库快速解析XML的“山脉”比手工编码独特的解决方案要好得多。XML当然可以过于简洁和重复,但是在大多数情况下,库使使用它变得轻而易举。
WernerCD 2014年

5
@tmyklebu解析大量XML可能会很痛苦,请尝试以未记录的专有格式来解析大量二进制数据,就像大多数大约1986
。– James_pic 2014年

2
@tmyklebu一天没有人需要千兆字节的东西(甚至兆字节!)。生成大量XML的事实是,我们存储和跟踪的数据比以往任何时候都要多。james_pic是正确的,XML比拥有成千上万的专有二进制格式要好得多。XML可能比较冗长,但是它是跨平台的,易于阅读且高度灵活的。这些都是有价值的特征。

62

为了争辩,我不同意弗雷德·布鲁克斯的主张

技术的进步使互联网的生产力仅得到了一个数量级的提高,更确切地说是最近二十年来每个家庭中互联网连接的逐步可用性。

能够立即找到开发人员遇到的几乎所有问题的答案,从而极大地提高了生产率。不知道如何在JQuery中选择第n个元素?Google搜索会导致有关Stack Overflow的确切问题的答案。不知道如何overflow在CSS中使用?Mozilla的MDN在这里。忘记了virtualC#中的关键字含义?Google再次提供帮助

开始编程时,我没有互联网。我有书籍,以及一些本地存储的数字格式文档,但是搜索书籍和文档是一个缓慢的过程,无论我有多少本书,这里都没有提到很多问题。

更重要的是,您遇到的几乎所有问题以前都已经被别人遇到过。Internet可以帮助找到出现此错误并成功解决此错误的人。这不是您在书籍或MSDN等官方文档中找到的信息。相反,通常会找到以下信息:

  • 显然,在堆栈溢出时。例如,我还没有看过任何提到此问题的书。

  • 在博客中。当我遇到特殊问题时,我在博客上找到了很多帮助,例如WCF配置或无法启动的代理服务器,或者在具有不同于en-US的文化的机器上使用特定API时出现的神秘错误。

  • 在有关开源软件的错误报告中。例如,最近当我尝试使用Ubuntu的MAAS和使用PXE时,这非常有用。您也不会在书中找到这种信息。

如果我们考虑到团队在项目上花费的大部分时间都花在了维护项目上,那么立即获得人们可能遇到的大多数问题的答案的重要性就特别明显。

  • 在架构和设计阶段,Internet并没有太大帮助(Programmers.SE可能会有所帮助,但对于建筑师而言,阅读有关架构和设计的书籍,学习设计模式等将具有更大的价值)。

  • 当出现实际问题时,它在测试和实施步骤期间开始很有帮助。

  • 但是大多数问题是在维护过程中出现的,当其他人通过互联网寻求帮助时就显得至关重要。基本示例:WCF服务在我的计算机上运行良好,但在过去两个星期中都正常工作时,无论在生产环境中部署时都无一例外地失败。这发生在我身上,我感谢博客作者和Stack Overflow社区帮助我在几小时而不是几周内解决了这个问题。

是否有理由将生产率提高10倍?很难说。

  • 一方面,在某些情况下,您可能会花几天时间独自寻找答案(或者被迫重写应用程序的很大一部分),但立即找到答案。

  • 另一方面,基于多个因素提高了整体生产力,例如更好的项目管理(想到敏捷,TDD等),更好的团队管理(想到了Stephen Denning的Radical Management),更好的工具(调试器,分析器) ,IDE等),更好的硬件(不,如果为了慢速的CPU和非常有限的RAM而被迫在Assembler中编写,我的效率将不高),等等。


4
“互联网”也不是一个单一的发展。
Ben Voigt 2014年

1
@BenVoigt:从布鲁克斯的名言中,我认为它是一项技术。但是我同意,这些术语可能并不明显:首先是互联网(1980年代初期)还是万维网(1989)?其次,不仅技术本身是必不可少的,而且其受欢迎程度也很高。
2014年

但是我们在“ Internet”概念下堆积的东西涉及许多不同的技术。万维网(DHTML / Javascript /浏览器)有很多代。光纤的进步使数据中心规模的连接成为可能。CMOS工艺进行了改进,允许服务器拥有TB的RAM并执行数据挖掘。该算法可为一百万个有关编程的问题建立索引,并提供某种自然语言意义上最接近的10个匹配项。
Ben Voigt 2014年

5
使用Brooks设计的系统的人不需要Google记住如何编写JCL。这些系统附带了有据可查的开发环境,这些环境在过去的几十年中一直得到不断利用/逐步改进。不管是由于计划的过时,还是由于险恶的事情,我们都远离了。无论如何,我总是犹豫不决地称我们现在有了改进,并且完全不愿意将其称为“银弹”。
user1172763

复杂性是敌人。您可以将JCL握在手中,然后将手册握在手中。一个架子可以记录整个系统。现在,系统的大小及其潜在的变化率发生了巨大的爆炸。
pjc50

13

我会说互联网是一个很好的候选人。StackOverflow和Google是当今开发人员最强大的工具。在全球范围内即时共享知识!如今,您不需要知道答案,只需要知道如何了解答案即可,这是一个非常合适的替代品,可让开发人员花费更少的时间阅读和更多的代码,从而提高工作效率。这意味着世界上每个程序员都可以使用所有答案,而他们所要做的就是知道如何提出正确的问题。


您是唯一指出银弹的人。它不仅使程序员的工作量提高了一个数量级,而且实际上使多个数量级的生产率提高了。
Dunk 2014年

+1000-您可以在几分钟内获得帮助,而不是为一个晦涩的问题花几天时间。
jqa 2014年

7

我建议将趋势拉向另一个方向(即降低生产率)的趋势至少与您所询问的趋势一样强大。使用客户端/服务器开发工具(如VB6或PowerBuilder)的经验非常接近“快速应用程序开发”(RAD)的理想。您必须绘制表格,并且过程或SQL代码有明显的钩子。

至少在最初,Web开发破坏了使这些事情成为可能的许多技术和基础架构,许多客户/服务器开发人员只是停止了他们的开发工作,或者拼命拥护VB6。

向大量客户端驱动的Web开发的过渡是又一次刀耕火种的经历。微软通过WebForms回到RAD的理想状态,然后很快就失宠了。取而代之的是,期望开发人员滥用基础结构(例如,很少用于XML的XMLHttpRequest),否则会以较低的抽象级别来回避,以使他们的网站更具交互性

所有这些转换背后都有充分的理由,将产生本机.EXE的过程(需要在单个客户端上进行安装和管理)与Web开发进行比较是不公平的,而将高度依赖的过程进行比较也很不公平。在回发上产生更无缝的体验。但是,我要说的是,当前正在流行的实践导致错过了客户端/服务器,RAD等功能的人们中某些出乎意料的低级思考过程。客户端/服务器按钮仅起作用,当然不必担心底层数据通道会将数据发送到使事件发生的事件处理程序。

相反,更多的当代开发人员倾向于认为我们中那些进行客户端/服务器开发(甚至基于回发的Web开发)的人倾向于诉诸捷径(并且以一种不好的方式表示)。这是可以理解的,但我仍然认为当代发展的方式出奇的低水平,寻找“银弹”的时代似乎已被嘲笑那些质疑采矿和采矿业智慧的我们时代所取代。冶炼自己的铅。


你看过Meteor.js吗?
凌晨

2
@strugee是的,我认为Meteor.js可能是朝正确方向迈出的一步。不过,事实上,自从Brooks撰写他的书以来,我们在技术上至少已经“重新开始”了至少3-4次(这里指的是过渡到PC,然后是客户机/服务器,然后是Web,然后是AJAX可以说是使我们无法找到“银弹”,甚至无法使生产率线性提高的原因。时间将证明当前的开发技术可以持续(和改进)多长时间。有一些乐观的理由……每个人现在都在寻求一个强大的跨平台观点。
user1172763

5

技术已经非常进步,现在我们有了Robert Harvey在他的回答中列举的所有内容,但是:

  • 问题似乎正在改变需求。客户知道,在更改软件项目的需求时不会浪费材料,而是这样做。一旦像建筑物这样的物理世界项目完成了一半,这种需求变化几乎就不会发生。

  • 另一个重要方面是编程仍然是高度手工的工作。很少(如果有的话),RAD生成的代码无需首先手动修改即可投入生产。

  • 代码仍然非常复杂,并且新技术似乎并没有减少这种复杂性。

  • 截止日期未达到或超出预算的比率继续高于其他学科,并且经常发生技术债务以偿还它们,从而产生了隐性成本。

  • 毫无疑问,发生了部分隔离。人们必须知道的大量技术使得程序员不得不专门化少量技术才能真正熟练使用它们,这需要不同种类的专家来完成一个大型项目。

  • 关于软件复杂性的一件事是,尽管世界上实际上有数百家汽车制造商,但是可以用手指来计算能够创建和维护操作系统(台式机,移动,嵌入式或其他)的公司列表。你的手。

  • 以上所有情况造成了这样一种情况,即没有足够的人学习成为程序员,因此政府发起了竞选活动,以激励更多的学生走上这一职业道路。

  • 软件行业的成熟度之一是,软件许可继续声明“ <companyX>不表示该软件对于任何特定目的的适用性。它按“原样”提供,没有明示或暗示的担保。” 想象一下,一家硬件制造商指出他们的产品不适合任何特定目的。这就是目前的最新水平。


2
当然,有十多家公司能够创建和维护自己的操作系统,但很少有人选择这样做,因为其他机会更有利可图。
Ben Voigt 2014年

@BenVoigt当然,由于复杂性的提高,创建和维护操作系统的利润相对较低,需要数十年的研究和开发。为了拥有当今的成熟产品,他们最迟应该在90年代开始研究和开发。
图兰斯·科尔多瓦

1
此外,投资回报率的“回报”面也不是很好,因为市场已经饱和。
Ben Voigt 2014年

2
当然,您要做的只是列举众所周知的有效编程障碍,这些障碍自洛夫莱斯夫人(Lady Lovelace)拿起铅笔后不久就出现了。与30年前不同的是,事情已经变得更加复杂。
Daniel R Hicks

4

尽管有人可能会用特定的指标争论(即,事情是否改善了9.98倍?),但我(作为老朋友讲)必须同意布鲁克斯评论的总体观点。

首先,自1970年以来,几乎没有发明任何真正的新技术。是的,集成电路的长度,高度,宽度越来越小,玻璃纤维提高了通信速度,但向前迈出的每一步都有。

与1970年相比,编译器技术使程序员的“生产率”提高了大约十倍,而1970年的数字函数除以实际的编码时间,但是新的或“修订的”编程语言和环境的泛滥意味着普通程序员的支出越来越多时间处于“追赶”模式,而生产活动减少。苹果,谷歌和微软都对其环境进行了新的,实质上不兼容的“升级”,其速度恰好会激起其农奴,编程客户的反抗。同样,HTML / CSS / Javascript /任何事物都会变得越来越复杂。

一次,文档的产生和传播速度会限制和破坏所有这些“创新”,但是,由于有了Internet,实际上不再需要严格的文档了-只需散发出功能并依靠博客来找出细节并提供它们。

补充: 我从昨天开始一直在考虑这个问题,尤其是考虑我从1978年到2008年从事的项目。该项目(IBM System / 38及其后续产品)从一开始就是以控制软件的复杂性(一种是将软件分为两个大致相等的部分,它们之间具有“机器”接口)。在我工作的特定领域,我的几个同事同样致力于控制复杂性(尽管当时我们并没有太多使用该术语)。结果是(最初)产品非常健壮,并且从git-go中获得客户的好评。继续工作是一种乐趣,就像在训练有素的乐队中演奏一样。

当然,这些年来,复杂性逐渐兴起,通常是由于市场规划者和经理不愿控制复杂性(这在某种程度上不同于保持简单性)而引起的。我不认为这是不可避免的,但是在这种情况下,如果没有经理(像格伦·亨利本来那样)阻止混乱局面,就无法避免。


2
但是让我想起了20到30年前我(以及无疑许多其他人)发生的事情-有一种彼得编程原理(或者也许是热力学编程的第二定律)指出复杂性不可避免地增加到难以理解的观点。事情简单不过了。
Daniel R Hicks

3

在过去30多年的时间里,我们在软件工程实践中学到的很多东西都具有以下形式:“技术X可以加快新软件的初始开发速度,但是如果您不花太多或更多的时间思考如何以及如何从长远来看,什么时候使用它可以节省您的应用程序,从长远来看,它将使您的应用程序陷入技术债务的泥潭,从而使您花费大量的时间和精力进行维护。”

属于这种剃须刀的技术包括:手工编码的汇编语言,编译器,解释器,过程库,命令式编程,函数式编程,面向对象的编程,手动内存分配,垃圾回收,静态类型,动态类型,词法范围,动态范围,“安全”指针,“不安全”指针,缺少作为语言概念的指针,二进制文件格式,结构化标记文件格式,宏,模板,避免使用宏和模板,共享内存,消息传递,线程,协程,异步事件循环,集中式远程服务,分布式服务,本地安装的软件,阵列,链表,哈希表和树。

上面列表中的许多项目分组在一起消耗了已知的解决方案空间这一事实是非常有意的,它本身应该告诉您一些信息。有人可能会说,自从他们第一次打开Z3以来,我们在实践上唯一明确的,全面的改进就是块结构化编程(与意大利面条式代码相对)和内存保护(男孩,我可不会错过)打字错误可能会使我的整个计算机瘫痪的日子)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.