Hi!请登陆

标梵问对于软件开发为什么会很难?

2021-2-23 35 2/23

为什么软件开发这么难?本文认为,这个困难与编程语言无关,因为现代编程语言已经足够好了。那么,是什么原因呢?

有一种观点认为,使用更好的编程语言将使软件开发更加容易和高效。在汇编或Fortran时代,这种观点无疑是正确的。但是现代编程语言已经足够好了,目前主要的困难和改进的机会出现在其他方面。编程还是很难,但是造成这个困难的原因和使用的编程语言无关。

对于软件开发为什么会很难

1安达尔定律

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

比如烧开水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%的软件开发任务都是比较难的任务,更好的编程语言不会让它们变得更容易。

2如何做到“没有朋友”

我的意思是,编程的难度和编程语言无关。要了解原因,我们假设你不需要担心电脑相关的事情,只需要告诉你的朋友该怎么做。你不能欺骗,你不能让他们依靠常识,你必须为他们做所有的决定。

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

你的朋友需要知道所有可能的情况,还有很多小细节需要处理,比如用户不能在购物车里输入负面产品。用户可能会尝试做所有可能的行为,各种可能的事情都会发生。比如运输途中丢失包裹,你会发现有很多边界条件要告诉朋友。

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

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

3说明和规范

有一个陷阱很容易掉入,很容易让人忽略描述和规范的区别。比如你做一个描述(“红色的车”),你可以测试某样东西是否符合这个描述(“对,是红色的,但不是车”),但这不足以告诉你怎么造车,因为制造一辆车需要制造一辆车的规格。

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

当你开始写一个程序的时候,你必须面对这样的现实,你的规范实际上只是一个描述。电脑不接受“画一个长方形”这样的描述。他们需要知道矩形应该出现在屏幕的什么地方,应该有多大,应该是什么颜色。要将想法转化为代码,你仍然需要做出很多决定,而做出这些决定需要付出很多努力。人们倾向于将这种努力归咎于编程语言,但他们不愿意承认一个简单的事实,即仅仅通过给出描述很难得到一个标准。

4 回到电脑上

开发软件不仅仅是了解要做什么,并将其转化为代码。电脑本身存在一些问题,这些问题需要通过程序来解决。如果一个程序可以在硬件和网络上快速运行,可能需要处理机器故障,但是工具和协议的复杂性带来了更多的问题。这些问题并不是在解释应该对电脑做什么的过程中造成的,都是本来就需要解释的东西。

你需要在头脑中“运行”程序的一部分。有时候逻辑和听故事一样容易理解,但是有时候,事件的顺序和状态的追踪太复杂了,放在心上。让程序正确运行——或者纠正它们不正确的行为——需要知道程序在各种情况下的状态。

程序的想法具体化

写代码可以把你对程序的想法具体化,但程序不会一成不变。你会发现bug,想要新的特性,需要改变现有的行为。一个解决方案一开始可能有效,但这并不意味着它总是有效。最后你需要花时间预测未来,收拾烂摊子,你必然会发现自己并没有“先知先觉”。

5康威定律

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

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

如果你有多个团队,事情会变得更加困难。每个团队都有不同的目标,所以会针对不同的事情进行优化。有益于其他团队的决定可能会阻碍你完成工作。了解别人的立场,找到一个好的妥协方案,是一个很难的任务,但一定要完成。

在一个大型项目中,任何一个团队(更不要说任何一个人)都不可能什么都知道,但你还是需要弄清楚如何设计系统的各个部分,让这些部分相互配合,这比你自己做整个设计要困难得多。

6“突破”

我们可以试着找出安达尔定律不适用的地方。如果单个任务的速度不是完全独立的——如果你可以通过优化一个任务来加快另一个任务的速度——就有可能找到一个对你有帮助的解决方案。

更好的编程语言和开发环境可能是我们可以利用的地方。如果程序可以由更少的人开发——例如,两个人而不是一个团队,或者一个团队而不是一个部门——它可以大大减少组织费用。如果你自己实现了接口的所有代码,你就不需要开会决定如何设计接口了。效率的提高不仅会降低编写代码的成本,还会改变工作。

相关推荐