于一名优秀的技术人员来说,究竟是专精一块技术方向,做到深耕其中所向披靡;还是谋求“什么都能略懂一点”的广度,成为一个全方位的人才?
这其实是一个职业发展和学习规划路线的问题,许多同学都有这个困扰。
今天我们邀请了 4 名淘系技术工程师,结合他们自身在小厂和大厂的经历故事,给大家分享一些他们在技术人员成长中对于【精】和【广】的选择观点,希望能够对你有帮助。
01 淘系技术部 - 应用算法 - 立青
“更早地认识自己和自己的方向,能更快地帮助我做出成绩。”
我想先撇开这个具体的问题,谈一谈一个程序员的技术发展和职业规划。
写代码这件事绝大多数人在喜爱的同时,更多的都是当做一个职业来做的,当然也确实有一部分人真的完全当做爱好,例如前段时间的新闻,HashiCorp 的创始人 Mitchell Hashimoto:“*凡尔赛CTO辞职:写代码才最快乐!管理只会影响我搞研发”;著名的Linux创始人Linus大神也是出了名的热爱编程。对于这样的追求(土豪),抛弃功利热爱编程,我觉得在编程上完全可以喜欢什么方面就追求什么方面,是广泛的发现兴趣探索兴趣,还是在一个方向上深入挖掘都没有问题,大可以今天做前端,明天搞开发,后天攒算法,一人搞定全栈。
但是对于绝大多数人来说,编程更多的是职业发展道路上一个立身的手艺,在众多专业技术方向上挑了一个自己比较喜欢和热爱的。程序员的发展和众多职位的发展一样,每个人都希望自己能够往"上"走:更专业,更能在职场上发挥自己的作用和影响力,从单兵作战做小事,到带队做大一点的事,再到影响一个领域,影响一个行业。这样的发展单单靠自己各方面都懂,都有涉猎,恐怕是不行的。刚毕业的应届同学可以靠自己的知识储备做自己的标签,久经职场的同学必须靠自己在某些领域做出的成绩做自己的军功章。
所以我们越早在某些方向做出自己的成绩,对自己的成长和发展是越好的。我本人是做算法的,算法领域有很多大牛在学校期间就已经找准了自己的发展方向,并做出了成绩,例如caffe作者@贾扬清大神,Taichi作者@胡渊鸣等等。他们的成就就需要及早的找到自己的方向+不懈的努力+亿点点的天赋……对我们绝大多数人来说更需要及早的找到一个热爱的,希望精通的方向并做出成绩。
我自己的经历其实不是好的榜样,我抱着做机器人的梦想本科学的机械,在学校的时候对什么都感兴趣,既参加过机器人大赛,参加过结构设计大赛,也和同学做过热力学相关的一些机械设计;一个比较有意思的经历是,当时在学校还做过一个上天失败的小卫星。当时学校的微小卫星研究所发射了一颗皮星(体积很小的卫星)之后,在学校办了一个小卫星的比赛,我们做了一个模拟卫星太阳能电池片自动追踪阳光的卫星模型,在答辩前熬夜完成了,然而在最后测试的时候由于线的固定太过粗糙,在运动中扯掉短路了,把电路都烧了……万幸留下了视频支持最后的答辩。对我后来职业选择影响比较大的是临毕业用Kinect做了一个姿态识别控制无人机飞行的项目,初步接触了视觉算法的一些知识。
后来研究生就真正的开始做起了机器人的方向,也是研究生时期做的控制算法和视觉算法的经历让我走上了程序员的道路。在这个过程中自己也是对机器人领域中的SLAM方向产生了兴趣,自己恶补了一些知识,并靠着这些最后走上了这个方向的职业。一方面我觉得自己如果能早一些找到自己的方向并且积累起来一些成果,肯定对自己的发展是要好很多的,但是另一方面每个人也确实需要一个认识自己的过程,但这个过程我想还是越快越好。在这个过程中,我们自己的技术发展就像是一棵树,我们尽可以无限的去展开自己的枝叶,多了解一些不同的方向和知识,但一定记住这是为了让自己的枝头长得更高。
02 淘系技术部 - 应用算法 - 朔玥
“大部分的精力还是要用于巩固自己的长处上,你一定要有竞争力的依凭。”
做一件事是要精还是要广?其实相当于赌博里你是要多压,还是要单押。我们的筹码是有限的,当然我们的精力也是有限的,不可能去做所有的选择。那么这时候,问题就变成了如何去组合投资获得最大化的收益。
如果你选择去把所有的筹码压在一个选项上,那么你就一定要去承担选择失误带来一切清零的后果。但是我们也知道,如果你选择到一支潜力项,不费吹灰之力就可以赢到盆满钵满。所以孤注一掷,一定对应的高风险。
另外一个选项就是广博,它带给我们的好处是平摊风险,但是平摊风险的同时收益也会被稀释掉。比较好的一种做法,应该是两者相结合,在该广博的时候广博,在该专注的时候专注。
作为一名算法工程师,我的建议是,广泛的去涉猎相关领域的知识,以及弱相关领域的知识,因为这些知识全都可以作为你自己的储备,作为你专注行业的加成。比如说,你从事图像识别相关算法研究,那么直接的,除了图像相关的专业知识,一些基础的知识例如代数分析等数学理论,计算机原理与体系结构,甚至色彩,摄影美学等知识,都可以为模型设计带来一定的辅助。除基础的知识以外,相关领域比如自然语言处理当中的时序模型就与视频图像分割问题有很多的共通之处;信号处理中很多变换算子能够直接迁移到图像处理当中。这些知识,都可以作为你研究图像算法的加成。
又如,你想不到心理学,消费者行为学以及经济学都可以为我们的工业推荐体系赋能。在洞悉了消费者在购物时的选择动机,心理活动以及当下经济趋势后,算法设计者能够依据这些先验知识有聚焦地设计相关的模块,或是作为趋势因子加入算法当中。用一种更柔软的方式将大众认知融入模型,将表象和理论相结合,从而更好地发挥推荐系统的效能。
世界上很多知识底层是相通的,不要去抗拒学一些基础的知识,很有可能那将是你未来抓住机遇的契机。但是,大部分的精力还是要用于巩固自己的长处上,你一定要有竞争力的依凭。广泛的涉猎,精准地融会贯通,提取出你需要的那一部分,转化为自己需要的能量。
03 淘系技术部 - 前端技术 - 禾鸟
“我个人经历觉得,精进一门技术,不管是对于开发还是其他工作,都是重中之重!”
当我刚毕业的时候,在一家小厂做Flash游戏开发,由于当时开发人员配比严重不足(qiong),所以不但要用AS3去写前端游戏UI功能,还需要用NodeJS写服务端游戏逻辑、SQL处理数据读写操作、HTML/CSS/JS写后台配置管理页面,且一度在公司没有招到测试的情况下,所有的功能测试只能通过自测来完成。
时间一长就有些膨胀了,自我感觉非常好,觉得自己就是全栈,觉得只有更大的舞台才能配得上自己,进入大厂应该是轻而易举的事情,于是开始往网易、阿里、华为一些大厂投简历,Flash游戏开发、H5游戏开发、Web前端开发、NodeJS开发、服务端开发、测试开发各种岗位都投了遍。结果就是被现实狠狠地打了脸,投的简历石沉大海,少有的几个面试也都是一轮游。
后来总结反思了一下,在所有面试中,面试官经常会问这么几个问题:XX原理是什么?XX如何实现?对XX你是如何理解的?对于XX功能是否有更好的解决方案?面对这些问题,发现了自己其实对底层原理一窍不通,所有都还是停留在使用层面。
看清楚了这个问题之后,我暂时放下了其他域的学习,专注在前端领域的学习,从基础的HTML/CSS/JS入手,到lodash/JQuery等常用工具库的使用,再到Vue/React等主流框架的使用以及原理的学习,以及ES6、TS等学习掌握。等熟练掌握了这些技能之后,再深入到浏览器工作原理、网络通信机制、前端性能优化、稳定性安全保障等知识点的学习。一步一步从搬砖菜鸟变成了熟练搬砖工,然后继续朝着搬砖砖家努力。
总的来说,在小厂,老板当然希望能更省钱,巴不得一个人就能干完所有的活。而对于个人而言,精进一门技术,不管是对于开发还是其他工作,都是重中之重!
04 淘系技术部 - 移动开发 - 临境
“不要把自己当做业务研发的工具人。”
这个问题没有标准答案,角度不同,得出的结论会大相径庭。前不久刚从小厂跳到阿里,简单聊下我自己的感受。
小厂会更偏重于业务,因此我们更多的是在实现业务方的需求,日常的研发工作也少有接触特别难或者深的内容。这个阶段不是说基础不重要,但深入学习基础知识可能对你业务研发不会有特别明显的提升。
曾有段时间我为了学习算法知识跑去刷 leetcode,刷完两三百题后陷入了迷茫。这些刷题获得的算法知识在大部分的业务场景中不太能用上,虽然它对于在编程中边界条件判断、减少低效代码确实起到了一定的帮助,但相较于投入的时间来说性价比略低。
同样道理,学习操作系统、计算机网络、计算机组成原理能让你对整个计算机体系有一个更深层次的认识,但工作的人不比在校生,时间比较有限,如果你不是一个特别特别自律的人,投入时间没有看到明显产出很可能会中途放弃。
如果想要在工作的同时更深入学习一些计算机基础知识,可以从你正在做或者感兴趣的性能优化入手。不少性能优化手段背后都伴随着深入的知识,比如之前不少大厂分享的针对 iOS 二进制重排优化冷启动的内容。学习过程中一定会碰到自己不了解的知识,一点点去积累,会比盲目的抱着一本砖头书直接啃更容易坚持。
另外,如果是业务研发,请一定锻炼自己对业务的理解程度,不要只停留于需求来了做完就完了,把自己当业务的工具人没有对个人成长没有益处。
最后,和大家分享一句我和喜欢的话:“书上没有知识,书上只有信息;知识是在特殊的工作和行动中运用信息的能力。”共勉。
结语
程序员要精还是要广,并不是一个有着标准确定答案的选择题。
精于基础,广于工具,熟于业务,永远保持进步和学习的心态,希望各位都能找到最适合自己的技术成长路径。
如题,你们的观点是什么呢?留言区欢迎一起讨论。