软件设计复杂程度化解之

责任编辑简述了一类与此相反钢架(Scaffolding)和显露(Emergence)的系统升级换代方式。她们采用了三个关键性准则,但她们所做的基础改变则是与此相反采取一类名叫显露的方式并导入钢架基本概念:

  • 她们著眼于销售业务市场需求,因此不再精心安排商品相关人士,即使她们通常只是销售业务方的中间人。她们宣称,顾客的市场需求常常是突然显露的,而且人们极难认知那些市场需求,因此她们更愿达成一致两个基本思路的一致意见,并协力积极探索下一步棋该做什么才有象征意义。
  • 她们从两个稳定状态逐渐行进到下两个稳定状态。在这种做的操作过程中,她们作出了一连串允诺,向着期许的方向行进,因此如果结果不平庸,她们也有能力调整或暂停脚步。那些稳定状态使她们能Etah并交货具有销售业务商业价值的下两个稳定状态。
  • 她们希望利用钢架来快速自学和交货操作过程。除了全力支持交货操作过程外,她们还想尽办法构筑科学知识架构,即使这种做也是有协助的。重点不但是控制技术,还是科学知识。

亲吻显露方式让她们能以协同的方式积极探索暗藏的市场需求。与此相反,她们在这里不会增设有权利的商品相关人士,而是试著间接地处理销售业务市场需求并从销售业务方的视角积极探索她们的市场需求。销售业务商业价值能是间接地的或间接地的。间接地是指它是销售或服务项目的一部分,间接地向顾客收费项目。间接地微观上,销售业务商业价值可能充分体现在快速交货或全力支持公司所提供服务项目的保护组织工作上。间接地与销售业务方沟通交流能协助她们积极探索具体的销售业务商业价值类别和销售业务收益。

采用钢架不但让她们能更快交货,它还让她们能延后对难题域的隐式科学知识的合作开发组织工作。在我看来,这种科学知识钢架非常管用,让她们有时间深入细致了解那些与实例示例的难题域相关的下层控制技术和串行。

她们认为那些实践对其他合作开发项目也很管用、有相应的商业价值。她们将这种组织工作方式的各个方面视为对其他一些方式(如连续架构)的补充。

显露

人们对显露基本概念不怎么熟悉,但在基本微观上,她们需要宣称她们一开始并不是什么都知道的。只有通过互动和积极探索,她们才能了解哪些东西才是管用的,这就是她们所说的显露。虽然市场需求可能是显露出来的,但她们常常会对自己想要什么东西和/或她们想要行进的方向有一些想法和判断,它们能用来增设指导性的约束。

如果拿它与首先定义一组市场需求的传统方式对比的话:后者定义的市场需求通常与此相反一连串未经证实的假设,因此可能是不正确的,也可能是不完整的。确实,在开始写代码之前,她们的确需要知道自己正在构筑什么东西。因此,她们需要能弥合那些差距,同时仍然允许顾客在合作开发操作过程中显露之前未明确的市场需求。那些市场需求只有通过对系统的实际采用操作过程才能明确下来。

她们需要在开始合作开发组织工作之前就有两个完整的基本概念,其具体内容需要根据情况具体分析。有一句老话是,有了明确的定义,难题就解决了一半。精益有一类完整工具包的理念,说的是在所有相关信息和材料可用之前不开始任务。

隐性科学知识能自然获取,而显性科学知识需要人们隐性地认知和应用才行。因此,所有科学知识要么是隐性的,要么植根于隐性科学知识。完全显性的科学知识是不存在的。

她们也能从市场需求的视角来看待这一点。我认为有三种类别的科学知识能映射到 Cynefin 所说的清晰、复杂和非常复杂的领域。它们分别是:

  • 已知的科学知识,或已知有人认知的科学知识
  • 尚不清楚的内容,或已知还没人了解的内容
  • 还没被发现的未知数

有些人会说,已知的科学知识应该是易于处理因此很容易解释清楚的,但即使在这里也需要谨慎小心。我记得有一次,我正在合作开发两个新的卡片结算系统,当时她们需要处理列入黑名单的卡片。她们的假设是一张卡片要么被列入黑名单,要么不在黑名单上。但她们被告知当前系统可能会返回是否或者可能是,没有人能解释最后这一条是怎么来的。她们错误地假设这个难题是非常清晰明了的,但它其实是两个复杂的难题,解决起来既费时又费钱。

她们在解决第二种市场需求——已知还没有人了解的内容——方面有着大量经验,你可能会说很多敏捷实践能协助表达那些市场需求,相关实践(例如创新游戏)在这里也是很管用的。大体上就是这种情况,迭代合作开发也很管用,即使它使她们能清晰地表达那些元素并将它们融合在一起。

当处理不明确的市场需求或还没人发现的未知数时,挑战就来了。如果她们不知道某些东西是未知的,那么她们就需要一类方式来处理它们的显露操作过程;这是传统合作开发方式难以应对的难题。她们还需要宣称,实现需要明确的市场需求,即使她们需要有两个方式或解决方案的大纲,这种才能编写代码。在这里,她们看到了 Cynefin 临界状态的商业价值所在。在这种状态下,她们对各种选项持开放态度,积极探索哪些东西才是管用的,只有在她们达成一致一致意见后才投入合作开发组织工作。在实践中,她们发现顾客常常从她们的视角很清楚她们要求什么,但她们需要明确一些事情来确认实现的情况,并在作出允诺之前取得一致意见。这不但需要对市场需求作出确认,而且明确了全力支持完成这个定义的市场需求。

与此相关的是,她们对界面有着好奇心,但并不会一门心思放在界面上面,即使她们的重心是放在功能领域上,这也是销售业务重点。钢架在这里可能会有些用途,它能提供需要观察的预定自然边界。功能区域可能成为难题域,但这不是提前定好的。

从交货的视角来看,她们会参与很多小块的组织工作,那些组织工作都能协助她们积极探索系统架构和需要全力支持的功能。那些都是商业价值步骤,她们还会采用史诗(epic),即使敏捷社区认知那些基本概念并提供了合适的粒度级别。那些组织工作由很多合适的故事和任务组成。两个故事可能是查看两个全力支持所需功能要用到的特定界面,她们还要宣称这两者可能会随着时间的推移而发展,而她们几乎无法预测它们的发展方向。史诗的两个例子可能是对系统的监控,那些不一定是关于功能方面的,也可能包含非功能元素。

在故事级别,她们可能会积极探索很多提供某些功能或能力的选项。她们想的是以低成本和快速的方式积极探索它,从而实现商业价值。她们不会将其加载到特性本身中,即使她们希望在允诺将其添加到史诗之前充分了解如何全力支持和交货它。这种以来,系统架构在每一步棋都会不断积极探索和完善,每一步棋都是两个稳定状态,能让商业价值得到提升。

这种她们就不需要在前期事无巨细地做规划,同时能著眼于对销售业务有商业价值的内容,并对市场需求保持开放的态度。她们不会维持大量积压,这也有助于确定优先级,让销售业务真正敏捷起来,并对那些未曾预料到的顾客市场需求负起责任。

钢架

为了全力支持采用显露方式,她们还采用了钢架,它有助于引导系统并提供最开始的稳定性。有很多不同类别的钢架可用,但在高层次上,它们能是内部的或外部的,临时性的或永久性的。内部钢架通常会提供两个结构让你在其上构筑。根据定义,钢架可能成为结构的一部分,因此本质上是永久性的。外部钢架常常会约束系统,但全力支持系统向下两个稳定状态移动。但由于它是外部的,因此通常是临时的。从长远来看,它常常会变成多余的部分,即使内部结构能自己全力支持自己。

人们通常会认为钢架只是让你推迟组织工作的东西,但经常被忽视的是钢架允许她们推迟科学知识积极探索操作过程,即使它已经包含了领域科学知识的编码。这里说的不但仅是关于她们如何构筑的科学知识,而且还有间接地的销售业务科学知识,让她们不需要再花时间来获取它们。如果是这种情况,那么她们能利用它来尽早交货销售业务商业价值,而无需提前了解销售业务领域(她们正在推迟这个操作过程并留出时间来合作开发隐性科学知识)。

她们还能采用钢架来绑定或桥接系统的各个元素。在这里,她们能采用一些能以合适的规范结构交换信息的现成工具,即使它们比某些常见格式更有效。那些会成为系统的组成部分因此是长期存在的。

此外,钢架允许在交货周期的早期集成核心元素,从而全力支持对已作出的任何假设的积极探索操作过程。结合与此相反主干的合作开发操作过程,这意味着每个更改都会以整体方式进行隐式评估,因此她们不需要隐式集成测试。

这里的钢架是很多开源实现的集合,那些实现是与此相反对高级销售业务市场需求的简单功能分解和下层控制技术领域的适当抽象级别选择出来的。与此相反,这意味着她们不需要对销售业务市场需求进行详细或广泛的分析,因此常常能从与销售业务方的简短对话中获得足够的信息。

一旦她们对销售业务市场需求有了基本的了解,她们就能查看那些全力支持引导系统的选项。这可能还需要多个组件;她们可能会找到一些解决特定销售业务市场需求的代码,但仍然可能需要一类存储和管理数据的方式。

她们在选择选项时的关键性点(这里先不管语言偏好)是难题域的适当抽象级别,这又回到了钢架科学知识这个点上。她们需要简单直观的界面,以避免合作开发隐性领域科学知识的市场需求,除非她们已经有了这种市场需求。在她们熟悉特定功能(例如数据表示)的情况下,她们能采用它来指导控制技术或代码库的初始选择操作过程。

案例实例——KNX 监控

这个案例实例要求合作开发两个KNX监控系统,该系统可用于呈现和分析安装中部署的所有设备。KNX 是二进制协议,定义了那些全力支持自动化和监控家庭和办公室所有元素的 ISO 标准。在这个案例中,她们有两个基本的功能分解架构,使她们认知她们想要发展的方向,但这里缺少各种领域科学知识。定下来的大体方向是,她们需要从部署中收集和呈现指标,然后发出警报,最后形成循环,让指标能引发动作。她们还需要全力支持大规模扩展,即使可能会有大量部署。

那些功能都是针对这个场景的,因此在其他案例中,你也需要经历类似的操作过程。值得注意的是,那些功能领域是从讨论中总结出来的,是随着时间的推移而确定并显露出来的。她们并没有打算进行长期或详细的分析,而是在她们确定了初始特性和第两个商业价值步骤后立即开始行进。那些初始特性包括了收集和演示,即使它们提供了所需的可见性并涵盖了大多数控制技术难题,例如连接性、设备事件的收集和演示。随着时间的推移建立的关键性能力总结如下:

  • 集合——与此相反多个位置的线程和 KNXETS 文件的集成,因此设备类别是已知的因此能映射。
  • 演示——构成安装的设备和组的事件、指标和状态的可视化。
  • 处理——分析事件并根据条件发出警报。
  • 代理——发送警报以全力支持动作并自动执行系统中的动作。

基本的钢架全力支持是通过利用两个开源实现来完成的,这个实现用于 KNXDPT(数据点类别)元素和主要的数据存储和处理操作过程。如果出现了销售业务或性能难题,那些元素能在以后更换掉。她们还采用了事件溯源方式,确保所有事件都能被捕获。这不但全力支持了可观察性,还确保她们能重新创建所需的任何特定视图,从而推迟特定的设计决策。

在开源方面,她们主要对 MIT 许可感兴趣,即使它提供了灵活性。但她们也愿利用 Apache 许可来隔离不太可能需要更改的部分。这里的想法是在短时间内构筑系统架构,同时降低关于 KNX 的复杂程度及其设备和组地址结构的自学成本。她们通过用于数据收集和处理的 Influx TICK 堆栈对此做了补充。随着时间的推移,她们能切换堆栈的元素或在它们成为约束时重新编码它们,但核心堆栈每秒能处理几千个事件,因此她们看到典型的 KNX 部署每小时处理 800-1000 个事件。这意味着两个位置的当前速率平均低于每秒两个事件。

如上所述,她们没有一开始就预先定义一连串市场需求,而是以允许自学的协同方式积极探索那些市场需求。她们与此相反史诗构筑了 WoE(参与方式),那些史诗是一些短期组织工作(几天到一周),用于交货一些新特性。那些特性反映了顾客的市场需求,这也意味着她们能考虑新的市场需求,也能让顾客在下一步棋合作开发组织工作之前就体验系统。这本质上是迭代的,意味着合作开发组织工作始终著眼于需要的东西。它还让她们能自学正在采用的堆栈和库的科学知识,目前来说这种做法是很有效的。

那些实践不必纯粹是功能性的,两个例子是对安装好的连接的监控和恢复组织工作。基本的史诗涵盖了出错连接的恢复组织工作,但她们添加了两个挂起连接的故事来解决她们观察到的状态。解决这个难题意味着系统在很大程度上是自我修复的,因此在很大程度上是自动运行的。

她们还简化了代码和测试方式,采用主/主干(现在通常称为主)分支合作开发模型,因此当她们进行特性合作开发时,每天都会提交和测试所有代码。如果需要,她们能采用特性切换来限制某个特性的采用,但那些通常是附加的市场需求。她们用特性切换来全力支持从 InfluxDB V1 到 V2 的迁移操作过程。

总结

她们相信,她们积极探索出来的全力支持显露和钢架的实践对系统交货操作过程具有普遍的适用性。围绕显露的实践避免了对正式要求的市场需求,并提供了一类简单的组织工作方式和与顾客互动的方式。采用钢架通过开源方式解决控制技术市场需求,意味着她们最初不需要深入细致了解 KNX 控制技术,这间接地转化为早期的销售业务收益。这意味着当销售业务市场需求变得更清晰时,她们既能节省时间,又能响应销售业务市场需求。

参考

  • Cynefin架构
  • 钢架的Cynefin类别

作者介绍:

Greg Brougham 是一位经验丰富的合作开发人员、架构师和控制技术领导者。近年来,他一直担任一家区块链初创公司的工程总监,并为一家电信公司的数字化转型计划定义了架构。他还写了一本关于 Cynefin 复杂程度架构的小著作,因此他在时间允许的情况下仍然很喜欢编写代码。

了解更多软件设计与相关领域科学知识,点击访问 InfoQ 官网:https://www.infoq.cn/,获取更多精彩内容!