比 Rust 更难的都不足为惧
编程语言的亲和力
在 /r/rust
上,我经常看到这样的内容:
过去三个月我一直在学习 Rust,现在与学习 C++ 的经历相比,我觉得它要难得多。要想高效地用 Rust 编程,你需要了解很多规则,包括(但不限于):ownership、borrow checker、cargo、生命周期、traits、泛型、闭包、不安全的 Rust 等。
许多编程语言都设计得平易近人,易于上手。这在历史上曾使它们在应用中占得先机,因为它们确实更容易被初学者采用。
例如,Python 是 ABC 的后继者,而 ABC 是一种专门为教学目的而设计的语言。如今,大多数人都是从学习曲线较平坦的语言开始的,当他们尝试学习曲线较陡的语言时,就会陷入困境。
为什么会这样?语言设计需要权衡利弊。如果学习曲线较平是首要目标,那么表达能力、严谨性、性能和可维护性等方面就会受到影响。
采用不同方法的语言,如 Rust、Kotlin、Ocaml 或其他语言,会让很多新手在学习过程中举步维艰。学习速度太慢会让人望而生畏,也会打击他们的积极性。而这仅仅是学习的初级阶段。更棘手的是中级阶段,在这一阶段,你想自己构建一些东西。
这种情况–陡峭的学习曲线问题–现在变得容易多了,这要归功于 LLM(Large Language Model,大型语言模型)。Rust、Haskell 以及 INTERCAL 以外的所有语言现在都变得更容易学习了。事实上,如果你没有使用 LLM 来帮助你学习棘手的材料,那么你的学习效果并不理想。这至少是我的猜想。让我来解释一下。
知识积累量问题
想象一下,你选择 Rust 作为你的下一个大项目–你雄心勃勃,准备构建一个光线跟踪器。你被 Rust 所承诺的速度和安全性所吸引,并通过一些教程和书籍成功地掌握了基础知识。但是,当你开始绘制光线跟踪器时,却遇到了一堵高墙。这就是 “知识积累量问题”(Intermediate Material Problem),它对你使用 Rust 的打击很大。
中间学习阶段需要掌握大量的材料。这不是教程所能涵盖的,而是需要探索。
从基本的 Rust 教程到实现复杂的图形渲染,这是一个巨大的飞跃。你会发现自己在与 Rust 的掌握程度搏斗,破解编译器错误,并试图理解如何有效地管理内存。这已经不仅仅是编码的问题了。这是一条陡峭的攀登曲线。
这种挫败感是真实存在的–你知道自己想要构建什么,但从这里到那里的道路却像是在没有地图的迷宫中穿行。这个阶段–从 Rust 初学者过渡到能够构建 Raycaster 的自信开发者–是一个充满挑战和学习曲线的旅程,许多 Rust 爱好者都会遇到这个问题。
阅历问题并非 Rust 独有:它是许多复杂编程语言的共同经历。多年前,基于 HN 的炒作,我决定学习 Haskell。在通读了几本书之后,我觉得自己已经准备好应对一些真正的项目了。但我很快就遇到了障碍。我经常碰壁,不明白自己错过了什么,也不明白为什么特定的方法行不通。感觉很多人都在这片混乱的中间丛林中开辟了自己的道路,但每个人都必须找到自己的路。Stack Overflow 很有帮助,但速度很慢,我加入的各种 Slack 社区也有助于更快地找到调试指针,但这是一个缓慢的过程。
这就是人们所说的 “陡峭的学习曲线”。这不是从教程入门。而是当你抛开教程,建立自己的东西并遇到问题时所发生的事情。
使用 LLM (大型语言模型)作为中坚辅助
Stack Overflow、邮件列表、论坛和 Reddit 在解决中级障碍方面存在的问题是反馈速度太慢。但是,如果你能在自己编程语言的子 Reddit 上提问,并立即得到答案呢?
如果 Stack Overflow 能即时回答每个问题,而不是将其作为离题关闭,那会怎样?给好友发 DM 的速度与技术社区邮件列表的反馈深度相得益彰?
在不精通阶段,可以通过 ChatGPT 实现这一功能。
如果您在构建光线追踪器时遇到错误,只需询问 ChatGPT。如果你不确定正确的方法,就像在 Reddit 上发帖子一样写下你的想法,然后询问 GPT4 或 shell GPT 或 aider。当然,你可能偶尔会触及到他们的知识极限,得到无用的答案,但在中等水平阶段,你所问的很多问题都不是知识极限,而且 LLM 比你更了解这些知识。你只是需要一些指导。你不知道自己不知道什么。你需要找出可能存在的问题和解决方案。ChatGPT 可以快速为您提供这些信息。
很多人都不知道以这种方式使用 ChatGPT 有什么用处,这让我很惊讶。目前在世的最著名数学家陶哲轩(Terrence Tao)就在使用 ChatGPT:
作为一项实验,我最近尝试在获得解决方案之前,向 #GPT4 咨询我在 #MathOverflow 上发现的一个问题。
根据以往的经验,我知道不能让 #AI 直接回答问题(因为这几乎肯定会导致无稽之谈),而是让它扮演合作者的角色,提供策略建议。
最后,它确实提出了八种方法,其中一种(生成函数)最终获得了成功。在这个特殊案例中,我可能最终会尝试生成函数方法,但它还是略有帮助(我最初曾想过采用渐近分析方法来获得直觉,但结果证明没有必要)。
我决定分享我的经验,以鼓励其他人进行类似的实验。
如果 ChatGPT 可以帮助陶哲轩浏览 Diaconis-Graham 不等式的求解空间,那么它也可以帮助你理解 Rust 中一个基本的生命周期编译器错误。
不困难的学习困难的知识
对于这种方法,现实的担忧不是LLM是否足以帮助你度过这个中间地带,而是它是否会损害学习。我遇到了问题,询问了 ChatGPT,它建议我尝试一些方法,其中一个就是解决方案。但我担心,如果没有它,我也不会走到这一步。ChatGPT 是否会导致我的技能萎缩?如果我的目标是取得好成绩,那么LLM的帮助是否会损害我的进步?
人们通常认为,最好的学习来自于独自处理问题,与此相反,学习研究表明,引导式学习会产生更大的影响,尤其是在编程等复杂领域。
教育心理学家约翰-斯韦勒(John Sweller)指出,由他人指导解决问题往往是学习的最佳方式。比自己摸索更好。大型语言模型通过提供即时、上下文和会话帮助,在这方面表现出色。
The Zone of Proximal Development
当普通学习者遇到令人费解的错误或知识空白时,提问 ChatGPT 可以提供结构清晰的解释或问题的逐步分解。这不仅仅是提供答案,而是揭示内在逻辑和过程,阐明解决方案背后的 “原因 “和 “方法 “。
有一种教育概念叫做 “Zone of Proximal Development”。这是你当前技能之外的领域,你需要一些帮助才能取得进步。LLM可以作为进入这一区域的桥梁,提供帮助,让你突破自己的能力极限。
这就是所谓的支架式学习体验。不足是可以弥补的:尝试构建超出你能力范围的东西,填补空白,并获得LLM的帮助。你将比没有他们的情况下做得更多,如果教育研究是正确的,那么你在没有他们的情况下所能完成的事情将通过这一过程得到扩展。你不是在作弊。你是在学习。
尝试一些困难的事情,向LLM靠拢。您将通过合作学习工具和技术,从而超越您目前的局限。你将在一个新的领域建立信心。
未来可期
这又让我想到了 Rust 与 Python:是的,如果你是第一次学习编程语言,那就学习 Python,但如果你过去学过一些东西,就像我当年学习 Haskell 网络服务一样,那就再试一次。挑战难点,利用 LLM 来帮助你。
现在,陡峭的学习曲线不再那么陡峭了!
尝试一些东西,遇到障碍,寻求帮助,回溯一下以确保你理解了,然后向前冲。冲向LLM !
回到陶哲轩:他现在正在使用 Lean(一种功能强大但臭名昭著的定理证明器)将他的一些证明形式化。猜猜他是如何学习 Lean的?
继续我的 Lean4 项目。
Github copilot 对结束简短的争论很有帮助,但它的长建议通常是错误的。但即使是错误的建议,也能帮助我学习正确的语法。
GPT4 在澄清Lean 语法的细枝末节以及提供我可以用数学英语解释的步骤的Lean 翻译建议方面有些帮助。不过,它似乎深受 Lean3 语法的影响。这可能是训练截止日期造成的。
如果当代最杰出的数学家使用 ChatGPT 来帮助他进行证明,你就没有任何借口了。
用 Rust 构建一些东西。用 Ocaml 构建一些东西。用 Elixir 构建一些东西。知识积累问题已不是问题。你的LLM 代码伙伴可以帮你跨过障碍,很快你就能自己跳过去了。LLM 只会越来越好。因此,编程语言的表现力可以更强、更严谨,学习曲线可以更陡峭,但我们仍然可以学会它们。世界可以更陡峭。
本文文字及图片出自 The Future is Rusty