为什么软件开发很难?
来源:武汉软件开发 浏览量: 发布时间:2021-10-29

其中一个观点是,使用更好的编程语言可以使软件开发更加简单、更加有效。这一观点无疑在汇编和FORTRAN时代是正确的。但是,现代编程语言已经足够好,而当前主要的困难和改进机会还存在于其他方面。虽然编程还是很难,但是造成这个困难的原因是与编程语言无关。

为什么软件开发很难?(图1)

1、安达尔定律

在一个连续的任务序列中,执行一系列的任务时,安达尔定律是有效的。Andal定律告诉我们,在这些任务中加速一系列任务的速度是有严格限制的。

例如,烧开水需要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、“打破”定律

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

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

迭代式速度是另一种可供利用的杠杆。为了开发一个程序,你需要了解这个领域的问题和需作出出哪些决定。要做这些事情,你需要在脑中塞搜集集到的所有细节,然后形成一个心智模型。这是一种可行的方法,但可能不是最有效的方法。另外一种方法是在一些显而易见的细节基础上建立一个小型的思维模型,然后在此模型基础上创建一个小程序,以检验这些想法是否符合实际,并根据反馈反复,每次创建更丰富、更精确的模型。这似乎更适合人们实际的学习方式。要使此方法有效,您必须能够快速测试想法并得到反馈。理想的状态是,在你完成输入后,新代码就可以开始运行。通过改变开发环境来实现更快的迭代周期,将使开发人员从第一种方法转到第二种方法,帮助他们更好地理解问题。

对此,我不太乐观,因为一种更有表达性的编程语言能否有效地提高工作效率。希望有更好的发展环境。假如我们有更好的工具来理解已存在的代码,拥有更快的开发迭代周期,繁琐的工作也会减少,那么可能会改变软件开发的方式,以一种综合而不是递减的方式为我们带来回报。

怡橙科技打造有价值的网络营销服务!为企业实现全网开发,一站式管理和运营!

业务范围覆盖品质网站建设、SEO首页排名、微信小程序开发、微信公众平台开发、网络营销推广、APP开发、品牌策划、企业形象设计、服务器租赁、企业邮箱、400电话等互联网相关服务。


标签: 软件开发 网络营销服务 怡橙科技 全网开发

网站急速响应

7x24小时网站售后服务

网站免费备案

网站专线1对1服务

网站授权保护

网站防木马入侵

网站研发团队

专访设计团队贴心服务

网站优质性价比

合理网站定价长期合作

公司地址:武汉市东湖新技术开发区茅店山西路8号创星汇科技园D栋509室 24小时客服热线:400-960-5068

版权所有©武汉怡橙网络科技有限公司 PaiKy Network 鄂公网安备 31010702001393鄂ICP备2021014215号-1 网站地图 SITEMAP.TXT