前言
最近很多人都在讨论 AI Coding。
有的人觉得 AI 已经可以替代大量程序员,有的人觉得 AI 也就写写 Demo,真正进到生产系统里还是不敢用。两边看起来都在讲自己的真实经验,但结论差异很大。
我觉得这里面有一个关键问题经常被忽略:
大家讨论的不是同一个工程环境。
如果一个团队需求不清楚、系统边界不清楚、测试不完整、部署靠人工、核心逻辑靠老员工口口相传,那么 AI 写出来的代码当然很难直接上线。不是 AI 完全不行,而是它拿不到足够的信息,也没有被放进一个可验证的工程闭环里。
反过来,有些 AI Native 公司可以做到 80% 甚至更高比例的代码由 AI 产出,也不代表它们的工程能力弱,只是模型更强。很多时候恰恰相反:
它们的软件工程能力更强。
所以这个问题表面上是:
为什么 AI 在有些公司只能写 Demo,在另一些公司却能写生产代码?
本质上其实是:
一个组织的软件工程体系,是否已经被结构化到可以让 AI 执行。
AI 问题最后会回到软件工程问题。
先解释一下什么是 AI Native
AI Native 这个词现在被用得很多,但不同语境下含义不完全一样。
我这里说的 AI Native,不是指“产品里加了一个 AI 功能”,也不是指“研发团队买了 Cursor、Copilot、Claude Code 之类的工具”。
我更倾向于这样理解:
AI Native 公司,是把 AI 当成组织生产方式的一部分,而不是当成某个外部工具。
也就是说,它不是在原来的流程里加一个 AI 助手,而是会反过来重新设计产品表达、工程结构、测试体系、交付流程和组织协作方式,让 AI 能够稳定参与生产。
传统公司常见的方式是:
| 阶段 | 传统方式 | AI Native 更关注什么 |
|---|---|---|
| 需求 | 自然语言沟通,会议补上下文 | 需求是否可执行、可验证 |
| 设计 | 依赖架构师和资深研发经验 | 领域边界是否显性化 |
| 开发 | 人主导,AI 辅助写片段 | AI 执行,人设计约束 |
| 测试 | 手工测试 + 部分自动化 | 自动验证作为默认门禁 |
| 发布 | 人判断风险,人操作兜底 | 小步发布、监控、回滚闭环 |
这里最重要的变化不是“谁写代码”,而是“系统能不能描述清楚自己”。
完整工程本身就是一件极具专业度、难度和时间成本的事情。真正可上线的软件,不是把功能写出来就结束,而是要把需求、边界、异常、测试、发布、监控、回滚都纳入同一个工程闭环。
这件事以前主要是为了让人协作,现在开始变成让 AI 协作的前提。
先看一张图
我理解 AI Coding 能不能进生产,大概可以拆成五层:
很多公司的问题,是直接从 CEO/战略层跳到最底层:
“大家都用 AI 写代码。”
但中间几层如果没有补起来,AI 最后只会变成一个更快的代码生成器,而不是一个稳定的工程生产力。
可以用一个简化公式理解:
AI 有效产出
≈ 模型能力 × 上下文完整度 × 约束清晰度 × 验证强度
这里面模型能力当然重要,但它不是唯一变量。
更关键的是后面三个:
- 上下文是否完整
- 约束是否清楚
- 验证是否足够强
如果这三个很弱,模型越强,生成垃圾的速度也会越快。
为什么传统公司觉得 AI 只能写 Demo
很多研发对 AI Coding 的评价大概是这样的:
- 会写 Hello World
- 会生成 CRUD
- 会写单文件工具函数
- 项目稍微大一点就开始乱
- 改一个地方容易影响三个地方
- 代码看起来能跑,但不敢直接上线
这些反馈都很真实。
因为 Demo 和生产系统之间,差的不是几行代码,而是大量上下文。
Demo 通常只有:
输入 -> 输出
生产系统则是:
输入 -> 业务约束 -> 历史上下文 -> 隐含规则 -> 非功能要求 -> 输出
这两者的信息密度差很多。
举个登录的例子。
如果让 AI 写一个“登录页面”,在 Demo 场景下很简单。邮箱、密码、按钮、调用接口、跳转页面,十几分钟就能生成一个看起来不错的页面。
但真实生产系统里的登录,可能包括:
| 维度 | 需要考虑的问题 |
|---|---|
| 安全 | 密码策略、失败次数限制、验证码、MFA、风控 |
| 兼容 | SSO、老版本 App、移动端和 PC 差异 |
| 体验 | 错误提示、国际化、可访问性、弱网处理 |
| 工程 | API 契约、埋点、日志、灰度、回滚 |
| 合规 | 审计日志、隐私数据处理、安全扫描 |
如果这些信息没有结构化表达,AI 只能根据通用经验猜。猜对了是运气,猜错了就是事故。
这也是为什么很多 CEO 会觉得:
“模型还不够强,再等等 GPT-6。”
但技术团队感受到的往往是:
“不是模型问题,是工程问题。”
模型当然还会进步,但真实生产系统里最难的不是生成代码,而是知道哪些代码不能生成、哪些地方不能改、哪些约束必须满足。
AI 真正困难的是:
它不知道系统边界。
AI 代码比例取决于系统可描述程度
我觉得可以用一个简单的关系来理解:
AI 代码生成比例 ≈ 系统可描述程度
或者说:
Code Generation Ratio ≈ Specification Completeness
系统越规范,AI 越容易发挥作用。
系统越依赖人脑默契,AI 越难稳定落地。
很多传统公司的真实情况是这样的:
| 角色 | 表达 |
|---|---|
| 产品 | “把登录页改得高级一点。” |
| 研发 | “高级是指什么?” |
| 产品 | “参考一下竞品,交互更顺一点。” |
| 研发 | “参考哪个页面?移动端还是 PC 端?现有接口要不要改?登录失败怎么提示?” |
| 产品 | “你们先做一版看看。” |
这时候人都很难一次做对,更不用说 AI。
因为这里没有可执行约束。
很多人一听到结构化表达,就会想到写一大段 YAML。YAML 可以用,但不是唯一形式,也不是最适合所有团队的形式。
更落地的表达,往往是下面这些东西:
| 类型 | 例子 | AI 为什么需要 |
|---|---|---|
| PRD 验收标准 | 成功/失败场景、边界条件、不可做范围 | 避免只实现主路径 |
| 接口契约 | 入参、出参、错误码、兼容策略 | 避免破坏上下游 |
| 数据字典 | 字段口径、枚举值、敏感级别 | 避免误用字段 |
| 测试清单 | 单测、集成、回归、性能、安全 | 判断代码能否上线 |
| 架构决策记录 | 为什么这么设计,哪些方案被放弃 | 避免重复踩坑 |
| 发布 Checklist | 灰度、监控、回滚、通知 | 控制生产风险 |
所以重点不是把一切写成 YAML,而是把信息从“人脑默契”变成“可读取、可执行、可验证”的工程资产。
大部分公司的短板不是 AI,而是软件工程基础
很多公司过去这些年都在讲敏捷、TDD、DDD、微服务、DevOps,但真正落地的时候,经常会走样。
| 名词 | 理想状态 | 走样后的状态 |
|---|---|---|
| 敏捷 | 小步迭代,持续反馈 | 需求天天改 |
| TDD | 用测试约束设计 | 上线前补测试截图 |
| 微服务 | 领域边界清晰,独立演进 | 几十个服务互相调,谁也说不清边界 |
| DDD | 用领域模型管理复杂度 | 包名里有一个 domain |
| DevOps | 交付链路自动化、可追踪 | 研发自己登录机器发布 |
这些东西在人主导的时代,有时候还能靠经验、责任心和加班撑住。但到了 AI 参与开发的时候,问题会被放大。
因为 AI 依赖可观察性。
它需要知道:
- 当前系统有哪些模块
- 这个模块的边界在哪里
- 哪些接口可以改,哪些不能改
- 哪些测试必须通过
- 哪些规则是业务核心约束
- 哪些历史代码不能轻易动
- 出问题后如何回滚
但很多企业的真实信息分布在:
- 飞书聊天记录
- Jira 或其他任务系统
- Confluence 文档
- 代码注释
- 老员工脑子
- 临时会议纪要
- 微信群
这些信息没有形成一个统一、可执行、可验证的上下文。
所以当你问 AI:
“帮我改一下订单逻辑。”
它真正需要知道的是:
- 订单状态机有哪些状态
- 支付、库存、履约、发票、售后之间怎么协作
- 取消订单会不会释放库存
- 优惠券是否退回
- 已部分发货的订单能不能取消
- 下游有没有异步消息
- 历史上为什么有一段特殊判断
- 哪些场景有合同测试
- 改完之后要跑哪些回归
如果这些信息拿不到,AI 只能在代码表面做模式匹配。
这就是为什么很多 AI 改代码看起来很努力,但结果不稳定。
不是它不会写语法,而是它没有完整系统地图。
Harness Engineering 的价值
这两年我觉得一个很值得关注的概念是 Harness Engineering。
很多人过去讲 Prompt Engineering,重点是怎么把提示词写好。这个当然有价值,但如果只停留在提示词层面,很容易变成玄学。
Harness Engineering 更像是:
把 AI 放进一个受约束、可执行、可验证的工程环境。
它关注的不是一句 prompt 写得多漂亮,而是 AI 执行任务时,周围有没有完整的支架。
可以简单理解成:
AI + Context + Tool + Verification + Feedback
也就是:
需求进入系统以后,AI 能拿到必要上下文,能调用合适工具,能生成变更,能自动跑测试和检查,能根据反馈继续修正,最后由人做关键判断。
核心不是生成。
核心是控制。
如果只是写:
帮我写一个支付模块。
这更像 Demo。
如果是:
在现有 payment-service 中增加分账能力。
约束:
1. 不允许修改 payment-core 模块的公开接口。
2. 必须复用现有 PaymentOrder、LedgerEntry、SettlementBatch 模型。
3. 分账比例来自 settlement_rule 表。
4. 金额计算使用 Money 类型,禁止使用 double。
5. 需要覆盖正常分账、部分退款、分账失败重试三个场景。
6. 单元测试覆盖率不低于 90%。
7. 必须通过 contract test、lint、安全扫描和回归测试。
8. 不允许修改账务历史表结构。
这就开始接近生产。
再往下,还需要把这些约束接到自动化流程里:
| 验证环节 | 作用 |
|---|---|
| lint / format | 保证基础代码规范 |
| unit test | 约束局部逻辑 |
| integration test | 验证模块协同 |
| contract test | 防止破坏上下游契约 |
| e2e test | 覆盖核心用户路径 |
| benchmark | 控制性能退化 |
| security scan | 控制安全风险 |
| schema diff | 控制数据结构变更风险 |
| canary / rollback | 控制线上影响范围 |
AI 在这个环境里才可能稳定工作。
所以 Harness Engineering 本质上是:
把软件工程变成机器可执行规则。
它不是 Prompt Engineering 的替代,而是 Prompt Engineering 的工业化版本。
一个大数据场景下的例子:指标口径变更
前面的登录和订单例子更偏业务系统。换到大数据场景,AI 面临的问题会更明显。
假设产品或运营提了一个需求:
“把用户活跃指标优化一下,之前的 DAU 不太准。”
这句话看起来很简单,但真正落到数据平台里,可能涉及一整条链路:
埋点 -> Kafka -> ODS -> DWD -> DWS -> ADS -> BI 报表 -> 业务决策
如果让 AI 直接改 SQL,它大概率能写出一段能跑的 SQL。
但能跑不代表能上线。
因为这里真正难的是口径、血缘、成本和稳定性。
先把问题拆开
一个“DAU 口径调整”至少要问清楚:
| 维度 | 需要澄清的问题 |
|---|---|
| 业务口径 | 什么叫活跃?打开 App 算不算?后台心跳算不算?爬虫流量算不算? |
| 数据来源 | 使用客户端埋点、服务端日志,还是登录表?哪个是准源? |
| 去重规则 | 按 user_id、device_id,还是账号体系映射后的统一 user_key? |
| 时间窗口 | 按自然日、用户时区,还是业务所在地区时区? |
| 延迟容忍 | T+1 出数,还是小时级更新?迟到数据怎么处理? |
| 历史回刷 | 是否要重刷过去 30 天、180 天,还是只从新口径生效日开始? |
| 下游影响 | 哪些报表、标签、推荐、运营策略依赖这个指标? |
| 验证方式 | 新旧口径差异多少合理?异常波动如何解释? |
这些问题不澄清,AI 写得越快,风险越大。
因为指标不是一段 SQL,而是一种业务契约。
更落地的表达,不一定是 YAML
在大数据团队里,真正能让 AI 稳定工作的输入,可能更像下面这些材料。
1. 指标定义表
| 字段 | 内容 |
|---|---|
| 指标名称 | DAU |
| 指标英文名 | daily_active_user |
| 统计粒度 | day |
| 统计对象 | user_key |
| 活跃定义 | 当天产生有效前台行为事件的用户 |
| 排除条件 | 测试账号、爬虫、后台心跳、重复上报 |
| 数据源 | dwd_user_event_di |
| 产出表 | ads_user_active_di |
| SLA | 次日 08:00 前完成 |
| 责任人 | 数据产品、数据研发、业务 owner |
2. 口径变更记录
| 日期 | 变更内容 | 影响范围 | 是否回刷 | 备注 |
|---|---|---|---|---|
| 2026-05-15 | 排除 heartbeat 事件 | DAU、留存、漏斗 | 回刷 90 天 | 与运营报表同步 |
3. 数据质量规则
| 规则 | 阈值 | 失败处理 |
|---|---|---|
| DAU 日环比波动 | 不超过 20% | 阻断发布,人工确认 |
| user_key 为空占比 | 小于 0.1% | 阻断发布 |
| 分区产出时间 | 08:00 前 | 告警 |
| 新旧口径差异 | 需要输出对比报告 | 人工确认后切换 |
4. 下游血缘清单
| 下游对象 | 类型 | 负责人 | 影响 |
|---|---|---|---|
| 用户增长看板 | BI 报表 | 运营分析 | 指标数值变化 |
| 留存分析任务 | 离线任务 | 数据研发 | 依赖 DAU 作为分母 |
| 用户分层标签 | 标签任务 | 算法团队 | 活跃等级可能变化 |
| 经营周报 | 固定报表 | 数据产品 | 需要解释口径变更 |
这些东西比一大段 YAML 更容易被团队接受,也更符合日常工作方式。
AI 可以基于这些材料去做几类事情:
- 修改 SQL
- 更新调度配置
- 生成回刷脚本
- 补充数据质量规则
- 生成新旧口径对比报告
- 更新指标文档
- 找出下游影响范围
- 给发布 Checklist 生成待办项
但前提是这些材料真实存在,而且格式相对稳定。
AI 在这里真正应该做什么
一个比较合理的 AI 执行链路可能是:
读取指标定义
-> 分析血缘影响
-> 修改 DWD/DWS/ADS SQL
-> 增加数据质量规则
-> 生成回刷计划
-> 跑样本分区验证
-> 输出新旧口径对比
-> 人工确认
-> 灰度切换报表
这和“帮我改一下 DAU SQL”完全不是一个量级。
后者是 Demo。
前者才是工程。
为什么大数据场景更能说明问题
大数据系统里,很多风险不是代码编译失败,而是结果悄悄错了。
服务端接口错了,可能很快报 500;数据口径错了,可能一个月后才发现经营分析偏了、运营策略错了、模型训练数据污染了。
所以数据工程里的 AI Native,不是让 AI 多写几段 SQL,而是让 AI 进入更完整的数据工程闭环:
数据源 -> 元数据 -> 血缘 -> 口径 -> 质量 -> 调度 -> 成本 -> 发布 -> 反馈
这里每一层都需要专业判断,也都需要时间沉淀。元数据要治理,血缘要可信,质量规则要持续维护,历史任务要梳理,下游依赖要有人负责。
这也是为什么完整工程很难。
不是因为大家不会写 SQL,而是因为让 SQL 变成稳定的数据产品,本身就是复杂工程。
原来的业务系统例子也可以保留
如果换回业务系统,订单取消也是一个很典型的例子。
产品可能只说:
“用户下单后,增加一个取消订单功能。”
但订单取消不是一个按钮,而是一组业务约束。
至少要说清楚:
- 哪些订单状态允许取消
- 支付前取消和支付后取消是否不同
- 是否需要释放库存
- 优惠券是否返还
- 积分是否返还
- 已发货是否允许取消
- 部分发货是否允许取消
- 取消后是否触发退款
- 退款失败怎么办
- 是否通知商家
- 是否通知履约系统
- 是否写审计日志
如果这些都没有,AI 生成的代码可能只是:
order.status = "cancelled"
order.save()
这就是 Demo。
如果系统里已经有明确的状态机、领域边界、事件规范、合同测试,AI 才有机会在可控范围里实现它。
所以这个例子和大数据指标变更本质是一样的:
AI 不是不能写代码,而是不能在没有边界、没有上下文、没有验证的情况下稳定写生产代码。
被筛选的不是程序员,而是软件建模能力
这也是我觉得很多讨论容易跑偏的地方。
大家经常问:
AI 会不会替代程序员?
这个问题太大,也太粗。
更具体一点,未来被压缩的可能是低约束、低上下文、低复杂度的编码工作。但真正被放大的,是抽象能力、系统建模能力、约束设计能力和工程判断力。
以前评价一个工程师,可能更容易看:
- 写代码快不快
- bug 多不多
- 算法熟不熟
- 框架会不会
- 能不能独立完成模块
这些能力仍然重要,但未来可能不够了。
因为代码会越来越便宜。
约束会越来越贵。
以前工程师主要写代码:
Coder
现在优秀工程师越来越像:
Architect
未来可能更接近:
System Designer
AI Supervisor
这不是说所有人都不写代码了,而是说写代码不再是唯一核心动作。
工程师要能把一个系统描述成 AI 可以理解和执行的结构。
比如在数据平台里,不只是写一个任务,而是要定义:
| 维度 | 需要建模的内容 |
|---|---|
| 数据源 | 来源、刷新频率、可信等级 |
| 数据模型 | ODS、DWD、DWS、ADS 分层关系 |
| 口径 | 指标定义、枚举解释、过滤条件 |
| 血缘 | 上下游表、任务、报表、接口 |
| 质量 | 完整性、唯一性、及时性、波动规则 |
| 成本 | 扫描量、存储量、调度周期 |
| 风险 | 回刷影响、下游影响、回滚方式 |
这背后考验的不是语法,而是建模。
你能不能把复杂业务拆成稳定边界。
你能不能定义清楚什么可以变,什么不能变。
你能不能让测试体系覆盖真正的风险。
你能不能把隐含知识沉淀成显性规则。
这些能力,才是 AI 时代更稀缺的工程能力。
国内很多公司的短板在产品和组织
很多时候,AI 落不下去,不只是研发的问题。
产品能力和组织能力同样关键。
软件开发本质上不是写代码,而是压缩信息熵。
一个模糊需求进入系统时,里面有大量不确定性。好的产品和技术团队,要把这些不确定性逐步压缩成可以执行、可以验证、可以交付的东西。
但很多公司的需求表达仍然是:
| 角色 | 表达 |
|---|---|
| 老板 | “加个 AI 功能。” |
| 产品 | “用户觉得现在不够智能。” |
| 研发 | “智能体现在哪里?” |
| 产品 | “就是体验要更好一点。” |
这种情况下,AI 没有办法执行。
因为它拿到的不是需求,而是情绪。
更好的表达应该是:
| 维度 | 更可执行的表达 |
|---|---|
| 目标 | 搜索到详情页点击率提升 8% |
| 场景 | 用户用自然语言搜索商品 |
| 当前问题 | 关键词搜索无法覆盖长尾意图 |
| 范围 | 做 query rewrite、意图识别、结果解释 |
| 不做 | 不重构完整推荐系统 |
| 主指标 | search_to_detail_click_rate、search_to_order_conversion |
| 护栏指标 | p95 延迟 < 300ms,无结果率不升高 |
这才是 AI 可以参与的表达。
所以我觉得很多公司真正要补的,不只是 AI 工具,而是结构化能力。
产品要能把“我要高级”变成场景、指标、边界和验收标准。
研发要能把“帮我做一下”变成领域模型、接口契约、测试和发布约束。
管理者要能把“大家都用 AI”变成流程、基座、工具链和评价体系。
否则全员 AI Coding 很容易变成全员生成更多不可维护代码。
未来软件公司可能会分层
未来几年,软件公司在使用 AI 开发上可能会出现几层差异。
| 层级 | 特征 | AI 代码比例 | 核心瓶颈 |
|---|---|---|---|
| AI 增强传统公司 | 使用 Copilot、Cursor、ChatGPT 等个人工具 | 20% - 40% | 上下文和验证不足 |
| Harness 公司 | 有自动测试、Agent、CI 门禁、规范约束 | 50% - 90% | 工程体系建设成本 |
| AI Native 公司 | 需求、工程、验证、反馈围绕 AI 重构 | 90%+ | 组织和系统建模能力 |
第一层是现在最多的。
团队使用 AI 工具补代码、写测试、解释代码、生成脚本、做局部重构。效率会提升,但整体开发模式没有本质变化。
第二层会开始把 AI 放进工程体系。
AI 不只是一个编辑器里的助手,而是被接入到需求拆解、代码生成、测试修复、文档更新、发布检查等流程中。
第三层更进一步。
代码本身不再是最核心资产,代码更像是某种编译产物。
真正的资产是:
- 数据
- 工作流
- 领域规则
- 用户反馈
- 产品抽象
- 工程约束
- Harness
这种公司才有机会达到 90% 甚至更高比例的 AI 代码产出。
但这并不意味着工程要求降低。
恰恰相反,它要求软件工程更严格。
一个可能有争议的判断
很多 CEO 现在推动的是:
全员 AI Coding。
这个方向没有错,但我觉得更底层的目标应该是:
全员结构化。
因为没有结构,AI 越强,制造垃圾的速度越快。
过去软件行业二十年,很多工程实践本质上是在解决一个问题:
如何让人更好地协作。
比如:
- 敏捷
- TDD
- DDD
- DevOps
- CI/CD
- Code Review
- 架构治理
- 可观测性
未来十年,可能要解决另一个问题:
如何让 AI 更好地协作。
而答案不是简单等一个更大的模型。
更大的模型会提高上限,但如果工程系统本身混乱,它也只是更快地撞墙。
真正需要补的是:
- 更清晰的产品抽象
- 更稳定的领域模型
- 更明确的工程边界
- 更完整的测试体系
- 更可执行的开发约束
- 更自动化的验证反馈
- 更成熟的组织协作方式
这些东西以前叫工程最佳实践。
在 AI 时代,它们会变成新的生产资料。
甚至可以说,它们正在变成 AI 时代的软件编译器。
最后
所以回到一开始的问题:
为什么同样是 AI,有些公司只能生成 Demo,而另一些 AI Native 公司已经可以让 AI 写大部分代码?
我的理解是:
差距不只在模型。
更大的差距在于软件工程体系本身。
AI Native 公司不是跳过了软件工程,而是把软件工程推到了更极致。
它们不是让 AI 在混乱里自由发挥,而是把需求、架构、规则、测试、工具、反馈都结构化,让 AI 在一个可控环境里执行。
这对传统公司反而是一个很现实的提醒:
不要只盯着“买哪个 AI 工具”。
更重要的是问自己:
- 产品需求能不能结构化
- 领域模型是否清晰
- 系统边界是否明确
- 测试能不能兜住风险
- 发布能不能自动验证
- 文档和上下文能不能被机器读取
- 组织知识是否还只存在于少数人脑子里
这些问题不解决,AI Coding 很容易停留在 Demo 和局部提效。
这些问题逐步解决,AI 才可能真正进入生产系统。
代码会越来越便宜,但好系统不会自动变多。
未来真正稀缺的,可能不是会不会让 AI 写代码,而是有没有能力把一个复杂系统描述清楚,并让它持续、稳定、可验证地演进。