作者|Houssam Fakih、Boris Gonnot
软件开发者使用编码套路学习新的软件开发技能确实有效。但当工作面对燃眉之急时,例如要达成最后期限、赶上发布日期、在遗留代码中解决故障等却往往力不从心。本文给出了成为一名好的开发者所应具备的技能,重点强调了转变训练方法的重要性,这些训练方法可完善我们在高强度和具有挑战性环境中工作的技能。
本文要点:
-
仅领会为何使用编码套路(kata)是远远不够的。
-
学会成为开发达人所必需具备的四项重要技能。
-
为改进技能,需要在训练项目中增加强度。
-
去发现对训练项目有用的工具。
-
将度量用做把握自身技能水平的工具。
哪些技能对开发者是重要的?就此问题,不同的开发者会给出不同的回答。但是也不能将此问题理解成只涉及纯技术范围内的技能,否则也会令人失望的。好的技能知识的确非常有用,然而这并非问题的全部。一些开发者较多地侧重于技术技能,还有一些开发者将十分关注敏捷技能,诸如此类。这取决于如何理解软件开发者这个职位的目的所在。请试着回答一下下列问题:
-
我为什么做一个软件开发者?
-
我为什么要开发这个产品?
-
我为什么要去学习新的语言或架构?
-
我的产品的价值或影响力是什么?
如果对上述问题的解答中并未提及最终用户及他们的需求,这就意味考虑上有所欠缺了。
作为一名好的开发者,
第一项技能是时刻考虑着最终用户。
你应确保知道最终用户的问题所在,了解最终用户的需求,然后再去开发那些可以解决最终用户的问题并满足他们需求的产品。软件开发就是这么回事。
第二项技能涉及所交付产品的质量。
无缺陷交付是一种技能。显然,这很难达成,但并非是完全不可能的。我们很喜欢Ed Weissman在推文中所说的(如截图所示)。该技能应该可以一贯坚持,即在任何情况下都能够交付无缺陷特性的功能。显然这也意味着现有的功能没有被破坏。
第三项技能考虑的是对简易性的追求,不畏惧内在的和意外的复杂性。
该技能与做分解和抽象的能力相关,即如何将复杂的系统和问题分解为小部分,使这些小部分形成反差以实现相互间的独立,并将它们组织起来,使得它们能在适当的抽象层级中被理解。在上述步骤中,必须要保持对正确抽象的关注,忽视掉那些没有必要的细节。这里我们推荐John Maeda所著的《简单法则》一书,该书真的是灵感之源。
第四项技能是关于如何将所有前面的技能合在一起,进而无需对任何事情(尤其是质量)做妥协就做到改进开发的速度。
你的目标并非是不考虑前三项技能就空谈速度。你所寻求的也不仅是快速开发的效果,而且是高质量的和积极的快速开发效果。技能方法中最重要的一点是同时包容质量和强度。
为了实现恢复、更新和再生,身体需要得到休息,而休息问题常常得不到开发者的优先考虑。我们中的很多人以熬夜工作为荣,甚至那些更加有天赋和经验的人也不外乎如此。你可以去读一下Emily Beers撰写的探讨运动员和休息问题的文章,并认真考虑一下休息问题。
我们认为把这篇文章中的「运动员」替换为「开发者」也成立。在心理学领域,使用了「后视偏差」(Retrospective bias)这一术语解释为什么人们的记忆总是会和过去实际发生的事情不同,并且常常是将实际的事情罗曼蒂克化。
该术语可用于解释为什么在我们熬夜之后,会忘记缺少效率以及其它的负面后果。牢记你的身体需要得到一些休息,很多时候躺下来休息会有助于自身的进步,睡眠也具有同样的功效。在解决生产率问题和高质量完成工作时,必须要做到好的睡眠(至少每晚睡眠八小时)和良好的休息。
在上述技能之外,我们想再强调两个价值观,就是不责备但是不怜悯,以及兼容并包。
“不责备”指在每次发现了程序错误和缺陷时,你应该停止对当事人的寻找。为避免松懈情绪的产生,在做到“不责备”的同时也应该总是“不怜悯”。团队不应该去责备某人,而应力图去理解产生软件缺陷后面的深层原因、团队实践中存在着什么样的问题以及如何去避免这样的缺陷再度发生。
我们从“SoCraTes开发空间非会议”中理解了兼容并包的价值所在。作为首次参与这种非会议的人而言,我们并未感觉到自己就像个陌生人。每个与会的人都笑脸相迎,甚至是那些我们以前从来没有打过交道的人。与其他首次参与者一样,我们能迅速感到自身完全成为了社区的一部分。这是一种很棒的感觉。
下面将这些价值观用到新同事的身上。注意应尽快让新同事集成到团队中,帮助他们建立工作空间,尽快去与他们结对。做这些事情的目标在于使新同事在首日工作中不会感到自己就像是个陌生人。该方法不仅适用于在员工管理的角度意义上所说的入职,而且适用于在技术和工作开展角度意义上所说的入职。这意味着团队应该建立一个入职的环境,允许新员工从第一天就开始参与到工作的讨论和决策中。
同样的价值观也应该应用到与其他利益相关者的交流中。但是不要遗忘掉自身项目相关的本地技能。例如我们的企业就使用了一种自制的架构,如果一名新员工在团队中表现良好,这就意味着他已经掌握了这个架构。
工作态度的重要性在于它对工作所产生深远的影响。如果你有机会参与到一个高积极性、高士气的团队中,你将很有可能会与同事愉快共处,提出好的想法、做出最好的工作。
上文中所定义的技能的范围是非常广泛的。还有很多技能需要从敏捷方法论、XP实践、软件工匠社区以及许多可能并非与软件开发直接相关但是具有影响的事务中学习到。例如,团队可将“呜嘎嘎建筑师”(Ugg-Tect)这样的严肃游戏作为一种趣味实践。
在下面一节中,我们将侧重于训练的技术方面。更确切地说,我们将审视如何使用编程套路的,以及如何做到让训练更贴近于真实的生活。
当前在教练传授和开发者学习软件开发基础(整洁代码、TDD等)时,编程套路是最为广泛使用的技术训练内容。编程套路对于软件开发基础而言存在价值,但在面对挑战性的情景时却很少够用,例如紧迫情景(例如达成最后期限、发布日期等),或是关键情景(例如在没有测试或仅是做了遗留测试的情况下,修正大型遗留代码库中的软件问题)。
不幸的是,很多开发者在面对激烈挑战时的第一反应是努力去尽快完成。但是在没有做好准备情况下就增加开发的速度,这将对工作的质量产生消极的影响。一些开发者将他们的开发工作看作是一种艺术而非绩效问题。实际上软件开发两者皆是。当在训练中增添强度之后,你就能适应挑战的出现,并将克服挑战去交付高质量的解决方案。
下面让我们看一下看如何才能做到。
学习一项新技能有三个阶段:
-
学习基础知识,
-
协调性,
-
强度。
一定要确认在迈入到下一阶段前,已达成了本阶段的目标。
下面以重构问题为例去实施我们的训练计划。
第一步,你首先应该知道重构问题的含义。什么是代码味道?如何使用重构编目清除代码味道?
Martin Fowler所著的《重构:改善既有代码的设计》一书是了解重构的必读书目。另一个值得关注的阅读内容是Uncle Bob的文章“转换优先级的前提”。还可在软件匠艺社区中找到一些值得关注的文章。对于重构的基本规则和重构三法则,Adrian Bolboaca提供了一些好文章。
一定要掌握你所使用IDE的重构编目,并学会使用IDE提供的快捷方式,这可节省时间和大脑的处理工作,还有助于避免程序错误。本阶段的目标并非在于开发速度,而是去学会如何正确地重构,学会有助于高效重构的工具。为做到这一点,在本阶段中你应该可以识别出代码味道,使用重构编目去清除这些味道,并掌握你所使用的IDE。在训练中可以使用编程套路。在Emily Bach所著的《Coding Dojo Handbook》一书中,总结了一些有意思的编程套路,例如Gilded Rose、Yahtzee和Racing Car。
应谨记重构是一种在维持应用行为的同时,通过完成小规模的“自动”转化而改进代码和架构的过程。在重构的训练项目中,应始终将全局情况牢记于心。