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

2023-11-06

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

作者:Jeremy Mikkol
本文认为这种困难与编程语言无关,因为现代的编程语言已经足够好了。那么,原因到底是什么?

  1. 有一种观点认为,使用更好的编程语言就会让软件开发变得更容易、更高效。在汇编或 Fortran
    时代,这种观点无疑是对的。然而,现代的编程语言已经足够好了,目前的主要困难和改进机会出现在其他方面。编程仍然很难,但导致这种困难的原因却与所使用的编程语言无关。
  2. 安达尔定律当你有一系列需要完成的连续性任务时,安达尔定律就会发挥作用。安达尔定律告诉我们,通过加快其中的一个任务来加快整个系列任务的速度是有硬性限制的。例如,烧开水需要 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%任务都是困难的任务,一个更好的编程语言不会让它们变得更容易。# 如何做到“没朋友”我的意思是,编程的难度与编程语言无关。
  3. 为了理解其中的原因,我们先假设不需要操心与计算机相关的东西,你只需要告诉你的朋友要做些什么。你不能作弊,不能让他们依赖常识性的东西,你必须替他们做出所有的决定。你会发现,你需要花很多时间来解释背景。你的朋友需要了解计算机程序要处理的东西在现实世界中是怎样的,以及程序应该要做什么。你需要解释各种缩略词和术语,需要讨论一些外部因素。你的朋友需要知道所有可能出现的情况,有大量的小细节需要处理,例如用户不能在购物车中输入负数个产品。用户可能会尝试做出所有可能的行为,会发生各种可能的事情,例如包裹在运输过程中弄丢了,你会发现有大量的边界情况需要告诉你的朋友。向你的朋友解释这一切是很困难的。首先,你需要了解与项目相关的所有现实世界的细节
    (产品可能缺货,可能有折扣,等等)。其次,你需要做出程序在各种可能的情况下应该做什么的决定。第三,你需要以一种你的朋友能够理解的方式与他们交流。这意味着你需要组织好你的想法,让它们易于理解。如果你写过文章或博客,你就会知道传达大量的信息并不是一件容易的事情!请注意,到目前为止,这些任务都还没有涉及计算机,当然也就不涉及编程语言。了解现实世界,了解程序应该做什么,以及如何组织这些想法,这些都是非常困难的任务。#
    描述与规范这里有一个容易就掉进去的陷阱,人们很容易忽略描述与规范之间的区别。例如,当你做出一个描述
    (“一辆红色的汽车”),你可以测试一个东西是否符合这个描述
    (“是的,它是红色的,但它不是一辆汽车”),但这不足以告诉你如何制造一辆汽车,因为制造汽车需要制造汽车的规范。创造出一样东西需要做很多决定。如果你把每一个决定的结果都写下来,就有了一个(未组织的)规范。开发程序需要你做出这些决定,所以仅仅进行描述是不够的——你需要一个规范。当你做出一个描述
    (“它需要把文件列出来”),认为它就是一个规范,却忽略了你还需要做出其他无数个细小的决定
    (“它应该以什么顺序列出文件?它们应该按照自己的路线走下去吗?”)。当你要开始写一个程序时,你不得不面对这样的现实,即你的规范实际上只是描述而已。电脑不会接受类似“画一个矩形”这样的描述,它需要知道矩形应该出现在屏幕的什么地方,应该多大,应该是什么颜色的。将想法变成代码,你还需要做出很多决定,而做出这些决定需要付出很大的努力。人们倾向于将这种努力归咎于编程语言,却不愿承认这样一个简单的事实:仅给出描述是很难得到规范的。#
    回到计算机上来开发软件不仅仅是理解要做什么并将其转化为代码。计算机本身存在一些问题,这些问题也需要程序来解决。程序要能够在硬件和网络上快速运行,可能需要处理机器故障,而工具和协议的复杂性带来了更多问题。这些问题并非是在向计算机解释应该做什么的过程中造成的,它们都是原本就需要做出解释的事情。你需要在脑子里“运行”部分程序。有时候,逻辑就像听故事一样容易理解,但有时候,事件顺序和状态跟踪复杂到无法放在脑子里。获得运行正确的程序——或者纠正它们不正确的行为——需要了解程序在各种情况下的状态。写代码可以将你对程序的想法具体化,但程序不会保持一成不变。你会发现
    bug,想要新的特性,需要改变现有的行为。一个解决方案在一开始可能行得通,但这并不意味着它将一直是可行的。最终,你需要花时间去预测未来,去收拾烂摊子,你会不可避免地发现自己并没有“千里眼”。#
    康威定律如果你自己不写程序,就需要和其他人一起工作,这带来了一系列全新挑战。所有参与项目的人都必须以某种方式组织起来,每个人都有自己的工作要做。你不希望人们互相妨碍,所以必须分工。合理的分工要求你对程序的结构有很好的理解,这个时候康威定律就发挥作用了。如果你有多个团队,事情就会变得更加困难。每个团队都有不同的目标,因此会针对不同的事情进行优化。对其他团队有利的决定可能会阻碍你完成工作。了解其他人的立场,并找到一个好的妥协方案,这是一项艰难的任务,但你必须完成。在大项目中,不可能有哪个团队(更不用说哪个人)能了解所有的东西,但你仍然需要弄清楚如何设计系统的各个部分,并让这些部分相互配合,这比你自己做出整个设计要困难得多。#
    “打破”定律我们可以尝试找到安达尔定律无法发挥作用的地方。如果个体任务的速度不是完全独立的——如果你可以通过优化一个任务来加快另一个任务——那么就有可能找到对你有帮助的解决方案。更好的编程语言和开发环境可能是我们可以加以利用的地方。如果程序可以由更少的人来开发——比如说两个人,而不是一个团队,或者一个团队,而不是一个部门——那就可以大大地减少组织方面的开销。如果你自己实现接口所有的代码,就不需要通过开会来决定如何设计接口。效率的提升不仅会降低编写代码的成本,还会改变工作的形式,从而降低其他任务的成本。也就是说,这里的限制变成了你可以在这条路上走多远,因为一个程序员不可能把所有跟实现业务相关的东西都装进脑子里。迭代速度是另一个可以加以利用的杠杆。为了开发一个程序,你需要了解这个领域的问题和需要做出哪些决定。为了完成这些任务,你需要把收集到的所有细节都装到脑子里,然后形成一个心理模型。这是一种可行的方法,但可能不是最有效的方法。另一种方法是基于某些明显的细节建立一个小的心理模型,然后根据这个模型创建一个小程序来测试这些想法是否符合现实,并根据反馈进行迭代,每次都创建出更丰富和更准确的模型。这似乎更适合人们实际的学习方式。为了让这种方法奏效,你需要能够快速测试想法并获得反馈。理想的状态是,在你完成输入后,新代码就可以开始运行。通过改变开发环境来实现更快的迭代周期,将使开发人员从第一种方法转到第二种方法,帮助他们更好地理解问题。一种表达能力更强的编程语言是否能有效地提高生产力,对于这一点我并不是特别乐观。我希望的是能有更好的开发环境。如果我们有更好的工具来理解现有的代码,有更快的开发迭代周期,繁琐的工作变得更少,就可能会改变软件的开发方式,并以一种复合而非递减的方式给我们带来回报。

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

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

为什么软件开发很难?真相了 的相关文章

随机推荐

  • 关于Eclipse的使用入门

    关于Eclipse的使用入门 1 了解Eclipse Eclipse是1999年IBM公司开发的基于Java的可扩展平台 2001年贡献给开源社区 Eclipse基金会管理 每季度更新一次 2 Eclipse中的workSpace工作空间
  • oracle数据库当中用户的创建,添加,授权,以及表的创建与表的简单介绍,以及在oracle数据库当中的约束以及约束条件的简单介绍

    系列文章目录 3条消息 oracle数据库简介 文章目录 系列文章目录 前言 一 用户的创建 1 1 创建命令 1 2 给予scott用户权限 1 3 以scott用户进行连接登录 二 表和表的设计原则 2 1 表的概念 2 1 1 表是从
  • (转)人工智能步入金融领域的主流玩法

    人工智能步入金融领域的主流玩法 2016 10 26 量化与对冲 资料来源 目前金融机构的主流玩法有四种 1 投资银行和卖方研究尝试自动报告生成 2 金融智能搜索 3 公募 私募基金在通过人工智能辅助量化交易 4 财富管理公司在探索智能投顾
  • telnet无效指令,telnet找不到命令

    在命令提示符下运行telnet 提示 telnet既不是内部命令 也不是可执行程序或批处理文件 telnet如何解决而不是内部或外部命令 实际上 在Windows7系统环境中 Telnet客户端缺省处于关闭状态 更改设定的步骤如下 1 单击
  • MySQL基础(四)----DCL

    目录 一 介绍 二 主要命令 2 1 GRANT 授权 2 1 1 对数据库授权 2 1 2 对数据库下某表的权限 2 2 REVOKE 撤销权限 2 3 DENY 拒绝权限 三 其他命令 拓展 3 1 CREATE LOGIN 创建登录名
  • matlab小波分解及小波包分解函数

    Wavelet Toolbox GUI Graphical User Interface waveletAnalyzer Start Wavelet Analyzer graphical user interface tools Wavel
  • JVM内存模型,栈,本地方法栈,程序计数器,堆,方法区,详细讲解

    1 栈 线程不共享 栈又称方法栈 线程私有的 线程执行方法是都会创建一个栈阵 用来存储局部变量表 操作栈 动态链接 方法出口等信息 调用方法时执行入栈 方法返回式执行出栈 在方法中声明的变量可以是基本类型的变量 也可以是引用类型的变量 1
  • JAVA-反射篇

    反射 一 反射是什么 二 反射的用处 三 如何使用反射 0 反射判断类型 1 反射相关类 2 通过反射获取类三种方式 3 通过Class字节码对象操作字节码文件 3 1 使用Class字节码对象实例化对象 3 2 反射获取类的修饰符 3 3
  • Qt 遍历 QTreeView 获取所有节点数据

    实现代码 model 为私有变量 QStandardItemModel model void ParamSettingDlg GetNode for int i 0 i lt model gt rowCount i QStandardIte
  • react---ant design pro----修改logo和title

    1 内容页的logo和tittle修改入口 如果想要直接干掉logo 需要在App tsx里面写这个 logo false 2 网页左边的logo和tittle修改入口 直接修改 地址 提前放好图片文件在public里面
  • WTL配置

    上几天下了一个VC 程序 使用VS2008打开直接编译 提示 fatal error C1083 无法打开包含文件 atlapp h No such file or directory 上网查了一下 说是没有配置第三方WTL库 WTL是什么
  • 基于docker安装gitlab

    采用docker镜像安装GitLab 3 2 1 简介 官网 https github com sameersbn docker gitlab 7 4 3之前版本 镜像里包含所有组件 7 4 3版本镜像里只包含核心组件 nginx sshd
  • 记一次生产环境踩过的坑

    欢迎访问个人博客 德鲁大叔撸代码 今天 自己负责开发的对账系统终于要上线了 激动又紧张 激动什么 完全个人开发的项目第一次走上线流程 甚是激动啊 紧张什么 对呀 就是因为第一次上线 所以怕出现什么不可预测的问题 毕竟公司会把上线成功率当做有
  • C语言-控制程序的输入输出并设置参数

    一 控制程序的输入输出c语言编写的小工具 操作系统会为其分配三条数据流 一个标准输入 一个标准输出 一个标准错误输出 1 用户也可以通过编写代码控制输入输出的数据流数量2 用户可通过操作系统的命令设置输入输出目标是屏幕还是文件 是键盘还是文
  • mysql分别获取已有数据date中的年月日

    感谢原问题回答者的分享 https zhidao baidu com question 217376525 html mysql数据库 test表中有一字段Date 类型为date 已有数据 如何分别获取其中的年 月 日 不是获得当前日期哦
  • ArcGIS小技术 —— 修改字段顺序的三种方法

    修改字段顺序的四种方法 数据字段如下 方法一 合并 方法二 追加 方法三 删除并按顺序重新创建字段 数据字段如下 方法一 合并 使用合并工具调整字段顺序 方法二 追加 1 创建一个新的数据 并且按照想要的顺序添加好字段 2 使用 追加 工具
  • 采用face_recognition进行人脸识别时,解决摄像头太远人脸太小导致无法检测的问题

    经测试发现 把图像resise放大后再进行人脸识别 可以识别出非常小的人脸区域 以上相片站在10米开外 分辨率300万的笔记本电脑上都可以识别 不过处理速度非常的慢 很卡 不知道换1080TI或者以上显卡能否提高效率 本来离摄像头不到1米的
  • 用ESP学习单片机之Arduino_Esp-32s获取2.8‘‘TFT LCD屏幕的触摸数据_ILI9341_SPI_XPT2046

    简介 点亮该屏幕的笔记 既然都能显示了 肯定要获取触摸位置啊 从实物图中可知该屏幕的触摸IC为XPT2046 Arduino IDE需配置esp32开发环境 开发板 ESP 32 触摸过程 这里实现的是触摸屏幕获取坐标 IO映射 TFT L
  • 医学知识-CT的窗宽窗位

    CT的窗技术 窗技术是CT检查中用以观察不同密度的正常组织或病变的一种显示技术 包括窗宽 window width 和窗位 window level 由于各种组织结构或病变具有不同的CT值 因此欲显示某一组织结构细节时 应选择适合观察该组织
  • 为什么软件开发很难?真相了

    为什么软件开发很难 真相了 作者 Jeremy Mikkol 本文认为这种困难与编程语言无关 因为现代的编程语言已经足够好了 那么 原因到底是什么 有一种观点认为 使用更好的编程语言就会让软件开发变得更容易 更高效 在汇编或 Fortran