概述
本文希望帮助 Mentor 在指导实习生和新员工时,建立一些基本的共识和准则。本文主要讨论的是技术类的岗位。
我们为什么要招实习生和应届生?
猿题库在招实习生上,向来是非常大方的。那么,我们为什么要花大价钱,招那些可能都没有任何实习经验和工程经验的学生?我们是为了让他们做一些简单低级的事情,还是想培养有潜力的学生?相信大家都能明白是后者。
那么,我们为什么想培养有潜力的学生?因为,找到一个靠谱的同事不容易,我们希望帮助这些有潜力的学生成长,在他们在成长的同时,最终能够喜欢上这里,最后能够成为正式员工。所以,为了吸引最优秀的实习生,我们开出来非常高的实习工资和有挑战的工作内容。
对待应届生也是一样,我们非常看重他的学校,成绩,数据结构和算法知识,兴趣,这也是为潜力买单。
但是,我们做的这些,得到的只是有潜力的实习生和应届生。他们离一个优秀的员工还有很大的差距,所以 Mentor 对他们的指导非常重要。如果把他们比做一个好树苗的话,Mentor 就是帮助他们最终成长成参天大树的人。相信大家都能明白,培养人其实比招人难得多。
那么,作为 Mentor,我们应该如何指导这些新人呢?
建立友谊
好的老师和学生的关系有些时候更像朋友。大家不但会交流技术,也会一起吃饭聊天,扯淡八卦。互联网公司推崇平等,朋友式的关系更适合讨论技术。
如何建立友谊呢?作为 Mentor,应该在新同事刚刚入职时,带他熟悉公司环境和同事,陪他一起吃饭。平常休息的时候,聊聊工作之外的话题。有些时候,大方一点,请他吃吃饭。
良好的私人友谊,对于新人融入团队是非常重要的,遇到困难时,他会更加主动地向你寻求帮助。等他成长起来后,你们会成为很好的同事。即使以后你和他不在一个项目组,甚至不在一家公司了,但是你们的友谊会使得你们相互尊重并欣赏,谁知道你们以后不会再次合作呢?
努力培养新人
如果说建立友谊算是铺垫的话,那么努力培养新人才算是正题。
虽然大家都懂道理,但是就我观察,很多人都没有意识到培养新人的重要性,当项目太忙,自己精力不够时,就忽略了这方面的工作。而这方面的工作又没有实际明确的标准,就很容易做得不好。
所以,我想了一个评判培养新人重要程度的标准:培养新人的重要程度应该高于所有线上的功能开发,仅仅低于线上的紧急 Bug 修复。如果你手头有重要的开发工作,同时有重要的新人需要培养,那么你应该优先把培养新人的事情做了,再做重要的开发工作。
为什么这么说呢?因为,培养新人是「一次性」的投资,假如一个新人成长起来所需要的指导时间是 20 个小时,那么你尽早的完成这 20 个小时的指导,新人就可以尽早地产出有质量的工作。而如果你因为项目紧张而忽略了这件事情,那么新人可能会养成一些不好的编程习惯或做事方式,之后,你可能需要更多的时间来纠正他。
具体来说,努力培养新人要做好的事情包括:
- 定期主动和新人讨论他遇到的问题。
- 开始的几周 Code Review,非常详细地审核,保证代码风格达成一致,一些不好的编程习惯得到立即纠正。
- 教会新人一些正确的学习方式,例如 Google,Github,Stackoverflow。
- 推荐一些深入的学习资料给新人。并且发现他在某方面没有提高时,持续 PUSH 他看相关的书籍。
定期主动和新人讨论他遇到的问题
建议新人在入职的头一两周可以使用这个办法。比如每天晚上 6 点半,在吃饭前用半小时,让新人把当天学习积累的问题和你讨论。
固定时间做固定的事情,一来使得你被他打断地次数减少,二来也使得他有机会把任何疑问都提出来。
Code Review
基本上刚入职的新人都会有 Code Style 的问题,刚开始的几次 Code Review,我们要首先解决 Code Style 问题。如果新人犯错,可以提供相关的 wiki 或代码风格资料给他,甚至和他进行代码风格的一些讨论,分享一些故事,让他对代码风格产生重视。一个合格的 Mentor 应该让新人在最多三次 Code Review 之后,就能够改正掉几乎所有的代码风格问题。
如果新人对代码风格有不同意见,可以组织一些学习讨论会,也可以在吃饭的时候叫上几个资深一些的同事一起分享这方面的经验。切忌不能只是用强力纠正,而没有让新人产生真正重视代码风格的意识。
在 Code Style 保证的同时,我们还需要让新人了解我们的各种编码约定,例如接口如何定义,目录如何安排,注释的原则,Commit Log 的约定等等。这方面也需要有 wiki 供新人学习。
Code Review 的最难部分,我们需要审核新人的架构和逻辑是否有问题,这方面花费的精力将非常多。对于有问题的架构,和新人的讨论也将花费大量时间。但是这就是新人成长的过程,对于他来说是非常重要的经历。
另外,让新人同时 Review 自己的代码,是一个非常好的学习方式,新人可以模仿和学习到一些好的架构和代码风格习惯。
正确的学习方式
部分新人可能对于使用英文查找资料,使用 Google 存在一些障碍。我们应该需要纠正他们不使用百度,不使用中文来进行资料查找,否则对他们知识获取将会有很大的影响。
我们还应该分享一些自己常常学习和提高的方式,推荐一些博客、论坛和社区给新人,让新人学会我们的学习方式。
推荐学习资料
在培养一段时间后,你可能就会发现新人在某一些方面的知识有所欠缺,但是显示我们把这些知识系统地讲一遍是不太现实的。我们应该推荐一些相关的书籍给他们,鼓励他们用闲暇的时间来阅读。时不时问问他们学习的进度,或者让他们分享一些学习的体会,都是不错的 PUSH 他们提高的技巧。
授权
当你发现新人已经成长起来后,可以尝试将自己熟悉的,同时重要的功能交给他来完成,而你自己做一些其它工作(根据实际情况,可以是更简单的工作,或者是更难的工作)。
这样做的好处是:
- 新人可以借此得到更大的锻炼。
- 你因为对相关功能很熟悉,所以也能有效地进行指导和监督,控制代码质量和风险。
将自己熟悉并且重要的工作交给别人,通常是比较难受的,因为一般人都希望保证效率,而自己因为熟悉,所以效率肯定是最高的。但是长远来看,对于 Mentor 来说,自己也需要成长,将自己擅长的事情交给别人,可以让自己跳出舒适区,尝试更难的事情。这么来看,对 Mentor 自己也是非常有利的。
回顾
不管如何用心,刚开始指导新人的时候,总还是会有一些做得不尽人意的地方。Mentor 应该对自己的指导过程有一些总结和回顾,然后总结一些心得,这样在指导下一个新同事的时候,就会做得更加出色。
总结
在和新人建立良好友谊的基础上,我们需要努力培养他们,并且把这件事情当作最高优先级的事情。具体要做的事情包括:
- 定期主动和新人讨论他遇到的问题
- Code Review
- 教会他正确的学习方式
- 推荐学习资料
- 授权给他有挑战的,并且自己熟悉的工作
- 带完一个新人后,回顾一下自己的工作,看看有哪些值得改进的地方