现在感觉系统架构思维是越发的重要了,随着AI的发展,想要做一个应用的难度是真的大打折扣了,甚至随便一个人加上claude opus4.7或者gpt5.5都能做一个以前需要全栈开发才能做出的应用。
但这里有一个非常关键的点:
AI从某种程度上只是让功能的实现变得容易了,AI很擅长做局部的功能,比如一个登录功能等。 但AI只是让功能变得廉价了而已,如果要让产品真正成立的话需要架构。
一个应用里面往往是很多个功能的集合,这些功能又会存在很多的关系,甚至于很多的流程在一起相互交错,如果只是让AI一个个做功能的话,很容易一个错误带崩一片,最后写出来的东西问题也会比较多,比如:
1.功能各写各的
2.数据模型前后不一致
3.本来可以封装成一个函数的东西重复写了好几次
4.权限边界不清晰
5.一个改动带崩一片
有些人会说模块化编程能减少很多问题,其实我原本也这么一位,但模块化从某种程度上来说也只是在代码层面把东西拆开,还是在形而下的代码层。
没有架构约束的模块化,也只是把混乱拆开了而已,从局部看也许不是很乱,但无法改变整体的乱。
所以问题来了,如何让AI写出更加符合实际业务的程序呢,需要框架的约束。如果说go,tauri,rust,postgresql,ACP协议这些是技术以及技术栈,那技术和技术栈它属于一种形而下的比较好把握的东西,某个具体功能也是一样。但架构属于那种形而上,需要把一个业务抽象成一个个系统,以及一些核心对象,是一个比较抽象的东西,但我们需要用形而上的架构去约束形而下的技术。
AI擅长实现局部功能,但真实应用不是功能堆叠,而是由对象、流程、状态、规则、数据和反馈机制组成的系统。架构在这个时代最大的价值,就是用业务结构去约束AI的局部实现,让每个功能都长在正确的位置上。
一.什么是架构
从定义上,架构是面对复杂需求时,对系统边界;模块关系;数据流;控制流;约束;演化路径做出的关键决策集合。其实我一开始看到这个定义的时候是有点懵的,系统边界是什么,控制流,演化路径又是什么?
但后来我发现,其实不用吧这些词想的太复杂,先抓住一个核心:
架构不是先问某个功能怎么写,而是先问这个系统如何成立。
先搞清楚架构回答的是什么问题:
- 这个系统负责什么,不负责什么
- 这个系统里面有什么核心对象
- 这些对象之间是什么关系
- 数据从哪来又到哪里去
- 谁来调度,谁来决定下一步
- 哪些规则不能破坏
- 未来系统变复杂时,应该朝着什么地方扩展
这些问题听起来很抽象,但它们决定了一个系统未来长什么样,是否能够拥有生命力。
但从根本的角度,或者说架构设计的目的,这里分两种,一种是系统架构,一种是产品架构,产品架构更偏向于用户角度,系统架构更偏向于功能。
1.1 产品架构
产品架构关注的是产品的能力如何组织,产品价值如何成立,用户路径如何闭环。
比如一个学习产品,用户是不是能从不知道学什么,走到“知道目标、获得路径、持续练习、得到反馈、复盘巩固”
1.2 系统架构
系统架构更偏向工程和业务实现,关注为了支撑这些产品的能力,系统内部如何分工,写作,约束和演化。
比如学习者画像模块,知识点模块,推荐模块,测评模块,复盘模块怎么通信,数据由谁拥有,状态由谁改变,哪些行为必须被记录。
并且系统架构往往会有好几种方案,能够说明为什么方案A比方案B要好也是个很重要的能力,并且这往往需要一些更底层的理解。
二.架构应该从需求中来
从需求推导出系统的架构是一个比较重要的能力,我之前做开发往往是在堆砌模块,比如说如果用户的需求是做一个AI学习助手,那我可能会堆上AI答疑,智能路径规划,PDF上传解析,错题本,每日打卡,积分系统,积分商店,社区系统…,但很容易就变成这些功能之间没有稳定的结构或者关系,最后变成了一堆杂烩,每个模块各做各的。
但如果是架构思维的话,往往不会先考虑后端用java还是go,用postgresql还是mysql,用qdrant还是chromdb,而是先分析用户的需求是什么。
用户真正想解决什么问题?
比如用户的需求是我想学的更好,这个例子可能比较宽泛了,甚至可以说是一个很差的prompt,但是可以试着从里面猜一下用户真正的痛点是什么:
1.不知道自己应该学哪些东西
2.不知道自己适合什么样的学习方法
3.学完没有反馈,或者说缺乏正反馈
4.今天学一点,明天忘一点,没有内化形成自己的一套东西
5.不知道哪些课程,文章,资料适合自己
所以用户要的不是一个有社区,有积分系统,有AI答疑的机器人
而是一个可以真正帮助自己解决缺乏正反馈,规划学习路径,推荐学习资源,复盘巩固,个性化的个人操作系统。
这时候系统的核心就不是一个简单的聊天框,而是一个学习闭环
诊断
↓
规划
↓
学习
↓
练习
↓
测评
↓
反馈
↓
复盘
↓
调整路径
接着就可以去推导系统应该具有哪些能力
1.个人画像描绘能力
2.遗忘曲线管理能力
3.反馈调整能力
4.资源推荐能力
5.复盘沉淀能力
...
所以功能不是凭空堆出来的,而是从业务闭环中长出来的。
三.什么是系统思维呢
在开发一个产品时,我们可以把一个业务场景看成一个系统,不止是功能的简单集合,而是一定边界内,由多个对象、关系、规则、流程和反馈机制共同组成,用来完成某个目标的整体。
系统思维相当于一个整体论的方法,不是把业务拆成很多功能,而是识别一个业务场景中的核心对象、关系、事件、状态和规则。
比如说:
- 这个场景有哪些长期存在的对象
- 对象之间有什么关系
- 事情如何流动
- 状态如何变化
- 哪些规则不能被破坏
- 异常情况下系统应该如何处理
或者我觉得这个方法有点像第一性原理,先把事物拆到基本的主要构成部分,但系统思维不止是拆分,更强调对象之间如何连接、事件如何流动、状态如何变化,以及这些东西组合起来会涌现
比如说一个外面平台,如果只看功能的话,我们会看到:
搜索店铺
浏览菜品
加入购物车
下单
支付
配送
评价
但使用系统思维,我们就能超出功能,看到更底层的对象与对象之间的关系。
在整体论中有一个思想是:整体大于部分之和,而整体大于部分之和的那个部分就叫做涌现。
怎么理解呢,比如单独一个神经元是没有意识的,但几百亿个神经元组合在一起就能够形成意识。那在什么时候会出现涌现,组成的部分足够多,且组成部分的联系足够多的时候。
通过系统思维尝试看清这个外卖形态的组成部分之间的联系,我们就能够看到如下内容。
用户创建订单
订单包含彩票
订单绑定商家
订单触发支付
订单进入配送
配送分配骑手
订单完成后产生评价
异常情况下订单可能会退款,取消,超时或投诉
所以可以得到外卖系统的核心对象清单有
- 用户
- 商家
- 菜品
- 订单
- 支付
- 骑手
- 评价
- 退款
- 投诉
其中可以判断出最为关键的其实是订单,因为订单把用户,商家,菜品,支付,配送,评价都连接了起来
功能思维看到的是:
我要做下单功能
系统思维看到的是:
订单是连接用户,商家,支付,配送,评价的核心对象,下单功能只是生命周期中的一个阶段
当然不只是对象,还有事件
当然这里就可以联系到DDD也就是Domain-Driven design领域驱动设计
四.DDD(Domain-Driven design领域驱动设计)
DDD 的核心不是某个框架,也不是某种固定代码结构,而是让软件系统尽可能贴近业务本身。它要求我们不要一上来就思考数据库表、接口、页面和技术栈,而是先建立一套业务语言。
从字义看,领域驱动的设计,要求你对产品涉及到的领域的业务足够的了解,从这个领域的业务来推动产品的设计。
领域驱动设计的第一步一般就是把角色,对象和事件例举出来,而这个把事件例举出来的过程也叫做事件风暴
有些人会比较疑惑,事件风暴不就是把事件一个个例举出来吗?
其实如果更准确的说,DDD不是简单的列举角色、对象和事件,而是通过业务语言建立领域模型。事件风暴是DDD中常用的一种建模方法,通过梳理发生了什么事件,来帮助我们发现业务对象、状态变化、规则,命令和边界。
比如在外卖系统里,我们不要一开始就说:
order_table
payment_service
delivery_controller
这些是技术我们应该先说:
用户创建订单。
订单包含菜品。
订单需要支付。
支付成功后订单进入待配送。
配送系统分配骑手。
骑手接单后开始配送。
订单送达后进入已完成状态。
订单完成后用户可以评价。
异常情况下订单可以取消、退款、投诉。
这些句子看起来很普通,但它们其实已经描述了系统骨架。
其中有:
- 角色:用户、商家、骑手、平台管理员。
- 对象:订单、菜品、支付、配送、评价、退款、投诉。
- 命令:创建订单、支付订单、取消订单、申请退款、分配骑手、提交评价。
- 事件:订单已创建、支付已完成、骑手已接单、订单已送达、退款已发起。
- 状态:待支付、待配送、配送中、已完成、已取消、退款中、已退款。
- 规则:未支付的订单不能配送,已完成的订单不能随意取消,退款需要满足条件。
- 边界:支付系统不应该直接修改评价,评价系统也不应该直接修改配送状态。
这就是 DDD 对 AI 编程特别重要的地方。
AI 很容易写出一个“能跑”的功能,但它不一定知道这个功能在业务世界里的位置。
如果你只对 AI 说:
帮我写一个订单接口。
它很可能直接生成一套 CRUD:新增订单、删除订单、修改订单、查询订单。
但真实业务里的订单不是一个普通数据表。订单有生命周期,有状态流转,有权限限制,有异常处理,有和支付、配送、评价、退款之间的关系。
所以更好的提示方式是:
订单是外卖系统的核心聚合。它有创建、支付、取消、配送、完成、退款等状态。订单状态只能通过明确的业务命令和业务事件改变。支付系统只能触发支付成功事件,配送系统只能触发配送状态事件,评价系统只能在订单完成后创建评价。任何模块都不能绕过订单生命周期直接修改订单状态。
DDD 的价值,不是让代码变复杂,而是让系统拥有稳定的业务骨架。