从柯布-道格拉斯生产函数看云计算对传统软件工程的影响

随着软件技术的不断发展,软件的功能变得越来越强大,软件的结构也变得越来越复杂,需要处理的数据变得越来越庞大,计算的复杂度也越来越高。如何开发能够应对这样日益增长的需求的软件便成为了亟待解决的问题。

20 世纪 60 年代的出现的面向对象开发方法就是解决这一问题的尝试。面向对象开发方法大大提高了软件的可重用性和可维护性,使得软件生产真正成为了一个行业,甚至可以说是一个工业。

近年来,随着网络技术的不断发展,高速度、大规模的数据传输成为可能,便携式智能设备的普及也使得人们不得不面对计算能力相对较差的机器,云计算的概念于是应运而生。所谓云计算,就是将输入数据传输到服务器上,再将运算结果传输回客户端。这样客户端没有能力进行的运算也可以得到实现。此技术发明后,人们发现如果可以建造出更强大的服务器,那么就不仅可以服务移动设备,也可以服务更多更复杂的计算需求,云计算于是迅速发展起来。

相比于传统的计算模式,云计算主要有如下优点:

  • 计算不受客户端计算能力的限制,而服务器的计算能力是多个客户端共享的,因此降低了计算的成本。
  • 由于同一个服务器可以服务多个客户端,因此编写一次处理程序可以用于处理多个客户端的输入数据,实现了软件的复用。

在我看来,云计算对于传统软件工程必然会产生较大影响。

首先,为了获得尽可能多的利润,提供云计算服务的公司必然要尽可能使自己能够服务尽可能多的客户。这一方面要求公司编写更多的软件,一方面也要求公司编写的每一个软件的适用范围尽可能广。而实现这两方面的要求,最好的方法就是模块化。将软件可能需要的功能分类,针对每一类功能编写一个较为通用的模块,在服务不同客户的需求时,只需将这些模块组合即可。因此软件工程必然走向模块化。

既然如此,对于一家云计算公司来说,软件模块实现的单价是几乎确定的,因为模块的输入和输出通常都有清晰的定义,实现模块的过程几乎可以标准化;计算能力的单价也是固定的,因为主要是硬件的成本和维护的成本。也就是说,随着公司计算能力的提高和服务范围的扩大,公司的成本几乎是线性增长,但是公司的收益却会增长更快。因为公司的客户越多,自己构件的重用就越高,同一个构件能够带来的收益也越高;公司的客户越多,自己的计算能力的闲置时间就会越少,同一个硬件能够带来的收益也越高。根据柯布-道格拉斯生产函数,由于云计算行业的劳力生产力弹性和资本生产力弹性之和大于 1,规模的扩大将会导致不成比例的收益扩大,进而任何一家云计算公司,都会有足够的动机去尽可能扩大规模。也就是说,最终云计算行业一定会形成几家大公司中原逐鹿的局面。

一旦规模形成,云计算公司之间的竞争就不再仅仅是计算能力和服务范围的竞争,因为能够留下来的公司在这些方面事实上可以分庭抗礼。真正赢得客户的便成为了服务的稳定性和可用性。而稳定性和可用性,正是传统软件工程的强项。

在传统软件工程中,整个开发过程被划分为清晰的几个阶段,需求有明确的定义,对于稳定性和可用性的要求被细化为具体可执行的指标。在一次次的评审和测试中,应用这些指标进行检查,更容易发现稳定性和可用性方面的问题。相比起来,新兴的敏捷软件开发,尤其是将精力主要放在让软件运行起来,让用户立刻看到运行的结果的敏捷软件开发,稳定性和可用性这类在一两次运行中难以显现的问题则很难被发现,往往只有在产品上线之后,运行一段时间或者遇到压力高峰时,才能发现这类问题。

比如实现一个视频保存和播放的构件,开发团队很容易就可以实现一个可以打开的网页、一个可以存储和处理数据的服务器、一个可以调用这个构件来运行的 App,等等。但是如果在传统软件工程中,需求文档规定这个构件必须能够适应 10 万人共同的访问,那么显然在测试文档中会有相关的测试内容,尽管无法模拟 10 万人共同访问的情况,但是至少会检查构件的实现中是否考虑了大规模的并行访问,比如是否采用了分布式处理,是否实现了负载均衡,是否对于读写冲突进行了设计。而如果没有严格的需求文档和测试文档,由于同样无法模拟 10 万人共同访问的情况,就并不会发现这种访问情况带来的问题,那么就只能等到在实际应用中面对这样的规模时出现问题再去解决,稳定性和可用性就大打折扣。

综上所述,云计算使得软件开发模块化,使得模块开发规模化,使得规模开发规范化,最终必将促使传统软件工程再次登上历史舞台,在其最擅长和最适合的方面发挥重要的作用。

posted @ 2016-12-02 22:39  Minima  阅读(470)  评论(2)    收藏  举报