课程
我想大家都听说过 Devin,这位所谓的“AI 初级软件工程师”,据说能克隆您的仓库、添加新功能、运行测试,并在您喝完早咖啡之前就发起一个 pull request。
和如今所有 AI 一样,不亲自试试很难判断它到底有多好,所以我决定自己动手。我让 Devin 跑完了完整软件开发生命周期的每一个阶段,并写下了四篇教程,希望能帮助其他开发者把它的价值发挥到最大。
您可以在这里访问 Devin 系列的所有教程:
- 设置与首次 Pull Request(第 1 部)
- 用 Devin 交付一条垂直切片(第 2 部)
- 集成、测试与 CI/CD(第 3 部)
- 安全、部署与运维(第 4 部)
如果您的 GitHub 主页是被遗忘仓库的“墓地”,那您并不孤单。我的主页也堆满了半成品实验。在接下来的四篇教程中,我们会让 Devin 在我被搁置的 fp-ts 习题仓库上大显身手,把去年的 clone-and-run 习题改造成现代的、基于浏览器的学习平台。
先快速说明一下这四篇教程的计划,然后其余内容我们将进入实操。
本系列教程将涵盖什么
我们将“复活”我 GitHub 墓地中的一个副项目,因为 Devin 在面对真实代码、真实测试和一些可供推理的历史时表现最佳,而不是一个空仓库。
这个项目是fp-ts-exercises,收集了一些小挑战,用于在 TypeScript 中讲解函数式编程概念(如 Option、Either 等)。它目前是一个 clone-and-run 的仓库:学习者把它拉到本地,编辑文件,并在自己的终端中运行测试。
我的目标是把这些练习变成一个基于浏览器的交互式操练场,让用户可以阅读讲解、在页面内的编辑器中调整代码,并即时看到测试通过(或失败)。学习者还可以登录保存自己的进度。
注意:我是在编写这些教程的过程中与 Devin 一起更新了仓库。上面的链接展示的是 2023 年 4 月、我搁置项目前的代码状态。最新代码请见这里。
我们的四部分计划如下:
- 第 1 部——设置与首次 Pull Request
- 注册 Devin,连接 GitHub。
- 让 Devin 清理仓库:升级依赖、创建新的 lint 规则和脚本,并打开它的第一个 PR。
- 第 2 部——交付功能
- 使用 Devin 规划新的浏览器 UI 和 API。
- 构建页面,设置数据库、密钥,并让 Devin 打开功能 PR。
- 第 3 部——集成、测试与 CI/CD
- 引入 Vitest/Playwright 测试,并让 Devin 保持它们为绿色。
- 生成 GitHub Actions 流水线,把工单关联至 Jira,并将 Devin 连接至 Slack。
- 探索 Wiki 功能。
- 第 4 部——安全、部署与运维
- 添加认证,部署我们的应用,并接入 Sentry 进行错误监控。
到最后,旧的 CLI 仓库应该会变成一个打磨精良的 Web 应用!
在开始动手之前,先给 Devin 做个整体介绍。如果您已经了解 Devin 是什么以及如何工作,可以直接跳到设置部分。
什么是 Devin?
Devin 是 Cognition 开发的一款云托管、全自主的编码代理。您把它放进一个仓库后,它会开启沙盒化的 shell、编辑器和浏览器,然后在不触碰您本地机器的前提下,端到端地规划并执行任务。
它于 2024 年 3 月发布,Cognition 的博客文章称,Devin 在 SWE-bench 基准上关闭了 13.86% 的真实 GitHub 问题,远超此前 1.96% 的 SOTA。实际上,这意味着在一个精心挑选的子集(570 个问题)上,它在无人帮助的情况下修复了来自 Django、scikit-learn 等热门项目的 79 个 Bug。
这很惊人,但这是基准测试代码(由明确的小缺陷和测试套件构成),与真实世界仍有差距。无论如何,有人认为它的表现可与初级开发者相当。
Devin 的适用场景
在以下需求中,Devin 是很好的伙伴:
- 增量式仓库升级:它能运行测试、升级依赖并迭代修复破坏,非常适合“把这个 Node 14 项目升级到 Node 20”这类任务。
- 范围清晰的功能工单:给它一个具有明确验收标准的 GitHub issue 或 Jira 工单,Devin 的“规划-编辑-测试”循环就会表现相当不错。
- 非编码任务:重新生成文档、接入 CI 模板、批量格式化文件这些对人类来说枯燥的活,正适合交给代理去做。

不过,Devin 并不太适合:
- 从零开始的架构设计:如果您只是说“从头给我搭一个 SaaS 平台”,它会很吃力。它需要脚手架,并且在有更多上下文时表现更好。
- 模糊的产品决策:让它在 Stripe 与 Paddle 之间选择支付方案,它可能只是随机挑一个。
- 超大的 monorepo:上下文限制意味着它必须频繁换入换出文件,在 10 万行规模的工作区上性能会大幅下滑。
Devin 如何工作?
包括 Devin 在内的所有现代编码代理都会运行一个循环,映射到机器人学的控制周期:
|
阶段 |
Devin“看到”的内容 |
关键技术 |
|
感知 |
读取代码文件、测试日志、终端输出、浏览器 DOM |
代码索引器、日志解析器 |
|
认知 / 规划 |
将用户提示拆解为任务列表,推理顺序与工具 |
基于 LLM 的规划器,带检索增强记忆 |
|
行动 |
执行 shell 命令、编辑文件、点击网页界面 |
安全沙盒(Docker/VM),提供 Shell / 编辑器 / 浏览器工具 |
|
反思 / 学习 |
重新运行测试、检查差异、更新计划(或向您询问) |
自我批判提示 + 向量存储记忆 |
|
持久化 |
保存时间线与工件,便于回放或交接 |
云对象存储 + 时间线 UI |

Devin 由一组分层协作的模块构成:
- 一切从聊天界面或 Slack 机器人/Jira 工单开始,您以提示语的形式阐述目标。
- 提示会交给规划 LLM,它将目标扩展为逐步计划,并在执行前对每一步进行自我批判。
- 一个轻量级执行器随后为每一步选择合适的工具(shell、代码编辑器或无头浏览器),所有这一切都在严格沙箱化的工作区内运行。
- 这个沙箱本质上是一台云端笔记本,隔离凭据,并为 Devin 提供 Bash 提示符、类 VS Code 的编辑器,以及可以点击操作的 Chrome 实例。
- 在工作区之下是记忆层,它存储代码库的向量化快照,以及 Devin 触达的每条命令、文件差异和浏览器标签页的完整回放时间线。

为什么这种架构这么好?首先是紧密的反馈回路:一旦测试失败或 lint 报错,Devin 就能自主迭代,直到构建变绿。
其次,沙箱设计让并行化小任务变得轻而易举,因为多个沙箱可以并行运行且互不干扰。
第三,持久化记忆让 Devin 能处理长周期迁移:代理可以维护一个持续更新的子任务清单,并在数小时或数天内逐步完成,这意味着它能比人工手动快数倍完成批量重构。
开始使用 Devin
先说正事,我们来创建账号。
注册并选择套餐
前往devin.ai,点击“Get Started”。
向导的前几步很容易跟随。我需要回答一些关于我自己、公司和团队名称的问题。如果您像我一样是独立开发者,也没问题,向导对此有适配。
接下来就是选择套餐。有两个选项:
- Core(按用量付费):对大多数独立开发者来说,Core 计划最便宜——您需预付 20 美元,获得 9 个 ACU(Agent Compute Unit,代理计算单元)。
- Teams:Teams 计划每月提供 250 个 ACU。这份官方文档提供了有关 ACU 和 Devin 计费模型的详细信息。

Core 计划的试用成本相对较低,于是我决定付 20 美元看看能走多远。
我填写了支付信息,并看到可以设置自动充值阈值的选项,以便 Devin 在任务进行中自动补充 ACU,避免中途停止。我没有启用这个功能,而且此时也不太建议开启。稍后您可以在设置中再启用,先试一项任务,看看用量如何。您也可以为每次会话设置 ACU 限额,避免超预算。
速算:$20 / 9 ACU ≈ 每 ACU $2.25。Teams 订阅($500/月)把单价降到 $2.00,并预装 250 个 ACU,但只有当您预计 Devin 每月运行 30+ 小时才会更划算。
连接 Github(可选连接 Jira 与 Slack)
接下来需要连接 GitHub 账号,并授予 Devin 访问仓库的权限。

我只给了 Devin 访问我们的 fp-ts 习题仓库的权限,因为它只需了解这个仓库。您也最好这么做,以避免任何意外的代码修改。
完成后,我可以选择连接项目管理系统。Devin 似乎支持与 Jira、GitHub Issues 和 Linear 的集成。

点击 Jira 选项会打开此模态框,黄色的说明指出,最好让 Devin 使用一个特定的服务账号,并且只访问一个工作区,即便这意味着您需要为此创建一个专用的 Jira 账号。

请注意,Jira 集成也可以在稍后通过设置添加,因此此阶段并非必须。
您还可以选择与 Slack 集成,但我暂时跳过了。
第一个任务:升级一个过时的仓库
好了,既然已经设置完毕,我们直接进入有趣的部分。看看 Devin 到底有多能打!
编写提示
初始设置完成后,我们会来到这样一个页面:

毫不意外,一切都从提示开始。我把所有小图标都悬停看了一遍,了解可用功能,然后写下了我的提示。

提示: 几年前,我启动了一个名为 fp-ts-exercises 的仓库,旨在帮助开发者使用 fp-ts 库在 TypeScript 中学习函数式编程。它包含一系列本地练习,涵盖 Option、Either 等概念。学习者会克隆仓库、完成习题,并运行测试检查答案。
我想按以下目标对该项目进行现代化升级并重新发布:
更新并重构现有代码库
- 更新所有依赖,并确保与最新版本的 fp-ts 兼容
- 改进结构、可读性和开发者体验
- 替换任何过时的工具或模式(例如,如合适则从 Mocha 迁移到 Vitest)
这不是一个很好的提示,但这正是我想测试的点。AI 代理的输出质量取决于它收到的输入,一个模糊的目标可以有多种解读。在 Devin 的场景下,沟通不畅的成本不低。如果执行边界和预期产出定义不清,而您又让它做一个半复杂的任务,就会浪费大量 ACU。
我想测试的是“发送”按钮旁边那个“小魔法笔”图标。这是一个“分析提示(Analyze prompt)”功能,可在发送前帮您优化提示,从而更好地发挥 Devin 的能力。
我点了它,它会改写我提示的部分内容,并指出可以改进的地方。

反馈很好,于是我稍微修改了提示,补充了额外要求。当时我还没有设置 lint 或单元测试,于是我指定要在第一个问题的解答上运行学习者测试,以确保应用按预期运行。
提示:我想对我的 fp-ts-exercises 仓库进行现代化升级并重新发布,它用于帮助开发者使用 fp-ts 库在 TypeScript 中学习函数式编程。仓库包含本地练习,涵盖 Option 和 Either 等概念。学习者克隆仓库、完成练习,并运行测试以检查答案。目标是更新项目并改善开发者体验。请执行以下事项:
- 将所有依赖更新至最新版本,并确保与最新的 fp-ts 版本兼容。
- 重构现有代码库,以提升结构、可读性和整体开发者体验。
- 替换任何过时的工具或模式。例如,从 Mocha 迁移到 Vitest,或提出其他合适的工具更新。请为您提出的任何工具更改提供理由。
- 确保在更新和重构后,所有现有练习和测试均能正常运行。
您可以运行 npm run solution -- option 01 来确保测试通过,一切按预期工作。
请说明您将采取哪些步骤来执行更新和重构。在进行重大更改之前,请先提出您的方案并获取反馈。
您可以在 Pull Request 中提交更改以供审查。
果不其然,这次分析提示后弹出了“Prompt looks good!”的提示。

界面
我发送了提示,Devin 立刻开始“思考”。

UI 乍看有点复杂,不过一旦了解各部分用途,导航起来其实不难。我们来分解一下。
左侧是可折叠的活动会话面板,如果您希望一次专注一个会话,可以收起它。
有一个类聊天界面,您可以跟随 Devin 的推理并与之交互。
屏幕右侧是一个带多个标签的面板:Progress、Shell、Browser 和 Editor。这些标签展示 Devin 在不同环境下的具体推理与执行步骤。
逐个点击可以看到它在 shell 中的步骤(比如克隆仓库)、在浏览器中的操作(导航到 GitHub 仓库页面),以及在 Editor 中的操作(一个类 VSCode 的编辑器,包含仓库的所有文件,稍后它会在这里修改我们的代码)。Progress 标签会高亮它正在执行的步骤。
屏幕右上角还有一组标签:Timelapse、IDE 和 Browser。这些是您可以导航和使用的视图。当前选中的 Timelapse 标签展示了 Devin 的进度与操作,如上所述。交互式时间回放功能(您可以看到底部的“Live”和进度条)允许您回放会话。IDE 标签会打开一个在线的类 VSCode IDE,您可以修改代码,甚至提交到 GitHub。
规划与 Devin 的推理
Devin 思考了几分钟,分析了整个仓库,并在每一步都解释了它的操作。注意高亮的“Devin 克隆了仓库,建议设置 Devin 工作区”的消息。我们稍后会回到这个问题。

随后它给出了一个计划,表示信心较高,并让我确认:

我对这个计划很满意,就点了 Confirm。Devin 立刻开始动工。
您能看到聊天界面底部那个“Agent”下拉菜单吗?菜单里的另一个选项是“Ask”。此功能不会打断 Devin 的工作,但允许您与它互动。我决定测试一下,让它添加 lint 和 TypeScript 编译检查脚本。

工作已经开始了,但它告诉我会确保添加这些脚本(结果确实添加了!)。
Pull Request
我没有精确计时,但几分钟后它就准备好了一个 PR,描述详尽准确。


让我惊喜的是,它主动做得比“确保第一个解答的测试通过”更多。它不仅测试了第三个解答,还测试了第一个练习,并检查测试失败(这是预期的,因为还没有学习者完成该练习)。
我审阅 PR 时就怀疑我的 lint 和 TypeScript 编译脚本会失败。比如,我的 package.json 中缺少了 "type":"module"。
我不确定为什么 Devin 在写完这些脚本后没有运行它们来确认是否可用。是因为我没有明确要求?还是因为我在它开始工作后才加了这些需求?
我决定用在线代码编辑器修复 Devin 的疏漏,大约花了 5 分钟。我在终端里把每个命令都跑了一遍,修复后看起来一切都如预期工作。
我本可以把修复交给 Devin,但自己处理更快。大概五分钟里,我运行脚本、确认了 lint 和编译失败,并定位了原因。又过两分钟,补丁就到位,所有检查都通过了。起草一个详细提示、等待 Devin 运行、再审查它的输出,反而更费时间。
在人机协作中找“最佳分工点”是一门微妙的艺术:当一个微调显然是低垂果实时,我宁愿自己动手,也不想打字说“请修这个”然后等待。当然,每个人都有自己的偏好,取舍会因您的经验、任务本身,乃至——说实话——当天的心情而异。
结束会话
到这个时候,我已经完成了仓库的现代化升级,而且一切如预期运作。接下来呢?我该如何结束会话?空闲时间还会继续计费吗?
此时界面有点令人困惑。右侧会话菜单有两个选项:让 Devin 睡眠,或终止会话。


我查了文档,得知 Devin 在睡眠时不会消耗 ACU,并会在约 0.1 个 ACU 的空闲后自动进入睡眠。
我还问了文档的 AI 机器人“睡眠”和“终止”的区别:
答案相当清楚。我们这次的工作已经完成,于是我终止了会话。
在 Devin 工作区中设置我们的仓库
还记得 Devin 规划工作时在聊天里给我们的高亮消息吗?它让我们在 Devin 的机器上设置仓库,这样每次想在上面工作时就不用再克隆了。但我们为什么要这么做呢?每个新会话都会从一台全新的虚拟机开始,所以如果不进行设置,Devin 每次都得:
- 从零开始了解我们的代码库
- 安装所有依赖和工具
- 学习我们的项目结构和约定
- 把宝贵时间浪费在环境搭建上,而非实际工作
因此,设置我们的仓库会更省钱省时。它也更一致,因为每个会话都从同样的配置启动,Devin 清楚如何运行、测试和 lint 我们的代码。
此功能可在您团队的导航面板中找到,步骤依然相当直观易懂。

我们先指定拉取仓库最新版本的命令:

您可以输入自定义命令,点击“Verify Command”按钮会在您面前的终端里自动运行。几秒内即可看到成功或失败。
我跳过了密钥设置步骤,因为我们目前没有。安装和维护依赖也是相同的流程,命令成功后该步骤会标记为完成。

后续步骤也大同小异,所有步骤完成(或不适用则跳过)后,您的配置就会被保存。

会话用量与回顾
到目前为止,我们用 Devin 完成了一个简单任务、创建并合并了 PR,还为未来的会话设置好了仓库。我们来看一下本次会话的数据。点击会话顶部的小图标,会打开一个包含会话洞察的模态框:


我们的会话大小为 XS,按 Devin 的尺寸指南来看相当不错。

如果您点击“Generate Insights”按钮并等待几秒,就能看到有关会话的一些总体信息、Devin 采取的具体步骤以及它遇到困难的地方。

我也很关心我们用了多少 ACU。有点奇怪的是,套餐页面显示我还剩 8.73 个 ACU,尽管我已经用了 9 个中的 1.7 个 ACU(见Core 区域内的蓝色高亮)。

而“Usage & Limits”页面则正确显示我们用了 1.7 个 ACU,还剩 7.3 个 ACU。

18 小时后我再看,套餐页面也显示剩余 7.3 个 ACU,因此其信息更新会有些延迟。请务必以“Usage & Limits”页面为准,避免意外!
值得吗?
我们来算一算。
1.7 个 ACU × $2.25/ACU = 本次会话 $3.83。
我大概花了20 分钟用于编写提示和审阅。要是全程手动,远不止这个时间,而且我会在每一步都拖延,因为这种任务对我来说格外无聊。花一杯卡布奇诺的钱,Devin 替我干完了活。这笔交易我随时愿意做。
接下来做什么?
好的,我们已经:
- 创建了账号
- 连接了 GitHub 仓库
- 在 Devin 的机器上为后续会话设置好了仓库
- 运行了第一次依赖升级任务
- 审阅了会话指标与用量
起步不错!在下一篇教程中,我们会更深入地挑战 Devin 的能力,让它规划并实现完整功能,包括 API 和数据库集成。
如果您已经准备好继续,请点击下方列表的第二项进入第二篇教程:
- 设置与首次 Pull Request
- 用 Devin 交付一条垂直切片(第 2 部)
- 集成、测试与 CI/CD(第 3 部)
- 安全、部署与运维(第 4 部)

我是一名具有产品思维的技术负责人,专注于帮助早期初创公司从首个原型成长到实现产品与市场匹配,并持续向前发展。我对人们如何使用技术充满好奇,热爱与创始人及跨职能团队紧密合作,将大胆的想法变为现实。不在打造产品的时候,我会在世界的新角落寻找灵感,或在瑜伽馆放松减压。