联系电话: 18171260050

行业动态

  • 03,Apr,2022

为什么软件开发这么难?

 有些人认为,一种好的编程语言可以减轻软件开发人员的负担,并相应地提高他们的效率。

毫无疑问,这在很久以前的汇编和Fortran时代是真的。

  然而,现在编程语言已经足够好了,我们仍然面临着其他一些困难和挑战。目前,许多开发人员认为编程仍然非常困难,但这些困难与编程语言无关,原因如下。

1.阿姆达尔定律。

当我们需要执行一系列任务时,我们会想到阿姆达尔定律。这条法律告诉我们,仅通过加快某项任务获得的整体速度提高是有限的。

假设烧开水需要10分钟,然后煮面条需要10分钟。即使你找到了加快沸水速度的方法,烹饪时间也不会少于10分钟。无论炉子有多旺,烹饪速度都不可能翻倍。

该定律的数学公式是:如果某件事的总时间比为p,您将永远无法获得超过1/(1-p)的加速比。假设这部分工作占90%,即p=0.90。在优化过程中,如果这部分时间减少到0,整体工作速度将提高1/(1-0.90)=10倍。

阿姆达尔定律的关键在于,您可以获得的大速度提升仅限于优化工作的比例 

ZI1(N(V]{[9IY~A%3ETBYNC.png

编程工作困难的原因有很多。简单地说,我们可以认为这是因为我们需要处理的工作必须按照一定的顺序完成。毕竟,人类并不擅长同时处理许多任务。在某个时间点,你可能会使用建筑工具、阅读文档、编写代码或参加会议。当然,你也可能会在会议上无私地写代码,但你只能做同样的工作,而不能同时写代码和会议。因此,我们可以使用阿姆达尔定律,假设您可以将施工时间降低到0,但项目的整体速度只能稍微加快一点。您的工作效率仍将受到其他因素的限制。

曾经,很难将程序转换为计算机可以运行的代码。很久以前,我们甚至需要将程序转换为1和0,然后不厌其烦地将其输入计算机。我不知道这需要多长时间,但我们可以假设这项工作占编程时间的90%。这意味着,如果我们能找到更好的方法(如Python)告诉计算机该做什么,我们可以将编程效率提高10倍以上。

然而,现在我们的编程语言越来越好,告诉计算机做什么的时间也越来越少。将程序转换为代码不需要90%的时间。假设我们现在只需要10%的时间。这意味着,即使这部分工作时间减少到0,效率也只能提高1.11倍。效率比以前低了81倍。

这是因为其他90%的软件开发是一项非常艰巨的任务,无论编程语言有多好,不能(直接)减轻我们的负担。

  2.为什么编程还这么难?

  传达需求

我在这里说的编程工作很困难,但实际上与编程语言无关。为了找出原因,暂时假设我们根本不使用电脑。你不需要告诉电脑该做什么,但你需要告诉你的朋友该做什么。你不能告诉你的朋友你必须为他们做出所有的决定。

  你会发现解释关键的背景信息需要很多时间。你的朋友需要了解程序需要处理的实际问题,以及你认为程序应该提供什么功能。你必须解释所有的缩写字母和术语,并讨论各种外部因素。

你的朋友需要知道所有可能的情况,有很多细节需要处理。

  同时,你还需要考虑不同功能的状态,用户可能尝试的各种动作,以及所有可能的事件,你需要和你的朋友讨论很多极端的情况。

向你的朋友解释这一切有几个困难。首先,你必须掌握所有的实际细节;其次,你必须了解程序在每种情况下应该执行的操作;此外,你必须通过你的朋友能够理解的方式传达所有信息。这意味着你必须组织这些信息,以确保易于理解。

  请注意,到目前为止,我们甚至还没有提到计算机,当然,我们也没有提到编程语言。理解需求,掌握程序应该做什么,以及组织表达是一项非常困难的任务。

描述与规格

  我们很容易混淆描述和规格之间的区别,这是我们经常进入的思维陷阱。如果你只有一个描述(红色汽车),你可以测试实际情况是否符合描述(红色,但不是汽车),但这个描述不足以传达如何制造汽车。这就是标准化的目的。

创造事物需要做出很多决定。如果你记录每个决定的结果,你就会得到一个(混乱的)规范。在编写程序时,你需要做出这样的决定,所以仅仅通过描述是不够的,你需要一个规范。当我们看到一个描述(列出文件)时,我们很容易认为这是一个规范,所以我们认为我们应该能够告诉计算机执行这个动作。但事实上,有很多决定需要考虑(文件应该按什么顺序列出?每个文件都有一行吗?

在编写程序时,你得到的规范通常只是一个描述。计算机不能绘制矩形,它必须知道矩形的显示位置、大小和颜色。当你编写这个代码时,你会发现很多尚未做出的决定。做出这些决定需要付出很多努力。我们经常犯错误,把这些工作归咎于编程语言,但这只是因为我们很难根据描述创建规范。

  计算机本身

  现在,让我们回到计算机上。开发软件不仅仅是为了了解软件应该做什么,并将各种想法转换为代码。计算机本身也有许多程序必须解决的问题。您的程序必须在硬件和网络上快速运行。该程序需要处理机器故障。工具和协议的复杂性使该领域面临更多的问题。这些困难不是由向计算机解释该做什么的过程造成的,它们也需要解释。

此外,你需要在脑海中运行一些程序。有时逻辑很容易理解,但有时你不能把一系列的事件和状态都塞进脑海里。为了正确理解程序的详细信息,在错误的情况下修复程序,您需要了解程序本身在各种情况下的状态。

  编写代码的过程可以让你清楚地掌握程序的工作方法。然而,这个程序永远不会停止改变。你会发现错误,添加新的功能或修改现有的行为。即使最初的组织方法非常有效,这并不意味着它的结构总是正确的。你需要花时间结合各种情况,考虑未来的需求,并在事故发生时清理混乱。

  人员合作

  很多时候,我们需要与他人合作编写程序,这也会带来挑战。

所有的团队成员都必须各司其职。为了不妨碍他们之间的工作,你必须分工。为了建立合理的分工,您首先需要了解程序的结构(请参见康威定律)。

如果你有多个团队,情况会更复杂。每个团队都有不同的目标,所以你必须权衡各个方面。有时,一个决定对其他团队非常有益,但它会阻碍你的工作。很难设身处地为他人着想,找到合理的妥协计划,但必须完成。

  在大型项目中,没有一个团队能理解整个系统,更不用说一个人了。然而,您仍然需要了解系统的各个部分是如何设计和组织的。这比你自己承担整个设计要困难。

虽然与人打交道并不是真正意义上的编写代码,但它也是软件开发中非常重要的一部分。

  3.如何解决软件开发的外部问题?

  我们可以找到一些不受阿姆达尔法律限制的方法。如果每个任务的速度不是完全独立的(例如,优化一个任务可以加快另一个任务的速度),我们希望通过技术解决方案来改善这个问题。

我们需要更好的语言和发展环境。如果我们可以用更少的人编写程序(例如,两个人可以取代整个团队,或者一个团队可以取代一个部门),我们可以减少组织规模。如果同一个人编写接口的前后平台,则无需开会讨论。生产率的提高不仅可以降低编写代码的成本,还可以改变工作方式,从而降低其他工作的成本。尽管如此,这种方法也有局限性,因为程序员无法将所有业务纳入他们的脑海。

迭代速度是另一个杠杆。你需要知道如何编写程序。