DDD是软件工程的第一性原理?
本文书接上回《DDD建模后写代码的正确姿势》,关注公众号(老肖想当外语大佬)获取信息:
最新文章更新;
DDD框架源码(.NET、Java双平台);
加群畅聊,建模分析、技术实现交流;
视频和直播在B站。
前提
本文需要以系列前文的逻辑链条和结论为前提,如果没有阅读过前文的,可以阅读合集《老肖的领域驱动设计之路》。
故事背景
在2020年,我所在的研发团队维护着一个有近十年历史的SaaS软件系统,而这个系统又是整个公司的主营业务,用户活跃度非常高。当时我们面临的最大挑战就是系统迭代速度远远无法应付客户需求,每次迭代发布都是如履薄冰,我们对系统已经到了完全失控的边缘。
彼时的我,对于领域驱动设计的认知,并不通透,只是隐约感觉DDD能够帮助我们走出这个泥潭,我们非常渴求改变,但缺乏确定性的验证,对于如何改变并走向成功,我们并无把握,甚至我们连如何衡量是否成功,都无法定义出来。在这样的背景下,我们仍然积极地为作出改变做准备:
我们对自己的客户和业务有比较充分的了解,技术甚至跟着产品经理一起去拜访客户
我们打造了一套定制的开发框架(也就是现在DDD框架的早期原型),以更准确地用代码表达业务
常言道,机会是给有准备的人的,很快这个机会就来了。
一个改变一切的目标
2020年9月,在公司CEO的领导下,我们成立了独立项目组,目标是从零开始,重新打造一套新的SaaS系统,以替换旧的系统,而新系统的核心目标是“保持系统持续的快速迭代”,对你没看错,新系统的核心目标,甚至与产品功能、商业指标没有直接关系。
后来,我们一致认为这个目标,是我们关于软件工程和领域驱动设计的认知质变的起点,它把改变了我们在需求分析、产品设计、系统架构时的核心决策依据,即“可维护性是最重要的事”,这就使得我们在行进过程中,很多决策都与以往有所不同,甚至是相反的。
可以说,这个目标,改变了一切。

有什么不同之处
我相信,大家肯定都会有担忧,把“保持系统持续的快速迭代”作为首要目标,那么商业层面就不考虑了吗?其实并不是这样的,实际上这是一个“既要也要”的要求:
要保持系统持续的快速迭代
要满足客户需求

与过去不同的地方是当客户需求与可维护性冲突时,我们怎么决策:
过去:选择满足客户
现状:选择保持可维护性

我们认为这个转变意味着,整个公司的决策逻辑,从短期拓展到长期,追求更长期的利益价值,愿意放弃短期利益,而最考验团队的,就是我们是否真的可以拿到“可维护性”这个长期利益。
DDD是正解
如果大家有读过之前《关于领域驱动设计,大家都理解错了》一文,应该还记得我们关于复杂度的认知:
系统复杂度与元素的数量和元素的关系有关;
元素的关系对系统复杂度的影响远远大于元素的数量所产生的影响;

因此,我们认为要掌控系统的可维护性,就必须实行分而治之的策略,将复杂度限定在一个个有限的范围内,这个逻辑正好与领域驱动设计的理念不谋而合:

于是,我们在这个由CEO发起的战略级项目中,开启了一段神奇的领域驱动设计落地实践之旅,为了确保最终结果符合预期,我们甚至建立了一条“不准跨域”军规,当然本文重点是推导DDD与软件工程之间的关系,关于“不准跨域”的故事,可以到这里查看:
【DDD落地的铁律军规 - 产品研发都得遵守-哔哩哔哩】 https://b23.tv/ukX0uIx
项目的现状
现今已经到了2024年的后半年,也就是说上述的项目,已经经历了大约四年发展和迭代,中途我本人也因为个人的一些因素离开了团队,最近我特地向朋友了解项目的近况,他也是项目的核心架构师之一,得到了肯定的答复:
项目目前仍保持较好的可维护性,迭代没有陷入过去那种困局
中间也经历过做一些不太符合长期利益的需求
可维护性是靠团队不断坚守业务、模型、代码边界清晰和一致性获得的
业务、模型边界清晰不意味着与满足需求对立
再看看目前我自己所带领的团队,经历半年时间把一个项目从失控边缘拯救回来,发展到目前与业务保持一致,迭代维护不再有畏惧和负担感的状态。种种迹象都表明,领域驱动设计是至关重要的。
第一性原理
对于确定不迭代的系统,意味着可维护性的意义就不那么重要了,对于科研类或者其它领域的软件,可能要解决的更重要的问题是“技术难题”等其它维度的问题。
回归到主题,我一直在思考“DDD是软件工程的第一性原理?”这个问题,过往的这些经历,越发让我坚信这一点,但如果让结论更加严谨,需要限定条件如下:
软件系统是长期迭代的
软件系统是业务向的系统
在这样的背景下,那么标题的答案是肯定的:DDD是软件工程的第一性原理!

后续
如果你认同本文的推导逻辑和观点,那么我相信你一定会期望了解如何掌握DDD,下一期,我们将讲述学习和实践DDD的最佳路径。
DDD是软件工程的第一性原理?的更多相关文章
- .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构
阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可 ...
- [2019BUAA软件工程]结对作业
Tips Link 作业链接 [2019BUAA软件工程]结对作业 GitHub地址 WordChain PSP表格 psp2.1 预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 ...
- 【转载】DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...
- DDD精彩
MS STST 这难度太高了 有一个就很难的了 也许我工作的环境一般,能把SOLID简要描述一下的,都还没有遇到 SOLID还只属于OOD层次,OOA层面就更加没碰到了 Scrip 因为领域驱动设计的 ...
- DDD分层架构的三种模式
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识. DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高 ...
- DDD:架构思想的旧瓶新酒
DDD.DSL 和 DCI DDD 概念最早提出于 2004 年,作为一种软件开发的指导思想,DDD 对软件开发带来了诸多可能与方向,张晓龙认为 DDD 为软件开发带来的好处主要有以下几点: 首先,最 ...
- DCI架构是如何解决DDD战术建模缺点的?
摘要:将DCI架构总结成一句话就是:领域对象(Object)在不同的场景(Context)中扮演(Cast)不同的角色(Role),角色之间通过交互(Interactive)来完成具体的业务逻辑. 本 ...
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
随机推荐
- Sql Server中Cross Apply关键字的使用
Sql Server中Cross Apply关键字的使用 前言 在写一个业务的时候,有1列数据如下: 车牌号 湘A00001/湘G00001 湘A00002/湘G00002 湘A00003/湘G000 ...
- C#/.NET这些实用的技巧和知识点你都知道吗?
前言 今天大姚给大家分享一些C#/.NET中的实用的技巧和知识点,它们可以帮助我们提升代码质量和编程效率,希望可以帮助到有需要的同学. .NET使用CsvHelper快速读取和写入CSV文件 本文主要 ...
- Yuno loves sqrt technology I 题解
申明:由于本人卡常技艺不佳,本题解复杂度正确但无法通过 首先分块,然后考虑分开计算贡献维护,看下面一张图: 我们将贡献拆分为 \(ans(A) + ans(B) + ans(C) + ans(AB) ...
- mac 安装homebrew 报443
描述 macOS安装Homebrew时总是报错(Failed to connect to raw.githubusercontent.com port 443: Connection refused) ...
- axios和AJAX的区别
axios和ajax的区别 Axios和Ajax都是用于处理网络请求和与服务器进行通信的技术,但它们之间存在一些关键的区别:12 一.技术基础:Ajax(Asynchronous JavaScript ...
- 《探索Python Requests中的代理应用与实践》
requests加代理 高匿API代理 此处使用的小象代理:1元100个,便宜,可以购买尝试加下代理 存活期1到2分钟 import time import requests from lxml im ...
- jQuery 插件autocomplete 应用
项目中有时会用到自动补全查询,就像Google搜索框.淘宝商品搜索功能,输入汉字或字母,则以该汉字或字母开头的相关条目会显示出来供用户选择, autocomplete插件就是完成这样的功能. auto ...
- locust多进程实现分布式压测遇到的问题
多进程分布式的实现: locust分布式时,需借助命令locust 一个一个启动worker,在使用中有点繁琐, 下面借助于多进程,按既定worker数量,一键启动: from locust impo ...
- 解锁 SQL Server 2022的时间序列数据功能
解锁 SQL Server 2022的时间序列数据功能 SQL Server2022在处理时间序列数据时,SQL Server 提供了一些优化和功能,比如 DATE_BUCKET 函数.窗口函数(如 ...
- python变量 方法 属性
python变量 方法 属性 所有成员中,只有普通变量/字段/属性的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通变量/字段/属性.而其他的成员,则都是保存在类中,即:无论对象的多 ...