一名正在构建自定义音乐播放器 AMP 的开发者最近删除了其代码库中近一半的内容,旨在消除由大语言模型(LLM)引入的复杂性。该项目使用 Zig 编程语言编写,最初是利用 Claude Max 20x 订阅快速生成功能,但作者发现由此产生的数万行代码难以审查和维护。

具有深色主题的 AMP 音乐播放器早期版本界面。
AMP 音乐播放器的早期迭代,展示了音乐库和歌词显示的初始设计。alichraghi.github.io

这张图片代表了项目在重大手动重构之前的早期开发阶段。

自定义播放器的动机

该项目最初是为了应对伊朗的网络断网而产生的,因为在受限政权统治下,在线音乐流媒体对于当地居民来说并不可靠。开发者寻求一种离线替代方案,因为他们发现现有的播放器(如 Strawberry)缺乏正确的行同步歌词。

新播放器 AMP 的目标是创建一个具有原生感、功能精简且无 C++ 依赖的应用程序。开发者选择在整个技术栈中使用 Zig,包括 UI 着色器,以保持一致的系统编程方法。

“我对自己无知的惊讶,以及 LLM 是如何喜欢把事情复杂化的程度感到震惊。”

— How Not to Build a Music Player

向 AI 辅助开发的转变

在一段网络恢复期间,开发者开始尝试使用前沿 LLM 来加速项目。他们使用 Claude Max 20x 订阅生成了应用程序的大大部分代码,作者将这一过程描述为“氛围编码”。

虽然这种方法提供了快速的初期进展,但它导致的代码库让作者感到在审计时精神压力巨大。开发者指出,LLM 经常把简单任务复杂化,创造出一种难以在没有清晰迭代历史的情况下管理的“垃圾代码”。

政策限制与手动重构

当 Anthropic 封禁开发者的账号且 Codeberg 宣布“无 AI”政策时,该项目面临了一个转折点。这迫使开发者在移动仓库或剥离所有 AI 生成的内容之间做出选择。

开发者选择手动重写 AI 生成部分的每一行代码。在四个多月的时间里,他们删除了近一半的代码库,同时实际上增加了应用程序的健壮性并添加了新功能。作者总结道,虽然 LLM 可以作为简单命令的“高级 IDE 功能”,但在大型项目中它们可能会引入过度的复杂性。

技术权衡与局限性

这种转变的一个重大局限是缺乏重写前的历史记录。由于开发者没有使用版本控制系统(如 Git)来保存原始的 AI 生成状态,他们无法客观地将“垃圾代码”与新的手动代码进行对比。

AMP 的最终版本(v0.1)包含一个用 Zig 编写的模糊着色器。开发者现在提倡对业余项目采用“老派”方法,优先考虑人工监督,以确保代码保持可维护和可理解。

显示音乐库和播放控制的 AMP 音乐播放器界面。
AMP 音乐播放器的最终版本(v0.1)具有原生感界面和同步歌词。alichraghi.github.io

这张图片展示了开发者手动重写后的最终产品,展示了应用程序的 UI 和功能。

Hacker News 读者的反应

  • 替代方案: 一位评论者建议,使用实体 CD 仍然是音乐播放可靠的离线解决方案,并指出它们比数字文件更具抗数据损坏能力。 评论 ↗
  • 亲身经验: 一位用户分享了他们使用各种免费音乐播放器的经验,声称许多应用无法提供真正的随机播放,而是按可预测的顺序播放歌曲。 评论 ↗
  • 技术补充: 一位评论者建议,使用 Git 等版本控制系统本可以让作者在重写之前保留项目的历史记录。 评论 ↗

以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗