审校 | 重楼
极客程序员具备的编程技术就像多功能的工具,但是每种技术都是用语言表达的模式集合,而且大多数都不是新的模式。如果人们理解了这些模式,就可以很容易地理解体现它们的任何编程技术。
行业专家指出,擅长编程并不是优秀开发人员的标志。例如一名才华横溢的开发人员在工作时间付出全力创建清晰、准确、可维护的代码,在午餐时谈论工作以外的事情,然后按时下班享受从键盘释放出来的生活,这有什么错呢?
以下是专家认为优秀程序人员必须具备的五种关键能力。而要了解为什么这些能力很重要,需要思考软件是什么:软件不是无穷无尽的一系列语句,也不是对API的任意调用的集合,更不只是代码的剪切和粘贴。与其相反,它是一个高度结构化的代码层次结构网络,几乎不采用复制的代码(不一定是GOF模式,而是像“延迟初始化”、“模型驱动的代码生成”或“XML脚本”这样的模式)。软件只有在满足业务需求并且质量足够好的情况下才有用。因此,需要对开发人员具有的能够实现这些目标的能力进行评估。
1.分析:条理清晰,善于思考,善于解决问题的能力
如今,很多人将沉着、自信或快速连续的陈述误认为是智力,其实这是一种特征,因此人们需要非常了解开发人员的智力特征。
软件是关于功能和结构的分解,所以智力的关键方面是天生的、后天的或意志力的分析能力。善于分析的人会从多个角度考虑问题,并选择总体中最好的方法,然后能够将一个问题分解成多个子问题。
在面试求职者的过程中,就可以很容易地发现这种能力,因为求职者会很自然地试图澄清模棱两可的问题,或列出一个解决方案的组成部分和关系,或列出一个问题的“头部和尾部”,在详细讨论之前确定它的范围。
为了检测这种能力,不需要向他们提出一个新问题,只需要让他们描述做过的任何事情:例如开发的软件、面向对象、软件开发的角色或过程、互联网等,或者是真实或理想的城市的布局、民主的本质、进化的定义和操作等等。
当完成描述后,面试者考虑一下是否听到列举了这些片段,或者求职者是否描述了问题的核心。这就是他们采用的分析能力。
2.抽象:能够识别和理解抽象和模式的能力
软件是复杂的,人们通常无法通过阅读每一行代码来理解它。可以通过寻找结构、构建关于代码如何建模的理论,然后在阅读时验证和更改该模型来理解它。
开发新软件很像理解一个现有的应用程序,除了模型还不存在,只有软件的“理论”在脑海中。而开发的程序可以用代码模型来表达理论。
如果从抽象的角度考虑,编写功能或技术规范与编码并没有什么不同,只不过采用的是人类的语言,解释器表达了某人或其他人的思想。规范是抽象的,因为没有程序可以运行它,但如果它是准确的、完整的、清晰的和结构良好的(在代码中寻求的所有品质),那么开发人员就可以实现它。
3.精确:简明扼要地表达事物的能力
有些开发者通过复制例子获得了一定程度的成功。他们通常寻找一些接近想要实现的现有例子,然后对其进行调整。这就像雕刻一样,除非是用代码完成的时候,其结果通常不是很清楚,不是很简洁,而且可能并不完全准确。
类似地,一些开发人员只能通过示例来解释,而不能通过命名底层概念或模式来解释。这是可以接受的,但这也是一个绊脚石,因为他们不太可能在代码的微观或宏观级别上识别、理解和应用模式。
而语言精确(但不一定快速或令人印象深刻)的开发人员将会开发出更精确的代码,并更容易向其他开发人员解释其技术或需求。
4.优先和务实:识别必须做什么和可以做什么的能力
敏捷方法自然倾向能够尽快编写代码。即使在采用瀑布式开发的开发公司中,能够区分必要性和可能性仍然是一项至关重要的技能。
软件产品通常只有在按时交付的情况下才能完全成功。务实的开发人员做需要做的事情,创建一些钩子并编写为未来奠定基础的注释。
务实主义还表现为对实现、完整和完成的渴望。这驱使并鼓励人们去定义什么是成功,帮助优先考虑实现成功的方法,专注于完成任务而不是表面功夫。
5.理想主义:渴望做正确的事情
注重实效的开发人员有时会变得懒惰,他们通常只开发当前所需的功能,而且只为这些功能编写代码,而不是为未来必须维护这些代码的开发人员编写代码。
理想主义的开发者实际上关心他们所交付的产品的所有品质:
- 他们确保了解需求。
- 他们在编写代码之前考虑甚至记录测试用例。
- 他们编写的代码清晰且注释充分;不断地对这些代码进行重构,以便将公共代码移到共享方法中,然后移到基类或辅助类中。
- 他们编写单元测试用例,以保护其他开发人员和测试人员免受错误的影响。
- 当自动化测试不切实际时,他们总是进行人工测试。
理想主义和务实主义是必要的对应物,可以平衡和指导开发者的决策。
其他能力
当然,开发人员还需要具备其他能力:
- 专注:编写软件是一项复杂的任务,需要将思维模型转化为代码。
- 理解和使用技术的能力。
- 渴望学习和提高他们作为个人和软件交付组织的一部分所需的所有能力。
- 认识到自己的能力通常是毫无意义的,除非他们与团队中的其他角色相配合。
结论
最后一个能力是人们都需要的——认识到没有唯一具有价值的技能或能力。对于任何组织来说,成功有多种方式,需要扮演多种角色,个人的工作只是工作过程的一部分,所有这些都需要努力才能获得成功。
聪明的人有时会忽视其他类型的能力,人们需要相互尊重,并开诚布公地提出自己的观点,即使自己认为正在纠正错误,也会惊讶地发现经常会将观点和态度混为一谈。
然而,开发人员如果具备上述能力就会做得很好。然后,他们就能很好地推进自己的职业生涯,或者在技术轨道上一路前行,先成为高级开发人员,然后是开发负责人,最后成为架构师。或者也可以走上管理轨道,而诚信正直,尊重他人,以及激励和帮助他人实现目标的愿望则是他们在管理轨道上具备的更关键的能力。
原文5 Software Developer Competencies: How To Recognize a Good Programmer,作者:Mohamed Aboelez