Yadda 3.0:AI Agent 时代的 BDD

我刚刚发布了3.0.0 是怎么做到的到NPM中。

对于不熟悉它的人,怎么做到的?是 JavaScript 的 BDD 库。和 Cucumber 一样,它将普通语言规范映射到可执行代码,但从一开始就设计得对规范书写方式不那么严格。

这意味着,与其写像:

Given a university, The University of Bouvet Island
And The University of Bouvet Island offers a degree course in Computer Science with entry requirements of ABB
And an A-Level graduate, Steve
And Steve has a D in Physics
And Steve has a D in Maths
When Steve applies to study Computer Science at The University of Bouvet Island
Then The University of Bouvet Island rejects the application

你可以写:

The University of Bouvet Island offers a degree course in Computer Science
The entry requirements for which are ABB
Steve is an A-Level graduate
With a D in Physics
And a D in Maths
When Steve applies to study Computer Science at The University of Bouvet Island
They reject his application

两者都是可执行的规范。我觉得第二本书更容易读。

《Yadda 3》发生了什么变化?

Yadda 3.0的大部分内容都是现代化的演习。

Yadda已经存在很长时间,该仓库积累了针对JavaScript生态系统部分部分的集成和工具,而这些现在本身就已成为历史上的好奇。Yadda 3 仅支持 Node,移除了浏览器捆绑和过时的集成,如 CasperJS、PhantomJS、Bower 和 Component,并将测试套件迁移到node:test采用了Biome和lefthook,将源代码现代化为ES6语法,并新增了包括Playwright和Puppeteer在内的当前示例。

它现在也提供了 TypeScript 定义。

这些都很有用,但写起来并不特别有趣。我认为这次发布有两点更为重要。

大部分内容都是克洛德写的

我用Opus 4.8的Claude代码对Yadda进行了现代化改造。

该雅达3.0史诗该项目本身由 Claude 编写,将工作划分为一系列刻意分离的阶段:移除过时功能、更新工具链、与行为变更分开执行机械格式化、现代化源代码、探索 API 变更、更新示例和配置项,然后完成元数据、文档和 TypeScript 定义。

我们在实施前规划了每个阶段,然后我基本上让Claude自己去做。它几乎没有犯错,更令人印象深刻的是,它发现了一些相当细微的边缘案例,这些在最初看似机械现代化时很容易被忽视。

我几乎没有做过干预。

一个重要因素是Yadda已经拥有一套全面的测试套件。我也刻意避免让Claude在同一步修改生产代码和相应测试。如果代理同时改变两者,绿色测试套件的证据就会变弱,因为它可以自由地在实现的同时改变“正确”的定义。

将这些变化分开,给克劳德带来了更严格的外部约束。

从开始工作到软件包发布大约一天时间,我同时还在做其他事情。

今年年初我写过一个关于实验的文章为什么氛围编码的体验会如此两极化.我当时得出的结论是,结果在很大程度上取决于该药剂的使用方式。

一个严格约束和监督的克劳德可以很快产出极好的成果。如果任其自行发展,它往往会走向架构漂移、不必要的代码和运营负担。

那才是七个月前的事,而这项能力已经大幅提升。即便如此,说克劳德现在能在几乎没有干预的情况下编写这段代码,也只是触及了正在发生变化的冰山一角。

编码不再是瓶颈

要理解这个方向,最好不要只想着单个开发者和一个编码代理对话,而是考虑多个代理并行工作。

已经有多种方法可以实现这一点。你可以简单地运行多个Claude Code会话。Git 工作树让每个代理人对抗一个孤立的工作副本。工具包括CMUX让运行一组 Claude 会话更易管理,而 Claude Code Agent View 则提供了另一种方式,查看多个会话的动态以及哪些需要关注。

这些方法都能让你比串联工作更快地构建,但我很快就遇到了另一个极限:我自己管理并行工作的能力。我可以舒适地同时进行三项任务,有时甚至四五项。

除此之外,我开始失去对每个客服在做什么、哪些决策、等待我的任务以及接下来需要复习哪些的背景信息。

此时模型不会超载,机器也不会超载。瓶颈在于协调工作的人。我已经确信,好的编曲是下一个重要的层面。

我并不是唯一得出这个结论的人。我的同事Marco几乎完全描述了这一进程。我的人工智能工程之旅从自动补全的人工智能,经过监督和可信代理,再到并行代理,认知负载成为约束。

他比我走得更远,后来开发了Otto,一个围绕Claude代码和工作树的编排UI,随后转向协调实施、审查、反馈和文档的代理流水线。

更重要的是,人工智能辅助软件开发仍然在极其快速地发展。单个编码能力显著提升,并行执行已成现实,下一个限制越来越多是协调所有这些能力。

实现这一目标的工具和方法发展得同样迅速,甚至可以说比模型更新更为重要。

这又让我回到了Yadda。

为什么现在要更新BDD库?

我一直认为BDD有几个原因。

首先,普通语言的写作要求迫使你明确表达领域,更重要的是,鼓励你持续地表达。如果你在写实现之前先写了这些规范,这个领域语言往往会在代码库中传播。

同样的概念也出现在类和函数名、API定义、数据库模式、CSS类和用户界面中。这赋予了代码库一种事后难以实现的连贯性。

其次,可执行规范比传统程序化测试更容易获取。产品经理、分析师或领域专家有现实的机会理解:

When Steve applies to study Computer Science
Then the university rejects his application

它们更不可能从包含夹具、模拟器、构建器和断言的玩笑测试中提取相同的含义。

第三,BDD为功能测试提供了有用的抽象层。规范描述了意图,而步骤实现则涉及选择器、导航和浏览器交互等机制。这提供了与页面对象模式用户界面的变更通常可以被抽象系统吸收,而不是通过数百次测试泄漏。

不过,这一直都是有代价的。BDD测试最初写作需要更长时间。你需要考虑语言,创建可重复使用的步骤,并抵制写伪装成英语的程序化脚本的诱惑。

回报会在后期出现,比如更好的领域建模、更好的沟通和更易维护的功能测试。这种延迟回报一直让BDD更难被合理化,但我认为人工智能改变了经济学。

可执行规范是代理的非常好的上下文

考虑一个越来越可行的工程工作流程。

会议会自动转录并存储为GitHub讨论。这些讨论会被分析并用于更新项目维基。维基是用来挖掘需求和问题的。这些问题随后由一组编码代理收集、实现、审查和协调。

维基可以告诉你别人认为系统应该做什么。它能告诉你系统以前的功能。它甚至可以告诉你代理推断系统应该做什么。它本身无法告诉你系统是否真的做到了。

可执行的规范可以。这使得BDD在代理开发环境中比以前更有趣。

BDD最昂贵的部分是生产和维护规范。人工智能让很多工作变得廉价。文字记录、讨论或需求几乎可以轻易地转化为候选规范,人工只需专注于语言和行为是否正确,而不是全部打字。

一旦被接受,该规范就不仅仅是文档。它变成了一份合同。

实现代理可以利用它来理解所需的行为。测试代理可以利用它来确定哪些需要验证。审查代理可以利用它来质疑实现。CI可以持续验证。

因为它是可执行的,它能够以维基页面无法做到的方式与软件行为耦合。

这里有一个有趣的反转。BDD的诞生部分是为了让软件规范对人类更有用,但当大部分软件由机器编写时,可执行规范可能更具价值。自然语言为代理提供了丰富的领域上下文,而可执行步骤确保规范始终基于系统的行为。

另一个变化(在 Yadda v3.1.0 中添加)是支持以 GitHub 风格的 Markdown 编写功能规范。这使得它们在仓库中更易阅读,更重要的是,它们能够自然地与项目维基及人类和代理用来理解系统的其他关键知识产物共存。

同样的规范现在可以写成:

# Feature: University applications

## Scenario: Applicant does not meet the entry requirements

- The University of Bouvet Island offers a degree course in Computer Science
- The entry requirements for which are ABB
- Steve is an A-Level graduate
- With a D in Physics
- And a D in Maths
- When Steve applies to study Computer Science at The University of Bouvet Island
- They reject his application

它仍然是可执行的规范,但在GitHub上查看时,它的外观和行为更接近项目其他文档。

Yadda 3 可在 npm 上下载,源代码、文档和示例都在GitHub.

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论