“我开始收到各式各样的邮件,人们都表示‘天呐!我也是这样!’。”她说,“我开始去传播这条信息,告诉大家重新建构遗留代码这件事其实非常有价值,凭此来吸引合适的人。”                          —— Andrea Goulet

编者注:Andrea Goulet是Corgibytes的首席执行官,她的公司专注于处理、改进并精简企业现有的代码库。

Andrea Goulet和她的商业合作伙伴坐在起居室里,随意地聊着她们的战略计划方案。她们一直在试图寻找一种方式来传递自己的价值主张——为其他公司清除遗留代码和技术债务。

“我们意识到我们所做的事情已经不再仅限于清除旧代码了,实际上我们是在像整修房子一般重新修改软件,目的是让它存活更长时间、使其运营更加流畅并且处理更多的信息。”Goulet这样说道,“这让我开始思考公司该如何修正自己的代码以获得更高的效率。这就如同你在房顶上添加了新的屋檐,使得房子更具价值。这件事听上去并不吸引人,但对于公司来说却至关重要。不过,许多人采取的做法都是错的。”

如今,Goulet成为了Corgibytes的首席执行官。这是一家负责重新设计应用并使其符合现代化需求的咨询公司。她看到过各式各样有问题的系统、遗留的代码以及与技术债务相关的问题。Goulet认为初创企业必须转变自己的思维模式——从偿还技术债务转变为创建技术财富以及从清除旧代码转变为逐步对其进行修改。她表示要想完成这件事,你必须要招募到一些出色的工程师来攻克此难题。

重新思考遗留代码

关于遗留代码最常见的定义来自《Working Effectively with Legacy Code》一书的作者Michael Feathers。遗留代码指的是那些没有测试覆盖率的代码。这个定义要比大多数人以为的——遗留代码指的是那些过时系统——要更全面一些。但据Goulet表示,这两种定义都还没能完全说明遗留代码的含义。“遗留代码与软件的使用年限无关。一个才使用两年的应用也可以处于废弃状态。”她这样说道,“这关乎的是改进软件的难易程度。”

当你想要去改进一个软件时,如果你无法分辨当时设计者的思考内容,这就变成了遗留代码。

遗留代码不是一个技术问题,而是一个沟通问题。

“上述这句话意思是说你的代码库可以反映出你的整个对话架构。”Goulet这样说道,“如果你想要去修改你的遗留代码,那你同样要去解决代码运行的问题。两者缺一不可。这是很多人都会忽略的一点。”

Goulet和她的团队始处理一个遗存项目的方法跟考古学家的方法有点相似。他们首先要寻找一些遗留下来的工件,这些工件可以让他们了解到过去开发者的思考方式。所有的这些工件组合在一起后便能提供新的决策。

那么最重要的工件是什么呢? 是有条理的、能揭露开发者意图的、整洁的代码。比方说,如果你用“foo”或是“bar”这些普通的名词来命名一个变量,那么六个月之后你再回头看,你将丝毫想不起来这个变量代表的是什么。

如果这个代码难以理解,那么一个有用的工件就是源代码控制系统。这是因为它可以提供该代码的变化历史并且为开发者提供编写代码的机会。

自动化测试也可以提供逻辑依据。“其实,那么多人认可Michael Feathers关于遗留代码的定义是有原因的。”Goulet解释道,“测试组件在理解开发者意图时非常有用”

这里能得到的经验很简单:如果你不想被自己的遗留代码困住,那就多关注一些有助于他人在未来更容易理解该代码的细节。编写及执行单元、接受、审批并且进行集成测试。解释说明你的代码执行命令。这能在未来让其他人以及你自己更好地理解你当时的想法。

不过,不管你采取何种措施,遗留代码的问题都会不可避免得出现。原因显而易见。

在初创公司发展早期,公司必须要推出一些功能。开发者为此也承担了很大压力,测试也有可能半途而废。       Corgibytes团队遇到了很多数年来一直懒得进行测试的公司。

当然,在你开发一个样品时,强迫你去进行测试也有些说不通。但当你开发出产品并拥有了客户的时候,你就需要投资时间和精力在产品的维护和改善上了。“很多人都会说我们根本无需担心维护相关的事宜,功能才最重要。”Goulet这样说道,“如果你是这么想的,那你永远无法具有竞争力。”

事实上,热力学第二定律也适用于代码:在所有过程中,熵的增加是不可逆的。熵是作为度量一个热力学系统无序状态的量度单位。这意味着你必须要解决技术债务带来的混乱状态。而遗留代码不过是随着时间累积而成的债务之一。

技术债务往往能反映出运营问题。

很多首席技术官都能意识到这个问题,但他们很难说服同事去相信花钱修复这些已存在的技术债务是值得的。这有些像是原路返回,却最终得不到任何新的成果。除非技术债务开始严重损害公司每天的运行效率,否则很多公司是不会想去解决技术债务的。不过拖到这时候才去解决,所花费的成本就非常高昂了。

忘记技术债务,专注于构建技术财富

如果你可以将你的技术债务转化为累积技术财富的机会,那你让首席执行官、投资者以及其他股东接受你提案的可能性会大很多。

“我们不能再将技术债务当做是一个不好的名词。当你处于产品设计和开发早期阶段时,技术债务将起到很大帮助作用。当你解决了部分债务时,你能带给自己动力。举个例子,当你在家中安装一些新窗户时,你确实花了很多钱,但你却可以每个月节省下一百美元的电费。代码亦是如此。不过解决技术债务并非是体现在效率上,而是会随着时间的流逝为你带来生产率。”Goulet说。

一旦你的团队不再富有成效,你必须要确认是什么技术债务在阻止他们的前进。

如果你可以改变自己的观点,专注于技术财富的创造,你最终可以获得剩余的产能。这些产能可以被拿去修补更多的技术债务以及遗留代码,从而形成一种良性循环。

别再将自己的软件当做是一个产品,将其想做是你未来会长期居住的一间房子。

Goulet表示这是一个非常重要的思维模式转变。这能让你摆脱短浅的思维方式,转而去专注于软件的维护。

这就像是房子一样,关于房子的现代化改造通常以两种形式发生:外表上的小变化(“我买了一个新地毯!”)以及昂贵但却能在未来有所回报的大投资(“我们要去更换管道系统”)。这两种形式的变化你都需要去考虑,目的是让你的产品和团队更加顺畅得运行和工作。

这当然也需要提前进行预算的规划。如果你不这样做,那么那些大笔的购买费用将会影响你的其他计划。时常进行维护的费用应该是在预期之内的。令人感到震惊的是,许多公司往往不会提前规划好一笔资金作为维护费。

因此,Goulet创建了“软件改造”这一术语。当你房屋中的某项物品损坏了,你不会去推倒其他部分、选择重新开始。与此相同,当你拥有一些过时且有问题的代码时,重写不一定会是最好的选择。

下面是Corgibytes在重新调整代码库时会做的一些事情:

  • 将一些整体应用分成更小、更易进行维护的微服务。

  • 减少彼此功能之间的联系,从而提高其可扩展性。

  • 更新品牌以及前端的界面。

  • 建立自动化测试,这样代码就可以自行检测。

  • 重构或者编辑代码库,使得代码更好地运行。

具体来说,每家公司重新调整代码库的工作应该有三种类型:

  • 自动测试

  • 持续交付

  • 文化升级

找到最具天赋的代码调整者

业内普遍这么认为:顶尖的工程师都不愿意处理遗留代码。他们都想要创造一些新的功能。人们还表示继续纠结遗留代码的维护是浪费时间的做法。

这些都是错误的观念。如果你知道从哪里可以找到一些技巧娴熟的工程师并且为他们提供一个愉快的工作环境,那么他们将帮你解决那些棘手的技术债务问题。

“无论何时,如果我们在会议上询问参会者有谁喜欢处理遗留代码?通常只有不到10%的人会举手。”Goulet说,“但当我与这些人进行交流时,我又发现他们都是一些喜欢解决挑战性难题的工程师。”

那么,你如何才能找到这些解决遗留代码的精英人士呢?Goulet尝试了很多种办法,其中一些起作用了。

Goulet在egacycode.rocks上推出了一个社区网站,该网站的声明如下:“长久以来,那些喜爱重新建构遗留代码的工程师一直被当做是二流的开发者。如果你为解决遗留代码这份工作感到自豪,欢迎加入!”

“我开始收到各式各样的邮件,人们都表示‘天呐!我也是这样!’。”她说,“我开始去传播这条信息,告诉大家重新建构遗留代码这件事其实非常有价值,凭此来吸引合适的人。”

她还在招募过程中采用了持续交付的做法,她为此类开发者提供了很多细节信息以及明确的指示。一段时间过后,她还进一步改进了申请流程,从而可以更早地发现一些出色的候选人。比方说,她的申请指南是这样的:“首席执行官将会浏览你的简历,所以请确保你的求职信是写给首席执行官的。”但并未注明首席执行官的性别。而那些所有以“尊敬的先生”或是“某先生”开头的求职信都会被直接删除。

“我这样做是因为很多人都假定软件公司的首席执行官一定是位男性。对此,我感到很烦恼。”Goulet这样说道,“所以有一天,我想到把这个作为指示放在网站上,然后观察有多少申请者能够注意到这一点。令我惊讶的是,这个细节不但剔除掉了一些不太严谨的候选人,还突显出了很多擅长处理遗留代码的人才。”

修改者并非是以细节为导向做事,他们不过是必须要去关注细节。

在我们这一行,人们盛行推崇编写代码的人,以至于所有人都希望他们也可以完成维护工作。这是一个错误的想法。最好的代码调整者从来都不是最好的代码编写者。

当Goulet招募到了一些出色的代码调整者时,她知道该如何让他们获得成功。

下面是一些能让此类开发者保持愉悦且高效的方法:

  • 给予他们足够的自主权。分配项目给他们时候,你可以解释问题是什么,但是千万别去强行规定他们应该怎么解决。

  • 如果他们要求对自己的电脑和工具进行升级时,请答应他们的要求。他们知道自己需要什么才能最大程度上提高自己的工作效率。

  • 帮助他们减少语境的问题。在完成某个项目之前,他们喜欢专注做好一件事。

稳定期并不是一个负面的词汇

大多数初创企业不会去回顾自己的发展阶段,还有一些公司甚至认为公司的发展应当是永无止境的。事实情况却不一定要如此。稳定期意味着你现在拥有可以去创建技术财富的人力和方法,你可以调动所有资源去处理一些需要优先解决的问题。

这还意味着你需要分配更多的企业预算到产品的维护以及更新上。“你不能将产品的维护当做是另一个项目。”Goulet这样说道,“它必须要扎根在你的企业文化中——这一点非常重要,它将在未来帮助公司取得更大的成功。”

最终,通过上述这些措施构建而成的技术财富将会为你的团队带来一批全新的开发者:这是一群有时间和资源来探索新领域、客户群以及机遇的侦察兵。当你可以去开发新的市场并且基于自己已完成的产品不断取得成功时,这时你的公司才真正处于一个繁荣发展的状态。

本文转载地址:http://www.lieyunwang.com/archives/207507【猎云网】

from: http://blog.csdn.net/lovelion/article/details/52550784

软件重构过程中的思维转换: 遗留代码如何变废为宝相关推荐

  1. 架构的坑系列:重构过程中的过度设计

    架构的坑系列:重构过程中的过度设计 软件架构   2016-06-03 08:47:02 发布 您的评价:       5.0   收藏     2收藏 这个系列是 坑 系列,会说一些在系统设计,系统 ...

  2. 常用软件-安装过程中的小常识

    常用软件-安装过程中的小常识 主要通过安装金山打字通软件,来讲解我自己安装程序中用到的小技巧. (只适用于电脑小白奥) 完整安装过程 如下是安装金山打字通的完整过程,讲解了我自己的常用小技巧. 1. ...

  3. 软件设计过程中的诱惑

    在软件设计的过程中,我们经常会面临这样的诱惑: 在工作过程中,突然出现了一个问题如鲠在喉,阻塞住了当前整个的工作进度, 而同时,你立刻能够想到一个快速搞定该问题的方案,这种情形下开发人员,很 容易就会 ...

  4. 1-1 软件构造过程中的多维视图

    本节目标: 本节大纲: 随着时间的推移,人们对软件的认识的变化: 软件不能脱离外部环境: 软件构造的多个维度: 时间:瞬时(某一天某个时间点).周期(变化情况) 编码:构建开发(代码的结构.多少类.类 ...

  5. 流量超过谷歌的Tiktok,在扩张过程中被质疑“偷窃”OBS代码

    编译 | 核子可乐.Tina 开源 GPL 协议的事儿,能叫"偷"吗? 12 月 20 日,Cloudflare 发布了 2021 年互联网流量报告.根据 Cloudflare 的 ...

  6. sketchUp软件使用过程中的一些问题

    使用SketchUp已经有几个月了,想谈一谈对此软件的使用感受和初衷. 1.为什么使用此软件?主要是手头正好有个方案需求,需要给某公司设计厂房规划和仿真动画.做此类方案的软件有很多,例如3DMAX,S ...

  7. python实现软件登陆过程中的试用时间校验(网络时间和本地时间双校验)

    # !/usr/bin/env python3 # -*- coding: UTF-8 -*- """ @des :""" import r ...

  8. Quartus II软件安装过程中的can't find Quartus II subscription Editon device file(.qdz)

    上一篇文章说道,安装玩Quartus软件之后,还需要安装器件库就是一个.qdz文件.我想很多初学者跟我一样,不知道去哪下载,下载那个文件.在折腾了几个小时之后,我终于 弄好了,下面我把解决的办法写下来 ...

  9. 软件材料填写中的行数统计和代码文本合并

    1.行数统计 Vs的"在文件中查找"功能,选中"使用正则表达式",查找内容为: ^(?!(\s*\*))(?!(\s*\-\-\>))(?!(\s*\&l ...

最新文章

  1. 剑指offer:第一个只出现一次的字符
  2. Linux基础 常用命令学习
  3. C#程序代码行号设置
  4. 3YAdmin-专注通用权限控制与表单的后台管理系统模板
  5. 社交网站将推动手游发展
  6. struts2 Action 通过Spring管理, 并通过Spring的方式读取配置文件
  7. arquillian_使用Arquillian测试安全的EJB
  8. oracle简单序列,-30天下载
  9. Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)
  10. Spyder清除Variable Explorer手动安装protobuf3.0(为了配置windows的python接口)
  11. 徒手撸框架--高并发环境下的请求合并
  12. IE浏览器中发送到onenote的选项没有调出来??
  13. paip.提升用户体验---c++ ide 自动化注释插件的开发...
  14. 专业的在线考试系统-快考题,支持自制题库/在线试卷答题
  15. hadoop环境搭建总结
  16. coreldraw sp2精简版 x4_coreldraw x4 sp2 精简版
  17. 中级软件设计师考试(软考中级)设计模式分类及其典型特点
  18. 人工智能--学术会议排名
  19. Oracle数据库 1653错误
  20. android源码定制之初探--定制android关机界面

热门文章

  1. 大数据读书笔记(2)-流式计算
  2. Arcface v1 论文翻译与解读
  3. elasticsearch6.2.2安装中文分词插件IK analyzer
  4. 深度学习时代的数据科学和自然语言处理
  5. SpringBoot - 统一格式封装及高阶全局异常处理
  6. Spring-AOP @AspectJ进阶之绑定代理对象
  7. android camera 检测,检测Android Camera文件夹
  8. tomcat 显示访问的ip白名单
  9. python 计算最后一个单词的长度
  10. 微信小程序用wxs实现手机号码用****代替