写点什么

重构?还是重写?

  • 2009-11-28
  • 本文字数:1232 字

    阅读完需:约 4 分钟

重构和重写的目标,都是要通过提高的代码的可读性、结构和清晰性,从而提高系统的健壮性。清晰的代码更易于维护和改善。然而,在很多情况下,敏捷团队会难以在二者之间做出选择。

代码会随着时间的流逝变得越来越差, Michael Dubakov 为此指出了下面的原因:

  • 越来越多的特性。它会导致复杂度的提升。
  • 捷径和权宜之道。为了支持诸如”我们在八月份需要这个 NB 的搜索,没二话”之类的特性
  • 开发者轮换。新的开发者根本不知道架构之后的所有起决定性作用的决定和主意。知识不可避免地随着人员的轮换而流失。
  • 开发团队的扩大。更多的人导致更少的交流,更少的交流产生糟糕的决定。

Michael 建议,虽然重构和重写都会使代码更加清晰,但是这两种技术都会导致现有系统的混乱。重构是一种增量式的活动,因此它每次只会接触到系统的一部分。这会在局部造成混乱,可能还比较容易控制。而另一方面,重写是更具有攻击性的改变,它会导致系统中更大的混乱。由于它会造成更广泛的影响,因此要想让重写的影响稳定下来,时间要比重构长得多。

我们重写旧的系统,因此混乱是家常便饭。在公开发行之后,混乱显著增长。我们预料会出现很多新的(和旧的)缺陷和古怪的行为,因此稳定期会更长

Peter Schuh 认为团队经常会将两个词彼此替换使用,从而导致更多的迷惑和混乱。团队应该知道:和重构相比,重写更具有风险,因此应该恰当地使用术语。据他所说:

那只是语义上的。然而,在一些人受到伤害之前那只是语义上的。重写代码很有风险,并且有时会付出痛苦的努力,这么做不一定总有光明的结尾。如果我们执行重写,但是把它叫做重构,并且整个过程以梨形(指越到后来问题越多,需要付出的时间和成本也随之增长)进行,那就不会有业务人员停下来考虑语义了。他们只是会在下次听到重构这个词的时候退缩。

Guido A.J. Stevens 的想法很有趣,他认为问题并非出在重构和重写之间,而是在于:或者重构,或者重写并重构。他提出:即使当团队决定重写系统的时候,最终他们也会有两个系统并行运行。旧系统需要重构,而新系统正在被重写。这种组合变成了一项极度复杂的任务,据他所说:

维护老化的代码基础,并且编写新的系统,将会耗尽你的资源。你的团队被分割,并导致延迟。你需要制定计划,小心翼翼地执行转换。同时,你所面临的上市时间问题在你的竞争对手身上不存在,他们还会试图挖走你的客户。如果你能正视这种现实,并仍然想把公司前途押在重写上,那么你也许有机会成功。

Naresh Jain 对于遗留代码有下面特别的的建议。当代码难于理解,并且团队不能确定它做什么的时候进行重构。当很清楚知道代码做什么,但是很难理解那些代码的时候就重写。

因此,重构是不断提升系统更好的方式。它是慢速前进的,通过小的、经常的提升来提高质量。重写也有其自身的优势,然而在很多情况下它是一种有风险的选择,并且团队可能永远都不确定产出物的情况。正如“Joel 说软件”中所说:

重要的是要记住,当你从零开始的时候,没有绝对的理由相信你会比你第一次做得好。

查看英文原文: Refactor or Rewrite?

2009-11-28 07:096158
用户头像

发布了 340 篇内容, 共 144.3 次阅读, 收获喜欢 13 次。

关注

评论

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

YashanDB|复合索引用了也慢?IN 参数太多时建议这样调

数据库砖家

数据库

YashanDB|IN 参数超 300 个,查询突然变慢?问题可能出在执行计划上

数据库砖家

数据库·

如何让财务规划引领企业变革,并实现持续的成本优化?

智达方通

企业管理 财务管理 财务规划

macOS Sequoia 15.5 (24F74) Boot ISO 原版可引导镜像下载

sysin

macos

推荐几个常用免费的文本转语音工具

石臻臻的杂货铺

工厂管理中的5个常见误区,90%的企业都踩过!

积木链小链

数字化转型 智能制造 工厂管理

macOS Sonoma 14.7.6 (23H626) Boot ISO 原版可引导镜像下载

sysin

macos

YashanDB|JDBC getString 取 DATE 字段不带时分秒?两个方法解决!

数据库砖家

数据库

合合信息上线智能文档处理领域首批MCP服务,助力企业快速搭建Agent

合合技术团队

人工智能 算法 #大数据

Mint Blockchain 主网上线一周年回顾:增长之年与未来展望

NFT Research

NFT web3、

CAD图纸如何进行坐标标注?

在路上

cad cad看图

YashanDB |报错 no free block in dictionary cache?共享集群中的卡顿真凶找到了

数据库砖家

数据库

国家信息安全等级保护三级认证定义以及流程简单讲解

行云管家

网络安全 数据安全 等保 等保测评

玩转HarmonyOS NEXT网络请求:从新手到高手的实战秘籍

程序员Feri

HTTP HarmonyOS NEXT

gozero限流、熔断、降级如何实现?面试的时候怎么回答?

王中阳Go

Go gozero

YashanDB|UPDATE 中用子查询赋值报错?换个写法就能兼容

数据库砖家

数据库

YashanDB |YMP 迁移时报错 account lock?别让低版本 OpenSSL 坑了你

数据库砖家

会议纪要自动生成软件!AI一键搞定会议纪要,办公必备!

职场工具箱

人工智能 AI 办公软件 AIGC 会议纪要

YashanDB|Oracle 中的 pipelined 表函数迁移不过?这样改写就对了

数据库砖家

数据库

深度解析淘宝天猫店铺所有商品API接口,一文带你吃透

tbapi

淘宝API 天猫API 天猫店铺所有商品接口 淘宝店铺所有商品接口 淘宝店铺数据采集

智源联合南开大学开源Chinese-LiPS中文多模态语音识别数据集

智源研究院

Qwen3 系列全家桶,百度百舸一键部署

百度Geek说

CAD三维图纸如何测量?详细教程来了

在路上

cad cad看图 CAD看图王

YashanDB|服务器重启后数据库无法启动?别忘了这个关键服务

数据库砖家

数据库

CST软件如何将单端转换为差模共模

思茂信息

cst CST软件 CST Studio Suite

YashanDB|Oracle 里的 XMLAGG 迁不过来?换成 WM_CONCAT 就对了

数据库砖家

数据库

京东商品详情API接口攻略

tbapi

京东API 京东商品详情API

新疆五家等保测评机构名称以及地址汇总

行云管家

网络安全 等保 等保测评 等保测评机构

理解 C# 中的各类指针

电子尖叫食人鱼

Java C#

2025“一录同行”广州首站落幕!金贝灯光赋能影视创作新浪潮

科技热闻

非计算机专业 0 门槛上手 Trae|知识库精选

火山引擎开发者社区

火山引擎

重构?还是重写?_研发效能_Vikas Hazrati_InfoQ精选文章