写点什么

重构:“为什么”和“怎么做”

  • 2008-04-09
  • 本文字数:1252 字

    阅读完需:约 4 分钟

近日在“敏捷中国”讨论组展开了一系列关于重构的讨论。一种观点认为,对代码的重构是程序员出于对代码美感的追求而进行的行为。

重构更多的是基于激情,把代码做为艺术品来雕琢。但是不少软件公司工作环境可以很快摧残这种热情。

然而作为软件开发工作的一部分,重构行为显然不应该被归结于“激情”和“艺术”。之所以有这种想法,往往是由于没有一种有效的方式来衡量重构行为的成本和收益,从而不能有效地组织和管理重构行为。在同一组讨论中就有人提出了这个问题:

我想了解一下,大家是否把重构的时间放到 sprint 的估算里。假设到了代码用户案例测试通过了,操作文档也完成了,如果没有时间重构代码,你们会怎么办?重构的时间,跟追求的度成正比,怎么估算重构的成本?

来自 ThoughtWorks 的熊节认为,重构的收益体现为修改成本的降低,因此也是可衡量的。

从商业的角度,每段代码,每次修改都带来一定的商业价值,同时每段新代码,每次修改都有它的成本,这个成本随代码质量的下降而上升。当代码质量烂到一定程度,修改代码的成本超过收益,这个软件就没办法继续发展了。重构也有它的成本,它带来的收益是降低修改代码的成本。如果你发现一个程序员一方面抱怨面对变化的需求他不敢动手改代码,另一方面又不想通过重构改善代码质量,你就知道这里必定有什么问题了。

在一篇题为“在大型遗留系统基础上运作重构项目”的文章中,熊节详细说明了如何权衡重构的成本和收益:

  1. 和别的任何 story 一样,重构的 story(以及其他“技术债”类型的 story)也应该符合 INVEST 的标准。尤其是,它们的工作量应该得到估算,它们应该按照业务价值排列优先级。因为归根到底,重构(以及其他任何开发任务)都归结为“花在代码上的成本”与“对业务创造的价值”之间的权衡。
  2. 按照定义,重构意味着“在不改变功能性行为的前提下改进代码的组织结构”。如果代码基础本身脆弱而没有测试覆盖,重构的成本就会很高,因为你需要花很大力气来确认自己的修改没有改变功能性行为。
  3. 如果偿还“技术债”的成本非常高,那么与之对应的业务价值就必须更高,否则偿还这些债务就将得不偿失。其结果是:一段代码,从程序员的角度看来越糟糕,从商业的角度来说就越不应该去动它。
  4. 综上所述,如果有人说“这一大堆代码都需要重构”,这样的说法很有可能是值得商榷的。你需要把重构划分成细粒度的、可控的 story,为这些重构 story 制定验收标准,评估它们的优先级,估算它们的工作量,然后逐一实现它们,并且放弃一些得不偿失的重构。

这篇文章还介绍了对遗留系统进行重构的步骤:

经过这个咨询项目,eMAN 产品开发团队在原有代码的基础上划分了细粒度的重构 story,建立了持续集成环境,并按照共同探索出的节奏,以测试为驱动、以代码质量为导向,不断重构以改进代码质量,并且积累了一些常见问题的解决办法,为大规模遗留系统的重构找出了一条切实可行的路子。

和所有的敏捷实践一样,重构的原则说起来很简单,但实际操作起来总是会有很多困难,需要经验和权衡。你在尝试重构时遇到困难了吗?你有自己的重构经验想要与整个社区分享吗?

2008-04-09 23:482026

评论

发布
暂无评论
发现更多内容

9个JavaScript库,让你早下班2小时

秃头小帅oi

我们写的代码是如何被用户看到的——前端篇

阿里技术

前端

Endpoint Central终端管理软件适合什么样的IT用户?

Geek_a83400

数据资产新视角 要素化与资产化的双轮驱动

郑州埃文科技

数据治理 数字经济 数据要素

开源活动预告|抖音集团专家聚焦电商、PB 级实时场景带来数据技术分享

字节跳动开源

MySQL Undo 工作机制历史演变

爱可生开源社区

MySQL innodb 事务 Undo

TiDB 究竟抖还是不抖?

TiDB 社区干货传送门

版本升级

从 Oracle 到 TiDB 丨数据库资源评估指南

TiDB 社区干货传送门

迁移

论被动元数据的弊端,以及主动元数据的技术优势

Aloudata

元数据 数据管理 全链路数据血缘 数据血缘

效率跃升16倍!火山引擎ByteHouse助力销售数据平台复杂查询效率大幅提高

极客天地

「激荡五十年」艰难起步的八十年代

不惑

数据库 历史 科技简史 发展趋势 前世今生

华为大咖说丨企业数字化转型如何开展顶层设计?

华为云 企业数字化

工作太忙没时间学习,怎么办?

老张

职场成长 认知 学习成长

在数小时内构建 CRM:你需要了解的顶级无代码/低代码工具

NocoBase

低代码 CRM 无代码

【案例分享】如何利用京东云建设高可用业务架构

京东科技开发者

2024年你应该使用的6个JavaScript库

伤感汤姆布利柏

一个比 Nginx 还简单的 Web 服务器

江南一点雨

Java ORM 框架指南

FunTester

亚信安慧AntDB数据库分布式集群在线升级

亚信AntDB数据库

AntDB

永续合约快进快出套利策略

Silently9527

比特币 量化交易

数据迁移工具应具备的新式延迟诊断功能

爱可生开源社区

数据迁移 MySQL、 #OceanBase

JeecgBoot应用Spring Authorization Server

JEECG低代码

“人手一个贾维斯”的愿望,正在被“视频通话”功能带进现实

Alter

TiDB DR-Auto-Sync 同城双中心高可用实践丨银行核心背后的落地工程体系

TiDB 社区干货传送门

MySQL 索引合并优化实践

爱可生开源社区

MySQL 索引

重构:“为什么”和“怎么做”_研发效能_林芷薰_InfoQ精选文章