软件的本质-06 抽象(软件工程什么是抽象)

抽象就是在错综复杂的事物中分解出不变的部分,将它和易变动的部分隔离开。好的抽象,应该反映出人类需求中稳定不变的东西。

其本质上是对人脑中概念的建模,这种概念的结构映射到代码上,就成为软件。从而在时间和空间上达到更广泛的复用。

所以,软件结构设计的本质在于为问题设计一个良好的抽象概念体系。

软件的抽象方法有三种:

1、过程式

2、函数式

3、面向对象

没有错,就是程序员都熟悉的软件设计方法,这些程序设计方法其本质上就是通过建立模型来抽象的描述思维过程。

模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只是对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

这三种方法诞生在不同的时间,看似新旧程度不同,但是,方法之间其实并无本质区别,各自有优缺点,都是具体的抽象的办法。

不过抽象也分为很多层次,越基础的层次,其复用性越高,但是解决实际问题的能力越低,所以,为了满足需求和复用的平衡,软件的抽象需要分层,下图所示:

第一层:硬件

最抽象的就是现代计算机数学的基础:布尔代数,它只有0和1,用0和1,通过集合运算、逻辑运算,将CPU的指令抽象为地址、浮点、整数等基础概念,这是所有计算机体系的基础,具有最高的抽象度和复用性,所以,世界上的硬件厂家很少,而且标准统一,硬盘、内存全世界通用。

第二层:计算机语言

它是为了人设计的,而不是为计算机硬件,它是软件的基础,它将上一层中硬件抽象的浮点、地址等概念继续抽象为数据运算、函数、控制流等。编程语言大概有50种,常用的5-10种。这一层的复用程度最高的代表就是编译器,所有语言,都需要编译器进行转换为硬件可识别的指令。

第三层:操作系统

Windows、MacOS、Linux、Unix,世界上的操作系统就这几个,其他几乎都是在这几个基础之上的改款,越是复用程度高的事物存在就越少,这也是为什么国产操作系统一直发展不起来的原因,重复造轮子的事,总是缺乏一些激励,既然有的用,就何必自己再搞一个呢?政治原因除外。。。

操作系统复用最高的是API。

第四层:框架

这一层就算脱离基础到应用层了,各种SDK、框架,可谓是极多了,框架不属于计算机语言的一部分,而是用计算机语言编写的模块,它跟语言本身提供的一些特性没有本质区别,属于计算机语言的一种扩展和外延。各种语言都有很多框架,常用的有:

.net的MVC、EF

java的Spring

php的thinkphp

js的jquery

前端的bootstrap

等等等等,太多太多。

第五层:软件系统

典型代表ERP、MES、OA等,具有一定的通用性,分领域,分行业,其复用性较之框架又低了很多,但是,这一层是真正用来解决实际问题的。

第六层:代码

各种信息系统的实施,满足企业的定制化需求等等,最具体、最能满足需求、过时最快,大部分企业的硬盘里沉睡着这类代码。

基于三种抽象方法、针对不同的抽象层次,人们就可以有条不紊的构建一个个既满足复杂性需求有具有一定复用性的软件了。