大家好,我是杨波,也是极客时间「微服务架构实战160讲」的课程讲师。很荣幸可以接受极客时间的邀请,来到极客Live和大家分享关于程序员成长的话题。 这次分享会分为三部分:我的成长经历、程序员的面试技巧以及程序员的必备软技能三部分。
1999年到2001年,是我从大学生到教师的转型。1999年,我从计算机专业大学毕业,在无锡的南洋学院做计算机老师。
2001年到2004年,辞职读研。2001年我辞掉工作,回到江南大学读研深造。
2004年到2006年,进入软件开发行业。加入了一家做网络通讯设备的公司,叫合勤科技(Zyxel),从UI小模块做起,完成了从初级工程师到高级工程师的转变。
2006年到2012年,耕耘积累阶段。加入Bay中国研发中心(eBay CDC),从事开放API平台研发,从高级软件工程师成长为资深软件工程师。
2012年到2016年,加入携程框架部担任资深架构师。完成了从架构师,管理者到技术总监的转型。
2016年到2018年,在拍拍贷担任研发总监。搭建了微服务架构,基础框架等技术体系,既做技术架构,也做团队管理,也担任总监,协助公司技术战略的规划。
总的来说,在eBay像是坐 大巴 ,你只需要按部就班做好自己的事情,同时你能接触到更多的人,看到更大的平台,有利有弊。而在携程则不同,我是随着公司在成长,我是 司机 ,有些项目怎么走我说了算,所以更具挑战性。在拍拍贷就是坐 过山车 了,随时拥抱变化。所以不论公司的大小,对我们来说总是可以收获到很多。
如果说对自己的成长过程做一个复盘,我想有四个关键词可以分享给大家:
第一个是兴趣或者叫天赋。我应该是偏向于架构师型的,我小时候就比较喜欢折腾各种玩具,喜欢看科幻电影,从小看的杂志都是科幻小说、少年科学这类的。没事的时候做个风筝、造个小房子。我从一年级到六年级,几乎每年我都要做一两个风筝,所以对技术,Building构造东西我比较感兴趣。
第二点是坚持。我的很多大学同学,很多已经不在这个领域了,去做其他的事情了。而我从1999年大学毕业,到现在,应该是将近十八九年了,一直在在软件开发领域坚持着。一直在打磨,一直在坚持。
第三个是机遇。人的成长是需要有机遇的,我有幸加入到合勤科技、加入eBay、携程以及现在的拍拍贷,这是我的机遇,有机会加入业绩比较大的公司,也有机会加入快速成长的公司,对我个人成长非常有帮助。当中也遇到了很多人给了我很大的帮助。
第四个是勤奋。和同龄人相比,我算是比较勤奋的,当年在参加合勤技校招的时候,参加笔试的有几百人,我的编程笔试成绩是最好的。像eBay也会对软件编程能力做一些考察,我的成绩也都很不错。这些都和我勤奋学习有关系。
总结下来,对我成长帮助最大的四个关键字,是兴趣、坚持、机遇、勤奋。
成功它没有特定的模板,我们每个人 都要自己去实践,去思考,走出自己独一无二的道路来,你走的到道路和我可能完全不一样,你也可以成功。当然我还在继续学习和成长的过程当中。
很多程序员总会问,该如何通过心仪公司的面试。其实我在这些年,面试过的人非常多,除了面试一些基础的技术岗位,还包括一些管理者甚至总监,总体加起来应该超过上千人。
一般我面试的时候会侧重2点:
第一点就是 硬技能 ,简单讲,你能不能干活,你编程能力行不行,这非常重要。第二块是 软技能 ,比如沟通表达能力,团队合作能力,甚至到文化价值观层面。
但对不同的人,我考察的维度不同,比方说0到3年的程序员,我会更多的考察他的硬技能,因为0到3年其实还是一张白纸,没有项目经验,能考察的就是基本功,有没有认真扎实的掌握数据结构算法这些编程基础。
对5年以上的,第一关还是数据结构算法,因为这是基本功。除此之外我会考察这面试者的潜质。所谓的潜质就是我今天要讲的一个很核心的内容:架构设计思维。
有人问什么是架构设计思维,我提炼了三个架构设计思维, 抽象、递归、分治 。
所谓 抽象能力 ,就是关注本质,忽略细节的能力。我经常做架构评审,我的团队做项目架构的时候,让我去做评审,一个项目的架构设计我就关注两样东西,一个是数据模型(或称领域模型),另外一个是接口模型。通过数据库表、表结构、API接口模型,就能看出来抽象能力如何。抽象好了,我就觉得你这个架构就过关了。
递归能力。我的面试中一定会要求面试者写递归算法,有没有掌握递归,对解决问题的能力相差是很大的。比如编译器解析器、代码生成器、序列化算法都涉及到递归,没有递归思维的程序员,就搞不定这个层面的工作。
分治,也就是分而治之。也就是大问题先分解为小问题,依次解决小问题,再合并成解决大问题。这又是和数据结构算法相关的。
抽象、递归、分治,在数据结构当中都有体现,你学好了数据结构,有了解决原子小问题的基础,通过项目实践中去锻炼,就能解决更大的问题。
所以,我会比较关注架构设计思维,考察的方式就是数据结构,简单的讲让他去编数据结构,比如说栈、哈希表怎么实现,归并排序怎么做。有了这些基础,才有潜质成长为解决更大问题的工程师、架构师。
面试中第二个考察点是编程语言,我们写代码、做工程师、做软件开发,代码必须得过关。《代码大全》这本书有一句话“Programming into Language, not in a language”,这句话有一个into和in的区别,如果翻译成中文就是深入一种语言去编程,而不是只在一种语言里头编程。
我最近在极客时间的「 微服务架构实战160讲 」课程里,也有学员反馈互动,我发现有些学员只能在已有API上去编程,不能去深入语言里编程。如果发现某个API功能没有,他就做不下去了。但有些程序员他就可以深入到这种语言,API没提供,我就深入到这个语言里面,构造新的API抽象,这叫深入一种编程语言。
我在面试的时候,会让面试者讲API的实现原理、讲红黑树、讲底层实现。要考察面试者是否知道底层的实现。这样我才知道你对编程语言的理解程度。
比如Java语言最大的特点就是垃圾回收,有些面试者用了很多年Java,GC的原理他却讲不清楚。要求高一些的话我会问到多线程怎么玩?如何用Java多线程开发?
5年以上的面试者,我还会问到设计模式、架构原理甚至工程流程,我们是工程师,和程序员是有区别的,程序员把代码写好就好,而工程人员要按流程做好单元测试,集成测试,性能测试,监控,还要按照规范流程发布。
我面试一般还会要求面试者写代码。我还会要求面试者介绍自己参与开发的实际项目,考察实战能力。我比较喜欢真正喜欢技术,并且能对项目投入热情的人,讲到自己开发的项目就两眼放光,滔滔不绝,那多半就是你了。
最后,我会考察软性能力,我把它叫做元能力(能力的能力)。技术能力越强,越要看中他的软性能力,最近有一本书叫《奈飞文化手册》,奈飞公司文化里就提到了:只招成年人。我们都希望一起合作的同事,是个能对自己行为负责的成年人,不是动不动就闹情绪的小孩子。所以我会衡量面试者的沟通能力、积极主动性、正直诚实。软性能力不易考察,我一般会用压力面试的方法来考察面试者,故意否定他,制造一些压力,看看对方的反应,人的软性能力到底如何,在压力面前常常能体现出来。
随着大家工作经验的增加,前面的3到5年关注的都是硬技能,后面5年或者10年,是一个分水岭,大家会越来越需要感性方面的提升。卡耐基曾经说过,一个人的成就只有15%是跟他的专业技能相关的,另外85%取决于他的软性能力。这句话送给大家。
这么多年来,我经过大大小小的公司不少,也招了很多应届生和年轻人。我会留心观察哪些年轻人成长比较快,他们有哪些特质?在这里总结梳理了11个成长锦囊送给大家,可以在焦虑的时候拿出来看看。
1、要快速成长,一定要思维转型。从学校走出来,在公司里,一定要做个思维转型。你从要从确定思维转到不确定性思维。学校多是填鸭式教育,都有标准答案。但在社会上,很多事情是没有标准答案的,对和错都是模糊的。你要自己去从问题中找问题,从思考中得到思考。
还有一个成长思维是空杯心态,不论工作了多久,都要保持学习状态。就像乔布斯说的:保持饥饿,保持愚蠢。告诉自己,我就是愚者,我就是来学习的,这样会成长得更快。然后是不确定思维,始终相信只要经过这个自己的努力,不断的去学习,不断的实践,一定可以得到成长。未来并不确定,你今天做的选择做的事情决定你的未来。
2、积极主动。看了这么多应届生,有一个定律:凡是积极主动的,胆子大的,成长就快。因为机会就那么多,你不争取,就是对自己不负责任,也是对工作不负责任。你虽然替老板打工,但对自己也是很好的提升。积极主动的人会对做的事情负责,争取更多机会,让自己承担更大的责任。
3、合作沟通。在公司里工作,一定要与人合作,做的事情越大动用的资源就越多。我们都有自己的盲点,这就需要别人帮助我们来看问题。需要从别人的眼睛里看问题,来补足自己的视角不足,才能做更大的事情。
4、勤奋和天赋。其实我是靠勤奋的,我虽然有些天赋,我主要是用勤奋的方式。国外比较崇尚天赋论,我在进eBay的时候,老板给一本书,叫《发挥你的优势》。每个人都是有天赋的,老天爷给了你一种能力,你就要把它发挥好,这叫天赋论,在中国,我们崇尚勤奋论,倡导勤能补拙。所以也有一本书,叫《一万小时理论》,不管你天赋不天赋,我只要磨炼一万小时,每天三小时,十年以后,我就是非常厉害。从我的经验来看,勤奋和天赋都起作用,如果两个都是5分,相乘就是最高25,如果你天赋只有3,但你努力到了5分,3x5 = 15,你也很厉害。
5、导师很重要。能不能找到自己的导师非常重要,因为这个学习是有成本的,光靠自己摸索,一定会踩很多坑。如果有机会,找到导师就可以把你成长历程缩短,身边也有很多这样的例子,找到了一个比较好的导师,个人飞速的成长。但导师不会等着你出现,你需要磨练好自身能力,积累核心竞争力,你有价值潜质才会有导师看中你。
6、学习加实践。虽然老生常谈,但很重要。我每天学习的时间是固定的,绝对不会低于一个小时,雷打不动。但是学习要做到价值驱动学习,做到闭环式的学习,你可以把学的东西落地,写文章做输出,给大家做一次分享,有产出的学习会让你的学习更加高效,比如我的「微服务架构实战160讲」课程对我来说其实就是一次闭环式有输出的学习。
7、客户价值和产出意识。与学校不同的是,在社会上你要独立谋生,要找到客户、建立关系。虽然说做软件开发么,比较少和一线客户打交道,但是有利有弊。不打交道就少很多麻烦,可以专注做技术。但我建议你可以接触客户,建立客户价值和产出意识,跟客户形成闭环。有机会的话还可以去做一些商业实践,不要被软件开发工程师的身份把自己限制住。
8、目标设定加时间管理。比尔盖茨和巴非特,这两个耳熟能详的人被问到:最重要的管理能力是什么?都不约而同的回答:聚焦(Focus)。我们人的这个能力有限,你不可能样样都学,不可能样样都做。你要沉下心来思考,我应该要学什么,管理自己目标计划。每年都要梳理一下,这一年要学习的内容、要做的项目,把自己的精力聚焦好。推荐大家看《高效能人士的七个习惯》这本书,里面提到:要事优先。
9、坚忍不拔和长线思维。在软件开发行业,我还没有看到特别天才的人。不论什么背景、什么名校,代码写的多牛,成长为架构都不得少于10年的积累。在很长的时间内,你都要在复利曲线的底部,每天积累,直到有一天拐点的来临。所以你如果真想在软件研发行业成为专家、心目中的牛人,你得做好10年的准备,不断的打磨,不断的去锤炼。
10、反脆弱和舒适区。有一本书叫《反脆弱》推荐大家去看一看。我认为这个反脆弱和舒适区是讲的同一个道理,人的成长一定要有压力,如果你每天轻轻松松,准时上班,按时下班,如果3-5年都是这个状态,那被淘汰就在眼前。适度的焦虑、压力不是坏事,说明你在成长,在进步,要敢于打破舒适区。
11、从优秀到卓越。我们每个人从优秀跨越到卓越,都要通过实践想清楚三件事情,你想做的、你擅长做的以及社会需要的。如果一个人能把这三者结合起来,就完成了从优秀到卓越的跨越,那么怎么知道我想做什么?我擅长什么?这个社会需要什么?这个需要你去摸索,去实践。最后我想说的就是,只有你才能认识你自己。
最后希望您能成为一名卓越的工程师。
Q:微服务架构是未来架构的趋势吗?A:这个问题问法有问题,因为我们讲的服务化,在互联网这个时代是个永恒的主题,之前我们讲单块应用,后来我们发展到了SOA,SOA还是模块化,分而治之的这个思路。现在呢,微服务只是一个名词,可以说换汤不换药,它跟模块化,或者跟SOA的理念是一致的。微服务也好,包括现在有新的概念,Service Mesh,Cloud native,容器云,这些都跟容器、服务化是沾点边的,它们都是趋势,不会停止。
Q:架构师要不要写代码?A:其实这个没有标准答案,有的架构师不怎么写代码,但是依旧工作很出色,因为他在工作的前几年积累了大量的实战经验,并且依然保持学习的心态。一般工作经验10年以上才能被称之架构师,所以你在工作前面10年以内,一定要积累大量的代码,有了这个基础以后才能在更大的视角上做事。成为架构师以后,为了做更大的事情,你会把更多关注点放在系统宏观层面,减少对底层细节的关注。
A:在我自己的成长过程中,不光35岁、我25、30岁,包括现在40岁了,我都有焦虑。焦虑永远存在,但这其实是一个信号,告诉你该做出调整和改变。年轻人不断的冒出来,35岁以后,如你要是还和年轻人拼代码实现,那一定有瓶颈。所以当你在35岁之前,一定要拓展新的能力,并且是有差异化的能力,做些年轻人没法和你媲美的事情,这才是你的主战场。
参与相关讨论,请在公众号回复关键词:读者群。
参与相关讨论,请在公众号回复关键词:读者群。
往期推荐
史海峰:万字长文剖析技术人如何成长
人生苦短,不要ToB !
闭环的OKR:OKR是工具,而非武器
从老下属失业谈起,互联网人不相信眼泪
中台的问题,是技术的问题,还是人的问题
以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。本号由坐馆老司机技术团队维护。