Go项目架构选择:AI编程时代的思考
AI编程时代的架构选择:哪种更适合你
在AI辅助编程成为主流的今天,选择什么样的架构变得更重要了。AI生成的代码质量参差不齐,好的架构能让AI犯错时有迹可循,坏的架构会让AI的错误像病毒一样扩散。分享一下我的思考。
先说说AI编程的特点
AI擅长什么
- 生成模板代码,比如CRUD操作
- 补全重复性逻辑
- 按照明确需求实现功能
- 重构代码,优化结构
AI不擅长什么
- 理解复杂的业务领域
- 处理跨模块的依赖关系
- 保证全局一致性
- 做架构层面的权衡
这意味着:架构要能限制AI的影响范围,让错误不会扩散到整个系统。
三种架构在AI编程下的表现
分层架构
src/
├── models/ # AI生成数据模型
├── controllers/ # AI生成接口
├── services/ # AI生成业务逻辑
└── repositories/ # AI生成数据访问
AI编程体验
- ✅ AI很熟悉这种结构,生成的代码质量高
- ✅ 提示词简单:“写一个用户管理的service”
- ✅ AI能快速生成完整的CRUD流程
- ❌ AI容易在不同层之间产生不一致
- ❌ 业务逻辑分散,AI难以维护全局规则
- ❌ 改一个字段可能要改4个文件,AI容易漏改
实际案例
让AI修改用户状态逻辑:
我:把用户状态从active/inactive改成enabled/disabled/deleted
AI:好的,我改了model和service...
问题:忘了改controller的返回值和repository的查询条件
分层架构下,AI要同时维护多个文件的一致性,很容易出错。
模块化架构
src/
├── user/
│ ├── model.go
│ ├── service.go
│ ├── repository.go
│ └── handler.go
└── order/
├── model.go
├── service.go
├── repository.go
└── handler.go
AI编程体验
- ✅ 模块内聚,AI可以独立处理每个模块
- ✅ 提示词更清晰:“在user模块里添加登录功能”
- ✅ AI的影响范围被限制在单个模块
- ✅ 模块间通过接口交互,AI不需要理解全局
- ❌ 模块间依赖关系,AI可能理解错误
- ❌ 跨模块的功能,AI需要人工指导
实际案例
让AI在user模块添加功能:
我:在user模块添加用户积分功能
AI:好的,我在user/model.go添加了积分字段,
在user/service.go添加了积分计算逻辑...
成功:所有改动都在user目录下,AI没有漏掉任何地方
模块化架构下,AI的工作范围明确,出错概率低。
DDD架构
src/
├── domain/ # 领域层:AI需要理解业务
│ ├── user/entity.go
│ └── order/entity.go
├── infrastructure/ # 基础设施:AI生成技术代码
│ └── persistence/
├── application/ # 应用层:AI编排用例
│ └── service/
└── interface/ # 接口层:AI生成API
└── http/
AI编程体验
- ✅ 业务逻辑集中在领域层,AI不容易散乱
- ✅ 充血模型让AI把行为和数据放在一起
- ✅ 技术代码和业务代码分离,AI可以分而治之
- ❌ AI很难理解领域驱动设计的概念
- ❌ 需要大量提示词教育AI什么是领域模型
- ❌ 实体、值对象、聚合等概念,AI经常用错
实际案例
让AI实现业务规则:
我:订单金额超过1000元需要审批
AI(分层架构):我在service里加个判断...
问题:其他地方也可能创建订单,这个规则会被绕过
AI(DDD架构):我在Order实体里加CanApprove()方法...
成功:所有创建订单的地方都要经过实体,规则不会被绕过
DDD架构下,业务规则集中,但需要教育AI理解充血模型。
哪种架构更适合AI编程
模块化架构最推荐
原因
- 边界清晰:AI的工作范围被限制在单个模块,不会到处乱改
- 上下文集中:相关代码都在一个目录,AI更容易理解
- 独立性强:每个模块可以单独让AI处理,互不干扰
- 易于review:改动集中在一个模块,人工review效率高
最佳实践
让AI工作在模块级别:
"在payment模块添加退款功能"
"在notification模块添加短信发送"
"在user模块修改密码加密方式"
而不是:
"修改系统中的密码逻辑"(AI不知道要改哪些文件)
DDD架构需要更多指导
什么时候用
- 业务规则复杂且重要
- 愿意花时间教育AI
- 有能力review AI的领域模型
如何让AI更好工作
提示词示例:
这是一个DDD项目。请遵循以下规则:
1. 业务逻辑必须在实体内部,不要写在service
2. 实体要有行为方法,不要只有getter/setter
3. 改业务规则时,先改domain层
现在请在Order实体里添加退款逻辑...
分层架构适合快速原型
什么时候用
- 快速验证想法
- AI生成一次性代码
- 后续会重构
注意事项
- 让AI一次生成完整的CRUD,不要分步骤
- 改动时让AI改所有相关文件,并明确列出文件名
- 定期review,防止不一致性积累
AI编程的架构原则
无论选哪种架构,在AI编程时代都要遵循:
1. 高内聚低耦合
AI理解模块边界比理解分散代码容易得多。
2. 明确的依赖方向
单向依赖让AI知道代码应该往哪里写。
3. 一致的命名规范
AI依赖上下文,一致的命名能让AI推断出正确的模式。
4. 最小化跨模块依赖
AI处理跨模块逻辑时容易出错,尽量让模块独立。
5. 清晰的接口边界
通过接口隔离模块,AI只需要知道接口,不需要知道实现。
实战建议
小项目(< 5人)
推荐:分层架构
- AI生成快
- 结构简单
- 后期可以重构
中型项目(5-20人)
推荐:模块化架构
- AI可以按模块工作
- 改动范围可控
- 易于团队协作
大型项目(> 20人)
推荐:模块化 + 部分DDD
- 核心业务用DDD,保护关键逻辑
- 周边功能用模块化,提高效率
- 让AI处理技术代码,人处理领域模型
几个AI编程的坑
让AI改架构
AI适合改代码,不适合改架构。架构决策要人来定,AI来执行。
过度依赖AI生成
AI生成的代码要review,特别是跨模块的依赖。
不给AI足够的上下文
“添加登录功能” vs “在user模块添加基于JWT的登录功能”,后者效果更好。
忽略测试
AI生成的代码更容易有bug,测试是必须的,最好也让AI生成测试。
总结
在AI编程时代,模块化架构是最佳选择:
- 边界清晰,AI不会乱改
- 上下文集中,AI容易理解
- 独立性强,易于并行开发
- Review效率高,改动可追溯
如果你正在用AI辅助编程,建议从模块化架构开始。它既不像分层架构那样散乱,也不像DDD那样复杂,是AI编程的最佳平衡点。
有问题欢迎讨论。