推荐 | Joseph Suárez 对编程和机器学习的建议
发布时间:2025-07-13 04:26 浏览量:1
编译 | 段小草 + Gemini 2.5 Pro
本文是强化学习指南的前传。写这篇文章是因为大家反复向我提出这个要求。如果你 a) 不会编程,b) 不懂机器学习,或者 c) 阅读强化学习文章后感到困惑,请先读这一篇。
拥有 AI 博士学位并不意味着你懂得如何编程。能够使用大语言模型 (LLM) 同样不意味着你懂得如何编程。认为这两者中任何一种就等同于会编程,通常可能是一个负面信号。成为一名优秀的程序员比精通 AI 更难,而每一位与我们一起开始研究强化学习的优秀程序员都做得非常出色。编程的大部分内容其实很简单。但简单并不意味着容易。 编程之所以难,是因为它的教学方式往往很糟糕,训练你将所有事情都过度复杂化 。要摒弃这种思维,要么需要经历数年的失败和痛苦,要么需要一种特别开放的心态,愿意承认自己对编程的整个看法可能是愚蠢和错误的。如果你是编程新手,那么在这方面你反而有优势。如果你不是新手但仍在阅读本文,我邀请你现在就做出这个决定。
编程是将操作数据的指令编写下来的行为。 这些指令清单相当简短:你可以通过将数据分配给内存地址来创建变量,评估变量的条件,循环执行条件以多次运行同一组指令,以及将指令组合成函数。 你可以在几个小时内学会这些工具,但有效地应用它们则是一生的追求 。编程技能的提升不是对数式的。 糟糕的程序员制造问题。优秀的程序员解决问题 。 而伟大的程序员仅凭一台笔记本电脑就能改变世界 。哲学探讨到此为止。以下是我的十大建议:
1. 通过实践来学习 。从一个需要花费几小时的项目开始,逐步过渡到需要花费几天的项目。简单的游戏是很好的起点,因为对于大多数问题,你都能得到快速的视觉反馈。我建议使用 raylib 进行渲染。它轻量级,几乎支持所有语言,并且该库本身就是设计精良的软件典范。
2. 从 Python 开始 。许多经验丰富的开发者讨厌 Python。我有时也讨厌 Python。但无论如何,你都应该从 Python 开始,因为它能让你比几乎任何其他语言都更快地入门。你遇到的大多数 AI 项目至少顶层是用它编写的。但不要在 Python 上花费太长时间。一种语言的设计会促使你用特定的方式思考问题。避免过度依赖使用外部包、继承机制、装饰器,以及通常任何会让你偏离学习用赋值、条件、迭代和函数来表达逻辑的东西。写几个基础的游戏、应用程序或工具,然后继续前进。 推荐使用 uv 进行包管理 。
3. 尽早学习 C 语言 。C 是一门用于编写高性能软件的、极其简洁的语言。我不建议最先学习 C 的唯一原因,是它要求你对计算机和操作系统的工作原理有更多的了解,这对于新手来说,一次性要学的东西太多了。你应该理解的一个简短概念列表:类型、类型转换、结构体、(单遍) 编译、链接、内存分配、栈与堆、指针。暂时避免使用 C++。它是在 C 的基础上附加了一大堆你基本上用不到的额外东西。
4. 警惕过度抽象 。永远致力于用最简单的方式解决当前的问题。除非你确信你所规划的未来情况真的会发生,否则 不要为了通用性而引入复杂性 。即便真有这种需求,通常也是等到问题出现时再处理它更好。C 语言在这方面很出色,因为它移除了大多数那些诱人但会弄巧成拙的工具,比如继承和重型第三方库。
5. 使用 Git 。这一点非常基础,以至于我差点忘了写进去。默认在 GitHub 上创建新项目,并频繁提交。这是避免丢失工作的最佳方式。当你不可避免地弄坏了某个原本能用的东西时,它还为你提供了版本历史。几乎所有的开源项目都通过 GitHub 运行。
6. 善用调试器 (Debugger) 。调试器允许你逐行运行代码,并检查局部变量的值。它比在代码中到处散布 print 语句要快得多、灵活得多,并允许你快速跳转。Python 的 pdb 或 C 的 gdb 就足够了。写 C 语言务必搭配使用 address sanitizer。这会给你可读的错误信息,它非常重要,以至于如果没有它,我不会建议使用 C 语言。
7. 学习基础的 Unix 工具 。尽快适应命令行操作。这里不需要花里胡哨。掌握基础命令即可,如 ls, pwd, cat, head, mv, cp, cd, mkdir, top 等。大约 90% 的时间里,你只需要用到约 10 个最常用的工具。如果可以的话,理想情况是使用原生 Linux。MacOS 也可以。Windows 不行——如果你不想装双系统,就使用 WSL。我建议安装一个基础的 Ubuntu。不要疯狂地定制所有东西。熟悉你的发行版的包管理器,很可能是 apt,别用 snap。
8. 不要被技术难题带偏,警惕技术陷阱 。程序员喜欢发明一些巧妙的方法,结果却把事情搞得更糟,还浪费你的时间。尤其是在你刚入门时,要避免:面向对象和函数式编程(它们都是教条)、测试驱动开发(写少量测试没问题)、频繁更换语言和发行版、所谓的行业「最佳实践」(FAANG 里有很多糟糕的工程师)、Python 的类型提示系统、C 语言中的 make/cmake、像 Hydra 这样花哨的配置解析器、GitHub 子模块和花哨的 CI、像 React 这样的现代 Web 开发框架(学习基础的 HTML + CSS 就够了)、系统美化、X 平台上最新的编程潮流,以及我在我的开发直播中抱怨的所有其他东西。
9. 不要为了学习而刷 LeetCode 。它对于求职面试来说可能是一种必要的恶,但用巧妙的算法解决棘手问题并不能很好地代表编程的全貌。你绝对应该学习基本的数据结构和算法,但掌握 10 种动态规划的变体,在面试之外远不如多做项目来得有用。我已经很多年没有参加过编程面试了,但我敢肯定 18 岁的我会比 28 岁的我表现得更好。而在其他所有方面,28 岁的我更胜一筹。
10. 不要过于纠结 IDE 。它真的没那么重要。我使用 NeoVim,总共只有两个插件。它很轻量,不会妨碍我。是的,我用过很多 IDE。不,这不重要。VSCode 也可以,只是要通过终端来运行程序,而不是通过项目配置和按钮。这会打破 IDE 是一个神奇的必备工具的幻觉。不要使用 AI-first 的编辑器。当你自主掌握了基础知识后,像 copilot 或 SuperMaven 这样的代码补全工具是可以的。但要 用它来节省打字和查阅文档的时间,而不是用来代替思考 。
如何学习机器学习成为一名高效的研究者实际上比成为一名优秀的程序员更容易。大多数研究者的编程水平都很糟糕。优秀的程序员比差的程序员更容易成为优秀的研究者。我在成为一名优秀的程序员之前,先成了一名优秀的研究者。我希望我当初能先投入更多时间成为一名优秀的程序员。
与通用编程不同,机器学习领域可用的资源实际上相当不错。斯坦福的 CS231n 课程讲座可以在线免费观看。去看 Andrej Karpathy 或 Justin Johnson 的版本。另外,一定要真正地去做课程的习题集。这是必须的。听着,我并不喜欢大多数课程。但这门课很好。它旨在教给你知识,而又不会特别难。你需要知道什么是偏导数,什么是矩阵,基本上就这些了。如果你以前没见过对矩阵表达式求导,别担心。这和对单个变量求导是一样的,只不过有时你需要对矩阵进行转置——真的就这么简单。
一旦你完成了 CS231n,你就会理解自动微分是如何工作的(因为你亲手实现了一个),并能熟练使用 PyTorch(因为你将用它来构建其他东西)。恭喜,有用的课程材料你已经学完了。下一步是开始在 ArXiv 上阅读学术论文。对 AI 的某个特定领域感兴趣?去搜一下该领域最重要论文的列表,然后阅读它们。一开始这会让你不知所措,但随着时间的推移会变得越来越容易。我会为你提供了一份强化学习的论文清单。我最好的通用建议都围绕着理解科学过程的局限性。我在用词上一直非常谨慎。请定期重读这三个段落,直到你亲身体会到它们的由来。
理解科学研究的运作方式 。如果不了解论文是在何种情况下写成的,你就无法理解它们。大多数会议都强制要求 8-9 页的篇幅限制。由于大多数 ArXiv 上的论文要么已经发表,要么为了发表,你会注意到它们也都是 8-9 页。为什么即使是简单的想法也不写短一些?因为这既是上限也是下限。写一篇 6 页的论文通常会被拒稿。为什么这么多论文即使在不相关或无益的情况下,也要使用过度形式化的数学?因为审稿人喜欢看到公式(也有些研究者就是喜欢写公式)。为什么论文缺少了某个显而易见的消融研究或对照实验?因为撰写论文的、过度劳累的研究生没有时间和 GPU 了(主要是没有 GPU)。为什么在某个领域没有更多的论文?因为审稿人不喜欢那些。哦,还有,很多论文根本就是错的,所以当两篇论文看起来有直接矛盾的结果时,它们很可能确实就是错的!
不要迷信权威 。你应该基于我已证明构建出的成果来评判我的观点。我之所以提及学术头衔,只是因为很多人看重这个。正因如此,我最有资格告诉你:不要默认相信来自某个会议或某所大学的论文。它充其量是一个弱信号,我曾因复现那些本应更严谨的学者的虚假结果而吃过亏。虽然不太常见,但人们有时确实会为了发表成果而直接撒谎。更常见的情况是,嘈杂的实验和在实验室长时间工作 6 个月后产生的一厢情愿想法的结合。 判断研究可靠性的最佳指标,是其拥有开源代码,并有多个独立的复现,以及在后续工作中的使用 。但这仍然不是一个完美的信号,我在这方面也吃过亏。复现论文结果是学习的好方法,但要知道这可能需要数月时间。但是,在学习一个新领域时,你绝对应该亲手实现一些更基础的论文!
寻找错误 。默认假设发表的成果存在谬误的,并找出其中隐藏的问题。实验的控制是否不严谨?基线是否薄弱?所提供的推理是结果的唯一合理解释吗?努力将论文的内容与其通常过度复杂的表述分离开来。在论文正确的范围内,它与周围的相关工作是如何衔接的?建立直觉是验证主张和模式匹配的结合。你可以将其看作是评估某个特定方向或方法是否值得你投入时间的概率。当一个特定领域的所有论文都犯着相同的错误时,往往孕育着最大机遇。这通常发生在某个主题的前提或标准评估方法存在根本性缺陷时。伟大的研究者能够刺破集体短视的迷雾,开辟新的方向。