时间挺快,转眼工作快两年了。工作前从不会写代码,到理解互联网后端研发的工作职责,到跳槽承担更大的责任,过程中踩过很多坑,也有很多的感悟。这里想要分享一下,希望能够给后来者一些帮助。
在读研期间,我们实验室是做生物医学方向的,再加上本科并没有计算机相关的基础(本科的专业是「弹药工程与爆炸技术」),在准备求职时有点丈二和尚摸不着头脑。看过软件开发的书籍(计算机系统介绍书籍、C++/Java等语言类书籍、算法导论等算法类书籍),也看过现在的所谓算法类的书籍(《统计学习方法》、《机器学习》等)。看过的很多,但是真正沉淀下来的不多。
现在看来这些书籍都是非常重要的,也非常值得去阅读,但是为什么自己都没有沉淀下来呢?这个问题我想了很久。到了工作渐渐有些沉淀,会发现之前的思路是有些问题的。之前看书更像是学生阶段的那套思维:看书 -> 记下来知识点,只是最后没有考试这一环。但是对我而言,由于没有相关的编程经验,更没有工程经验,这么多琐碎的知识是不太可能都记下来的。正确的做法应该是,大概有个方向,然后再去有针对性的积累,这样效率最高。
反思了读研和工作以来的经历,有很多思路上的转变,我将大的思想转变都浓缩在这篇文章中了。
这篇文章会讨论几个方面:1)业务与技术的关系;2)即战力与潜力;3)收入与个人成长.
1 业务与技术
在读研期间,我是从事计算机视觉相关工作的,当时课题的方向是CT图像肺结节检测。最后完成的工作就是使用深度学习去做CT图像的肺结节检测任务。当时的自己对课题方向不是特别感兴趣,伴着对求职的信心不足再加上有点急功近利,走了很多的弯路,甚至错失了很多机会。比如,一直去跟最新的技术,却没有仔细思考这些技术应用在不同场景的区别;再如,由于对课题不感兴趣,导致自己没有深入地在一个场景上系统地探寻问题的解决方案;又如,自己急功近利看了很多书籍,但是却没能把这些知识系统化地消化吸收。
导致这些问题最重要的原因之一,就是当时的我没能认清「业务」与「技术」的关系。
什么是「业务」?什么是「技术」呢?拿我上面的例子而言,业务就是「检测CT图像中的肺结节」,技术就是「使用深度学习的方法做检测任务」。「业务」即是我们需要解决的问题,「技术」就是我们使用的方法。
面试的时候面试官考察一个候选人,会考察哪些内容呢?最简单的说就是,「解决问题的能力」。那么怎么考察这个能力呢?最好的方法就是,在你的业务领域,如何用技术解决当下的问题的。
怎么理解这句话呢?
还是以我的课题为例。课题的业务方向是「检测CT图像中的肺结节」,那么这个业务方向会引申出很多问题,比如:CT图像是如何存储与读取的(即它的数据结构是什么样)?肺结节有哪些特点?使用计算机存储后如何能够被识别出来?而技术方向,也能引申出很多问题,比如:深度学习有哪些做检测任务的框架?不同框架有哪些特点?框架演变的原因是什么?检测任务和分割任务有什么区别?深度学习比传统的机器学习方法解决图像问题有什么优缺点?当然还有很多技术细节的问题可以问。
对上面问题的回答,就能体现出一个人的「解决问题的能力」,这其实就是一个系统的解决问题的思路——我们可以用哪个指标描述我们的目标,从而进行优化?我们的场景可以提炼出哪些信息(特征),参与到目标的优化当中?我们使用什么优化方法,更适合当下的业务场景(或者在得到可接受的结果时成本较低)?你的解决过程又是怎样的?
上面是现在算法同学面临的问题。我的第一份工作是美团推荐广告的后端研发,这个是一个研发方向,同样可以拆分成为「业务」+「技术」的组合。业务方向是「推荐广告」,那么引申出来的问题就可以有:广告如何竞价?用户在使用App时可以获取哪些信息使用在推荐策略中?技术方向的问题可以是:广告系统应该设计成什么样(广告系统应该包含哪些模块)?美团这样大的业务量下,如何应对三高(高并发、高性能、高可用)问题?一个应用在广告场景下的系统,针对流量变现是否有哪些优化(从而加快流量变现效率)?还有就是编程的相关知识了。
这也就是为什么那些有项目经验的人,更容易被录取,因为项目经验背后的潜台词是你有一定的工程经验,有了工程经验后可能就会有一定的工程思维。如果你仅仅看书,想把书上的知识点都记牢是很困难的。
(面试经验可以参考我的这篇文章《2018计算机校招的思考》)
上面分别分析了现在算法和后端两个方向的「业务」与「技术」,我将这两个方向均概括为:「面向业务编程」。对于算法方向,就是应用已有(或者说是已经成熟)的技术或者方法,针对业务场景进行取舍调优;对于工程方向,就是想清楚业务特点,搭建一个支撑对应业务的系统。
所以我认为,刚刚接触工作的同学,一定要养成一个好的习惯,梳理清楚业务流程,想清楚业务模型,这样才会事半功倍。
如果在研究生期间的我能够想清楚这些,我绝对不会盲目的把时间花费在各种书籍都浏览一遍,而是针对课题尝试不同的方法,想清楚不同方法之间的优劣,不同框架之间更迭的原因,这样就是有了一套系统的工作,在面试时也就能游刃有余了。
2 即战力与潜力
大概到新公司4、5个月的时候,我经常工作到很晚,压力也会很大。那段时间其实也比较开心。为什么这么累、精神压力大还很开心呢?因为那时候我是三个业务线的负责人,其中有两个还挺重要的。由于我花的时间很多,很清楚上下游的定位及功能,出了问题很多合作的业务方和兄弟团队都会向我咨询,同时自己长期还算不错的表现给自己带来了一定的话语权。那段时间自信心也得到了提升,甚至有很多时候和比自己高两、三个职级的人在会议上怼起来(创业公司经常会和比自己高职级的人开会),气场也不输。
起初一段时间自我感觉良好,但是过了几周发现这样的节奏不对:我花了更多的时间去熟悉业务与链路,虽然在自信心、话语权等方面有所提升,但是换个环境,我还能表现成这样么?或者还有这样的机会给我表现么?
其实抽象过来就是,我牺牲了很多的休息时间,得到了大家的认可,换来了一定的公信力与话语权,但是长期看这些经历(经验)给我的能力带来多少提升呢?
于是我将能力的种类分为「即战力」与「潜力」,感觉这样更容易评估自己的提升。「即战力」是能够为当下、短期内带来很大收益的能力;「潜力」是能够在一个较长时间跨度内,为我带来持续、稳定收益的能力。那么我通过加班熟悉业务以及链路流程,更多属于「即战力」,也有部分属于「潜力」。「即战力」的部分来自于我对这个业务与流程的理解,我在做这块业务时能给自己带来收益,但是如果因为某些原因我换了业务甚至换了公司,那么这些就都要重新来过了(互联网行业变化很快)。「潜力」的部分来自于我通过刻意熟悉当下的流程,对类似的业务和系统有了更多的思考,同时由于我不停参与不同合作方(产品、运营、算法等)的讨论,我的解决问题的思路以及表达能力都得到了提升。但是前者会更多,因为前者的时间占比更多。
想到这些,我就开始思考该如何平衡「即战力」与「潜力」了。
哪些时候更适合提升「即战力」呢?刚到一家公司入职时,我们需要向老板和合作伙伴们树立一个良好的形象,提高公信力,告诉他们我是一个好的(产出高、乐于合作、乐于分享的)下属/合作伙伴,这个时候我们就需要花更多的时间熟悉业务,做些脏活累活提升公信力,花更多的时间在「即战力」上。未来某个固定的时间有晋升或者好的项目,我们也需要花更多的时间在「即战力」上,多做些工作得到更多的赏识,争取得到这样的机会。如果是短期没有什么提升,即没有好的项目或者机会提升自己,又没有什么窗口的限制,是不是就需要考虑猥琐发育、韬光养晦,来提高自己的「潜力」,从而在未来能够有实力(甚至有更好的精神状态)来挑战更重要、更困难的任务呢?
我个人认为,「即战力」更多是熟悉程度,「潜力」更多来自于基础的扎实程度、视野、理解力、表达能力甚至人格魅力等。
3 收入与成长
以前常听前辈们说,工作初期薪水差个几千块不重要,当时我还有些不太理解,自从理解了一句话之后——「人的收入不是线性增长的」——发现确实是这样。
在工作初期,大部分人工作的内容都不是关键性的,更多偏向于完成工作,而不是设计一套在部门中非常重要的方案。初期不同人的工资虽然也会波动,但是由于所做的工作内容重要性没那么高,薪水的浮动应该还是比较小(其实一个月差几千块并不多,眼光放长远一些)的。工作到了一定阶段,你所做事情的重要性也变得更高,那么收入的浮动就会更大了。虽然在同一家公司可能体现的没那么明显,但是一旦跳槽,收入状态可能会大幅改变。
在一家公司的薪水职级影响因素很多,比如公司的发展状态、和领导的关系、你做事情的重要性等等。而这其中有些你不太能掌控,或者由于入职先后等,不太能自己控制。比如我在前司有一个同事,由于他是别的组合并过来的,晋升时一直没有得到好的结果(那么薪水大概率达不到他的预期)。同时,他的能力真的挺强,后来他跳槽去了腾讯,薪水大幅提升,职级给的也非常高,一下就弥补了之前薪水不合符他工作能力的问题。短期看可能你的收入不符合预期,那么不要急,掌握住了核心能力之后,收入会符合你的能力与付出的——毕竟薪水是在你的价值上下波动。像我上面举例的那个家伙,他在我们当时的部门中,能独立撑起一块业务,即使由于当时他在组里面不是「嫡系」部队,市场也在他跳槽的时候回馈了之前他的努力。这也验证了收入不是线性增长的。
同时,你会发现,单一的技术往往不是最有价值的,最有价值的是「解决方案」。在当下的业务中,如何系统性地解决最核心的问题或者痛点,才是稀缺的。所以你可能就需要把更多时间花在这些方向上。工作初期一般不会让你去担当如此重任,你就需要思考你当下系统中核心的部分是什么,痛点可能是什么,如何能够解决,争取早日参与到解决此类问题当中。这样,才会让你成长得更快。
这是我两年中一些重要的思考,肯定还有很多不完善的地方,还欢迎大家多多留言参与讨论。如果感觉写的好,希望大家能够帮忙关注、转发,也分享给更多的同学。感谢大家。
在微信中长按下图中二维码选择识别,就能关注该公众号