张逸解构DDD:软件的核心是为用户解决领域相关的问题(2)

简介: 张逸解构DDD:软件的核心是为用户解决领域相关的问题(2)

问题空间和解空间


哲学家常常会围绕真实世界和理念世界的映射关系探索人类生存的意义,即所谓“两个世界”的哲学思考。软件世界也可一分为二,分为构成描述需求问题的真实世界与获取解决方案的理念世界。整个软件构建的过程,就是从真实世界映射到理念世界的过程。


如果真实世界是复杂的,在映射为理念世界的过程中,就会不断受到复杂度的干扰。根据Allen Newell和Herbert Simon的问题空间理论:“人类是通过在问题空间(problem space)中寻找解决方案来解决问题的”,构建软件(世界)也就是从真实世界中的问题空间寻找解决方案,将其映射为理念世界的解空间(solution space)来满足问题空间的需求。因此,软件系统的构建实则是对问题空间的求解,以获得构成解空间的设计方案,如图所示。


image.png


为什么要在软件构建过程中引入问题空间和解空间


实际上,随着IT技术的发展,软件系统正是在这两个方向不断发展和变化的。在问题空间,我们要解决的问题越来越棘手,空间规模越来越大,因为随着软件技术的发展,许多原本由人来处理的线下流程慢慢被自动化操作所替代,人机交互的方式发生了翻天覆地的变化,IT化的范围变得更加宽广,涉及的领域也越来越多。问题空间的难度与规模直接决定了软件系统的复杂度。


针对软件系统提出的问题,解决方案的推陈出新自然毋庸讳言,无论是技术、工具,还是设计思想与模式,都有了很大变化。解决方案不是从石头里蹦出来的,而必然是为了解决问题而生的。


面对错综复杂的问题,解决方案自然也需要灵活变化。软件开发技术的发展是伴随着复用性和扩展性发展的。倘若问题存在相似性,解决方案就有复用的可能。通过抽象寻找到不同问题的共性时,相同的解决方案也可以运用到不同的问题中。同时,解决方案还需要响应问题的变化,能在变化发生时以最小的修改成本满足需求,同时保障解决方案的新鲜度。无疑,构成解空间的解决方案不仅要解决问题,还要控制软件系统的复杂度。


问题空间需要解空间来应对,解空间自然也不可脱离问题空间而单独存在。对于客户提出的需求,要分清楚什么是问题,什么是解决方案,真正的需求才可能浮现出来。在看清了问题的真相之后,我们才能有据可依地寻找真正能解决问题的解决方案。软件构建过程中的需求分析,实际就是对问题空间的定位与探索。如果在问题空间还是一团迷雾的时候就贸然开始设计,带来的灾难性结果是可想而知的。徐锋认为,“要做好软件需求工作,业务驱动需求思想是核心。传统的需求分析是站在技术视角展开的,关注的是‘方案级需求’;而业务驱动的需求思想则是站在用户视角展6开的,关注的是‘问题级需求’。”



怎么区分方案级需求和问题级需求?方案级需求就好比一个病人到医院看病,不管病情就直接让医生开阿司匹林,而问题级需求则是向医生描述自己身体的症状。病情是医生要解决的问题,处方是医生提供的解决方案。那种站在技术视角展开的需求分析,实际就是没有明确问题空间与解空间的界限。在针对问题空间求解时,必须映射于问题空间定义的问题,如此才能遵循恰如其分的设计原则,在问题空间的上下文约束下寻找合理的解决方案。领域驱动设计为问题空间与解空间提供了不同的设计元模型。对于问题空间,强调运用统一语言来描述需求问题,利用核心子领域、通用子领域与支撑子领域来分解问题空间,如此就可以“揭示什么是重要的以及在何处付出努力”。除去统一语言与子领域,其余设计元模型都将运用于解空间,指导解决方案围绕着“领域”这一核心开展业务系统的战略设计与战术设计。


战略设计和战术设计


对于一个复杂度高的业务系统,过于辽阔的问题空间使得我们无法在深入细节的同时把握系统的全景。既然软件构建的过程就是对问题空间求解的过程,那么面对太多太大的问题,就无法奢求一步求解,需要根据问题的层次进行分解。不同层次的求解目标并不相同:为了把握系统的全景,就需要从宏观层次分析和探索问题空间,获得对等于软件架构的战略设计原则;为了深入业务的细节,则需要从微观层次开展建模活动,并在战略设计原则的指导下做出战术设计决策。这就是领域驱动设计的两个阶段:战略设计阶段和战术设计阶段。


战略设计阶段要从以下两个方面来考量。



  • 问题空间:对问题空间进行合理分解,识别出核心子领域、通用子领域和支撑子领域,并确定各个子领域的目标、边界和建模策略。


  • 解空间:对问题空间进行解决方案的架构映射,通过划分限界上下文,为统一语言提供知识语境,并在其边界内维护领域模型的统一。每个限界上下文的内部有着自己的架构,限界上下文之间的协作关系则通过上下文映射来体现和表达。
相关文章
|
XML 前端开发 Java
深入了解Spring MVC工作流程
深入了解Spring MVC工作流程
|
流计算 Windows
Flink窗口与状态编程开发(一)
Flink窗口与状态编程开发(一)
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:九十、图解大模型核心三大件 — 输入编码、注意力机制与前馈网络层
本文深入解析了大模型三大核心技术:输入编码、多头自注意力机制和前馈网络层,从应用视角阐述了它们的工作原理和协同效应。输入编码负责将文本转换为富含语义和位置信息的数学表示;多头自注意力机制通过多专家团队模式建立全局依赖关系,解决长距离依赖问题;前馈网络层则通过非线性变换进行深度语义消歧。文章通过可视化示例展示了词向量的语义关系建模、注意力权重的分布模式以及前馈网络的语义过滤功能,形象地说明了大模型如何通过这三层架构实现"广泛联系-深度加工"的认知过程。
166 5
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
AI大模型Transformer基础结构
Transformer是2017年提出的基于注意力机制的神经网络,摒弃了传统RNN结构,采用自注意力与多头注意力机制,实现并行化处理和长距离依赖建模。其核心由编码器-解码器架构、位置编码、残差连接和层归一化组成,广泛应用于NLP任务,成为BERT、GPT等模型的基础。
231 0
|
2月前
|
缓存 人工智能 开发者
大模型推理优化实战:从延迟到吞吐的工程权衡
在人工智能从“能用”迈向“好用”的关键阶段,大语言模型(LLM)的部署效率已成为产品落地的核心瓶颈。开发者常面临一个现实困境:模型在实验室跑得飞快,上线后却响应迟缓、成本飙升。本文将深入探讨大模型推理中的关键技术挑战与优化策略,帮助工程师在延迟(Latency)、吞吐量(Throughput)和成本之间找到最佳平衡点。
|
负载均衡 容灾 应用服务中间件
使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群
最近同学出去面试经常会被问到一个问题。 面试官:你说你们公司使用nginx反向代理tornado,部署了多少多少台机器,好像很牛逼的样子,但是我问你,如果主机也就是部署了nginx那台机器并发过大导致宕机了怎么办? 答曰:不考虑带宽峰值的话,比较新的 CPU 跑 nginx 单核每秒能接近 2 万请求,而且nginx如果纯做 HTTP 转发的话,Nginx 的性能高到恐怖,会挂掉很不科学。。。。 面试官:好吧,算你会忽悠,那如果插头被扫地大妈踢掉了怎么办,因为没电导致服务器宕机 答曰:阿里云机房会断电。。。你特么在逗我吧。。
使用Docker-compose搭建nginx-keepalived双机热备来实现高可用nginx集群
|
5月前
|
人工智能 运维 中间件
CTI中间件:现代呼叫中心的核心开发平台
乐科CTI中间件助力企业高效构建智能呼叫中心,集成通信与业务系统,支持多协议、AI融合、高可用部署,广泛应用于客服、营销等场景,降低开发成本,提升运维效率。
|
存储 SQL 缓存
记录一次holo视图与物化视图的区别
本文介绍了Hologres中视图与物化视图的区别及应用场景。视图是一种虚拟表,不存储数据,查询时动态生成结果集,适用于简化查询、数据抽象等场景。物化视图则预先计算并存储查询结果,查询速度快,适合加速查询、离线数据分析等场景。文章通过实例详细说明了两者的使用方式及性能考量,并探讨了如何根据具体需求选择合适的视图类型。
408 16
|
架构师 中间件 API
微服务和 SOA 的 6 大核心区别,你都知道吗?
本文详解SOA与微服务的六大区别,帮助更好地理解和应用这两种架构,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
微服务和 SOA 的 6 大核心区别,你都知道吗?