软件开发的发展趋势,驱动了软件工程的发展变化
11 十一月, 2020

软件吞噬世界,开源吞噬软件,云计算吞噬开源,云原生吞噬云计算……那么所谓“吞噬”是什么?



庄表伟

开源社理事长

华为云高级产品经理



软件工程从1968年诞生到现在,其实发生了很多变化。软件工程的发展趋势可以大致分为四个阶段:

#

军工驱动的软件工程

#

商业软件驱动的软件工程

#

互联网驱动的软件工程

#

可信软件工程



当年软件工程刚出现的时候,其实是被军事工业所驱动的,比如美国那时候做的大型的卫星、导弹、地面防御等军事系统。接下来,是商业软件驱动的软件工程、互联网驱动的软件工程和可信软件工程。

下面我们按顺序来看一下:


///  军工驱动的软件工程 


第一个阶段大概是从上世纪60年代到80年代。再往前,60年代之前还没有软件工程。我们可以发现一个很有意思的现象是,先有计算机,再有软件;而刚有软件的时候,也还没有软件工程,是再过了一段时间后才有的。


从什么时候开始软件有危机呢,是当软件与硬件分离,软件被独立出来作为一种交付件,甚至同一款软件,它可以跑在不同的计算机上。这时,软件被解放出来,当时的计算机厂商交付的时候,他会分开交付硬件或者是交付软件,这个时候就需要一种新的开发方法。


在没有新的开发方法之前,软件危机的诞生就是因为当时软件工程这个学科都还没有建立,他们学会写程序也才几年时间,在写大型程序时遇到了问题,于是向建筑工程、桥梁工程、化学工程等传统的工程领域取经,借鉴到一个“瀑布模型”。其他行业也是这样的,先要做需求分析,然后做设计,然后做开发,然后做测试,一层一层下来。这一切,努力的目标只有一个:把软件做出来。


那个时候还没有开源的概念,仍处于蒙昧的阶段,源代码的所有权意识不强,代码在学术圈、高校、研究机构等处随意流动。



///  商业软件驱动的软件工程 

进入PC时代(1985年)之后,很多的个人或企业可以大批量的采购电脑,于是个人电脑的人数大量增加,软件成为一门赚钱的生意。在此之前,我们可以说IBM是全世界最大的软件企业;在有了个人电脑以后,微软成为全世界最赚钱的软件企业,因为它面向的是个人的操作系统,或者是office这样个人的办公软件。于是商业公司开始出现,商业竞争也随之而来。对于公司来说,仅仅把软件写出来是不够的,还要以更快的速度、有更多的功能,要和其他同类的厂商去竞争。于是,软件也会变得越来越复杂。简单的、过去说的结构化编程不足以驾驭那么复杂的模式,所以我们要有面向对象、面向服务的架构。


在工程方法领域开始出现RAD、DSDM、Scrum等工程方法和研发工具,到2001年的时候汇集成为敏捷宣言。这是在软件工程领域走向敏捷,之所以会有敏捷,其实是由这个商业软件所驱动出来的。作为对商业软件的反抗,自由软件/开源软件开始出现,但是还远远不成气候。1991年,Linus写了一个名叫Linux的操作系统;到了1998年,开始有了open source这个名词,但整个开源领域还非常不发达。



///  互联网驱动的软件工程 

到了互联网时代,发生了一个巨大的变化。商业软件是靠卖license赚钱的,而互联网不直接卖软件给你。也就是说,看上去都是免费的。于是,用户数量的增长变得超乎想象。是以百倍级别在增长。这个时候,软件面临的压力就变大了。负载的压力也变大了,逼出了弹性计算以及云计算。因为用户数量暴增,而用户数量暴增之后的波动也变大了。所以我们需要有一种弹性的架构去适应它。另外, 需求也开始剧烈变动,因为互联网上的竞争全都是公开的。原来我们在做商业软件的时候,一年发一个版本,甚至是两三年发一个版本,那时候竞争没有那么激烈。而现在在互联网领域,我的软件,我的网站,一上线你马上就能看到。软件的发布开始变得越来越频繁,从一年发布一次到一天发布十多次版本。由于竞争的加剧,逼出了DevOps。所以说,软件工程方法都是被时代、被需求逼出来的。 然后我们的软件工程就进到了互联网驱动的软件工程这样一个阶段。


但其实我们再回过头来看开源,开源开始火起来了。回顾从1998年到2000年、再到2010年、2020年,有人说,软件吞噬世界,开源吞噬软件,云计算吞噬开源,云原生吞噬云计算……那么所谓“吞噬”是什么,我们认为“吞噬”不是「我把你吃掉,你没了」,而是「大量地用软件来增强传统行业,用开源来使能软件行业,用云来使能所有的软件和开源行业」,是这样一种使能和增强的关系,我们把它叫做“吞噬”。听起来很耸人听闻,但其实我们现在发现开源的大繁荣已经非常的明显,而几乎所有的最新技术都是开源的。



图片

软件开发的发展趋势,驱动了软件工程的发展变化

图片

软件开发的趋势——多、快、好、省


>>多:功能特性越来越多

我们的用户要求我们开发越来越多的特性,而且全世界的软件也越来越多,竞争性的软件互相协作的软件也越来越多。


>>快:开发效率越来越快

我们被要求开发得越来越快,要尽可能快的交付。


>>好:软件质量越来越高

用户对我们的软件质量的要求越来越高,要交付足够安全可靠的软件。


>>省:省钱、省人力、省资源

我们要尽可能降低开发成本、用尽可能少的人把软件开发出来;我们的软件在运行的过程中也要尽可能地节省计算资源、运行资源。


到这一步之后,我们来看「软件供应链」。


我们再往前追溯军工那个年代,或者说是商业软件那个年代,几乎所有的代码都是一家公司的员工从头到尾写出来。但是到了现在,我们会发现,我们的软件绝对不是全都由自己写的,而是有很多的组件、很多的模块都是来自外面的开源代码,然后我们再用一个架构把它们组合起来,进行修改和包装销售。这是软件供应链的一部分,叫做开发期供应链。另外,还有执行期供应链,我们的软件不是跑在一个完全不会变化的设备上,而是跑在云上面的。这个“云”非常复杂,每一层都可能有各种各样的开源代码和组件。网上所有的代码从操作系统到控制层、执行层、数据层,每一层可能都是一堆的开源软件和开源组件,所以,它在执行期也是开源、也是开放。


这个带来的风险是什么?我的代码不是全由我们开发出来的,我不知道他会发生什么事情。可能里面就埋了问题,我也没查出来,这是第一。第二个是我的代码,在执行阶段所依赖的那个执行环境,一层层往下看,好多都不是由我决定的,也是由别人开发出来的。在执行过程当中,发生任何问题我也不知道。我们就面临了这样的一种供应链。因为软件越来越大、越来越复杂,不可能由一家公司从头到尾全部完成。我们必然要依赖于别人的软件、别人的执行环境,看上去大大的节约了我们的开发成本、开本人力,但另外一方面也会为我们的开发执行带来了不可控的风险。



///  可信软件工程 

要做可信软件工程,意味着我们要开发出来一套可信的软件,虽然里面好多东西不是我们做的,但是我们打了一个包卖给用户,我们就意味着要向用户去承诺,我们的软件从头到尾都是可信的。


开源治理全景图

当外面的开源软件进到企业里来,我们要有一个选型的能力,即要建立一个开源软件的质量分析模型。接下来在内部开发过程中,我们要有开发管理的能力、要有漏洞管理的能力。我们要对外商用时,那么我们要交付一份我们开源的合规报告。同时,我们要及时告知用户我们的漏洞问题。当某一天我们要对外开源我们的软件时,除了要做开源合规、漏洞披露之外,我们还要做安全扫描。这个安全扫描是为了防止公司内部的核心机密泄露出去。另一方面,在社区里接纳了别人贡献的代码,我们也要做扫描,防止别人给我们贡献的代码含有恶意的、可能是无意的一些bug,我们要通过扫描保证我们吸纳进来的代码是安全的。这些工作加在一起可能是一个商业企业要考虑开源治理的各种各样的工具。


首先要增加软件透明度,要保证我们公司里面所有的产品线,所有的具体的项目用到的所有的开源软件,以及所有的版本是什么,都能清晰地看到。第二部分是通过某种工程管控的方式进行管理。换句话说,企业内部开源治理的核心要点是“看得见、管得住、管得好”。


软件工程发展到今天,已经变成是一个非常庞大的、非常复杂的、多领域的一个协作的问题。而这当中绝不仅仅是要把软件做出来,也不仅仅是用一个敏捷软件工程,然后就可以把软件快速地做完了,都不是。我们要考虑的问题非常多。一方面,我们在理论上、实践上要有所探索,而很多我们的理论和实践上的探索都会落实到一个一个的研发工具,然后再把这些研发工具串联起来,最后形成这样的一张全图。



*本文为演讲者个人观点,不代表协会立场。


- END -


更多详细内容 · 关注回放视频