本文共 3889 字,大约阅读时间需要 12 分钟。
三、工作这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等等领域,自己都或主动或被迫地涉猎过。当然有些技术比较熟悉,有些只是粗通了解罢了。 其实说这么多,可能表达目的不是很明确。我再总结一下吧。总的来说,职业方向和技术选择在很多情况下,对很多人来说,是不受我们完全控制的,我们能够做的,就是面向适应当前的社会或工作需求,同时适当展望未来在工作中可能有的一些需求和机会,可能你不是百分百有兴趣,可能你是被动选择的,但是该面对现实的时候,不要犹豫,不要怨天尤人。 社会,市场或公司永远不会来适应我们的,所以我们只能主动去适应他们。
转载地址:http://hdeqj.baihongyu.com/