22.抽象思维
是谓无状之状,无物之象,是谓惚恍 ——《老子·道经》
冒号健步走进教室,学员们立刻正襟危坐,进入战备状态。
“如果说咱们是在合演一场戏,那么前面五节课只是一个过门。”冒号俨然一副自导自演的架势。
众人暗暗吃惊:这过门也忒长了点吧。
冒号随即探问:“还记得在范式总结中提到的迭代学习法吧?”
引号迅速应答:“就是在具体知识与抽象理论之间做折返跑。”
“记性不错。”冒号赞道,“在上本班之前,你们已经具备了一定的编程语言的基础,因此我们先从抽象的编程范式谈起,此后又回归到编程语言的讨论。”
句号推测:“照此逻辑,下面我们将再次返回编程范式?”
“我们的确要来个For Loop,但相信这是一个增量式的循环。”冒号用编程语言来强调他的学习理论。
逗号有些失望:“按计划不是该对Java语言作专题讨论吗?”
“你放心,Java它跑不了。”冒号看出他的心事,“语言是形,范式是神,这次我们将二者融合,争取做到形神兼备。具体地说,范式以OOP为主,语言以Java为主,同时可能涉及C、C++或C#等语言。另外,示例代码也会明显增多。”
逗号脸上的一抹乌云顿时消散开来。
冒号接着提醒道:“不过,秉承开班发言中的理念,我们的重心不在知识的枝节,而在知识的本源。因此无论讨论Java还是OOP,我们不追求系统和全面,但力求从不同的选点、角度和深度来展示知识的活性。”
讲到此处,冒号冷不丁提问:“程序员最重要的能力是什么?”
众人的答案五花八门:学习能力、逻辑思维能力、解决问题能力、专注力、沟通能力等等。
“毫无疑问,你们所说的都很重要。这本是个见仁见智的问题,我只是借此展开今后的话题。在我看来,抽象思维能力是最重要的。当然,不独计算机领域,其他科学同样需要这种能力。更广泛地说,抽象是人类认识和描绘世界最首要的工具。”不知不觉冒号又走上了形而上的路线。
叹号这时想起:“前面谈切面范式时,似乎专门提到过抽象与分解的重要性。”
“我们也曾提到,不同的范式正是对软件进行了不同角度的抽象和分解。”冒号加以补充,“那么什么是抽象呢?不妨概括为:去粗取精以化繁为简;由表及里以异中求同。再精炼些,抽象就是作减法和除法。”
问号半信半疑:“减法好理解,通过甄选减去非本质和不重要的部分,即去粗取精。可除法呢?”
句号忽然悟道:“透过现象看本质,发现不同事物之间的相同之处,即异中求同。同类归并,那就是除法了。”
冒号进一步解释:“用离散数学或抽象代数的语言来说,通过抽象而产生等价关系以及相应的等价类,便是集合的商运算。”
逗号嘀咕:“本来快明白了,经这么一描述,重新糊涂了。”
冒号笑道:“如果嫌数学语言高深,就用算术语言吧。乘法可看作同类复制,作为逆运算的除法自然是同类归并了。”
逗号眼中的迷惘渐渐散去,若有所悟:“嗯,经过减法和除法,大数变小数,复杂变简单。”
“能否把抽象说得再具体些?”问号话一出口便自感悖论之嫌:抽象的能具体吗?
冒号自明其意:“首先,抽象有角度之分。相同的实体(entity)经过不同角度的抽象,得到的模型(model)也会不同。就拿人这个实体来说,在拓扑学家眼里是三维连通集合,在理论力学家眼里是质点,在化学家眼里是碳水化合物——”
叹号接嘴:“在情人眼里是西施。”
“过滤缺点,抽取优点,西施就是这样炼成的。”冒号故意拉长了尾音。
众人不禁一乐。