三周前,我有一个.NET后端,大概有40%的服务已经连好线,还有一个半成品的Vue前端和一个模糊的计划。如今,Rasepi 已经拥有了带词汇表管理和风格规则的块级翻译引擎、带过期模板和审核工作流的新鲜度评分系统、带 RAG 的人工智能语义搜索、带动作保护和事件管道的完整插件 SDK、协作式实时编辑、带定价页面的完整营销网站、开发人员文档门户、带 14 篇文章的博客、7 种语言的自动翻译,以及可实际发送电子邮件的等待列表表单。
这些都不是我一个人完成的。我每天晚上都让 Claude 在 VS Code 中运行几个小时,有时甚至一整天,它真正改变了我的工作。但是,在 "构建一个应用程序 "和 "拥有可以真正卖给其他人的东西 "之间存在着一道鸿沟,这道鸿沟充满了大量的设置页面、手动配置、电子邮件发送设置和 DNS 记录。克劳德还不能与所有这些服务对话。
人们很少谈论这部分。
如果没有人工智能,我能做到吗?
听着,我有 30 多年的软件开发经验。如果没有克劳德,我能完成这一切吗?有可能。但不可能在三周内完成。差远了。人工智能加速了所有涉及向文件中输入代码的工作,而这是任何项目的重要组成部分。
但是,当人们谈论 "虚拟编码 "和用人工智能构建整个应用程序时,他们忽略了一件事:**克劳德可以告诉你使用 D1 数据库部署 Cloudflare Worker 所需的每一个步骤。它可以指导你完成 OpenIddict 配置。它还能解释 DNS 记录和 SPF 设置。问题是,它的知识往往已经过时。平台会更新仪表盘、移动设置、废弃功能、重命名事物。而克劳德却不知道。
我甚至没有只用一个人工智能。ChatGPT 有时对特定服务的了解更多,尤其是当克劳德的训练数据比特定平台的文档晚了几个月的时候。有些时候,我把这两个人工智能并排打开,对照仪表盘上的实际情况,对照它们的建议。
但更深层次的问题是:要想拥有一款畅销的应用程序,你绝对需要了解主机是如何工作的。域名如何运作。代码签名证书如何工作。数据库如何运行。电子邮件发送如何运作。OAuth2 流程如何实际运作,而不仅仅是实现这些流程的代码。没有这些知识,你能构建一个应用程序吗?当然可以。可能不会。你的应用程序只能在本地主机上运行,除了你自己的机器外,谁也不会对你刮目相看。
##感觉像魔术的 80%
让我明确一下哪些工作是有效的,因为这些工作确实很有效。对于创建服务接口、实现 CRUD 控制器、编写 EF Core 配置和构建 Vue 组件来说,Claude 的速度快得惊人。
这里有一个例子。当我需要添加词汇表管理系统时,我描述了需求:租户范围的词汇表、CSV 导入/导出、单个术语 CRUD 以及与 DeepL 的词汇表 API 的同步机制。克劳德制作了实体模型、服务接口和实现、带有适当授权属性的控制器以及 Pinia 存储。这一切大概只用了 20 分钟。如果是我手工编写,可能要花上大半天的时间。
翻译引擎也类似。采用 SHA256 内容散列的块级架构、静态检测、协调服务的协调器。我解释过一次之后,克劳德就理解了这种模式,然后在几十个文件中进行了一致的复制。新鲜度评分系统、审查工作流、过期通知管道。服务一个接一个,连接起来并开始工作。
在营销网站上,克劳德根据描述创建了整个 HTML 页面。"定价页面包括免费层、团队层和企业层。深色背景。使用绿色点缀"。它就这样......生成了一个。包括响应式断点和悬停状态。
这就是神奇的部分。它是真实的。
驯服机器
但我并不是打完 "给我做个应用 "就一走了之。与克劳德合作是一门技术活,我最初几天做得很糟糕。
最初的输出总是......很好。技术上正确,结构合理,但很一般。克劳德写代码的方式就像写散文一样:称职、可预见、非常一般。如果任其发展,它就会产生每个框架教程都会使用的控制器结构。同样的服务模式。同样的组件布局。虽然能用,但不是你的。
所以你开始训练它。不是形式上的,也不是微调,而是通过重复和纠正。"不,我要把服务接口与实现分开"。"一定要使用这种授权属性模式"。"租户上下文来自中间件,而不是请求体"。转了一圈又一圈。有些时候,我觉得自己是在和一个非常热情的后辈结对编程,他总是忘记我们昨天决定的事情。
然后,一些事情发生了。经过足够多的修改,在代码库中有足够多的示例供它阅读后,克劳德开始一试就中。它掌握了你的命名规则。它知道你把 DTO 放在哪里。它不需要被要求就能遵循你的错误处理模式。从 "烦人 "到 "高效",克劳德大概花了四五天的时间。
博客文章也是类似的故事。克劳德的默认写作风格一眼就能辨认出来。那种光鲜亮丽、略带距离感、结构完美的风格,读起来就像你见过的所有人工智能生成的博文一样。我花了多轮时间建立风格指南,向它提供我实际写作的范例,指出每一个 "值得注意 "和每一个 em 破折号(说真的,em 破折号上瘾是真的)。最终,我建立了一个完整的技能文件,这是克劳德在为 Rasepi 博客撰写任何内容之前都要加载的一套说明。
这篇文章就是克劳德写的。有我的意见、修正和指导。我描述了我想说的话,然后把它指向风格指南,然后花时间来回修改,直到声音感觉正确为止。这就是实际的工作流程。不是 "人工智能写",也不是 "我写"。这是一次对话,产生了我们两个人都不会单独写出来的东西。
我还为代码库本身编写了自定义指令。我还为代码库本身建立了定制说明,一个解释架构、翻译系统、租户隔离规则和编码规范的 "副驾驶说明 "文件。克劳德在每次会话开始时都会阅读这个文件,两者之间的差别可谓天壤之别。没有它,克劳德只能猜测。有了它,克劳德就知道了。
重点是:生产力的提高是真实的,但不是免费的。你需要在前期投入时间,教人工智能你如何工作,而这种投入会在数周内得到回报。跳过这一步,你花在修正克劳德输出结果上的时间将比你自己编写代码的时间还多。
然后,你需要实际部署这件事
故事到这里就变了。
你已经在 localhost 上创建了一个可运行的应用程序。真漂亮。现在把它放到互联网上。让它发送电子邮件。让人们注册。最终接受付款。防止机器人攻击。给它一个能正确解析的域名。
这些克劳德都帮不了你。并不能。
我并不是说它会提出糟糕的建议。我是说它从根本上无法与你需要配置的系统进行交互。而配置才是你需要花时间的地方,而不是编写代码。
Cloudflare:自己动手 "的案例研究
Rasepi 的营销网站在 Cloudflare 页面上运行。候补名单 API 是一个带有 D1 数据库的 Cloudflare Worker。听起来很简单,但实际操作起来却很难。
克劳德从未见过你的 Cloudflare 仪表板。它可以告诉你 "添加 CNAME 记录",但无法告诉你 14 个选项卡中哪个包含了特定域名的 DNS 设置。D1 数据库绑定需要___DEBLOCK_0__中的特定数据库 ID。环境机密需要通过 _wrangler secret put。CORS 必须与实际部署的来源相匹配,而不是 localhost。Turnstile 需要另一个仪表盘部分的密钥。
我几乎花了一整天的时间让 Worker 正确验证 Turnstile 标记、接受表单提交、将其存储在 D1 中并发送确认邮件。克劳德帮我编写了 Worker 本身的代码。但部署、Wrangler 配置、秘密管理和 DNS 传播调试?这些都是我的工作。
OAuth2:配置迷宫
身份验证是 "代码 "与 "产品 "之间差距的最佳例证。
克劳德完全可以为你编写一个 OAuth2 集成。它知道 OIDC 规范,可以制作中间件,理解 JWT 声明。在我们的开发环境中,我有一个 _DevAuthHandler,它可以通过简单的承载字符串模式,用 _tenant_id和 _sub来铸造令牌。克劳德几分钟就写完了。
但是,生产认证意味着要使用 OpenIddict,而 OpenIddict 意味着要弄清 sub 索赔、tenant_id 索赔、回调 URL、JavaScript 起源、注销 URI 以及其他所有与真正身份设置相关的复杂问题。这还不算外部提供商。
因为你的用户想用 Google、Microsoft 或 GitHub 登录。而 Claude 无法为你登录这些开发者控制台。它不能:
- 在谷歌云控制台创建 OAuth 应用程序并生成客户端 ID 和密钥
- 在 Microsoft Entra 门户注册应用程序并配置重定向 URI
- 设置 GitHub OAuth 应用程序并获取凭据
- 为运行的每个环境配置每个提供商的回调 URL
- 连接正确的作用域、同意屏幕和令牌端点
每个提供商都有自己的开发者门户、自己的术语、自己的凭据生成流程。谷歌称之为 "同意屏幕"。微软称之为 "应用程序注册"。GitHub 称之为 "OAuth 应用程序"(不要与 "GitHub 应用程序 "混淆,后者完全是两码事)。其中每一个都需要你手动将客户端 ID 和密文复制到配置中。
克劳德可以编写 OpenIddict 服务器配置、外部提供商中间件和请求转换逻辑。但实际的凭证生成、门户导航、特定环境 URL 设置?这些都需要你在浏览器中点击仪表板来完成。
电子邮件:绝不只是 "发送电子邮件"
通过重发 API 发送电子邮件的代码大约有 15 行。克劳德写起来毫无问题。但要让电子邮件真正到达收件箱呢?这需要一个经过验证的发送域、SPF、DKIM 和 DMARC 的 DNS 记录、等待传播,然后测试可送达性,因为 Gmail 和 Outlook 对于您的域是否可信有自己的看法。
设计一个在每个电子邮件客户端上看起来都不太糟糕的电子邮件模板。Windows 上的 Outlook 在 2026 年仍在使用 Word 渲染引擎。让我们沉浸其中吧。
我在没有人工智能的情况下做过的所有事情
回顾三周的工作,我开始在脑海中粗略统计克劳德构建的东西和我手工配置的东西。手工 "清单比我预想的要长:
**云基础设施
- Cloudflare 页面项目设置和自定义域配置
- Cloudflare Worker 部署和 D1 数据库配置
- 营销网站、API 和电子邮件发送的 DNS 记录
- SSL/TLS 证书配置(大部分情况下是自动的,但调试时会很痛苦)
- 博客的构建管道配置(Eleventy + 翻译 + OG 图像生成)
身份验证与安全:*
- 谷歌、微软和 GitHub OAuth 应用程序注册和凭证生成
- 使用正确的声明、回调 URL、JS 起源和注销 URI 配置 OpenIddict
- 设置 Turnstile 僵尸保护(网站密钥、秘密密钥、仪表板配置)
- 前端、API 和 Worker 起源之间的 CORS 策略配置
电子邮件:
- 重发账户和 API 密钥设置
- SPF、DKIM、DMARC DNS 记录
- 电子邮件可送达性测试和故障排除
- 跨电子邮件客户端的模板测试
第三方集成:
- DeepL API 账户和密钥管理
- 谷歌分析设置与 Cookie 同意集成
Azure 托管:
- Azure 应用服务设置和 .NET 后端配置
- Azure SQL 数据库配置、防火墙规则和连接字符串
- 针对 Redis 的 Azure 缓存设置和连接配置
- Azure OpenAI 嵌入和 RAG 的资源调配
部署:
- .NET 后端的 Docker 配置
- 跨三个不同部署目标的环境变量管理
- 不同环境的数据库连接字符串
老实说,我可能还忘了一些东西。每个第三方服务都有自己的仪表板、自己的凭证模型、自己的文档质量(千差万别)和自己的怪癖。
为什么这比人们想象的更重要
在每次关于人工智能辅助开发的讨论中,我们都会忽略这一点:**人工智能工具对你的基础架构毫无了解。
您的代码库存在于人工智能可以读取的文件中。你的Cloudflare配置不是。你的谷歌 OAuth 应用程序设置不是。你的 DNS 记录不能。您的 Resend 域名验证状态不会。人工智能工具看不到真实产品的整个运行表面区域,而这个表面区域是巨大的。
编写代码是软件工程中最容易的部分,而且越来越容易。难的是如何使用代码。操作它,在凌晨两点出现故障时理解它,在需求发生变化时扩展它,以及在整个生命周期内管理它。人工智能让简单的部分变得更快。对于困难的部分,人工智能却无能为力。
营销网站应该有自己的版块
我用了大约四天时间创建了整个 Rasepi 营销网站。首页、定价页、注册表单、带僵尸保护的联系表单、隐私政策、四个功能深入页面。克劳德大概完成了 70% 的 HTML/CSS。
但我需要它真正存在于互联网上。博客在 Eleventy 上运行,采用 8 步构建流程:通过 DeepL 翻译文章、构建网站、翻译静态 HTML 页面、复制共享资产、从 SVG 生成 OG 图像、生成音频版本、管理音频清单、生成多语言网站地图。克劳德协助编写了该流程的各个部分,但要使所有步骤都能通过正确的文件路径和正确的 Cloudflare Pages 部署设置协同工作,则需要一整天的反复试验。
开发人员文档网站呢?那是一个独立的 Cloudflare Pages 项目,有自己的域、自己的构建配置和自己的部署触发器。又是一个仪表盘,又是一组环境变量,又是一轮 DNS。
我一直看到的模式
对于任何给定的功能,克劳德都要处理约80%的工作量。代码行、创建文件、解决问题。但剩下的 20% 完全是手动配置工作:点击网络仪表板、在服务之间复制密钥、调试只有在部署环境中才会出现的集成问题。
而这 20% 所需的时间至少与其他 80% 一样长。有时甚至更长。
但与过去的单人开发相比,现在的情况发生了变化:过去,你要么写代码,要么做配置。从来都不是两者兼顾。如果你花了一天时间设置 Stripe 网络钩子并在他们的仪表板中测试支付流程,那么这一天你就没有写应用程序代码。在你工作的同时,你的项目只是在一个方面停止了前进。
有了 Claude,这种情况就不复存在了。当我在 Stripe 的仪表板上深入研究网络钩端点和事件类型时,克劳德正在构建下一个服务界面。当我因为弄错了范围而第三次点击 Google 的 OAuth 同意屏幕设置时,克劳德正在编写 Vue 组件。我的脑袋里只有配置,但代码库却在不断扩大。这才是真正的创新。现在,一个单独的开发人员可以同时在两条战线上行动,这可能是人工智能为小型团队带来的最大实际区别。
也就是说,当你在人工智能的帮助下编写代码时,你处于一个紧密的反馈循环中。编写、测试、修正、迭代。当你在调试 Cloudflare Worker 为什么只在生产中返回 CORS 错误时,你会盯着仪表盘截图,阅读社区论坛帖子,并尝试随机更改配置,希望其中一个能坚持下去。
##需要更改的内容
我认为这不是一个永久性的限制。缺失的部分显而易见:人工智能工具需要能够与第三方服务 API 和仪表盘进行交互。不仅仅是编写调用它们的代码,而是对它们进行实际配置。
其中一些已经开始实现。适用于各种服务的 MCP(模型上下文协议)服务器不断涌现。Anthropic 显然将工具的使用视为头等大事。但我们还远远没有达到这样的程度:我可以说 "用 D1 数据库设置我的 Cloudflare Worker,配置自定义域,添加 Turnstile 保护",并让它真正实现。
在此之前,使用人工智能构建产品的真实故事是这样的:**人工智能是编写应用程序代码的加速器。**另一半是基础架构、第三方集成、部署管道、电子邮件发送、域配置和安全设置。而这一切,都要靠你自己。
(顺便提一下,这也是我们将 Rasepi 建成托管平台而不仅仅是提供开源代码的原因之一。让文档软件运行起来并不难。让它可靠地运行,并提供适当的授权、电子邮件和托管服务?这才是产品的关键所在)。
如果你想尝试一下
我学到了一些实用的东西,也许能帮你节省时间:
-
**先从基础架构开始,而不是代码。**先设置主机、认证提供商、电子邮件服务和自定义域名。在编写一行真正的应用程序代码之前,先将 "hello world "部署到生产环境中。只有在部署环境中才会出现的问题数量之多令人沮丧。
-
保留一份凭证文档** API 密钥、客户端 ID、回调 URL、数据库 ID 和密钥分散在 8 个不同的仪表盘中。我使用的是本地加密文件。你也可以使用 1Password 或其他工具。只要有一个地方就可以了。
-
如果克劳德帮你在 2 个小时内创建了功能,那么至少要再花 2 个小时来部署、配置集成和在生产中进行测试。
-
有些时候,我基本上没有写代码,但却取得了关键进展:在三个提供商之间注册 OAuth 应用程序、设置电子邮件、调试 DNS。这些日子感觉工作效率不高,其实不然。
三周的时间对于我的工作来说仍然快得惊人。我并不是在抱怨 Claude。它让一个开发人员完成了通常需要一个小团队花费一年时间才能完成的工作。但人工智能炒作周期(提示、编码、发布、完成)中所讲述的故事缺少了整个中间环节,而在这一环节中,你将它变成了现实。
应用程序是简单的部分。让它成为现实才是工作。