Dong Guo's Blog

我在第一份工作中学到了什么

| Comments

Hulu是我的第一份工作。从2011年1月开始实习,7月毕业后正式加入,到15年春天,正好是本科4年的长度,在这里对这4年作个总结。

1. 定位自己的技术领域

互联网行业太大了,从技术角度来说至少包含了硬件研发,前端,后端service,基础架构,数据平台,策略算法等领域。大部分人都不能做到在每一个领域精耕细作,可行的方式就是一段时间内聚焦在自己有激情(最好也有基础)的1个领域发力,关注另外1-2个领域的技术发展,同时follow整个行业的大的趋势和变化。

第一份工作的一个收获就是我确定了自己未来几年的技术定位:聚焦在策略算法(包括机器学习,数据挖掘,优化问题,策略设计等)上,关注数据平台和后端service的技术发展,了解整个行业大的趋势和变化。

2. 规划职业发展路线

规划规划就是在问:十年后你想做什么,成为什么样的人?这是比给自己技术领域定位更大更长远的问题。想明白这个问题可以让自己更有目标,在做选择的时候看得更远。

我的技术发展路线目前在大数据这块,从下面的基础架构,数据平台,到上面的策略算法,业务逻辑。大数据现在比较热,但是和每一次技术浪潮一样,这波浪潮也会过去,我的判断是大概5到10年。不是说5-10年后大数据没有用武之地,而是说这块的技术会越来越成熟,越来越工具化。

开源社区和一些相关的技术公司正在以风卷残云的速度推进基础架构和数据平台的稳定性和工具化:Clourdea和Hortonworks提供的工具让Hadoop的安装变得一键傻瓜式;Spark以飞快的速度变成稳定,可以部署在上千台机器在P级别的内存里计算;YARN集群的管理和维护可以通过图形界面方便地操作;Hbase发布了1.0版本,可以搞定T到P级别的数据存储访问;越来越丰富的内存数据库和列存储数据库可供选择。

上层的策略和算法也越来越成熟,特别是有丰富的lib来使用,大部分公司使用工业界经典的算法和经验,加上尝试学术界新的研究成果就可以解决大部分问题了(比如spark的mllib,在最新的1.3版本里实现了大部分经典的机器学习,推荐系统和数据挖掘算法)。我相信几年之内开源社区就会提供好用(相比weka)的工具让你在图形界面里通过鼠标拖拽和简单输入解决大部分ML和DM问题。对于很多优化算法,也有现成的实现,不需要自己去推导实现。

最终大数据这块在未来有挑战性的是业务逻辑,每个公司都有自己相对独特的业务,理清业务,分清主次,平衡商业和技术,利用大数据技术给公司创造最大价值是个人价值最大化的方式。这背后需要的是对大数据领域全面的了解,架构能力,商业思维和团队管理。这也是我目前的职业发展目标。

3. 个人技术发展 vs. 带团队

我身边有不少技术流同事(大多工作2-3年左右)比较排斥带团队,想要100%的精力放在技术钻研上,我非常理解,有一段时间我也这么想。现在我开始思考一个更好的平衡,身边也有同事作出了很好的榜样。

带团队对个人成长的益处是明显的:让自己有更高的视野,培养商业思维,锻炼leadership,更大地发挥自己影响力和价值的机会,在承担更多责任的同时也会获得更多的回报。

带团队一定会占用一定的精力:为团队制订目标,项目规划,团队建设,与团队成员定期沟通,为team负责,做一些没人愿意干的活。解决的方法有2个,第一是delegate工作,比如设立一个PM的角色负责项目规划和对外沟通,将TB的安排分配给某个细心热心的同事;第二个是更努力勤奋,在承担更多的责任带领团队奔向目标的同时还要提高技术的深度和广度,只能更加努力,这是职业生涯必须要经历的阶段。

4. 做一个积极的学习者

视野局限在手头的工作是不够的,跟住技术圈和行业的发展很有必要。下面的一些点有些是我在关注的,有些是需要加强的:

  • 和同事,特别是别的组的同事多多交流,了解公司各个部门和team在做什么,他们关注什么,有什么值得学习和合作的;
  • 积极参加公司内部的技术分享,特别是别的组的,用1个小时了解别人几个月做的事实在是很划算;
  • 订阅阅读,我在用feedly,比较好用,如果你关注大数据,可以订阅“Hadoop Weekly”, “Databricks”以及一些技术公司的技术博客;
  • 关注top conferences(ICML, KDD, AAAI, WSDM…), 90%的文章只需要看下标题,剩下的读读摘要和实验,需要精读或者实现的很少;
  • 关注github trend;
  • 微信的部分公众帐号
  • 重视动手实践,动手去试过,我才会认为自己真的了解;

每天保持阅读,follow技术进展和业界变化目前我做得还不够好,其实做了会发现也就是每天花半个小时,做与不做长期下来差别应该会很大。

5. 时间和效率管理

在Hulu的几年,时间管理上有一些心得,有些点执行得不够好,下一份工作要做到。

  • 每天早上的第一件事情就是做计划(前一天晚上应该更好),精确到半小时。按照优先级排序,每完成一项就标注,比较有成就感。注意尽力让自己不要被打断;
  • 给邮件分类,取消邮件提醒,避免被邮件打断,集中午饭后和晚饭后2个时间段阅读回复邮件;
  • 早上的时间最高效,我很享受很早到办公司,一个人把重要的事情先处理完,这样晚上甚至下午的时间可以用来读文章或者尝试新的东西;

6. 高质量带来高效率

质量体现在工作的每个细节中,在Hulu的几年深有体会,比如说发邮件,你的邮件有语法错误吗?你的邮件组织清晰吗?你的邮件里的每句话对方都关心吗(不关心的就要删除)?有把核心结论放在头部吗?你的观点有充分的数据支持吗?数据支持的图表美观易懂吗?我很感谢对我作出指点的前辈同事。质量还体现在你做的技术分享的质量,开会前的准备,代码的质量和效率,code review时的认真度等等。

高质量和高效率有一些不可调和的地方,这就需要依据事情的优先级来,比如code review需要的细致程度取决于代码的重要性,有没有别的高质量reviewers帮忙。但是很多时候高质量保证了长期的高效率,比如:

  • 如果代码比较烂或者跑得太慢,请务必集中时间立刻彻底改进它,否则这些代码以后会成为你的时间黑洞。

    实例:我曾经有半年的陷入在开发一个项目的某个模块(一个逻辑略复杂的spark应用),3个月开发完之后开始在集群上测试,跑得很慢,内存消耗也很大,但是勉强还能接受。虽然负责集群管理的team有所抱怨,自己一次完整的测试也要花4个小时,但是我还是没有足够重视。后来代码需要引入新的逻辑,由于之前代码质量不高,新逻辑的引入很痛苦,调试的时间也比较长。由于在spark集群中跑得时间太长内存消耗太大,经常会突然挂掉。挣扎了一段时间的小修小补后,终于下定决心梳理逻辑,重构代码,彻底修改了spark程序的并行逻辑,执行时间下降到了半个小时,内存使用大大减少,代码逻辑也简单很多了,这个改变要是在早期就做,肯定能节省很多时间。

  • 在动手进行正式编码开发前,确保对数据做细致的分析,否则可能浪费掉一周的编码时间(不要假设任何来源的数据是没有问题的);

  • 你可以先用某个新语言或者工具,但是有时间了请务必搞透它,否则以后会付出代价;

    实例:一直有一个坏习惯:每次遇到问题去google,而不是把东西研究透。在1年多前开始接触scala,草草地看了一本书,也写了一些比较小的应用,一直没有细致研究它。后来趟了无数坑。

  • 将能自动化的一切自动化(一个典型的例子是机器学习的实验,从数据准备到测试到发实验报告整个过程在自动化后可以节约大量时间,提高了后续实验的效率)

7. 做技术总结和分享

技术总结和分享可以梳理加深自己对知识的理解,纪录自己的成长,同时还是很好的提升自己影响力的机会。如果是通过演讲的方式分享,由于自己理解了和让别人理解不是一个难度,可以进一步加深自己的理解。锻炼自己成为一个好的演讲者(这非常重要)。

技术分享不仅仅是给大家讲调研了什么新的技术,读了什么nb的papers,还包括推动新技术,算法,代码库,工具在team和公司的使用。

8. 成为让别人和公司信赖的人

2013年一帮老朋友离开Hulu,都是和我合作比较多,对我帮助比较大的,第一份工作中遇到这种情况对我的影响还是比较大的。公司做了组织结构的调整,有一些别的组的同事调整到广告组来,在这个特殊阶段,我还算不错地扮演了team核心的角色,帮助公司让这个team稳定并一步步壮大起来。

在努力成为让公司信赖让别人可依赖的人的过程中,我成长了。这边总结下自己做得不够好的地方:1). 从心态上更好地调整好leader的心态; 2). 做判断需要更果断; 3). 更积极地协调大家的工作,特别是实习生的工作,让大家的效率更高; 4). 更好地和PM协调好工作分配

9. 扮演好自己的角色

在工作中,你需要相处的角色有4类,第1类是自己的下属,第2类是组内的PM(programe manager以及product manager),第3类是其他组需要合作的同事,第4类是自己的老板。过去4年有很多心得,也有不少教训。

  • 和自己的下属:需要明确自信地宣称你是老大,你为这个team以及大家的成长和发展负责,定期的沟通,及时指出问题,保证每个人有正确的方向,做的事情符合优先级顺序,有产出,帮忙解决block issue。当然为team制定中长期计划,争取资源和项目也是非常重要的;
  • 和组内的PM:需要一开始就划清职责边界,什么事情由谁负责决定,避免以后工作中出现职责不清或非良性得竞争。要敢于将工作delegate出去,当然要做到放得出去收得回来;
  • 和其他组合作的同事:平时要注意建设好关系,不能需要支援的时候才联系对方。合作的过程中要多从对方的角度思考,对方为什么要合我合作这件事?对方关注什么?对方能得到什么?不能suppose对方有义务积极配合自己;
  • 和自己老大:多沟通,争取主动权和控制权,学会向上manage;

Comments