之前我们在《技术的正宗与野路子》一文中提到过,「做技术,犹如修习一门武功」,那么按照这种说法,我们平常阅读过的那些好的技术文章、书籍、资料、文档,自然就相当于「武林秘籍」了。今天,我们就来说说在程序员江湖中这个不容忽视的存在——武林秘籍。
何为武林秘籍呢?这是个听起来就很厉害的名字,自然不能是普通之物。在金庸的江湖中,武林秘籍一出现,往往掀起一场血雨腥风,各路武林人士均想据为己有。俗话说,物以稀为贵,武林秘籍的第一个特点就在于,并不是所有人都能得到它。即使在神仙姊姊的琅嬛福地中,那里虽曾汇集天下各门各派的武功典籍,但唯独缺少几门最厉害的武功,比如少林的「易筋经」,丐帮的「降龙十八掌」,大理段氏的「一阳指」和「六脉神剑」。这些自然都是极厉害的武功秘籍。
这武林秘籍的第二个特点,就是练完了能够功力倍增,短时间内从菜鸟变成武林高手。这方面的例子都太典型了,比如郭靖,就是靠着练习「九阴真经」和「降龙十八掌」,功力一路高歌猛进,终成一代大侠;段誉,本来一点功夫都不会,结果练了「北冥神功」、「六脉神剑」、「凌虚微步」这一些列的顶级武功之后,居然也成为了一等一的高手。甚至一个本来很不起眼的小人物游坦之,偶然习得了「易筋经」的法门,也能跻身武林高手的行列。
这武林秘籍自然是好东西,但在金庸的江湖中,几乎只有靠机缘巧合才能得到它。这到底有多巧合呢?我们以「九阴真经」为例,按时间的先后顺序缕一缕它的来龙去脉,你就知道了。
《九阴真经》,作者黄裳,北宋人,当年他受徽宗皇帝旨意搜罗和校对天下道家之书,称为「万寿道藏」。没想到,黄裳在反复研读了总共五千八百四十一卷「道藏」经典之后,竟然无师自通,悟得了武学精要。后来他隐居绝地四十余年,思考天下武功的破解之法,是以写成了《九阴真经》。至两宋年间,《九阴真经》在江湖中出现,于是有了第一次华山论剑。「中神通」王重阳力压群雄,夺得真经,但却未练经上武功。王重阳仙逝之时,嘱咐「老顽童」周伯通将《九阴真经》上下两卷分置两处,以免同时落入奸人之手。于是周伯通将上卷藏好后,携带下卷送到南方雁荡山收藏,结果路上遇到东邪黄药师和他的妻子。有过目不忘之能的黄夫人阅读了两遍之后,将《九阴真经》悉数记下,并骗周伯通说这只是本假经书。周伯通一气之下把《九阴真经》的下卷原本烧了个干干净净。后来黄夫人将记忆中的《九阴真经》誊写出来,这本下卷就这样到了桃花岛上。后来黄药师的两个弟子——陈玄风和梅超风,将《九阴真经》的下卷偷了去,并带出了桃花岛。但由于缺少上卷的内功基础,陈玄风夫妇只能练习下卷中的外门功夫,最终将这门上乘武功练到了邪路上。等老顽童明白被骗之后,独自携带了《九阴真经》上卷到桃花岛找东邪算账,终因武功稍逊一筹,被黄药师囚禁在桃花岛,居然待了十五年之久。再说陈玄风当年偷走真经之后,怕宝经被盗,将下卷经文刻在了胸口(居然也能刻得下:-P),并把原经烧毁。后来他们在蒙古大漠与江南七怪遭遇,一场大战,当时还是小孩子的郭靖被陈玄风捉住,无意间竟用匕首将其刺死。丈夫死后,梅超风用匕首将他胸口刻有真经的皮肉割了下来,硝制成革,随身携带。在郭靖十八岁的时候,他与黄蓉一起进赵王府盗药,巧遇梅超风和江南七怪。在混战之中,妙手书生朱聪从梅超风身上盗走《九阴真经》下卷,并交与郭靖。后来郭靖在黄蓉陪同下赴桃花岛之约,与周伯通相遇,至此,上下两卷终于重新合到一起。老顽童出于恶作剧的目的,欺骗郭靖将《九阴真经》上下卷背诵下来,从此,《九阴真经》归了郭靖。
这特么太巧合了好吗,仿佛发生的一切都是铺垫,《九阴真经》上下两卷分分合合,跨越了时空,最后送到了郭靖的手上。这些巧合对于自带光环的故事主角们来说自然十分有利,但对于普通的习武群众来说就很糟糕了。绝世武功往往被少数人据为己有,不但普通人没有习练的机会,甚至像西毒欧阳锋这等厉害角色,忙碌半生也连个《九阴真经》的毛都没瞅到,最后只落得个逆练真经的下场。不得不说,这也太不公平。
更有甚者,已经练成神功的大侠们,通常也不会轻易向人传授武功。比如洪七公,他这「降龙十八掌」的武功绝学,连丐帮弟子也不轻易传授,只有那些表现好的、立了功的,才肯传个一招半式给他。这简直没有一点分享和开源的精神……长此以往,大大不利于武林的繁荣和年轻人才的选拔啊。
所幸的是,在今天的程序员江湖中,我们已经进入了一个高度开放的世界。几乎没有什么「武林秘籍」是我们得不到的。各个标准化组织将各门各派的技术整理、分析,抽象成规范、协议,变成行业标准;武林高手们也都乐于将自己修炼多年的「功夫」以开源代码、文档等形式分享出来。借用《技术的正宗与野路子》中的概念,我们可以将某个技术领域中的高度抽象的Spec文档,看做是该领域的「武林秘籍」。我们学习一门新知识,最终就是要看懂这个Spec。
对于我们来说,得到这些「武林秘籍」已经不是问题。如果能读懂它,也确实能够在短时间内功力倍增。然而现在问题来了,当这样一份秘籍摆在你面前的时候,你能否读懂它?如果我们是初次接触一个全新的领域,这时候我们拿到了这样一份Spec,几乎可以肯定地说,一定是读不懂。
我现在举几个小例子来说明这个困难。
第一个例子,就拿我们经常打交道的HTTP协议来说,它的Spec应该说就是RFC了,以HTTP 1.1为例,RFC 2616。我摘抄一段,大家体会一下:
However, it is possible that a sequence of several requests is non-idempotent, even if all of the methods executed in that sequence are idempotent. (A sequence is idempotent if a single execution of the entire sequence always yields a result that is not changed by a reexecution of all, or part, of that sequence.) For example, a sequence is non-idempotent if its result depends on a value that is later modified in the same sequence.
就算我们对HTTP很熟悉,要看懂这样一个抽象描述的句子,仍然不免要颇费力气。这说的到底是什么意思呢?这个句子主要在讲「幂等性」,中心思想是说:就算一个操作序列的每个操作都是幂等的,也不能说明这个序列是幂等的。但这又是什么意思呢?我们这里不去详细解释它了,我们的重点不在这里。
从这个小例子我们可以分析一下,Spec为什么难懂呢?首先,它是英语写的,实际中很多程序员都达不到阅读英文原文的水平;其次,它太抽象了,说的都不是具体的东西,是一种高度概括。
但想一想,如果我们都能读懂它,前景该有多么美好!这可是第一手资料。像HTTP协议相关的知识,我们经常需要查阅Status Code、各种Header、Cache策略等等,我们再也不用在网上查找各种描述片段了,就查这个RFC就好了,精准而全面。道听途说来的总不一定准确,对吧。由此还有一个附带的好处,我们彼此交流起来词汇也统一了,交流起来不那么费劲了。
顺便再举两个小例子。
第二个例子,出自苹果官方的开发文档《Core Animation Programming Guide》:
With view-based drawing, changes to the view itself often result in a call to the view’s drawRect: method to redraw content using the new parameters. But drawing in this way is expensive because it is done using the CPU on the main thread. Core Animation avoids this expense by whenever possible by manipulating the cached bitmap in hardware to achieve the same or similar effects.
这句话描述了iOS客户端架构中的一个基本问题:UIKit与Core Animation的关系。
第三个例子,出自《OpenGL ES Common Profile Specification Version 2.0.25》:
Vertex shader execution yields a vertex coordinate gl_Position which is assumed to be in clip coordinates. Perspective division is carried out on clip coordinates to yield normalized device coordinates, followed by a viewport transformation to convert these coordinates into window coordinates.
这句话描述了OpenGL ES中的基本的坐标(变换)问题。它之所以有点难懂,主要是因为它包含了大量的名词术语,比如vertex shader, clip coordinates, perspective division, normalized device coordinates, viewport, window coordinates,它们都涉及到一些基础问题。
从所有这些例子可以看出,这些Spec晦涩难懂,语言高度概括,名词术语繁多,理解每句话都需要丰富的上下文支持。但一旦读懂,势必技术修为上能提高一个层次。那看不懂咋办呢?其实也不用太着急。郭靖开始背《九阴真经》的时候,能读懂吗?能理解吗?显然不能。后来经过了多次实战,多次观摩高手过招,又反复咀嚼原文,才慢慢理解它的精义。
古时候,圣人著五经:《诗》,《书》,《礼》,《易》,《春秋》。微言大义,难懂吗?难懂。所以后来很多人为「经」做注释,称为「传」、「笺」、「注」、「疏」等等,比如春秋三传《左传》、《公羊传》、《谷梁传》就以《春秋》为本,做了很多注解。后来人们发现这些注解仍然难懂,于是继续为注解做注解。比如《十三经注疏》就为包括春秋三传在内的十三部经典做注。再比如,《毛诗》为每篇《诗经》原文做序,介绍本篇的内容、意旨,而著名的《郑笺》又是对《毛诗》做注解。
按此类比,前面提到的Spec,就属于「经」这一层次的著作,它是抽象的、冰冷的、系统的,满是森严的逻辑和规范,没有丝毫的幽默感,一副不食人间烟火的架势。而为Spec做的注解,就是《技术的正宗与野路子》一文中提到的Tutorial。一般来说,一本好的技术书籍也应该是一个好的Tutorial,它循循善诱又不失严谨,将Spec中抽象的概念展开成具体的实例,为初学者提供逐步深入的门径。一般来说,看完一个好的Tutorial,你基本就能看懂Spec了。
自从开了公众号以来,不时地有人来建议写本书吧。写本书并不难,但写本好书真的很难。忘了是哪个博主曾经说过,不到45岁不会写书,因为只有到了一定的年纪才能有足够的积累,才能写出一本好书。具体是多大岁数开始写并不重要,重要的是要有足够的能力和负责任的态度来做这件事。
写出能称得上是「经」或「武林秘籍」这个层次的书,自然是很难做到,退而求其次,把「经」的注解写好,也还不错。但如果只是把别人的观点简单地陈列在一起,甚至各处摘抄而拼凑出一本书,这种缺乏创造性的事情还不如不做。
公众平台的一个好处就是,可以让我和你们随时交流想法,成熟的也好,不成熟的也好,都能立即获得大家的反馈。希望我和你们一起成长,有一天也能写出一两本经典的东西出来,而不是写本烂书贻害人间,是吧。你说呢^-^
(完)
其它精选文章: