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设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
随机推荐
- .NET 认识日志系统-2
.NET 日志系统2 上一篇文章是将日志打印到控制台,这篇文章将日志写入到文本文件中. 文本日志一般按照日期区分 如何避免文本日志把磁盘撑爆? 限制日志总个数或者总大小 如何避免一个日志文件太大? 限 ...
- linux常见终端命令和一些小问题的解决
此文章为linux常见终端命令汇总和一些小问题的解决方法,会不定期更新. [常见指令] 1. 误按 Ctrl+s 锁住终端. ubuntu16命令行误按 Ctrl + s 导致终端锁定,Ctrl + ...
- VulnHub-DC-7渗透流程
DC-7 kali:192.168.157.131 靶机:192.168.157.151 信息收集 nmap -sV -A -p- 192.168.157.151 虽然有robots.txt等敏感文件 ...
- Java常见问题-多线程
现在有 T1.T2.T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行? 这个多线程问题比较简单,可以用 join 方法实现. 在 Java 中 Lock 接口比 ...
- yb课堂之高并发项目必备利器之分布式缓存和本地缓存 《十九》
什么是缓存? 程序经常要调用的对象存储在内存中,方便其使用时可以快速调用,不必去数据库或者其他持久化设备中查询,主要就是提高性能 DNS.前端缓存.代理服务器缓存Nginx.应用程序缓存(本地缓存.分 ...
- 洛谷P3009
#include<iostream> #include<utility> using namespace std; typedef long long ll; #define ...
- linux 查看crontab任务执行情况
首先创建一个定时任务,例如: */1 * * * * /usr/bin/curl http://******/admin/Keeperclock/keeper >> /data/wwwro ...
- AT_abc180_d 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读. 题目简述 现有 \(STR\) 和 \(EXP\) 两个变量,初始化分别为 \(X\) 和 \( ...
- C# RSA加密解密及RSA签名和验证
1.RSA加密解密 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上读取密钥 (2)加密 (3)解密 2.RSA签名和验证 (1)获取密钥,这里是产生密钥,实际应用中可以从各种存储介质上 ...
- Week 0
Day 0 我8:00与lsh前往济南,在大约11:40左右抵达济南高铁站. 等高铁期间,我在庞大的济南高铁站中找到了我心心念念的而DY却没有的赛百味三明治,买了27的西式火腿三明治和34的香烤牛肉三 ...