立即领取|华润集团、宁德核电、东风岚图等 20+ 标杆企业数字化人才培养实践案例 了解详情
写点什么

重构?还是重写?

  • 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:095643
用户头像

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

关注

评论

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

“PKS+生态(智方舟)加速营”圆满结束,九科信息与中电智方舟达成战略合作

九科Ninetech

【Ajax】全面详细了解git的基础操作【万字教学+面试常客】

坚毅的小解同志

git 11月月更

Linux 系统启动过程

梦笔生花

Linux Linux驱动 11月月更

唯一获奖容器厂商!灵雀云斩获2022信创“大比武”通信赛道大奖

York

容器 云原生 数字化转型 国产化 信创云

第二章STP应用配置

初学者

网络 11月月更

前端食堂技术周刊第 60 期:TypeScript 4.9、Ant Design 5.0、用 vanilla-extract 编写高性能的 CSS、Node.js 安全最佳实践

童欧巴

低代码会使初级码农失业吗

秃头也爱科技

【C语言】register 关键字

謓泽

11月月更

分布式监控平台 WGCLOUD v3.4.2 节流 30%,更轻更快

王逅逅

Linux 信创 zabbix Prometheus #运维 性能监测

WSUS 服务

我叫于豆豆吖.

11月月更

中国银河证券:缺少DevOps,企业数字化转型就是带着脚镣跳舞

嘉为蓝鲸

DevOps 数字化转型 金融 证券

打造用户喜爱的产品,离不开需求助推器|影响地图Impact Mapping

老彦

敏捷开发 软件工程 设计思维 用户故事地图 影响地图

redis 集群实现方案与原理

想要飞的猪

redis哨兵集群 redid集群cluster

DHCP 服务

我叫于豆豆吖.

11月月更

第一章三层交换应用

初学者

网络 11月月更

华为云企业交换机ESW,让数据业务无缝迁移上云

爱科技的水月

真正的按需计费-函数工作流 FunctionGraph实战,5分钟搭建图片压缩应用

秃头也爱科技

netty系列之:在netty中使用proxy protocol

程序那些事

Java 架构 Netty 程序那些事

华为云Astro的前世今生:用7年时间革新低代码开发观念

科技怪授

跨平台桌面应用开发都有哪些主流框架

FinFish

小程序 跨端框架 桌面端开发 跨端应用开发

MACH架构的质量工程指南

俞凡

架构 微服务 云原生

Alluxio 2.9新版发布 | 重塑架构,支持大规模多租户环境

Alluxio

分布式 新闻 Alluxio 大数据 开源 数据编排

部署RDS 服务

我叫于豆豆吖.

11月月更

解决数据分析落地难的几点经验

穿过生命散发芬芳

数据分析 11月月更

华为云弹性负载均衡ELB,如何保障服务器不瘫痪?

清欢科技

数据仓库实战教程

kingcall

数据仓库 数据湖 数据安全 数仓 数仓建模

jvm(三)类加载机制、javac编译

想要飞的猪

JVM类加载

深度解读隐语密态计算设备SPU

隐语SecretFlow

机器学习 开源 隐私计算 开源框架 隐语

Java集合与数据类型

kingcall

Java JAVA集合 Java集合框架 java数据类型

2022-11-21:第N高的薪水。表结构和数据的sql语句如下。请问sql语句如何写? DROP TABLE IF EXISTS employee; CREATE TABLE employee (

福大大架构师每日一题

数据库 sql 福大大

浅谈中小企业进军新媒体行业为何屡次遭受挫败

石头IT视角

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