软件开发是一个年轻的行业,我们仍在学习有效开发软件的技术和构建工具。我已经参与这项活动三十多年了,在过去的二十年里,我一直在这个网站上撰写关于模式和实践的文章,这些模式和实践使构建有用的软件变得更容易。该网站最初是我个人写作的地方,但我也用它来发表同事的文章。

2000 年,我加入了 Thoughtworks,我的职责是学习我们为客户交付软件的技术,并将这些技术传递给更广泛的软件行业。随着该网站发展成为一个受人尊敬的软件开发平台,我编辑和发表了我的同事(包括 Thoughtworks 员工和其他人员)的文章,以帮助有用的文章接触到更广泛的受众。

photo of Martin Fowler

照片:Christopher Ferguson

Martin Fowler

一个关于有效构建软件的网站

如果说在我的工作和网站写作中有一个贯穿始终的主题,那就是向敏捷思维的转变与使敏捷软件开发切实可行的技术模式和实践之间的相互作用。虽然我们行业的技术细节变化很快,但基本的实践和模式却更加稳定。因此,撰写关于这些主题的文章使我能够在这个网站上发表几年前的文章,这些文章至今仍然具有与撰写时一样的相关性。

随着软件对现代企业变得越来越重要,软件需要能够快速响应变化,允许快速构思、开发和投入生产新功能。敏捷软件开发技术始于 20 世纪 90 年代,并在过去十年中越来越受欢迎。它们专注于灵活的计划方法,允许软件产品随着用户需求的变化和产品经理对如何提高用户效率的了解而改变方向。虽然敏捷方法现在已被广泛接受,但它们并不容易,需要团队具备大量技能,更重要的是,需要团队内部以及团队与其合作伙伴之间建立开放协作的文化。

这种对变化做出流畅响应的需求对软件系统的架构有重要影响。软件的构建方式需要能够适应功能的意外变化。实现这一目标的最重要方法之一是编写清晰的代码,使其易于理解程序应该做什么。这些代码应该分成模块,允许开发人员只了解他们需要修改的系统部分。这个生产代码应该得到自动化测试的支持,这些测试可以检测出在进行更改时出现的任何错误,同时提供如何使用内部结构的示例。大型和复杂的软件工作可能会发现微服务架构风格有助于团队部署具有较少依赖关系的软件。

创建具有良好架构的软件不是一蹴而就的。就像好的散文一样,它需要定期修改,因为程序员需要更多地了解产品需要做什么以及如何最好地设计产品来实现其目标。重构是一种允许安全更改程序的基本技术。它包括进行小的更改,这些更改不会改变软件的可观察行为。通过组合许多小的更改,开发人员可以修改软件的结构,以支持在系统最初构思时未计划的重大修改。

仅在开发人员的机器上运行的软件不会为软件的客户提供价值。传统上,发布软件是一个漫长而复杂的过程,阻碍了快速发展软件的需求。持续交付使用自动化和协作工作流来消除这一瓶颈,允许团队根据客户的需求频繁发布软件。为了使持续交付成为可能,我们需要建立坚实的测试基础,并进行一系列自动化测试,让我们确信我们的更改没有引入任何错误。这导致我们将测试集成到编程中,这可以起到改善我们架构的作用。

照片流

加州大苏尔

数据管理

世上有各种各样的软件,我主要从事的是企业应用程序。在这个领域,我们需要解决的一个持久问题是数据管理。我在这里关注的数据管理方面是如何在应用程序响应不断变化的需求时迁移数据存储,如何应对大型企业中的不同环境,NoSQL 数据库的作用,以及如何处理大而混乱的数据的更广泛问题。

领域特定语言

复杂软件系统中的一个常见问题是如何以程序员既容易操作又容易与领域专家沟通的方式捕获复杂的领域逻辑。领域特定语言 (DSL) 为特定问题创建自定义语言,可以使用自定义解析器或主机语言中的约定。

书籍

我写了七本关于软件开发的书,包括《重构》、《企业应用架构模式》和《UML精粹》。我还是 Addison-Wesley 出版社一个签名系列的编辑,该系列包括五本荣获震撼奖的书籍。

我的书籍页面...

会议演讲

我经常被邀请在会议上演讲,由此我推断我是一个非常好的演讲者——这很讽刺,因为我真的讨厌演讲。你可以通过观看我的一些会议演讲视频来形成你对我演讲的看法。

我的视频页面...

桌游

我一直是桌游的爱好者,我喜欢那种能让我全神贯注的游戏,在享受朋友陪伴的同时,暂时清除所有严肃的想法。现代桌游在 20 世纪 90 年代随着欧式游戏的兴起而得到了巨大的改进,我相信许多人如果没有尝试过任何新一代的游戏都会感到惊讶。我也经常出现在Heavy Cardboard上。

我的桌游页面...

标签

API 设计 · 敏捷 · 敏捷采用 · 分析模式 · 应用程序架构 · 应用程序集成 · 坏事 · 桌游 · 构建脚本 · 认证 · 协作 · 计算机历史 · 会议小组 · 会议 · 持续交付 · 新冠肺炎 · 数据分析 · 数据库 · 设计 · 词典 · 分布式计算杂志 · 消遣 · 多样性 · 文档 · 领域驱动设计 · 领域特定语言 · 国内 · 封装 · 企业架构 · 估算 · 事件架构 · 演进式设计 · 经验报告 · 说明性架构 · 极限编程 · 前端 · 小工具 · 生成式人工智能 · ieeeSoftware · 信息卡 · 互联网文化 · 采访 · 语言特性 · 语言工作台 · 精益 · 遗留系统改造 · 法律 · 指标 · 微服务 · 移动 · noSQL · 对象协作设计 · 解析器生成器 · 摄影 · 平台 · 播客 · 热门 · 演示技巧 · 隐私 · 过程理论 · 生产力 · 编程环境 · 编程风格 · 项目计划 · 招聘 · 重构 · 重构边界 · 需求分析 · Ruby · 安全 · 演讲视频 · 团队环境 · 团队组织 · 技术债务 · 技术领导力 · 测试类别 · 测试 · Thoughtworks · 工具 · 旅行 · UML · 版本控制 · Web 开发 · Web 服务 · 网站 · 写作

2024 · 2023 · 2022 · 2021 · 2020 · 2019 · 2018 · 2017 · 2016 · 2015 · 2014 · 2013 · 2012 · 2011 · 2010 · 2009 · 2008 · 2007 · 2006 · 2005 · 2004 · 2003 · 2002 · 2001 · 2000 · 1999 · 1998 · 1997 · 1996

所有内容

近期更新

如果您想在我发布新内容时收到通知,请订阅我的 RSS推特Mastodon 订阅源。我还有一个专门介绍近期更新的页面。


加入领英

2024 年 3 月 28 日星期四 美国东部时间下午 12:26

随着推特继续“去马斯克化”,我越来越多地听到更多人使用领英来了解新的专业资料。因此,几周前,我开设了我的领英帐户,以便人们可以在该平台上关注我。

更多...


告别 John Kordyback

2024 年 3 月 27 日星期三 美国东部时间下午 12:48

我们珍爱的同事和朋友 John Kordyback 于上周去世,享年 64 岁。

更多…


揭示大型机中的接缝以进行增量现代化

2024 年 3 月 26 日星期二 美国东部时间上午 9:32

大型机系统继续运行着世界上大部分的计算工作负载,但通常很难添加新功能来支持不断增长的业务需求。此外,使它们难以增强的架构挑战也使它们难以替换。为了降低所涉及的风险,我们使用增量方法来替代遗留系统,逐步用现代技术的实现来替换遗留功能。这种策略要求我们将接缝引入大型机系统:我们可以将逻辑流转移到更新服务的点。在最近的一个项目中,Alessio FerriTom Coggrave 研究了几种将这些接缝引入到一个长期存在的大型机系统中的方法。

更多…


《重构》开篇章节的代码示例

2024年3月15日,星期五,美国东部时间上午11:04

时不时地会有人问我要我在《重构》开篇章节中使用的代码副本,这样他们就可以自己跟着学习。我有一些不提供此代码的理由,特别是懒惰。幸运的是,Emily Bache 比我更有奉献精神,她在 GitHub 上建立了一个代码库——Theatrical Players 重构 Kata——其中包含代码和足够的测试,可以合理地进行重构。

然而,该代码库的作用远不止于此,因为它还包含了十几种语言的类似示例代码,包括 C、Java、Rust 和 Python。

她最近在她的YouTube 频道上发布了一个视频,概述了她为什么鼓励人们在阅读该章节时使用此代码。她的频道包含许多关于良好代码技术的视频,并且她有一个Patreon 页面供读者支持她的工作。


通过人为因素衡量开发人员生产力

2024年3月12日,星期二,美国东部时间上午9:36

衡量开发人员的生产力是一项艰巨的挑战。专注于开发周期时间和吞吐量的传统指标是有限的,而且对于从哪里寻找其他方法也没有明显的答案。定性指标提供了一种强大的方法,可以使用来自开发人员自身的数据来衡量和理解开发人员的生产力。Abi NodaTim Cochran 在他们的讨论开始时解释了什么是定性指标,以及为什么我们不应该因为它们是主观的或不可靠的而拒绝它们。

更多…


如果我们每天轮换结对编程伙伴会怎样?

2024年3月6日,星期三,美国东部时间上午10:33

在结对编程时,频繁轮换结对伙伴非常重要,但许多进行结对编程的组织都不愿意这样做。Gabriel RobainaKieran Murphy 提出了一个问题:“如果我们每天轮换结对伙伴会怎样?”,并与三个团队一起进行了一项每日轮换结对伙伴的练习。他们开发了一种轻量级的方法,帮助团队反思结对编程的好处和挑战,以及如何解决这些挑战。最初的恐惧被克服了,团队发现了频繁轮换结对伙伴的好处。他们了解到,频繁交换结对伙伴可以大大增强结对编程的好处。他们的文章分享了他们开发的方法、他们的观察结果,以及参与团队成员分享的一些常见的恐惧和见解。

更多…