神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:具备什么样的素质的人才能成为一名高级软件工程师? 有人也许会用10X工程师来定义。是,10x工程师是战斗力超强的独行侠,但是作为高级软件工程师,你不仅要具备娴熟的技能,更重要的,还要具备与人合作的能力。只有能够领导和提升他人的软件工程师,才是真正的高级软件工程师。Israel Miles分享了成为高级软件工程师必备的五大技能,有志于更上一层楼的软件工程师不妨参考一下。原文发表在Medium上,标题是:The Top 5 Skills of Senior Software Engineers。
我在技术这个行当已经干了6年了,不过过去5年都是在上大学,只是最近才成为一名全职软件工程师。不过,在此期间,在自己的同学、同事和经理当中那些能表明在一个不断变化的世界里“高级”意味着什么的人身上,我看到了他们的一些共同特征。表明上看来,高级软件工程师似乎类似于“10x编码者”,给人的印象是这帮人总是坐在计算机旁,全力冲刺打磨磨出一个完整的产品。
实际上,我认识的很多大学学生都很聪明,但是缺乏沟通能力与接受批评的能力,这些会严重阻碍他们的机会。受雇于顶级公司或者刚毕业就拿到高级职位的学生肯定手艺已经很娴熟了,但真正能让他们与众不同的,是他们与他人合作的能力。
这种趋势在走出象牙塔之后只会有增无减。能够处理各种工单开发各种功能,但是一直都独来独往的软件工程师很少能够获得提拔。而那些学会分享知识,让整个团队都共同进步的人会被放到领导岗位。这里面没有运气的因素,软件工程当中有着非常具体和实在的技能是可让你去领导和提升他人的,而这就是成为高级的全部意义所在。
在生活当中当领导最基本的一个方面就是控制。在《极限控制》(Extreme Ownership)这本书里,已退休的海豹突击队军官Jocko Willink详细介绍了自己在美国海军海豹突击队20多年学到的经验教训。在书中, Jocko用一个个故事说明了领导者是团队或公司能否取得成功的终极要素。
“《极限控制》的核心是这条最根本、最重要的事实:没有糟糕的团队,只有糟糕的领导。” —Jocko Willink
践行极限控制的例行做法包括:不管团队能不能取得成功,责任都要自己扛。这是一个激进的范式转换,这既是一种免除,也是一种束缚,因为当你践行极限控制的时候,把责任推给别人就不是你的选项。
如果一名初级工程师没达到工单的验收标准,那是因为你作为领导没有花时间去解释清楚并确保对方理解清楚。
如果你的某位团队成员很难联系上,那是因为你没说清楚对方什么时候该找得到,沟通的频率应该怎样。
如果有漏洞的代码一路杀到了生产环境,那是因为你没有适当地花些时间去评估一下代码审查。
成为高级软件工程师就是要专注于你可以控制的事情,并利用这种能力把其他的人提升到更高的水平。
是的,接下来要讲的就是任何一篇文章都会告诉你如何做职业当中变得擅长的,被讲到滥的一个技能点了。不过,如果到处都提到这一点的话,那么为什么不经常去尝试一下对此加以改进呢?随着企业逐步朝着完全的远程办公转移,技术领域正在发生着根本性的变化。磨练沟通技巧以成为高级工程师的重要性现在比以往任何时候都要高。
改善沟通技巧的第一步是要让自己的写作清晰明了。通过文字把自己的想法清晰明了地表述给他人的困难性质高也许会出乎你的意料,尤其是在工程环境下。你可以通过类似Slack这样的渠道积极地磨练自己的沟通技巧,不过发出消息之后记得补一句“这么说你明白吗?”或者,“有没有更好的措辞方式?”。你的团队成员应该会很乐意提供反馈,因为这可以让每个人的生活都变得更轻松。
改善沟通的另一个技巧是过度沟通。你显然不想给自己的同事发垃圾邮件,但是相对于漏掉细节,你永远都应该不要害怕解释得太多。这里是一个例子:
早上好,那个问题我已经解决了,就是那个不知道为什么项目A的一个测试总是通不过的问题。我在方法里面添加了错误返回类型,这样我们调试起来就可以更轻松了,然后我们发现我们没有生成足够多的通道来等待go例程通过。如果你有什么建议的话,这是我的merge request的链接。
没人,我的意思是没有一个人愿意跟像Gilfoyle(编者注:美剧《硅谷》里面的角色,)这样的人一起工作。可以自己解决任何问题的10倍编码者这个观点完全是被高估了。这样的工程师离开公司之后,当其他的工程师试图想出“不需要任何测试”的代码时,公司很可能会出现巨大的知识鸿沟。
相反,好的领导总是能够谦虚地向他人学习。如果一位团队成员告诉你,有一个新的测试框架可以做你喜欢的那个自定义的测试所能做的所有事情,但是更加标准化,可重用的话,请不要为你的代码辩护,而是要感谢你的团队成员为了让团队变得更好所提供的建议。这关乎的不是你的代码,而是团队的代码。
说真的,如果你找到可以改善同事代码的方法,请在代码审查里面发表你的意见!光是抱怨没有任何好处。如果你想成为一名高级工程师,请让你的团队成员觉得自己是在学习,而不是觉得自己很蠢。
听说过“代码应该自我注释”这句话吗?这话不完全都是错的,但是离正确还差得远。你应该始终都要尝试写出干净、简洁的代码,但有时你仍需要留出注释。你还需要说明一下怎么使用新的API。而且,如果你的新产品并没有任何的架构方面的文档的话,当需求变更是看看你还能走多远吧。
有很多办法可以提高文档的编制技能,尤其是如果你正在用Jira之类的软件进行工单跟踪或用Confluence来画程序流程图的话。去看看自己所在团队里面的高级工程师是怎么对自己的体系结构写说明文档的,这样你就学习到最佳实践。
此外,如果要想创建出定义得更好的工单的线H(谁,什么,为什么,什么时候,如何)等等。你应该先问自己,然后在工单文档里面回答的常见问题包括,为什么我们需要进行这一变更?这些变更会在哪些项目中进行?进行该变更的高级技术步骤有哪些?
画出更好的流程图的好处也非常大。作为一条快捷提示,你可以按照从左到右的顺序画流程图并且根据逻辑进行路径分离。跟使用决策符号相比,这种图看起来会容易得多,而决策符号因为没有明显的路径会造成很大的逻辑混乱。
显而易见,如果你想要成为一名高级软件工程师,你必须了解所在领域的知识。高级软件工程师未必就得是编码魔术师,但是他们需要具备全面的技能。如果你想成为高级工程师,以下是一些需要学习的技术要点:
测试—幸运的是,这已经成为标准了。实际上,如果你在求职面试的时候发现对方公司却不做测试的话,那你应该把这看作是一个危险信号。测试可以让你编写出行为符合预期的代码,测试属于自我注释,并且让你可以扩展代码而不必担心会搞砸某些东西。
设计模式—这是我个人的最爱。设计模式提供了一种基础结构,可以用来应对满足业务需求的特定行为。你是不是要开发一个社交媒体平台?那观察者模式也许是个好的开始。想要创建一个防错的用户界面吗?那就用有限状态机试试看。我撰写了很多关于Go语言设计模式的文章,设计模式可以说是让你成为更有能力的软件工程师的一种直截了当的办法。
框架—如果你要写的代码执行的任务似乎是很常见的话,那么很可能会有一个相应的框架去做这件事。重要的是,高级工程师必须了解最新的框架,以了解是不是有任何的框架正在被弃用掉,或者是不是有比你正在使用的框架更好的解决方案。
这篇文章是从较高的层面去讨论的,但是这些原则的细节并不重要,因为细节总是在不断地变化。成为一名高级软件工程师需要的东西太多了,但归根结底,其实这要取决于你的自我学习,承担责任并始终专注于改进团队的能力。我合作过的那些最好的程序员总是很乐于分享知识,并会让我变得更好,从而让自己和整个团队在这过程中都变得更好。