在程序员的职业发展道路上需要不断地打怪升级,从初级程序员到高级程序员,从初级架构师到资深架构师,或者转管理,从技术经理到技术总监。那么每个阶段都需要具备哪些能力?技术路线和管理路线发展有何区别?该如何做出选择?
今天跟大家分享的是知乎大 V 纯洁的微笑,他将基于从一线 Java 技术人员到管理百人的技术总监的亲身经历,分享他对技术路线与管理路线职业发展的看法、所需知识体系和面试技巧。如果你正处于选择技术道路还是转型管理的十字路口,相信这篇文章会帮你答疑解惑。
细数工程师、架构师与技术经理的「打怪技能」区别
1、初级工程师
初级工程师重要的是顺利完成领导安排给自己的工作,在此基础上,尽快熟练所使用的技能,并掌握核心语言的用法,再不断地扩充自己的技术栈,比如了解容器、集合或者是缓存等等。
2、中级工程师
工作两三年,成为了中级工程师后,你会处于程序员的佳黄金年龄。这个阶段的技术积累应该是快的,在这时打下的扎实基础,会给你的后续职场生涯带来很深的影响。
中级工程师应该具备完成一个模块或者是项目的能力,可以适当地去解决项目当中的难点。独立完成项目的对外沟通、编码、投产上线等,深度了解语言特性和你所使用的技术原理。比如你经常使用 HashMap,那就必须了解 HashMap 的底层结构是什么、有何特性。
此外中级工程师要向 T 型人才的方向去发展,在掌握整个技术栈广泛性的同时往技术深度去深挖,比如多线程。
3、高级工程师
身为高级工程师,意味着你已经是一位核心开发者,负责公司核心的业务研发和支撑。
高级工程师相较其他阶段突出的能力区别就在于技术和业务并重。在做一个好系统的同时,你必须要对业务有深度了解,否则后续变动可能会对你的系统造成非常大的冲击。同时你还需要有带领团队的能力,肩负一些培养初、中级工程师的责任,指导他们的工作。
要具备解决紧急问题的能力,特别是在生产环境下出现问题时的解决能力。企业在面试招聘时总强调几年工作经验,这个经验的背后就是解决问题的能力,是区分出一名优秀工程师的关键。
高级工程师需要具备哪些技能呢?
1)了解语言底层原理
因为高级工程师需要解决生产问题,所以掌握语言底层原理、学会用技术去调优,是必不可少的一项技能,比如JVM挑选。
2)熟悉常用并发的解决方案
比如在公司产品或平台做大型活动时,流量出现了大规模爆发,该如何快速地去解决它?
3)理解中间件
熟悉常用中间件的使用场景,并深入理解某一个中间件的使用。
4)掌握本质
掌握技术方案的同时要懂得为什么这么做,知其然且知其所以然。
4、架构师
首先,在中国互联网的环境下,架构师往往要肩负技术攻坚的重要角色。比如在项目加工中出现某些技术难点的时候,需要架构师来帮忙把关落地。很多小公司的架构师也会负责一些编码工作。
其次,架构师需要很强的架构设计能力,要掌握常用的设计思想,比如理解常用的SOA、微服务架构以及垂直架构的特点,在不同公司和不同项目的情况下选择不同的架构设计。
另外架构师要具有全局技术规划能力,对项目的技术栈和业务有深入理解,在此基础上结合现有技术栈给出一个整体架构的解决方案。在初期架构落地实施后,再根据公司不断发展的情况,对架构择时进行升级、迭代以及完善。
其实不难发现,从高级工程师往上的阶段,对业务的要求越来越高。因为越是往上发展,我们越是需要在业务中沉淀自己。作为一个软件工程师,若是30岁以后还没有找到一个行业沉淀下来,对未来的发展非常不利。
5、技术经理
技术经理和上述岗位差异大的一点就是管理职能。不仅需要规划部门的技术路线,还需要管理十人及以上的团队,将公司业务需求合理安排给部门内的同事。同时也要去培养团队能力,关注团队同事的成长,以及做好梯队建设。
当你成为一名技术总监后,你的关注点可能不再是如何写代码,而是公司整体的战略规划以及技术管理体系的建设和维护。这时需要你从公司角度去完善和规划整个研发中心体系,从技术层面来决策实现公司战略。
所以技术总监级别的人,重要的是具备技术的前瞻性和很强的协调能力,学会利用不同的资源去落实公司战略。
下图是以 Java 工程师为例列举的各个职级所需的具体能力和技术点,供大家参考。
充满选择的职业生涯,如何权衡
选择大于努力,正确的选择能让你在未来职场生涯中走得更远更快。下面就五种程序员常见的职业选择问题,分享一下我的个人建议。
1、刚毕业或者是想转行,到底该选择自学还是去培训机构?
在我看来培训机构只是一个踏脚石。现在整个互联网都非常反感培训机构出来的学生,不是因为反感培训机构,而是反感大量培训机构背景的求职者在工作能力和工作经验上造假的恶劣行为。但是值得肯定的一点是,他们能够下定决心花费一万多块钱去学习,去推翻他们之前熟悉的技能,能选择重新开始就已经很令人钦佩了。
2、是否可以选择外包公司?
一般情况下我不建议选择去外包公司。但是对于很多培训机构出来的同学,技术功底还很薄弱,不去外包公司可能就没有工作。在这种情况下我建议还是先就业再择业,不要眼高手低。外包公司虽然学不到技术,但至少能让你进入这个行业。
外包一般分为人力外包和项目外包两种,人力外包是把你派到甲方环境去工作,项目外包就是把甲方项目拿到外包公司做。其实二者都是在做边边角角的工作,但是整体上项目外包的技术含量会更高一些,因为是外包公司来自主控制整个项目周期。
外包公司的优势在于工资较高,同时工作强度非常大,另外还能通过外包项目去了解整个大型项目的运作、团队化的配合等等。
3、选择去互联网公司还是传统公司?
互联网公司指BAT、TMD、小米等,技术更新快,业务并发量高,工作强度也很大。
传统公司指华为、联想等,技术栈较为稳定,更新迭代速度不如互联网公司。对于金融、通信行业,稳定大于一切,所以传统公司在技术选型上也偏保守。
如何去选择二者呢?每个行业都有它的发展道路,我认为关键的还是看你个人的兴趣,做自己喜欢的事情,才会有更持之以恒的态度去面对后续的职业发展,在一个行业深耕才能发展到好。
4、工作五六年之后,该选择技术路线还是管理路线?
技术路线的岗位包括:初中高级程序员、初中高级架构师、首席架构和首席技术顾问等。
选择技术路线的人的特点是对技术有强烈的热情,偏内向,并且对新事物有求知欲。
管理路线岗位包括:从组长到项目经理或技术经理,到后CTO(赢取白富美走上人生巅峰)。在这些角色中技术能力不是重要的,而是要善于沟通、善于观察,可以纵览大局。
不管选择哪个方向,重要的是一定要保持体重和发际线,因为程序员的职业后半程一定是拼体力的阶段,如果不能保持健康的体魄和精神,很难在后期发展得更好。
5、30岁以后的程序员该如何做好选择,良性发展?
从程序员毕业到30岁,也就是工作五到八年间,你的精力是不断往上走的,换句话说,每个人的节奏虽然有快慢之分,总体上30岁之前是一个竞争力不断增强的过程。但是30岁之后如果你还是一个缺乏核心优势的普通程序员,既没有掌握核心技能,也没有行业积累,随着后续发展竞争力会逐渐下降,恐怕35岁以后你的职场生涯会越来越难走。
所以,很多程序员在30岁这个关键点上做出了不同方向的选择。
第一类就是深耕技术。他们对各方面的技术:RPC、底层原理都非常了解,熟练ppt、文档、架构的同时,还能伏下心写底层代码。这种技术大拿一般都在较大型的互联网公司做技术专家。
第二类是公司的中高层。他们在管理和沟通等方面比较突出,更多关注的是公司业务的大方向和前沿趋势。
当然还有极少一部分是选择第三条路:转行,在IT公司做产品、售前、商务岗位,或者跨行做生意和自媒体等等。
学会利用细节打造一场出彩的面试
我在北京工作五年时间里,陆陆续续面试了一百多名研发人员,有初、中、高级程序员,有架构师,也有技术经理。以下是我基于自己的五年技术面试官经验总结出的程序员实用面试技巧。
首先,参加面试前需要一份好简历作为敲门砖。好的简历要简洁大方、思路清晰、重点突出。
常见的问题是邮箱,尽量避免使用QQ邮箱等非正式邮箱(有些人的邮箱名还是上个世纪的QQ名,例如葬爱家族,非常不专业),可以使用126等类似的邮箱;
重要的是项目经验,不用将所有项目经验都写上,好挑选五到六个出色的项目来呈现;
个人评价部分需要描述的是你可以扮演什么角色,能给公司带来什么价值,切勿写空话套话;
简历里如果有开源项目,好附上你的GitHub和博客地址。
其次,面试就像找对象,第一眼重要。其实在你面试前5分钟内,基本就已经决定了这场面试是否成功。后面的时间,只是在不断地帮助面试官验证前5分钟他内心得出的结论。因此务必在开始时简单明了地介绍自己,流畅地描述此前公司的业务和项目流程。
另外,面试中面试者处于被动状态的反应很关键。因为面试官处于优势地位,他问的问题他都了解,所以不要因为某一个点答不出就表现得很不自然,不懂装懂或迂回回答,甚至去讨好对方,要不卑不亢。
此外,吃透你项目中使用的技术点。面试官会根据你简历中的项目经验做深入沟通。如果你把项目技术点呈现在简历上,却不甚了解,一旦被问到就很尴尬。也切忌在简历上写「熟练」某项功能或技能,面试官和你深度交流后,很容易会发现你只是了解而已,根本算不上熟练,这也很尴尬。
后,不要贬低上家公司。即使上家公司再渣,也尽量口下留情,否则面试官只会给你的团队合作能力减分。
现在互联网公司和传统公司的面试提问几乎大同小异,下面是我整理的题库,供大家作为面试前的准备和参考:
答疑时间
Q: 刚入行不久,想像您一样快速地从程序员升到技术经理,需要重点做哪些准备?
A: 其实刚开始我没有想过这个问题,我首先想的是如何把当初的互联网金融项目搞定。所以一个有志走技术经理路线的程序员,首先应该具备主动性,当出现问题时需要主动去解决,在做好自己工作的同时多帮助别人。另外你需要有出色的沟通能力,不能天天和产品经理还有测试吵架。
Q: 你平时会通过哪些途径来磨练技术?
A: 我主要是通过写文章,将项目中的技术点或者是解决过的问题提炼出来。好记性不如烂笔头,只有不断记录和总结,才能对技术加深理解。不管是做管理还是做技术,善于做总结的人职场生涯会发展得越来越好。
Q: 你面试候选人时比较看重哪些技能和素质?
A: 比较重视综合素养,候选人在拥有良好技能的同时还要有总结和沟通能力。在面试现场,我会着重观察候选人的表达能力,如果他连自己简历的项目都讲解不清楚的话,我会认为这人的逻辑思维能力不过关。
Q: 团队培养方面有什么经验可以分享呢?
A: 关于团队培养我大的建议就是以心交人。技术团队的氛围还是不错的,你只有真心为同事着想、帮他解决问题,他才会感受到你是一个好 leader。另外要多创造和程序员们沟通的机会,培训就是一个很不错的方式,例如每周安排一场讨论会,或者平常多出去聚餐等等。沟通得越多,在工作中配合的紧密度会越好。
Q: 公司业务规模很小,有什么好的办法锻炼自己的能力吗?
A: 公司业务小不代表没有锻炼技术的机会。在这种情况下,你需要了解每个技术背后的原理。比如你在项目中用到了一个 Spring,那就了解下 Spring IOC 的底层是怎么运作的。或者公司在发展中引入了新组件,你要把它吃透。同时在开发过程中可适当做一些压力测试,比如学会使用 Jmeter 等工具去检验项目的并发能力,根据结果再不断做出调整。另外在业余时间可以多看一些社区的技术文章,扩展技术视野并实践。