当前位置: 华文问答 > 数码

在微软工作十年升到Senior Software Engineer是怎样一个水平?

2020-03-10数码

熟悉我的朋友都知道我最近升职了,我前段时间在我们的群聊中也提到了这个话题

大家可以加助教的微信MSBZ1019进群

升职后的年包是四十多万美刀,其中股票的占比约为年包的三分之一。虽然本职的收入不如我开班授课以及出书的收入,但是能接触到最前沿的科技和把人类的认知向上突破一个层级,这样的成就感是无法用金钱来衡量的。

当然最近我也一直在思考我的职业规划,这个帖子应该也会长期更新,我有什么不一样的想法就会上来更一下。毕竟在这个快节奏的时代,错过机会真的代价很高。有时候,你的同学、朋友、前同事今天可能创业成功了,而明天可能又被裁员了。这种变化无常的情况,让我不得不思考自己的职业生涯。基于我的经历,我想分享一些个人的感悟,希望引发一些讨论。

首先,让我先介绍一下自己的背景。我的第一份工作是在谷歌,做搜索和NLP算法相关的研究,当时还是AI的蛮荒时代,LSTM和Spark还是很新潮的概念,后来被微软的Eric(也是我后来的Manager,是对我影响很深的人)挖到了微软。Eric和硅谷其他的Manager不同,我一直以为他联系上我之后就开始正常的走面试流程,考算法、系统设计,但是并没有。他在让我过来面试之前先让我参加了他们组的团建活动,也很用心的给我讲解了微软的一些理念和Philosophy。

当时微软的Satya新官上任,Satya算是对AI和大数据技术理解非常深刻的一位大佬,只是听Eric转述他的思想就已经觉得很震撼,确实从高层到基层都带来了很不一样的感觉,当然我加入之后微软的股价也是水涨船高,让我挖到了第一桶金,并且一路晋升到了管理层。

当然Eric对我的很多方面影响都非常大,他现在在搞幼儿教育,他对教育的执着和热爱也非常感染我,也是我决心投入教育事业的动力之一。我也通过组织求职群帮在过去的五年中帮助了三千多位同学成功进入FLAG等顶尖科技公司。即便在Hiring Freeze的去年,我训练的同学大部分也进入了大厂。

从Tech Lead开始算起,现在我已经担任管理职位两年多了,负责管理一个近二十人的团队。虽然我是一个互联网从业者,但是我的观点并不能代表北美华人职场的现状。但我希望我的经验能够给大家带来一些启示。当然,我也在适应和熟悉当前的职位中,如果我有说错的地方,请大家见谅。

技术篇

升职加薪的第一步是深耕自己的领域, 不论是前端、后端、AI、算法还是安全,你一定要在一定范围内有自己的品牌效应:在周围的同事中,一提到某个领域,别人想到的都是你,那么你就成功了。

举我自己专精的深度学习的领域而言:很多人满足于使用别人准备好的数据,训练一个复杂的(深度学习)模型,查看表现数据还不错,然后就让工程师去部署上线,自己则四处演讲写文章。这样的系统实际上线效果往往不尽如人意,我们看到的很多垃圾推荐信息、无关广告、AI系统各种犯傻很多就是源于这样的模型。

要做好AI模型和系统,需要做大量的工作,而且很多工作都是繁琐、琐碎和千头万绪的。这些工作既无法写在文章里发表,也无法给领导汇报。因此,即使你去读他人的书、文章,甚至当面请教他人,也不一定能知道所有的细节。比如,模型是否优化到位?有没有根本性错误?能不能简化?各种依赖关系是否清晰?上下游进度是否可控?

升职加薪的第二步,要了解真实的问题,知道自己需要解决什么问题 。这就要求我们要熟悉业务和数据。数据不会自己找上门来。从刚入职开始,我就尽量多地了解数据的种类、如何获取和分析,最好都在文档上写下来。很多公司都有wiki文档系统。平时打基础或使用前,要多探索数据的各种分布特点,比如销售数据在各国、各商店、各种人群的数值都要了解,可以提前写些分析文档。这个数据基础对于理解真实问题、寻找改进机会、建立合适的模型都会有帮助。

很多人错误地认为 ,现在深度学习的建模使人们不再需要了解数据的特点,简单的把所有数据fit进模型就行了。我们的分析表明,garbage-in, garbage-out的原理还是适用的。我曾经见过一个简单的数据操作,比如把同一个样本上互相矛盾的label去掉,就提高了深度学习模型的表现。也见过数据标定过程混乱造成模型混乱的情况。很多人认为数据标定和数据清洗是脏活累活,干的都是和「民工」打交道的工作,远不如训练fancy的模型听上去高大上。可事实就是万丈高楼平地起,沙滩上盖不起高台,一定要重视标定数据的质量。

要重视处理第一手数据。如果不亲自处理原始数据,只看报告或听取他人的汇报,渐渐地就会失去对实际情况的掌握,从而导致决策失误。因为在数据处理过程中,可能会存在选择、粉饰和失真的情况。我曾经因为对第一手数据失去感觉,而不理性地设定了一个无法完成的目标,最终给我的团队带来了惨痛的教训。此外,很多时候,制定发展方向和想出新点子也是通过处理实际数据的过程中得出的。

升职加薪的第三步,要做完整的项目,从头到尾地完成,这样才能得到全方位的锻炼。 如果只是东做一个任务,西做一个任务,那么无法系统地提高一个人的水平。我发现,对自己成长帮助最大的经历就是把几个实际项目从头到尾完整执行,从构思、分析、建模、优化、工程实现、实验设计到上线、维护。只有经历了几次完整的过程,才能掌握一整套工具和技能,才能知道什么重要什么不重要,才能知道哪里会有陷阱和风险,才会制定合理的计划(对自己或者对团队)。

我到现在还记得第一次从一个想法,鏖战许多日夜,历经千辛万苦,最后打开A/B实验,然后看到系统指标提高的感觉,和航天人发射火箭差不多。当然,曾经有的项目失败的教训也刻骨铭心,拥有「踩地雷」的经验也很重要。 怎么正确的失败?最好是fail fast ,一个想法不对,能够迅速用数据验证「此路不通」是最好的。当然万一论证不周,已经投入很多,最后失败了,也不能「逃跑主义」,能在逆境中行动也是一种重要能力。我认为,打过败仗但没倒下,还能总结经验教训的干部最宝贵。后来在自己带新人的时候,也会有意识给他们创造能完整执行项目的机会,但是自己同时也不能失去了对细节的把握。

升职加薪的第四步,我们要重视项目前期调研 。很多人在接到一个任务或项目后就开始忙碌起来,这是不正确的。我们必须从大局出发,思考这个任务是否有必要,是否有成功的可能性。 如果我们认为这个任务没有必要,或者无法成功(通过最大机会的估算) ,我们就要果断地否定它。对于一个大型项目,在启动之前,我们一定要进行尽可能多的科学论证,不仅要考虑机会的大小,还要考虑隐藏的风险,比如合作伙伴不可靠、对外依赖太多、人手不足或不稳定、客户需求来源不稳定等等。我们绝不能冒进,做没有把握的事情。之前提到的设定目标过于武断的原因就在于前期论证不充分。有时候由于事情太多,我们会因为赶进度而忽略论证,最终会发现我们做了无用功。

升职加薪的第五步,要迭代,迭代,再迭代,而且要快 。很多人在开始一个项目时,会花费很多时间去研究最优的方法,却忽视了很多更关键的问题。例如,你可能会在方法上有很大的创新(例如最新的深度模型),但是无法获得高质量的数据,或者工程成本过高导致上线推迟。 我建议在第一个版本中使用基于规则的模型或启发式算法来实现一个可用版本,并确保每个环节都能够顺利进行。在第一版上线时,要立即组织数据采集、数据标注和模型升级等工作

公司内外环境也变化万千,为了避免「做了一半项目却没了」的窘境,我们需要快速行动,同时留下后续优化和提高的空间。我个人观察发现,很多学术界的大教授在公司里挂个虚衔还好,但是如果真的要做产品,很多人并不能成功,原因可能是因为他们做事太过于学院派,无法适应商业环境。

升职加薪的第六步,要简化,Less is More。 随着深度学习的飞速发展,AI模型也越来越复杂。虽然大型深度学习模型确实可以学习到更多的隐含关系,从而提高系统性能,但是很多人只是为了追求花哨的方法,或者为了发表文章而使用复杂模型,结果适得其反。例如,当数据量很小或问题本身并不复杂时,我们应该使用简单模型来解决问题,而不是使用复杂模型。有时候,为了简化系统,我们需要在牺牲一些性能方面做出妥协,以考虑工程难度或成本。因此,在有条件的情况下,我们应该尽量考虑简化系统,因为简单的系统更易于调试和维护。

升职加薪的第七步,我们需要提高自己的理论修养。作为一名优秀的机器学习科学家,我们需要了解模型的实现机理,比如Transformer模型中的注意力机制,而不是仅仅当一个「调包侠」或「调参侠」。 随着人工智能的发展,它一定会变得越来越易用,变得越来越普及。这就好比修电视的大师傅和设计电视芯片的工程师的区别。因此,作为机器学习科学家,我们也需要打开各种模型的「盖子」,学习它们的理论和代码。在面试中,我通常会问一些细节问题,来判断面试者是只知道模型的名字来堆砌->还是实际使用过(调包)->还是更牛的了解内部实现的细节。

升职加薪的第八步,我们需要关注AI领域的最新发展。 AI领域的发展速度非常快,很多新技术一出现就会颠覆老技术,导致很多人积累多年的经验效果大打折扣。例如,举我之前在谷歌的第一份工作的例子,在深度学习应用于自然语言处理(NLP)领域之前(2013年之前),和之后完全是两个时代。之前是「冷兵器」时代,需要手动制造各种特征,之后是「热兵器」时代,可以让模型自动学习特征。到了2018年底,Transformer模型推出之后,也颠覆了很多之前基于RNN的方法。后来,各种基于大数据预训练的Transformer模型(如BERT)也出现了,使用者只需要使用少量数据微调后就能使用,相比之前,就好像坦克加入了实战一样。如果我们不及时提高理论修养,我们就会像拿着冷兵器对抗热兵器,或者像用步枪对付坦克一样,在实际问题中无法胜任。但是,我们也不能沉迷于理论,必须根据实际问题适时解决问题,Less Is More这一点在上文中已经提到。

软实力篇

向上管理层面要经常主动和你的老板提出你的想法,你未来的职业规划,并且不断向他们展示你在这方面的努力和成果,从而让他们确信你是真心有这个想法,这样也更容易得到他们的帮助。同时,要多思考如何能为你的老板,甚至你老板的老板「解忧」。如果你的工作能让他们的工作变得更简单,那么他们就更有可能相信你有当管理者的潜力。

不要等待老板分配任务,而是要主动地「来事」。当然,这需要具备敏锐的洞察力和解决问题的实际能力,只有通过我上述文章中提到的,通过项目不断思考和实践才能积累经验。如果你的目标是成为更高级的工程师,那么除了在技术领域做到不可替代(一定程度上),你还需要明白除了技术以外,你还需要具备很多必要的能力。在初级阶段,写好代码和文档、做好设计可能已经达到了硬指标。越高级的技术职位,越需要具备宏观的系统思考能力,比如:

  1. 这个技术可以在哪些方面起到促进作用?
  2. 可以为用户带来什么更好的体验?
  3. 作为技术专家,如何说服产品/管理层来投资这个技术?
  4. 又如何实施这个解决方案?

技术只是解决实际问题中的一个环节,远远不是全部。不要只看重技术。能够真正从头到尾实现一个解决方案,才是最具有竞争力的。

我们需要发挥个人的积极作用,但是不要太过于强调个人英雄主义,也不要做无原则的好人。即使是新人,也需要积极思考事情是否应该这样做,而不是单纯地被项目经理或者经理的要求所左右。因为很多提需求的人并不一定懂得技术实现的可行性,如果我们盲目地按照他们的要求去做,很可能会白白浪费时间和精力。因此,我们需要因势利导,尽量调动各方的积极性,避免单打独斗。

如果我们所处的环境是一个注重实际行动的环境,我们就需要坚定地表达自己的观点,不要退缩;如果我们所处的环境是一个办公室政治盛行的地方,那么说明这里没有发展的机会,我们就需要离开去寻找更好的发展机会。

在工作环境中,我们要多与靠谱的人合作,向能干的人学习,帮助那些努力但是未掌握方法的人,远离那些不靠谱的人。


要有所为有所不为,这是一个非常重要的原则。只有放弃一些不必要的事情,才能更好地专注于做重要的事情。比如,作为一名从事IC工作的人,我曾经花费很多时间参加各种会议,包括讨论计划的sprint planning、讨论技术的review meeting、分享知识的knowledge sharing、向上汇报的demo,以及团队活动happy hour等等。这些会议占据了我大量的时间,导致我无法专注于工作。

为了解决这个问题,我向领导反映并希望能够优化会议设置。同时,我也学会了放下面子,不去那些对自己无益或对别人也无益的会议。这样,我节省了很多时间,提高了效率,也取得了更好的工作成绩。

总结

在职业生涯的长期管理方面,我认为现在的年轻人关注的问题主要是战术层面,比如比较不同的offer。另一方面,也有越来越多的人担心职场天花板,35岁以后的职业发展。回顾前几年的经历,我认为问题的根源在于对职业生涯的理解不到位。我们步入职场后,面对的是40年左右的时间,这是一个非常长的跨度。即使到了40多岁,还有差不多20年的时间才能退休。因此,职业规划应该是一场长跑,而不是短跑。许多人一开始就卯足全力冲刺,认为只有十年时间来经营,如果35岁不能财务自由,之后就会堕入黑洞。

尽管我们现在处于一个加速内卷的时代,但其实并不需要过度担心。首先,我们需要调整我们的期望。职业发展和其他任何事情一样,都不可能一帆风顺。如果我们能够进入这个行业,相对于我们的同龄人来说,我们已经很幸运了。我们拥有相对容易的移民机会、高工资和高福利等优势,这些优势会让我们产生一种之后的人生应该一路向上的错觉。但是,现实往往会给我们带来挑战。就像今年的疫情,许多人的职业生涯被迫倒退,这是无法预测和准备的。因此,作为普通人,我们需要做的最基本的事情是调整我们对职业规划的认知和期望,留好自己的底牌,保证自己有能力应对任何黑天鹅事件。其次,我们需要调整我们的投资策略。就像巴菲特一直强调的投资长期有价值的公司,而不是投机短期有利可图的股票一样,我们也可以将这个道理应用在个人职业规划中。

常见的情况是,我们需要能够看到长期的机会,不要因为短期的工资得失而放弃长期的机会。我一开始跳槽的间隔比较短,只呆了一年多就走了,因为觉得跳槽可以直接加薪,还有签字费,很划算。但后来我发现,一旦跳槽,所有在前公司积累的人脉、名声和资历,在新公司里基本上没有任何帮助,一切都要从头开始。然后我也观察到,为什么印度人占据了非白人管理职位的大多数。我发现这些人都在本公司呆了很长时间,以保证一旦出现职位空缺,他们是最有力的竞争者。懂得这一层后,对我自己转为Manager的规划起到了很大的帮助。我潜心呆在现在的公司,即使期间有想离开的时候,也还是坚持了下来。其实说起来,选择留下也并不容易。毕竟这里的机会很多,猎头也隔三岔五地找上门来,薪资也很诱人。更重要的是,前同事的工资提升会很大程度上刺激你的跳槽欲望,毕竟都是凡夫俗子嘛。我在现在的公司呆了超过五年,两年多前遇到一个好机会,成功转到一直向往的Manager职位,之后至今的发展也算不错,团队人数一直在稳步上升。

但是,这一切都建立在我选择留下的基础上。我很难想象,如果我跳槽了,我是否能在同样规模的公司中在同样的时间内担任管理职位。当然,这一切都是有机会成本的。也许如果我之前答应去蚂蚁,现在我可能正在等待上市并数钱;但同样,现在我也可能已经被解雇,无家可归。这些不确定性随时都可能左右着我们的生活,所以我们需要调整好自己的期望和心态。与其为没有得到的后悔,不如珍惜已经得到的机会。

在这里,我想再说一句,不要因为一时的失意就打开leetcode准备刷题离开。在我升为经理之前,我还有另一个机会,但遗憾的是我没有得到它,被一个印度人抢先升为经理。当时的我很生气,一度认真准备去另一家FLAG公司投靠朋友。但后来我还是决定冷静下来,撇开偏见,认真找找原因。最后,我确实从那个印度人身上学到了一些有用的战术细节和战略思考能力。现在回想起来,我从这个失败中学到了很多东西。当然,这里并不是在劝大家不要跳槽。如果遇到极品老板或恶心的公司,还是要尽早跳出火坑。同时,leetcode也需要常备常新。

总的来说,不要太在意小小的得失,不要因胜利而骄傲,也不要因失败而气馁。把职业规划看作是一场长跑,一步一个脚印地走,才能取得全局优化的效果。就像之前所说,职业生涯跨度很长,没有人能预测自己未来的方向。但是,只要掌握最基本的方法,就能增强我们在职场上抵御风险的能力,增加成功的机会。