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

推荐订阅源

V
V2EX
PCI Perspectives
PCI Perspectives
Webroot Blog
Webroot Blog
Help Net Security
Help Net Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
S
Securelist
V2EX - 技术
V2EX - 技术
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
Cyberwarzone
Cyberwarzone
C
Cisco Blogs
Cloudbric
Cloudbric
GbyAI
GbyAI
A
About on SuperTechFans
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
P
Proofpoint News Feed
SecWiki News
SecWiki News
T
Tailwind CSS Blog
腾讯CDC
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
T
Troy Hunt's Blog
G
Google Developers Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
V
Vulnerabilities – Threatpost
博客园 - 叶小钗
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Know Your Adversary
Know Your Adversary
T
Tor Project blog
Google DeepMind News
Google DeepMind News
F
Fortinet All Blogs
Y
Y Combinator Blog
H
Help Net Security
Latest news
Latest news

祝融说。

抱朴守缺。 肩吾 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的无尽拉扯中解放出来,回归到软件工程师最核心的价值上:思考、设计、定义规则。

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