写点什么

争论:是否应该避免架构重写?

  • 2008-05-21
  • 本文字数:1417 字

    阅读完需:约 5 分钟

由于软件应对需求变化的能力越来越差,通过更新架构进行软件重建的做法变得越来越有吸引力。这种做法是相当有风险的,因此具体策略的选择显得相当重要。 Andy Singelton 最近的一篇博客就此问题进行了讨论。文章认为成本、技术复杂性、潜在的商业风险是在进行战略选择时不得不认真权衡的三个因素。对此他提出了三种解决方案,并简要分析了每种方法的优缺点:

- “原型和延展”方案,完全编写新的软件;
- “增量开发”方案,在仍然使用原有代码集的基础上,更新部分组件并进行重构;
- “购买”方案,购买能满足新需求的软件。

然而,几位博客作者却认为第一种选择——从无到有地重写软件——无论如何都应该避免。早在 2000 年 Netscape 6 发布之后, Joel Spolsky 就不提倡这种方法。 他形容 Netscape 重写代码的决定“简直就是一个无比失误的战略性错误”,同时还举了一些犯类似“错误”的例子:dBase、Borland 的 Quattro Pro、以及 Microsoft 的 Pyramid 项目。Joel 认为在许多案例中做出需要重写软件的判断带有一定的主观性,其往往是由重用代码时遇到困难造成的。此外,他认为冗长的测试和缺陷修复过程在很大程度上造成了代码可读性低下:

新代码优于旧代码的观点显然是荒谬的。旧代码毕竟已经过测试并投入使用。大量缺陷已经被发现并被修复。[……]

回头再看看那个两页长的函数。是的,我知道它只完成了显示窗口这个简单功能,但是它已经增加了一些东西,没有人知道是为什么。好,我来告诉你为什么:它们是对缺陷的修复。[……]

这些缺陷的每一个都是在实际使用了数周之后才被发现的。[……]

当你扔掉代码并从零开始的时候,你就是随手扔掉了所有这些认识。这些不断收集到的对缺陷的收集和修复可都是多年编程的积累!

Joel Spolsky 还强调了重写项目存在的潜在商业风险,认为其可能削弱团队应对新出现市场需求的能力。因此他认为,即使旧的代码集就架构而言真的很糟糕,也应该努力清理代码、重构、修改接口,而不是进行全面的重写。

重写软件的一个常见理由是,吸取第一次发布后的经验教训后,团队会把工作做得更好。但是,Joel Spolsky 强调了开发团队极有可能会随时间而发生变化这一事实。正如最近回应了Spolsky 文章的Dharmesh Shah 所强调的,市场情况也很有可能发生改变。

Dharmesh Shah 列出了其它一些进行软件重写的理由——比如说差的代码集,或是最初对平台或语言的错误选择——同时他也指出这个做法的局限性。他详细说明了为什么要抵制进行重写的趋势:开发过程难免要比预期的要长;不能对现有客户提出的潜在市场变化和要求做出响应,这存在很大的风险,甚至有可能会削弱软件的竞争优势;而且有不同的替代性解决办法,例如重构,重构在减少前面那些风险的同时,对清理代码也很有帮助。Dharmesh Shah 认为重写只在少数几种情况下是可行的:如果最初的技术选择阻碍你的商业成功,或者技术前景有巨大的转变——比如从客户端 - 服务器到基于 Web 的计算——而你的软件又无法适应它。

然而 Bob Warfield对Dharmesh Shah 的帖子进行了评论, 根据其把Quattro Pro 从Modula-2 编译器移植到Turbo Pascal 的经验,他认为为了改变语言而重写软件是不值得的。他还添加了一些关于这个问题的其它见解,比如在人力资源方面的考虑,尤其是当由于现有代码 的低质量而决定重建的时候。他更进一步地强调了重构的价值,认为重构能超越代码,还认为由团队获得的经验可用于重构,比如用户模型。

查看英文原文: Debate: Should Architecture Rewrite be Avoided?

2008-05-21 07:081063
用户头像

发布了 151 篇内容, 共 63.0 次阅读, 收获喜欢 18 次。

关注

评论

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

伴鱼数据库之监控系统

TiDB 社区干货传送门

Tidb灾难恢复演练-多副本丢失

TiDB 社区干货传送门

故障排查/诊断

一次 meet_lock 告警异常处理过程

TiDB 社区干货传送门

实践案例 故障排查/诊断

TiDB Coprocessor 学习笔记

TiDB 社区干货传送门

TiDB 底层架构

PD api基础框架源码分析

TiDB 社区干货传送门

TiDB 底层架构

【TiDB 4.0 新特性系列】BR 特性及原理解读

TiDB 社区干货传送门

小红书数据架构及 TiDB 使用场景

TiDB 社区干货传送门

TiDB 记录日志原理解读

TiDB 社区干货传送门

TiDB 底层架构

一个联合索引使用问题以及优化方案

TiDB 社区干货传送门

管理与运维 故障排查/诊断

TiDB AutoCommit OFF 问题

TiDB 社区干货传送门

实践案例 故障排查/诊断 新版本/特性发布

国产主流数据库调研

TiDB 社区干货传送门

性能调优 实践案例

从使用者到开发者,知乎参与 TiDB 社区背后的故事

TiDB 社区干货传送门

实践案例 数据库架构选型

PD 关于tso 分配源代码分析

TiDB 社区干货传送门

TiDB 底层架构

pd集群多副本数据丢失以及修复实践

TiDB 社区干货传送门

实践案例

TiDB run and debug on M1

TiDB 社区干货传送门

实践案例 安装 & 部署

TiDB大规模删除实践

TiDB 社区干货传送门

管理与运维

伴鱼数据库之SQL审核系统

TiDB 社区干货传送门

TiDB 赋权问题

TiDB 社区干货传送门

故障排查/诊断

不定期更新,记录一些小知识

TiDB 社区干货传送门

监控 版本升级 安装 & 部署

微众银行数据库架构演进及 TiDB 实践经验

TiDB 社区干货传送门

实践案例

把云数据库服务变成黑盒子:ServerlessDB for HTAP丨Hacking Camp 进行时

TiDB 社区干货传送门

实践案例

Flink 最佳实践之 通过 TiCDC 将 TiDB 数据流入 Flink

TiDB 社区干货传送门

性能调优

TiDB GC 之原理浅析

TiDB 社区干货传送门

TiDB 底层架构

PD api基础框架源码分析

TiDB 社区干货传送门

TiDB 底层架构

DELETE Statement,懂你不容易

TiDB 社区干货传送门

TiDB 底层架构

TiFlink: 使用 TiKV 和 Flink 实现强一致的物化视图

TiDB 社区干货传送门

实践案例 TiDB 底层架构

使用Zabbix监控TiDB(一)

TiDB 社区干货传送门

实践案例

TiDB HTAP 深度解读

TiDB 社区干货传送门

Placement Rules 原理

TiDB 社区干货传送门

TiDB 底层架构

TiDB 监控架构解读

TiDB 社区干货传送门

监控

【TiDB 最佳实践系列】PD 调度策略最佳实践

TiDB 社区干货传送门

实践案例

争论:是否应该避免架构重写?_架构_Sadek Drobi_InfoQ精选文章