写点什么

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

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

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

关注

评论

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

【YashanDB知识库】服务端是GBK编码,导致从22.2.12.100升级到22.2.13.100失败问题

YashanDB

yashandb 崖山数据库 崖山DB

24年黑龙江正规等保测评机构名单汇总

行云管家

等保 堡垒机 等保测评 黑龙江

从"小白"到"大白":我的TiDB一周年成长记录

TiDB 社区干货传送门

Dashboard 热力图显示不准? 如何定位热点相关sql ?

TiDB 社区干货传送门

故障排查/诊断

为什么企业需要IT外包服务

Ogcloud

IT外包 IT外包公司 IT外包服务 IT外包企业

在 K8s 上用 KubeBlocks 提供的 PG 和 Redis operator 部署高可用 Harbor 集群

小猿姐

postgresql Kubernetes operator Redis 消费队列

观测云:企业级监控的全方位解决方案

可观测技术

监控

【论文速读】| Arondight:使用自动生成的多模态越狱提示对大型视觉语言模型进行红队测试

云起无垠

运维安全审计以及运维安全审计软件定义看这里!

行云管家

安全运维 运维安全 运维安全审计

In-depth analysis-IPQ5332 and IPQ8072 Technical comparison between

wifi6-yiyi

WiFi7 IPQ5332

焱融科技发布国产化全闪新品 F8000XC

焱融科技

写一篇最近用DM的总结

TiDB 社区干货传送门

迁移

京东商品列表数据接口:电商数据分析的利器

tbapi

京东API 京东商品列表数据接口 京东商品数据采集

【第八届 TiDB Hackathon】AI 创新应用 TiDB 黑客马拉松正式开启,一起来用 TiDB 构建未来的 AI 创新应用, 瓜分超 ¥210,000 奖金池!

TiDB 社区干货传送门

一次 sysbench 长稳测试过程中锁丢失导致事务提交失败的问题分析排查

TiDB 社区干货传送门

故障排查/诊断

职场<火焰杯>测试开发大赛决赛成绩及获奖名单公布!

测试人

软件测试

【程序大侠传】全局变量与并发之战

Disaster

淘宝商品详情API:商品规格参数的详细解析

技术冰糖葫芦

API Explorer API 编排 api 货币化 API 文档

夏日清凉计划开启,来华为天气领取出行礼包、影音会员等惊喜福利

最新动态

ChatGPT4o 如何速写论文

蓉蓉

gpt4o

探讨大模型前沿技术与商业化落地 |【奇绩潜空间】第3季开始报名

奇绩创坛

人工智能 机器学习 深度学习 大模型 视频生成

贝锐蒲公英智能选路:跨地区远程访问更快、更稳、更可靠

贝锐

远程办公 SD-WAN 智能选路 异地组网

以用户为中心:观测云的设计理念

可观测技术

监控

观测云:零售行业数据分析的利器

可观测技术

Web网页端IM产品RainbowChat-Web的v7.1版已发布

JackJiang

即时通讯 即时通讯;IM;网络编程

【故障处理】 统计信息收集失败, enconding failed

TiDB 社区干货传送门

故障排查/诊断

sync_diff_inspector 表结构比较功能探索

TiDB 社区干货传送门

迁移

一文了解 PingCAP Clinic 诊断服务

TiDB 社区干货传送门

故障排查/诊断

聚焦于 Melos 数据生命网络,用户如何参与到生态的建设中?

大瞿科技

深入解析仓颉编程语言:函数式编程的核心特性

代码忍者

仓颉

一次 sysbench 长稳测试过程中连接中断的问题分析排查

TiDB 社区干货传送门

故障排查/诊断

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