Bilibili下载器:AI编程真的那么香吗
AI摘要: 本文探讨了Rust语言与AI编程结合的实践,通过开发Bilibili下载器项目,分析了AI在编程不同阶段的表现。初期AI高效解决语法和基础逻辑问题,但随代码复杂度提升,出现上下文理解不足、重复造轮子、补丁式代码等问题。文章评估了Rust学习曲线、AI工具价值及软件工程师角色转型,指出当前AI更适合处理明确且有限的任务范围。
Rust:编程界的"原神",有人盛赞其为人类软件工程二十多年来的精华,有人鄙夷其圈子风气混乱。
AI编程:从Copilot到Vibe Coding,有人认为终于出现了软件工程的"银弹",有人则觉得这只是资本为了融资和股价而进行的疯狂营销。
当这两个领域碰撞在一起,会擦出怎样的火花呢?
Bili_download
https://github.com/Rpeng666/bili_downloader
这是一个基于Rust编写的B站视频下载器,支持弹幕、普通视频和番剧(多集)下载等功能,具有非常良好的安全特性(Rust条件反射了)。这种在GitHub上已被各种语言——Python、C#、Golang、TypeScript等实现过无数遍的项目,我为什么还要再造一次轮子呢?
- Rust被吹的非常火热,我想借此机会学习一下,是否真的好用
- 在筛选Rust语言项目时,发现相关的GitHub仓库数量明显较少,可以填补这一空白
- 我想让AI主导这次编程过程,而我则担任软件架构师的角色,以此检验AI编程在完整项目上的实力(是骡子是马,拉出来遛遛)
项目开发过程
这部分是为AI限定开发的范围,需要重点实现的内容,避免让AI陷入无休无止的发散思维中
- 需求分析:需要支持不同类型的内容下载(普通视频,番剧),同时支持选定分辨率,最后要有良好的报错信息。
- 架构设计:整体分为三个部分(负责读取用户在命令行写入参数的参数解析器,负责从URL分析视频类型的类型解析器,负责下载视频流和音频流的下载器,以及最终的后处理部分)
- 关键功能实现:
- 视频解析与获取(解析出类型,是否为Dash流还是Durl流)
- 用户登录信息
- 弹幕下载与处理
- 番剧多集管理
- 并发下载优化
2000行以内的蜜月期
语法层面
最开始的编程实现,Claude之类的模型效果非常惊艳。许多Rust难懂的报错、对于初学者生疏的语法,AI都能迅速解决。此外,对于bilibili的逆向代码,AI写得也非常好。比如某些HTTP状态码的处理,我甚至都不知道可能会有哪些状态码,而Claude直接提供了所有的枚举以及最终的代码。
对于初级工程师而言,这些工程代码可能算是某种"脏活"——查阅Rust文档和B站API文档也能完成,但可能需要花费一整个上午。而Claude只用了十几分钟就搞定了,实在是赞!
模式设计层面
Claude倾向于直接以过程式的方式提供可实现的代码,但很少考虑更宏观的架构和模式设计层面。这导致代码虽然能够工作,但缺乏可扩展性和可维护性。举个例子,当我让Claude实现一个复杂功能(视频下载)时,它通常会直接提供一个功能完整但结构单一的解决方案,而非考虑如何将其拆分为更小的、可重用的组件,或如何利用Rust的所有权系统和类型系统来提供更优雅的设计模式。不过,哪怕没有使用一些复用性较好的设计模式,这些问题在2000行代码以内还算可以理解,手动修改后依然能够使用,勉强给一个赞。
2000行之后的阵痛期
在这个阶段,问题开始逐渐显现。随着代码量增加,模型的上下文理解能力显著下降。Claude开始混淆不同模块的功能,对之前设计的接口记忆模糊,甚至会忘记我们已经实现过的功能。这就像让一个短期记忆有问题的程序员来维护一个日益复杂的系统,效率急剧下降。具体而言:
- 可能由于上下文窗口限制,Claude忘记了自己实现过的模块,导致在多个文件中重复造轮子。
- 随着代码越来越复杂,Claude倾向于编写能运行但效果不理想的代码。例如,面对复杂的异步操作和错误处理时,它会简单地使用unwrap()而非妥善处理可能的错误情况。
- Claude开始编写越来越多的"补丁式"代码,难以掌控全局、理解和维护整个代码库。AI生成的代码呈现出"碎片化"特征,缺乏整体性和连贯性,导致代码结构松散,模块间耦合度过高。这种补丁式编程方式大大降低了代码的可维护性。有时为解决一个小问题,Claude会引入完全不必要的复杂性,最终导致代码库变得臃肿不堪。
思考
- Rust语言学习曲线与价值评估
- Rust确实是不错的语言,语法学习的门槛可以由AI大大降低;
- 但其语法糖实在太多,再由AI自由发挥,很容易造成代码难以维护。感觉AI应该与Golang更搭配——语法简单、强类型,甚至消耗的token也更少。
- AI编程工具的真实价值:噱头还是革命?
- 革命:能大大提高编写代码的速度,以前查文档要花半天时间的bug被压缩为几分钟。
- 噱头:不说大型项目,即使在超过2000行的项目中,AI就很可能放飞自我,不断编写补丁式代码,导致500行的功能被扩展成1000行甚至更多,最终导致AI自己也无法理解,只能由人类工程师来擦屁股。
- 在对话中,很难将一个功能点的所有可能角度都描述到位再提交给AI,所以AI倾向于用最简单的方式完成当前prompt描述的要求——你就说有没有遵循指令吧。
- 软件工程师角色的重新定位:在AI时代如何保持竞争力
- 语法不是重点,
- 代码质量分析:AI生成代码的安全性、可维护性和性能
- 安全性、可维护性、性能都难以可控,主要看当时对话prompt描述的是什么。但是谁又能一次性描述得那么准确呢?