一个好的新人工程师是什么样的?
写下这个题目,再看看自己的履历,自己觉得自己还远不够格做一个好的mentor。
从2015-07自己刚毕业,也是一个RD新人,到现在的工作经历也不过1年零9个月。有幸在老大的有意栽培下,在最近一个季度(3个月)里带了一名新人。
话说这位新人虽然是本科生,但是工作时间跟我是差不多的。之前在一个小的做在线旅行的创业公司工作,据说也是进步飞快。自己还是有点怵,因为自己也是资历尚浅。
这里就谈谈什么是一个好的RD新人,还有我的一些看法。因为我的资历尚浅,所以这个只是第一版,希望这个也可以成为一个系列。
优秀工程师的必备素质subset
首先,我自己还远远不是一个优秀的软件工程师,这个是我的目标,所以这里只能谈一些粗浅的见解:
- 自我学习能力 这个我放到第一位,是因为,互联网或者说软件编程是一个发展太快的行业,还有无数的新人涌入。自我学习能力能够保持自己的视野、知识架构和思维方法论的更新。突出自我是因为,天朝的教育过于重视考试,导致许多学生往往精于How而不一定能够搞的明白What和Why。而后两者往往却又非常地重要。自我学习,需要自己设定目标,设定计划,保持动力。
- 解决问题的能力 从一开始局部的技术问题、技术难点,到宏观的服务架构,再到背后的业务流程、产品愿景。你必须要成为一个合格的Problems Solver。这个往往是核心的竞争力之一。
- 管理能力 对自我来说,这是一个需求、任务并行执行的时代,需要按照重要性优先级做好任务管理。还需要对负责的项目的进度、目标、里程碑、规划有深入的思考与管理。
- 沟通能力 沟通能力体现在很多方面,在现代软件工程中,上古大神solo的神技越来越少,需要团队合作。有合作就需要有沟通。
- 责任心 一个优秀的工程师必然是一个负责任的工程师,这个是毋庸置疑的。
那么对于一个刚起步的软件工程师,一个好的新人应该是什么样的?
看他对软件开发的动机与热情
这个可能是一个容易争议的话题。一个是这个问题很虚,很难衡量。一个是是否有必要?
我不能否认的是,即使不热爱软件开发,也可以在这一行干得不错。现代的软件开发需要的软素质越来越多,团队合作、任务管理,还有对业务、产品的理解等方面突出的能力都能成为你的核心竞争力。
或许这是一种必然的趋势,软件开发原来最hardcore的部分会慢慢被自动化,最不容易被机器替代的是那些涉及到人与人之间的技能。
不妄议未来,只有对软件开发的热爱,才会有足够的动机成为一个优秀的软件开发工程师,才会有耐心与恒心去解决那些tricky的bug;去为了1%的性能优化反复对比测试观察数据;去为了解决了一个问题、攻克了设计问题而从椅子上跳了起来。也是因为它,你永远想要了解新的技术能够解决什么问题,保持好奇心。
解决问题的能力、思维能力也在这些反复的枯燥的case中反复磨练出来。动机与热情是你前进的『发动机』。
如何衡量?可以关心在他的项目经历里,有没有他亲自解决的重大的bug、问题跟进?他如何去面对困难?他是否为其的解决而兴奋?
他有没有博客?有没有github?业余时间有没有为技术提升投入时间与精力?有没有个人成长的计划?
看他如何看待责任
新人会逐渐地参与到开发,甚至开始负责一些小的模块、功能、项目。这意味着『责任』。责任心是一个
责任包括什么?包括但不限于以下几点。
代码质量和鲁棒性
在我刚开始带新人时,在code review时,常常因为代码里的一些潜在的bug隐患去comment要求改正。新人往往会拿出一些理由,比如,我在测试时观察数据,不会有这种情况。这时候,会有一些争论,因为测试只是抽样测试,肉眼观察一些日志输出,你没看到不代表不存在,现在不存在不代表以后不存在。这些潜在的bug改起来非常容易,却能屏蔽掉可能的问题,是投入产出比很高的事情。
而新人有时候会以PM的deadline和紧急程度,本质上还有自己不想返工修改再测试的懒惰为由,选择性忽视。
这和责任有什么关系呢?
既然是负责的项目/模块/任务,它的正确性、健壮性就是你的成果。任何任务的成果都不单单是完成功能这么简单。在真实的场景中,压力测试、正确性测试、代码可维护性、可读性都是结果的衡量指标。一个好的工程师需要在这个多维的衡量指标和自己投入的时间/精力中寻求一个良好的平衡和妥协点。
如果一个新功能在延期和带着不确定的质量与问题上线间选择,在大部分情况下,延期保证质量都是一个正确的、负责任的选择。
这也适用于代码质量。
应对线上问题
在线上出现问题的时候,尤其是自己负责的项目,能否在所能的情况下,担当起责任?还是说,一下班,一到周末,便消失踪影?
在我刚开始开始进入到新的反爬项目组的时候,代码还非常不熟悉,那个周末我还和老婆去了江苏盐城看她的闺蜜。奈何项目初期阶段加上爬虫猖獗,在她朋友家里硬生生加了两天的班。
当然不是要求新人必须时时刻刻挂念自己负责的项目。
主人翁意识
对整个项目,是否有主人翁意识,主动思考系统存在的问题,需要优化的点,可以提高的地方,不合理的地方,去与mentor讨论,而这些可能在他的职责之外。
好的新人不会被组织架构、任务安排的界限限制住自己的思考与洞察。
看他如何应对问题
对新人来说,一次性地要求他解决遇到的问题,或许是为难他。但是,如果遇到问题就直接抛到StackOverflow(或者其他社区)或者他的mentor那里,也是不负责任的。
我们常说,遇到问题,先明确问题的定义、目标,再问google/StackOverflow,结合这些信息重新审视问题,最后带着思考去问mentor/去社区提问。
那么需要带着什么去问mentor/社区提问?关于这个,How to Ask Questions the Smart Way这篇文章有详细的解答,简单来说,你需要整理清楚:
- 你遇到了什么问题?情景是什么?
- 为了解决问题,做了哪些尝试?结果是什么?
- 对问题的可能原因,有哪些猜测?
- 出问题之前,对出问题的系统有哪些可能相关联的改动?
- 解决问题的人如何能够复现这个问题?
带着你的思考与中间性质的推论去问问题,能够让被提问者有更多的把握解决问题,同时觉得,这个问题对于他自己也是有价值的。
一个优秀的程序员不会觉得帮助别人解决问题会耽误他的时间。如果是一个高质量的问题,他们反而会觉得兴奋。但是,如果你拿着一个新出炉的问题,在他仅仅google了一下就给出答案后,明显会影响你的『形象』。
关于这一点,对于mentor来讲,还需要关注几点。
- 我们都知道模仿是学习编程方法与编程技术的最佳手段之一。复制、修改、模仿经常会出现在新人甚至老人的代码中。但是新人可能只是在模仿,并没有对于被模仿的代码、技术、设计有更加深入的理解,只是为了解决问题而做。这样模仿就失去了它最大的潜在价值。
- 在解决完一个问题后,新人是否会对问题进行记录、反思。我个人的体验是,当你觉得你解决了这个问题,在review、记录这个问题,或者和别人讨论这个问题时,往往自己就会意识到之前理解有所疏漏,有所误解,或者还没有透。记录、讨论、复盘,都是我们在rebuild、建立索引,这个过程往往会激发新的灵感,新的理解,所以,我会强调,记录/复述你遇到的问题和问题解决过程,及时反思自己的解决问题的思维过程。好记性不如烂笔头。
- 许多问题,通过沟通与职责认定,可以交给更合适的人去做;还有,许多问题,能否通过沟通找到合适的人帮助一起解决?我自己在工作中常常摸不着头脑,是因为在和错误的人沟通。在老大将正确的相关人加入到沟通后,沟通才取得了更大的进展。
以上,是我的浅薄之见,欢迎大家参与讨论。日后,如果能够更多的机会,也会分享更多的想法。