前几天在现在的公司工作满五周年了,想想还蛮意外的,意外在于,没有想到在一家公司居然会呆上五年之久。在我之前的头脑中,在一家公司呆两年是比较合适的,也许一年就够。理由很简单,在一家公司真的呆了一年,假如你足够勤奋,应该足够学习到你想学习的东西了,尤其是你的mentor的技能。全部学习到不可能,但是学个五六成应该没问题了,否则只能怪自己太笨了。
那时候我觉得,在一家公司呆五六年的人好奇怪,什么工作值得干上五六年?在来这边工作后,知道谷歌那边有一些人干了十几年,一呆就呆到至少当上 staff engineer,觉得也是很莫名其妙。公司再好,一个事情干好几年总会腻,并且容易瓶颈。我前公司的领导们,不少是在百度呆了五六年以上,还都是一毕业就在百度的。那会我觉得挺神奇的,百度呆这么久,高T也没混上,不知道图什么。
现在我对之前的想法有所改变。下文会说一说在一家公司呆五六年到底还能学什么。
还是从自己的工作经历总结起吧。
十年一瞬
大家别奇怪,标题是工作八年,怎么这里成了十年了?因为我真的工作了十年,其中前两年是全职实习生。工作的经历大概如下:
09-10年,在一家小公司做服务器开发和IM客户端开发。接触Linux开发和Windows开发。当时后期带四五个人的团队。
10-12年,在云壤工作,1年实习,1年正式。云壤是我知道的迄今为止谷歌工程师最密集的创业公司,我去的时候大概二十几个员工,谷歌来的十个以上,来来往往的前谷歌人估计接近二十个。在云壤接触了搜索引擎,对爬虫,索引挑选,网页处理等有较多的接触。当时没有带人,一心当小弟。
12-14年,在宜搜科技,做移动搜索引擎。宜搜目前没什么名气,当时还是移动搜索的重要玩家,云壤当时从网页搜索转型移动搜索,竞品分析里就有宜搜。入职时担任的是爬虫组负责人,工作主要是爬虫。后来也负责索引和一些新业务的整个后端。在宜搜大约一年,升职搜索架构师,当时在宜搜我应该是最年轻的架构师了。不过可惜,在宜搜学习到的技术并不多,主要是技术输出。后来一位exGoogler告诉我说,我在宜搜两年其实有点耽误了,一定程度上我是认同的。当时最多带十几个人。
14年至今,在当前公司任职。在这边工作接近两年后,升职技术总监,又过三年,升职高级技术总监。开始的时候带人两三个,中间几乎单干,后来五六个,十来个都有。目前多点。
多变的时代和行业
回顾十年的工作经验,蛮多感慨的,这样的感慨也发生在阅读《浪潮之巅》《硅谷之谜》时。时代变快真是快,尤其是IT行业。快到连追逐浪花的勇气都快没有了。
在09年的时候,当时还是百度当霸主,大家以能进百度为荣。那会我也去百度面试了,没记错的话我在实习和应届校招都面试过,人家没把我当回事。后来在毕业1年后,百度给过个offer,接近T6,不过我没去。目前,百度对人才的吸引力更弱了一些。我认识的一些人,目前也都在犹豫要不要离开百度。
后来实习做IM的时候,那会大家都认为能去腾讯开发QQ绝对是最牛逼的事情,钱多,有成就感,你想,几亿用户在使用QQ这个产品。这会别说开发QQ有多牛逼,开发Windows客户端都快凉凉了。就是微信都面世八年多了。
那会我刚来这边的时候,大家还不知道人工智能是啥玩意,听过的就是推荐,广告,搜索,最多机器学习,意图理解等。我在加入这边的时候,还搜索了一番,觉得语音不靠谱,难度太大,后来没多久,铺天盖地都在炒作人工智能,应届生不管什么专业,都在简历上写自己在人工智能上多有积累和造诣。也许过几年,又会回到语音技术,图像处理技术,搜索技术,推荐技术,广告技术,而不是目前人人皆说人工智能的状况。
异于常人的选择
我呆过的最大的公司就是目前的公司,最多达到800+人,估值在独角兽水平。呆的第一个公司,入职时10个人不到。第二家去的时候工号21,离开的时候大概两百人。第三家去的时候五六百个,离开的时候估计三四百人。目前的公司加入时三十几个,在A轮阶段,后来有了B轮、C轮、D轮等。
我也和几乎所有的应届生一样,有大公司情结。不过我属于比较懒的人,有了选择后,可能就放弃再次面试和比较了,比较能说服自己:“想学习哪里都一样”。不过我懂得学习的法门,却是花了好几年的时间,以后有时间再专文分享。
实习的时候,大部分同学去了大公司,比如微软,人人网,Adobe,百度,网易有道等。不过目前来看,人人网几乎挂了,Adobe退出中国了,网易有道早就和搜索没啥关系了。死不死其实和大公司与否没啥关系。而我呢,当时因为比较懒,有了选择后,第二天就去报道了,告诉自己,Offer其实还可以的,实习薪资一天还有120呢,可以了,加上饭补20,一天140了,一个月三千多呢。(当时就是这么乐观,算钱的时候算“total package”来安慰自己)不过在实习快一年的时候,我离开了这家小公司,虽然当时我还在公司的“管理层”,公司的管理层会议,我还参与过几次。不过我觉得自己应该追求技术,而不是太早将精力花在管理上。
毕业的时候,大部分同学也都去了大公司或者国企等。比如阿里,EMC,百度等。而我当时几乎没有投过简历,记得当时可能唯一面试过的互联网公司就是宜搜科技和3G门户了。Offer都有,但是都不如云壤有吸引力。另外还有一个面试,记得是做视觉的,还是国企,给军方做项目,面试的时候问了很多个人隐私信息,11年那会,我说要年薪30万(有户口),他们的HR觉得我有病,要价这么高,浪费大家时间,原因很简单,牺牲了技术发展,我当然要多一些,否则去了就得立马后悔。现在我反倒庆幸当时没去,要是那会去了,可能当时在班级里我会是薪资最高的(那会微软的Offer一般22万左右,人民搜索大部分在17-20万左右,百度特殊Offer在22万),但是绝对会是目前看来最傻的决定。刚开始的时候钱多个十万八万,对整个职业生涯而言没有什么帮助。那会也有一些人,选择去日本外包公司,待遇相当于人民币40万/年左右,和国内的offer相比,简直高得吓死人,目前在我看来,选择这样的Offer,都是很蠢的决定。
小公司里如何精进
小公司往往因为创始人的背景,决定了团队的平均水平。大佬创业,一般都是精英团队,而普通创业者,招聘能力还是比较弱的,原因很简单,一来,没能力融资就意味着没钱招聘,二来,创始人们的能力不够强,也会导致没能力吸引到优秀人才。不过团队里的能力有强弱,但是在不同的团队,个人能够学习的东西还是很多的。比如:
1.在我第一家公司里,我学到了问题到我为止的求学精神。我算是team leader, 我第一次学会了怎么编译大规模软件,怎么去构建团队,怎么做招聘,怎么去解决软件稳定性问题,怎么处理编译和链接的各种诡异的问题,怎么去构建代码基础库和共同的代码风格。不过很多事情都是自己瞎折腾,毫无体系,而提出的解决方案,也没有什么水平,因为当时的自己,搜索技巧也不成熟,连谷歌搜索引擎都不知道怎么使用(那会公司没有谷歌搜索,而自己也没有买过VPN),没有能力去搜索到业界成熟或先进的技术方案。不过客观来说,当时开源的氛围还没那么强,很多谷歌等的知名项目,都是在11年后出来的。
2.在第二家公司,我不是leader,也没有带过人。毕竟当时我在的时候还几乎没有应届生加入,而我自己还是实习生,工程师里几乎是最嫩的,怎么可能有机会让我去带人?不过没关系,我还是发挥主人翁精神,在实习阶段就承担了很多基础库的开发,承担了几个重要模块的开发。因为开发或者维护了不少基础库,因此找我咨询问题的同事倒是蛮多的。有人找你问问题是好事,问题找上你,你就有机会去总结和归纳,这样别人问你的时候你才会说得有条理。而别人找你,就会给你提新的需求,新的需求的实现过程,其实就是不断突破自己的过程。这时候我的mentor的风格间接促成了我独立解决问题的习惯。
当时的mentor不太喜欢做员工沟通,也很少与我沟通技术方案,更多的是告诉我要做什么任务,而不是告诉我要怎么做。我曾经心里有过一些抱怨,觉得公司在培养人方面太不积极,但是另一方面想,知识就在那里,人就在那里,他们都为好奇的人随时准备着。只能怪自己当时太嫩,没有足够强的好奇心,没有足够明确的学习计划和求学心态。机会总是留给有准备的人的。
另外一点,当时觉得有一些问题不好意思去问,因为自己并不参与那块的研发,而那些还是公司的核心模块,也许因为保密,也不适合问太多吧?现在想来,这个想法太幼稚了。大部分技术人都会因为别人找自己请教问题或者讨论问题而开心,大家会因为分享而提高存在感和成就感。你要是问了不该问的,回答者不回答就是了,绝不会因此而对你打上“偷师”的标签,而很可能会心里想:“这小朋友真不错,勤学好问,是个苗子”。
很可惜的是,我在第二家公司呆的时间并不够长。当时觉得爬虫也没啥好做的了,自己参与过大部分模块的开发,算是元老了。而别的新的活儿也没什么挑战。其实回想起来,当时应该花大力气去学习索引、检索和排序技术,把相关的技术学个遍。那会虽然云壤的搜索质量不算太好,但是却有好几个聪明人在。比如后来360要和百度在搜索上硬碰硬,找的移动搜索和PC搜索的技术负责人,都是云壤出去的。
我们觉得自己学得差不多了,其实是自己的眼界受限,自己不敢在公司内去承担更多责任,自己没能在公司内发挥更大的作用罢了。很多时候,不是没有学习的机会和空间,而是自己没有认识到、没有抓住。
3,在第三家公司,我花了很多的时间重新造轮子。原因很简单,这里的轮子太旧了、太烂了。每一次重新造轮子,我们对轮子的理解就又深了一层。当时造的轮子包括:编译器的选择,开发环境的选择(操作系统和IDE),编译工具的选择(google bazel 之类的build system,不是指 GCC 这样的编译器层面),源码管理工具的选择,code review平台的选择,代码风格的选择和推广,基础库的编写和旧代码的重构,单元测试的引入,内存泄露的检测等。当然,重新造的轮子主要还不是上面这些,而是重写了大部分爬虫的模块。网页爬虫系统其实挺庞大的,代码规模也不小。算上网页解析和排序信号抽取的话,代码规模更是庞大。当时我的主要工作就是重写这些主要模块,让爬虫抓取规模上来,让稳定性上来,让新的数据抓取需求能快速响应,让搜索的时效性上来等。
后来爬虫没什么好做的了(主要是因为搜索没做起来,流量不增长的话,对爬虫的需求就没那么强,因为搜索质量小幅度提升的价值有限)。后来去负责好几个新App的后台开发,包括一个应用商店,一个类似头条的新闻应用,一个视频搜索网站等。那个视频搜索网站大概是融合了网页视频搜索和种子搜索的形态,这基本是我自己的Idea,雏形也是自己做出来的,包括爬虫,索引,检索,排序,以及最开始的网站前端。那会当真是把自己当全栈工程师了,并且产品心爆棚。
宜搜这段经历,学会了怎么在整个搜索产品的视角看问题,怎么带一个十来个人的团队,怎么去培养其他人成长,怎么去站在整个部门的资源看问题。
前面说了,我离开宜搜的时候,公司人员大幅减少,估计才剩下不到400人。减少了三分之一不止。我历来对公司的运途还算敏感:我离开云壤后,大部分谷歌人慢慢开始离开了;我离开宜搜的时候,那会大部分人也开始离开了。在互联网公司,被动离开其实很高频,比主动离开还多。公司还欣欣向荣的时候,很少有人会主动离开,因为多多少少都还有机会在。我一直很讨厌在一家进入沉默阶段的公司待下去,这可能也是我习惯性选择在创业公司的原因吧。毕竟创业公司要么爆发,要么死亡,不太可能不死不活,不死不活的公司,老板也会觉得食之无味。
4,离开宜搜就来到了目前的公司C。刚开始半年差不多也是重新造轮子,把垂直搜索重新写了一遍。每次重写都能找到新的感觉,有更进一步的理解。比如爬虫,解决的问题差不多,模块也可能差不多,但是每次重写,对问题的认识,对有限资源下的目标最大化,都有更深的理解。小公司做搜索没什么机会,做了半年多,我甚至都开始写Windows脚本了。做了半年多,我开始写语音合成。当时几乎对机器学习完全白痴,对语音技术更是白痴,不过这并不妨碍我转去做语音合成。当时公司没有人做过语音合成,我自己一个人带一个实习生琢磨,竟然在三四个月左右就做上线了。后来做了一两年搜索和合成后,开始做语音识别。目前几块都有所参与,算是公司里工作范围跨越的组别最多的工程师之一。
如何实现自我突破
小公司里,不是没有牛人,不过往往比你牛的人都比你忙,可能他们是VP或者CTO,甚至是CEO。人家总不能天天带着你成长吧?大部分管理者事情多,并且不太做微管理,更喜欢下属自己主动成长。后续我会写一篇文章说一下管理者喜欢的工作风格。
小公司里,你如果稍微有一些能力,往往还会是个leader,甚至是总监,有时候还身兼数职,学习的时间更少。那往往让人很容易天天迷失在琐事之中,技术得不到成长。
这里结合我自己在C公司的一些经历,做一些总结分享。
学会阅读最好的书籍。比如计算机行业,应该阅读《计算机体系结构——量化研究方法》,《计算机组成与设计》,《计算机程序设计艺术》,《重构》,《代码大全》,《TCP/IP详解》,编译器龙书,Linux内核源码相关书籍,《深度探索C++对象模型》等书籍。而不是仅仅翻阅国内课本,CSDN博客,翻译很水的外文书籍。
学会阅读最专业的论文。很多topic,其实自己想破了脑袋,都不如找几篇业界的论文看看。论文里除了说明现状以外,也会提出一些新的想法去改进。毕竟论文比书籍更新,为了了解最新的研究成果,必须养成搜索和阅读论文的习惯。
学会阅读最好的开源项目。很多时候论文里的想法没有开源,所以应该看论文。而很多时候论文里的想法又太飘,导致很难完全理解,这时候就可以借助开源项目了。在我前几年的编程生涯中,我基本只是做到知道怎么用,知道复杂度,但是不知道这样的复杂度是怎么实现的,而不同的设计目标,又会导致不同的项目有怎样不同的trade-off。
保持好奇心,学会顺藤摸瓜。很多时候围绕一个问题,顺藤摸瓜,可以花了一年半载去学习和钻研。而这往往更有延续性。去年开始我花了很多的精力做性能优化,也因此阅读了很多的相关资料,包括操作系统的实现,体系结构的设计、历史与进化,指令集,编译器的性能优化,C++的性能优化,常用的数据结构的实现复杂度,常用的性能优化技巧等。基本上围绕着性能优化这个事情,我一路阅读了Google gperftools 的源代码,想到了一些改造方法,改进了很多开源项目的性能(比如word2vec, leveldb, crf++, openfst, SRILM, KenLM, Xapian 等),并一路学到了操作系统的CPU调度和存储器管理。
学会发挥自己的长处,也学会忘掉自己的长处。比如我之前一直做的是搜索引擎,那么爬虫,分布式系统等是我的长处,我就可以在语音工程里发挥这些长处。同时,忘掉自己的长处是说,很多时候你的长处在公司不一定有发挥的空间。这个时候要么选择离开,找一个适合自己的坑,要么既然选择留下了,那么就改变思路,找一个更适合公司战略,更重要或更有难度的事情去做。
我以前经常想着,妈的,我的搜索经验也不错,懂爬虫,擅长网页解析,懂索引检索,还能做一些排序。技术视野可以说相当可以了。何况我自己还做过很多的垂直搜索,熟悉垂直搜索的构建过程。我想找工作,分分钟找一个垂直搜索团队的负责人。我带过的人,出去做搜索都可以拿到百万年薪了,我为什么不继续坚持把搜索做透,继续提高我的搜索能力呢?因此花了不小的精力在搜索上。后来因为公司对搜索的需求其实没那么强,个人的贡献也没有充分发挥出来。搞得自己偶尔会有怀才不遇的郁闷感。
站得更高,应该看得更远。假如你已经是技术总监了,其实可以充分利用职位给予的权利和空间,找到更多适合自己发挥的地方。看得更远是说,你应该多想想哪些事情对公司是有价值的。不仅是创业公司,商业这个事情都是在有限资源下的竞争游戏。如何提高绩效,本质上还是在各种限制条件下,去追求目标最大化。那么怎么去最大化目标,关键就在于你对公司目标和战略的理解,你对团队资源的理解,对各种限制条件的理解,对内外部竞争优势的理解,对个人能力和贡献空间的理解。
成就别人,从而成就自己。工作开始的几年,总是更为“自私”,老想着怎么更快地提高技术,做一个事情时,其实很多人不管对公司有没有价值,只要能够让自己学习到技能,他们就干,并且一意孤行。而工作越久,负责的任务越多,带的团队越大,这些时候越能明白,其实成就别人的乐趣更大,并且成就更多的人,反过来也能成就更好的自己。
把自己当成公司的主人,一起打造公司这个产品。最近流行说张一鸣run 公司,宿华run产品。其实真想成长,多想想怎么让公司成长才是正道。公司成长了,你的薪资,你的期权价值,才有上涨的空间。公司成长了,你的团队才有可能有更优秀的人才加入,你的才华才有更大的施展舞台。有了这样的视角和想法后,你会发现,每天面对的问题太多了,能够学习和成长的技能数也数不清。
互联网的变数太多,而身在互联网的小公司,变数更多。倘若说我以前仅仅是没勇气和信心去挑战大公司的机会,目前我反而蛮喜欢在小公司不断超越自己的感觉。我可以说我自己的自信心越来越强了,你可以说我越来越没有追求了。在未来的八年里,我也许还会在小公司,也许有机会一起把一家小公司打造成我所喜欢的大公司。
路漫漫其修远兮,谁知道呢,且看脚下的路,一步一个脚印吧。