写点什么

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

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

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

关注

评论

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

请别再问Spring Bean的生命周期了!

java易二三

程序员 Spring Boot 计算机 Spring Bean生命周期

懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!

Immerse

JavaScript 设计模式 代理模式 Proxy Design Pattern

一个写了3年半flutter的小伙,突然写了2个月uniapp的感悟!

编程的平行世界

uni-app Vue 前端 Flutter Android Apk

JVM类加载器子系统ClassLoader

java易二三

编程 程序员 计算机

解决 go-zero 注册 etcd 出现 “Auto sync endpoints failed.” 的问题

非晓为骁

golang etcd go-zero etcd-client 服务注册发现

在 Amazon EMR 上构建实时数据湖

亚马逊云科技 (Amazon Web Services)

Amazon EMR

ChatIE:通过多轮问答问题实现实命名实体识别和关系事件的零样本信息抽取,并在NYT11-HRL等数据集上超过了全监督模型

汀丶人工智能

人工智能 自然语言处理 NLP 大模型 关系抽取 命名实体识别

基于中文金融知识的 LLaMA 系微调模型的智能问答系统

汀丶人工智能

人工智能 自然语言处理 知识图谱 LoRa NLP 大模型

MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)

汀丶人工智能

人工智能 自然语言处理 LoRa llama LLM模型

Dify.AI 用户直面会:Dify 产品规划与 LLM 应用落地常见问题

Dify

开源 AI开发软件 LLMOps

用Orange Pi Zero3定制安卓电视盒子备忘

sai

Orange Pi Android TV

代码随想录Day32 - 贪心算法(二)

jjn0703

2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数字出现的频率都相同。

福大大架构师每日一题

福大大架构师每日一题

文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

福大大架构师每日一题

福大大架构师每日一题

C++中互斥锁的使用

芯动大师

JVM 调优神器 arthas

java易二三

编程 计算机 Arthas

如何在几分钟内创建一个带有业务数据的官网 AI 智能客服?

Dify

开源 AI开发 LLMOps

想学Python高级编程?必须了解这个小技巧:match-case!

程序员晚枫

Python

Nginx的高可用

java易二三

编程 程序员 计算机

代码随想录Day31 - 贪心算法(一)

jjn0703

Mac部署AIGC图片生成服务——基于stable-diffusion

珲少

大厂程序员的水平比非大厂高很多嘛?

程序员小毕

Java 程序员 面试 程序人生 架构师

从互联网到云时代,Apache RocketMQ 是如何演进的?

阿里巴巴云原生

Apache 阿里云 RocketMQ 云原生

Spring Boot学习路线1

小万哥

Java spring 后端 Sprint Boot Sprint Cloud

业务模块在你做之前,一定要多想呀?

Bonaparte

产品 产品经理 产品设计 产品思维 产品需求

Dify.AI 接入 Claude2 模型:支持 100K token 上下文,登录即免费获得 1000 次消息额度

Dify

开源 更新 LLMOps

使用Keepalived实现Nginx的自动重启及双主热备高可用

java易二三

编程 程序员 计算机

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