Hacker News 中文摘要

RSS订阅

我在 Recurse Center 的项目实践 -- What I did at Recurse Center

今年夏天,我在朋友科里(Cory)推荐下,于布鲁克林的一个编程静修营递归中心(Recurse Center)度过。在那里我参与了一些学习小组,该中心有任何人都能组织的定期小组,例如每周五大家聚在一起攻克旧的 Advent of Code 挑战。我参加了智能体冒险(Agentic Adventures)、实用深度学习(Practical Deep Learning)、数学周一(Math Monday)以及一个研究开源棋盘游戏 AI 的短系列。

正文

我在 Recurse Center(布鲁克林的一个编程静修营)度过了这个夏天,是朋友 Cory 推荐的。以下是我在那儿做的一些事。

参加学习小组

RC 有定期学习小组,任何人都可以组织和安排。比如,大家每周五聚在一起做往年的 Advent of Code 挑战。我参加了 Agentic Adventures、Practical Deep Learning、Math Monday,以及一个研究开源桌游 AI 的短系列。

Agentic Adventures

Agentic Adventures 是给对现代 LLM 和 agent 感兴趣的人办的讨论小组,我们每周做不同的事情。一些亮点:

  • 我和 Amanda 给一个 vibecoding agent 搭了远程沙箱,可以用 dangerously-skip-permissions 来运行。
  • 同样是这个思路,Michelle 教我们如何用 ollama 和 docker 为本地 agent 搭建沙箱环境。
  • 我们为此做了 “Just One” 游戏,用来研究 agent 如何合作。
  • 我们一起玩 minGPT,构建了一个在《罗密欧与朱丽叶》上训练的小型文本预测模型,让它像莎士比亚一样说话。
  • 我们做了一个基础的 LoRA,训练一个小模型说话更口语化。

Practical Deep Learning

这是一个学习小组,一起读 Jeremy Howard 和 Sylvain Gugger 的 Practical Deep Learning(前半部分);我们从经典机器学习方法开始,使用或改造预训练模型,然后学习如何搭建真正的神经网络模型。这本书提供了高层次的实践者入门,很适合建立直觉、了解它们如何工作以及能用它们构建什么。因为我自己对研究不感兴趣,这正是我想要的理解层次。

Math Monday

在一次咖啡闲聊中,我和 Sophia 发现彼此都对数学有热情,决定开办一个数学话题讨论小组。这本意是轻松的消遣和学习探索的机会,所以每次聚会大概前一半时间用来学习,然后分成两人一组,基于所学内容做一些东西。我们做过的一些有趣的事:

  • 一起做 project euler 的题目。
  • 思考 Peter Winkler 的书 Mathematical Puzzles 里的一些问题。
  • 画分形和其他生成艺术。
  • 用 Voronoi 图构建程序,比如这个游戏。
  • Ben 给我们介绍了 Rocq 证明助手,我们一起推导了一些布尔恒等式。
  • 我们写了一个生成 Hilbert 曲线的程序,用笔式绘图仪绘制。
  • 我和 Kenji 在 Desmos 里给混沌游戏做了些有趣的扩展:

Image 1: Some photogenic fractals we built in Desmos.

逆向工程一个桌游 AI

Tony 发起了一个短系列,深入研究玩桌游 Race for the Galaxy 的 Keldon AI 代码。第一次我们只是学规则、和 AI 对战,然后深入代码——一个老派的两层神经网络,带有手工设计的特征。Claude 在解读神经网络权重、解释它对什么做出反应方面相当擅长;我们花了一些时间试图理解 Keldon AI 学到了什么策略。结论是基础游戏中经济策略比军事强得多(与玩家感受一致)。让我印象深刻的一点是,很多权重最强的节点对应的是特定卡牌是否在场。

完成 dodo

我收尾了申请 RC 时做的迷你语言 dodo。这包括大概最有意思的部分——写实现 match 语句的棘手递归代码。这在 LLM 的使用上是个有趣的平衡——我不让它们替我写任何代码,但有人帮我写规范的说明、测试用例和示例程序是很好的。LLM 也让分享我的成果变得容易——可以在这里的 vibecoded 在线 REPL 里试试!

实现 DEFLATE

RC 有很多人分享项目的讲座。我入营早期参加的一场是 Josh 讲 ZIP 文件格式,以及他对不同实现之间不一致之处的调查。它深入到我从未想过的细节。比如,如果杀毒软件用的解压器和你的解压器对边界情况的处理略有不同,它可能把一个带恶意软件的文件看成无害的,因为它没有解压出病毒。这是一个安全漏洞!

讲座中吸引我注意的一部分是关于 zip 所用压缩算法 DEFLATE 的题外话。Kevan 和我认为重新实现它听起来是个有趣的练习,于是在接下来几周里结对做了几次。

DEFLATE 基本上是 LZ77(广义游程编码)+ 霍夫曼编码。它用两种方式压缩文本(实际上是任意字节序列,这里当作文本处理):(1) 用回溯引用替换重复序列,比如 "to be or not to be" 可以变成 "to be or not (13, 5)",括号里的意思是"往回退 13 字节,然后从那里复制 5 字节";(2) 霍夫曼编码,给常见字节分配更短的比特序列,给罕见字节分配更长的——比如,'e' 用 01100101、铃声字符用 00000111,你可以给非常常见的 'e' 只用 4 或 5 位,而给英文文本中从不出现的铃声用 16 位(或者不表示)。

我们用 Rust 直接照规范写了一个解压器。这是我第一次用这门语言,但我觉得它相当不错。(虽然我放弃了理解某些数据生命周期规则。)大多数时候,它感觉就像我希望 C 成为的样子。不过,它并没有消除比特打包涉及的任何概念性困难——调试时,我们经常得停下来写下预期的比特序列,与得到的结果对比。没有哪个项目让我更像一个真正的黑客。

大量结对

RC 强调结对的价值——和别人一起解决问题。即便按 RC 的标准我也算有点内向,但还是做了不少。和 Kevan 一起实现 DEFLATE 是最大的结对例子,不过我也做了其他一些事。和 Zaki 以及 Tommy 一起,我们用 SAT 求解器解数独——把重量级工具用在相对直接的问题上。我和 Seyoung 实现了生命游戏,学会了用 shell 光标让它在每一代整齐地重绘(如果命令写错就不整齐了)。和 William 一起实现了游戏 mastermind。和 Bill 一起尝试给 emacs 的 magit 做一个新视图,说实话这太不自量力了,因为我们俩都没用 emacs lisp 写过正经东西。但他说服我试试 doom emacs,我一直在用,挺享受的!

Vibecode 了一堆小项目

我来 RC 的目标是掌握那些孩子们都在热议的新奇 LLM 玩意。这显然是我参加 Agentic Adventures 和 Practical Deep Learning 的部分动机,但我也花了不少时间随便 vibecode 东西,试图突破我能处理的极限。

其中一个是给 rcade 做的节奏游戏;这是我第一次真正利用 LLM 的能力,因为我让它做了十个不同的原型,然后选了我最喜欢的一个。

Image 2: The opening of a song in the rhythm game.

我和 Amanda 实验了能让 agent 独立完成多大的任务;结果是一个奇幻地图生成器,基于一篇学术论文实现了气候建模。

Image 3: A pixellated map of the earth showing climate zones in different colors.

我还实验了把 agent 作为游戏一部分的游戏。在一个游戏里,我们让 agent 玩猜词游戏 Just One:

Image 4: Several Claude Sonnet instances try to give hints to the word 'crocodile'.

游戏目标是给一个秘密词提示,但不能和其他玩家给同样的提示;令人震惊的是,所有 agent 玩的时候经常给出同样的提示,即使在 temperature 1 下也是如此。我们通过给它们"个性"来解决——其实只是话题;比如我们告诉一个 agent 从体育的角度思考,那么它对 "shell" 的提示可能是 "defense" 之类,而被告知要像嬉皮士的 agent 可能对巨蟹座的螃蟹说 "cancer"。

同样地,我尝试做了个外交游戏,与 agent 互动是主要玩法;可惜主要教训是,告诉 agent "在玩家给你想要的东西之前不要帮忙",结果就是得到非常僵硬和好斗的角色。角色塑造和提示工程里应该有些秘诀能让它奏效,但我没找到。

由于这两个都是浏览器游戏,我不想在别人试玩时花自己的 token,所以我还 vibecode 了一个组件,让人们用自己的访问密钥或自己的 GPU(通过 WebLLM),这才让它们可以分享!

冒着掉进经典"砍牛刀"陷阱的风险,我做了个 emacs 模式来列出活跃的 vibecoding 会话:

Image 5: A view of some of my current sessions.

同样,我让 Claude 给这个网站做了一堆改进,并设置好让我能给你写这篇文章。

夏天晚些时候,我感兴趣的是在不熟悉的领域使用这些工具,回答我不确定自己技能范围内能否回答的问题。我好奇不同语言的词汇之间能有多大重叠,于是 vibecode 了一个树搜索,找出两种语言中发音相同(或非常相似)的词序列。即使在音系相似的语言中这也非常困难(我们用了印尼语和波斯语,根据 PHOIBLE 它们有相似的音素表),但我们最终弄出了一首很平庸的诗,可以在这里看到。

基于在那里学到的东西,我接着尝试 vibecode 一门新的人造语言。这是受 conlang critic 关于世界语的视频启发。世界语并不像你希望国际辅助语那样简单,而且词汇明显以欧洲为中心——这不能怪柴门霍夫,因为他是最早做这件事的人之一,但我想知道,鉴于互联网上可用的所有信息,我们能不能做得更好。

我大概欠一篇完整的文章(不过如果我开始新工作,那就祝你能看到它了),但这里给个简要版本:首先,我们用 PHOIBLE 数据整理出一组跨语言常见的音素,包括推荐的音位变体,以确保词对各种母语的人都能发出、能区分。然后我们逐块构建语法,大致遵循真正的语言学家描述自然语言语法时用的指南(Bernard Comrie 和 Norval Smith 的 Lingua Descriptive Studies 问卷)。一个很酷的技巧是,我们根据 APiCS(皮钦语和克里奥尔语结构地图集)中描述的现存克里奥尔语和(尤其是)皮钦语的证据来做决定。这些语言很好地反映了习惯不同语法系统的人在必须合作时实际趋同的结果,所以很可能世界上很多人会觉得它直观,至少能理解。(附带趣闻——这么做的时候,你自然会得到一种很像中文或越南语的语法——用功能词而非词形变化来传达语法信息的分析语。)最后我们从各种世界语言的词典集合构建词汇。来自国际通用语境的词根——已经被借入多种语言的——直接借用并转写。(比如 "phonology" 或 "coffee" 这样的词变成 "fonologia" 和 "kafe"。)对其他词,我们写了个优化器来选择既广泛可识别(偏向英语或中文等使用广泛的语言)又代表许多不同语系的词,以避免欧洲中心主义。完全披露——这部分其实没怎么成功,我让 Claude 凑合伪造了一下,好给我演示弄一个样本脚本。如果我哪天真写完整文章,修复这个会是第一步。

夏末,我做了一场关于这些项目的演讲,幻灯片在这里。幻灯片当然是 Claude 做的。

写了点博客?

我更感兴趣的是做事而非写作,但我写的那一点点可以在博客索引里看到。我还保持了一个内部公开的检查记录系列,写这篇文章时我参考的就是它。如果你参加 RC,我强烈推荐坚持写检查记录,即使当时觉得烦!

玩了玩

RC 也有很多有趣随机的工具和东西可以试。比如我做了我的第一个 3D 打印——给朋友 36 岁和我 38 岁生日的烛台:

Image 6: Some views of the candle holder, showing how it shows different numbers when viewed from different sides.

hub(RC 在布鲁克林的实体空间)还有一台 HP 7440A 笔式绘图仪,我们喜欢摆弄它。我画了一盘著名围棋对局的快照,并和 Jess 一起写了个程序生成 Hilbert 曲线:

Image 7: A snapshot of the broken ladder game and a Hilbert curve, printed with the pen plotter.

我们每周有桌游之夜,Dan 和我主持了几次围棋教学,还组织了一次去 Gowanus 围棋俱乐部的活动。

对他人的项目赞叹不已

RC 的每个人都有自己的酷项目,其中的乐趣之一就是看他们在做什么。我想让这节保持简短,所以就只列一小部分有酷图的:

Teresa 做了一个摄影棚装置,会根据你的皮肤温度等生物特征给你的照片加上酷炫的光环:

Image 8: This unc got aura.

用笔式绘图仪画的酷图有一堆可以看:

Image 9: A picture of the pen plotter wall.

Jagi 做了一个很棒的动态装饰,会根据周围的噪音做出反应并改变图案。

Image 10: Jagi's LED wheel.

Sarah 和其他人用旧电子墨水屏做了一个"nintonio 游戏母亲":

Image 11: The nintonio game mother, playing pokemon.

Tony 用收据打印机做了一个精致尸体游戏。

Video 3 你可以在 RCade 街机上玩其他 Recurser 做的游戏:

Image 12: The RCade.

写了"回归声明"

RC 校友被鼓励写一份"回归声明"——对在 RC 时光的简短反思。这篇文章就是!

如果你感兴趣,考虑申请未来的批次!

评论

对 RC 的体验与评价两极分化,质疑者嘲讽其像成人日托且缺乏产出,支持者则视其为理想的教育形态。社区同时借题延伸出对编程语言实现与人工智能模式崩溃的技术探讨,并有开发者感慨手写代码在智能体编程时代的落幕。

质疑 RC 缺乏实际产出且氛围压抑

  • 评论者讽刺其如同成人日托,质疑是否有衍生的公司或研究成果,并有人表示对 RC 的体验感到生理不适,认为它是职业与爱好的坏端点结合,另有玩笑称相关网页或许只是自链接暗讽空洞(较多人) > 这地方听起来像成人日托,有基于那里的工作创立的公司或发表的研究成果吗?(@rus20376)

认为 RC 是理想的教育与学习形态

  • 有用户赞赏 RC 的模式,痛斥传统学校是工厂式应试机器,认为教育本该如此,另有用户表示一直向往远程参与(较多人) > 学校本该是这样,而不是工厂式的不思考的考试机器。(@janmsavage)

感慨手写代码在智能体编程时代已成过去式

  • 曾计划去 RC 的开发者表示,经历一年智能体编程后手写代码显得古老过时,2026 年读到 RC 文章让他确信自己或许再也不会手写代码,流露出时代变迁的错位感(少数人) > 在智能体编程世界里手写代码显得古老过时,2026年读 RC 让我确信可能再也不会手写代码了。(@jdelman)

有价值的补充

  • 推荐了 1987 年出版的《函数式编程语言的实现》,指出其第五章关于模式匹配的实现能去神秘化,对有正确抽象思维的语言实现者颇有启发
  • 指出文章中多智能体游戏提示雷同的现象实为“模式崩溃”,这是 davinci-002 后几乎所有聊天机器人的特征,对创意与游戏类是重大挑战