HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Joshua Kerievsky:要“软件工艺”还是要“足够用的设计”

  • 2010-05-30
  • 本文字数:2337 字

    阅读完需:约 8 分钟

在过去的一段时间里,“软件工艺”在不断地被热议。 针对软件工艺运动所强烈崇尚的“代码必须时刻保持干净”的信仰,Joshua Kerievsky 提出了另一种可能从反方向审视的视角,他称之为“足够用的设计”。在此我们将探究 Joshua 的想法,并听一听 Bob Martin 和 Ron Jeffries 对此的评价。

Kerievsky 首先讲述了他遇到的问题,然后表示会发表一系列关于“足够用的设计”的文章。

…有些程序员坚持软件的每一段代码的设计质量都应该尽可能地高。“不能生产干净的代码就称不上软件匠人”…

这个建议的初衷是好的。我们中的很多人都见过被沉重的技术债拖垮的项目。

然而,软件工匠的观点并没有考虑到一个简单的经济学:如果你花时间去雕琢那些对用户价值不高的代码,你就是在浪费时间和金钱。

事实上,有些代码并不需要非常卓越的设计,比如一些实验性的代码,或者不重要的特性。

Joshua 接下来讲述了一个发生在他自己的开发团队中的故事:应用程序中的 Action 类的 processWith 方法按照基类的约定,应该返回字符串类型的值,但是其中一个 Action 不需要返回值,因此他们决定让 Action 直接返回 null。这就带来了一个设计上的坏味道。这段有问题的代码就这样存在了很多年,期间还团队还尝试过重构代码将它移除,但没有成功,它依然存在。Joshua 说,这段问题代码并有影响到他的团队。他非常肯定,这个问题并没有阻碍他的团队的开发进度,因此花时间去处理这个问题并不明智,还不如把时间用于开发更重要的特性上。这个故事的寓意是:

对于关键的部分,我们需要高质量的设计,反之,可以放低对质量的要求。

今天,软件设计质量的艺术是这样定义的,它取决于个人或者团队能否根据特性的重要程度来调整设计的表盘,从而创造人们喜爱又能赚钱的产品。

对于软件质量,没有放之四海皆准的方法。

如果你个“新特性瘾君子”,总是不断地增加新特性,而不对软件的设计多做些思考的话,那么在发布 4.0 版的时候就会被技术债拖垮了。

如果你是个“质量瘾君子”,那么就会对所有事情都过度设计。

精益遇到工艺时,就有了“足够用的设计”。

最近一直引领着“软件工艺运动”的 Bob 大叔(Bob Martin)很快给出了回复,可能令所有人惊讶的是,他竟然也支持 Joshua 的结论

在我看来,Josh 的行为正说明他是一个十足的软件工匠。他担心过那些软件工匠们应该担心的事情。他也做出了软件工匠们应该做出的务实的决定。他没有在系统中尚残留着大量糟糕设计的时候,就急着去实现下一个特性。相反,他非常在乎他的代码。

Martin 还继而澄清了他的立场,“软件工艺”传达的并不是“要么完美,要么完蛋”的二元选择,就像 Joshua 已经暗示的那样:

软件工匠们首先是实用主义者。他们对高质量代码的嗅觉非常灵敏;但是他们也不会为了追求完美而严重地牺牲经济利益。

Ron Jeffries 也发表了类似的观点。他也一直在积极倡导保持编程成果清晰干净。Ron 的文章可以浓缩为两句话:第一,设计债是“迟早都要还的”;第二,我们应该努力让自己的有能力干得又快又好

如果你以牺牲质量换速度,那么从长期质量来看,欠下的债总是要还的。

从另一角度来看,如果那时我们自身比现在更优秀,就不必通过牺牲质量来换速度了。我们需要提高。但是不能一口吃成胖子:今天我们暂时通过牺牲质量来换取速度。但是应该在墙上写下:

如果牺牲质量能让我们更快一些的话,那么这就清楚地表明我们还有很大的空间有待提升,以更快的速度交付更好的软件。

不久之后,Kerievsky 又发表了该系列的第二篇文章(正如他表示过的,会有很多),这一次他更加直率地表示,有时候“足够用”就意味着不必把某些事情做得足够好。他讲了另一个发生在 Industrial Logic 开发团队的故事,这次的主角是一个“巨型类”,它出现在实现“播放列表”功能的代码中。播放列表特性包含在 eLearning 的一次重要发布中:

经过不断地使用播放列表,并且对使用数据进行分析,一年以后我们知道:

  • 我们的用户的确在使用播放列表。
  • 还没有用户抱怨过播放列表。
  • 用户并没有像极力称赞其他一些特性那样,称赞播放列表。
  • 在销售的时候,当听到播放列表将来会针对一些特定的主题提供一个具有时效性的信息列表后,未来潜在的用户表现得很有兴趣。

那么,我们不要不花钱去解决播放列表中存在的设计问题呢?

不。

原因如下:

  • 没有新行为:在过去的一年里,我们没有添加或者改变原来的播放列表的任何行为。
  • 不用改变代码:在过去的一年里,我们只在 UserLibrary(播放列表设计债的主要来源)中做了少量的修改,这些变化也不会影响到播放列表的功能。
  • 问题被隔离了:尽管播放列表的设计很糟,但是它被隔离了,并没有渗入到过去一年中其它新特性的开发中。

播放列表只是取悦我们最大的客户的一份甜点而已。

这个特性确实有用,但是它并不属于产品开发的关键部件。

在播放列表中的代码坏味道,比如“巨型类”和“复杂的条件判断”,并没有让我们的开发慢下来。

我们管理质量的出发点是:

如果我们决定给用户一个更加完善的播放列表功能,那么在开始以前,我们会无怨无悔地偿清设计债的。

Joshua 解释说,当未来的特性牵涉到播放列表时再来解决这些问题,他并不觉得很麻烦。这种信心从大的方面讲是由于他的团队的能力和严格遵守的 TDD,另一方面也是因为他明白并接受这一点:有时候低质量也是可接受的,有时候表盘也要调节到高质量档。他总结道:

这一年来我们对播放列表的代码满意吗?

由于我们没有对它投入必要以外的时间和金钱,对此我们很满意。

我们乐于让设计变得更干净,但是要等到正确的时间。

这就是“足够用的设计”。

你怎样想?Joshua 的建议能够被普遍接受吗?你用类似的方法在自己的项目中取得成功了吗?还是失败了?进一步的讨论还需要再考虑哪些因素?

查看英文原文: Joshua Kerievsky Introduces “Sufficient Design” To The Craftsmanship Discussion

2010-05-30 19:421690
用户头像

发布了 53 篇内容, 共 13.5 次阅读, 收获喜欢 2 次。

关注

评论

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

微短剧市场暴涨267.65%,用微短剧场景AUI Kit精巧入局

阿里云视频云

云计算 视频云 微短剧

入选人民网2023普惠金融优秀案例,合合信息旗下启信宝赋能银行对公信贷数字化转型

合合技术团队

银行 数字化 合合信息 启信宝

“全球金牌课程”2024年3月9-10日 · CSM认证在线周末班【提前报名特惠】CST导师亲授

ShineScrum捷行

敏捷教练 ScrumMaster ScrumMaster认证

持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项

HarmonyOS开发者

HarmonyOS

如何规避云服务宕机现象?

天翼云开发者社区

云计算 服务器 云服务

存储程序和程序控制:开发经验分享及操作过程详解

天翼云开发者社区

存储 数据存储

Terraform 的开源替代:OpenTofu 宣布 GA!

SEAL安全

开源 Terraform OpenTofu

PingCAP上榜工信微报年度回顾《2023 年工业和信息化发展情况》 三大具有国际影响力的开源社区之一

PingCAP

数据库 开源 分布式 数字化 TiDB

大模型如何改变传统教学方式?《AI赋能教学实践》新课上线

飞桨PaddlePaddle

人工智能 深度学习

BOE(京东方)供货荣耀Magic6系列 定义柔性OLED低功耗全新标准

科技热闻

存储结构的种类与比较

天翼云开发者社区

数据 存储结构

TiDB 在全球头部物流企业计费管理系统的应用实践

PingCAP

数据库 开源 分布式 TiDB 物流系统

首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB × 杭州银行

PingCAP

数据库 开源 云原生 TiDB 银行业

极狐 GitLab 冷知识:使用 git push 创建 Merge Request

极狐GitLab

抖音APP如何实现用户生命周期提升

字节跳动数据平台

大数据 A/B测试 企业号 1 月 PK 榜 对比试验 数字化增长

懋嘉信息加入飞桨技术伙伴计划,通过大模型助力人力管理智能化

飞桨PaddlePaddle

人工智能 深度学习 文心大模型

GaussDB(for MySQL) RegionlessDB发布:全球数据库技术

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(for MySQL)

PingCAP 受邀参加 FICC 2023,获 Open100 世纪全球开源贡献奖

PingCAP

数据库 开源 分布式 TiDB pingCAP

交易所做市机器人与去中心化做市机器人

区块链技术

“领导企业转型必修课” 3月23-24日敏捷领导力(CAL / ALJ)认证周末班【新年特惠】

ShineScrum捷行

领导力 组织转型 业务敏捷 高管教练 敏捷领导力

神州数码集团荣获“TiDB 社区最佳贡献企业”

PingCAP

数据库 开源 TiDB

面试官:实际工作中哪里用到了自定义注解?

王磊

Java 面试

企业为什么要进行数字化转型?七大原因

天津汇柏科技有限公司

数字化转型

Mixtral 8X7B MoE模型基于阿里云人工智能平台PAI实践合集

阿里云大数据AI技术

观测云产品更新 | 日志、场景仪表板、监控器等

观测云

可视化图表

加入openEuler训练营,一起探索开源世界的无限可能!

科技热闻

持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项

HarmonyOS SDK

HarmonyOS

QEMU组件安装来啦

小齐写代码

软件测试/测试开发/全日制/测试管理丨Web自动化测试价值与体系

测试人

软件测试

使用存储过程自动化分区管理 Zabbix MySQL(8) 数据库中的大表;

瀚中子🤩

Joshua Kerievsky:要“软件工艺”还是要“足够用的设计”_Java_Mike Bria_InfoQ精选文章