写点什么

Martin Fowler 对于“YAGNI:你不会需要它”这一 XP 实践的评论

  • 2015-06-16
  • 本文字数:1270 字

    阅读完需:约 4 分钟

Martin Fowler 是 Thoughtworks 的著名作者和顾问,他在最近的一篇博客文章中描述了YAGNI 实践,分析了它的重要性以及创建“推定特性”(presumptive feature —— 意指某些已经完成编码,但并未投入实际应用的特性)所造成的成本。YAGNI 是“你不会需要它”(You Aren’t Gonna Need It)的缩写,它是一种极限编程(XP)实践,表示程序员不应为目前还不需要的功能编写代码。

XP 的联合创始人 Ron Jeffries 说道:

只在真正需要某些功能的时候才去实现它,而不是仅仅因为你预见到它将出现。

根据 Cunningham & Cunningham 的 wiki 页面所说:

即使你非常确信将来你需要某个特性,也不要现在就去实现它。在很多情况下,你会发现或许最终你不需要它了,或者是你真正所需的特性与你之前预计的有很大的出入。遵循 YAGNI 实践有两个主要原因:

  • 你节约了时间,因为你避免了编写最终证明不必要的代码。
  • 你的代码质量更高了,因为你使代码不必为你的“推测”所污染,而这些“推测”最终可能或多或少有些错误,但此时这些错误已牢牢地依附在你的代码中了。

Martin 说道,当我们在考虑推定特性时,很有可能我们是错的。在这种情况下,推定特性一个很明显的成本就是整个构建过程的成本,也就是对这个在当下没有用处的特性进行分析、编码以及测试所耗费的精力。他同时表示,假设我们对这个需求的理解恰好是正确的,但即使在这种比较理想的情况下,创建这个推定特性同样会带来两种巨大的成本。第一种成本是软件价值的延误成本,第二种成本是延续这一特性所带来的成本。他是这样解释这些成本的:

延误成本:团队本可以将精力投入到那些能够产生实际收益的特性上。

延续成本:为推定特性所编写的代码增加了软件的复杂性,这种复杂性使得对软件的修改与调试变得更加困难了,因而增加了其它特性的成本。这就为特性的开发造成了额外的成本,并且造成了进一步的延误成本,因为将它投入到生产环境的时间变得更长了。

Martin 还表示,如果特性是正确的,但对它的创建有错误,那么这还会导致额外的修复成本。

开发团队总是在不断地进行学习,一方面要学习他们的用户,一方面也要学习软件的代码。他们要对代码中使用的各种工具进行学习,而且这些工具会不断地更新。他们还需要学习这些代码是怎样配合工作的。以上这几点意味着,你很可能意识到:六个月之前所编写的某个特性并不是按照如今你所认识到的正确方式进行编写的。这样一来,你不仅积累了技术债,而且不得不考虑今后对其重写所带来的成本,或是出于困难而采用临时方案所带来的持续性成本。

Martin 说道,YAGNI 不仅适用于大型特性,同样也适用于较小的特性。将大量较小的 YAGNI 决策累积在一起,就能够使代码的复杂性得到很大程度的简化,同时又能够加速交付需求更紧急的特性。

查看英文原文: Martin Fowler on “Yagni: You Are Not Gonna Need IT” XP Practice


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-16 06:142220
用户头像

发布了 428 篇内容, 共 196.6 次阅读, 收获喜欢 39 次。

关注

评论

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

分享一个阿里云轻量级开源前端图编排,流程图js组件——butterfly-dag

InfoQ_39ba186c207f

Java 流程图 flow canvas html/css

有为而治:平衡吞噬世界的系统之熵

IT民工大叔

屏幕共享接入指南

anyRTC开发者

WebRTC 在线教育 直播 RTC

数据挖掘学习指南(转载)

Jackchang234987

数据挖掘 产品经理

MySQL redo与undo日志解析

Simon

MySQL Redo MySQL日志

币期权DAPP 8月28日全球同步耀世上线,掀起币圈追捧热潮

InfoQ_967a83c6d0d7

全民加速节:动态加速在在线教育应用上的最佳实践

阿里云Edge Plus

在线教育 CDN

oeasy教您玩转linux010106这儿都有啥 ls

o

LeetCode题解:155.最小栈,使用两个栈,详细注释

Lee Chen

大前端 LeetCode

【写作群星榜】8.15~8.28 写作平台优秀作者 & 文章排名

InfoQ写作社区官方

写作平台 排行榜 热门活动

柔性电子拥有改变地球的能力吗?

脑极体

软件开发丨关于软件重构的灵魂四问

华为云开发者联盟

软件 开发者 软件开发 代码 软件重构

华为云会议的前世今生

华为云开发者联盟

直播 云服务 华为云 视频编码 视频会议

GrowingIO AWS 成本优化之路

GrowingIO技术专栏

AWS 成本优化

GitMaster 更新v1.9.0,支持Gitea,Gist拥抱黑暗模式

neo

gitlab tree gitee GitHub、

微服务架构下,DLI的部署和运维有何奥秘?

华为云开发者联盟

Docker 大数据 Serverless 数据湖 DLI

开发者的福音,LR.NET模块化代码生成器

Philips

敏捷开发 快速开发 模块化流程 代码质量 .net core

硬核科技:莱克立式吸尘器,引领家居清洁“新态度”

InfoQ_967a83c6d0d7

ShardingSphere简介+实战

云淡风轻

ShardingJDBC

学习Python真的能找到工作吗?

代码制造者

Python 程序员 编程语言 低代码 零代码

mPaaS 客户端证书错误避坑指南

阿里云金融线TAM SRE专家服务团队

CRM企业到底该不该做PaaS?

ToB行业头条

PaaS SaaS CRM

新金融分布式架构之SOFAStack解决方案

阿里云金融线TAM SRE专家服务团队

温故知新——Spring AOP(二)

牛初九

spring aop ioc

“全球+”浪潮下,企业出海选择合适的“技术船舶”成关键

华为云开发者联盟

网络 华为云 企业出海 网络加速 宽带

从6大应用场景,看边缘计算落地生根

BoCloud博云

容器 边缘计算 PaaS 云平台 博云

云原生技术采用增加,全球60%后端开发人员都在使用容器 | 趋势分享

BoCloud博云

云计算 容器 云原生 PaaS 博云

莱卡、宾利都在用,英特尔oneAPI渲染工具带来高质量视觉体验

E科讯

我也没想到 Springboot + Flowable 开发工作流会这么简单

程序员小富

java 14

不得不了解系列之限流

梦朝思夕

限流

涵盖多场景区块链与政务结合 应用前景广阔

CECBC

区块链 互联网 数字政务

Martin Fowler对于“YAGNI:你不会需要它”这一XP实践的评论_文化 & 方法_Savita Pahuja_InfoQ精选文章