AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

阐释设计质量

  • 2007-04-12
  • 本文字数:1472 字

    阅读完需:约 5 分钟

一个良好的设计是优雅而简练的——但优雅与否则是由观察者来决定的。在《 The Art of Agile Development(敏捷开发的艺术)》一书中,James Shore 否定了这个深奥的观点,他为设计质量下了一个非常具体的定义:“一个良好的软件设计在最小化软件的创建、修改和维护时间的同时,保证了运行性能。”

对于软件设计,这是一个相当非传统的观点——实际上,在我们讨论设计的时候,会马上映入我们脑海的系统内部组件的组织形式、类层级关系和其它所有传统观念,它都没有牵扯到。

为了深入阐述这个观点,Shore 考察了编程语言的演化和目前 Ruby 炙手可热的原因:

事实上,我们的电脑运行速度非常快,而现代编程语言实际上是在浪费计算资源。在优化编译器的帮助下,C 语言可以和汇编相媲美。而 C++ 则加入了虚方法表(Virtual Method Lookups)……每个方法四个字节,并引入一层额外的间接调用。Java 和 C#则引入了完全的中间语言,运行于常规机器之上的虚拟机上。而 Ruby,则在每次调用的时候解释整个程序!

太浪费了!

为什么 Ruby 在存在这样的性能损耗的情况下还能大行其道?为什么 Java 和 C#取得了如此的成功?它们在引入损耗之余还带来了什么,使损耗显得物有所值?我们为什么不都用 C 语言编程?

随后 Shore 主张,良好的设计(并非仅仅是软件设计)是“是折衷方案带来的效益最大化的一门艺术”。这也直接引出了上述对设计发人深省的阐释:“一个良好的软件设计在最小化软件的创建、修改和维护时间的同时,保证了运行性能。”

如果良好的设计依赖于软件的创建和修改,那么 _ 优秀 _ 的设计又是什么呢?

将良好的设计和维护的便捷等同起来并不是什么新鲜的说法,但用这种方式阐述则引出了以下有趣结论:

  1. 设计质量是人群敏感(people-sensitive)的。

如果良好设计的目标是最小化软件的开发时间,那么一群熟悉 Java 的程序员很容易构建并维护的应用可以被视为一个良好的设计。但同一个应用在 C++ 程序员眼里就成了一个拙劣的设计了。对于使用不同语言编写并维护代码的程序员来说,同一个设计的质量是不同的。

  1. 设计质量是和变更相关(change-specific)的。

设计质量和变更相关,这一说法也不外乎旧瓶装新酒。好在这个新的定义并没有颠覆我们已知的内容——它仅仅是在上面的一个补充。关于这个方面,有两种常见方法能使得设计具备更高质量:用诸如设计模式的工具来进行泛化,并运用测试和重构来辅助变更。谈到这个权衡问题,可以参考对 Eric Gamma 的一个采访,非常有启示意义。

  1. 软件的修改和维护时间比创建时间更为重要。

这也是老生常谈的话题了。我们都知道,用在应用程序维护的时间远比其创建时间长得多。此外,在迭代式开发中,在程序初始创建过程内伴随着代码的修改,而对于这个问题我们有非常多的理由来关注它。

  1. 设计质量是无法预测的。

按照以上的定义,质量和开发软件的团队是紧密相关的。随着团队发生改变和发展,设计的质量也相应改变。因此,它是无法预测的。实际上你只有在测试和修改的过程中才能了解一个设计的好坏。

那么,这又有多大用处呢?如果我们不能预测一个设计好坏与否,那么这个定义能给我们带来什么样的好处?Naur 提出了“像建立理论一样编程”的主张,认为代码中存在着一种“理论”。如果我们将这个主张和提出的定义联系起来,如果你理解这个理论,那么你可以轻而易举地更改代码。而理解了代码的“理论”也减少了第4 点提到的不可预测性。假如随着开发团队的发展,我们不断维持设计的理论,那么我们就可以维持设计的质量。

Shore这本书的草稿目前开放给公众审阅。通过将设计质量与构建和维护软件的人们联系起来,他给我们带来了一个发人深省的软件质量定义。

2007-04-12 20:001124
用户头像

发布了 117 篇内容, 共 17.6 次阅读, 收获喜欢 0 次。

关注

评论

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

数字化转型之数字资产知识库(springboot+es+vue+neo4j)

金陵老街

全文检索 知识图谱 Vue 3 spring-boot

如何制定业务的故障分级标准?

华仔

架构实战营 故障定级 故障分级

深度合作 | TDengine + 华为云 Stack 强强联合打造高效物联网时序数据处理解决方案

TDengine

数据库 tdengine 时序数据库

洞见科技当选中国信通院隐私计算联盟「副理事长+政务应用工作组组长」单位

洞见科技

隐私计算

企业知识管理系统应具备的功能

小炮

【直播回顾】战码先锋第五期:深入理解OpenHarmony系统启动,轻松踏上设备软件开发之旅

OpenHarmony开发者

Open Harmony

数据智能基础设施升级窗口将至?看九章云极 DingoDB 如何击破数据痛点

九章云极DataCanvas

人工智能 数据库 数据 数据智能

NFT卡牌盲盒链游系统dapp开发搭建

薇電13242772558

智能合约 NFT

技术分享| 云服务器的使用-nginx的安装及使用

anyRTC开发者

nginx centos 音视频 服务器

Java—线程安全II

武师叔

6月月更

莫把暑假插错秧,代码哪有足球香,Alluxio足球青训营在线摇人!

Alluxio

微软 开源 足球 分布式, CCF开源高校行

一文掌握软件安全必备技术 SAST

SEAL安全

网络安全 软件安全 SAST工具 SAST

还不知道npm私服?一篇教会你搭建私服并发布vue3组件库到nexus

Jianmu

ci 前端 npm Vue3 私服

得物前端唤端业务场景和技术精讲

得物技术

前端 前端教程 等待唤醒 业务场景 前端工具

千亿参数“一口闷”?大模型训练必备四种策略

OneFlow

人工智能 模型训练 策略

天翼云数据中台通过“数字政府智慧中台”评估

极客天地

WebStorm注册码_WebStorm2022年激活永久实测有效

Geek_75f9e9

webstorm

测试基础之:测试覆盖率

甜甜的白桃

软件测试 测试覆盖率 JACOCO 6月月更

洞见科技荣获「最受投资人欢迎的隐私计算服务企业」奖

洞见科技

隐私计算 数据要素

融云首席科学家任杰:数字游民和意识体,疫情将如何影响人类社会进化

融云 RongCloud

Vue-10-class的动态绑定

Python研究所

6月月更

谈谈 JDK 和 SAPMachine 的关系

汪子熙

Java jdk jre SAP 6月月更

开课报名|「Takin开源特训营」第一期来啦!手把手教你搞定全链路压测!

TakinTalks稳定性社区

开源 全链路压测 生产环境全链路压测 安全生产 稳定性保障

谷歌AI人格觉醒“喜提”热搜,我们找清华大佬聊了聊 AI 对话系统的惊人进展

硬科技星球

人工智能 谷歌 图灵测试

JavaScript期约Promise

大熊G

JavaScript 前端 6月月更

java编程培训Mybatis的增删改查与获取参数值

@零度

mybatis JAVA开发

InfoQ 极客传媒 15 周年庆征文|手摸手教你在Windows安装Docker,一定要看到最后

迷彩

Docker 架构 运维 6月月更 InfoQ极客传媒15周年庆

Java项目集成activity工作流,快速开发业务审批单据(低代码,敏捷)

金陵老街

敏捷 springboot Activity Vue 3 BPMN

影响软件公司开发价格的因素有很多,你知道吗?

开源直播系统源码

软件开发流程 直播系统 app源码 直播源码 定制软件开发

市值严重低估,现金15亿,百世走的路对吗?

科技新知

大数据培训flink窗口(Windows)的表现形式

@零度

大数据开发

阐释设计质量_研发效能_Amr Elssamadisy_InfoQ精选文章