转自:http://blog.csdn.net/my_business/article/details/7170625
第二章 感悟----回顾走过的路
感想性的文字相对比叙述性的要难写很多,尤其是对我们这种搞技术的,煽情不是我们的特长,所以内容的表述肯定不会精彩,但是我会尽量确保真实,当然如果涉及到个人信息的,也会有所保留。首先我会说明下自己近十年间走过的路,自己的成长,挫折,机遇和挑战,然后我会分享一些平时积累的感悟,这个中间如果大家有什么希望讨论的,可以提出来,如果我有想法的,我会把观点加到文章中。当然,所有写的只代表自己当前的想法,不存在对错,甚至再过几年,完全推翻自己目前的观点也有可能。或许,这就是真实的人生。进入正题~~~~~
一、我的高中
从我的高中说起吧,那是当地最好的一所高中,记得在整个苏南地区高考平均成绩都是前几的,甚至有过几次的第一。但是,这只是学校的荣耀,它不属于我。高中三年间,自己的考试成绩应该绝大部分都是属于排在后1/3的。曾经考进这所高中是自己的骄傲,但是后来它不是了,因为我没有考上一个好的大学,虽然后1/3的成绩已经能够确保自己进入本一的学校(学校高考平均成绩一般都会比本一线高50分左右)。记得高中时有个同学,全国计算机比赛一等奖,直接报送到名牌大学计算机系,当时自己的想法就是,只有他那样的人才合适搞计算机的。所以那时候以及后来很长一段时间都没有想过自己会进入IT业。
二、我的大学
自己的专业是自动化类别的,本科阶段跟软件几乎绝缘,基本可以一笔带过,除了学了几门课叫C语言,微机原理和单片机等。然后就是考研,因为家人的规劝和自己的保守,还是选择了本科的学校,虽然考研成绩比本校分数线高了近100分,但也没有什么好后悔的,毕竟路是自己选的。
影响自己发展方向的一件事发生在研二,师兄毕业后,自己在实验室有了自己的座位,电脑还有一块开发板,另外导师还给了点经费,可以自己去买些需要的芯片和元器件,软件开发之路应该是从这里开始的。自己先复习了C语言,当然还有开发板以及处理器的相关资料。在捣鼓一段时间后,就不再满足于这些,开始接触一个开源的嵌入式实时操作系统,考虑把这个OS移植到开发板上,因为当时可以找到的移植实例都不能直接用,所以为了移植成功,基本上把这个OS上70%的源码都看过了,最后终于移植成功,这是我第一次体会到那种编程的快乐,和一丝成就感。这里加一段说明,其实在这段时间里,自己还去应聘过一个很小公司的程序员,结果是,直接被通知说自己不太适合做软件,即使去了他们那可能也只能拿跟软件专科生差不多的收入。这也刺激了自己提高软件开发能力的决心。之后,自己又开始学习C++,第一本看的书记得是《C++入门经典》(作为入门书太厚了,重点不够突出,写的一般),但是通过学习,至少自己对C++,对面向对象思想有了那么一丁点了解。记得毕业前自己也应聘过一个C++的岗位,好像是叫广达吧,也是苏州的一个公司。笔试面试后,对方的技术经理很诚恳地建议我还是找本专业的工作比较合适。其实对方真的挺中肯的,连个C++虚函数都还没搞明白所以然,可见当时自己软件基础确实还是比较薄弱的,没有太多竞争力。这次应聘经历又让自己过后狠狠加强了一下自己C++的学习(呵呵,对自己还是要狠一点,什么不行就补什么呗,只要是技术就是给人学的,不存在学不会的技术)。其实毕业那会,本来自己最想做的是嵌入式方向软硬结合的工作,毕竟在这方面自己还稍微有点竞争力,到最后还是没能如愿,第一份是软件开发的工作,但是在这里我还是发自内心地非常非常感谢我的第一家公司,他提供给了我一个很好的机会,很好的平台。
三、工作这5年的那些事儿
工作5年,说长不长,说短也不算短,毕竟人生黄金时期(25~45来算的话)也没几个5年。在这里我不会像写面试经历那样,把5年间待过的公司,做过的项目一一写出来,毕竟自己不是写自传,也不是写项目实战案例,而且自己也没那个水准去写这些,如果你需要,我觉得名人自传很多,一些专家写的项目实战书籍也很多,这些会是比较好的选择。而我,我会以我的方式,表达一些我的观点和体会,不求大家认同,只代表现阶段自己的一些感悟,如果能作为大家茶余饭后的一些谈资,那我已经满足了。
(我会先提出论点,然后说明自己的观点的形式来叙述)
1.技术的广度和深度不是两条绝对的平行线
经常有人会问,我是该尽量拓宽知识面向广度发展还是朝一个方向努力追求技术深度,曾经很长一段时间,我也有这样的疑惑,甚至经常今天觉得应该在广度上发展下,过几天又觉得还是深度上探索下吧,这种周而复始的状态转换过多少次我都已经不记得了,但是正是在这样的多次转换过程中,让我体会到捕捉到一些东西,我逐渐意识到,所谓技术的广度和深度不是两条绝对不相交的平行线。你问我这是什么意思?别急,且听我慢慢说来。
首先,很多技术的本源都是相同或相似的,比如说所有面向对象语言,都是基于面向对象思想和原则,比如说设计方案和框架模式, 都可以参考前辈们归纳出的各种设计模式,比如说操作系统,都不外乎任务(进程,线程)管理,任务间同步与通信,内存管理,文件系统管理,网络接口等这些主要模块,所以抓住比较本源的东西,你就可以做到一招通吃或者学习效率事半功倍。到这里,你或许会问,这跟前面的所谓平行线的论点有什么关系呢?我的回答是,绝对有。既然大家的本源都是类似的,那我们在追求广度追求多种技术的时候,因为各种技术涉及到相似的本源特性,岂不就是说我们一直都是在相同的本源技术上进行着我们自己的探索,那既然如此,这必然带来对同种本源技术在深度上的领悟。而对深度领悟的提高,也必然帮助我们提高在广度上发展时的效率。
呵呵,可能说的有点抽象,晦涩难懂吧。那就结合自己的实际经历说说吧。比如说,早期我学了C++,后来心血来潮,突然感觉java很时髦,就又学了下java,而我在学C++时,没有体会到接口interface的意义,但当我看java时,发现interface原来是这么回事,原来能起到这样的作用。你看,本来我是一时兴起,想在追求多门语言的,后来却对C++的理解产生了进一步的深化,这就是一种从广度到深度的转化。又比如说,我学过STL,但是突然又听说boost功能更多更强大,我就又看了boost,在我学STL的时候我知道智能指针auto_ptr,但是对它的理解还是局限在应用的层面上,但是当我看了boost,看了scoped_ptr和shared_ptr,我又明白原来智能指针还有这么回事,它进一步加深了我的理解,让我能够更好地应用它们。这也是一种从知识广度到深度的转化。再比如说,我曾有过多种操作系统开发的经验,而windows上的应用开发做的不多,当时了解到Com是很多微软技术的基础,所以虽然工作中的项目几乎不会用到,但还是找时间去学Com,学了后才发现,原来IPC,RPC是可以这样来封装和实现的,同时我还看了ATL,这又让我知道,原来C++可以不通过虚函数而用模板来实现多态的,而且效率更高。这还是一种从知识广度到深度的转化。到这里也许你会问,既然广度可以促进深度上的提高,那深度到广度呢?其实,答案是类似的。还是以我为例吧,记得我研究生时期,学了C++,然后看网上有人介绍,学C++一定要学Com这个C++的高级应用,于是我图书馆借了书,回实验室就开始啃,翻了几天,根本看不出个所以然来,或者根本体会不出Com的根本所在。另外,当时毕业前我还看四人帮的《设计模式》,也是看的云里雾里,讲不出个所以然来。原因呢?原因是当时我对C++,对面向对象的基本原则,对UML都没有深入的理解掌握好,在广度上寻找发展,当然是事倍功半了。而后来在我有了一定基础以后再去学Com,几乎没有什么障碍,很快就能体会到它的根本所在。比如说Com套间的概念,比如说Com的包容与集合,这些都不是什么问题。记得我是一周不到就看完潘爱民写的那本书的,而且是在上班抽空的状态下。所以这又告诉我,基础的东西一定要学的精,这会决定你最后能走多远,能发展多广。这其实就是一种从深度到广度的发展。
也许有人又会问,那难道就不该在一条路上一直钻下去吗?其实,当然可以,如果有这个机会,有这个条件,而你又有这个兴趣与动力的时候,这应该是成为一个特定领域专家的最快方法。但是,我想说的是,大多程序员选择公司,选择项目都是身不由己的,往往是项目决定你做什么技术,工作决定你做什么项目,而不是由你决定,特别是一线城市(北上广深)以外的地方,IT圈子就那么大,好的机会本来就不多,往往你选了RMB就选不了公司,选了公司就选不了技术,所以在这种情况下,抓住最根本的,那么即使在学习不同技术时,也会对我们在深度上有不小的触动。毕竟,当今的软件已经很少再是一两种技术打天下的局面了,同一产品,多技术多语言多框架已经是一种趋势了。当然我也要声明一点,这里所谓广度的追求,不是让你对技术朝三暮四,虽然是一个“广”的概念,但是仍旧要有“度”的限制,选择真正对你有帮助的,如果你今天搞个嵌入式或操作系统和驱动开发,明天又去搞Web服务,前端开发,那你就是跟自己过不去了。
到这里,我也不知道是否已经表达出了我想说的东西,总之在我看来,技术的广度和深度不是两条绝对不相交的平行线,对它们的探索和追求也是交互贯穿在我们的挨踢生涯中的。
2. 关于职业和技术方向的选择
经常有人会问,搞IT什么方向最有前途?我该学哪些技术呢?说实话,我不知道。我不否认,确实存在一些领域相对待遇会比较高,比如说操作系统方向的,嵌入式驱动方向的,检索算法和大数据挖掘等。之所以出现这种情况,首先这些方向的门槛比较高,不是随便学下就能入门的,其次由市场决定,由于真正掌握这些技术的人供小于求,市场自然会拉高这些领域。但是存在高薪领域并不意味着你进入这种领域就可以拿到高薪,因为这里存在个人能力,机遇,局部地区岗位需求等多方面因素的影响。 那么我们应该怎么选择我们的职业和技术方向呢?我的回答是,选适合自己的。呵呵,很多人肯定会说,这绝对是一句屁话。不急,听我慢慢来说明吧。
适合自己的不一定是自己最感兴趣的。你说为什么?既然要适合自己,那肯定会选自己最感兴趣的啊?在这里我想先问问各位IT同胞,有多少人在毕业或者跳槽时,选择到的工作是自己最感兴趣的?我觉得这个比例不会太高。因为并不是你最感兴趣什么,就会有公司等在那给你提供相应的职位的(特别牛的人不在这个范围内),就像我前面说过的那样,往往在公司,薪资,技术方向等方面你必须做出自己的选择,往往很难顾全到所有方面。那么到底什么是适合自己的呢?适合自己的可以是你当前积累最多的,可以是最面向你当前工作的,可以是目前市场最需要的,当然也可以是你最感兴趣的。绕了个圈,还是等于没说,难道适合自己的就是什么都可以?确实,对每个人来说,什么是适合自己的本来就会有不同的考虑,会产生不同的结果,所以本身没有固定的答案。但是如果问我,我会说适合自己的就是当前能够供我选择的。因为我觉得毕竟绝大部分人没有所谓的学校背景,工作背景或者家庭背景,能够供我们选择的已经很局限,能够得到的机会不会很多。如果再执着与自己想要的,这不现实,毕竟生活是现实的,为了生活我们也必须现实。仍旧说说我的经历吧。
前面的章节提到过,曾经大学毕业时,我的方向是软硬结合的嵌入式开发,当时我最希望从事的是DSP,ARM等平台的嵌入式工程师,但是理想跟现实的差距,让我没有太多选择,记得那时我一共拿到过3个offer,一个是苏州一家合资单位(好像是江南快速电梯)的销售工程师(记得是做海外支持那一块),一个是一家很小的软件公司的软件开发,还有一家算是外资知名企业(但本身不是做软件出名的)的软件开发,我选择了最后一家,也等于是放弃了自己硬件那块的一点优势。面对现实,也意味着我要付出更多去适应现实,开始是做C++方向设备端软件的开发,从C++,到设计模式,到面向对象设计原则,到UML,到网络通信,到UI设计,再到项目管理,自己学过看过的技术和书籍应该不在少数。可以说这些内容对自己基本都是全新的领域,但是为了提高自己的竞争力,必须努力。后来,因为职位发展和上司要求 ,自己又需要统筹java相关的项目,为了让自己有说服力,我又花了时间去学习java,struts,数据库,SQL等。当然在非主攻领域,并不是需要做到绝对精通,但是面对工作需要也必须要有一定程度的掌握,而且也要能提出相应由价值的意见,要不你凭什么去统筹,凭什么去说服别人。另外还有很多类似职位或工作变动的情况,从Linux到windows,从IPC到Com,从MFC到ATL等等领域,自己都或主动或被迫地涉猎过。当然有些技术比较熟悉,有些只是粗通了解罢了。
其实说这么多,可能表达目的不是很明确。我再总结一下吧。总的来说,职业方向和技术选择在很多情况下,对很多人来说,是不受我们完全控制的,我们能够做的,就是面向适应当前的社会或工作需求,同时适当展望未来在工作中可能有的一些需求和机会,可能你不是百分百有兴趣,可能你是被动选择的,但是该面对现实的时候,不要犹豫,不要怨天尤人。
社会,市场或公司永远不会来适应我们的,所以我们只能主动去适应他们。
3. 关于换专业转投IT
因为前面正好看到有人回帖问到这个问题,我就简单说说自己的看法。首先,除非你考了很多证书能证明你的IT能力,要不这真的不是一个很好的选择。作为企业,凭什么选这样半路出家没有优势的?即使有公司要你了,那很可能也是一些招人才有困难的不正规小公司。到时,你本专业没心思搞,IT这又没有好出路,这是很可能走进困境的。其次,如果真铁了心要进来,那就试着找个相对正规的公司吧,就像我前面说过的,没有学校专业背景,那就争取慢慢一步一步把自己的职业背景,工作背景走出来。但这通常需要一个过程,还需要我们自己不断的努力和付出,当然还少不了机遇。我可能就是运气比较好,第一家公司就算是个相对不错的公司,给了我不错的机会,而且当年的面试也没有多苛刻,但相应的起始薪资也当然不高了。
所以,对转专业又没有什么背景的,那么初期的选择还是首重公司,然后再考虑薪资和技术方向吧。
4. 不要抱怨学不到东西,擅于挖掘和擅于寻找是关键
有人经常会说,公司的项目中自己得不到什么提高,学不到东西,感觉是在蹉跎岁月。记得我也有过类似的牢骚。确实,不同的公司,不同的业务形式,不同的项目,不同的团队确实会导致不同的发展空间和成长效率,这是客观存在的事实。就象前面说过的,如果你没有过硬的学校背景,那你的先期土壤可能养分确实会比不上那些背景更好的。这其实没有什么不公平,因为那些背景好的人在之前确实付出了更多的努力,或者具备更出色的条件,所以才获得了目前不错的土壤。既然前期落后了,那我们该怎么办?其实先期土壤质量高低,只是代表环境的好坏,而决定我们成长的首要因素却是我们的吸收能力。如果你不擅于吸收,那土壤再肥沃,你的成长速度也未必快,而如果你擅于吸收,汲取养分,那即是在贫瘠的土地里,你也可以长成参天大树,到时你枝干茂盛了,再移植到富饶之地去,那应该是不难之事。所以,这里我关键想说的就是所谓的吸收能力。
确实有很多或者说国内绝大部分项目,都是修修改改,复制黏贴,没有太多技术含量,慢慢的都会变成熟练工似的操作。所以很多人想的都是换一份技术含量更高,更能学到东西的工作。但是殊不知,换来换去,似乎都是半斤八两,五十步笑百步的境地(个别牛人,或者个别机遇好的人不在讨论范围)。说句心里话,目前国内的IT圈子就是这样,真正所谓技术高端的工作,还真不多,至少作为草根的我的体会是这样。那么,怎么在这样的氛围环境里提高自己找出路呢?我的建议是,要善于挖掘,善于寻找。挖掘什么,挖掘现有工作中存在但自己未涉及的技术,寻找什么,寻找跟自己目前关联,或也许将来会跟自己关联的新技术,然后呢,学吧!什么意思呢,还是说说我的经历吧。(申明下,每次都以自己的经历来进行说明,并不是说自己做的就是对的,其实里面也走过很多弯路,甚至以后走向某个死胡同也未可知,大家可以参考下,而我也仅是分享下而已)
其实说真的,自己做过的项目还真不算多,待过的公司也不多,5年多的工作经历,前后所有经历过的项目加起来,也就5个左右,而且这5个里有几个并不是主力参加开发的,有几个还都是主做项目管理和评审等。我的第一个项目,也是时间最长的一个项目,我们做的都是没有太多难度的UI层工作,很多跟我一个项目组待过的人,都感叹过做这样的事情学不到东西,所以有的人很快跳槽了,有的人还在继续熟练地干着。但是我却想说,这个项目是我成长的关键,它让我学到了太多东西,这份财富是不可想象的。这是为什么呢?首先,这是一个规模非常大的项目,代码规模估计在300万~400万行左右, 涉及操作系统API封装,驱动封装,网络通信应用,嵌入式控制,复杂的数据层框架,UI库,UI页面等太多技术,我们国内部门负责的只是UI层的开发,虽然开发量也很大,但是做到中后期,也确实没有太多技术含量了。但是这么大一个项目,这么多技术,而且源码都是开放的,随便抽一样都够学段时间的,所以当别人在讨论这里该嵌套几个if-else,那个该来几个for循环的时候,我早就不局限在这些东西了。记得我首先学通UI库的框架,接着是操作系统API的封装框架,再然后是数据层框架,网络通信,后面还有嵌入式控制的处理,当然没有人会跟你说这里涉及到这么哪些技术,你可以这样那样或怎样的方式学习,所以就需要我前面所谓的擅于挖掘,你必须自己去挖掘出技术财富。而在挖掘出这些内容学习这些技术的同时,我又延伸出去,看框架我就结合设计模式来学,看操作系统API封装我就结合多种常用的OS的API来学,看网络通信应用我就结合网络通信原理并开发实例来探索,看到用到STL,我就又找了boost来学,这又是前面提到的所谓擅于寻找,因为你需要寻找相关或可能相关的内容来丰富自己。而能否挖掘出来,能否寻找到,这不取决于能力,而取决于是否用心。当然,到最后如果真的挖无可挖,寻不可寻的时候,你就可以考虑换个土壤试试了。
总之,我相信,擅于挖掘与寻找,一定可以闯出属于自己的一片天空。
5. 推荐一些自己看过,觉得不错的书
这么多年来,技术相关,正版盗版的书也看过不少,在这里就把一些个人觉得不错的书推荐给大家,当然每个人的看书习惯,品味都不同,仅供参考。
C++方向: 《C++ Primer》,《C++编程思想》 , 《Effective C++》,《More Effective C++》,《深度探索C++对象模型》
这几本书就不需要我多说了,前面两本如果作为入门书学习有困难的话,也可以先找本其他薄点的入门书先看下,然后再看这两本(其实两本里选一本就OK了)。并不建议在读完前两本后就马上开始第三本,第三本可以再有了一定基础以后再学。至于第四本,虽然也是经典中的经典,但是难度挺高的,具有一定挑战性。最后那本如果对C++的构建思想有兴趣,或者想往Com方向发展的话可以看下。
嵌入式C和实时操作系统方向:
记得在大学时看过几本书,现在记得的不多了,只有一本想推荐一下,《嵌入式实时操作系统μCOS-II》,邵贝贝翻译的。可以结合μCOS源码来学,我上学时奉为经典。看完后至少对操作系统的基本概念,基本框架,功能能有个大概了解,而且对嵌入式C方向很有帮助。
Linux系统管理服务器配置方向: 《鸟哥的linux私房菜》两卷
这方面书我只看过这个系列,分上下两卷。上卷是Linux基本功能和命令, 下卷是网络基础,服务器架设相关,觉得写得非常通俗易懂,是这个方向入门不可多得的好书。
Linux编程方向:《UNIX环境高级编程》
绝对经典中的经典,如果做Linux程序方面应该都知道,我就不多说了。最好看第二版,因为线程部分在老版里是没有的。
Windows编程基础方向:《windows程序设计》,《Windows核心编程》
这个不多说了。Windows方向必看。
Com,ATL方向:《 COM原理与应用》,《COM技术内幕》,《ATL开发指南》
想学Com而又自认为基础不太好的话,可以先大概浏览一下《深度探索C++对象模型》,应该能帮助你理解。然后我很推荐潘爱民的《COM原理与应用》,国内难的一见的好书。名字和原书封面都很不起眼,但是内容真的不错。《COM技术内幕》这个可以在看上一本的情况下结合来看。最后那本作为ATL入门书还是不错的,至少比较通俗易懂。
网络编程方向:《TCP-IP详解》前两卷,《Unix网络编程》两卷,《effective TCP/IP》(中文名《高级TCP/IP编程》),《C++网络编程》(专门介绍ACE的两卷)
在开始我不太建议去看上面任何一本书,可以先找些简单了资料和代码,弄清楚网络编程基本概念,Sokcet的一些基本API后再看。首先《TCP-IP详解》第一卷,太经典了,翻过n次,还是觉得每次看都有收获,从概念上完全剖析了TCP/IP的各个环节。关于第二卷,看的门槛比较高,我只是随便翻过,掌握了点皮毛,如果只是做网络应用开发的话就略过好了,可以看《Unix网络编程》的第一卷,而这个系列第二卷主要是针对Unix进程间通信的,如果你不是做Linux,Unix方向的可以不看。《effective TCP/IP》这个绝对是必看的,可以让你对网络编程的理解再上一个层次。最后关于ACE的,也是比较推荐看的,ACE整个框架里对设计模式的应用是淋漓尽致,有很高的参考价值。这里再补一句,作为网路基础入门,前面鸟哥那套书第二卷里的第二章看看也不错,不长,但是写得风格很不错。下面是网上的链接。
http://linux-vbird.bluedata.org/linux_server/0110network_basic.htm
(以上的说明对windows方向同样适用)
设计模式方向:《设计模式》(四人帮的那本),《敏捷软件开发(原则模式与实践)》,《面向模式的软件架构》(共四卷)
第一本就不说了,这个方向的经典,第二本名字是敏捷开发的,其实绝大部分都是讲的面向对象设计思想和设计模式,内容也是绝对经典。面向模式系列基本涵盖了所有设计模式,第一卷是系统架构的整体介绍,第二卷是分布式网络架构方向的设计模式介绍,第三卷没看过,第四卷是2,3两卷涉及到的设计模式的总汇。好像现在又出第五卷了。
SQL方向:《SQL入门经典》
如果想学SQL文设计的话,这本不错。
java,J2SE方向,《thinking in java》,《java核心技术》两卷
虽然对java语言本身的理解好可以,但不是我的主攻方向,所以下面说的仅供参考。我也只推荐J2SE方面的书。一本是《thinking in java》,我应该有读过2,3遍吧,只能说Thinking in系列的书都是经典。如果你看不进去,其实还是对面向思想方面的理解还有欠缺吧,可以先找本更简单入门点的书导读一下再回过来读,如果是第一次开始精读的时候,一定要结合源码例子,边写边读。另外也推荐后面的那个系列的两卷也是很经典的。这些读完java的基础应该就可以了,不管走WEB方向还是移动方向发展都应该可以得心应手。
数据库方向,《SQL-Server2000编程员指南》,《SQL入门经典》
我只捣鼓过SQL-Server和MySQL,数据库方面的书看的不多,上面两本是看过觉得算不错的。
6.关于学习方法
关于学习方法,其实从中学开始到现在,在这点上自己走过的弯路很多,也吃过不少亏。记得前面回顾自己高中经历的时候,曾经提到过自己高中成绩排名只能属于后1/3,其实在多年后自己总结过原因。我是在一所比较普通的中学里念的初中,记得初中里从来都是不用费多少精力,考前随便一看,每次都是班级前3(更多的是第一),考了第二都觉得丢脸,奖状拿了一大堆,包括市三好学生等。这养成了我一种不太好的学习习惯,盲目自信,光注重考前复习,而复习也是重读内容而不重做做题。这让我到了集中了全市精英的高中后,一败涂地。本来自认为不错的脑袋瓜失去了优势,而学习习惯又一直没有矫正过来,最后的结果大家也知道了。庆幸的是,我在备战考研时总结出了以前自己的问题所在,虽然挽回高中的失败已经太晚了,但是对我的人生来说才刚刚起步,为时未晚。
所以第一点我想说得就是:
读书不如读代码,读代码不如写代码。
这是回顾我以前的经历总结出来的最重要的一条。可能大家也深有体会,当在攻读一些理论性的难点时,总会觉得不管读多少遍,都如雾里看花,掌握不到要领。而当你读到书相关内容源代码后,会有种豁然开朗的感觉,但是过个几个月,你会发现那些内容似乎又变模糊了,而如果你再进一步,自己尝试自己写出一些相关代码并调试验证后,你得理解会更上一个层次,得出你自己的见解,这时候你想忘都不容易。自己就有这方面很深的体会。记得读研那会,看过一些操作系统方向的书,但每次看都觉得自己好像知道了些什么,又好像什么都不知道,心里虚的慌。后来我结合读开源操作系统的源代码后,突然豁然开朗。再后来,我把这个操作系统的源码都移植到开发板上,并自己写了很多相关的移植代码,这让一些操作系统的概念在我脑子里陡然形象了起来,即使现在都没有淡忘过。所以我的建议是,看程序类的书,一定要结合它本身的源代码,然后再尝试自己写些代码,相信这会带给你意想不到的惊喜。另外再有了一定积累以后,可以考虑自己设计些模块并实现下,尝试从理论到实践的转化,这会让你受益匪浅的。
当然,这里我要申明的是,只有在你是希望要精读一本书的时候才适用,如果你只是想概要性的了解下,或者你本身已经很擅长只是想查漏补缺的话,不在上面建议的范畴。
第二点,怎样高效率的读书
这里的读书泛指的是精读,很多人在读一门新技术或者一个新领域的书籍时时,发现学习和读书的效率特别低,有时看了好久都没有太多收获。那么怎么来提高我们读书的效率呢?首先,我不建议去读一本完全对你来说是“新”的书,我觉得如果你要想精读一本书,那最好要保证你已经掌握了这本书至少20%左右的内容了,在这种状态下精读,你的效率会才会比较高。肯定有人不理解,我要学一本新书,我怎么可能已经掌握20%内容呢?确实不可能。那么在这种情况下,就放弃去精读它吧,你可以先通过粗读来概要性的了解一些它的内容,还可以通过网络和其他资料从侧面了解一些,到一定火候也就是前面说的那个20%之后,再尝试精读吧。
为什么会这样的,因为人都是有惰性的,当一些内容晦涩难懂,你几遍都攻克不了的时候,会严重影响你读这本书的信心,也会降低你对这本书这门技术的兴趣程度,而且过程会感觉非常痛苦,这肯定不是我们想要的。要知道学一门新技术应该是快乐的,大家应该都体会过那种领会一个难点或未知技术后的发自内心的激动和快乐。那么当你有了前面说的20%以后,你会更容易的激发这种快乐,并能更进一步扩展你的思维,让你事半功倍。
当然,这里我要说明的是,随着书的难易度和其他一些因素,这个20%的值也不是绝对的,主要是看你自己的把握。
第三点,什么内容精学,什么内容粗读
其实这点我在前面说技术选择时已经说明过了,这里在强调一下。学习内容应该有主次,不可能样样学样样精,对前面说过的“适合”自己的,要精学,对扩展性的知识和非主攻方向的可以粗读。特别是一些根本性的技术内容,比如你搞一些主流语言,那么面向对象思想,设计模式等就最根本的,不管你学C++,java还是c#,都必须要把它们学精学深学通,这样你即使以后转方向或者学其他技术都不在话下。又比如你搞网络编程,那么tcp/ip模型和基本API就是根本,你弄透了这些,以后不管是Windows,unix,还是linux方向的网络编程都不是问题。所以根本性的,基础性的,框架性的内容要精学,而衍伸出来的其他内容,你可以选择精学一个代表性的,其他的都只需要大致了解就OK了。
第四点,好书可以读很多遍。
这个很多人应该有同感,对很多人来说,书并不是读一遍就可以掌握所有精髓的,所以对好的书,可以反复拿来翻阅,每次都能有新的收获。比如前面推荐过的四人帮的《设计模式》,《TCP/IP详解》,《面向模式》系列,这些都是可以反复拿来看的好书,很多书我都读过多遍,每次都会带给我新的惊喜。而且其实随着你读的次数的增加,每次翻的时间会越来越少,比如《设计模式》,开始前两遍看的时候每次都挺费时间,到现在我有时还会拿出来看,但每次翻一遍的时间应该不会超过1个小时。另外在读书的时候其实可以考虑做点笔记,这会是以后一份不错的积累。
第五点,不认为必须读技术原版书
印象中有很多人提出,IT人要读就读英文原版书的观点。理由也有很多,首先,一些技术源头一般都是在欧美,或者更准确的说在美国,第一手资料一般都是英文的,如果要更早更快的掌握或接触新技术,势必离不开原版的资料;其次,正由于源头在美国,技术的创作者,技术牛人,知名作者也不可避免的都在美国,所以世界知名的IT技术类书籍可能绝大多数都是出自他们之手,有些都是没有翻译版本的,所以原版的资料肯定比国内的资料要更丰富更全面;再次,国内很多资料翻译的质量确实也都不敢恭维,很多译者甚至估计自己都没怎么理解就在强行翻译了,结果可想而知。
如果你对自己的英语很有信心,那原版书当然是最好的选择。那我们就必须读原版书吗?我觉得未必。我想国内更多的IT人并没有达到那种读英文资料如读中文资料般的水平,当面对一些技术难点或未知领域,再去捧着本原版书硬啃得话,那是跟自己过不去。那怎么避免第一段说的那些弊端呢?首先,新技术的中文资料确实比英文会有一些滞后,但是个人认为在国内需要第一手掌握新技术的工作并不会占多大比重,更多的都是在做一些成熟或基本成熟的技术,而对于这些内容,绝对是可以找到不错的中文资料的。其次,确实几乎所有的好书,经典资料都出自老美之手,但是这些所谓的经典资料大部分都是有相对比较知名的译者翻译出了相对比较经典的译本。比如我上面提到的书籍,我可以说几乎每本都是有相对不错的中文资料的(个人感觉除了《面向模式》的那几卷翻译的一般外)。现在电子商务那么发达,正版的,盗版的,电子版的到处都是,选择应该是很多的;再次,虽然有很多的翻译质量很差,但是作为读者的我们是有选择权的,网络上很多同仁的读书心得笔记,推荐文章都可以让我们识别出那些是不错的译本。而且认准一些知名译者(如侯捷,潘爱民等)的作品也基本不会让人失望的。
其实,上面推荐的书里,80%左右我都是只看过中文版的,15%左右是先看了中文版后再看的原版书,只有5%不到是先看的原版书。因为我自认为,自己的英文水平还真不怎么样。 所以,对绝大多数人来说,我也还是建议先读中文版的书,这样不管是在效率还是效果上都会比较好,但是如果读第二遍或第三遍的时候,可以考虑拿原版书来读,这样既可以看看通过原版里是不是会有新的体会,也可以顺便强化一下英语,而且即使有难度,也可以中英对照来看。
第六点,学习的持续性
很多人可能觉得我上面提到了那么多书,要都看完那不是业余时间都没有了,难道整天就学习工作而不要生活了?其实我上面提到的还只是我这么多年里看的一部分,还有很多看过但不是特别经典的没有推荐出来,而且很多书自己不止读过一遍,自己还真没觉得占了多大的业余时间,更没怎么影响到生活质量。我不算是那种特别认真的人,甚至这么多年看过的网络YY小说也不比技术类的书少,但是有些时间自己还是会保证的,比如上班时间,因为自己工作效率还算不错,上班时间内一般都能留出比较多的时间,而这些时间自己一般不会浪费,都会用来学习和充电,而这些时间其实是相当可观的。其次,在掌握了一些根本性的知识后,其实在看类似的资料时,效率是会非常高的。所以前面说过,基础是关键。另外,自己的学习持续性不算好,最多只能算不错,感觉自己是属于狂奔5小时然后会停个3小时的那种人,所以经常是学一段时间(比如2个月)然后会放松下来,玩一段时间(比如1个月),接着再学。但是比较庆幸的是,自己每次在玩一段时间后,随着放松时间的变长,自己会慢慢的自然而然地产生一丝不安,一丝紧迫和一丝愧疚感,接着自然会去找点新的目标或技术去攻克下。
总之,不管以什么形式,学习的持续性还是比较重要的,人往往有惰性,人也允许懒惰(我老婆经常这么说我的,呵呵),但是我们应该拒绝持续懒惰。一起努力吧,加油!
第七点,程序语言的选择
现在主流的语言已经不是局限在那么1,2种了,C,C++,java,C#,C-Objective, VB, Ruby, PHP,Python等太多了。每一种其实都有不错的市场不错的发展。其实不用在该学哪门语言上纠结太多,语言本身都没有什么难度,不会有太高的门槛,只要你想学都不会有什么问题。难的是基本思想,是框架。如果你掌握了根本性的,那不管是学哪门语言都不会有什么难度。所以有人说c++语言很难学,这点我是不认同的。
7. 杂感二则
还有2点想说的,就一起来个杂烩分享给大家吧。
第一,关于瓶颈,这里想说是特指在苏州IT圈子里的,个人技术瓶颈绝对不会是3,5年就会出现的,至少应该是工作10~15年(中间当然可能会有多份工作)后才会有的;而薪水瓶颈,自己可以做个不成熟不负责任的判断,应该是在年薪40W左右,这大概是一些在苏州跨国知名大公司部门经理的薪资等级了,要突破这个级别,不是那么容易的。
第二,关于生活和工作。可能在很多软件公司,生活和工作就像鱼和熊掌一样,不可兼得。但是我更信奉,只有好好生活,才能更好工作的原则。我也希望各位同行业多注意身体,身体是一切的本钱。或许我算是个幸运儿,一直以来待过的公司都不是崇尚加班的。(自己一直以来的月平均加班时间可能都没超过12小时吧,奇迹吧?)
第二章到这里也进入尾声了,感觉写得比较乱,想到哪写到哪,本来还有几个点想说明的,但是后来感觉都是大道理,带有点说教性质,所以就删了不发了,以上这些内容大家就当个消遣吧。顺便祝大家元旦快乐,龙年大吉。