代码都是 AI 写的,为什么 AI 时代反而更需要架构设计?
现在有一种越来越流行的观点:
代码都可以让 AI 写了,系统没必要再做那么复杂的分层。反正 AI 写的代码,AI 自己也能理解。
这个观点听起来很有道理。
既然写代码的主体正在从人逐渐变成 AI,那么过去为了方便程序员阅读、维护和协作而设计的软件架构,似乎也应该被弱化。甚至有人认为,未来的代码只要能运行就够了,至于 Controller、Service、Domain、Repository 这些分层,不过是传统软件工程时代遗留下来的形式主义。
但这个判断忽略了一个关键问题:
AI 会写代码,不等于 AI 可以无成本地理解任意代码。
AI 同样受到上下文窗口、Token 成本、注意力分配、信息噪声和推理稳定性的限制。
更重要的是,AI 降低的是“生成代码”的成本,而不是“理解复杂系统”的成本。
恰恰相反,当代码生成速度大幅提升后,结构混乱、边界模糊和技术债失控的速度也会同步提升。
所以,AI 时代不是不需要架构,而是更需要架构。
架构设计正在从过去的“人类协作规范”,逐渐变成人与 AI 共同遵守的“系统协作协议”。
一、AI 降低了写代码的成本,却放大了结构混乱的代价
过去,一个开发人员一天可能只能完成几百行有效代码。
因此,即使项目架构不够合理,技术债的积累速度通常也是有限的。开发人员在写代码的过程中,还会自然地进行思考、重构和调整。
AI 改变了这一点。
今天,一个开发人员借助 AI,可以在很短时间内生成几千行甚至上万行代码。
这意味着,原本需要几个月才会形成的结构问题,现在可能几天就会出现。
AI 很擅长解决明确、局部、边界清晰的问题,例如:
- 实现一个接口;
- 编写一个数据转换函数;
- 完成一个查询方法;
- 补充测试用例;
- 根据现有模式扩展一个功能。
但当任务涉及多个模块和多个层次时,如果没有明确的架构约束,AI 很容易选择“当前最省事”的实现方式。
例如:
- 在 Controller 中直接查询数据库;
- 在 Repository 中加入业务判断;
- 在工具类中保存业务状态;
- 在接口层直接调用第三方服务;
- 为了完成一个功能,顺手修改多个无关模块;
- 将大量逻辑堆积在单个文件中;
- 重复实现已经存在的能力;
- 为了解决局部问题,破坏全局设计。
这些代码通常可以运行,甚至短期内看起来开发效率很高。
但随着 AI 不断生成新代码,系统会迅速变成一种“高速增长的意大利面结构”。
所以,AI 时代真正的风险不是 AI 写不出代码,而是:
AI 写代码太快,而系统缺少足够强的约束。
过去没有架构规范,技术债是缓慢积累。
现在没有架构规范,技术债可能是指数级增长。
二、架构分层首先是一套给 AI 使用的约束机制
软件架构过去主要用于解决人的问题:
- 让团队成员理解系统;
- 明确不同模块的职责;
- 降低协作冲突;
- 控制修改范围;
- 方便测试和维护。
AI 时代,这些价值依然存在,但又多了一层新的意义:
架构是约束 AI 行为的护栏。
例如,一个系统明确规定:
- Controller 只负责协议转换、参数校验和响应组装;
- Application Service 负责编排业务用例;
- Domain 层负责业务规则;
- Repository 只负责数据访问;
- Infrastructure 负责数据库、消息队列和第三方系统;
- 跨模块调用必须通过公开接口;
- 禁止业务层直接依赖具体数据库实现。
那么 AI 在生成代码时,就有了明确的行为边界。
我们可以直接告诉 AI:
在 Application 层实现创建订单用例,不允许直接访问数据库。
业务规则放入 Domain 层。
数据持久化通过 OrderRepository 接口完成。
不得修改其他模块的内部实现。
这样的任务对 AI 来说是清晰的。
相反,如果系统没有层次、没有模块边界、没有依赖约束,那么每次让 AI 修改代码,都需要重新解释整个系统。
而且即使解释了,AI 也可能因为上下文不足或者注意力偏移,选择一个局部合理、全局错误的实现。
因此,规范化架构并不是用来限制 AI 的能力,而是让 AI 的能力能够稳定、可控地释放。
三、分层能够显著降低 Token 成本
在 AI 编程时代,软件架构不仅是一个技术问题,还是一个直接的经济问题。
高质量模型的调用成本依然不低。
模型能力越强,输入和输出 Token 的价格通常也越高。企业一旦大规模使用 AI 编程,代码上下文将成为持续性成本。
如果一个系统大量功能集中在少数几个巨型文件中,例如:
OrderService.java 5000 行
UserController.java 3000 行
CommonUtils.java 8000 行
DatabaseHelper.java 4000 行
那么即使只修改一个很小的功能,AI 也可能需要读取大量无关代码。
例如,用户只是要求:
修改订单取消时的退款判断规则。
但因为退款判断、订单状态、数据库访问、日志记录和第三方支付逻辑全部混在一个文件里,AI 可能需要读取几千行内容才能判断修改位置。
这些上下文中的大部分内容,与当前任务没有直接关系。
但它们依然会消耗 Token。
更严重的是,AI 编程工具经常会在多轮对话中重复提交上下文。
同一个巨型文件,可能在一次任务中被多次发送给模型:
- 第一次分析问题时发送;
- 生成修改方案时再次发送;
- 修复编译错误时再次发送;
- 补测试时再次发送;
- Code Review 时再次发送。
一个原本只需要理解几十行代码的任务,最终可能消耗数万甚至数十万 Token。
而规范化分层可以大幅减少这种浪费。
例如,订单系统拆分为:
order/
├── api/
│ └── OrderController.java
├── application/
│ └── CancelOrderService.java
├── domain/
│ ├── Order.java
│ └── RefundPolicy.java
├── repository/
│ └── OrderRepository.java
└── infrastructure/
└── JpaOrderRepository.java
修改退款规则时,AI 通常只需要读取:
CancelOrderServiceOrderRefundPolicy- 相关测试
这样,输入上下文更小,Token 消耗更低,模型注意力也更加集中。
所以,分层并不只是为了“代码好看”。
它实际上决定了 AI 编程的单位任务成本。
架构越清晰,AI 完成一个功能所需加载的上下文越少。
上下文越少,Token 成本越低,响应速度越快,结果也越稳定。
这是一笔非常现实的企业级经济账。
四、上下文窗口再大,也不能替代良好的架构
有人会说:
现在模型上下文窗口已经很大了,几十万甚至上百万 Token,将来整个项目都可以一次性交给 AI。
这个判断容易混淆两个概念:
- AI 能不能读取这些代码;
- AI 能不能稳定理解这些代码。
上下文窗口变大,只代表模型可以接收更多信息,不代表模型可以对所有信息保持同样精确的注意力。
当上下文越来越大时,会出现几个问题。
1. 有效信息被无关信息稀释
一个任务真正相关的代码可能只有 200 行,但上下文中包含了 2 万行代码。
模型需要从大量噪声中找到真正相关的部分。
信息越多,不一定越准确。
很多时候,模型不是因为“看不到代码”而出错,而是因为“看到的无关代码太多”。
2. 跨文件关系更容易判断错误
当模块边界不清晰时,AI 需要自己推断:
- 哪个方法才是正确入口;
- 哪段逻辑是真正的业务规则;
- 哪个字段是权威数据;
- 哪些代码是历史遗留;
- 哪些代码可以修改;
- 哪些代码虽然相似,但不属于当前业务。
上下文再大,也无法弥补系统语义不清晰的问题。
3. 多轮任务仍然会重复消耗上下文
即使一个模型拥有百万 Token 上下文,AI 编程也不是一次性问答。
真实开发过程通常包括:
- 理解需求;
- 分析代码;
- 制定方案;
- 修改代码;
- 运行测试;
- 分析错误;
- 修复问题;
- 进行评审。
每一轮都可能重新加载相关代码。
因此,架构的价值不只是“让代码能放进上下文窗口”,而是让每一个开发步骤都只需要最小必要上下文。
五、分层让 AI 可以局部理解、局部修改
AI 编程最大的优势之一,是可以高效完成局部任务。
但前提是系统本身能够被局部理解。
一个好的模块应该具备以下特点:
- 职责明确;
- 输入输出清晰;
- 依赖关系有限;
- 修改边界明确;
- 可以独立测试;
- 不需要理解整个系统才能修改。
例如,一个订单价格计算模块,如果拥有清晰的接口:
public interface PricingService {
Money calculate(Order order, PricingContext context);
}
AI 在修改价格规则时,只需要理解:
OrderPricingContextPricingService- 当前价格实现
- 相关测试
它不需要了解:
- 用户登录逻辑;
- 消息推送逻辑;
- 数据库连接配置;
- HTTP 请求解析;
- 页面展示;
- 其他无关业务。
这就是“可局部理解”。
而如果价格计算逻辑分散在 Controller、SQL、工具类和配置文件中,那么任何一次修改都可能变成全局分析。
分层清晰时,我们可以把 AI 任务限制在一个明确范围内:
只修改退款策略模块。
不修改订单创建流程。
不调整数据库表结构。
不改变现有接口。
所有新增规则必须通过现有测试并补充新测试。
任务范围越明确,AI 的结果越可预测。
这也降低了 AI 修改无关代码的风险。
六、AI 时代仍然需要人工代码评审
“代码由 AI 生成”并不意味着“代码可以自动上线”。
至少在当前阶段,大多数企业都不会放心让 AI 生成的生产代码跳过人工评审,直接部署到线上。
原因很简单。
AI 生成的代码可能存在:
- 边界条件遗漏;
- 权限漏洞;
- 数据越权;
- 并发问题;
- 事务问题;
- 性能问题;
- 安全隐患;
- 业务规则误解;
- 异常处理不完整;
- 日志泄露敏感信息;
- 与现有设计不一致;
- 修改范围失控。
这些问题很多并不是编译器或者单元测试可以完全发现的。
因此,生产级开发仍然需要人工 Review。
而代码是否具备清晰的层次,会直接影响 Review 的效率和质量。
如果一个 AI 提交的功能修改涉及:
- 20 个文件;
- 3000 行改动;
- 多处重复逻辑;
- Controller 中加入 SQL;
- Repository 中加入状态判断;
- 公共工具类中加入业务规则;
那么审查者很难判断:
- 修改是否完整;
- 是否影响其他功能;
- 业务规则是否一致;
- 是否隐藏了副作用;
- 哪些改动是必须的;
- 哪些改动只是 AI 顺手重构的。
相反,如果架构边界清晰,一个业务需求可能只修改:
- 一个用例服务;
- 一个领域策略;
- 一个仓储接口实现;
- 两组测试。
审查者可以快速聚焦于真正的业务变化。
所以,架构设计不是为了让 AI 看懂代码,而是为了让人能够审查 AI 写出的代码。
在未来很长一段时间里,软件开发很可能形成这样的协作方式:
架构师或高级开发设计边界和契约,
AI 与普通开发人员完成实现,
高级开发人员负责评审和最终责任。
在这种协作模式下,架构就是最重要的人机协作协议。
七、AI + 初级开发人员,会让架构约束更加重要
过去,团队中的初级开发人员通常由高级开发人员带领。
高级开发人员会通过:
- 代码评审;
- 架构讲解;
- 结对编程;
- 开发规范;
- 示例代码;
逐渐帮助初级开发人员理解系统。
AI 出现之后,团队协作模式发生了变化。
未来越来越常见的模式可能是:
高级开发人员设计系统,
初级开发人员通过 AI 快速完成大量实现,
高级开发人员集中负责架构和评审。
这会极大提升代码产出速度,但也带来新的风险。
初级开发人员可能并不完全理解 AI 生成的代码。
当 AI 给出一个“能运行”的方案时,他们往往倾向于直接接受。
如果系统没有明确的架构规范,那么 AI 可能持续生成局部合理但全局错误的代码,而初级开发人员缺乏足够能力发现问题。
最后,高级开发人员面对的将不是少量代码,而是大量已经写完、已经耦合、甚至已经上线的技术债。
因此,AI 时代的架构规范必须比过去更加明确。
不能只写一句:
请遵循良好的软件设计原则。
而应该给出可以执行和检查的规则,例如:
- API 层禁止直接访问数据库;
- 领域层禁止依赖基础设施层;
- 跨模块只能调用公开接口;
- 一个功能只能拥有一个权威业务规则实现;
- 新增外部依赖必须封装适配器;
- 单个文件不得超过合理规模;
- 禁止在公共工具类中加入业务逻辑;
- 修改必须附带对应测试;
- AI 不得修改任务范围外的模块;
- 发现架构冲突时,先提出方案,不得自行绕过。
这些规则既是给开发人员看的,也是给 AI 看的。
八、架构能够降低 AI 误改无关代码的风险
AI 修改代码时,一个常见问题是修改范围扩大。
例如,用户只是要求:
给订单增加一个取消原因字段。
但 AI 可能同时:
- 修改数据库实体;
- 修改订单 DTO;
- 调整接口参数;
- 修改前端展示;
- 重构订单状态枚举;
- 顺便统一命名;
- 删除它认为没有使用的字段;
- 修改多个测试;
- 更改异常处理方式。
其中一些改动可能是必要的,但另一些可能是 AI 自己推断出来的。
如果代码结构混乱,AI 很难判断真正的边界。
因为所有代码互相依赖,一个小修改天然会扩散到多个位置。
清晰架构则可以提供明确的变化路径。
例如:
API DTO
↓
Application Command
↓
Domain Entity
↓
Repository
AI 可以沿着固定路径进行修改。
而其他模块如果没有直接依赖,就不应该被影响。
架构实际上帮助 AI回答了三个问题:
- 这个需求应该修改哪里?
- 这个需求不应该修改哪里?
- 修改后需要验证哪些范围?
这三个问题,比“代码能不能写出来”更重要。
九、AI 让重写代码更便宜,但前提是边界足够干净
AI 的确降低了重构和重写的成本。
例如,我们可以让 AI:
- 将 JDBC 实现改为 JPA;
- 将 REST 接口改为 gRPC;
- 将某个模块从 Java 迁移到 Kotlin;
- 将同步调用改为事件驱动;
- 将本地缓存替换为 Redis;
- 将旧版 SDK 替换为新版 SDK;
- 将单体中的某个模块拆分成独立服务。
但这些工作的难度,取决于现有系统是否拥有清晰边界。
如果数据库访问全部封装在 Infrastructure 层,那么更换数据库实现相对简单。
如果外部支付服务通过适配器调用,那么更换支付渠道也相对简单。
如果核心业务规则位于 Domain 层,那么接口协议和存储方式变化时,业务逻辑可以保持稳定。
相反,如果 SQL、业务逻辑、接口转换和第三方调用混合在一起,那么 AI 所谓的“快速重写”并不会真的轻松。
它仍然需要:
- 阅读大量代码;
- 推断隐含关系;
- 识别重复逻辑;
- 判断哪些行为不能改变;
- 处理隐藏副作用;
- 修复大量回归问题。
AI 可以降低机械性改写成本,但不能自动消除糟糕架构带来的复杂性。
换句话说:
AI 让可替换的模块更容易替换,
但无法让原本不可替换的代码自动变得可替换。
十、架构是为测试和验证服务的
AI 生成代码后,如何证明它是正确的?
不能只看代码写得是否漂亮,也不能只看能否编译。
必须依赖验证体系:
- 单元测试;
- 集成测试;
- 契约测试;
- 回归测试;
- 静态检查;
- 安全扫描;
- 性能测试;
- 架构规则检查。
而一个系统是否容易测试,与分层质量直接相关。
如果业务逻辑依赖:
- 数据库;
- HTTP 请求;
- 全局变量;
- 静态工具类;
- 当前时间;
- 第三方接口;
- 消息队列;
那么测试一个简单规则,也可能需要启动整套系统。
AI 虽然可以帮助生成测试,但无法改变代码本身难以测试的事实。
清晰分层能够将业务逻辑与基础设施隔离。
例如,一个退款规则:
public RefundResult calculateRefund(
Order order,
CancellationReason reason,
LocalDateTime cancelTime
)
这样的代码可以被 AI 快速生成测试,也可以被人快速审查。
如果退款规则隐藏在 Controller 中,并且同时依赖数据库、用户上下文和第三方接口,那么测试成本会高得多。
AI 时代会生成更多代码,因此也必须建立更强的自动验证体系。
而架构分层,是自动验证能够成立的基础。
十一、架构还是系统知识的压缩方式
一个大型软件系统包含大量业务知识。
如果这些知识只存在于具体代码细节中,那么每次理解系统,都必须重新阅读大量实现。
好的架构可以把系统知识压缩到几个稳定概念中。
例如,一个电商系统可以被描述为:
- 订单模块负责交易生命周期;
- 库存模块负责库存锁定与扣减;
- 支付模块负责支付与退款;
- 履约模块负责发货和交付;
- 营销模块负责优惠计算;
- 各模块通过事件或公开接口协作。
这样的模块划分,本身就是一张系统认知地图。
无论是新员工还是 AI,都可以先理解地图,再进入局部代码。
如果没有架构,AI 每次都要从代码中重新推断系统结构。
这会产生两个问题:
- 每次推断结果可能不同;
- AI 推断出来的结构未必符合真实业务。
因此,架构不只是代码组织方式,也是对业务知识的显式表达。
对 AI 来说,明确的架构文档、模块说明、领域词汇和依赖规则,相当于高密度、高质量的上下文。
它比直接给 AI 喂几万行代码有效得多。
十二、AI 时代不只是需要代码分层,还需要上下文分层
传统软件架构主要关注代码结构。
AI 编程还需要关注另一种结构:
上下文结构。
未来一个 AI 友好的项目,不应该让 AI 每次都从整个仓库中自行寻找信息,而应该提供分层的上下文。
例如:
项目级上下文
说明:
- 项目目标;
- 技术栈;
- 总体架构;
- 模块关系;
- 全局约束;
- 安全要求;
- 禁止事项。
模块级上下文
说明:
- 模块职责;
- 对外接口;
- 依赖关系;
- 核心领域概念;
- 常见扩展方式;
- 测试方式。
任务级上下文
说明:
- 本次需求;
- 修改范围;
- 禁止修改范围;
- 验收标准;
- 相关文件;
- 需要执行的测试。
这种上下文分层,会比单纯扩大上下文窗口更加有效。
因为 AI 真正需要的不是“更多信息”,而是“正确的信息”。
从这个角度看,未来的软件架构文档不仅服务于人,也将直接服务于 AI。
十三、架构规范应该能够自动执行,而不只是写在文档里
过去很多项目都有架构文档,但实际代码并不遵守。
原因是文档只是一种软约束。
AI 时代,单纯依赖文档更加危险。
因为 AI 每次生成代码时,都可能选择最直接的实现路径。
因此,架构规范需要尽可能转化为机器可执行规则。
例如:
- 使用 ArchUnit 检查 Java 分层依赖;
- 使用依赖规则禁止 Domain 引用 Infrastructure;
- 使用 lint 规则限制 Controller 中出现数据库调用;
- 使用目录权限限制 AI 修改范围;
- 在 CI 中检查循环依赖;
- 限制单文件规模和函数复杂度;
- 检查跨模块调用是否通过公开接口;
- 为外部服务定义契约测试;
- 要求每次 AI 修改都生成影响范围说明;
- 要求 CI 自动检测越层调用。
例如,可以定义规则:
domain 不得依赖 application
domain 不得依赖 infrastructure
application 可以依赖 domain
infrastructure 可以实现 domain 中的接口
api 只能调用 application
这样,即使 AI 生成了违反架构的代码,也无法通过 CI。
真正可靠的架构,不是“希望 AI 遵守”,而是“AI 不遵守就无法合并”。
十四、但是,规范化不等于过度设计
讨论到这里,很容易走向另一个极端:
既然 AI 时代需要架构,那是不是所有项目都应该使用完整 DDD、六边形架构、CQRS、事件溯源和微服务?
答案是否定的。
AI 时代需要的是清晰边界,而不是更多形式。
过度分层同样会增加 AI 成本。
例如,一个简单的查询功能,如果被拆成:
Controller
Request DTO
Command
Command Handler
Application Service
Domain Service
Repository Interface
Repository Adapter
Entity
Aggregate
Mapper
Assembler
Response DTO
那么 AI 每次修改一个字段,都可能需要同步修改十几个文件。
这不仅增加 Token 消耗,也增加理解和维护成本。
一些项目为了形式上的“解耦”,为每一个类都创建接口,为每一个调用都增加一层代理,为每一个对象都创建多个 DTO。
结果是系统看起来很规范,实际却充满样板代码。
AI 可以快速生成这些样板,但样板代码依然会:
- 消耗上下文;
- 增加文件数量;
- 增加修改范围;
- 增加评审负担;
- 隐藏真正的业务逻辑。
因此,AI 时代的合理原则不是“分层越多越好”,而是:
刚在边界,柔在内部。
所谓“刚在边界”,是指这些位置需要严格约束:
- 核心业务与数据库之间;
- 核心业务与第三方服务之间;
- 模块与模块之间;
- 内部系统与外部 API 之间;
- 稳定业务规则与易变技术实现之间;
- 高风险权限操作与普通逻辑之间。
所谓“柔在内部”,是指:
- 模块内部不必机械地套用所有设计模式;
- 简单逻辑可以保持扁平;
- 没有替换需求时,不必为每个类创建接口;
- 不要为未来可能永远不会发生的变化提前抽象;
- 小型项目不需要复制大型企业架构;
- 能用三个清晰文件解决的问题,不要拆成十五个文件。
架构的目标是降低复杂度,而不是制造复杂度。
十五、AI 友好的架构应该具备什么特征?
一个真正适合 AI 编程的系统,至少应该具备以下特征。
1. 模块职责明确
每个模块都能用一句话解释清楚。
例如:
- 用户模块负责身份和账户;
- 订单模块负责交易状态;
- 支付模块负责支付和退款;
- 消息模块负责通知发送。
如果一个模块需要用一大段话才能解释,通常说明边界还不够清晰。
2. 修改路径清晰
一个需求进入系统后,应该能够快速判断需要修改哪些位置。
例如:
接口参数变化 → API 层
业务规则变化 → Domain 层
流程编排变化 → Application 层
存储方式变化 → Infrastructure 层
3. 依赖方向稳定
AI 最容易在依赖方向不清晰的系统中产生错误。
因此依赖方向应该明确,最好可以自动验证。
4. 文件规模适中
不是文件越小越好,而是一个文件应该承载一个相对完整的概念。
巨型文件会增加 Token 成本。
过度碎片化则会增加跨文件跳转成本。
5. 契约明确
模块之间通过稳定接口协作。
输入、输出、异常和副作用应该清晰。
6. 测试靠近业务规则
核心业务逻辑应该能够脱离数据库和网络独立测试。
7. 架构文档与代码同步
架构说明不能只是一次性文档。
它应该与目录结构、依赖规则和 CI 检查保持一致。
8. 给 AI 明确的禁止事项
很多时候,告诉 AI“不允许做什么”,比告诉它“请写好代码”更有效。
例如:
- 不允许绕过应用层;
- 不允许新增全局状态;
- 不允许修改公开接口;
- 不允许引入新框架;
- 不允许复制已有业务逻辑;
- 不允许删除看似未使用但无法确认用途的代码。
十六、AI 时代,架构师的价值不会下降,反而会提高
当 AI 能够快速编写代码后,单纯“把需求翻译成代码”的价值会下降。
但以下能力会变得更加重要:
- 定义系统边界;
- 拆分问题;
- 识别核心业务规则;
- 设计模块契约;
- 控制依赖方向;
- 判断哪些变化需要抽象;
- 判断哪些地方不应该抽象;
- 设计可验证的架构规则;
- 控制 AI 的修改范围;
- 评估长期演进成本。
AI 可以快速实现一个方案,但它不天然知道哪个方案最适合这个组织、这个业务和这个系统的未来。
它也不真正承担系统上线后的责任。
因此,未来架构师的工作可能不再是亲自编写大量基础代码,而是:
设计 AI 可以安全工作的空间。
架构师需要为 AI 明确:
- 哪里可以自由生成;
- 哪里必须严格遵守契约;
- 哪些模块可以重写;
- 哪些接口必须保持稳定;
- 哪些数据属于高风险;
- 哪些决策必须由人确认。
这不是架构师价值的削弱,而是架构职责的升级。
十七、代码可以由 AI 写,但系统责任仍然由人承担
“AI 写的代码,AI 自己能理解”还有一个根本问题:
AI 并不承担软件系统的最终责任。
当系统出现以下问题时:
- 用户数据泄露;
- 资金计算错误;
- 库存被重复扣减;
- 权限控制失效;
- 服务大面积不可用;
- 合规要求未满足;
- 订单状态异常;
- 生产数据被误删除;
最终负责的仍然是企业、团队和工程师。
只要责任仍然由人承担,人就必须能够:
- 理解系统;
- 审查修改;
- 定位问题;
- 判断风险;
- 回滚变更;
- 解释行为;
- 验证正确性。
因此,软件架构不会因为代码由 AI 生成而消失。
只要软件仍然影响真实用户、真实资金和真实业务,架构就仍然是责任体系的一部分。
十八、真正应该被淘汰的,不是架构,而是无价值的架构形式主义
AI 时代确实会淘汰一部分传统开发方式。
例如:
- 为了写代码而写代码;
- 重复生产样板代码;
- 只会套用设计模式;
- 为每个类机械创建接口;
- 不考虑实际变化却提前抽象;
- 为了“看起来专业”强行增加层次;
- 架构文档和实际代码完全脱节。
但这不代表架构本身会消失。
真正有价值的架构能力会变得更重要:
- 边界设计;
- 复杂度控制;
- 系统演进;
- 风险隔离;
- 上下文管理;
- 人机协作;
- 自动验证。
AI 可以帮助我们减少无意义的样板代码,但不能替代对系统结构的判断。
结语:AI 时代,架构是人机协作的基础设施
AI 降低了代码生成成本,但没有消除软件复杂度。
它甚至会让复杂度增长得更快。
没有架构约束时,AI 可以在极短时间内生成大量能运行、难维护、难审查、难测试、难演进的代码。
有清晰架构时,AI 才能:
- 使用更少的上下文;
- 消耗更少的 Token;
- 更准确地理解任务;
- 在更小范围内修改代码;
- 减少误改无关模块;
- 生成更容易测试的实现;
- 让人工评审更加高效;
- 支持系统持续重构和演进。
所以,AI 时代的正确结论不是:
代码都由 AI 写了,因此不需要架构。
而应该是:
正因为代码可以被 AI 快速生成,所以我们更需要架构来约束代码的增长方式。
AI 降低了“写代码”的成本,却放大了“结构混乱”的代价。
规范化分层不是传统软件工程留下来的洁癖,也不是为了与 AI 对抗。
它是控制 Token 成本、提升生成质量、保障人工评审、限制修改范围、支持自动验证和实现长期演进的基础设施。
未来最好的软件系统,未必是分层最多的系统,也未必是设计模式使用最多的系统。
它应该是一个:
边界清晰、上下文可控、修改局部、规则可验证,并且人和 AI 都能够准确理解的系统。
一句话总结:
AI 可以帮我们更快地写代码,但架构决定了这些代码最终会成为生产力,还是成为更快堆积的技术债。
