Linguista

为什么我停止使用 AI 代码编辑器

为什么我停止使用 AI 代码编辑器

引言

我选择将使用AI变成一个手动操作,因为当我依赖它时,我感觉自己的能力随着时间的推移在缓慢丧失。我建议每个人都要谨慎地将AI作为其工作流程的关键部分。

2022年末,我首次使用了AI工具,甚至在ChatGPT初版问世之前。2023年,我开始在我的开发工作流程中使用基于AI的工具。起初,我对其这些大语言模型(LLM)的能力印象深刻。只需复制粘贴晦涩的C++编译器错误和源代码,就能被告知错误原因,这感觉就像魔法一样。

随着GitHub Copilot变得越来越强大,我开始越来越多地使用它。我在编辑器中直接集成了各种其他的大语言模型。使用AI成了我工作流程的一部分。

2024年末,我从我的代码编辑器中移除了所有的大语言模型集成。我偶尔仍会使用LLM,并且我确实认为AI可以以一种对许多程序员非常有益的方式来使用。那么,我为什么不使用AI驱动的代码编辑工具呢?

特斯拉 FSD(全自动驾驶)

从2019年到2021年,我开的是特斯拉。虽然我再也不会购买同样的车了——不是出于政治原因,仅仅是因为这些车质量相当差,价格过高,而且维修保养极其麻烦。

当我拿到我的特斯拉时,我开始尽可能地使用全自动驾驶(FSD)。在高速公路上把车设置成FSD模式,然后稍微走会儿神,感觉棒极了。变道就像打转向灯一样简单,车子就会自动变道。对我来说,驾驶就是开上高速公路,打开FSD,时不时地让车变道,然后边听音乐/播客边走神。

如果你经常开车,你会知道在高速公路上行驶时,一切几乎都是自动发生的。以适当的速度将车保持在车道内变成了一种被动行为,它不需要像阅读书籍那样专注,而是像走路那样,它在你思维的后台运行。

在2019年到2021年期间,长途驾驶时我只开我的特斯拉。2021年后,我换回开普通汽车,这次转换绝对出乎我的意料。在最初的一个月左右,高速公路驾驶需要我全神贯注,我不得不重新学习如何在不假思索的情况下将车保持在车道中央。

依赖特斯拉的FSD剥夺了我自己进入“自动驾驶”状态的能力。

我使用 AI 代码编辑器的经历

使用AI驱动的代码编辑器有点类似。起初,我感觉在AI的辅助下,我完成工作的速度快了很多。我大部分时间做的工作都不是特别复杂,AI感觉就像把我的特斯拉设置成FSD模式一样,我可以引导机器为我工作。

在我的空闲时间,我开始在我的工作设备上用我的个人账户做一个副业项目。在这个账户下,我无法使用Copilot以及我其他那些酷炫、花哨的AI工具。这时,使用AI的感受开始变得与我的特斯拉FSD经历非常相似。

我感觉自己做一些相当基础的软件开发工作的能力,比大约一年前要差。突然之间,这让我非常清楚地意识到我变得多么依赖AI工具。每当我定义一个函数时,我会在编辑器里停下来,等待AI工具为我编写实现代码。我费了些劲才想起手动编写单元测试的语法。

随着时间的推移,AI对我的工作也变得不那么有用了。它不仅剥夺了我的乐趣,而且我开始对于自己做一些实现决策感到有些不自信。把决策外包给AI似乎容易得多。但有时,即使给出最好的提示,AI也无法解决问题。很明显,因为我不经常练习基础知识,所以在处理更难的部分时,我的能力也下降了。

Fingerspitzengefühl 的丧失

Fingerspitzengefühl [ˈfɪŋɐˌʃpɪtsənɡəˌfyːl] 是一个德语术语,字面意思是“指尖的感觉”,意指直觉、悟性或本能,已被英语作为外来词所接纳。它描述了一种强大的情境感知能力,以及做出最恰当、最机敏反应的能力。¹

定义资历是一件非常困难的事情。虽然我认为,成为“资深人士”很大程度上在于软技能,但就技术硬技能而言,很大程度上取决于Fingerspitzengefühl。你使用一种语言、框架或代码库的时间越长,你就越能培养出关于什么是正确方法的这种直觉。“感觉有些不对劲”的直觉逐渐转变为“这就是我们应该做的”的感觉。

这种培养起来的直觉不仅仅是在架构层面。一个重要的组成部分在于底层细节,比如何时使用指针(或哪种类型的指针),是使用断言还是检查,当标准库有多个选项可用时该选择哪个(尽管资深的C++程序员似乎对此仍无法达成一致)。

这种直觉,就是我在大量依赖AI工具时逐渐失去的东西。而说这话的是我这个首席开发人员。当我看到关于“凭感觉编程”(vibe coding)的大肆宣传时,我忍不住想:你到底期望如何凭感觉编程,一路升到资深级别?当AI工具宕机,或者变得过于昂贵时,你从哪里获得技能来维护和扩展那些凭感觉编写的代码库?

即使有了更大的上下文窗口、更强的计算能力、推理模型或智能体,仍然会有AI无法做到的事情。当然,随着时间的推移,AI工具会越来越强大。但是,当你收到一条Slack消息说“网站运行正常,但应用程序在生产环境中宕机了;我在本地试过,运行正常,Sentry里也没有任何信息”,祝你好运能让AI智能体帮你解决这个问题。也许它能,也许它不能。当AI智能体无法解决时,你的回复会是“抱歉,Cursor搞不定,明天再多提示几次”吗?

没有这些工具你也能行

有时感觉你好像必须使用AI,否则6个月内就会失业。我们听这种“3-6个月后”的故事已经两年多了。我对CEO关于“3-6个月后”功能的承诺多年前就不再相信了。当我在2019年拿到我的特斯拉时,我支付了6400欧元购买本应在“3-6个月后”实现的功能,而这项功能至今仍未以5年多前承诺的方式实现。

目前来看,让AI为你编写代码对于比大学项目更大的项目来说是不太可能成功的。在企业中处理遗留系统或大型项目时,或者当你需要查阅大量依赖项的内部细节(就像我使用虚幻引擎时那样)时,AI工具通常无法让事情顺利进行。当你需要使用内部的领域特定语言(DSL)、工具或框架时,祝你好运能让LLM生成有用的输出。对于某些行业,出于多种原因,你甚至根本无法使用AI工具。

对于某些事情,你真的不应该想要依赖AI。在实现像JWT²签名或RBAC³这样的认证系统时,在提示中加入“并且它应该是安全的”并不会使其变得安全,如果它是用包含CVE⁴(常见漏洞和披露)的GitHub代码训练出来的。在安全方面,你应该成为那个负责并完全理解这一切的人。关键系统应该由人类编写和审查,如果我们正走向一个AI智能体编写代码,另一个审查自动生成的PR,然后另一个AI智能体部署代码的境地,那么我们很快就会看到安全问题急剧增加。

我的底线在哪里

我有时仍会使用AI。我认为,只要明智地使用,它可以是一个很棒的工具。我的底线在于集成。我让AI与我的代码编辑器完全分离。所有的上下文,我都手动添加。我故意让所需付出的努力保持在较高水平,以此来抑制自己(过度使用)。

我使用AI工作的例子包括“将这些结构体形式的Go测试转换为map形式的测试”,“将这个计算转换为SIMD”,或者“当内容类型是application/zlib时,解码消息体”⁵。我设置了一些自定义指令,让它只给我更改过的代码,并给我添加代码的说明。这样,仍然是我自己在代码库中进行更改。仅仅批准一个Git差异是不够的,我想亲自手动添加代码,只有这样,我才觉得有信心签署认可并对其负责。

AI的另一个重要用途是学习。我经常有一些非常不常见的问题,因为我有一些非常小众的兴趣。事实证明,关于使用ECS(实体组件系统)向自定义游戏引擎添加网络代码的学习资源并不多。对我有效的方法是,请求AI解释代码片段,比如“解释这段汇编代码”,“解释这个着色器(shader)的作用”,“哪些书籍深入探讨了解决游戏引擎中客户端/服务器不同步的问题”。AI有时似乎也难以应对这些问题,我得到的结果好坏参半,但结果仍然比搜索引擎好得多。我甚至会用它来处理这篇文章,但不是用来写内容,而是用来检查⁶。

以这种方式使用AI的另一个好处是成本。没有不必要的API调用,上下文是手动管理的,并且对LLM设置有更多的控制。我使用一个桌面应用程序,连接了多个不同的大语言模型。在过去大约3个月里,我每天都在使用它,总共消耗了大约4美元的额度。

我确实想补充一点,对于某些事情我更为严格。在我的个人网站上,我不希望有任何AI生成的内容,无论是文本还是图像。出于各种原因,我个人不喜欢AI生成的图像或所谓的“艺术”,而且我认为AI生成的文本缺乏个性,感觉非常平淡乏味。对我来说,由人类创造的东西比AI创造的更有价值。

做你热爱的事

同样值得注意的是,除了效率和生产力之外,还有更多需要考虑的事情。那就是做你喜欢做的事。如果你热爱编程,那就继续自己动手编程,即使计算机可能比你更擅长。

1997年,深蓝(Deep Blue)在国际象棋比赛中击败了当时的世界冠军加里·卡斯帕罗夫⁷,但人们仍然在下棋。谈到编程,我想说,我编程的原因和人们仍在下棋的原因是一样的⁸。虽然国际象棋和软件开发非常不同,国际象棋的范围要有限得多,但我认为我们应该记住,有时,我们做事情仅仅是为了享受它们。

给新程序员的建议

不要成为一个让AI包揽所有工作的“永远的初级”(forever junior)。如果你想成为一名程序员,就要学会自己编程。保持好奇心,投入时间和精力去学习事物真正的运作方式,以及更深层次的原理。这真的很有价值。学习底层原理并加以运用是令人惊叹的,要不断学习,不要只做一个提示工程师(如果那也能算作工程的话)。相信我,有能力会更有趣⁹。

即使AI可能比你聪明,也永远不要盲目相信AI的输出。不要围绕它构建你的整个工作流程。偶尔尝试几天不使用它来工作。你的编程能力越强,对于更复杂的工作,AI就越会妨碍你。

如果你现在学习编程,持续提升你的技能,而不是让AI包揽所有繁重的工作,那么你将有能力收拾现在“凭感觉编程”所造成的烂摊子。我不想听起来像个精英主义者,但如果你不想学习超越“凭感觉编程”的知识,也许编程并不适合你。因为那些所有工作都可以通过“凭感觉编程”完成的职位,在AI变得更强大时将首先被淘汰。

并且记住:如果你离开AI就无法编程,那么你就不会编程。

结论

当你使用AI时,你是在用知识换取速度。有时这种权衡是值得的。但重要的是要记住,即使是世界上最优秀的运动员仍然在进行基础训练,这是有原因的。软件开发也是如此:你需要练习基础,才能完成高级的工作。你需要保持你的斧头锋利。

我们距离AI取代我们的工作还有很长的路要走。许多公司正在制造错失恐惧症(FOMO)¹⁰作为销售策略,以吸引更多客户,向投资者展示吸引力,获得下一轮融资,以开发出下一个必定会彻底改变一切的模型。

AI是一种工具,其本身无所谓好坏,关键在于你如何使用它。我确实认为它可以是一个很棒的工具,只要你的工作流程不依赖于它。确保你离开它仍然能够有效工作,确保你不会将自己不完全理解的代码推向生产环境,不要将AI视为你自己思考的替代品。保持好奇,持续学习。


脚注:

  1. 来源:维基百科
  2. JSON Web Tokens(JWT)是一种生成认证令牌等用途的常用方式
  3. 基于角色的访问控制(RBAC)是一种通过设置权限和特权来限制系统访问的机制
  4. 常见漏洞和披露(CVE)是一个用于识别、定义和编目公开披露的网络安全漏洞的程序,cve.org
  5. 这里具体内容不太重要,只是我使用AI的示例
  6. 我为这篇文章使用的提示是:“我希望你校对一下我写的文章。请使用英式英语语法,给我反馈语法错误或不通顺的句子。不要评论那些应该拆分或可以略作改进的句子,只指出真正的错误。不要返回修改后的句子,而是指出问题所在的位置,在哪一段,哪一句,以及错误是什么。我会自己进行必要的修改”。它反馈了一些拼写错误,比如“form”应为“from”,“eb”应为“be”。
  7. 来源:IBM历史
  8. 来源:Tsoding on YouTube
  9. 来源:DHH 在 YouTube 的一次采访中
  10. 错失恐惧症(Fear of missing out)