软件未来发展的趋势 (建模软件发展趋势)

读完第一章节,本章节是对软件工程的一个概述,从全局视角去定义软件和软件工程相关的概念和理论。有作者自己的理解,也有外部的一些引用,并通过细心的组织,构建一套完备的围绕软件和软件工程方*论法**的理论和实践体系。

从一个对话引出了未来软件发展趋势,及软件开发过程那些依然无法解决的问题,反观这些问题,大概从2005年我开始对软件有些自己的心得和认识,到现在处理过各种类型系统、各种类型软件、各种编程语言。整个软件开发过程和编码结果,依然无时无刻都在发生着作者总结的那些问题。

1) 为什么软件需要如此长的开发时间

2) 为什么开发成本居高不下

3) 为什么将软件交付客户使用之前,我们无法找出所有的错误

4) 为什么维护已有的程序需要花费高昂的时间和人力代价?

5) 为什么软件开发和维护的过程仍旧难以度量

在作者提出的这些问题之外,个人再补充一个问题,

6) 为什么大部分公司或个人,依然满足于疲于奔命的现状

而解决这些问题的“道”和“术”,就需要深入去研究软件以及软件开发过程。一方面,需要一套可以解决实际问题的理论体系和可落地的实践方法;另一方面,需要公司从上到下的思想意识的转变,软件产品研发过程不仅仅只是代码的编写,要构建有竞争力的软件产品,需要借助成熟的软件工程理论和方法,以及无数的实践经验和模式。只有站在前辈和巨人的肩膀上,才能走得更快、更好、更远。

软件及未来的发展趋势

什么是软件,按照百度百科的描述“是一系列按照特定顺序组织的计算机数据和指令的集合”。而且特别强调软件不仅仅指计算机上运行的电脑程序,也包括相关的文档。在本书中把软件定义拆分为3个关键点:1)指令的集合;2)数据结构;3)软件描述信息。

软件存在的价值就是可以满足人类(用户)的实际需要,如控制硬件、处理文档等,而最终一定是通过特定的“实体”体现出来的。这个“实体”绝对多数时候是指硬件实体,但随着技术的进步,也可以通过类似波的方式去直接与大脑交互,但深入分析,特定波的产生也是通过硬件去控制和产生的。所以,依然可以归结到软件通过控制硬件对用户产生实际效果。其他类似数据分析,数据处理等软件,最终数据的显示或打印等人类可见形式提供用户决策能力。越是涉及复杂数据流或业务流的系统,软件处理路径就越长,系统复杂度就越高,而对用户产生影响的硬件(比如显示数据的显示器或大屏)反而表现的标准和简单。

在涉及软件系统的产品体系中,硬件标准化,软件适应业务多变的能力是产品构建的基本框架。所以,为了适应业务的多变性,对软件系统提出了很高的要求,即使计算机软件已经发展了这么多年,上面本身作者描述的5个问题依然存在。

暂且抛开存在的问题,回到软件服务的应用领域,作者总结了七大类,

1) 系统软件:一整套服务于其他程序的程序。

2) 应用软件:解决特定业务需要的独立应用程序。

3) 工程/科学软件:带有“数值计算”算法特征类的程序。

4) 嵌入式软件:嵌入某个产品或系统中,实现和控制面向最终使用者和系统本身的特性和功能。

5) 产品线软件:为多个不同用户的使用提供特定功能。

6) Web应用软件:以网络为中心的软件,可以以SaaS方式存在。

7) 人工智能软件:利用非数值算法解决计算和直接分析无法解决的复杂问题。

从作者总结这七大类中,感觉有很大的重叠性,尤其是Web应用软件,几乎覆盖了其他各个不同的应用领域,比如现在的Office365,微软也推荐以SaaS化的方式使用服务。而人工智能软件,现在很多情况下是作为相关中间件或中间服务提供更高的上层应用去使用,比如高铁站道闸系统使用CV模块提供的人脸识别服务完成人员的身份识别,决策是否打开道闸允许乘客通过。所以,作者只是给出了他自己的一些软件应用领域的例子,大家也可以通过自己的标准去归类,不需要一味盲从。

我个人更加喜欢从软件系统或模块的层次位置或功能去归类,

1) 系统及平台软件:支撑其他软件运行的软件,偏向于资源分配和调度的功能。比如,操作系统,K8S平台,大数据平台。

2) 中间件软件:为应用提供特定功能的软件,可以独立的部署和运行。比如,数据库,消息队列,鉴权系统,人工智能服务。

3) 模块软件:为构建应用提供相关的框架或功能,不可独立的部署和运行。比如,Spring,Http通信库,JDBC驱动。

4) 应用软件:提供满足业务需求功能的软件。比如,Word,ERP,门户网站。

从这个角度去看软件,后续软件的三大趋势是:

1)系统软件归一化,比如,操作系统归一到Linux,资源调度系统归一到K8S。

2)构建丰富的中间件软件和模块软件,将更多软件应用层相似功能沉淀到中间软件或模块软件。

3)对应用层功能进行更细粒度的分解,将更多业务功能封装成细粒度可复用的模块,通过积木式的方式(最好是非编程方式,可视化拖拽效果更佳),按照业务需求快速搭建应用系统

总之,让应用软件的开发或构建,可以实现像硬件一样,根据业务功能进行系统、中间件或模块的选型,并通过快速的组合完成软件构建。