albertofortin Portfolio Writing Work with me Portfolio Writing Hire me Home / Writing

用 LLM 编程数月后,我决定回归人脑

2025年5月15日

摘要:LLM 在编程方面表现尚可,但大规模使用会导致混乱。我已减少编码时对 AI 的使用,并回归使用我的大脑和纸笔。

几个月前,我需要为我的 SaaS 构建一个新的基础设施,因为当前的 PHP+MySQL 组合已不再适用。我很高兴能充分利用我一直在使用的所有新 LLM,所以我暂时放下 SWE 的身份,开始担任产品经理的角色,与 Claude 讨论最佳实践,自己进行一些研究,然后在多次来回沟通后制定一个计划。最终我选择了 Go+Clickhouse。

当开始编写代码时,我要求 Claude 给我一个大型且复杂的 Markdown 文件,其中概述了我现有的基础设施、我想要的新基础设施、我想要实现的目标、我这样做的原因等等。

所以我把所有内容都放进了 Cursor Notepads,然后开始提示。Cursor 编写代码,我构建并测试它。我对事情的进展感到非常满意,代码库不是最整洁的,但一切似乎都能正常工作。我的目标是速度,而不是代码的整洁——我的 SaaS 业务客户告诉我他们需要特定的数据,而这个新的基础设施是我提供这些数据的唯一方法。我还有一些潜在的客户在等我告诉他们一切准备就绪,这样他们就可以购买套餐。我没有准备好,每天都在赔钱。

但几周后,裂缝开始显现。我开始感到沮丧。每天我都感觉自己非常接近最终产品,然后我发现另一个问题,让我倒退了好几天。我安慰自己说,我以前从未使用过 Go 或 Clickhouse,所以我花的时间比平时长一点来解决这些问题也是有道理的。但问题仍然存在,我越来越沮丧。Cursor 提供的帮助越来越少。我粘贴错误消息,然后得到一个修复方案,但随后其他地方又出现问题。问题越详细,LLM 提供实际解决方案就越困难。所以我开始更仔细地查看代码,试图理解它。我已经做了 15 年的软件工程师,并且在学校学习了 C++ 和 Java,所以我对这些 Go 文件中发生的事情有一个大致的了解。但我对 Go 或 Clickhouse 的最佳实践一无所知。我开始更多地了解这些。我阅读了一些文档、文章,我观看了关于 Clickhouse 的 YouTube 视频。我变得对 Claude 更加好奇,提出详细的问题并质疑它的答案。

一天早上,我决定仔细检查 Cursor 编写的所有代码。倒不是我盲目地提示而不看最终结果,但我一直在优化速度,而且我实际上并没有坐下来只是为了审查代码。我一直在构建,构建,构建。

所以我做了一次“代码审查”会议。然后恐怖开始了

两个服务文件,在同一个目录中,具有相似的名称,显然做着非常相似的事情。但方法名称不同。Props 不一致。一个叫做 "WebAPIprovider",另一个叫做 "webApi"。它们代表着完全相同的参数。相同的方法在不同的文件中被多次重新声明。相同的配置文件以不同的方式被调用,并用不同的方法检索。

没有一致性,没有总体计划。就像我让 10 个初级到中级开发人员在这个代码库上工作,没有 Git 访问权限,把他们锁在一个房间里,看不到其他 9 个人在做什么一样。

在你问之前,是的,我一直在向 LLM 提供上下文,大量的上下文。我主要使用 Gemini,特别是看重它更大的上下文窗口。每次我需要同一类文件的不同迭代时,我都给出了明确的指令,要求从这些文件中获取示例。但这还不够。

退一步

到现在为止,很明显我需要改变我的方法。我首先是一个软件工程师,所以不充分利用我的技能是很愚蠢的。我一直在自学更多关于 Go 和 Clickhouse 的知识,并且我放慢了构建的速度。我正在浏览文件并重写代码。不是全部,只是那些让我感到恶心的东西。语言可能不同,但我知道我想要的东西是什么样的,以及如何组织它们。

自从我退一步之后,调试变得更容易了。也许我没有那么快,但我没有那种奇怪的感觉,“我好像写了这段代码,但我实际上不知道里面有什么”。我仍然在使用 LLM,但用于更简单的事情:“重命名此参数的所有出现”,或者“这是一些伪代码,给我 Go 等效代码”。

所有这一切中最难的部分是抵制使用 AI 的冲动。我有一个很棒的工具可以使用,它可以在一分钟内编写这 10 个文件。我不使用它就是在浪费时间!那时我才意识到。我没有充分利用我的大脑。 我下意识地默认使用 AI 来处理所有与编码相关的事情。我使用纸笔的次数越来越少。一旦我需要计划一个新功能,我的第一个想法就是询问 o4-mini-high 怎么做,而不是我的神经元。我讨厌这样。我要改变它。

所以,是的,我担心 AI 的影响,但我担心的不是工作,我担心的是失去我的思维敏锐度,我计划功能和编写整洁且功能正常的代码的能力。

所以我正在后退一大步,真正限制我使用 AI 的数量。我默认使用纸笔,我默认自己编写该函数的第一个草稿。如果我不确定,我会使用 LLM 来检查这是否是一个好的解决方案,这是否是一个好的命名约定,或者如何完成最后一部分。但我不会要求它从头开始编写新东西,提出想法或编写全新的计划。我来编写计划。我是高级开发人员。LLM 是助手。

一个快乐的平衡点

现在我改变了方法,我不再对 LLM 感到沮丧。我再次抱有非常低的期望,所以当它们做得好的时候,这是一个惊喜。我正在努力聪明地使用它们,例如,它们是学习的绝佳工具。我正在利用它们来学习 Go,提升自己的技能。然后我在编码时应用这些新知识。

但我为非程序员感到担心。我几乎觉得他们现在在 AI 方面的处境比他们在 no-code 时代更糟糕。至少 no-code 工具是由一个有常识的人编写的,即使它的功能有限,至少有一些结构。

“Vibe coding”,或者任何“在不知道如何编码的情况下用 AI 编码”的叫法,如果用来构建任何不是快速原型的东西,那么它就是一场灾难。

我无法想象一个非程序员用 Cursor 编码会是什么感觉。或者也许我可以。你看不懂的代码墙,一个又一个的错误,你不断地粘贴到一个聊天框中,聊天框给你返回更多的代码,这使得事情变得更加混乱和复杂,并且在某个时候,只是错误的。而且无法修复。

给 AI 爱好者的提示

我能听到一群 AI 编码专家对我大喊大叫:你应该使用 !你应该使用 Cursor 规则!你应该遵循我在 Reddit 上找到的这个 15 步游戏规则改变者工作流程!

我已经试过了。我真的试过了。有些事情是 AI 目前还做不到的。

虽然我还没有尝试过每一种工具、代理工作流程等的组合,但我仍然对我的声明充满信心。如果你不相信我,试着做一个对 Clickhouse 一无所知的人,要求 LLM 编写一个复杂的查询,涉及多个 1 亿+ 行的表,而不会在 RAM 有限的服务器上触发内存错误。它就是做不到,即使你给它整个 SQL 模式,即使你链接最新的 Clickhouse 文档,即使你详细地概述你的业务需求和基础设施约束。最新的 Gemini 不能,o4-mini-high 不能,o3 不能,Sonnet 3.7 不能。

此外,如果我需要花费数小时来设置一个复杂的系统,仅仅是为了防止 AI 构建一个纸牌屋而不是我需要的应用程序,这真的值得吗?特别是当模型的性能没有一致性时,所以即使你找到了绝对完美的工作流程,它也不会持续很长时间。或者一旦你需要它做一些稍微不同的事情,它就会停止工作。

让我说清楚:我写这篇文章是因为我是一个对新技术非常兴奋的人,一个喜欢成为早期采用者的人,一个仍然对 AI 充满热情的人。我认为并希望我们最终会到达那里,但就目前而言,我们正处在一个非常奇怪的时代,工具看起来很棒,每个人都告诉你它们很棒,但它们实际上是好但不是很好,而且它们可能会让我们变得更笨。

这是一种令人困惑的体验。就像我需要去某个地方,我可以步行,或者跳上这艘以 900 英里/小时的速度行驶的宇宙飞船,但它的控制装置一半是匈牙利语,一半是古希腊语。经过足够的反复试验,我或许可以让宇宙飞船带我去目的地,但这本身就是一项艰巨的工作,最后我不得不怀疑我是否应该步行。

更糟糕的是,我觉得我们一直被基准测试、现在可以向你推销这种新魔法铲子的网红,以及一群试图说服我们这是一个“代理”而不仅仅是另一个 cron job 的公司所欺骗。

有时我觉得我们也受到了 LLM 提供商的欺骗。只要看看任何与 AI 相关的 subreddit,你就会看到人们有着完全相反的体验,使用完全相同的模型,使用相同的提示,在同一天。如果你用 AI 编码足够长的时间,你就能体会到。有一天它很棒,第二天它非常愚蠢。

他们是否在限制 GPU?这些工具是否根本无法控制?到底发生了什么?