到底怎样算一个“资深”软件开发者

翻译 2018-11-01

说明:这是英文Blog What truly makes a senior developer的翻译。原文需翻墙。


我在自己的软件生涯中注意到一件事:较长的工作时间并不必然使一个软件开发者表现优秀。

这里我将谈谈自己关于资深开发者和工程师的观察,以及“资深”的真正含义,毕竟年龄只是一个数字而已。

究竟如何测量呢?

既然提出“初级”、“中级”、“资深”工程师的概念,就意味着必然存在某种方式来测量。我们常常假想存在一种单一的度量标准,但实际并不存在。不同的组织、领域需要非常不同的技能。在一个初创企业工作的资深工程师所需要的技能与在大公司中是不一样的。

任何关于“资深”的讨论需要考虑四种技能:

  • 独自编程的能力;
  • 指导和培养其他程序员的能力;
  • 在组织中处理社会和(办公室)政治问题的能力;
  • 将技术解决方案与业务需求匹配的能力;

在不同环境下,这四类技能的相对重要程度可以有非常大的不同。一般来说在小公司或创业企业中,独自编程以及指导和培养其他程序员的能力比处理办公室政治的能力要重要得多。这当然不是说在初创企业中没有这些问题,但是与那些在大型组织中、与来自不同建筑、不同部门、有着不同目标和KPI的团队成员共同工作的开发者所面临的处境相比,(初创企业中)这些问题都被大大压缩了。

类似的,对于大公司中的资深开发者来说,处理政治和社会问题的能力远比他们的技术能力更加重要,因为他们会更经常需要捍卫技术决策,使其不受到非技术人员的干扰。

理想来说,资深开发者应该在这四个方面都很“强”。但更关键的是,他们的技能与团队、公司以及它们的需求相适应的程度。

技术

软件是非常技术性的领域,所以显然技术不能是资深工程师的弱项。要达到“资深”的级别,应该是一个所谓的“专业的多面手”。资深工程师应该从事开发工作足够长的时间,以致经历过各种各样的状况。由此,他很可能已深入了解某个特定领域或行业的问题。这实在是非常重要的。相对于到处蜻蜓点水般了解一些表面知识,深入钻研和真正理解某个特定问题域有助于开发者转移到其他领域中去工作。

为什么他们需要这样深入的知识?因为这能形成这样的洞察力,即预估到在开发阶段早期做出的决策在将来会有怎样的代价。他们需要知道“坑”在哪里。深入地花上足够的时间,能够使他们形成提前十步发现问题的直觉。这样的洞察力令人惊奇地可转移到其它专业领域。至少,他们可以认识到自己 不知道 隐藏的危险在哪里,从而能小心从事。

这样的直觉不仅意味着写代码更快,更是一种秘密武器。因为由资深程序员做出的好的选择意味着问题不会发生。没有英雄事迹,因为永远不会有大问题要拯救。(译者注:故善战者之胜也,无智名,无勇功)

他们选择那些愿意(暂时)与之共处的问题。

这是真正的秘密。所有的问题都没有神奇的解决方案。每一种架构、每一个选择、每一种可能性都有自己的缺点和风险。特别是当产品随着时间扩展和演化的时候。你今天选择快速交付以便在市场上打击竞争对手,那么在6个月内,而不是6年内,就会需要一次重大的重构。但是如果这意味着能够赢得市场份额和销售额,那么可能值得怎么做。

这是关键的技能。要真正成为“资深”,你需要做出艰难的选择,并且做对它。无论何时你选择了一个解决方案,也就同时选择了随之而来的的问题和风险。在大规模和持续进行的开发项目中,不存在一劳永逸的解决方案。客户总是“贪得无厌”,而你总是被要求必须交付(客户要求的东西)。

资深开发者应该经验过多种设计范例、多种语言、多个团队。深入了解每一种可能的设计与架构模式几乎是不可能的,特别当事情总在不断变化时。但是对于不同方法的优缺点有良好的认识和理解是非常可能的。

我的技术等级

我根据这些规则来定义技术的“初级/中级/资深”级别:

初级开发者只了解教程或学校里教授的解决问题的一种方法。这种方法基本上一定使用某种流行的框架。

中级开发者认识到任何问题都是大系统中的一部分,并开始考虑可维护性、代码质量等,但依然不能看到整个森林。他们会被流程问题所困扰,比如“你是否正确得敏捷了?”

资深开发者认识到没有什么东西是不存在副作用和风险的。他们的选择不是基于“酷的”,或者书本上说的“正确”来做出的,而是基于整个团队的风险管理进行决策。他们不关心什么是流行的,他们只关心什么能便于维护、便于教学和便于抓bug。

换句话说,很多初级开发者只关心现在如何快速前进,而资深开发者更关心如何保证每一步不会在今后坑了自己。

一点逆向思维

与其他人不同,我认为一个资深开发者在技术方面过于固执不是一个好迹象。如果他们认为某种主要语言是“垃圾”,或者为太多此类事情生气(这不是好迹象)。事实是团队可能被要求与使用该语言开发的某个主要产品对接,或者该语言有非常棒的库能完美地解决某些问题。你不可能一视同仁地喜欢所有的语言和框架,但是经验常常告诉我们事情总有背后的原因。事实上,最好要对这类事情保持“冷静”。这些只是工具而已。与其纠结工具的好坏,资深开发往往只选择对问题、对团队、对公司最合适的技术。其它的都只是噪音。

PHP是一个很好的例子。很多开发者对它又爱又恨。但他的很多缺点同时也是他能在Web开发领域占据主要位置的原因。我们不应该笑话任何人,我们应该学习和思考如何“取其精华、去其糟粕”。

最好的赌注:人性与对成长的渴望。

无论资深与否,一个工程师都要接受现实:他们不可能知道所有的最佳选择。一个人对于知识越开放,就能越快达到“资深”的程度。当我需要聘用什么人的时候,我会提问,并考察他们是否愿意坦白承认自己“不知道”,同时又有多渴望至少了解一下什么是可能的答案。



blog comments powered by Disqus