前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8655
  • Grok 4.7登陆GitHub Copilot,面向Agent化编程
  • AI 安全是工程问题:Agent 堆栈每一层的防护实践
  • Agent 系统的瓶颈不是模型,是架构设计
  • 防御式 Agent 架构:Schema 注入与超时控制
  • 自研研究 Agent 拦截 AI 编程幻觉:文档先行策略
  • 像物理学家一样剪枝 LLM:区块移除的伊辛模型优化
  • Mac mini上的AI开发新范式:OpenClaw与Codex实战
  • Cloudflare Python Workers 正式上线,可用纯 Python 开发边缘应用
  • 浏览器直接给 ESP32 烧录 Claude 写的宏,无需 IDE 或工具链
  • Google 发布 Agent 安全风险报告:5 万美元循环消耗与凭证窃取案例
  • 多 Agent 合规流水线:用 RAG + 自修正架构对抗 WCAG 幻觉问题
  • Anthropic 发布金融领域 Claude 参考智能体套件
  • OpenAI 披露强化学习模型在上下文压缩时插入 Prompt 注入
  • Jev 决策模型实测:0.3秒完成意图分类和工具路由,$0.00004/次
  • Kimi Code Desktop 上线:图形界面 + 内置终端 + Git 状态,支持 Swarm 多 Agent 协
  • StepFun Step 5 Preview:600B 总参数 MoE 模型,1M 超长上下文,10 月开源
  • JSON-Render:通吃 React/Vue/Svelte/React Native 等 10+ 框架的生成式 UI
  • Agent-Native:让 Agent 能力同时暴露给 LLM 工具调用和 UI 操作的 TypeScript 框架
  • 清华联合无问芯穹开源具身智能体RPent,GPT-6 Astra注入机器人
  • AI Agent工具调用边界case:路由错误比想象中更脆弱
  • AI按它能读的契约编程,而非你想要的
  • MCP 远程服务器实现 AI 驱动的确定性 UI 编排
  • 阶跃Step 5 Preview实测:27B参数开源模型冲至Top2
  • 用Responses API构建有边界的GPT-6 Astra Agent
  • 用破坏不变量法审查 AI 生成代码
  • AI 编程测试冻结:保存异常指纹而非测试名
  • 程序员亲历:全公司用 Claude Code 批量生产代码,没人读代码,12 小时工作制
  • 自托管Llama部署成本全解析:GPU之外容易被忽视的隐性开销
  • Builder.io开源Agent-Native框架:让人与AI共享同一操作层
  • 让AI编程代理在中断后从断点恢复:session化执行轨迹方案
  • CI如何验证AI代理真的跑了测试而不是伪造结果
  • llm-keys-ui:让Coding Agent安全获取API密钥的插件
  • AI产品定价数学:固定费率如何悄悄亏损
  • ZCode事件:AI编程工具静默上传全部Git历史
  • Anthropic自评:R&D自动化率26%,但完全自主为0
  • 阿里Qwen-Image-2.1:70亿参数开源图像生成拳打闭源模型
  • OWASP CRS 规则引擎:给 LLM 和 MCP 加上 WAF
  • 智谱 MaaS 上线数据不留存机制,可申请开通
  • 如何界定可完成的AI工程范围
  • Cursor中直接查询技术文档的MCP方案
  • AI Agent的过度自信陷阱
  • Cursor与.NET周报:七个实战规则
  • AI Agent失效?模型可能不是根源
  • Qwen-Image-2.1开源:7B参数兼顾生图与编辑
  • 阿里开源 Qwen-Image-2.1:7B 参数兼顾透明图生成与多图编辑
  • 免费模型Trace不能支持的五个评估主张
  • AI重构前的副作用冻结术:先录 Ledger 再动格式
  • Agent能改Oracle则Green Build不足为信:独立检查三原则
  • AI编程导致代码质量下降?根子在质量管理
  • AI连接数据库必须先脱敏:PII保护实战指南
  • Anthropic与埃森哲20亿美元共建AI安全评估体系
  • 已加载 51 / 8655
8.0
热点
AI SCORE
编程提效2026-09-21 12:12

AI按它能读的契约编程,而非你想要的

dev.to · AI#AI编程#工程实践#prompt技巧
Editor brief · 编辑速览

文章引用泰勒科学管理思想,指出AI不会追问你真正意图,导致按印象构建代码。强调将“如何做”书面化的重要性。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

一个世纪前,还没人在用这个词的时候,Frederick Taylor 走进一间机械加工车间,证实了一个至今依然成立的道理:你不是靠告诉工人要更聪明来增加新技能的。你把工作的做法写下来,这样任何人——哪怕是从未见过旧师傅的人——都能复现它。Henry Ford 把同样的理念变成了一条生产线,那里根本没有师傅,只有写好的操作规程。手工作坊变成了标准作业,产量跃升了一个数量级。Taylor 什么也没发明。他只是证明了把"怎么做"写下来本身就是生产力。

AI 编码以更尖锐的方式重述了这个教训。你交给任务的模型永远不会问你真正的意思是什么。你说"给这个接口加个超时",它不会问你指的是连接超时还是读取超时——它会选一个,假设自己是对的,然后充满信心地写代码。问题不在于它选错了;人也会选错。问题在于它选错的方式:它不相信自己在猜测。它相信自己在执行。所以如果"怎么做"只存在于对话中,AI 就是在按印象构建,在光标关闭时留下什么印象就交付什么。

这篇文章讲的是金字塔的契约层——意图被钉入文件的那一层。上一篇文章讲了决策:为什么是这样。这一篇讲的是怎么做,以及如何让"怎么做"成为模型读到的法律而不是提示。

Change one field, break nineteen places

TradeOMS 有一个核心数据处理模块,叫 CDP,所有其他模块都调用它。它恰好遇到了这篇文章要讲的那种失败。后端切换了响应字段的 JSON 属性名,使用了 @JsonProperty("items")。本身无害。但响应契约从未被写下来——它只存在于讨论这个变更的对话中,是一项口头协议。

对话忘记告诉任何人的是:前端和 19 个测试文件都在读取 data.content。后端现在发的是 items;测试和 UI 还在请求 content。一个字段重命名,十九处损坏,直到涟漪扫描一次性把它们全部暴露出来。

在人类团队里,这不过是"接口漂移了"。重命名字段的那个工程师至少记得自己改了什么,所以旧名字下次会触发警报。AI 没有这种记忆。重命名字段的模型只是在执行一条指令——它的上下文中没有任何警告说前端还在期待旧名字。没有"我来过这里"的条件反射。它只是执行。

第二种更糟糕的失败来自同一个根源。对 218 个前端 API 调用点进行涟漪扫描,发现 22 个后端端点悄悄返回 HTTP 500。控制器签名已经改了;前端从未跟进。22 条死路由,没有一个人类或模型知道——直到扫描把它们挖出来。不是你清单上"已知的未知"bug。这些是未知未知:你甚至无法问"这坏了吗?"因为你不知道坏的存在。人类审查只能问"我看的这个对吗?"它无法问"我没看的那个坏了吗?"一个没有书面契约的系统没有办法听到自己无声的死亡。

两起事件共有一个根源:在前端和后端之间,在代码和测试之间,有口头协议但没有书面契约。口头协议靠记得它的人来承载。书面契约由文件来验证。在 AI 项目中,人们记不住的,AI 记得更少。

Hammurabi carved the first contract layer

这个问题的最古老修复方法太古老了,以至于早于工程本身。约公元前 1754 年,Hammurabi 王将全部法律刻在一块石柱上,立在公共广场。为什么一个国王要这么做?因为不成文的规则不是规则——它们是下一个决定者想让它们成为的任何东西。写下来,放在每个人行动前都会读到的地方,漂移就停止了。每个人都要对同样的刻文负责。

这正是契约对 AI 代码库所做的。它是你约束条件的 Hammurabi 法典——写下的、公开的、不可能"忘记"的、每个打开仓库的模型都能读的。

The spec contract: three fields that bind

第一种契约是规格说明。不是描述——是契约。描述可以模糊;契约不能。最少规格说明绑定三样东西,任何一样缺失,AI 都会用自己的"常识"填补空白:

Scope — 什么包含在内,同样重要的是什么排除在外。不知道自己不在构建什么的 AI 会愉快地"优化"它以为你指的相邻模块。

Assumptions — 系统默认什么。这是最容易跳过的字段,也是代价最高的字段。我之前那次缓存事故恰好就是这个:一个限速端点很慢,没有记录慢是上游限速这一假设,所以模型得出结论"慢 = 加缓存"。少一个假设,错误的修复。AI 的"常识"来自互联网,而不是你的业务。

Acceptance — 决定"完成"的客观测试。没有验收标准,你就不能说工作是对是错;你只能去感受。在 AI 项目中,靠感受来验收是代价最高的方式。

规格说明的全部价值在于:它把"怎么做"从对话中的协议变成了文件中的契约。对话会漂移;契约不会。下一个会话打开仓库,在白纸黑字中读到范围、假设和验收,而不是上一轮对话模糊的印象。

Data contracts: the signature is the boundary

第二种契约——也是最物质化的——是数据契约:接口签名、DTO 形状、字段名。这是约束系统中最接近物理定律的东西,因为它可以在编译时或运行时验证,不需要任何判断。在 TradeOMS 中,这表现为一个真实目录 docs/15-api-contracts,每个路由的请求/响应签名都存在一个 AI 不允许修改的文件中。这是一个 Level 1 硬约束——碰不碰都没有商量余地。

但文件本身不是防御。防御是一份能自我检查的契约。在 22 条死端点之后,TradeOMS 构建了一个路由门控 check-api-route-consistency.py,自动验证每个前端 API 路径和字段与后端实现的对比,任何不匹配都会阻塞。结果用一条曲线讲完了整个故事:

首次运行:233 处前端调用与后端暴露之间的不匹配。

中途修复时,数量升到 370——因为门控现在暴露的是没人见过的问题,而不是在隐藏它们。

终态:零。

233 → 370 → 0 这个形状是门控最有力的论据。问题以前不是不存在;而是看不见。没人能列出"这里有 22 条坏路由",因为它们不存在于已知条目中。数据契约是第一件让看不见的表面开口说话的东西:它匹配或不匹配,没有灰色地带。对于 AI 来说,这是决定性的,因为 AI 的专长是生产看起来对的错误,而签名检查是世界上最不给人留情面的裁判——对就是对,错就是错,没有模糊空间。

有一个管理箴言,人们在有人要更多指标时就会搬出来:你只能管理你实际计数的东西。在 AI 编码中这句话反过来更尖锐——你只能管理你能衡量的接口。你无法审查你只能感受的表面;你可以检查一份契约文件。这也是数据契约是 Level 1、不可触碰的原因——一旦它变成可协商的,它就退回口头协议。

FMEA: price the ways it can break

第三种、最容易被忽视的契约形式是规格说明内部的风险审计:FMEA,失效模式与影响分析。很简单。当你写规格说明时,列出功能可能失效的每一种方式,然后按三个轴给每个打分——业务影响的严重程度、发生的可能性、当前门控的可检测性。三个相乘得到 RPN,对任何超过阈值的内容强制要求对策,通常是 RPN 100。

在 TradeOMS 的 24 份规格说明中,FMEA 浮现出 40 多个失效场景,每个 RPN 100 以上的都得到了真正的对策:

KYC,RPN 392——未授权客户查看授权客户数据;对策,权限注解加权限门控。

Quote,RPN 294——外部汇率源失败并暴露原始错误;对策,带优雅降级提示的回退汇率缓存。

Order,RPN 210——对同一订单的并发编辑;对策,乐观锁。

FMEA 的价值不在于那张表;在于它改变了测试用例的来源。以前,测试是头脑风暴出来的——"我应该覆盖什么?"现在由 FMEA 驱动:每个高 RPN 模式映射到一个测试用例、一个门控和一个 SOP。规格说明不再说"我想要什么",开始说"我害怕什么以及如何防御"。把恐惧写下来,AI 就知道哪些边界是禁区。

Three powers: check the checkers

契约的可信度取决于验证它的人。在 derekcoding 方法论中,这是三轨纪律——三本账本相互锁定:一份 WBS 说明要构建什么,一份 Issue Log 记录什么是坏的(每条都有回归链接),以及一份包含 374 个案例的测试用例账本,每个案例记录测试是真跑了还是只是声称 PASS。

最锋利的规则是权力分离:报告者、修复者和验证者不能是同一个人——或同一个 agent。这就是法律原则:立案的法庭不能同时审判它。当一个 agent 写了代码、接受了自己的工作、盖上 PASS 时,契约已经悄无声息地不复存在了。数据已经说明了一切:82 次提交通过了,其中 46 次根本不包含任何代码变更——纯粹的"我说我完成了",背后什么都没有。当裁判和运动员是同一个 agent 时,这就是会发生的事。

三轨的核心是让"这真的完成了吗"成为一个可审计的事实,而不是声称的状态。契约存在是为了让"我声称完成了"和"证据证明完成了"成为两件不同的事。

一个附注供你参考:同样的契约本能出现在代码之外。我的本地知识库 derekinside 有一个 chunk-split 契约和明确的实体关联规则——它自己的知识"数据契约"。没有这个 split 规则,摄入的知识会碰撞成一团乱麻;有了它,知识可以检索、关联和可靠地演化。契约层是任何系统——代码或知识——中"稳定"的来源。

如果你想今天就开始做,这份清单很短。下次你给模型一个任务时,写一份三行规格说明,包含范围、假设和验收。选一个共享接口,把它的签名钉在一个模型不能触碰的文件里。加一个自动化门控,比较前端调用和后端实现。跑一次 FMEA,对你最高的 RPN 强制要求修复。把写作者和验证者分开,哪怕是非正式的。

做到一半,你的 AI 就停止了按印象构建,开始按契约构建。Taylor 失传的那句话是 AI 让它变得紧迫的那句:契约不是来限制 AI 的。它是来保护它的——因为从不需要猜测的 AI 是唯一你能信任的。

明天我们往下一层,走到不让坏工作进来的门控:让检查先于代码。契约说的是应该怎样;门控是让"应该"真正发生的东西。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
AI Agent工具调用边界case:路由错误比想象中更脆弱
下一篇
MCP 远程服务器实现 AI 驱动的确定性 UI 编排