程序员分享用LLM编程的实际经历,揭示常见的坑点和注意事项。高热度讨论反映这是开发者普遍关心的问题。
TL;DR: AI 不是副驾驶;它是一个假装能力的初级开发者。相信它需要自担风险。
我已经在这个下午项目中花了 4 天时间。我很确信自己能完美解决它。我有一个很好的计划,热情也很高。让我介绍一下 Deskthang。这是为你的桌子准备的一样东西。当我工作时,我想把手机放在另一个房间,只通过不同的方式获取重要通知(thang)。如果我的部署管道失败,我希望桌上的一个地球仪变红并向我显示一个 GitLab 徽标。我不想查看我的手机、电子邮件或任何可能找到我的干扰源。
快速背景:我全职++做无聊的企业软件开发,很少有机会展示我的工程技能。虽然我的职位说是工程师,但我不同意。
我总是尝试为一个兼职项目协调多个兴趣。我想从存储中取出我的电子硬件盒子,我想为自己解决通知和专注问题,我想看看我应该对 AI 接管我的工作有多害怕。如他们所说,我是想一次性解决多个问题。
在新冠疫情期间,我承接了一份物联网原型的研发合同。那份研发工作是我职业生涯中最充实的工作。我与一个小型、充满活力的团队合作,其中包括我的一些最好的朋友。我在 3D 打印模型、焊接组件、编写嵌入式 C,以及与机械工程师进行现场测试……真正的工程师。我们工作很努力,经常工作到深夜,协作感觉更像是和伙伴们玩星际争霸而不是朝九晚五。从那以后我一直深深地想念这种感觉。最近,我受到了 @_MaxBlade 和 DeskHub 的启发,想把我的电子技能上的灰尘擦掉。
我大量使用 GitLab 进行 CI/CD 和我的个人 Kubernetes 项目。了解我的管道状态至关重要……失败的构建可能会中断我所有 7 个用户!登录 GitLab 感觉像是被刺伤了脾脏。每次我登录(一天多次),我都会面临验证码、认证应用程序或等待电子邮件代码,然后又是另一个验证码。我尝试过通过 Slack、Discord 和 Telegram 进行管道通知,但这些应用就像生产力黑洞。我不想在工作时让手机靠近我,也不想打开会分散我注意力的聊天应用。移除这些干扰可以让我保持专注。
我想弄清楚 AI 是否会接管我的工作。我持怀疑态度认为它不能取代我所做的,但我喜欢测试我的假设。有时候 AI 会让我惊喜;其他时候,当我避免真正思考时,它只是浪费时间的兔子洞。
最近,我使用 Claude Sonnet 3.5 强行解决了数百个 React 编译错误,同时将一个项目从 React 15 升级到 18。我更新了 package.json,删除了 node_modules,并消耗了大量的 AI token。令我惊讶的是,我们在一天结束时有了一个通过的构建。公司一直在鼓励我们采用 AI 优先的工作流程,并给了我们无限的 token。这是一个疯狂的实验。
这发生在一个周五。我在一个艰苦的提示工作日后擦掉了额头的汗水,提早回家开始我的兼职项目……
与我不同,我的妻子喜欢离开家去做事。我花了几年把我的车库变成了我最喜欢的地方。我和妻子有个协议,每个月有一天,她带着孩子,我从所有责任中获得豁免。我可以整整一天锁在车库里做项目。从她的角度来看,我点外卖然后变成了一个不适合当父亲的无赖。从我的角度来看,我可以享受我最喜欢的地方,只是修修补补或玩游戏或随便做什么。这些是我能玩疯狂科学家并感到最像自己的日子。我每个月都在期待它。我的计划是学习 Zig、刷新我的硬件技能、构建这个项目、写一篇博客文章并为它制作视频。完全可以实现。
我想连接一个树莓派 Pico、一个小的 240x240 液晶显示屏和一些 RGB LED。我打算学习 Zig,并用它通过 USB 向 Pico 发送图像数据,Pico 会将图像放在屏幕上并改变 LED 颜色。我会从 GitLab 设置 webhook 来调用我 Kube 集群中的 API,并设置我的主机 Zig 应用轮询同一个 API 以获取更改并向 Pico 发送更新。我真的很想通过 USB 传输数据,因为我以前从未这样做过。我已经使用过蓝牙、LTE 和 Wifi,只是想做一些新的东西。
接线很简单。像 SPI (Serial Peripheral Interface) 用于显示屏和一些 RGB led 这样的常见模式我很熟悉。Linux 上的 TTY (TeleTYpewriter) 串行数据端口 /dev/ttyACM0 用于与 Pico 的 USB 通信感觉很熟悉,因为我以前就是这样设置调试日志的。看起来我已经收集了足够的示例仓库来拼凑出一个解决方案。我每天做了一点研究,每次都感觉更确定一些。我越来越多地使用 ChatGPT 和 Claude 来进行初始研究。我处于 AI 炒作的高峰,大胆到足以相信它……
由于我日常做全栈网络工作,api、webhook 和 postgres 不在这个无赖日的范围内。我把这一天的工作范围限制在 Zig -> Pico 图像传输。
找一条支持数据传输而不仅仅是充电的微型 USB 电缆……真的,为什么它们都只能充电?!
用 Pico、显示屏和 LED 接好面包板
为树莓派 Pico 设置 C SDK 并创建 GitLab 仓库和 GitHub 镜像
推送构建并在 cat /dev/ttyACM0 上看到日志
在启动循环期间在屏幕上显示一些内容。
youtube link (12 sec)
在仓库中设置一个主机目录
发送一条消息并在屏幕上看到一些东西
通过 USB 传输原始 RGB 图像数据
这是双向安全的,对吧
USB CDC 是双向的,TTY 接口建立在 USB CDC 之上,TTY 是双向安全的因为 CDC 是(不,它不是……谢谢 gpt)
TTY 接口建立在 USB CDC 之上,TTY 是双向安全的因为 CDC 是(不,它不是……谢谢 gpt)
TTY 是双向安全的因为 CDC 是(不,它不是……谢谢 gpt)
在上面的图像中,你可以看到那个直接的谎言打破了我……USB CDC 有独立的 TX(发送)和 RX(接收)缓冲区,所以它是双向安全的。TTY 不是这样,它是双向的但不太安全,因为 TX 和 RX 数据共用单个缓冲区。
在经历了十几个失败者之后,我找到了一条支持数据的 USB 微型电缆,一切进展顺利直到图像传输。我使用 Claude、Cline 和 ChatGPT 来充分利用 AI 实现了一个有问题但可工作的实现。我从我的终端用 Zig 通过 USB 向 Pico 发送命令,它读取命令并改变屏幕。这只花了几个小时,我对 AI 辅助的梦想是真实的感到兴奋。这并不复杂,但我认为这比我独自完成要快。除了听 ThePrimeagen 喋喋不休之外,我对 Zig 没有任何经验。我甚至没有读过文档。
多次,我发现自己阻止 Cline 为已经解决的问题启动全新的实现。但我并没有抓住所有的。当 Cline 超越我的 API 限制时,我把 Claude 加到了我的后宫,尽可能并行运行两者。
现在当我查看代码时,我意识到我在多任务处理方面很差,并且在对自己进行煤气灯操纵。
这是我的傲慢发挥作用的地方。在我的脑海中,我想象的是一次性发送所有图像数据,就像 S3 上传一样。我想象干净的原始数据流过 /dev/ttyACM0。它不干净。它不是原始数据。它是混乱的。
pico - heartbeat
zig - start image transfer
zig - [240x240 COLOR PIXELS]
zig - end image transfer
pico - heartbeat
我实际看到的看起来像这样,但更糟:
pico - heartbeat
zig - start ima%
pico - heage transfert
pico - heartbeat
zig - [240x240 COL
pico - heartbea
OR PIXELtS]
pico - heartbeat
zig - end image transfer
pico - heartbeat
这就像那个令人厌烦的打断笑话。完全不好笑,日子毁了。
底线是什么?Pico 和我的笔记本电脑都不能信任这些数据。每个系统都需要学会让步,我需要建造绕路来强制它们礼貌和等待轮流。
我需要认真对待。所以,很自然地,我让 Claude 写了一些文档:
详细说明了数据包形状。
记录了校验和验证计划。
描述了传输的数据格式。
标注了如何分块和重建图像。
描绘了状态机转换。
演示了命令系统。
设计了一个不会破坏传入命令的日志系统。
深入研究了这些文档后,我让 AI 实现了实际的代码。此时,我的"无赖帽"脱下来了,我恢复了我的爸爸职责,同时让 Cursor 和 Cline 用我的代码库玩星际争霸。这就是 AI 的梦想用例,对吧?只让它尽情发挥,然后回到一个完美运行的系统。让我们看看我们离太阳有多近。
现实检验:AI 工具就像知道如何谷歌搜索的非常快但不理解背景的实习生。Cursor 开始为无关的编辑改变核心实现。Cline 会随机重写系统的一半而不询问。当我注意到时,我的代码库看起来像是一个初级开发者约定上的意大利面条大战的余波。大多数代码库实际上是无法访问的。
就像伊卡洛斯一样,我的代码库无法挽救。一堆缠绕的翅膀碎片和融化的蜡,滴落着半生不熟的想法和无监督的 AI 混乱。我的将苦差事外包给 AI 的宏大愿景让我飙升,但现实之阳烧毁了任何优雅着陆的希望。以下是我从这个火焰般的下降中得到的收获。
AI 对生成想法或起草代码很有帮助,但它不理解。这就像给初级开发者一把链锯而不是手术刀——它可能会完成工作,但你需要花两倍的时间来清理烂摊子。我意识到在处理新技术时,我需要坚定地坐在驾驶座上。
在我的编辑器中直接使用 AI 感觉像是在玩无限的作弊码。让它野蛮生长太容易了,也更难保持控制。往前走,我要引入刻意的摩擦。我只会在网络界面中使用 AI 或将其作为头脑风暴工具。如果我必须手动将其建议粘贴到我的代码中,我会更加谨慎地对待这个过程,也就不太可能频繁求助于它。
当我犯错误时,我学到东西。调试我自己的失败一直是理解新语言或概念的最好方法之一。依赖 AI 来"修复"事物给我走了弯路。结果,我对 Zig 的理解比开始时没有更深。
用不熟悉的工具构建新东西需要时间。我可以在单个"无赖日"中完全实现我的愿景的想法过于乐观,几乎是愚蠢的。有时候,你必须尊重你要实现的东西的复杂性。
Deskthang 已经从一个随意的下午项目发展成为一个关于过度自信、AI 冒险和艰苦学到的教训的传奇。现在,我搁置了 AI 驱动的捷径,并致力于在我下一个不受责任约束的日子进行重写。
我拿起笔开始手写文档,就像是石器时代。我计划在用 Zig 实际学习这门语言之前完成一些 Advent of Code 问题,然后再尝试这个项目。
想看看 Deskthang 是否有效,或者只是在我向前失败时享受混乱?订阅下面以获得我最新冒险和技能问题的月度电子邮件。我们将学会如何与 AI 共存,重新学习我忘记的课程,并希望在这个过程中构建一些值得的东西。