2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Martin Fowler 阐述“牺牲的架构”

  • 2014-11-05
  • 本文字数:1350 字

    阅读完需:约 4 分钟

软件开发团队希望拥有长期稳定的软件架构,但是硬件、软件和网络速度的技术却在高速发展,就这需要架构做出重的大调整,甚至抛弃之前的整个代码库。在这种背景下, Thoughtworks 的作者和顾问 Martin Fowler 在他近期的博客中介绍了牺牲的架构。

牺牲的架构意味着要接受一种现实,那就是在几年内团队将需要(希望)抛弃他们之前构建的一些东西。Martin 提到,这意味着当这一时刻到来时,要立刻思考如何让这些东西更容易被替换掉,但是软件设计人员却很少思考如何设计他们的产出物,让它们如何支持将来的替换。

对于许多人来说,抛弃代码库是一种失败的标志,或许考虑到软件开发所固有的探索特性也能够表示理解,但仍然会感到强烈的挫败感。但是,现在你抛弃几年前写的代码,通常能够写出更好的代码。

Martin 举了一个 eBay 的例子,他们的做法与牺牲的架构是一致的,他们在一段时间之后把 perl 脚本移植成了 c++ 代码,又在一段时间之后移植成了 java 代码。能够支撑 1996 年 ebay 的架构不会成为能够支撑 2006 年 ebay 的架构。1996 年的这一版不能处理 2006 年的负载压力,但是 2006 年的版本对于构建和维护来讲太复杂了,而且是针对 1996 版之后的需求逐步演变而来的。

EPAM 系统的开发人员 Dmitry Cheryasov 也支持牺牲的架构,因为这是业务转变的需要。他在 Y Combinator 的讨论中共享了他的观点,他说:

为了在合适的时机重新构建而构建。它就像抛弃原型,只是代码已经投入使用罢了。当你的业务增长的时候,你可能不得不抛弃之前的一些或者全部的代码库(就像 eBay 的做法,第二次提到了)。这并不意味着之前的解决方案不好:一点也不,在当时的情况下它们非常恰当。

谷歌的高级研究员 Jeff Dean 在他的陈述中提到,在代码库太旧之前就重新设计或者抛弃掉。

当前正确的设计对于十倍或者百倍的增长可能就是非常错误的了,可以针对十倍的增长进行设计,但在增长到百倍之前就要计划去重写了。

Martin 说,在早期的软件系统中,很少保证软件事实上需要做到什么,所以重点是更加关注特性变更的灵活性而非性能或有效性。 Stack Overflow Stack Exchange Network 的联合创始人 Jeff Atwood 创造了一种新的说法“性能就是一种特性”。所以团队可以把性能特性和其他的特性一起来排序。最初它的优先级不高,但是开发阶段后期就要提高它的优先级了。

Martin 说牺牲的架构不会引起质量的缺乏。对于一个健康的代码库来说,关键是模块化。

好的模块化是一个健康代码库的关键部分,当要更换一个系统时,模块化通常能够带来巨大的帮助。最好的一种做法就是,在系统早期系统就探索最好的模块化结构应该是什么样的,以便你能够基于替换的认知去进行构建。由于在早期时它就被设计成了全部系统都是可以牺牲的,随着系统的增长要牺牲独立模块时就会更加的高效,因为如果你有良好的模块边界,就只做简单地替换就可以了。

Justin Meyer 是 jQuery 顾问和 JavaScriptMVC CanJS jQueryPP 的联合创始人,他在近期的博客中分享了模块化的重要性,他说:

模块化是一个可维护性应用最重要的特性。一个模块化的应用不会浪费,部件可以被修改、替换或者抛弃掉,而不会影响到应用的其他部件。

Martin 说,写牺牲的架构的团队决定了牺牲的时机,也了解代码在未来牺牲掉是一件好事。

查看英文原文: Martin Fowler Describes “Sacrificial Architecture”

2014-11-05 03:493230

评论

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

deepin Meetup成都站来了!一起聊聊deepin-IDE 2.0,还有礼品可以拿!

nn-30

flutter Linux 操作系统 linux开发 deepin

强大好用的shell:什么是shell?

小魏写代码

吴恩达AI系列第一课:教你如何利用AI创建一个披萨店客服

CodeBuddy

Cloud Cloud Studio 人工智能、

我是如何参与 Apache Calcite 社区并成为 Committer 的

LakeShen

大数据 开源 Apache Calcite apache 社区 Calcite

软件测试学习笔记丨Docker网络模式与Docker-compose介绍

测试人

软件测试 测试开发

苹果上架App被拒绝的原因

华为云携十大系统性创新亮相巴塞罗那 打造最适合AI的基础设施

华为云开发者联盟

云计算 AI 华为云 华为云开发者联盟

unsubscribe:Angular 项目中常见场景以及是否需要 unsubscribe

OpenTiny社区

前端 angular

遇见您的私人法律顾问:智能法律大模型,智能解答您的法律困惑

汀丶人工智能

人工智能 智能问答 法律大模型

干货 | 如何通过度量研发效能,多角度洞察百人敏捷团队的价值交付?

思码逸研发效能

怎样建立健康的绩效管理体系?聊聊专家看到的误区与疑问

思码逸研发效能

如何评价OpenAi发布的视频生成模型Sora?

算法的秘密

深入解析 Java 面向对象编程与类属性应用

伤感汤姆布利柏

Java js java

AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验

汀丶人工智能

大模型 智能标注 RLHF

都说了别用BeanUtils.copyProperties,这不翻车了吧

不在线第一只蜗牛

Java 数据库 后端 Java后端

金三银四,聊一聊测试跳槽/面试的必备技能

霍格沃兹测试开发学社

深圳企业要知道的:堡垒机就选行云管家!

行云管家

网络安全 堡垒机

CertiK CSO Dr. Kang Li 确认出席Hack .Summit() 香港区块链盛会

TechubNews

火山引擎“数据飞轮”助力教育行业持续优化产品

极客天地

Databend 开源周报第 133 期

Databend

Stable Diffusion解析:探寻AI绘画背后的科技神秘

极限实验室

GAN model AI绘画 Diffusion Stable Diffusion

NFT支持的ICO开发:开创众筹的未来

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

等保测评与合规性检查定义以及区别简单了解

行云管家

等级保护 等保测评 合规性检查

智能护航:人工智能引领软件测试新革命

测吧(北京)科技有限公司

测试

如何确保团队协作中,项目Node版本的一致性?

秃头小帅oi

node.js 团队协作 低代码

小程序框架(概念、工作原理、发展及应用)

天津汇柏科技有限公司

小程序开发 定制软件开发 软件开发定制

软件测试学习笔记丨Docker容器镜像制作

测试人

软件测试 测试开发

产品更新 | 如何利用思码逸DevInsight 度量代码评审效率、质量与瓶颈?

思码逸研发效能

Martin Fowler阐述“牺牲的架构”_架构_Savita Pahuja_InfoQ精选文章