漫谈抽象本质 —— 从框架与库设计实战展开
四月份的Web标准化交流会昨天在北航举行,两位嘉宾给我们奉献了精彩的演讲。Giorgio关于IE9的精彩演讲给我们展望了web标准的未来以及Microsoft在这方面的决心,而爱民兄关于架构实战的演讲更让我收获良多。下面我就想接着这个话题展开谈谈我的一些体会。
在演讲中,爱民通过SSDownloader的例子来展示了一个框架的分析、设计到最终产出的基本过程,解释了在最终产出的结果中什么层面上属于框架、什么层面上属于库,什么层面上属于具体应用设计。这个分解比较精妙,也很容易理解,实际上一个框架的最终产出是一个完整的抽象过程,框架代表规则的限定范围,库代表构成规则基本元素的部件集合,而应用则代表具体规则下实现某类需求的具体过程。一个成熟的框架以一个稳定的规则去解决一类能解决的问题,而解决的过程则交给应用设计去通过库来实现,更关键的是,框架能让一类问题在被解决前可解决性就已经得到验证,因为框架的存在本身就是规则的存在,它具备了验证完备性的可能。这里拿房子做一个比喻,一个人购买一套商品房的时候不用等到装修完毕再去验证房子住不住得了人,因为“居住”这个基问题是框架得以解决和验证的问题,装修决定了怎么住舒服的问题,但不影响基本框架,当你入住房子时,你可以改变装修,但是不用把框架推倒重来。事先验证可用性能把产出风险降低,而这就是框架的价值体现以及架构师的作用之一。
从根本上讲,框架的实现是抽象的过程,在演讲中爱民提到抽象有共性抽象和本质抽象两种,但实际上我认为在现实生活中,这两种抽象的界限并没有那么清晰。什么才是本质,这个是没有定论的,从古到今,哲学家和自然科学家们都在寻找“本质”,然而至今还没有人能很有力的回答“本质”是什么。而数学家是善于抽象的一群人,他们更多地寻求共性而非本质,也许共性抽取的越多,就接近于“本质”,但谁知道呢,又有谁真正理解本质的涵义。道格拉斯的科幻小说《银河系漫游指南》中说到关于生命、宇宙的终极问题的答案是42——可没人知道42究竟意味着什么。所以,我认为现阶段抽象更多的是指共性抽象,本质抽象可能仅指接近某个状态,那个状态是什么,我不知道。
数学的符号抽象和计算机语言有异曲同工之妙,在数学领域,简单的加、减、乘、除、乘方、开方,是由符号表示的过程抽象,有理数、实数、向量、矩阵则是数据抽象,它们之间的预算则是规则的演变,并不耦合特定的数和符号,所以从这个意义上说,一组特定符号就能构成一个完美的框架。记得还在大学的时候,学信息论的时候,我自己把熵的定义从实数扩展到向量和矩阵,结果发现整个课本上从第一章到最后一章的所有习题几乎都能用两个公式来完美表达,现在想来这就是一个框架的魅力。在51js上曾经跟人争吵过一个问题,其实那个问题背后的原因就是在一个设计上,我把“mul”作为一个抽象符号,而对方则作为一个函数标识,所以最终导致不同的实现。这个问题本身没有绝对的对和错,两个设计者站在不同的层次和角度上看问题而已。
抽象本身是一个过程,数学符号或者语言表达是实现抽象的工具,计算机语言是一种非常受限的语言,然而只要这个语言是“图灵完全“的,他们在最根本的表达能力上都是没有区别的,比计算机语言更复杂的自然语言是显然能容纳图灵机的,因此不论是中国人、英国人、还是法国人、意大利人,大家在最基本的表达能力上是没有什么区别的,但是语言特性会影响思维习惯,不过这不是我想谈论的重点。
最后回到问题的出发点,再次强调最初的问题,不管框架还是库,软件设计本身就是一个抽象的过程,框架和库是抽象的具体产出物,用抽象思维表达问题必然会导向这样的结果,因此架构师要做的事情是寻找规律和表达问题,在这里经验很重要,另外就是要避免陷入演算细节。
前面说了那么多,其实只谈了实践层面上的设计抽象问题,这只是架构师工作的一小部分内容,关于系统架构师的工作范围,我同意爱民的观点,我觉得要成为一名优秀的系统架构师,我的路还很遥远……
对于数据的抽象,往往是最简单,但是也是最具有难度的东西。
我还只是个新人。