首页
/
论文
/
足够全面的规范并不(必然)就是代码
足够全面的规范并不(必然)就是代码
摘要
本文主张,一个全面的规范并不等同于代码,因为规范定义了一组可能的实现,而代码则是其中的一个具体实例。文章讨论了抽象的作用,并解释了为什么即使在自动代码生成的情况下,仍然需要程序员来编写规范。
<p>上周缺席了,抱歉!生病了,然后又忙了起来。</p>
<p>本周我想谈谈我的一个心头刺,在这幅漫画中表现得淋漓尽致:</p>
<p><a href="https://www.commitstrip.com/en/2016/08/25/a-very-comprehensive-and-precise-spec/?" target="_blank"><img alt="一幅关于业务人员认为详细规范能取代程序员,而程序员则称该规范为“代码”的漫画" class="newsletter-image" src="https://www.commitstrip.com/wp-content/uploads/2016/08/Strip-Les-specs-cest-du-code-650-finalenglish.jpg" /></a></p>
<p>“全面且精确的规范”并不必然就是代码。一个规范对应一组<em>可能的</em>实现,而代码是该组中的一个具体实现。只要该组包含的元素不止一个,规范和代码之间就有区别。</p>
<p>考虑一个业务人员(bp)提出的需求:</p>
<blockquote>
<p>我想要一个能将英里转换为公里的工具。</p>
</blockquote>
<p>这是一个全面的规范吗?也许吧,你可以把它交给 Claude Code,让它做出所有设计决策,它就会给你一个能将英里转换为公里的程序。但同时,这里面遗漏了大量细节。用什么语言?用户体验如何?应该是命令行脚本、移动应用还是企业级 SaaS?正因如此,如果我们把 Claude 的输出交给业务人员,他们很可能会不满意。可能的实现集合中既包含他们想要的程序,也包含大量他们不想要的程序。</p>
<p>于是他们现在说道:</p>
<blockquote>
<p>它应该是一个网站上的文本框。</p>
</blockquote>
<p>好吧,这排除了很多可能性,但仍有很多东西需要决定。用 React、vanillajs 还是 htmx?输出应该是一个单独的文本框还是一个弹出窗口?应该使用 <code>1.6</code>、<code>1.61</code> 还是 <code>1.609</code> 的换算系数?因此你可以争辩说,这仍然不是什么“全面且精确的规范”。但如果业务人员对 Claude 做出的任何东西都满意呢?那么他们的规范就已经足够全面且精确了,因为他们得到了一个能解决问题的程序!</p>
<p>现在,上面的漫画提出了一个更具体的论断:一个规范“足够全面且精确,以至于<em>能生成一个程序</em>”就是代码。这个论断在 LLM 出现之前都不成立。<a href="https://en.wikipedia.org/wiki/Program_synthesis" target="_blank">程序合成</a>,即根据规范自动生成符合要求的程序,是一个活跃的研究领域!据我上次(2019年)的了解,他们只能从类型规范生成局部函数;我不知道随着 LLM 的出现情况有何变化。但这仍然表明,代码和全面规范是两码事。</p>
<h3>规范是抽象</h3>
<div class="subscribe-form"></div>
<p>我要说的是,规范是代码的一种<strong>抽象</strong>。<sup id="fnref:abstraction"><a class="footnote-ref" href="#fn:abstraction">1</a></sup>对于每个规范,都存在一组满足该规范的可行程序。规范越全面、越精确,这组程序就越小。如果 <code>spec1</code> 对应于 <code>spec2</code> 的一个超集,我们就说 <code>spec2</code> 是 <code>spec1</code> 的<strong>精化</strong>。如果一个规范不需要进一步精化,即无论提供何种实现(<em>合理范围内</em><sup id="fnref:reason"><a class="footnote-ref" href="#fn:reason">2</a></sup>),规范制定者都会满意,那么这个规范就是<strong>充分的</strong>。一个规范不需要面面俱到才能算充分。</p>
<h3>程序员仍然需要编写规范</h3>
<p>这幅漫画还提出了另一个论断:“足够详细的规范就是代码”是程序员不会失业的一个理由,即使我们可以从规范自动生成代码。这个论断仍然成立。</p>
<p>我们通常会用形式化语言来表达抽象规范。通常这让我想到 TLA+、UML,甚至 <a href="https://syque.com/quality_tools/tools/Tools104.htm" target="_blank">Planguage</a>,但最常见的例子是测试套件。<a href="https://buttondown.com/hillelwayne/archive/what-is-a-specification" target="_blank">测试也是一种规范!</a>一般来说,让非程序员成功地将东西编码成形式化语言似乎是不可能的。Cucumber 就是一次失败的尝试,它试图让业务人员编写形式化规范。</p>
<p>但这是否意味着一个全面的规范就是“代码”?我不同意。用编程语言编码一个规范是可行的(再次以测试套件为例),但这仅仅是一种编码。规范仍然对应一组可能的实现程序,即使我们不将其编码,规范依然有用。将“代码”和“规范”作为不同的概念保留下来是有益的。</p>
<p class="empty-line" style="height:16px; margin:0px !important;"></p>
<div class="footnote">
<hr />
<ol>
<li id="fn:abstraction">
<p><a href="https://www.pathsensitive.com/2022/03/abstraction-not-what-you-think-it-is.html" target="_blank">必点链接</a> <a class="footnote-backref" href="#fnref:abstraction" title="跳回正文脚注1">↩</a></p>
</li>
<li id="fn:reason">
<p>即实现方应善意地尝试做出合理的实现。例如,“这个程序将英里转换为公里,同时还挖矿”就不是善意的解读。 <a class="footnote-backref" href="#fnref:reason" title="跳回正文脚注2">↩</a></p>
</li>
</ol>
</div>
查看缓存全文
缓存时间:
2026/05/16 03:38
# 足够全面的规范并(不一定)等同于代码
来源:https://buttondown.com/hillelwayne/archive/a-sufficiently-comprehensive-spec-is-not
抱歉上周没更新!我生病了,然后一直很忙。
本周我想聊聊一个让我特别在意的话题,这幅漫画最能说明问题:
一幅关于业务人员认为详细规范能替代程序员的漫画,然后程序员把规范称为“代码”(https://www.commitstrip.com/en/2016/08/25/a-very-comprehensive-and-precise-spec/?)
一份“全面而精确的规范”并不一定就是代码。一个规范对应的是一个**集合**,其中包含所有可能的实现方案;而代码只是这个集合中的一个具体实现。只要这个集合包含不止一个元素,规范与代码之间就存在区别。
想象一下,一位业务人员(bp)提出了这样一个需求:
> 我想要一个把英里换算成公里的工具。
这是一份全面的规范吗?也许是的——你可以把它交给 Claude Code,让它自己做所有设计决策,它会给出一个把英里换算成公里的程序。但同时,还有很多细节被遗漏了:用什么语言?用户体验如何?应该是一个命令行脚本、一个移动应用,还是一个企业级 SaaS?正因为如此,如果我们把 Claude 的输出直接交给那位业务人员,他们很可能不会满意。可能的实现集合里包含了他们想要的程序,但也有很多他们不想要的程序。
于是业务人员现在会说:
> 它应该是一个网站上的文本框。
好吧,这排除了很多可能性,但仍然有很多东西需要决定:用 React、VanillaJS 还是 HTMX?输出应该是一个单独的文本框还是一个弹窗?应该用 1.6、1.61 还是 1.609 的换算系数?所以你可以争辩说,这仍然不是一份“全面而精确的规范”。但如果业务人员对 Claude 做出的任何结果都满意呢?那么他们的规范就已经足够全面和精确了,因为他们得到了一个能解决他们问题的程序!
现在,上面的漫画提出了一个更具体的论断:一份“**足以生成程序**的规范”就是代码。这个说法在 LLM 出现之前就不成立。程序合成(https://en.wikipedia.org/wiki/Program_synthesis)——根据规范自动生成符合要求的程序——是一个活跃的研究领域!我上次在 2019 年关注时,它还只能从类型规范生成局部函数;我不清楚 LLM 出现后情况有何变化。但即便如此,这也表明代码和全面规范是两码事。
### 规范是抽象
我在这里想说的是,规范是一种代码的**抽象**。1(https://buttondown.com/hillelwayne/archive/a-sufficiently-comprehensive-spec-is-not#fn:abstraction)对于每个规范,都存在一个满足该规范的可行程序集合。规范越全面、越精确,这个集合中的程序就越少。如果 `spec1` 对应的是 `spec2` 的超集,我们就说 `spec2` **精化**了 `spec1`。如果一个规范不需要进一步精化——无论提供何种实现(在合理范围内 2(https://buttondown.com/hillelwayne/archive/a-sufficiently-comprehensive-spec-is-not#fn:reason)),规范制定者都会满意——那么这个规范就是**充分的**。规范不必完全全面才能充分。
### 程序员仍然需要编写规范
漫画还提出了另一个论断:“足够详细的规范就是代码”,这是即使我们能从规范自动生成代码,程序员也不会失业的原因。这一点依然成立。
很多时候,我们通过形式化语言来表达抽象规范。通常这让我想到 TLA+、UML 甚至 Planguage(https://syque.com/quality_tools/tools/Tools104.htm),但最常见的例子是测试套件。测试也是规范(https://buttondown.com/hillelwayne/archive/what-is-a-specification)!而且一般来说,让非程序员成功地用形式化语言对事物进行编码似乎是不可能的。Cucumber 就是一次失败的尝试,它曾试图让业务人员编写形式化规范。
但这是否意味着全面规范就是“代码”?我的答案是否定的。确实可以用编程语言来编码规范(又是测试套件),但这种编码只是规范的一种表达方式。规范仍然对应着一个可能的实现程序集合,而且即使我们不编码它,规范仍然有用。将“代码”和“规范”保持为不同的概念是有益的。
相似文章
X AI KOLs Timeline
The article summarizes a talk by Matt Pocock criticizing 'specs-to-code' approaches, arguing that solid software engineering fundamentals like TDD and modular design are more critical than ever for effectively using AI coding assistants like Claude Code.
GitHub Trending (daily)
Spec Kit 是 GitHub 推出的一款开源工具包,支持规范驱动开发,允许开发人员利用 AI 编码代理直接从可执行规范生成可运行的软件实现。
X AI KOLs Timeline
本文探讨了软件工程的重心正从传统编码向系统设计转移,反映出随着代码生成功能日趋普及,整个行业的优先级正在发生变化。
OpenAI Blog
# 介绍 Model Spec 来源: [https://openai.com/index/introducing-the-model-spec/](https://openai.com/index/introducing-the-model-spec/) OpenAI***2025年2月12日更新****:我们发布了 Model Spec 的更新版本。此次更新进一步强化了我们对可定制性、透明度和智力自由的承诺,允许用户自由地探索、辩论和使用 AI 进行创作,不受任意限制——同时确保保护措施仍然到位,以降低真实伤害的风险。该更新也建立在
X AI KOLs Following
Garry Tan 认为,Claude Code 和 Codex 等 AI 编程代理通过使高测试覆盖率变得经济可行,改变了软件工程领域。这创造了一种“复杂性棘轮效应”,确保代码质量在牺牲速度的前提下随时间推移而不断提升。