Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

伴随简单而生的复杂

  • 2008 年 7 月 05 日
  • 本文字数:1824 字

    阅读完需:约 6 分钟

大多数敏捷实践都非常重视简单。XP强调做最简单的事情,只要够用就行。然而,要想做到简单却并不容易,有多种原因会让事情变得更加复杂。敏捷社区的众多成员们讨论了“简单”这个概念,并试图解释为什么想让事情保持简单如此困难。

敏捷强调简单,却总是带来复杂。在一个有趣的帖子中,作者试图揭示该现象背后的原因。他引用了管理科学的最新议题

很多软件设计者有意创建具有不必要复杂性的产品,以拓展自己的职业发展空间,而不是为了更好地为公司和客户服务。 ……

能力强的设计者为了证明自己的才能,会选择不易实现的设计;而能力稍差的设计者因为不想让别人知道自己没有才能,会选择高难度的设计。这是 Siemsen 教授的结论。

对于将事情复杂化的倾向, George Ambler 提到一个类似的原因

由于想把事情做得更多、更快,我们花费了太多时间,将我们的生活复杂化了。想把某事做得正确,时间似乎老是不够用,可却总有时间把它再做一遍!考虑到管理技术的复杂性,我们总是喜欢将复杂的解决方案视为更好的。

社区其他成员认为:大家有时为了图省事,才会考虑简单,这反而会带来复杂性。Damon W. Carr 在他的 blog 中,质疑敏捷运动是不是把简单强调得过头了。他问道:

敏捷爱好者们好像患上了严重的“简单强迫症”,极力避免各种开发流程和形式,无论其必要与否。不经意间,团队已将优秀面向对象设计的常识抛在脑后,只是做“够用就好”的事情。在这条路上,敏捷运动是不是走的太远了?

Damon 觉得:由于敏捷过分强调可以工作的软件,很多开发人员选择忽略可维护性、可扩展性、代码重用、内部健壮性、组件使用等这些重要的方面。

有些人认为,对于简单与复杂的判断是很主观的。一个人认为简单的事情,另一个人可能会觉得很复杂。 Andrew Johnston 说道

简单性和复杂性都是相对而言的,一个人觉得简单的东西,换个角度来看可能就意味着复杂。好比一只鸭子在水面上优雅地滑行,而它的脚蹼却在水下做着复杂而卖力的摆动。

那到底什么是“简单”?又该如何理解“简单”呢? Brad Appleton 他的博客上提到,他对“简单”做了很多研究,最后得到了如下结论:

我觉得,要说“简单”可能是“简明易懂”的,嗯,这没什么问题;但是要真正理解“简单”却是非常困难的!

Brad 认为:系统开发中的简单,意味着要有整体的观念,同时还要能够知道重点何在,而且要知道重点部分对系统其他部分的影响。他强调:真正的简单,是要将整体的复杂性管理起来并尽量将其降到最低的。Brad 提到,虽然业界已经在简单上投入了大量精力,然而围绕着它还是有很多神话。他列举出了一些有助于理解简单的言论:

“简单”并不等同于“易于实施 / 和理解”——要想搞懂更为简单的解决方案,团队可能需要学习新的知识,同时要接纳新的想法。

“简单”并不等同于“足够好”——简单的解决方案也许还不够用。它也许可以暂时满足目前的要求,但是需要进一步改善。

“简单”并不等同于“单纯”——单纯可能只是错误的表象。一个解决方案可能看起来很简单,但是仅仅看起来简单还不够,它必须可以发挥应有的作用。

实现某个要求的简单方式,从全局来看不一定简单——试图简化系统的某个部分,有可能使得系统其他部分更加复杂。要从全局的观点来观察系统。

综上所述,看来在“简单”的周围,有相当多的“复杂”环伺。关键在于要力图澄清围绕着简单的神话,而且要避免“复杂的解决方案更优秀”这样的认知。

查看英文原文: The Complexity Around Simplicity


在 infoq 英文站的新闻后,读者 Jim Leonardo 这样评论:

“简单”并不是“第一时间浮现在脑海中的、可以工作的解决方案”。 实际上,要产生简单的解决方案要比复杂方案花费更多的功夫。必须要把所有的佐料放到锅里,再精心烹制,才能做出简单的菜肴。所以经常要用多个迭代才能产生达到这个境界。正如文中指出的,要搞清楚想让什么变得简单。是要让编码变简单?还是使用简单?或是扩展简单、维护起来简单?

使用简单最不容易在众人之间达成一致,特别是涉及到 UI 的时候。扩展简单与维护简单通常连在一起。这些都需要更多的编码工作,但并不是说自动会让编码变得更复杂。

另一名读者 Frederic Monjo 建议读者去阅读 John Maeda “The laws of Simplicity”这本书,其中谈到了如何做到简单的产品设计,但同时提出了一些关于简单的原则和概念。虽然这些原则不是直接用于软件开发的,但可能会激发读者对简单的思考。例如,本文中也提到了一个原则:简单与复杂相生相伴。它们都是相对而言的,必须要同时考虑这二者,并让它们各归其位。

2008 年 7 月 05 日 00:52430
用户头像

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

关注

评论

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

架构实战营作业2

冷酷小绵羊

知乎万赞回答:程序员面试为什么被要求造航母,而工作拧螺丝?

Java架构师迁哥

未来已来,HarmonyOS 开发者日全记录

清秋

华为 开发 物联网 新闻 HarmonyOS

浅谈JVM和垃圾回收

SH的全栈笔记

Java JVM JVM虚拟机原理 垃圾回收算法

最新分享:如何避免线程安全的坑?看这一篇就够了

学Java关注我

Java 编程 程序员 架构 计算机

简单了解InnoDB底层原理

SH的全栈笔记

MySQL 数据库 innodb

浅谈在探索数分之路上的“数据思维”论述

小飞象@木木自由

数据分析 数据分析体系 数据思维 数据分析方法论

斗智亦斗棋,零售云市场的“楚河汉界”突围赛

脑极体

这个GItHub上的Java项目开源了 2021最全的Java架构面试复习指南

比伯

Java 编程 架构 面试 程序人生

【全球年青人召集令】Hello World,Hello 2050

阿里巴巴云原生

容器 开发者 云原生 活动

计算机原理学习笔记 Day10

穿过生命散发芬芳

计算机原理 4月日更

深入理解Java虚拟机-HotSpot

华章IT

Java JVM 虚拟机

为什么我愿意持续做这样一件看似没有价值的事情

leoay

坚持 持续写作 长期价值

不为人知的网络编程(十二):彻底搞懂TCP协议层的KeepAlive保活机制

JackJiang

TCP 即时通讯 IM

架构实战营模块1作业指导

华仔

#架构实战营

百度大脑3月新品推荐:EasyDL视频目标追踪全新发布

百度大脑

百度大脑 EasyDL

融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系

Apache Flink

flink

GitHub面试题库+阿里巴巴2021年Java岗面试26大核心专题,成功助我砍下7家大厂Offer

Java架构追梦

Java 阿里巴巴 架构 面试

如何提高Linux水平

cdhqyj

Linux free 命令

一个大红包

linux命令 4月日更

开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?

阿里巴巴云原生

Java 微服务 云原生 中间件 API

欢迎参与 KubeVela 官方文档翻译活动

阿里巴巴云原生

容器 云原生 开发工具 OAM 资源调度

推进智慧城市建设 博睿数据亮相长三角城市数字化转型高峰论坛

博睿数据

数字化转型高峰论坛

翻译:《实用的Python编程》09_03_Distribution

codists

Python

Flink中的状态编程

大数据技术指南

flink 4月日更

趣题与算法(1)

Anderson O.yang

方寸之间,书写天地

石云升

4月日更 1 周年盛典 我和写作平台的故事 InfoQ 写作平台 1 周年

使用Agora SDK开发React Native视频通话App

声网

RTC React Native 声网 RTE

奇绩创坛2021秋季创业营开始报名

奇绩创坛

Flink的基石

五分钟学大数据

flink 4月日更

如何在云中构建数字核心

浪潮云

云计算

GPU容器虚拟化:用户态和内核态的技术和实践详解

GPU容器虚拟化:用户态和内核态的技术和实践详解

伴随简单而生的复杂_敏捷_Vikas Hazrati_InfoQ精选文章