「LexFridman#461」 与thePrimagen的访谈内容提炼
纲要
- 对编程的热爱 (0:42)
- 最初的火花: 演讲者对编程的热爱是在大学数据结构课程中点燃的,特别是在学习链表时。一个节点包含对自身(另一个节点)的引用的概念让他大吃一惊,揭示了代码中无限、富有表现力的结构的可能性,这与他以前已知的固定大小列表不同。
- 感受: 这个概念让演讲者感到没有尽头,它不像10个项目,它是无限的,就像他的思想爆炸了一样。
- 递归的吸引力: 他还发现递归具有深远的影响。最初对这个概念(以及像阶乘这样的标准示例)感到困惑,当他遇到一个迷宫求解问题时,他终于掌握了它。这证明了递归在简单循环替换之外的实际能力。
- Lisp 的影响: 演讲者对编程的热爱随着 Lisp 而加深,特别是在构建游戏引擎(如国际象棋)时。创造出能够胜过他的东西的喜悦是一个重要的动力。
- 元胞自动机: 构建元胞自动机(如康威的生命游戏)进一步激发了他的热情。这些系统中简单、局部规则产生的复杂行为令人着迷。
- 编程中最困难的部分 (10:15)
- 缺乏挑战: 对演讲者来说,最痛苦的方面是缺乏挑战性和创造力。当他在工作中达到一个非常了解代码库和解决方案的地步时,编程就变成了一个乏味的、流水线式的过程。没有“未知的未知”是令人深感不满意的。
- 与早期斗争的对比: 这与他早期的挣扎(例如,递归)形成鲜明对比,虽然困难令人沮丧,但也很有吸引力。
- 编程类型 (12:31)
- 多样化的领域: 演讲者强调了编程的多样性,超越了 Web 开发的普遍看法。他提到了嵌入式系统、机器人技术、机器学习、网络、操作系统、编译器等等。他认为对 Web 开发的关注是一种社会建构,尤其受到 Twitter 等平台的影响。
- 个人认同: 他将自己定义为“工具工程师”,一个喜欢构建库、构建系统和其他工具来帮助其他开发人员提高生产力的人。这个角色提供了一个独特的视角,因为他的利益相关者是理解问题和需求的程序员同事。
- DevOps 解释: 他简要地将 DevOps 定义为确保服务大规模运行的人员。这涉及管理已部署系统的基础设施和可靠性。
- 人生故事 (20:08)
- 早期创伤: 演讲者的人生故事包括重大挑战:早期接触色情内容,7 岁时父亲去世,以及他兄弟的吸毒成瘾。这些事件导致了孤独感、寻求认可,以及在高中时期的艰难社交经历。
- 药物滥用: 在他十几岁和大学早期,他尝试了各种药物(大麻、LSD、蘑菇、冰毒),进一步加剧了他的挣扎。
- 转折点: 在大约 19 岁时,他经历了一个深刻的精神时刻,促使他做出有意识的选择来改变自己的生活。这导致他在从事以前的成瘾行为时感到羞耻,促使他戒掉。
- 学业斗争和毅力: 他描述了多次微积分预科不及格,然后最终成功并在随后的数学和计算机科学课程中表现出色。这突出了坚持不懈和努力工作的最终回报的重要性。
- 克服成瘾: 他最终克服了他的成瘾(包括色情成瘾,他将其描述为最难戒除的),并通过他的信仰和与妻子的关系找到了稳定和幸福。
- 苦难 (30:12)
- 父亲去世的影响: 演讲者反思了年幼时失去父亲的影响,表明这导致了他需要认可和寻找东西来填补空虚的感觉。
- 让他不知道什么是父亲,他感到渴望有一个父亲。
- 高中 (31:44)
- 给高中生的建议: 他强调,高中的社交动态和压力感觉是永恒的,但在人生的宏伟计划中最终是微不足道的。他建议冒险、尝试事物,不要太认真地对待社会等级制度。
- 他指出,你在高中遇到的人,感觉他们会陪伴你一生,但那只是一个短暂的时刻。
- 社交媒体的影响: 他承认,社交媒体让今天的高中经历更加困难,因为它量化了社交价值(喜欢、关注者),这可能会造成损害。
- 色情成瘾 (37:30)
- 戒除的困难: 他重申了克服色情成瘾的极端困难,部分原因是与其他成瘾相比,它缺乏社会污名及其私密性。
- 对关系的影响: 他认为色情内容对他的女性观和人际关系产生了负面影响,将她们物化并贬低了亲密关系。
- 康复之路: 他通过意识到自己正在从未来的妻子那里夺走一些东西(甚至在遇到她之前)来克服它,将他的观点从他的头脑转移到他的内心。他强调没有灵丹妙药,解决潜在的不快乐至关重要。
- 上帝 (47:16)
- 精神体验: 他描述了遇到上帝的关键时刻,感受到深深的恐惧并理解到他的人生道路需要改变。这带来了新的良知和改变生活的愿望。
- 他将其描述为,似乎没有他不愿意跨越的界限,一种深深的恐惧。
- 给别人的建议: 他建议那些与成瘾作斗争的人需要意识到他们正在阻止自己走向更美好的未来,并且需要朝着改变迈出信念的一步。
- 毅力 (1:02:59)
- 学业成功: 他详细描述了他在微积分预科中的多次失败,然后最终成功并在更高水平的数学课程中表现出色。这说明了不懈努力和死记硬背的力量。
- “努力工作,变得聪明”: 他批评了“更聪明地工作,而不是更努力地工作”这句话,认为一个人必须努力工作才能发现“聪明”的含义。他提出“努力工作,变得聪明”作为更准确的座右铭。
- “旅程与目的地”: 他也不喜欢“旅程比目的地更好”的说法,认为它在逻辑上有缺陷且令人沮丧。
- Netflix (1:12:55)
- 创业失败: 他描述了他失败的创业公司(短信营销)以及他向 Schedulicity 和 Web Filings 工作的过渡。
- 被录用: 由于他在 RxJS(他们正在使用的技术)方面的经验,他被 Netflix 招聘。他强调了展示技能和建立业绩记录的重要性。
- 充满挑战的过渡: 加入 Netflix 涉及重大的个人挑战:搬到加利福尼亚、生孩子,以及进入要求苛刻、被解雇风险高的工作文化。
- 他描述了离开一个安全的地方到一个他谁都不认识的地方。
- 技术学习: 他必须学习 Groovy(Netflix 使用的 JVM 语言)并在电视团队工作,为各种设备调试和优化代码。
- Groovy (1:25:23)
- 非常规语言: 他将 Groovy 描述为一种非常规且具有挑战性的语言,Netflix 很少有工程师完全理解它。
- 他将其描述为一种不强大的语言,大多数人都讨厌它。
- Printf 调试: 他严重依赖 printf 调试来理解和修复 Groovy 代码库中的问题。
- Printf() 调试 (1:30:27)
- 技能发展: 他将自己的 printf 调试技能归因于他早期为政府编写机器人软件的经验,在那里打印是了解系统的主要方式。
- 方法: 他将自己的过程描述为在黑暗的房间里摸索,使用 print 语句来测试直觉并建立系统行为的图景。
- 理解现有代码的重要性: 他强调了在重写现有代码之前理解它的重要性,分享了一个他重写同事代码但最终得到几乎相同解决方案的故事。
- Falcor (1:36:49)
- 拒绝服务 (DoS) 攻击: 他讲述了在 Falcor(Netflix 的数据获取库)中发现一个漏洞,该漏洞可能允许单个请求使服务器崩溃,从而可能导致整个 UI 崩溃。这是一个严重的问题,因为该漏洞已经在生产环境中存在多年。
- 它被命名为 Repulsive Grizzly Attack。
- 社会工程学: 他简要介绍了社会工程学的威胁,尤其是在人工智能工具兴起的情况下,将其作为一种重要的攻击媒介。
- 破坏生产: 他承认由于各种编码错误多次破坏了生产,突出了使用复杂系统的挑战。
- Pieter Levels (1:49:04)
- 发布到生产环境: 他讨论了 Pieter Levels 经常直接发布到生产环境(没有大量测试)的方法,并认为这对于独立开发者来说是可行的,但对于大型组织来说不可行。
- 技术栈简单性: 他钦佩 Levels 使用简单的技术栈(PHP、jQuery、SQLite),挑战了初创公司需要使用最新和最复杂技术的观念。
- Netflix、Twitch 和 YouTube 基础设施 (1:53:34)
- 流媒体平台的复杂性: 他对 Netflix、Twitch 和 YouTube 等平台交付大量视频内容所需的基础设施表示敬畏。
- YouTube 的独特挑战: 他强调了 YouTube 需要同时提供新内容和缓存内容的特殊挑战,这需要复杂的缓存和推荐系统。
- Twitch 的实时挑战: 他强调了 Twitch 实时摄取和处理直播视频的难度。
- Netflix 更轻松的任务: 他认为 Netflix 的问题从根本上来说更容易,因为它的内容发布时间表更可预测。
- 小功能,大努力: 他描述了即使在 Netflix 上看似很小的功能更改(例如,颠倒剧集顺序)也需要跨多个团队进行大量协调。
- 需要自主权: 他主张赋予工程师更多的自主权(成为“船长”)以快速行动,即使这会带来风险。
- ThePrimeagen 起源故事 (2:05:36)
- Extra Life 慈善直播: 他的直播生涯始于为 Extra Life 玩《堡垒之夜》的慈善直播。
- 向编程过渡: 他转向直播编程(特别是 Vim),并发现了数量惊人的观众。
- 长期磨练: 他在 Netflix 工作期间持续直播多年,逐渐建立了他的观众群并制作了 YouTube 视频。
- 全职工作: 他最终决定离开 Netflix 并全职从事直播,这一决定是出于冒险和做一些不寻常的事情的愿望。
- 直播的孤独感: 他承认直播的孤独感以及与之前工作相比缺乏团队互动。
- 学习编程语言 (2:20:52)
- 学习方法: 他描述了学习一门新语言的不同方法:立即构建一些东西,彻底阅读语言参考,或使用 AI 生成的代码。他强调了动手实践的重要性。
- 阅读语言参考: 他主张在深入研究项目之前阅读整个语言参考以获得广泛的理解。
- 人工智能的角色: 他认为人工智能是一个强大的学习工具,但担心它可能导致一代无能的程序员过于依赖人工智能而没有发展基本技能。
- 2025 年最佳编程语言 (2:29:55)
- 语言推荐: 他建议同时探索“松散”语言(Python、JavaScript)和更严格的语言(Rust、Go、C++)。他还表达了对函数式语言(Elixir、OCaml)的兴趣。
- 社区重要性: 他强调了围绕一种语言的充满活力的社区的重要性,这使得学习和分享更加愉快。
- Python 和 JavaScript 适合初学者
- 性能 (2:43:42)
- Zig 的速度: 他讨论了 Zig 的性能,指出 Zig、C++ 和 Rust 等语言之间的速度差异通常取决于代码的编写方式,因为它们通常共享相同的后端 (LLVM)。
- Rust (2:46:15)
- 优点: 他赞扬了 Rust 的内存管理(当变量超出范围时自动释放内存)及其显式可变性声明,这增强了代码的可读性和安全性。
- 史诗项目 (2:51:03)
- Twitch Plays Doom: 他描述了他最喜欢的项目:让 Twitch 聊天控制在 Web 浏览器中玩的一场 Doom 游戏(以 ASCII 呈现),使用各种压缩技术来最小化数据传输。
- 断言 (3:04:27)
- 断言的重要性: 他主张大量使用断言,以便在发生意外情况时使程序崩溃,强调将警告视为错误并主动解决潜在问题的重要性。
- 受他人启发: 他受到 John Carmack 和 Yoran(TigerBeetle 的首席执行官)的启发,采用了这种方法。
- 多动症 (3:13:41)
- 应对策略: 他描述了管理多动症的策略,包括培养情绪恢复能力、强迫自己专注于任务(如阅读)以及依靠妻子的支持。
- 专注和编程: 他发现编程提供了一项他可以长时间参与的专注活动。
- 生产力 (3:21:49)
- 最大限度地减少支线任务: 他强调了通过掌握编程基础知识和自己的编辑器来最大限度地减少分心和“支线任务”的重要性。
- 单键导航: 他描述了他高度优化的设置,使用单个击键在应用程序、终端和文件之间切换。
- Neovim 和 Vim 动作: 他提倡 Neovim 和 Vim 动作,因为它们在文本编辑方面很高效。
- 编程设置 (3:26:13)
- Kinesis Advantage 键盘: 他强烈推荐 Kinesis Advantage 键盘,因为它符合人体工程学设计。
- 一台显示器: 他使用一台显示器,依靠键盘快捷键进行导航。
- Neovim: 他使用 Neovim 作为他的编辑器,并使用 Harpoon 等插件进行自定义。
- Linux: 他使用 Linux 作为他的操作系统,并使用 i3 窗口管理器。
- 瑜伽球: 他坐在瑜伽球上以保持良好的姿势。
- 咖啡 (4:01:43)
- Terminal Coffee: 他共同创立了 Terminal Coffee,这是一家只能通过 SSH 订购的咖啡公司,作为一个有趣而独特的项目。
- 道德考量: 咖啡符合道德规范是一个笑话。
- 使用 AI 编程 (4:08:47)
- AI 的优点和缺点: 他认为 AI 对可预测的任务有效,但对不可预测或尖端的代码很吃力。
- 对过度依赖的担忧: 他担心程序员会变得过度依赖 AI 而忽视基本技能。
- AI 作为学习工具: 他认为 AI 是一种有价值的学习工具,但强调了培养与 AI 有效交互的技能的重要性。
- 提示工程: 他认为提示工程是一项至关重要的技能,并且正在通过让 AI 模仿 Twitch 聊天等项目来探索它。
- 调试挑战: 他指出 AI 目前在调试复杂代码方面很弱。
- 编程的未来: 他认为 AI 将对编程产生重大影响,可能会导致人们更加重视自然语言交互,但人类开发人员仍将是必不可少的。
- 技能: 你越擅长编程,你就越不想使用 AI。
- 给年轻程序员的建议 (4:51:31)
- 平衡和价值观: 他建议年轻的程序员在追求对编程的热情与重视人际关系、健康和道德之间找到平衡。
- 坚持和努力: 他强调了坚持、努力和培养对这项工艺的热爱的重要性。
- 工作选择: 他建议跳槽可以获得经验,但在一家公司待较长时间也可能是有价值的。
- Reddit 问题 (5:03:03)
- 对微软的仇恨: 他开玩笑地表达了对微软商业行为的厌恶。
- “Dict”问题: 他讲述了一个向 Stack Overflow 提交关于测量“dicts”的幽默(且不恰当)问题的故事。
- “为什么是男模特?”: 他解释了《超级名模》的参考。
- “Ligma”: 他解释了“Ligma”模因以及他如何多次被它欺骗。
- 上帝: 上帝是他生命中非常重要的一部分。
AI辅助编程
AI 的优势与局限:
- 可预测性是关键: ThePrimeagen 强调,AI 在处理高度可预测、有大量现有数据和文档的任务时表现出色。例如,生成常见的代码模板、处理 API 调用(尤其是有良好文档的 API)、编写基本的 CRUD(创建、读取、更新、删除)操作等。这些任务的模式相对固定,AI 可以很好地学习和复制。
- 非预测性和前沿领域的挑战: 当涉及到非预测性任务、需要创造性解决方案、或者使用较新、文档较少的库或框架时,AI 的表现就会大打折扣。这是因为 AI 缺乏人类的直觉、推理能力和对上下文的深入理解。
- 举例 - Zig vs. TypeScript: ThePrimeagen 以 Zig 和 TypeScript 为例。Zig 是一种较新的系统编程语言,文档相对较少,AI 在处理 Zig 代码时效果不佳。而 TypeScript 作为一种广泛使用的 JavaScript 超集,拥有大量的文档和代码示例,AI 可以更有效地辅助 TypeScript 开发。
对程序员的潜在影响:
- 过度依赖的风险: ThePrimeagen 表达了他最大的担忧:程序员(尤其是初学者)可能会过度依赖 AI,而忽视了基础技能的培养。他认为,如果程序员将所有任务都交给 AI,而不去理解代码的原理、调试的技巧、以及设计的思路,那么他们的技能上限将被 AI 的能力所限制。
- “技能问题”的强调: 他多次提到 "skill issue"(技能问题),指出很多时候程序员觉得 AI 不好用,是因为他们自己使用 AI 的方式不对,缺乏与 AI 协作的技巧。他认为,掌握如何有效地利用 AI 是一种新的技能。
- 并非完全否定 AI: ThePrimeagen 明确表示他并不反对使用 AI,他自己也在积极探索 AI 在编程之外的应用(例如,用 AI 模拟 Twitch 聊天)。他只是强调,AI 应该作为辅助工具,而不是替代品。
- “审核”而非“编写”: 他提到自己使用 Copilot 时,感觉更像是在“审核”AI 生成的代码,而不是“编写”代码。这让他感到不够投入,也更容易引入 bug。他认为这是他个人的“技能问题”,但这也反映了 AI 辅助编程的一个潜在陷阱。
- 初级和高级的区别: 观察到初级程序员更倾向于使用和依赖AI, 而高级程序员更倾向于手动编写。
- 乐趣: 认为和AI一起编程是更加有乐趣的。
与 AI 协作的技巧:
- 提示工程 (Prompt Engineering): ThePrimeagen 认为提示工程是与 AI 协作的关键技能。这包括:
- 清晰、具体的要求: 向 AI 提出明确、具体、无歧义的要求,避免使用含糊不清的语言。
- 提供足够的上下文: 确保 AI 了解任务的背景、相关的代码文件、以及预期的行为。
- 迭代式提示: 通过多次提问和反馈,逐步引导 AI 达到理想的结果。ThePrimeagen 提到他会创建一系列提示模板,并不断尝试和优化。
- “同理心”: 尝试从 AI 的角度思考,理解它的局限性,预判它可能出现的错误。这有点像与一个经验不足的实习生合作,你需要考虑到他/她可能缺乏的知识和经验。
- 代码审查和修改:
- 不要盲目接受: 永远不要盲目接受 AI 生成的代码,要仔细审查,确保其正确性、安全性和效率。
- 理解 AI 的思路: 尝试理解 AI 是如何生成这段代码的,它的逻辑是什么,有哪些潜在的问题。
- 修改和优化: 根据自己的理解,对 AI 生成的代码进行修改和优化,使其更符合项目规范和个人风格。
- 和AI的配合:
- 可以使用AI作为生成代码的初始工具,在有大体框架后,由人来进行修改和优化。
- 提示工程 (Prompt Engineering): ThePrimeagen 认为提示工程是与 AI 协作的关键技能。这包括:
AI 在编程中的具体应用:
- 生成样板代码 (Boilerplate Code): AI 可以快速生成常见的代码结构,例如类定义、函数框架、循环、条件语句等。这可以节省大量重复劳动。
- API 调用: AI 可以帮助程序员理解和使用 API,生成 API 调用代码,处理 API 返回的数据。
- 代码补全 (Code Completion): AI 可以根据上下文预测接下来可能输入的代码,提高编码速度。
- 重构 (Refactoring): AI 可以协助重构代码,例如提取函数、重命名变量、优化代码结构。
- 生成测试用例 (Test Case Generation): AI 可以根据代码生成测试用例,提高代码覆盖率。
- 文档生成 (Documentation Generation): AI 可以根据代码生成文档,减少文档编写的工作量。
- 错误提示: 类似于报错IDE, AI可以在初级阶段帮助定位和预测错误。
AI 工具和平台:
- GitHub Copilot: ThePrimeagen 提到了 GitHub Copilot,这是他最早接触的 AI 编程工具。
- Cursor: 他认为 Cursor 是一款很有前景的 AI 编程工具,它不仅仅是生成代码,还能帮助程序员理解和修改代码。
- Devin: 他对 Devin 持有复杂的看法,认为它是一个功能全面的 AI 编程助手,但目前在实际使用中仍然存在很多问题。
AI 与调试 (Debugging):
- 优势: 可以协助进行日志和追踪,通过数据协助人类分析
- AI 的局限性: ThePrimeagen 强调,AI 在调试复杂 bug 方面非常薄弱。这是因为调试通常需要深入理解代码逻辑、上下文、以及各种边界条件,而 AI 缺乏这种能力。
- 人类的优势: 人类程序员的经验、直觉和对系统的整体把握,在调试中仍然是不可替代的。
- 未来的展望: 可以创建日志和追踪,让AI协助进行debug.
AI 对编程职业的影响:
- 短期内不会完全取代: ThePrimeagen 认为,在短期内(例如 5-10 年),AI 不太可能完全取代程序员。因为 AI 在处理复杂问题、理解需求、调试代码等方面仍然存在很大局限。
- 编程的演变: 他认为,AI 的发展可能会导致编程方式的演变,例如更多地使用自然语言进行编程,或者出现专门用于 AI 提示的“伪语言”。但这仍然是编程,只是形式发生了变化。
- 技能需求的转变: 程序员可能需要更多地掌握与 AI 协作的技能,例如提示工程、代码审查、以及理解 AI 的局限性。
- 新的工作机会: AI 的发展也可能催生新的工作机会,例如 AI 训练师、AI 调试员、AI 集成工程师等。
- 担心: 程序员担心自己的工作会被取代。
对年轻程序员的建议:
- 不要停止学习: ThePrimeagen 强烈建议年轻程序员不要因为 AI 的出现而放弃学习编程基础知识和技能。他认为,掌握底层原理、理解计算机的工作方式,对于有效地利用 AI 至关重要。
- 拥抱 AI,但不要依赖 AI: 将 AI 视为工具,学习如何与 AI 协作,但不要完全依赖 AI。
- 关注更高级别的任务: 将精力放在 AI 难以处理的任务上,例如系统设计、架构决策、复杂问题解决、以及与人沟通协作。
- AI 伦理: 担忧欧洲会出台相关的规定,对行业进行规范。
总而言之,ThePrimeagen 对 AI 在编程中的作用持谨慎乐观的态度。他认为 AI 是一个强大的工具,可以提高生产力、降低学习曲线,但他同时也强调,AI 无法取代人类程序员的创造力、判断力和对复杂系统的理解。他鼓励程序员拥抱 AI,学习与 AI 协作,但同时也要不断提升自身的基础技能,以适应不断变化的编程世界。