做为技术道路上的过来人,我也分享一下我的体会。简单来讲,成为技术大牛虽然有难度,但其实也没那么难。要成为任何一个领域的专家,你需要做的是学会该领域的已有知识,所以你只要学习就行了。真正有难度的事情是创新,是利用已有知识和技能创造出人类还不知道的有价值的东西。(篇幅较长,请耐心看)
纸上得来终觉浅,绝知此事要躬行
我自己总结了一句话:“技能学习这件事,有技巧无捷径”。有技巧是说,并不是说你花了很多时间,技能就一定会提高的,这里面有方法论的区别;无捷径是说,即使知道了技巧,不下功夫也是不行的,正所谓,纸上得来终觉浅,绝知此事要躬行。
拿我自己来举例子。我在上大学之前从来没有接触过PC,甚至都不知道有个人电脑这种东西。操作电脑、编程这件事对我而言完全是零基础,自学成才。由于对计算机有强烈的兴趣,从大一开始,我花了很多时间学习编程(当然也花了很多时间玩电脑游戏),诸如个人电脑操作指南、打字法、Windows用户手册、微机原理、Windows/Unix操作系统、各种C/C++编程书籍(Turbo C、Borland C/C++、Visual C++),我看了一大堆书,也写了一些程序练手。直到大四,我还是觉得很迷茫。一方面感觉自己学了很多东西,另一方面又觉得好像什么都不会。具体点说,如果让我写个编程作业,问题不大;但是如果让我写一个有完整功能的应用程序,干不了。换句话说,我的水平可以应付学校里的作业,但是还没能力做真正的产品开发。
工作时既要用心,还要关注细节
这让我很焦虑,不知道毕业怎么找工作。当时我的想法,是找一家公司实习,工资多少无所谓,一定要能锻炼技术。我选择的公司是一个创业公司(现在不存在了),同学推荐的,领导和技术团队都很牛。我的面试很糟糕,人生的第一场面试,几乎所有问题都搞砸了。领导看在推荐人的面子上把我留下,工作内容是组装电脑和安装各种软件,跟电脑城里卖电脑的差不多。由于在大学里装过无数次电脑,我干的不错。印象最深刻的一次是有一回别人刚攒好的电脑系统(SunOS 4)启动到登录界面时出现花屏,鼠标滑到哪儿花到哪儿。领导让我判断是什么问题(他技术很好,其实在考验我),我说可能是因为显存不够,换一块有两兆显存的显卡试试。换显卡后果然好了。
大约是从那以后,领导开始让我参与软件开发。我写的第一个商业程序是一个应用网关,把一种医疗仪器集成到我们自己开发的医疗信息系统。由于后来需求的不断扩大和我本人的完美主义倾向,这个软件我重写了三遍。最开始很普通的一个模块,最后可以做到可以方便地接入各种新设备(不同厂商、不同种类),也因此变成了核心模块,产生了独特的商业价值。有的项目中公司拿出来单独卖,也专门为它申请了专利保护。
这两件事我学到的是,做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。从技术角度,我也学到了很多东西。比如,如何用RS232和设备通信;如何写一个TCP服务器;如何写一个独立的Windows应用程序;如何把一个普通程序做成Windows NT Service;如何写一个跨平台的程序(Windows和Linux都能跑);如何设计一个框架,能够快速集成多种协议(RS232串口、TCP/IP、有状态协议、无状态协议等);如何逆向分析各种设备协议(我们是小公司,拿不到医疗设备公司的协议文档);如何把设备集成框架设计得简单易用,我不在的时候(当时我还没毕业)别人也能快速集成新设备。我觉得任何一个值得做的项目都会学到很多新知识,成为技术专家的关键一点是你要把每一个有价值的知识点研究透,这样多个项目积累下来,你就有了很多很扎实的知识点,这些知识点积累起来,结合书本知识,就能系统化。什么叫研究透?想像一下世界上该领域的顶级专家来跟你交流,你是否能做到他问的任何问题都能对答如流。
做事要知其然,还要知其所以然
已经过了快二十年,我对这个程序的很多技术点还能记住,是因为当时真的下了很多功夫(不然不会重写三遍)。我面过很多人,不太理解的一点是发现有些人对自己做过的东西说不清楚,有的细节甚至才过了几个月就忘了。我面人的基本要求是知其然还要知其所以然,自己做过的东西说不清楚说明不怎么动脑子,知其然不知其所以然说明对技术没有追求,不关心背后的原理。
基本上我写过的所有软件,设计要点我到现在都能记住。要做到这一点,一方面是做任何事情都要下功夫,关注细节;另一方面是要把设计和实现分开,实现可以忘记但是设计不能忘。
学会时常总结和反思,多多动脑子。
大家都是普通人,我的记忆力也很一般。参加同学聚会的时候,大家经常回忆往事。我经常发现当年一起做过的事情,别人说的津津有味,我却完全想不起来。设计和实现分离是我刻意训练过的一个技巧,目的之一就是为了长久记忆。设计是有规律和普遍意义的,可以用在以后的工作中,值得花更多的时间去思考和提炼,而花更多的时间恰恰有助于记忆。实现细节太多,记住不容易,很多时候也跟具体的项目有关,对以后的项目不一定有帮助,没必要刻意去记。中学的时候做题,我喜欢总结规律,从一道题中归纳出一类题的解法,找到快速解题的公式。我甚至还要求自己对某些题型要在一定的时间内解出来(我中学的时候总结了一套解题公式,可以快速对付各类题型)--这些都导致我会花很多时间研究解题技巧。而花了这么多时间得出的解题技巧,记不住也难。所以我说,如果做过的东西说不清楚,说明不动脑子,下的功夫不够。
这个网关程序我在兼职状态下做了三年多(从大四到读研),真正的密集开发可能只有不到一年的时间,还不是全职的,后面忙着本科毕设和研究生学业,变成顾问角色,很少去公司。我在那时就已经成为了Windows技术专家。做d2hackmap游戏外挂是在研究生后期,那个时候我的C++、Windows技术水平已经很高了,如果你去看d2hackmap的源代码,可以发现里面用了各种Windows、C/C++、汇编技巧。
在这个网关开发的过程中和研究生期间,我学习了哪些技术?具体来说,有当时所有主要的Windows开发书籍,所有主流的C/C++编程书籍,还有历期Microsoft System Journals(后改名叫MSDN Magzine)上感兴趣的专栏文章,都看了一遍。问题是,同样的我,为什么从大一到大四花了那么多时间学习编程,进展很慢,然而实习了不到一年就有很大进步呢?我觉得有几个原因。一是原来的学习虽然有一个模糊的方向,但是没有明确目标。二是没有特定的工作环境。三是缺乏过来人的指点,不可避免走了弯路。
明确自己的方向,学会自主学习的技巧
有明确的交付目标和时间点,才会有压力,才会针对具体问题去寻找答案,这样就把漫无目的的学习范围大大缩小了。环境也很重要,在家里工作和在公司工作效率差很多,这跟在宿舍自习和在教室自习差很多一样。过来人的指点可以避免走弯路,让你在第一时间做出正确选择,节省大量时间。但是要记住,别人对你没有义务,所以别指望高手会手把手教你。我的学习更多的是观察优秀的人如何做事以及他们对事情的观点。
通过项目学技能的好处是任务很具体目标很清晰,缺点是容易见树木不见森林,知识不系统。通过看书学技能的好处是知识体系比较完整,有全局观,缺点是书本知识比较抽象和枯燥,不容易理解。所以这两者一定要结合起来。
要不停地向他人学习,学习他人的优点
总结起来一句话,技能学习有技巧无捷径。有技巧是说学习技术需要实践和看书相结合,有高手指点就更好,关键是一定要实践,光看书或者做练习题是不行的;无捷径是说一定要自己下苦功夫,不要幻想有高手带你飞。我在上海生活十几年,上海话都听不懂。因为智商不够吗?肯定不是。因为我不知道学习语言的技巧吗?也不是。是因为我没有学习上海话的压力,也缺乏主动性,没有下功夫而已。
就技能学习而言,花同样多的时间,有专业教练手把手教肯定是效果最好的,这也是为什么在任何竞技领域,业余选手肯定干不过职业选手的原因。但是工作中的同事不是你的私人教练,所以工作中的学习要靠自己,要注意观察高手的工作方法、听他们分享的观点,迷茫的时候找他们指点。
3