“抽象”这个词来源拉丁文abstractio,它原意是排除、抽出。抽象到底是什么?从具体事务抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。在我看来,抽象就是把相近事物的相同特点成功提取出来,定义为某一类事物,朱熹老夫子眼中的“格物致知”和“即物而穷其理”说的就是这个抽象过程。
抽象有什么好处?譬如我们吃一个苹果,看到它的形状是圆形,颜色有红有黄,闻到它的香,尝到它的甜与酸,口感的脆或粉,知道这是苹果大概的样子,而不用去尝每个苹果。当我们发现某个新事物时,经过观察一番后,根据它的特点,要么把它纳入已知某类事物中,要么在头脑中形成一种新的事物类别。世间万物纷繁复杂,用类来区分,它们就会在我们大脑的形成类或属的概念,只需记忆类的特点,而不用逐个去了解和熟悉,极大简化记忆。如果某类事物数量成千上万,逐个去了解,本来就是不可能完成的任务。借用亚里士多德的三段论(A = C,因B = A,则B = C ),或换一种表达形式(A has | is C,因B∈A,则B has | is C)来证明:只要我们知道某个事物是属于某个类,同时知道这类事物有那些特征,我们就能够了解这种事物基本情况,可以利用事物确定的特点为我们服务,或者采用合适的策略或方法来应对事物带来的问题。大类可以包含诸多小类,如果借用属和种差来区分类和小类的关系,我们就能较好管理属于这类或属的大量事物。
其实抽象自古有之,在几百万年前,早期人类的祖先已经学会利用抽象来应对生存考验,在人类祖先进化过程中,从树上走向地面时,面临非洲大草原的危险非常多,直立行走多有不便,不如草食动物奔跑迅速,人类祖先很容易受到狮子和鬣狗的袭击,只能成群的活动,利用石头或树枝进行反击。石头或树枝变成人类祖先防范猛兽的有效工具,人类祖先群体在地面上开始有自己的生存空间。但石头太大不行,抡起来不方便;太小或者太轻也不行,对猛兽伤害不大。本来没有任何区别的石头,被人类祖先有意识分成两类,一种是好用的石头,另一种是不好用的石头,这就是抽象的初期运用。人类学习食腐动物,躲猛兽后面吃剩下残羹冷炙,后来也发现有棱的锋利石头可以作为工具,抢在食腐动物之前,快速切割动物尸体带回安全的营地;用坚实的石头可以砸烂骨头获取骨髓;这些石头的使用让人类在残酷的自然竞争中获取生存机会。人类开始有意识砸制石头,制成石器,标志着人类的旧石器时代到来。石头又被抽象分类,结实或可砸出锋利棱角的石头,作为可以制作石器的一类,不能制作石器作为另一类,石头是否好用,这种分类,也是一种抽象实践过程。抽象是人类发展历史中不可缺少的思维过程。

抽象过程看似简单,其实也是一个很复杂的过程。关于对繁杂的事物研究,著名数学家、近代哲学之父笛卡尔提出分析和综合方法论比较出名,在他的新工具论谈到“把我所考察的每一部分,都尽可能分成细小的部分,直到可以而且适于加以圆满的解决程度为止。即‘分析’。按照次序引导我的思想,以便从最简单、最容易认识的对象开始,一点一点逐步上升到对复杂的对象认识。即使是那些彼此之间并没有自然的先后次序的对象,我也给它们设定一个次序。即‘综合’”。笛卡尔说的“分析”,是把事物分解成各个部分加以考察的方法;而“综合”,则是把事物的各个部分联结成一个整体加以考察的方法。分析是一种从上到下、从整体到细节的思维过程,而综合则是从下到上、从细节到整体的过程,两种是一种互逆的过程。
在分析方面,亚里士多德给出一些考察角度,他在柏拉图的“形式论”基础上,提出四因来描述事物,以事物是什么、事物由什么构成、为什么事物会变化的维度研究。四因是:材质因、形式因、动力因、目的因。比如说桌子,木头材质是它的材质因,木匠心中的设计蓝图是它的形式因,木匠是它的动力因,有人需要做桌子是目的因。后来他把动力因和目的因合并到形式因,目的因和动力因变成形式因的潜能和实现,用来解释事物的变化。并提出范畴来描述事物的基本属性,有实体、数量、性质、关系、地点、时间、状态、动作、所有、承受。范畴变成我们研究角度,从十个确定维度来进行研究、分析。
抽象得到成果,就是我们说的把公共要素提取的类。常言说“名不正,言不顺”,我们提取的类,要成为今后有用信息之前,必须有个恰当的名字,哲学上称之为“概念”,来沉淀已有的成果,从而区别于其他事物。有概念,就得有定义。对于定义,海洋生物学研究很多年的亚里士多德提出一种方法,首先把需要定义的事物放入相似的类别中,然后确定其与同类中其他事物的不能特征,即属叠加种差,这种方法二千年后还被使用。最著名的定义,就是他对人做的定义:人是理性的动物。动物是人最接近的类,理性是人和动物最大区别。我们抽象得到结果,在巴门尼德和柏拉图眼里,仅仅是一种有时存在有时不存在的意见,而不是一种确定存在的知识。知识,是确定的存在,只要众多事物存在一个反例,就不能成为知识,如人是理性动物,反例就是婴儿不是理性的,但属于人,所以“人是理性动物”这个定义,在我看来,不能成为知识,只是一种意见,或者是不太严密的定义。从意见变成知识,从众多事物的规律变成普遍这种事物的公共规律,还需一系列验证方法,才能成为确定不变的知识。看来,抽象得经历逻辑和时间双层检验,并不是一个轻松的过程。
对于从事软件研发的程序员来说,抽象也可以成为一种有效的工具。从计算机发展的历史来看,抽象起到了举足轻重的作用。从枯燥的二进制指令抽象成英文字母缩写,计算机发展出汇编程序;从不同数据分类处理方式抽象出函数库,从处理过程抽象发展出结构化逻辑,伟大的c语言就是在这个过程中诞生,让我们可以无视复杂异构的计算机硬件环境,进入了软件时代,从而诞生了纯软件开发行业;更进一步从业务对象逻辑抽象,诞生了面对对象的c++、java等面向对象的语言。
在我们日常的系统研发工作中,富有经验的设计者会把一些领域内类似场景、一些常用代码或框架进行沉淀,小的可以沉淀变成一段函数、方法、类,大的、复杂的可以形成框架或组件库,不好封装的可以梳理成规则或框架形式。这样做的好处有三方面:一、极大降低工作量,原来大量编码的工作让抽象方法、类、组件来实现,只需配置对应的参数;二、降低程序的复杂度,程序干净简洁,让逻辑清晰简明;三、抽象沉淀的方法、类或组件提供代码健壮性、准确性和规范性,不会因为个人代码习惯的差异,带来读代码的困难,也不会因为程序员水平参差不齐,导致代码质量问题。当然抽象也得有一定方法和技术,让抽象的方法、类或组件能方便使用,让难以封装的东西封装起来、而且封得合理,不能封装也能找到合适方法沉淀下来。抽象也需提高自身,开阔眼界,能学到、找到一些封装方式和方法。
让抽象促进我们的工作更有效、更高效!