写给Rust 新人的一封信:AI 时代,你的学习方法可以完全不同

📅 2026/8/1 7:54:42
写给Rust 新人的一封信:AI 时代,你的学习方法可以完全不同
写给Rust 新人的一封信AI 时代你的学习方法可以完全不同一、写在前面今天是 7 月 31 日是我在 CSDN 日更 10 篇文章的第 31 天也是 7 月月度终章的最后一篇。310 篇文章累计约 40 万字涵盖 AI CLI 开发、Rust 系统编程、WASM 工程化、AI 辅助学习四个核心板块。最后一篇我想写点不一样的东西——不是技术教程不是复盘总结而是以过来人的身份给正在考虑或者刚开始学 Rust 的同学写一封信。我 2023 年底开始自学 Rust彼时我在地产行业做 PHP 后端大学学的是市场营销跟计算机没有一毛钱关系。转码两年半现在我的 Rust 项目 dayuan 在 GitHub 上有 270 个 star我的技术文章有人看、有人评论、有人催更。这条路走得艰难但绝对走得通。下面是我最想对你说的一些话。二、学 Rust 的核心障碍不是你以为的那些障碍一概念密度 —— 别人是一个一个概念学你是被一堆概念同时轰炸科班生学 C/C所有权是分开学的——先学 malloc/free再学指针再学 const再学 RAII。这些概念散落在 4 门课程里花了 2 年时间消化。而你学 Rust第一章就是所有权第二章借用第三章生命周期。这些概念打包在一起压缩成一个月的学习量。解法不要在概念和概念之间追求完美理解。先写代码把概念当成规则记下来——不能同时有可变和不可变引用、函数返回的引用不能比参数活得长——先按规则写写多了自然理解为什么有这些规则。/// 不要试图理解所有权先把它当成游戏规则来玩 /// /// 规则1每个值同时只能有一个所有者 /// 规则2所有者离开作用域值就被释放 /// 规则3要共享访问用 不可变借用要修改用 mut可变借用 /// 规则4不可变借用可以有多个可变借用同时只能有一个 /// /// 先记住这四条写代码时反复对照。理解是副产品不是前置条件。 fn main() { // 规则1 验证 let s1 String::from(hello); let s2 s1; // s1 的所有权转移给了 s2 // println!({}, s1); // ❌ s1 已被 move不能再用 // 规则2 验证 { let temp String::from(temp); println!({}, temp); } // temp 离开作用域自动调用 drop内存被释放 // 规则34 验证 let mut data vec![1, 2, 3]; let r1 data; // 不可变借用1 let r2 data; // 不可变借用2多个不可变借用 ✅ println!({:?} {:?}, r1, r2); // r1, r2 最后一次使用后借用结束 let r3 mut data; // 可变借用无其他借用存在 ✅ r3.push(4); println!({:?}, r3); }障碍二反馈延迟 —— 两周写不出一个能跑的程序这是最消磨意志力的阶段。Python 第一天就能做个爬虫Rust 两周还在和编译器搏斗。解法主动降低目标复杂度。我的第一个 Rust 程序不是什么系统工具而是一个只做一件事的计数器/// 我的第一个有成就感的 Rust 程序 /// 功能统计一个目录下所有 .rs 文件的代码行数 /// 复杂度够低但足够学到 fs、Iterator、Path、Result use std::path::Path; fn main() - Result(), Boxdyn std::error::Error { let dir Path::new(./src); let mut total_lines 0usize; // usize: 无符号整数大小等于指针宽度 // 遍历目录中的每个条目 for entry in std::fs::read_dir(dir)? { // ?: 如果 read_dir 失败把错误传递出去 let entry entry?; // ?: 如果读取单个条目失败也传递出去 let path entry.path(); // 只处理 .rs 文件 if path.extension().map_or(false, |ext| ext rs) { // 读取文件内容统计行数 let content std::fs::read_to_string(path)?; let lines content.lines().count(); println!({}: {} 行, path.display(), lines); total_lines lines; } } println!(总计: {} 行代码, total_lines); Ok(()) // Ok(()): 程序正常结束返回空元组 }这个程序 20 行但涵盖了 Rust 最核心的四个概念Result错误处理、Path文件操作、Iterator链式操作、?错误传播。而且它真的有用——我至今还在用它的增强版统计 dayuan 的代码量。障碍三孤独感 —— 全世界都在学 Python只有你在学 Rust解法输出倒逼输入。我从第三个月开始写技术文章不是因为我懂了恰恰是因为我不懂。写文章是一种最诚实的学——你哪里含糊读者一眼就能看出来。逼着自己把一个概念讲清楚是你理解它最快的方式——没有之一。障碍四目标模糊 —— Rust 岗位那么少学了干嘛这是最现实的问题。截至 2026 年 7 月Rust 在国内的招聘市场确实远不如 Go 和 Java。但我的看法是Rust 不是让你多一个选择而是让你获得了一种看问题的视角。学会 Rust 之后我写 Python 时会本能地思考这个函数的参数会不会被意外修改写 TypeScript 时会关注这个对象的所有权周期是多久。这种底层视角在任何语言、任何框架中都有用。而且 Rust 社区有个不成文的传统Rust 程序员之所以少不是因为它难学而是因为它会把不合格的开发者拦在门外——虽然这句话有点苛刻但它反映了一个事实Rust 学习者本身就是经过筛选的、更有耐心的那一批。三、AI 时代的学习方法应该完全重写传统的学习路径看理论 → 做练习 → 写项目AI 时代的路径让 AI 写 → 自己读 → 自己改 → 复查差异 → 追问原理这个流程的效率比自己从头写高 3-5 倍因为AI 的代码是参考系不是抄袭源——你对比的是正确的写法和你的理解追问环节是你真正学习的环节——为什么比怎么做重要十倍知识卡片让你把碎片化学习变成结构化知识四、给你的三句实话第一句不要怕 clone()。学习阶段频繁使用clone()不是坏习惯是聪明的策略。你先把所有权的坑绕过去把业务逻辑跑通再回来优化。我见过太多人因为死磕零拷贝而放弃 Rust——不值得。第二句编译器报错是你最好的老师但你要学会翻译它。# 编译器的原话 error[E0597]: config does not live long enough -- src/main.rs:10:20 | 10 | let ref_to_config config; | ^^^^^^ borrowed value does not live long enough ... 15 | } | - config dropped here while still borrowed # 翻译成人话 # 你在第10行借用了 config但 config 在第15行就被销毁了。 # 你拿着借书卡但书已经被还回去了——借的东西不能比被借的东西活得久。 # 解决方法要么延长 config 的生命周期要么让 ref_to_config 在 config 死亡之前释放。第三句你不需要在学 Rust 之前学过 C/C。这是最大的误解。不会 C 就学不会 Rust的说法是错误的。Rust 不是 C 的升级版它是从头设计的新语言。不懂 C 可能让你在某些为什么 Rust 长这样的问题上困惑久一点但绝对不影响你学会 Rust。我到现在都不会写 C 的malloc但我能用 Rust 写一套完整的内存池。五、总结月度终章7 月 31 日310 篇文章40 万字。这是我人生中最高产的一个月。不是因为我很厉害而是因为我选对了方向——AI CLI 工具开发——这个方向恰好同时需要 AI 理解能力、Rust 系统编程能力和工程化思维。三者的交汇处就是我现在站的位置。回头看看那个 2024 年 1 月 3 日凌晨两点还在对着一台发烫的 Mac 和 47 行编译错误发呆的自己我想说那些错误不是障碍是台阶。每一个编译不过的夜晚都在为以后的生产力在存款。如果你正在读这封信如果你和我一样没有任何计算机背景但想学 Rust我想告诉你你可以的。不是因为 Rust 变简单了不是因为 AI 帮你写代码了而是因为你和一年前的我一样——愿意花时间去理解为什么而不只是复制粘贴怎么做。这个行业不需要每个人都成为 Rust 大师。它需要的是愿意跟自己死磕的人。而你已经走到这里了。本文是 2026 年 7 月月度终章的第 10 篇也是最后一篇。感谢这 31 天里阅读、点赞、评论的每一位朋友。我们 8 月见。资料说明本文中的协议、版本、性能、成本和行业趋势应以可核验的一手资料为准。未标注统计口径的比例、时间表和预测仅作工程讨论不应视为行业事实。可参考 0731 资料来源索引并在发布前将具体来源贴到对应断言之后。