未来属于 Rust
编程语言的易用性
在 /r/rust
论坛上,我常常看到这样的言论:
我学习 Rust 已经三个月了,现在回想我之前学习 C++ 的过程,我发现 Rust 显然更加困难。要想在 Rust 中高效编程,你需要掌握许多规则,包括但不限于:所有权(ownership)、借用检查(borrow checker)、cargo 工具、生命周期(lifetimes)、特性(traits)、泛型(generics)、闭包(closures)、不安全 Rust(unsafe Rust)等。
来源
很多编程语言在设计上追求易用性和快速上手,这种特性历史上让它们在被广泛采用上占有优势,因为对于初学者而言,这些语言确实更易学习。
比如,Python 是继 ABC 之后的语言,ABC 是专门为了教学目的而设计的。现在,大多数人都是从这类学习曲线较平缓的语言开始,然后在尝试学习像 Rust 这样学习曲线更陡峭的语言时感到困难。
为什么会这样?这是因为语言设计总是需要做出权衡。如果优先考虑的是学习的平缓性,那么语言的表达力、严谨性、性能和可维护性可能会有所牺牲。
而采取不同设计理念的语言,如 Rust、Kotlin、Ocaml 等,就面临着许多新手在学习它们时的挑战。学习的缓慢进度可能会让人感到害怕,甚至失去学习的动力,这只是初学阶段的问题。更加复杂的是,当你进入到中级阶段,开始尝试独立构建项目时,挑战会更大。
现在,得益于大语言模型(LLMs)的发展,这个陡峭学习曲线的问题已经变得容易解决了。 无论是 Rust、Haskell 还是其他任何语言,借助大语言模型的帮助,现在学习起来都更加容易。事实上,如果你在学习难懂的材料时没有利用大语言模型(LLMs)的帮助,那么你的学习方式可能不是最佳的。 至少这是我个人的看法。让我来解释一下。
中阶教材问题
译注:“中阶教材问题” (The Intermediate Material Problem) 是指在学习某个技能或领域时,在初级和高级阶段之间存在的一种学习难点。具体来说,在编程语言学习中,这个问题特别明显,尤其是对于像 Rust 这样的复杂语言。
在初级阶段,学习者通过教程和基础课程获得基本的知识和技能。这些资源通常都是易于理解和遵循的,目的是帮助初学者快速入门。然而,当学习者试图从基础过渡到更复杂的应用和项目时,他们常常发现可用的学习材料突然变得稀少并且难度很高。例如,在 Rust 编程中,学习者可能已经掌握了基本的语法和概念,但在尝试开发更复杂的系统(如光线追踪器)时,他们需要理解更高级的概念,比如所有权规则和内存管理,这些通常不在初级教程中详细讲解。
这种情况造成了一个“中阶教材”缺口,学习者必须依靠自己的努力和探索来克服这个难关,这通常包括阅读高级文档、参与社区讨论,甚至通过试错来解决具体的编程难题。这个阶段通常伴随着挫折和困惑,因为学习者不再有清晰的指导和步骤可循,而是需要自己摸索前进。
这个问题并不限于编程或技术领域。在许多学习曲线陡峭的领域中,从初学者过渡到熟练者的过程中都可能遇到类似的“中阶教材问题”。
设想你决定在下一个重大项目中使用 Rust – 你充满野心,打算开发一个光线追踪器 (ray tracer)。Rust 承诺的高速和安全性吸引了你,你通过一些教程和书籍已经成功掌握了其基础。但当你开始着手光线追踪器时,却遭遇了一道高墙。这就是所谓的 中阶教材问题,对于学习 Rust 来说,这是一个巨大的挑战。
从简单的 Rust 教程跳到复杂的图形渲染实现,差距非常大。你需要努力理解 Rust 的所有权规则 (ownership rules),解读编译器的错误信息,以及学会如何有效地管理内存。这不仅是编程的问题,更是如何用 Rust 的方式思考,而这需要克服陡峭的学习曲线。
这种挫败感是非常真实的 – 你清楚自己想要做什么,但从现在到达目标,就像在没有地图的迷宫中探路一样。这个阶段,从 Rust 的初学者成长为有能力构建光线追踪器的熟练开发者,是一个充满挑战和学习曲线的过程,许多 Rust 爱好者都会经历这个阶段。
这个 中阶教材问题 不仅仅存在于 Rust:它是许多复杂编程语言共有的体验。多年前,受到 Hacker News (HN) 的炒作影响,我决定学习 Haskell。读过几本书之后,我以为自己已经准备好开始一些真正的项目。但很快我就遇到了障碍。我经常遇到困难,不明白自己缺少什么,或为什么某些方法不起作用。感觉就像很多人都曾挣扎穿越这片迷惑的中间丛林,但每个人都必须找到自己的路径。Stack Overflow (一个编程问题解答网站) 虽有帮助,但反应慢,而我加入的一些 Slack (即时通讯平台) 社区则提供了更快的调试建议,但这整个过程都很漫长。
这就是所谓的陡峭学习曲线。它不是开始时的教程学习,而是当你离开教程,开始自己动手做项目,并遇到问题时的体验。
使用大语言模型作为编程学习的助手
在编程学习的中级阶段,我们常常遇到的一个挑战是,通过 Stack Overflow、邮件列表、论坛和 Reddit 等渠道获取反馈的速度过慢。但想象一下,如果你能在编程语言相关的子论坛上提出问题,并且几乎立刻就能得到答案,这会怎样改变你的学习过程?
试想一下,如果 Stack Overflow 能即刻回答每个问题,而不是简单地因为题目偏离主题而关闭它们。这种体验既有直接和朋友私聊时的即时性,又拥有专业社区邮件列表中的深度和广度。
在编程学习的中级阶段,ChatGPT 使这一切成为可能。
如果你在构建光线追踪器程序时遇到错误,直接问 ChatGPT。如果你不确定采取什么方法,就像在 Reddit 发帖一样表达你的想法,并向 GPT4、shell GPT 或 aider 寻求建议。虽然有时你可能会遇到它的知识极限并获得无用答案,但在中级阶段,你所提的大多数问题并非知识的边界,大语言模型会比你更了解这些内容。你需要的仅仅是一些指引。有时你不知道自己不知道什么,需要了解可能的问题和解决方案。ChatGPT 能迅速为你提供这些信息。
很多人没有意识到以这种方式使用 ChatGPT 的实用性,这令我感到惊讶。陶哲轩,当代最著名的数学家之一,就在使用 ChatGPT:
陶哲轩
作为一个实验,我最近在解决方案出炉前,尝试使用 #GPT4 咨询我在 #MathOverflow 上发现的一个问题。
根据以往的经验,我知道不应该直接让 #AI 回答问题(那几乎肯定会导致毫无意义的回答),而是让它扮演合作者的角色,提供策略建议。
它最终提出了八种方法,其中一种(生成函数法)最终被证明是成功的方法。在这个特殊的案例中,我可能最终会尝试使用生成函数法,但它的建议还是有些许帮助(我最初考虑的是采用渐近分析法来获取直觉,但这证明是不必要的)。
我想分享我的经验,希望能激励其他人也去尝试类似的实验。
来源
如果 ChatGPT 能帮助陶哲轩探索 Diaconis-Graham 不等式的解决方案,那它同样能帮助你理解 Rust 中基础的生命周期编译错误。
以下是一些我在一个 Python 和 Rust 小项目中的个人实例,这就是 我所说的。
没有挑战,学习会受阻?
这种方式引发的一个现实问题不是大语言模型 (LLM) 是否足够有助于你度过学习的中间阶段,而是它是否会妨碍学习过程。当我遇到问题并咨询 ChatGPT 时,它会提出一些解决方案,其中一个可能正是我需要的。但我担心如果没有它的帮助,我可能无法达到那个程度。难道 ChatGPT 正在使我的技能退化吗?如果我的目标是提高技能,那么 LLM 的协助是否在阻碍我的进步?
与普遍认为最佳学习来源于独立解决问题的观点相反,学习研究显示,在编程等复杂领域中,有指导的学习可能更有效果。
教育心理学家 John Sweller 指出,通过别人的引导来了解解决方案通常是学习的最佳方法,这比自己摸索更有效。大语言模型 (LLM),凭借其即时、情境化和对话式的帮助,在这方面表现卓越。
近端发展区
当中级学习者遇到难以理解的错误或知识空白时,向 ChatGPT 提出问题可以获得结构清晰的解释或逐步拆解这个问题。这不仅仅是解答问题,更重要的是揭示解决方案背后的逻辑和过程,明了其“为什么”和“如何”1。
有一个教育理论称为“近端发展区”。这是一片超越你目前技能的区域,在这里你需要外部帮助才能继续进步。LLMs 可以成为通往这一区域的桥梁,提供必要的辅助,帮助你突破个人能力的限制。
这种学习体验被称为“脚手架式学习”。你可以通过尝试超出自身能力范围的挑战、在遇到困难时寻求 LLM 的帮助,来缩小这个中间的差距。通过这种方式,你将能够完成超越你单独能力所及的任务。如果教育研究属实,这个过程将拓宽你独立完成任务的能力范围。这不是作弊,而是学习的过程。
试着挑战一些难题,并依赖 LLM 的帮助。通过合作学习,你将掌握超越当前界限的工具和技巧,并在新的领域中建立自信。
未来属于 Rust
让我们回到 Rust 和 Python 的对比:如果你是初次学习编程语言,那么不妨尝试 Python。但如果你像我曾经在构建 Haskell 网络服务时遇到难题,那么不妨再试一次。挑战难题,并在此过程中利用大语言模型来助你一臂之力。
现在,陡峭的学习曲线已经变得平缓许多!
试着做些事情,遇到障碍时寻找帮助,稍微回顾以确保你已经理解,然后再大胆前进。进入你的“邻近发展区”!
说到陶哲轩,他现在正在用 Lean,一种功能强大但颇为挑剔的定理证明工具,来形式化他的一些证明。你知道他是如何学习 Lean 的吗?
陶哲轩
继续记录我的 Lean4 项目的进展。
GitHub Copilot 在结束简短论证时非常有用,虽然它提出的长篇建议通常不准确。但即便是错误的建议也帮我学习正确的语法。
GPT-4 在澄清 Lean 语法细节方面有一定帮助,还能为我提供一种将数学英语转换成 Lean 步骤的建议翻译。然而,它似乎在很大程度上受到了 Lean3 语法的影响,这可能是由于训练数据截止日期的原因。
来源
如果我们这个时代最杰出的数学家都在用 ChatGPT 来帮助他进行证明,那么你也没有理由不尝试。
用 Rust 制作点东西,用 Ocaml 制作点东西,用 Elixir 制作点东西。中间阶段的困难已经不是问题。你的编程伙伴会帮你跨过障碍,很快你将能够自己跳过这些障碍。大语言模型只会变得更强大。因此,即便是编程语言变得更加富有表达力和严谨,拥有更陡峭的学习曲线,我们仍然可以学会它们。未来的世界将属于 Rust。