这几个星期,都在忽紧忽慢地重构之前的一个项目。在过程中,愈发发现认知和逻辑能力是开发这个工种最最重要的能力。
平常所谓的判断力,其实来源于认知。认知和经验有着密不可分的关系,经验是认知的火种,但又绝不完全是经验。因为如果要完全将它把经验等同起来的话,就会抹杀人的创造价值。认知能力,是一个人从已知推测未知的能力,是以片面尽可能地概括全局的能力,是以小见大的能力,是举一反三的能力,是无须事必躬亲而了然于胸的能力。
如果说认知能力还停留在某种单体上,那么逻辑能力则更进一步,它涉及到了事物之间的联系,也即由点扩散,成为线,成为网。就好像单机与网络的差别一般。逻辑能力基于认知能力,提出了更高的要求,能够去理解不同主体之间的关联,这种关联不是静止的,而是动态的。
这么说未免流于空洞。举个简单的例子。假使要设计一个对于人这样的个体的类,抛开其社会属性诸如姓名职业之类的,那么通常可以先把其基本的自然属性以及行为能力列举出来。属性如:五官、四肢、发肤等,行为如视、闻、嗅、食、行、止等。在某些情况下,当需要对它做一些调整的时候,哪些可以加入到“人”这个类当中,而哪些不能,会有认知能力决定。例如,“笑”,加入到“人”中可以吗?可以,因为它确实是“人”的普遍共有行为之一;那么,把“抓泥鳅”这个行为放进去如何呢?至少从笔者看来,不是一个好主意。这个行为很可能应该从属于“顽童”或者“渔猎者”这样的极有可能是从“人”派生出来的类。如果有读者读到此处,甚而想用——“抓泥鳅”也是“人”所普遍具有的能力,只不过是动用频率高低之别——这样的理由来说服本人的话,敬请免开尊口。而且不客气地说,这恰恰表明了尊驾的认知能力缺陷。
当涉及到多个主体时,可能的例子是这样的。假使有一个抽象的角色叫“司令”,有一个行为叫做“发布命令”,而实际去执行从“司令”这里获得命令内容然后再传达出去的角色,很可能是“副官”。在“发布命令”这个方法/函数的实现中,如果调用的是“副官”的“传达命令”方法,那么这个具体实现的逻辑基本就是合理的;但在实际中,往往或出现“司令”直接调用了“副官”的“说话”或者“发电报”这样的接口,这就相当尴尬。对于单体认知的不清晰,最后体现在不同单体之间的关联互动上出了问题,就成了逻辑缺陷。要么是把本该松散的耦合绑紧了,要么相反,把本该紧密的耦合放松了。
面向对象编程,无论业界如何被追捧,或者被冷落,它都是一个非常正确的认知方法论。它可以使你聚焦问题(对象),筛选问题(对象)与外界的各种关联,最终逼迫着你更清晰地了解这个问题的本质。从编程语言层面,写一个 class 很容易,在解决问题层面,写一个 class 就没有那么轻松了。近些年的编程语言中,引入闭包(或者拉姆达表达式)的趋势开始流行,这是一把双刃剑。对于头脑清醒的人来说,带来了编写时急需的便利性;而对于仅仅贪图便利性的糊涂虫来说,恰恰是增加了把所有的面条都拧成麻花的机会。