查看原文
其他

一位嵌入式er的5年挨踢经历「下篇」,技术与职业的感悟!

2017-05-09 嵌入式ARM 嵌入式ARM

工作5年,说长不长,说短也不算短,毕竟人生黄金时期(25~45来算的话)也没几个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圈子就是这样,真正所谓技术高端的工作,还真不多,至少作为草根的我的体会是这样。那么,怎么在这样的氛围环境里提高自己找出路呢?我的建议是,要善于挖掘,善于寻找。挖掘什么,挖掘现有工作中存在但自己未涉及的技术,寻找什么,寻找跟自己目前关联,或也许将来会跟自己关联的新技术,然后呢,学吧!什么意思呢,还是说说我的经历吧。(申明下,每次都以自己的经历来进行说明,并不是说自己做的就是对的,其实里面也走过很多弯路,甚至以后走向某个死胡同也未可知,大家可以参考下,而我也仅是分享下而已)

其实说真的,自己做过的项目还真不算多,待过的公司也不多,5年多的工作经历,前后所有经历过的项目加起来,也就5个左右,而且这5个里有几个并不是主力参加开发的,有几个还都是主做项目管理和评审等。我的第一个项目,也是时间最长的一个项目,我们做的都是没有太多难度的UI层工作,很多跟我一个项目组待过的人,都感叹过做这样的事情学不到东西,所以有的人很快跳槽了,有的人还在继续熟练地干着。但是我却想说,这个项目是我成长的关键,它让我学到了太多东西,这份财富是不可想象的。这是为什么呢?首先,这是一个规模非常大的项目,代码规模估计在300万~400万行左右,涉及操作系统API封装,驱动封装,网络通信应用,嵌入式控制,复杂的数据层框架,UI库,UI页面等太多技术,我们国内部门负责的只是UI层的开发,虽然开发量也很大,但是做到中后期,也确实没有太多技术含量了。但是这么大一个项目,这么多技术,而且源码都是开放的,随便抽一样都够学段时间的,所以当别人在讨论这里该嵌套几个if-else,那个该来几个for循环的时候,我早就不局限在这些东西了。记得我首先学通UI库的框架,接着是操作系统API的封装框架,再然后是数据层框架,网络通信,后面还有嵌入式控制的处理,当然没有人会跟你说这里涉及到这么哪些技术,你可以这样那样或怎样的方式学习,所以就需要我前面所谓的擅于挖掘,你必须自己去挖掘出技术财富。而在挖掘出这些内容学习这些技术的同时,我又延伸出去,看框架我就结合设计模式来学,看操作系统API封装我就结合多种常用的OS的API来学,看网络通信应用我就结合网络通信原理并开发实例来探索,看到用到STL,我就又找了boost来学,这又是前面提到的所谓擅于寻找,因为你需要寻找相关或可能相关的内容来丰富自己。而能否挖掘出来,能否寻找到,这不取决于能力,而取决于是否用心。当然,到最后如果真的挖无可挖,寻不可寻的时候,你就可以考虑换个土壤试试了。

总之,我相信,擅于挖掘与寻找,一定可以闯出属于自己的一片天空。

 

4、关于薪资

 

跳槽有益于薪资发展,这是肯定的,我知道这条在国外很多国家的IT圈子里是并不成立的,但是我认为在国内,跳槽确实是提高薪资的一个重要途径。

首先,有一种现象可能很多人都碰到过,自己累死累活为公司为项目组轰轰烈烈的干了几年,却发现公司随便招了个人,工作年限不如自己,甚至岗位技术水平也不如自己,却反而待遇比自己还高。这种情况不仅仅发生在中小型的软件公司,在一些国内,甚至国际知名的IT大公司里同样存在,甚至发生的更多。这已经验证了一句话,薪资是跳出来的,这也是我身边很多人的看法,我也认同这种观点。一方面很多企业过多的关注于项目的维持,在项目人手不足,技术资源紧张的情况下,考虑的是尽快解决现有问题,而多少忽略了对现有人员的维持和平衡,另一方面,很多软件外包公司几乎等同于人力外包,因为很多项目是以人头来给客户计算费用的,只要多招到一个人就意味着可以多赚一个人的钱,这也直接导致对人员薪资平衡的忽视。在国内,否定跳槽等于是跟自己过不去。所以,在一个合适的机会,合适的时间,而你又有合适的理由的话,跳槽也许会是一个合适的手段。

 

最后,希望每个准备跳槽的人,都能够仔细审视一下自己,审视一下工作,因为一次变动很可能带给你一次飞跃,但是也可能让你丧失一次本有的难得的机会。
 


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存