众所周知,讲师承是很羞耻的事情——尤其对中国人来说——王小波成名已久,才战战兢兢地说,“终于有勇气谈谈自己的师承”。我有勇气谈我的师承,不是我有什么成就,而是两个原因:1. 在计算机编程这个领域,师承没有那么严肃,我的所谓师承就更不严肃;我做得不好,是我的问题,不算给老师丢人;2. 我觉得我走过的路比较省力,可能帮助很多人避免浪费。
在编程方面,我的第一个老师,应该是Charles Petzold。我在MSDN的文档里面遇到他,然后知道了这本书。这个封面是第五版的封面,我在学校的时候应该是第四版或者第三版。从Charles Petzold这里我学到,所谓Win32 API,无非就是Windows的设计者跟程序员的约定,这些约定有设计者自己的权衡与取舍,但没有任何神秘和高贵的地方,程序员根据自己的需要和理解决定应该如何使用这个API,达到自己的目的。而很多所谓未公开的API,可能是因为这个API已经准备放弃,或者存在某些隐患,一般情况下不应该使用,以免埋下隐患。

然后应该是Jeffery Richter,就是Programming Application for Windows的作者。下面这个封面已经是后来的新版,之前的版本找不到了。

相比Programming Windows,Jeffrey Richter的书更偏向软件跟操作系统的交互,而不关心Windows的界面设计。
从Petzold和Richter身上,我第一次直观感受到来自真正专家的信息费效比有多高。我们在BBS上,论坛上网站上看到的信息,经常是这些一手信息的转述,可能还经过很多道转述,不见得准确,也不见得完善。仅仅依赖这些二手三手信息,学习过程可能会非常痛苦,而且效率低下。
也从这时候开始,我更注意看原版书,很快就注意到Richard Stevens,他的《TCP/IP详解》大家都知道了:

Stevens是很多早期RFC的作者,内容非常权威,而且不仅讲设计,还讲为什么这样设计。他的Unix网络编程系列,也是如此。
其实我反复阅读的,也只有TCP详解的第一卷,也足够打下坚实的基础。
从这时候开始我可以独立查找资料,在安全和加密这个领域,遇上了Bruce Schneier和他的Applied Cryptography。

这时候我已经能够意识到,好的老师能够帮你快速建立知识体系和框架。Schneier对于协议、算法各自在安全中的作用,谈得特别透彻,给我在后来的工作中理解安全问题建立了良好的框架。
大约在同一时间段,我开始经常遇上malware,经常需要对系统进行修复,所以先接触到了Winternals的工具,知道了Mark Russinovich,以及他跟David Solomon合写的书Inside Windows 2000。

Russinovich对我的启发类似于Richter,他们更关注操作系统底层,Russinovich更是从Linux得到启发,把一些功能特性移植到Windows上,我后来有很多项目,都受到这个思路的启发。
Inside Windows 2000经过多次更新再版,现在叫Windows Internals吧。我已经有几年不再做Windows原生程序开发了,但是我推荐这本书给所有关心操作系统运行机制的人。
回想起来,从大学时候起到现在,我的技术主要是这些人和书籍教会的。把他们叫做我的师承,可能有攀附之嫌,因为我并没有形成有影响力的作品,但也是真诚的。