作者:Jeremy Mikkola

链接:https://sourl.cn/VLYUZZ

前言

软件开发为什么如此之难?本文认为这种困难与编程语言无关,因为现代的编程语言已经足够好了。那么,原因到底是什么?

有一种观点认为,使用更好的编程语言就会让软件开发变得更容易、更高效。在汇编或 Fortran 时代,这种观点无疑是对的。然而,现代的编程语言已经足够好了,目前的主要困难和改进机会出现在其他方面。编程仍然很难,但导致这种困难的原因却与所使用的编程语言无关。

安达尔定律

当你有一系列需要完成的连续性任务时,安达尔定律就会发挥作用。安达尔定律告诉我们,通过加快其中的一个任务来加快整个系列任务的速度是有硬性限制的。

例如,烧开水需要 10 分钟,然后煮意大利面也需要 10 分钟。即使你能够找到一种可以更快把水烧开的方法,你做一顿饭的时间也绝对不会少于煮意大利面所需的 10 分钟。

一般的公式是这样的,如果某项任务的总时间占比是 p,那么你永远都无法获得大于 1/(1-p) 的加速。假设任务的一部分占用了 90% 的时间,那么 p=0.90,将这个部分优化到零时间,将使整个工作速度提高 1/(1-0.90)=10 倍。

安达尔定律的关键点在于,你所能获得的加速受到了你所优化部分的大小限制。

编程之所以困难,原因有很多。为了简单起见,我们可以把困难的事情想象成必须按顺序完成的任务。毕竟,人类并不擅长多任务处理。在任意一个时刻,你要么在使用构建工具,要么在阅读文档,要么在编写代码或者参加会议。你一次只能应对一项任务,所以安达尔定律大致适用。如果你设法将构建时间降到零,那么项目的完成时间也只会短一点点。你的效率仍然受限于完成项目所需的其他事项。

过去,把一个程序翻译成计算机可以运行的东西是非常困难的。很久以前,需要先将程序转成 1 和 0,然后再一个一个地输入到计算机。我不知道这需要花费多少时间,但为了便于讨论,我们假设需要占用 90% 的时间。这意味着,如果有一种更好的方式来告诉计算机该做什么(比如 Python),那么编程效率将提高 10 倍。

现在,我们有了更好的编程语言,可以花更少的时间告诉计算机该做什么,生产力得到提升。将程序转成代码不再需要 90% 的时间,现在只需要 10% 的时间。这意味着我们可以从中获得的最大改变是 1.11 倍,这比以前可以获得的加速少 81 倍!

这是因为软件开发其余的 90% 任务都是困难的任务,一个更好的编程语言不会让它们变得更容易。

如何做到“没朋友”

我的意思是,编程的难度与编程语言无关。为了理解其中的原因,我们先假设不需要操心与计算机相关的东西,你只需要告诉你的朋友要做些什么。你不能作弊,不能让他们依赖常识性的东西,你必须替他们做出所有的决定。

你会发现,你需要花很多时间来解释背景。你的朋友需要了解计算机程序要处理的东西在现实世界中是怎样的,以及程序应该要做什么。你需要解释各种缩略词和术语,需要讨论一些外部因素。

你的朋友需要知道所有可能出现的情况,有大量的小细节需要处理,例如用户不能在购物车中输入负数个产品。用户可能会尝试做出所有可能的行为,会发生各种可能的事情,例如包裹在运输过程中弄丢了,你会发现有大量的边界情况需要告诉你的朋友。

向你的朋友解释这一切是很困难的。首先,你需要了解与项目相关的所有现实世界的细节 (产品可能缺货,可能有折扣,等等)。其次,你需要做出程序在各种可能的情况下应该做什么的决定。第三,你需要以一种你的朋友能够理解的方式与他们交流。这意味着你需要组织好你的想法,让它们易于理解。如果你写过文章或博客,你就会知道传达大量的信息并不是一件容易的事情!

请注意,到目前为止,这些任务都还没有涉及计算机,当然也就不涉及编程语言。了解现实世界,了解程序应该做什么,以及如何组织这些想法,这些都是非常困难的任务。

描述与规范

这里有一个容易就掉进去的陷阱,人们很容易忽略描述与规范之间的区别。例如,当你做出一个描述 (“一辆红色的汽车”),你可以测试一个东西是否符合这个描述 (“是的,它是红色的,但它不是一辆汽车”),但这不足以告诉你如何制造一辆汽车,因为制造汽车需要制造汽车的规范。

创造出一样东西需要做很多决定。如果你把每一个决定的结果都写下来,就有了一个(未组织的)规范。开发程序需要你做出这些决定,所以仅仅进行描述是不够的——你需要一个规范。当你做出一个描述 (“它需要把文件列出来”),认为它就是一个规范,却忽略了你还需要做出其他无数个细小的决定 (“它应该以什么顺序列出文件?它们应该按照自己的路线走下去吗?”)。

当你要开始写一个程序时,你不得不面对这样的现实,即你的规范实际上只是描述而已。电脑不会接受类似“画一个矩形”这样的描述,它需要知道矩形应该出现在屏幕的什么地方,应该多大,应该是什么颜色的。将想法变成代码,你还需要做出很多决定,而做出这些决定需要付出很大的努力。人们倾向于将这种努力归咎于编程语言,却不愿承认这样一个简单的事实:仅给出描述是很难得到规范的。

回到计算机上来

开发软件不仅仅是理解要做什么并将其转化为代码。计算机本身存在一些问题,这些问题也需要程序来解决。程序要能够在硬件和网络上快速运行,可能需要处理机器故障,而工具和协议的复杂性带来了更多问题。这些问题并非是在向计算机解释应该做什么的过程中造成的,它们都是原本就需要做出解释的事情。

你需要在脑子里“运行”部分程序。有时候,逻辑就像听故事一样容易理解,但有时候,事件顺序和状态跟踪复杂到无法放在脑子里。获得运行正确的程序——或者纠正它们不正确的行为——需要了解程序在各种情况下的状态。

写代码可以将你对程序的想法具体化,但程序不会保持一成不变。你会发现 bug,想要新的特性,需要改变现有的行为。一个解决方案在一开始可能行得通,但这并不意味着它将一直是可行的。最终,你需要花时间去预测未来,去收拾烂摊子,你会不可避免地发现自己并没有“千里眼”。

康威定律

如果你自己不写程序,就需要和其他人一起工作,这带来了一系列全新挑战。

所有参与项目的人都必须以某种方式组织起来,每个人都有自己的工作要做。你不希望人们互相妨碍,所以必须分工。合理的分工要求你对程序的结构有很好的理解,这个时候康威定律就发挥作用了。

如果你有多个团队,事情就会变得更加困难。每个团队都有不同的目标,因此会针对不同的事情进行优化。对其他团队有利的决定可能会阻碍你完成工作。了解其他人的立场,并找到一个好的妥协方案,这是一项艰难的任务,但你必须完成。

在大项目中,不可能有哪个团队(更不用说哪个人)能了解所有的东西,但你仍然需要弄清楚如何设计系统的各个部分,并让这些部分相互配合,这比你自己做出整个设计要困难得多。

“打破”定律

我们可以尝试找到安达尔定律无法发挥作用的地方。如果个体任务的速度不是完全独立的——如果你可以通过优化一个任务来加快另一个任务——那么就有可能找到对你有帮助的解决方案。

更好的编程语言和开发环境可能是我们可以加以利用的地方。如果程序可以由更少的人来开发——比如说两个人,而不是一个团队,或者一个团队,而不是一个部门——那就可以大大地减少组织方面的开销。如果你自己实现接口所有的代码,就不需要通过开会来决定如何设计接口。效率的提升不仅会降低编写代码的成本,还会改变工作的形式,从而降低其他任务的成本。也就是说,这里的限制变成了你可以在这条路上走多远,因为一个程序员不可能把所有跟实现业务相关的东西都装进脑子里。

迭代速度是另一个可以加以利用的杠杆。为了开发一个程序,你需要了解这个领域的问题和需要做出哪些决定。为了完成这些任务,你需要把收集到的所有细节都装到脑子里,然后形成一个心理模型。这是一种可行的方法,但可能不是最有效的方法。另一种方法是基于某些明显的细节建立一个小的心理模型,然后根据这个模型创建一个小程序来测试这些想法是否符合现实,并根据反馈进行迭代,每次都创建出更丰富和更准确的模型。这似乎更适合人们实际的学习方式。为了让这种方法奏效,你需要能够快速测试想法并获得反馈。理想的状态是,在你完成输入后,新代码就可以开始运行。通过改变开发环境来实现更快的迭代周期,将使开发人员从第一种方法转到第二种方法,帮助他们更好地理解问题。

一种表达能力更强的编程语言是否能有效地提高生产力,对于这一点我并不是特别乐观。我希望的是能有更好的开发环境。如果我们有更好的工具来理解现有的代码,有更快的开发迭代周期,繁琐的工作变得更少,就可能会改变软件的开发方式,并以一种复合而非递减的方式给我们带来回报。


为什么软件开发很难?真相了相关推荐

  1. 为什么软件开发很难?真相了!!

    点击关注下方公众号,Java资料 都在这里 作者:Jeremy Mikkola 译者:王者:策划:万佳 正文如下: 软件开发为什么如此之难?本文认为这种困难与编程语言无关,因为现代的编程语言已经足够好 ...

  2. 为什么软件开发很难外包

    " 很多公司和团队选择把整个软件项目或项目中某些模块或过程(比如测试)整体外包给另一家公司或团队.本文将和你一起来探讨为什么公司或团队有外包的冲动,为什么项目外包问题多和我对外包的建议.&q ...

  3. 为什么软件开发这么难?

    [CSDN 编者按]"学不动了.太难了!",有不少徘徊于程序员这一职位门口以及想要进阶提升的从业者直呼道.对此,我们不禁好奇,软件开发这一行业迭代了多年,为何还是这么难,究竟是编程 ...

  4. 印度软件水平为什么世界第一_第1部分:为什么现实世界中的软件需求很难

    印度软件水平为什么世界第一 这是我 过去几年 与 Healthforge 团队一起在医疗保健领域开发软件的经验系列文章中的第一 篇 . 在大多数时间里,我们一直与欧洲,北美和澳大利亚的主要中心以及全球 ...

  5. 干货|软件开发,小步真能快跑吗?

    点击上方"中兴开发者社区",关注我们 每天读一篇一线开发者原创好文 作者简介 作者乐攀是非常优秀的程序员,有10多年的程序设计和开发经验,近年来致力于敏捷软件开发管理和技术实践的落 ...

  6. 为什么这么多人觉得前端开发很难做下去?

    无论是新手还是几年的前端开发程序员,都会又这样的经历:当学习了一种前端技术的时候,同时会有几种新的前端技术诞生. 还有,你选择的那种前端技术,也许已经过时了. 在抱怨过后,会继续去学习新技术,或者慢慢 ...

  7. 小程序开发工具中黑马优购小程序tabs组件_还觉得小程序开发很难?这几款小程序开发工具小白都能用哦!...

    玩过H5,微海报,直播之后-紧跟时代潮流的品牌公关狗们总是会在第一时间去研究时下最in的营销工具.而自从微信小程序公测之后,很多小伙伴也是中毒不浅,但是在技术开发的问题上,却不知道该如何下手.作为不会 ...

  8. 小程序开发工具_还觉得小程序开发很难?这几款小程序开发工具小白都能用哦!...

    玩过H5,微海报,直播之后-紧跟时代潮流的品牌公关狗们总是会在第一时间去研究时下最in的营销工具.而自从微信小程序公测之后,很多小伙伴也是中毒不浅,但是在技术开发的问题上,却不知道该如何下手.作为不会 ...

  9. 华为机试——软件开发机试真题2020.04.29

    1.获取字符串排列组合数量 题目描述: 输入:字符串 输出:该字符串中的元素能够排列组合成的最多的数目 例如:输入abc,能够排列abc  acb  bac bca  cab cba六种 输出:6 当 ...

最新文章

  1. Session 详解
  2. 最新DynamipsGUI2.8[模拟器]发布!(中文版-英文版下载)
  3. 视觉与机械手标定系统技术解决方案
  4. MySQL replace()函数的使用
  5. 用python实现自己的小说阅读器
  6. php保存复制粘贴的网页内容,JS实现网站内容的禁止复制和粘贴、另存为
  7. 卡函数or1200基于simple-spi的SD卡驱动
  8. [转] 各种数据类型转换
  9. latex 可视化生成表格代码
  10. android 排队系统设计,基于android银行排队叫号系统毕业设计论文+设计源码+答辩PPT...
  11. VS2005 安装 WTL80
  12. 市场的各大TWS蓝牙耳机芯片方案汇总
  13. hadoop容错性(详解版)
  14. zabbix 5.0所有依赖包_开源的Zabbix报表系统ZbxTable正式发布!
  15. 微信小程序iphone7设备下跳转h5页面失败,h5页面显示白屏,加载报错,其他页面正常显示
  16. outlook2013配置
  17. LAMP环境和wordpress站点搭建
  18. 如何做一名好的软件开发的销售精英
  19. python求多叉树任意两点之间的距离
  20. linux shell求最大公约数,shell求最大公约数

热门文章

  1. 基于ROS的Most Stars开源代码汇总(自动驾驶汽车+RGBDSLAMv2+ROS2+人识别与跟踪等)
  2. 计算机无显示错误代码,电脑出现错误代码0xc0000001怎么办 电脑出现错误代码0xc0000001如何解决...
  3. 指纹模块原理_光学指纹模块原理
  4. labelme使用教程(实用版)
  5. 原型prototype
  6. 第31届南京地区研究生通信年会录用论文集
  7. 如何有效地解决校园网络IP地址冲突问题
  8. 更新 MatterMost 7.1.2 至 7.10.0
  9. 常见的隔离RS485方案盘点
  10. 三相整流器移相触发电路的整体FPGA设计