本文导航
-反思遗留代码06%
-忘却债务,创造技能财富28%

-自动测试44%
-持续交付48%
-文化提升56%
-探求最具天才的代码重构者66%
-稳定期没什么不好92%
编译自: http://firstround.com/review/forget-technical-debt-heres-how-to-build-technical-wealth/作者: firstround译者: rusking电视里正播放着《老屋》节目,Andrea Goulet[1] 和她的商业互助伙伴正清闲地坐在客厅里,商榷着他们的计策操持。那正是大家思想的火花碰撞出创新事物的时候。他们正在寻求一种能够实现自身代价的办法 —— 为其它公司清理遗留代码legacy code及科技债务。他们此刻的情景,像极了电视里的场景。(LCTT 译注:《老屋》电视节目供应专业的家装、家庭改建、重新装饰、创意等等信息,与软件的改造有异曲同工之处)。
“我们意识到我们现在做的事情不仅仅是清理遗留代码,实际上我们是在用重修老屋的办法来重构软件,让系统运行更持久、更稳定、更高效,”Goulet 说。“这让我开始思考公司如何费钱来改进他们的代码,以便让他们的系统运行更高效。就好比为了让屋子变得更有代价,你不得不该用一个全新的屋顶。这并不吸引人,但却是至关主要的,然而很多人都搞错了。“
如今,她是 Corgibytes[2] 公司的 CEO —— 这是一家提高软件当代化和进行系统重构方面的咨询公司。她曾经见过各种各样糟糕的系统、遗留代码,以及严重的科技债务事宜。Goulet 认为创业公司须要转变思维模式,不是偿还债务,而是创造科技财富,不是要革除旧代码,而是要逐步修复代码。她阐明了这种新的方法,以及如何完成这些看似不可能完成的事情 —— 实际上是聘任精良的工程师来完成这些事情。
反思遗留代码
关于遗留代码最常见的定义是由 Michael Feathers 在他的著作《高效利用遗留代码》Working Effectively with Legacy Code[3]一书中提出:遗留代码便是没有被测试所覆盖的代码。这个定义频年夜多数人以是为的 —— 遗留代码仅指那些古老、迂腐的系统这个说法要妥当得多。但是 Goulet 认为这两种定义都不足明确。“遗留代码与软件的年头儿毫无关系。一个两年的运用程序,其代码可能已经进入遗留状态了,”她说。“关键要看软件质量提高的难易程度。”
这意味着写得不足清楚、短缺阐明解释的代码,是没有包含任何关于代码构思和决策制订的流程的成果。单元测试便是这样的一种成果,但它并没有包括了写那部分代码的缘故原由以及逻辑推理干系的所有文档。如果想要提升代码,但没办法搞清楚原开拓者的意图 —— 那些代码就属于遗留代码了。
遗留代码不是技能问题,而是沟通上的问题。
如果你像 Goulet 所说的那样迷失落在遗留代码里,你会创造每一次的沟通互换过程都会变得像那条康威定律Conway’s Law[4]所描述的一样。
Goulet 说:“这个定律认为你的代码能反响出全体公司的组织沟通构造,如果想修复公司的遗留代码,而没有一个好的组织沟通办法是不可能完成的。那是很多人都没把稳到的一个主要环节。”
Goulet 和她的团队成员更像是考古学家一样来研究遗留系统项目。他们根据前开拓者写的代码构件干系的线索来推断出他们的思想意图。然后再根据这些构件之间的关系来做出新的决策。
代码构件最主要的什么呢?良好的代码构造、清晰的思想意图、整洁的代码。例如,如果利用通用的名称如 “foo” 或 “bar” 来命名一个变量,半年后再返回来看这段代码时,根本就看不出这个变量的用场是什么。
如果代码读起来很困难,可以利用源代码掌握系统,这是一个非常有用的工具,由于它可以供应代码的历史修正信息,并许可软件开拓者写明他们作出本次修正的缘故原由。
Goulet 说:“我一个朋友认为提交代码时附带的信息,每一个概要部分的内容该当有半条推文那么长(几十个字),如须要的话,代码的描述信息该当有一篇博客那么长。你得用这个办法来为你修正的代码写一个合理的解释。这不会摧残浪费蹂躏太多额外的韶光,并且能给后期的项目开拓者供应非常多的有用信息,但是让人惊异的是很少有人会这么做。我们常常能看到一些开拓职员在被一段代码激怒之后,要用 git blame
扒代码库找出这些垃圾是谁干的,结果末了创造是他们自己干的。”
利用自动化测试对付理解程序的流程非常有用。Goulet 阐明道:“很多人都比较认可 Michael Feathers 提出的关于遗留代码的定义。测试套件对付理解开拓者的意图来说是非常有用的工具,尤其当用来与行为驱动开拓模式Behavior Driven Development[5]相结合时,比如编写测试场景。”
情由很大略,如果你想将遗留代码限定在一定程度下,把稳到这些细节将使代码更易于理解,便于在往后也能事情。编写并运行一个代码单元,接管、认可,并且集成测试。写清楚注释的内容,方便往后你自己或是别人来理解你写的代码。
只管如此,由于很多已知的和不可猜想的缘故原由,遗留代码仍旧会涌现。
在创业公司刚成立初期,公司常常会急于推出很多新的功能。开拓职员在巨大的交付压力下,测试常常半途而废。Corgibytes 团队就碰着过好多公司很多年都
确实如此,当你急于开拓出系统原型的时候,逼迫性地去做太多的测试大概意义不大。但是,一旦产品开拓完成并投入利用后,你就须要投入韶光精力来掩护及完善系统了。Goulet 说:“很多人说,‘别在掩护上费心思,主要的是功能!
’ 如果真这样,当系统规模到一定程序的时候,就很难再扩展了。同时也就失落去市场竞争力了。”
末了才明白过来,原来热力学第二定律对代码也同样适用:你所面临的统统将向熵增的方向发展。你须要与混乱无序的技能债务进行一场无休无止的战斗。随着韶光的推移,遗留代码也逐渐变成一种债务。
她说:“我们再次拿家来做比喻。你必须坚持每天整顿餐具、打扫卫生、倒垃圾。如果你不这么做,情形将来越来越糟糕,直到有一天你不得不向 HazMat 团队乞助。”(LCTT 译注:HazMat 团队,危害物质专队)
就跟这种情形一样,Corgibytes 团队接到很多公司 CEO 的乞助电话,比如 Features 公司的 CEO 在电话里抱怨道:“现在我们公司的开拓团队事情效率太低了,三年前只须要两个星期就完成的事情,现在却要花费12个星期。”
技能债务每每反响出公司运作上的问题。
很多公司的 CTO 明知会发生技能债务的问题,但是他们很难说服其它同事相信费钱来修复那些已经存在的问题是值得的。这看起来像是在走转头路,很乏味,也不是新的产品。有些公司直到系统已经严重影响了日常事情效率时,才动手去处理这些技能债务方面的问题,那时付出的代价就太高了。
忘却债务,创造技能财富
如果你想把重构技能债务reframe your technical debt[6] —敏捷开拓讲师 Declan Whelan 最近造出的一个术语[7] — 作为一个积累技能财富的机会,你很可能要先说服你们公司的 CEO、投资者和其它的股东接管并为之共同努力。
“我们没必要把技能债务想像得很恐怖。当产品处于开拓设计初期,技能债务反而变得非常有用,”Goulet 说。“当你办理一些系统遗留的技能问题时,你会充满造诣感。例如,当你在自己家里安装新窗户时,你确实会花费一笔不少的钱,但是之后你每个月就可以节省 100 美元的电费。程序代码亦是如此。虽然暂时没有提高事情效率,但随时时间推移将提高生产力。”
一旦你意识到项目团队事情不再富有成效时,就须要确认下是哪些技能债务在拖后腿了。
“我跟很多不惜统统代价招募英才的初创公司互换过,他们高薪聘请一些工程师来只为了完成更多的事情。”她说。“与此相反,他们该当找出如何让原有的每个工程师能更高效率事情的方法。你须要去办理什么样的技能债务以增加额外的生产率?”
如果你改变自己的不雅观点并且专注于创造技能财富,你将会看到产能过剩的征象,然后重新把多余的产能投入到修复更多的技能债务和遗留代码的良性循环中。你们的产品将会走得更远,发展得更好。
别把你们公司的软件当作一个项目来看。从现在起,把它想象成一栋自己要长久居住的屋子。
“这是一个极其主要的思想不雅观念的转变,”Goulet 说。“这将带你走出短浅的思维模式,并让你比之前更加关注产品的掩护事情。”
这就像对一栋屋子,要实现其当代化及掩护的办法有两种:小动作,表面上的变动(“我买了一块新的小地毯!
”)和大改造,须要很多年才能偿还所有债务(“我想我们应更换掉所有的管道...”)。你必须考虑好两者,才能让你们已有的产品和全体团队顺利地运作起来。
这还须要提前预算好 —— 否则那些较大的花销将会是硬伤。定期掩护是最基本的预期用度。让人震荡的是,很多公司都没把掩护当成商务本钱预算进来。
这便是 Goulet 提出“软件重构software remodeling”这个术语的缘故原由。当你屋子里的一些东西破坏的时候,你并不是革除全体屋子,从头开始重修。同样的,当你们公司涌现老的、破坏的代码时,重写代码常日不是最明智的选择。
下面是 Corgibytes 公司在重构客户代码用到的一些方法:
把大型的运用系统分解成轻量级的更易于掩护的微做事。
让功能模块彼此解耦以便于扩展。
更新形象和提升用户前端界面体验。
凑集自动化测试来检讨代码可用性。
代码库可以让重构或者修正更易于操作。
系统重构也进入到 DevOps 领域。比如,Corgibytes 公司常常推举新客户利用 Docker[8],以便大略快速的支配新的开拓环境。当你们团队有 30 个工程师的时候,把初始化配置韶光从 10 小时减少到 10 分钟对完成更多的事情很有帮助。系统重构不仅仅是运用于软件开拓本身,也包括如何进行系统重构。
如果你知道做些什么能让你们的代码管理起来更随意马虎更高效,就该当把这它们写入到每年或季度的项目方案中。别指望它们会自动呈现出来。但是也别给自己太大的压力来立时履行它们。Goulets 看到很多公司从一开始就致力于 100% 测试覆盖率而陷入困境。
详细来说,每个公司都该当把以下三种类型的重构事情方案到项目培植中来:
自动测试
持续交付
文化提升
咱们来深入的理解下每一项内容。
自动测试
“有一位客户即将进行第二轮融资,但是他们没办法在短期内招聘到足够的人才。我们帮助他们引进了一种自动化测试框架,这让他们的团队在 3 个月的韶光内事情效率翻了一倍,”Goulets 说。“这样他们就可以在他们的投资人面前自满的说,‘我们一个精英团队完成的任务比两个普通的团队要多。’”
自动化测试从根本上来讲便是单个测试的组合,便是可以再次检讨某一行代码的单元测试。可以利用集成测试来确保系统的不同部分都正常运行。还可以利用验收性测试来考验系统的功能特性是否跟你想像的一样。当你把这些测试写成测试脚本后,你只须要大略地用鼠标点一下按钮就可以让系统自行考验了,而不用手工的去梳理并检讨每一项功能。
在产品市场尚未打开之前就来制订自动化测试机制有些言之过早。但是一旦你有一款感到满意,并且客户也很依赖的产品,就该当把这件事付诸履行了。
持续交付
这是与自动化交付干系的事情,过去是须要人工完成。目的是当系统部分修正完成时可以迅速进行支配,并且短期内得到反馈。这使公司在其它竞争对手面前有很大的上风,尤其是在客户做事行业。
“比如说你每次支配系统时环境都很繁芜。熵值无法有效掌握,”Goulets 说。“我们曾经见过花 12 个小时乃至更多的韶光来支配一个很大的集议论况。在这种情形下,你不会乐意频繁支配了。由于太折腾人了,你还会推迟系统功能上线的韶光。这样,你将掉队于其它公司并失落去竞争力。”
在持续性改进的过程中常见的其它自动化任务包括:
在提交完成之后检讨构建中断部分。
在涌现故障时进行回滚操作。
自动化审查代码的质量。
根据需求增加或减少做事器硬件资源。
让开发、测试及生产环境配置大略易懂。
举一个大略的例子,比如说一个客户提交了一个别系 Bug 报告。开拓团队越高效办理并修复那个 Bug 越好。对付开拓职员来说,修复 Bug 的寻衅根本不是个事儿,这本来也是他们的强项,紧张是系统设置上不足完善导致他们摧残浪费蹂躏太多的韶光去处理 bug 以外的其它问题。
利用持续改进的办法时,你要严明地决定决定哪些事情该当让机器去做,哪些交给研发去完成更好。如果机器更善于,那就使其自动化完成。这样也能让研发愉快地去办理其它有寻衅性的问题。同时客户也会很高兴地看到他们报怨的问题被快速处理了。你的待修复的未完成任务数减少了,之后你就可以把更多的韶光投入到利用新的方法来提高产品的质量上了。这是创造科技财富的一种转变。由于开拓职员可以修复 bug 后立即发布新代码,这样他们就有韶光和精力做更多事。
“你必须时候问自己,‘我该当如何为我们的客户改进产品功能?如何做得更好?如何让产品运行更高效?’不过还要不止于此。”Goulets 说。“一旦你回答完这些问题后,你就得讯问下自己,如何自动去完成那些须要改进的功能。”
文化提升
Corgibytes 公司每天都会看到同样的问题:一家创业公司建立了一个对开拓团队毫无推动的文化环境。公司 CEO 抱着双臂思考着为什么这样的环境对员工没多少改变。然而事实却是公司的企业文化对事情并不利。为了勉励工程师,你必须全面地理解他们的事情环境。
为了证明这一点,Goulet 引用了作者 Robert Henry 说过的一段话:
目的不是创造艺术,而是在最美妙的状态下让艺术应运而生。
“你们也要开始这样思考一下你们的软件,”她说。“你们的企业文件就类似那个状态。你们的目标便是创造一个让艺术品应运而生的环境,这件艺术品便是你们公司的代码、一流的售后做事、充满幸福感的开拓者、良好的市场预期、盈利能力等等。这些都息息相关。”
优先考虑办理公司的技能债务和遗留代码也是一种文化。那是真正为开拓团队打消障碍,以制造影响的方法。同时,这也会让你将来有更多的韶光精力去完成更主要的事情。如果你不从根本上改变固有的企业文化环境,你就不可能重构公司产品。改变对产品掩护及当代化的投资的态度是开始履行变革的第一步,最空想情形是从公司的 CEO 开始自顶向下转变。
以下是 Goulet 关于建立那种流态文化方面提出的建议:
反对公司奖励那些加班到深夜的“英雄”。提倡高效率的事情办法。
理解协同开拓技能,比如 Woody Zuill 提出的互助编程Mob Programming[9]模式。
屈服 4 个当代敏捷开拓[10]原则:用户至上、实践及快速学习、把安全放在首位、持续交付代价。
每周为研发职员供应项目外的职业发展韶光。
把日事情记录[11]作为一种驱动开拓团队主动办理问题的办法。
把同情心放在第一位。Corgibytes 公司让员工参加 Brene Brown 勇气工厂[12]的培训是非常有用的。
“如果公司高管和投资者不支持这种升级办法,你得从客户做事的角度去说服他们,”Goulet 说,“见告他们通过这次调度后,终极产品将如何给公司的大多数客户提高更好的体验。这是你能做的一个很有力的论点。”
探求最具天才的代码重构者
全体行业都认为顶尖的工程师不愿意干修复遗留代码的事情。他们只想着去开拓新的东西。大家都说把他们留在掩护部门真是太摧残浪费蹂躏人才了。
实在这些都是误解。如果你知道去哪里和如何找工程师,并为他们供应一个愉快的事情环境,你就可以找到技能非常博识的工程师,来帮你办理那些最棘手的技能债务问题。
“每次在会议上,我们都会问现场的同事‘谁喜好去在遗留代码上事情?’每次只有不到 10% 的与会者会举手。”Goulet 说。“但是我跟这些人互换后,我创造这些工程师恰好是喜好最具寻衅性事情的人才。”
有一位客户来寻求她的帮助,他们利用国产的数据库,没有任何干系文档,也没有一种有效的方法来弄清楚他们公司的产品架构。她称修理这种情形的一类工程师为“改动者”。在 Corgibytes 公司,她有一支这样的改动者团队由她支配,热衷于通过研究二进制代码来办理技能问题。
那么,如何才能找到这些技能人才呢? Goulet 考试测验过各种各样的方法,个中有一些方法还是富有成效的。
她创办了一个社区网站 legacycode.rocks[13] 并且在招聘启迪上写道:“长期招聘那些喜好重构遗留代码的另类开拓职员...如果你以从事处理遗留代码的事情为自满,欢迎加入!
”
“我开始收到很多人发来邮件说,‘噢,天呐,我也属于这样的开拓职员!
’”她说。“只须要发布这条信息,并且见告他们这份事情是非常故意义的,就吸引了得当的人才。”
在招聘的过程中,她也会利用持续性交付的履历来回答那些另类开拓者想知道的信息:包括详细的事情内容以及明确的哀求。“我这么做的缘故原由是由于我讨厌重复性事情。如果我收到多封邮件来咨询同一个问题,我会把答案发布在网上,我觉得自己更像是在写解释文档一样。”
但是随着韶光的推移,她创造可以重新定义招聘流程来帮助她识别出更出色的候选人。比如说,她在应聘任求中写道,“公司 CEO 将会重新审查你的简历,因此请确保求职信中存问时不用写明性别。所有以‘尊敬的师长西席’或‘师长西席’开头的信件将会被当垃圾处理掉”。这些只是她的招聘初期策略。
“我开始这么做是由于很多申请人把我当成男性,由于我是一家软件公司的男性 CEO,我必须是男性!
?”Goulet 说。“以是,有一天我想我该当它当作应聘任求放到网上,看有多少人把稳到这个问题。令我惊异的是,这让我过滤掉一些不太严谨的申请人。还突显出了很多擅于从事遗留代码方面事情的人。”
Goulet 想起一个应聘者发邮件给我说,“我查看了你们网站的代码(我喜好这个网站,这也是我的事情)。你们的网站架构很奇特,彷佛是用 PHP 写的,但是你们却运行在用 Ruby 措辞写的 Jekyll 下。我真的很好奇那是什么呢。”
Goulet 从她的设计师那里得知,原来,在 HTML、CSS 和 JavaScript 文件中有一个未利用的 PHP 类名,她一贯想办理这个问题,但是一贯没机会。Goulet 的回答是:“你正在找事情吗?”
其余一名候选人把稳到她曾经在一篇解释文档中利用 CTO 这个词,但是她的团队里并没有这个头衔(她的互助伙伴是 Chief Code Whisperer)。这些看重细节、充满求知欲、积极主动的候选者更能引起她的把稳。
代码改动者不仅须要看重细节,而且这也是他们必备的品质。
让人吃惊的是,Goulet 从来没有为招募最精良的代码改动者而感到厌烦过。“大多数人都是通过我们的网站直接投递简历,但是当我们想扩大招聘范围的时候,我们会通过 PowerToFly[14] 和WeWorkRemotely[15] 网站进行招聘。我现在确实不须要招募新人马了。他们须要经历一段很困难的期间才能理解代码改动者的意义是什么。”
如果他们通过首轮口试,Goulet 将会让候选者阅读一篇 Arlo Belshee 写的文章“命名是一个过程Naming is a Process[16]”。它讲的是非常详细的处理遗留代码的的过程。她最经典的辅导方法是:“阅读完这段代码并且见告我,你是怎么理解的。”
她将找出对问题的理解很深刻并且也乐意接管文章里提出的不雅观点的候选者。这对付区分有深刻理解的候选者和仅仅想得到事情的候选者来说,是极其有用的办法。她强烈哀求候选者找出一段与他操作干系的代码,来证明他是充满激情的、有主见的及长于剖析问题的人。
末了,她会让候选者跟公司里当前的团队成员一起利用 Exercism.io[17] 工具进行编程。这是一个开源项目,它许可开拓者学习如何在不同的编程措辞环境下利用一系列的测试驱动开拓的练习进行编程。结对编程课程的第一部分许可候选者选择个中一种措辞来利用。下一个练习中,口试官可以选择一种措辞进行编程。他们总能看到那些人处理非常的方法、随机应便的能力以及是否乐意承认某些自己不理解的技能。
“当一个人真正的从执业者转变为大师的时候,他会绝不犹豫的承认自己不知道的东西,”Goulet说。
让他们利用自己不熟习的编程措辞来写代码,也能衡量其保持不懈的毅力。“我们想听到某个人说,‘我会深入研究这个问题直到彻底办理它。’大概第二天他们仍旧会跑过来跟我们说,‘我会一贯留着这个问题直到我找到答案为止。’那是作为一个成功的改动者表现出来的一种气质。”
产品开拓职员在我们这个行业很受追捧,因此很多公司也想让他们来做掩护事情。这是一个误解。最精良的掩护改动者并不是最好的产品开拓工程师。
如果一个有天赋的改动者在面前,Goulet 懂得如何让他走向成功。下面是如何让这种类型的开拓者感到幸福及高效事情的一些办法:
给他们高度的自主权。把问题阐明清楚,然后安排他们去完成,但是永不命令他们该当如何去办理问题。
如果他们哀求升级他们的电脑配置和干系工具,只管去知足他们。他们明白什么样的需求才能最大限度地提高事情效率。
帮助他们避免分心[18]。他们喜好全身心投入到某一个任务直至完成。
总之,这些方法已经帮助 Corgibytes 公司培养出二十几位对遗留代码充满激情的专业开拓者。
稳定期没什么不好
大多数创业公司都都不想跳过他们的成长期。一些公司乃至认为成长期该当是永无止境的。而且,他们以为也没这个必要跳过成长期,即便他们已经进入到了下一个阶段:稳定期。完备进入到稳定期意味着你拥有人力资源及管理方法来创造技能财富,同时根据优先权适当支出。
“在成长期和稳定期之间有个迁移转变点,便是掩护职员必须要足够壮大,并且相对付专注新功能的产品开拓职员,你开始更公正的对待掩护职员,”Goulet 说。“你们公司的产品开拓完成了。现在你得让他们更加稳定地运行。”
这就意味着要把公司更多的预算分配到产品掩护及当代化方面。“你不应该把产品掩护当作是一个不值得关注的项目,”她说。“这必须成为你们公司固有的一种企业文化 —— 这将帮助你们公司将来取得更大的成功。“
终极,你通过这些努力创建的技能财富,将会为你的团队带来一大批全新的开拓者:他们就像侦查兵一样,有充足的韶光和资源去探索新的领域,挖掘新客户资源并且给公司创造更多的机遇。当你们在新的市场领域做得更广泛并且不断取得进展 —— 那么你们公司已经真正地进入到繁荣发展的状态了。
本文由 LCTT[19] 原创编译,Linux中国名誉推出
推举文章