工作这些年来,直接带过了数百名工程师,不小一部分的工程师到今天成长成为知名公司的技术总监、架构师和创业公司的CTO,从这些同事和朋友的身上,看到了一名名优秀的技术工程师所需要具备的特质。正好有一次在美团的 JD 中,发现了如下内容,深表认同,于是经过改造总结出了以下 12 点优秀工程师的标准。
* 1、热爱、迷恋技术,不搞复杂的人际关系,相信技术改变世界
优秀工程师是将工作和兴趣结合起来的,所以会迷恋对技术了解和学习,为了解决一个实验中的问题,可以从早上7点钟开工,干到晚上12点不挪动座位,甚至有一个笑话说,即使妹子站在身后色诱,真正执着的程序员也是不为所动的。
工程师都是比较单线程和一根筋的,在公司里面也很少搞公司政治,所以只要尊重程序员的技术之后,就跟程序员很容易相处,所以研发团队也没有复杂的人际关系,而当工程中复杂的问题出现时,程序员会想着用技术,而不是用人来解决问题。
* 2、对代码质量、设计质量、工程质量有追求,追求扎实基础学习
优秀工程师,在入行前后,要么自我学习,要么经受良师指导,有明确的规划,从而是有追求的一批人。这种追求,包括但不限于把在实现了功能之后:
在代码的层面,观感上更加漂亮,可读性更加好,逻辑结构更加清晰,效率更加优化。
在设计的层面,模块划分与功能版块职责解耦,利用框架来进行代码结构的规范,在代码文件部署的层面进行 MVC 的分离。
在工程质量的层面,对代码基本单元进行有效的单元测试和版块、整体项目的集成测试。
在提升自身业务开发能力的同时,将能力全面扩展,一方面学习更多的编程语言,比如PHP可以到JS、Python、C等,另一方面学习底层和基础,Linux底层和网络开发,提升数据结构和算法功底。这些过程的加强,比当初入行本身的学习需要花费更长的时间,也更为艰难,但是这是进一步能力提升的必经之路。
* 3、痛恨不靠谱的产品经理,希望对产品有更多发言权
优秀的工程师,不仅仅是原原本本实现功能的被动执行者,从需求到实现阶段,都要发挥自己的主观能动性。包括对产品的发言权,而优秀工程师,与产品经理的关系,往往也是良好的。具体体现在以下三个方面:
不仅仅是一个被动的执行者,对于功能和需求前期会提出自己的建议和见解,尽管这种建议和见解不一定被采纳,那也要积极地参与,这是一种参与思考的过程。
对于已经明确要实现的功能,要不折不扣地执行,有遇到没有实现或者是不能实现的情况,一定要提出和说明,而不是糊弄。
任何时候与产品经进的关系 ,都是博弈和平衡的关系,所以不是产品的所有需求都可以实现或者必要全部实现,如果不能实现,就有理有据地说服,如果无必要实现,或者有更为好而不影响或者取得平衡的解决方案,也要跟产品说明清楚。
* 4、迷恋解决问题,最好是迷恋用技术解决问题
优秀的工程师,是一个勤奋与“懒惰”的矛盾综合体。一方面,他勤奋地学习和练习所学到的技能或者勤奋地工作,开发产品,为了解决一个技术问题,可以不吃不喝到半夜,也可以凌晨 5 点起,折腾一天。但是一方面,他又会经常“懒惰”地想,尽可能地省事,尽可能地采用技术来解决所有的问题,达到一劳永逸的效果。比如你让一个优秀的工程师,每天花 5 分钟手工做一个统计分析,他会想方设法地将这件事情,让机器自动执行,哪怕用程序去实现这个手工 5 分钟统计分析要花掉半天的编程时间,也在所不惜。因为第一次实现花掉了半天,而在未来的很长一段时间,即使手工跑,也只需要几秒,而用自动化运行的话,除了监控正常运行之外,真的就是一劳永逸了。
* 5、干一行,爱一行,希望在工作领域大展拳脚
任何工程师,都不能行业本身而存在,尽管做的是同样的程序工作,可能是视频行业、社交行业或者是医疗、金融、教育等行业,其实在业务上都有相当的不同。优秀的工程师,除了自身技术能力提升之外,也会积极地提升对业务的了解和业务能力,因为优秀的工程师,发展成为架构师是他重要的追求,而架构师,不成为业务专家是不可能成为优秀的架构师的。尤其在今天互联网+和+互联网的时代,大部分工程师,都不是在纯互联网行业就业,而是进行各种各样的产业互联网公司,这就更需要工程师的业务能力。所以干一行,爱一行,专一行,就一个优秀工程师的基本素养的要求。
* 6、在工作中具备创业精神
如果换工作,工资占据着非常重要的位置,同时在工作中,也只需完成工作中的任务,而不去多想一分,这样的工程师是一种打工心态的工程师,是不可能成为优秀工程师的。而后者,首先选择工作的第一要务是是不是适合自己的职业规划和未来发展,一旦选定和投入工作,会从公司的角度,产品的角度和业务上下游的角度来实施工作,无论是身处的公司是数千上万人的大公司,甚至是上市公司,还是刚刚初创的小公司,都需要有这样的精神的工程师,这就是创业精神 ,而用我们小学所受教育的观点,也就是主人翁精神 。也只有这种的精神 ,我们才能期望他在获得了工作之后,能够深入到业务中去。
* 7、使用 Google 而不是中文搜索来求解技术问题
由于优秀的工程师,往往不断地学习或者解决较为棘手的问题(能者多劳嘛),而在学习到一定程度,尤其是一些比较新的项目和技术,可能需要大量地使用英文资料,所以在这个时候,无论是求知学习,还是解决问题,英文的重要性都体现了出来。百度上可能得不到理想的结果,而在Google上,解决的方案可能精准或者多一些。(补充说明:最近一段时间发现,百度也索引了大量Stackoverflow上的内容,所以搜索一般问题的解决方案,也好了一些。另外,在Google上,搜索到好的解决方案,要依赖于对关键词的选取,如果是错误消息的话,可以直接把消息输入进去)。
* 8、迎难而上,积极查找和使用英文资料,读英文技术书
接着上一点,要想成为优秀的工程师,能者多劳,对英文资料的掌握和使用能力也非常重要。所以对英文基础就有了一定的要求。如果英文基础不好,再难也要克服过去,否则,英文可能成为进一步提升发展的瓶颈。
办法就是
先学学常用的计算机英语
着看英文技术文章
进一步看技术书
最高级的应该就是看英文论文
然后在自己工作中加以理解和应用!
* 9、在工作8小时之外努力钻研技术或持续学习
由于工程师在早期的时候,要学习的内容太多,而技术更新又太快,需要解决的问题也多。所以想只在工作 8 小时之内就学习好技术,这是不可能的。我面试过追求朝 9 晚 6 的技术,也了解过有一些人,到了家就不开电脑,我可以断定这样的人,不可能成为优秀的工程师。真正的优秀工程师,会依据自己的职业规划或者针对工作中的问题,在工作 8 小时之外也努力钻研和持续学习,如果做不到这一点,我觉得这样的人根本不具备培养价值。
我曾经带过一名优秀的实习生,他是我当年带来的数十名优秀的实习生的最突出的一位,当时以实习生的身份就承担了核心产品的主程之职,我印象最深的是他每天晚上都是最晚一个走,包括大年三十晚上。这名同学果真是优秀的,后面进入了阿里,也在硅谷工作过,现在是Android开源界都比较知名的工程师。
* 10、具备产品思维,用户体验不仅是产品经理的事
产品经理设计好产品,但是毕竟,产品经理是在脑海中模拟,然后在原型中实现。真正的用户体验,还没有到用户操作的层级。所以难免会有一些考虑不足之处。一般的工程师,是按着产品的设计实现了就完了。并不在乎整个过程的好用与协调,更不说在细节上的注意了。
而优秀的工程师就会考虑到关注到这一点,在我的分享中,常举一个例子。当初做文章的评论功能。最开始第一版就是表单提交 ,然后页面刷新,跑到了页首。这种感觉是非常差的,而优秀的工程师,会将其用 Ajax 实现,这样提交完成了之后,内容自动闪现并且也不会刷走。即使不用 Ajax 技术实现,优秀的工程师,也会考虑锚点定位技术,在评论提交后,把评论的内容,闪现在用户眼前。所以这些细节就需要关注,在实现时,需要主动提出来与产品经理商量哪种实现更好,不要认为自己不用关心,当然也最好不要自作主张。
* 11、工程质量不能依赖测试人员,对自己代码负责
在程序界,有一句话是叫:“代码被狗吃了”,这一方面是说,程序员可能不慎将版本代码删除,另一方面是说,程序员不敢于面对自己的错误,老说,这在我那是好的呀,这我明明写的代码,怎么没有了?无论怎么样,这都有推卸责任的成份在里面。另外一个现象就是,程序员写完代码,连基本的测试也不做,就提交 ,甚至发布上线,结果导致线上出现低级的严重的故障。而优秀的工程师则是相对的,代码上线前先自己测试,上线前先一再确认,上线后更是需要确认运行的日志和结果数据。无论是前端影响到用户的项目,还是后台跑数据的项目都是如此。
* 12、工作不仅是完成领导交的任务,更要完成团队与自身提升
虽然工作是为了挣工资,是为了完成团队和项目中的任务,但是如果仅仅限于此,也不会是一个非常优秀的工程师。优秀的工程师,绝不会整天做着简单重复和没有创造性的工作,会想方设法让简单的工作,也变得更有意义 一些,在简单的工作中,每天都有进步,这个进步,跟上面所说的追求一样,对自提升有价值,甚至关于总结,对整个团队也有价值。
以上,就是依据美团 JD 所总结的 12 点优秀工程师的标准,我个人很认可,很喜欢,也分享给广大工程师、主管以及创业者和 CTO 们。