Vibe Coding 经验
更多 Vibe Coding 体验
上一篇博文留下一个悬而未决的问题:代码质量对 AI 到底重不重要。现在,我更加确信答案是肯定的。
我在长期使用中观察到的情况是:如果没有仔细引导,Claude 会生成超出必要的代码,抽象能力也较弱,重复代码明显。随着代码库逐渐变大,这个问题会愈发严重。一个地方修好了 bug,另一个地方又冒出新的 bug;修掉之后,要么重新引入原来的缺陷,要么产生一个新问题。这就像《奇异博士》里 Dr. Strange 与 Dormammu 的时间循环,让你陷入无穷无尽的回归陷阱;或者像一场让人抓狂的打地鼠游戏。
这种模式并不让人意外。Claude 会强烈受到现有代码库的影响。如果代码暴露面很大、风格不一致或结构薄弱,模型就会放大这些特征。反过来,如果暴露面小、内聚且内部一致,模型的输出质量会明显提升。
对于干净代码,有三个原则至关重要。
强领域模型
系统的核心概念应当明确、有名字,并直接体现在代码中。行为应该归属于它所属的概念。当模型一致时,无论人类还是 AI,都能以可预期的方式扩展它。当领域概念是隐性的,或者被分摊到各种工具类和控制器中,任何一次改动都成了猜谜。
封装
将数据和行为放在一起,只暴露那些反映领域语言的有意义操作。不要提供 setter(修改器),也要避免随意写 getter(访问器);每一个泄露状态的访问器都会催生分散的行为,从而破坏领域模型。AI 系统对边界不严密的情况特别敏感,因为它们总会“乐于”把逻辑重新实现一遍。
最小条件逻辑
除了极简短的分支结构外,一切条件分支都值得警惕。它们意味着决策下得太晚、缺少领域概念、缺少多态,或者职责被强行揉在一起。嵌套的条件会加重认知负担,也扩大了模型需要推理的概率空间。
把决策逻辑交还给调用方——调用方本就清楚意图——或者用更丰富的多态领域类型取代条件判断。这样既能降低执行点的复杂度,也能让行为由明确的意图驱动,而不是靠推测状态。
当 Claude 全做对的时候
不过,如果说这次体验全是负面的,那也有失公允。最近我只用一条提示词就做出一个小型工具应用,用来测试单点登录(SSO),Claude 生成的正是我想要的。提示词是:
Create a very simple web application for testing authentication with azure.
它应该允许我登录,当我点击一个按钮时,使用 Bearer 令牌向后端服务发起请求。后端服务位于 ../azure-ad-jwt-debugger。适当地使用 MSAL 库。而 Claude 交付的成果正是如此。下面是生成的界面…… Azure AD JWT 调试器界面,由单次提示词生成。它用 MSAL 完成登录,获取令牌,并完全按要求将 Bearer 令牌发送到后端。有意思的是,它并没有只实现提示词里描述的最低要求,还额外添加了:一个退出登录按钮,以及一个结构化的 JSON 响应展示面板。这两项都不是明确要求的,但都很受欢迎。你可以在这里查看源代码。我没有审查它,因为在这种情况下,我不觉得需要修改它。