Blog Index

Facebook实习经验

2020年回顾

3年后会看当时的经验,还是有些naive,在自己当了intern manager和跟同事的interns共事后,对internship有了新的认识。

对intern的expectation

internship可以看作是一场3个月的面试,在internship中manager希望收集全面的信号来决定intern是否能胜任全职员工的工作。

具体来说,是做intern project和在做项目的过程中体现出来的素质。后者比前者更重要,因为一般来说intern project是well defined,intern manager在设计project会避免前景不明朗,目标模糊,需要大量试错的工作。intern只需要专心致志写代码,这对于久经标准化考试考验的interns来说不难完成。而且intern热情高涨,通常都会超出代码的要求。

项目的过程中体现出来的素质就不是那么确定了,充斥着主观的因素。比如intern学东西非常快非常多,会被challenge说这是现在对intern的基本要求。再比如intern代码量非常多,前六周上万行,会被问是不是intern在加班,如果真是加班做出来的会说work mode is not sustainable。也会被问代码质量如何,是不是牺牲代码质量换取代码量。归根结底,是intern的努力方向跟评审方不一致,导致事倍功半,甚至费力不讨好。

从另一方面看,在CS内卷日益激烈的2020年,大家写代码水平也没有差出一个数量级,所以这些soft skill就是容易出彩的方向了(meets all 以上)。还是拿代码量多来讲故事,“这个intern很快的完成了project指定的任务,并在做任务的过程中发现并完成了其他需要完善的功能,整个开发与部署过程非常流畅,所有改动都是有unit test和canary,在运行中没有事故”,是不是能释放更多积极的信号呢?

就soft skill方面,FB给出实习生的评价指标是communicative,independent,initiative。归根结底,这些指标都指向一个目标,win the trust of your prospective collaborators。intern manager和peers在最后会被问,“你愿意以后跟这个intern共事吗?”,具体一点,“交给它的工作,能够按时保质保量完成吗?”,“一个非常重要的项目部分,不能失败,能放心交给它吗?”,“跟它一起工作,效率高吗,省时省心吗?”,这些问题在实习开始的时候大家并不知道答案, 而且这不是列一个check list,然后跟标准上一条一条对比就能做好的。这是一个长期积累的过程,而且不确定,有人实习前就会,有人则需要实习工作后学习。

intern的策略

如果有选项目的机会,我司impact第一,如果能在三个月之内作出大家都能容易看见的成果,首选。比如moving KPIs。

对于communicative,independent,initiative没有太多信心,还是隔几周就问intern manager的反馈。一个nice的manager会真诚的跟你说出这些问题的。

如果最后没有拿到满意的结果,这并不是完全的否定。可能是跟公司的做事风格或者跟同事的风格不匹配。公司的评价只是人的一个维度,而不是全部。

2017年实习之后

怎样去实习?

  1. leetcode
  2. 找学长内推

关于选项目

  1. 实习时间很短,3个月左右。如果希望能在3个月时间完整的做一个项目,首选well-defined的问题,就是在开始之前已经明确知道最难的地方在哪儿,有什么解决方案,预期的结果是什么。
  2. 如果实在选到一个全新的项目也没什么。即便做到什么糟糕的程度,也可以claim自己是第一个做这个的,然后列出contribution 1,2,3….而且项目的完成度只是评价的一方面。

关于代码

  1. 对于大型复杂的系统,要依赖调试器,没有谁比编译器/调试器更了解程序。
  2. 每次提交diff时,在保证完整的前提下,改动的代码尽可能的小(4个文件,10个blocks, 不超过100行)。代码改动太大,没人愿意帮你review,一是阅读难度大,二是很难看出错误和验证正确。将来运行有偏差,reviewer也有责任。
  3. 对于小改动,如果manager不看,可以找其他组内engineers。对于大改动,如果manager不看,只能在diff上继续做,phabricator(代码审阅工具)提供stacked diffs,或者做一些并行的任务。
  4. 少在已有的代码上添加一些辅助的变量/logging。这些东西有可能有助于调试,但是reviewer也可能以增加内存开销,增加CPU负担拒接你的修改。

关于评价

  1. 产品只是一方面
  2. 交流是另一方面,体现在
    • 能在Phabricator高效讨论代码让review快速accept你的改动。
    • 快速回复task, messenger
  3. 独立性。完成任务时麻烦别人的次数越少越好。
  4. Initiative。就是做跟自己主线任务相关不大的事。比如承担side tasks/projects。这是一个很大的加分项。
  5. 让manager高兴至少跟完成project同等重要,如果project实在做不完,一定要让老板看到交流,独立性方面的表现。

关于manager和其他工程师

  1. manager和其他工程师是乐意解答问题,但是他们也非常忙。
  2. intern的工作对manager并不重要,做好了manager也不会有大贡献。manager不会把intern的问题放在最高的优先级。
  3. 别一大清早就去问manager问题,也不要一碰到问题就去问manager,本来manager早上来就有一堆事要,这时候拿一些琐事找manager很烦人。
  4. 等到下午3,4点,大家一天的活都干得差不多的时候,再去找别人问解决问题。最好预约30分钟,积累一些问题集中问。
  5. 对manager和senior engineers/scientists态度一定要好,如果他们在review diffs和讨论时提出了什么建议,一般情况下老实照做。如果不同意千万别回复”I do not agree.”/”Why?”,这样做会被认为aggressive/assertive/hard。

关于infrastructure teams

  1. 很难,比前端不知道难道哪里去了。
  2. 对可靠性要求很高,因为很多产品都依赖于infra,infra崩溃了很容易弄个大新闻。
  3. 学习周期长,学习内容多,可能实习到一半了项目才刚开始进展。
  4. 需要考虑很多东西,线程安全,内存管理,scalability。