写点什么

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

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

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

关注

评论

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

gitlab-runner出现too many connections

ilinux

关于QPS高并发,你了解多少?

android 程序员 移动开发

关于内存泄漏和内存溢出的那些事!

android 程序员 移动开发

凭借这938页Android面试题合集,拿下了滴滴、美团、携程

android 程序员 移动开发

你知道 Android 面试官最喜欢问那些技术点嘛?这篇带你复盘往年面试题!

android 程序员 移动开发

你知道Java类什么情况下会被初始化吗?

android 程序员 移动开发

你知道App为什么会Crash吗?

android 程序员 移动开发

全新Android-Material-组件你在用了吗?

android 程序员 移动开发

加入 node 后 flannel 报错

ilinux

全网独家盘点Android热修复方案(含阿里巴巴、美团、腾讯等

android 程序员 移动开发

六年 Android 开发的涨薪之路,从15K涨到30K的面试解析

android 程序员 移动开发

你是不是疯了,为什么字节跳动的Offer都不要了?

android 程序员 移动开发

使用Flutter完成10个商业项目后的经验教训

android 程序员 移动开发

使用协程优化你的业务

android 程序员 移动开发

删除/var/lib/cni更换网络插件但是kubernetes没有正常启动

ilinux

关于Android内存泄漏的那些事

android 程序员 移动开发

删除calico换成flannel后,容器没有正常启动

ilinux

【Java对象拷贝机制】使用CGlib实现Bean拷贝(BeanCopier)

洛神灬殇

对象拷贝 11月日更 BeanCopier

你还在为-TCP-重传、滑动窗口、流量控制、拥塞控制发愁吗

android 程序员 移动开发

关于listView(列表)的各种使用方法

android 程序员 移动开发

再见吧 buildSrc, 拥抱 Composing builds 提升 Android 编译速度

android 程序员 移动开发

凭你的技术“你能做个淘宝、微信吗?

android 程序员 移动开发

像奥利奥一样的双重安全措施,尽在 Android Oreo

android 程序员 移动开发

全面解析Android进阶面试常客之Handler

android 程序员 移动开发

图解Pandas的排名rank机制

Peter

Python 数据分析 pandas

关于提高编程思维与工作效率的总结

android 程序员 移动开发

再见!杭州!再见!阿里巴巴

android 程序员 移动开发

你的产出是别的程序员的10倍,为什么无法获得10倍的工资?

android 程序员 移动开发

做了6年的Android,靠着这份900多页的PDF面试整理,薪资Double!

android 程序员 移动开发

六年老Android开发,突遇公司搬离上海无赔偿,我该怎么办?

android 程序员 移动开发

几年开发两茫茫,且看我给你分析ContentProvider

android 程序员 移动开发

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