惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
Latest news
Latest news
S
Schneier on Security
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
Spread Privacy
Spread Privacy
Cisco Talos Blog
Cisco Talos Blog
T
Troy Hunt's Blog
S
Secure Thoughts
C
Cisco Blogs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
O
OpenAI News
L
LINUX DO - 最新话题
T
Threat Research - Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园_首页
月光博客
月光博客
博客园 - 【当耐特】
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
D
DataBreaches.Net
美团技术团队
B
Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
有赞技术团队
有赞技术团队
D
Docker
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
H
Hacker News: Front Page
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
AI
AI
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

祝融说。

抱朴守缺。 肩吾 huan(幻) PinConsole Terminal Hole 共识并不平均,但是基本上均衡。 权力是共识切片的曲率。 存在不是「是什么」,而是一系列极小的,从分歧到共识再到分歧的,连续的构建过程。 分歧实际上是对共识往哪个方向延伸的拉力。 分歧是尚未落实的实在,是可能性基底中尚未被锁定的在共识中相互牵引的可用余量。 权力从来不是中立的,它是带有倾向性的「牵扯力」。 过程即完备,容错即自由。 第10章 逆向投喂:用真实数据让AI做出精准诊断 第11章 测试电网:用刚性指标代替肉眼审查 第12章 定期“垃圾回收”:别让系统背负AI制造的债务 第13章 防退化契约:确保每一次修改都是在进步 第14章 全生命周期演练:从零开始用“有效约束”交付一个项目 第15章 随身工具包:即查即用的约束指令库 第1章 这不是结对编程,这是“人机共生” 第2章 你必须警惕的三个陷阱 第3章 把话说死:用 Markdown 建立 AI 的“单源真相” 第5章 模块化解耦:让AI每次只面对一个小问题 第6章 上下文断头台:善用 `/clear` 斩断错误蔓延 第7章 剥夺执行权:强制 AI 像资深工程师一样“慢思考” 第8章 角色锁定:用一句话给AI戴上“思考帽” 第9章 遥测驱动:帮AI长出“千里眼”和“顺风耳” 结语:成为系统牧马人,而不是代码搬运工 第八章 金融与科技的“禁手”:现代战争的底层收敛 第二章 认知锚点:心理战中的“强制步” 第九章 历史的单行道:那些被剥夺国运的时刻 第六章 消费主义的迷宫:在货架上剥夺选择 第七章 战略逼压:没有硝烟的“切香肠战术” 第三章 构造绝杀:逻辑闭环的艺术 第十二章 绝对零度下的生机:成为“不可测”的人 第十一章 掀翻棋盘:非对称竞争与正交化打击 第十章 识破隐形控制:第一时间嗅到危险 第四章 标准的暴政:打造“不得不”的生态 第五章 锁死阀门:关系链与供应链的囚笼 第一章 降熵法则:时空维度的隐蔽控制 结语:愿你在这个被设定的世界里,永远握有掀桌的权力。 引言:自由意志的幻觉 项羽 当前的AI工程化本质上是受限于上下文长度而采用的「以提示词约束去置换确定性」的一种妥协。 即时反应是一种不假思索,它是观念通过最简单、轻易、高效的路径寻求表达。 青衫 第九章:估值的坐标:建立“内在记分牌” 第六章:资产重估的艺术:从“硬实在”到“认知折价” 第七章:预期差交易:坍缩“概率波” 第十一章:内在博弈:克服‘评估异化’ 第十章:交易的算法:逆人性的“人之道” 第五章:空间套利:高能耗产业的跨境建构 结语:构建你的“财富多重宇宙” Code-Coder 第八章:效率革命:细分赛道的“降本增效” 第二章:评估权的博弈:商业模式的权力差序 第三章:去伪存真:穿透“符号泡沫” 第四章:能源共识:黑金的物理法则 第一章:宏观观察者:借势“国家共识” 前言:从“市场囚徒”到“清醒的观察者” Code-Ledge-X Code-Lint-X
第4章 负空间设计:先规定“不准做什么”,再让它写代码
祝融 · 2026-05-16 · via 祝融说。

在艺术与设计领域,有一个极其重要的概念叫做“负空间”。它指的是主体对象周围和之间的空白区域。一位平庸的画师,眼中只看得到他要画的苹果;而一位大师,则同时看到了苹果本身,以及由苹果的轮廓所“切割”出的、周围那片天空的形状。大师懂得,通过精心雕琢“空白”,能让主体变得更加突出、有力、轮廓分明。

这个深刻的理念,完美地迁移到了AI编程领域,并构成了一种最高级的约束艺术:负空间设计。

传统的AI编程,我们称之为“正空间设计”。我们绞尽脑汁,试图用越来越详尽、越来越精确的语言,去告诉AI“要做什么”。“请用React写一个组件,使用useStateuseEffect,从API获取数据,然后渲染一个列表……”我们试图在AI无限的可能性中,为它描绘出那个唯一正确的“苹果”。

而负空间设计,则是一种截然相反的、更高维的思路。我们不再执着于描绘苹果本身,而是转而雕刻它周围的“空白”。我们用一系列清晰、无情的“不准”指令,砍掉所有错误的可能性,最终,那个我们想要的、唯一正确的“苹果”,会作为所有可能性被排除后剩下的唯一形状,自然而然地浮现出来。

这一章,我们将学习如何从一个“提示工程师”,进化为一名“约束架构师”。你将掌握一种看似反直觉,却能带来指数级掌控力的强大武器:通过告诉AI“不准做什么”,来引导它做出唯一正确的事。

4.1 禁止指令比实现指令更有价值

在与大语言模型协作时,一个经过精心设计的“禁止指令”的价值,往往远超十个“实现指令”。这个看似悖论的结论,源于我们对AI本质的深刻理解。

为什么“禁止”更有效?—— 从“无限可能”到“唯一路径”

AI大模型的核心,是一个概率可能性的引擎,而不是一个逻辑确定性的引擎。当你给它一个“实现指令”,比如“写一个函数来处理用户上传的图片”,你实际上是把它扔进了一个浩瀚无垠的“可能性海洋”里。

  • 它可以用Pillow库,也可以用OpenCV
  • 它可以先把图片存到内存,也可以先存到临时文件。
  • 它可以支持PNG、JPG,也可能忘了要支持GIF。
  • 它可以返回处理后图片的路径,也可以返回图片的二进制数据。
  • ……

这片海洋里有成千上万条“看似可行”的路径。AI会根据它的训练数据,选择一条概率最高的路径。但这条路径,有99%的可能性,与你项目中已有的架构、规范和隐藏约束是不兼容的。于是,你陷入了无尽的“修正循环”:“不,我希望你用Pillow”、“不,要先存到临时文件,防止大文件撑爆内存”、“你忘了处理WEBP格式了”……

现在,我们切换到“负空间”的思维模式。我们不再告诉它怎么游,而是开始在海洋里修建堤坝。

“我要你处理用户上传的图片。但是:

  • 禁止使用OpenCV或任何除了Pillow之外的图像处理库。
  • 禁止将整个文件一次性读入内存,必须使用流式处理或者分块写入临时文件。
  • 禁止在函数内部硬编码支持的文件格式列表,必须从一个全局的配置文件config.py中读取。
  • 禁止函数返回二进制数据,必须返回处理后文件的绝对路径。”

看到了吗?我们没有教AI一步一步怎么做。我们只是用四条“禁止指令”,封死了成千上万条错误的道路。AI这艘巨轮,被我们修建的堤坝,自然而然地引导进了一条唯一的、狭窄但绝对正确的航道。它剩下的“创造力”空间被急剧压缩,只能在我们规定的框架内,生成那个唯一符合我们架构的解决方案。

“禁止指令”的四大核心价值:

  1. 大幅降低AI的“选择困难症” AI并不真的“思考”,它是在庞大的向量空间中寻找最相似的模式。过多的选择,只会增加它匹配到错误模式的概率。“禁止指令”通过消除错误选项,极大地净化了它的“思考环境”,让它更容易匹配到正确的代码模式。

  2. 将你的“隐性知识”显性化 为什么你比AI更懂你的项目?因为你脑中有大量无法用几句话描述清楚的“隐性知识”和“工程直觉”。比如,“我们项目绝对不能引入带C++绑定的库,因为那会让部署变得无比痛苦”。这种知识,很难通过一个“实现指令”传达。但用一个“禁止指令”就异常简单:“严禁引入任何需要编译C++扩展的Python库。” 这条禁令,将你宝贵的、血泪换来的经验,变成了一条AI可以理解并严格遵守的规则。

  3. 极大降低你的“审查成本” 审查一段代码是否“实现”了你的意图,是一件非常耗费心智的事情。你需要理解它的全部逻辑,评估它的效率和优雅程度。

而审查一段代码是否“违反”了你的禁令,则简单得多。它变成了一个机械的、清单式的检查:

  • 它用OpenCV了吗?——没有。
  • 它把文件读进内存了吗?——没有。
  • 它硬编码文件格式了吗?——没有。
  • 它返回二进制数据了吗?——没有。

你的大脑从一个“开放式问答”的重负中解脱出来,变成了一个轻松的“选择题判断”。这让你能把精力聚焦在更高维度的业务逻辑审查上。

  1. 它是对抗“熵增螺旋”的终极武器 我们在第二章讲过,AI天生倾向于“打补丁”。“禁止指令”是阻止这种行为的防火墙。
  • 弱指令(实现):“请为这个函数增加缓存功能。”(AI可能会直接在函数内部加一个全局字典来当缓存,造成内存泄漏和线程安全问题。)
  • 强指令(禁止):“请为这个函数增加缓存功能。禁止在函数内部实现任何缓存逻辑。必须使用Python的functools.lru_cache装饰器。”

通过禁止“手动实现”,你强制AI使用了更标准、更健壮、更符合工程最佳实践的方案。

从现在开始,请转变你的思维。在向AI提问前,先不要急着想“我该让它做什么”,而是先花一分钟自问:“为了让这个功能以正确的方式被实现,我必须禁止它做什么?”

这个问题,是你从AI使用者,迈向AI驾驭者的分水岭。

4.2 划定能力边界:哪些是核心流程,哪些是绝不允许触碰的红线

掌握了“禁止指令”的威力,下一个问题就是:我们应该“禁止”什么?

胡乱地设置禁令,并不能带来好的结果。一个高效的约束架构师,懂得如何精准地识别出系统的“生命线”,并围绕它们建立起层层防御。这个过程,我们称之为“划定能力边界”。

想象一下,你正在设计一个高度机密的研究实验室。你不会给科学家一张“可以做的事情”的清单,因为科研是探索性的。相反,你会设计一个极其严格的“环境和协议”。

  • 核心区域(允许自由探索):在生物安全柜内部,科学家可以自由地进行实验操作。
  • 缓冲区(严格协议):从实验室到外界,必须经过层层消毒和检查程序。
  • 绝对红线(严禁触碰):实验室的通风系统、电力系统、警报系统,是绝对不允许任何科学家私自改动的。

我们的软件系统,也应该用同样的方式来设计与AI的协作边界。

第一步:识别你的“绝对红线”

“绝对红线”是那些一旦被AI触碰或误解,就会导致整个项目架构崩溃、安全出现漏洞、或陷入维护地狱的核心原则。这些红线,构成了你AGENTS.mdARCHITECTURE.md中“Absolute Prohibitions”部分的核心内容。

如何找到它们?你可以从以下几个维度去思考:

  1. 架构的“主心骨”

这是保证你项目“形神不散”的根本。

  • 分层原则:“严禁UI层的任何模块,直接import数据访问层的模块。”
  • 依赖方向:“严禁领域模型层,依赖任何外部框架或库。它必须是纯粹的、无依赖的业务逻辑。”
  • 状态管理:“严禁通过props之外的任何方式,将数据从父组件传递给孙子组件(必须使用全局状态管理器或Context)。”
  1. 安全的“生命线”

这些是保护你的应用和用户免受攻击的最后防线。

  • 输入验证:“严禁相信任何来自客户端的输入。所有API的入口处,必须对请求体进行严格的验证。”
  • SQL注入:“严禁将任何变量直接拼接到SQL查询字符串中。必须使用参数化查询。”
  • 权限控制:“严禁在API实现中,仅依赖前端传递的角色信息。必须在后端,根据当前用户的会话,重新查询并验证其权限。”
  1. 性能的“瓶颈点”

这些是防止你的应用在用户量增长后崩溃的关键。

  • 数据库查询:“严禁在循环中执行数据库查询或API调用(N+1问题)。”
  • 内存使用:“严禁一次性将一个可能很大的文件(如用户上传)或数据库查询结果,完整加载到内存中。必须使用流或分页。”
  1. 团队协作的“契约”

这些是保证多人(及多AI)协作时,代码风格和质量保持一致的规则。

  • 代码风格:“严禁提交任何未通过ESLintPrettier检查的代码。”(这可以变成一个自动化脚本,但先作为AI的约束也很有用)
  • 测试覆盖率:“严禁为新的业务逻辑功能,编写低于80%覆盖率的单元测试。”

这些“绝对红线”一旦确定,就应该被视为“天条”,在项目文档中以最醒目、最不容置疑的语气写下来,并成为你审查AI代码时的第一道防线。

第二步:定义“核心实现流程”

划定了红线,剩下的区域,就是我们可以放心交给AI去发挥其强大生产力的“核心实现流程”。但这不意味着完全放任不管。在这个区域内,我们的约束,从“严禁做什么”,变成了更精细的“应该如何做”的引导。

这种引导,依然可以用“负空间”的思路来构建。我们通过排除次优方案,来让AI选择最优方案。

【场景】实现一个前端搜索框,带防抖功能。

  • 传统的“实现指令”:“请实现一个带防抖的搜索框。”(AI可能会手动用setTimeout实现一个简陋的防抖,或者使用一个你不想要的库。)
  • 负空间设计的“流程引导”:
  1. 划定红线:“严禁手动实现防抖逻辑。严禁安装任何除了lodash-es之外的工具库。”
  2. 引导路径:“请实现一个搜索框。当用户输入变化时,需要调用api.search(term)函数。这个调用需要进行防抖处理,延迟时间为300毫秒。必须使用lodash-es库中的debounce函数来完成。”

在这个例子中:

  • “严禁手动实现”、“严禁安装其他库”是边界,它守住了代码质量和项目依赖的纯洁性。
  • “必须使用lodash-esdebounce”是路径,它在边界内部,为AI指明了唯一正确的工具和方法。

通过这种“红线+路径”的组合,我们既保证了架构的稳定,又充分利用了AI在具体实现层面的编码效率。我们成为了一个真正的“领航员”,既为航船划定了不可逾越的暗礁区,也为它在安全水域中标注了最优的航线。

4.3 用“排除法”引导 AI 走向唯一正确的道路

我们现在拥有了强大的武器(禁止指令)和清晰的地图(能力边界)。接下来,是战术层面——如何在日常的开发对话中,灵活地运用“排除法”,像一位循循善诱的导师一样,引导迷茫的AI,一步步逼近真相。

这个过程,就像玩一个“20个问题”的游戏。AI是那个猜东西的人,而你,是通过一系列“是/否”的回答(在我们的场景里是“允许/禁止”),来不断缩小它猜测范围的人。

“约束漏斗”模型

想象一个巨大的漏斗。漏斗最宽的入口,是AI的“无限可能性空间”。漏斗最窄的出口,是我们想要的“唯一正确解”。我们的每一次“禁止指令”,都是在漏斗壁上增加一道滤网,每一次交互,都在让这个漏斗变得更窄。

第一层过滤:全局约束(文档层) 这是漏斗最上层、最宽泛的过滤。它由我们的AGENTS.mdARCHITECTURE.md构成。在开始任何工作前,AI首先要通过这层过滤。

你:“开始新工作。请先阅读项目文档。” AI(内心):“OK,不能用any,不能在组件里fetch,数据库必须是Postgres……” (此时,数以万亿计的错误可能性,已经被瞬间排除了。)

第二层过滤:任务级约束(初始指令) 接下来,你给出一个具体的任务,并附带上针对这个任务的“局部”禁止指令。

你:“我们要实现用户个人资料页。禁止将所有信息放在一个组件里。必须拆分成AvatarCardUserInfoActionButtons三个子组件。禁止在子组件内部发起任何API请求,所有数据必须由父组件通过props注入。” AI(内心):“收到。不能做成一个‘巨无霸’组件。数据流必须是单向的。子组件必须是‘哑’的。” (漏斗急剧收窄。关于组件设计和数据流的数千种错误实践,被排除了。)

第三层过滤:交互式微调(对话中的动态约束)

AI给出了它的第一版代码。你审查后,发现了新的、更细微的问题。此时,你通过对话,加入更精细的滤网。

AI:(生成了代码,但在ActionButtons组件里,直接用了window.confirm来做删除确认。) 你:“代码结构很好。但是,禁止在任何组件中使用浏览器原生的window.alertwindow.confirmwindow.prompt。必须使用我们UI库里的Modal组件来与用户进行交互。” AI(内心):“明白了。交互体验必须统一,不能用原生API破坏UI一致性。” (漏斗变得更窄了。所有关于原生弹窗的实现路径被封死。)

第四层过滤:最终验收(测试与自动化) 在代码基本成型后,你祭出最后的、最客观的滤网。

你:“代码看起来不错了。现在,请为UserProfile父组件编写单元测试。约束:测试覆盖率必须达到90%以上。必须模拟(mock)所有API请求,禁止在测试中发出真实的网络请求。” AI:(编写测试,并为了达到覆盖率,可能会发现它自己代码中一些未曾考虑到的边界情况,并主动进行修复。) (漏斗的出口已经非常小了。只有逻辑严密、考虑周全、高度可测试的代码,才能通过这最后一层过滤。)

通过这个“约束漏斗”模型,我们把一个复杂、开放的“创造”任务,分解成了一系列简单、封闭的“排除”任务。我们不再期望AI一步到位,而是享受这个通过不断收紧约束,将一块粗糙的石头,逐步雕琢成精美艺术品的过程。

这个过程,不仅产出了高质量的代码,更重要的是,它让你——人类开发者——始终牢牢地掌握着项目的主导权和最终解释权。你成为了那个制定规则、调整漏斗、定义“美”与“正确”的最终裁判。

【实战范例】一份高质量约束清单的编写过程

理论讲完了,让我们来一次真枪实弹的演练。

任务目标: 开发一个通用的、可复用的React数据表格组件(DataTable)。

这个任务非常经典。如果直接扔给AI,你可能会得到一个杂糅了各种功能、难以维护的“怪物”。现在,我们作为“约束架构师”介入,用“负空间设计”来主导开发。

第一步:头脑风暴,思考所有可能“做错”的方式

在写下任何指令之前,我们先自己思考。一个DataTable组件,在设计和实现上,有哪些常见的坑和“坏味道”?

  1. 数据与UI耦合:组件内部写死fetch逻辑,导致无法复用。
  2. 状态管理混乱:分页、排序、过滤的状态散落在各处,难以同步。
  3. 渲染逻辑臃肿:在一个巨大的render函数里,用无数的if-else来处理不同的列类型(文本、图片、按钮)。
  4. 功能过度集成:把数据获取、渲染、分页、排序、过滤、导出Excel等所有功能,都塞进一个组件。
  5. 性能低下:当数据量大时,每次重渲染都计算所有单元格,导致卡顿。
  6. API设计糟糕:用几十个props来控制组件行为,难以使用和记忆。

很好,我们已经识别出了这片“雷区”。现在,我们的工作,就是把这些“雷”变成一条条清晰的“禁止指令”。

第二步:将“错误”转化为“禁止指令”,构建约束清单

我们来逐条转化,并遵循前面讲到的“精确、量化、给示例”的原则。

  1. 针对“数据与UI耦合”:
  • 禁止指令:“DataTable组件严禁包含任何数据获取逻辑(如fetch, axios)。它必须是纯粹的‘哑’组件。所有数据必须通过名为data的prop传入。加载和错误状态也必须通过isLoadingerror props从外部传入。”
  1. 针对“状态管理混乱”:
  • 禁止指令:“DataTable组件严禁在内部管理分页(currentPage)、排序(sortKey, sortOrder)和过滤(filters)的状态。这些状态必须由父组件控制,并通过props传入。当用户进行分页、排序等操作时,组件必须通过调用onStateChange这个回调prop,将新的状态对象通知给父组件。”
  1. 针对“渲染逻辑臃肿”:
  • 禁止指令:“严禁在DataTable组件内部写任何if-elseswitch来判断列的类型。列的定义必须通过一个名为columns的prop传入。columns是一个对象数组,每个对象可以包含一个render函数,用于自定义该列单元格的渲染。
  • Do (Good Practice):
const columns = [
{ key: 'name', title: 'Name' },
{ key: 'avatar', title: 'Avatar', render: (rowData) => <img src={rowData.avatarUrl} /> }
];
<DataTable columns={columns} ... />
  1. 针对“功能过度集成”:
  • 禁止指令:“DataTable组件的核心职责仅限于渲染表格的UI。分页、表头排序、过滤输入框等功能,必须作为独立的子组件或外部组件来实现,并通过React的组合模式与DataTable一起使用。严禁将分页栏的HTML直接写在DataTable组件内部。”
  1. 针对“性能低下”:
  • 禁止指令:“为了优化性能,必须使用React.memo来包裹DataTable组件,以避免不必要的重渲染。同时,传递给columns prop的数组,以及其中的render函数,必须在父组件中用useMemouseCallback进行稳定化处理。”
  1. 针对“API设计糟糕”:
  • 禁止指令:“组件的props数量禁止超过8个。相关的props必须组合成对象。例如,所有与分页相关的props(currentPage, pageSize, totalItems)必须合并成一个pagination对象prop。”

第三步:整合清单,形成最终的“创世指令”

现在,我们将以上所有约束,整合成一个清晰、有条理的、给AI的最终指令。

任务:创建一个高度可复用、高性能的React DataTable 组件。

请严格遵守以下所有约束和设计原则。这是绝对的,不容置疑的。

  1. 架构与数据流约束 (Architecture & Data Flow)
  • [P-1.1] 严禁在组件内部包含任何数据获取逻辑(fetch, axios)。DataTable必须是一个纯粹的、受控的“哑”组件。
  • [P-1.2] 严禁在组件内部管理任何持久化状态(如分页、排序、过滤)。所有状态必须由父组件通过props传入,并通过onStateChange回调函数将用户操作通知出去。
  1. API 设计约束 (Props API Design)
  • [P-2.1] 必须通过一个名为data: any[]的prop接收要渲染的数据数组。
  • [P-2.2] 必须通过一个名为columns: ColumnDef[]的prop接收列定义。列定义的接口必须支持一个可选的render: (row: any) => React.ReactNode函数,用于自定义单元格渲染。
  • [P-2.3] 严禁使用超过8个顶级props。相关的props必须组合成对象(例如,pagination: { currentPage, totalItems })。
  1. 功能与职责约束 (Features & Responsibilities)
  • [P-3.1] 严禁将分页、搜索框等UI控件的实现,硬编码在DataTable组件内部。组件的核心职责仅限于渲染<table>结构。这些功能应通过组合模式由外部实现。
  1. 性能约束 (Performance)
  • [P-4.1] 必须使用React.memo包裹DataTable组件的导出。

基于以上所有约束,请为我生成 src/components/DataTable.tsx 文件的初始代码,包括必要的TypeScript类型定义(如ColumnDef)。

看到了吗?这份指令,几乎没有告诉AI“如何实现”,它通篇都在说“不准这样,必须那样”。它是一份架构图纸,一份法律文件,一份质量保证书。

当你把这样一份指令交给AI时,你就不再是一个祈求者,而是一个发号施令的指挥官。AI生成的代码,从一个不确定的、需要你耗费心力去审查和修改的“草稿”,变成了一个高度确定的、基本符合你心中完美蓝图的“准成品”。

这就是“负空间设计”的力量。它让你从与AI的无尽拉扯中解放出来,回归到软件工程师最核心的价值上:思考、设计、定义规则。

从下一章开始,我们将学习如何在更动态、更不可控的“流程”和“环境”中,继续运用和扩展我们的约束能力。