2021 年 9 月初,Exercism v3 终于正式发布。 Angelika Tyborska 是帮助我们冲过终点的核心维护者之一。 她不仅是 Elixir 学习练习和教学大纲的共同创作者,在整个 v3 的开发过程中也一直是重要的发声者,在构建过程中不断贡献想法和洞见。 她是 Exercism 的重要贡献者。
在这段视频演讲中,Angelika 为我们讲解了 v3 旨在解决哪些问题、平台有哪些重要的新增内容,以及各部分如何协同工作,并深入介绍了分析器、表示器和全新的学习练习。
文字稿
Exercism 的历史
Exercism 已经存在有一段时间了。它最初由 Katrina Owen 在 2013 年创建,作为她给学员使用的工具。在 v1 中,它只是一系列有趣的实践练习。到了 v2,它变成了一个免费代码指导平台。
v3 🚀 01.09.2021
9 月 1 日,Exercism 第 3 版发布了。
在这段视频里,我会带你了解 v3 的各项变化,说明它们为什么会出现,以及它们将如何改善你在 Exercism 上的体验。
关于我
这就是我 [0:38 处显示的照片]。我是 Angelika。我和共同维护者 Tim 一起,为 Exercism v3 的 Elixir 轨道构建了相关工具和 30 多个学习练习。我相信,全新的 Exercism 有潜力成为学习新编程语言的最佳工具。
v3 有哪些新内容?
Exercism v3 有哪些新东西?简单来说:非常多。
v3 引入的所有重大变化,都是为了解决人们在 v2 中遇到的最大问题。
v2 存在的问题
v3 要解决 3 个关键问题。
第一:初始配置困难;第二:只练代码,没有学习;第三:导师响应时间长。
问题 1. 初始配置困难
第一个问题:初始配置困难。要开始使用 Exercism,你需要安装 Exercism CLI、你想尝试的编程语言,还得能在终端里自如操作。你还要配置编辑器,让它为这门新语言做语法高亮,等等。对资深开发者来说,这些配置只是浪费时间的麻烦事。但对初学者来说,它可能是一道无法逾越的障碍。
解决方案:让人们直接在浏览器里写代码。不需要任何初始配置。
为此,Exercism 现在有了网页编辑器,每种编程语言也都有了自己的测试运行器,专门用来运行 Exercism 练习的测试。
网页编辑器
这就是网页编辑器 [2:25 处显示的截图]。它有 2 个面板,左边是源代码,右边是说明和测试套件。
它没有什么花哨的功能,因为它并不是要取代你最爱的工具。它的目的是让你可以先把安装各种必要工具和依赖的事往后放,等你对这门新编程语言更熟悉、确定想继续用下去之后再说。
网页编辑器完全是可选的。你依然可以使用 CLI,在自己电脑上用喜欢的工具工作。
测试运行器
要让网页编辑器真正可用,就得有办法对你写在浏览器里的解答运行测试。这正是测试运行器的职责。
Exercism 上的每种语言都有自己的测试运行器。测试运行器负责报告测试结果,但还不止这些。它还要提取测试的主体,让你知道实际执行的是哪段代码,从而理解失败信息;同时还要捕获测试的输出,这样你就能在浏览器里用puts、print、console.log或这门语言提供的任何打印函数来调试代码。
测试运行器是在浏览器里解题的关键,但它们也会用在你通过 CLI 提交的解答上。当你在浏览某个练习的社区解答,或指导学员时,不用下载到本地运行,就能看到这份解答是否通过测试。
问题 2. 只练代码,没有学习
第二个问题:Exercism 是一个代码练习平台,却没有提供从零开始学习某门语言的资源。你得先去别的地方学。
Exercism 上的练习被设计得有趣又有挑战性,但有时候,即便是最简单的练习,作为入门一门新编程语言的起点也太难了。当你要学的是一门语法完全不同、甚至采用不同编程范式的语言时,情况尤其如此。
解决方案:让学习和练习并行。
随着教学大纲和学习练习的加入,Exercism 现在已经成了一个可以直接上手一门新编程语言的绝佳工具。
教学大纲
什么是教学大纲?教学大纲是一棵由概念组成的树,这些概念构成了每一门编程语言。Exercism 上每条轨道的教学大纲都是独一无二的,因为每门编程语言都不同,包含的概念也不同。
这些概念彼此依赖,形成树上的各个分支。你需要先学会分支上的前一个概念,才能解锁下一个概念。
例如,这是 Elixir 教学大纲的开头 [5:10 处显示的截图]。它从一个叫“basics”的概念开始,涵盖:如何定义模块、如何定义具名函数,以及在哪里找到标准库的文档。这些知识是每一个 Exercism 练习都需要的。你需要学会 basics,才能解锁任何其他概念。你可以先学布尔值,学会布尔值之后,就可以学习 cond 表达式,以此类推。
作为对比,这是完整的 Elixir 教学大纲 [6:16 处显示的截图]。目前它包含 50 多个概念,但仍然需要继续扩充。
在顶部,你会看到这样的概念:字符串、数组、映射和元组。中间有:Enum 模块、正则表达式、结构体,以及编写类型规格。最后则是:协议、进程和任务。
学习练习
你通过学习练习来掌握教学大纲里的概念。学习练习与实践练习不同。它们是为了向那些完全不懂这门特定编程语言,但至少会一门其他语言、了解基本编程概念的学员传授编程概念。
简介
每个学习练习都从简介开始。简介会介绍这个练习所教概念的基本信息。大多数学习练习只教一个概念,但也有例外。
这个例子展示了关于 Elixir 映射的简介 [7:12 处显示的截图]。它解释了什么是映射、如何定义映射、如何访问映射中的值等等。里面有一些代码示例来展示新语法,但数量不多,这样你就没法直接把简介复制粘贴过去解题。
说明
然后是说明。学习练习的说明被拆成一个个小任务。这些任务旨在引导学员去使用某个概念中最关键的部分。
例如,教映射的学习练习会让学员先创建一个映射,然后从映射中读取一个值,再更新映射中的一个值,接着取出映射中的所有键,等等。
每个学习练习都有一个故事背景,但这个故事并不太重要。它存在的意义只是让你不必使用“foo bar”和“1 2 3”这类毫无意义的值,它在练习中的作用不像在实践练习中那么大。
提示
每个任务都附带一小串提示,以防学员卡住。提示常常会点出某个任务该用哪个具体的函数,并引导你查阅该函数的文档。
练习概念
但只做一个学习练习还不足以真正掌握一个概念,你还得练习它。因此我们梳理了 v2 中已有的全部实践练习,挑出了一些可以用来练习每个概念的练习。
这就是树中单个概念的样子 [9:01 处显示的截图]。圆点代表练习。第一个带灯泡图标的圆点是学习练习,其他圆点则是实践练习。
这是一个概念在完成几个练习之后的样子 [9:37 处显示的截图]。注意,即使学习练习已经完成,这个概念下的某些实践练习仍然是锁定的。这是因为实践练习并不局限于练习单个概念。在这些练习解锁之前,你可能需要学习比 atoms 更多的概念 [截图中的概念]。
对于已经精通某门语言的人来说,学习练习应该是小菜一碟。不过别担心,它们完全是可选的。你可以从学习模式切换到实践模式,这样就能立刻使用所有有趣的实践练习,而不必先啃完教学大纲。
教学大纲 = 巨大的投入
有一点我必须提一下,好让你有合理的预期:开发教学大纲是一项极其巨大的工程。并不是每条轨道都有足够多的活跃维护者,能够立刻把教学大纲准备好。
在我录制这段视频的时候 [2021 年 9 月 4 日],只有以下语言提供学习练习:Common Lisp、C#、Elm、Elixir、F#、Go、Java、JavaScript、Python、Ruby、Rust 和 Swift。Julia 轨道很快就会推出它的教学大纲。
问题 3. 导师响应时间长
第三个问题:导师响应时间长。并不是每条轨道都有足够的导师。有些轨道的导师太少,等待指导的时间可能长达一个月。这一直让学员感到非常沮丧。这对 Exercism 来说是个核心问题,所以正从 3 个不同的角度来解决。
自动反馈
解决方案一:提供自动反馈。导师写给学员的很多反馈都是重复的。能够自动检测常见错误并直接反馈给学员,这会带来巨大的改变。
拿到关于常见错误的自动反馈,学员就能在请求指导之前先改进自己的解答,这也让导师的工作更轻松。它能让导师不必再提 snake_case 与 camelCase 这类琐碎的细节,而可以专注于解答的本质。在某些情况下,自动反馈足以让学员满意,他们甚至根本不会去请求指导。
在 v3 中,有两类用于自动反馈的工具:分析器和表示器。
分析器
分析器是一种工具,它会在解答中查找特定的特征,并向学员返回一份关于所发现内容的预定义评论列表。具体查找哪些特征,完全取决于语言和具体的练习。
例如,Elixir 对函数和变量有非常具体的命名规范。Elixir 分析器对每一个练习都会做的一项检查,就是检查所有的变量名和函数名。如果它发现某个名字没有用 snake_case 书写,就会提醒学员注意命名规范。
Elixir 分析器还能做的另一项检查,是检测某个特定模块的使用情况。例如,这项针对不使用 Enum 模块的检查 [13:20 处显示的截图],就专门用于递归的学习练习。使用 Enum 模块会破坏这个学习练习的意义,所以分析器会提醒学员不要这么做,而要用递归。
表示器
帮助我们为 Exercism 提供自动反馈的第二类工具是表示器。表示器会拿过解答,去掉其中非必要的部分。它会规范化格式,删除注释和文档,并用占位符替换函数名和变量名。
表示器的输出被称为表示。每一份提交到 Exercism 的解答都会传给表示器,它的表示会连同解答一起存储在平台上。
导师们随后可以访问一个界面,在其中浏览已提交解答的表示。对每一种独特的表示,导师都可以针对该表示留下反馈。之后,这份反馈会呈现给每一位提交了具有相同表示的相似解答的学员。导师只需写一次反馈,就能传达给每一个需要它的人。
表示器本身已经在一些语言中实现并部署了,但在我录制这段视频的时候 [2021 年 9 月 4 日],平台上还缺少导师使用的界面,所以我们需要再等一段时间,这个功能才会完全可用。
避免不必要的指导会话
应对指导队列过长的另一个办法,是避免不必要的指导会话。在 v2 中,核心练习是必须接受指导的。提交一个核心练习就意味着你自动请求了指导,而没有导师的认可,你就无法进入下一个核心练习。很多学员正是通过做核心练习来学习语言,所以他们需要指导来引导自己的学习过程。
现在不再是这样了。核心练习的教学作用,以及导师认可,已经由学习练习和分析器接管。在 v3 中,指导始终是可选的,而且必须由学员主动请求。
指导请求
要请求指导,你需要回答 2 个问题:你希望从这条轨道上学到什么?以及:导师可以为你的解答提供什么帮助?事先了解学员对这次指导会话有什么期待,导师就能挑选出最符合自己知识和指导风格的请求,这样双方都更可能在会话结束后感到满意。
指导队列与收藏
在新的指导队列中,导师可以看到学员指导历史的统计数据。他们能看出哪些学员从未被指导过、可能需要更细致的审阅,也能看出哪些学员已经经历过很多次指导、清楚其中的流程。
导师终于还能找到自己以前指导过的学员,并与他们建立关系。导师甚至可以把学员加入收藏,借此优先指导那些以前有过愉快合作经历的学员。
屏蔽名单
每次指导会话结束后,学员和导师都可以选择屏蔽对方。屏蔽名单有两种:已屏蔽学员和已屏蔽导师。如果我作为导师屏蔽了作为学员的你,你以后仍然可能来指导我。被屏蔽的人当然不会知道自己被屏蔽了,所以也就无法报复你。
你可以出于任何原因选择屏蔽某人,但如果对方违反了行为准则,请务必同时明确举报,以保护其他用户。
减轻长时间等待的负面影响
最后,解决长时间等待问题的最后一步,是确保即使有时你需要等待,等待带来的负面影响也尽可能小。在 v3 中,等待指导不会妨碍你去做其他练习。你依然可以在这条轨道上继续前进。
指导会话可以由任何一方结束。如果你是学员,不喜欢某位导师对待你的方式,你随时可以要求换一种方式,或者选择退出会话。无论指导会话如何结束,学员都可以针对同一份解答,向另一位导师请求一次新的指导会话。
指导名额
每条轨道上,你可以拥有 1 到 4 个指导名额。多个指导名额能帮上忙:当你想为一道较难、不太可能很快得到指导的练习请求指导时,你同时仍然可以在其他练习上获得指导。
指导名额可以通过积累声誉来解锁。发布解答供所有人浏览、指导学员、为 Exercism 的任意一个代码仓库做贡献,都能获得声誉。这意味着对平台贡献更多的学员可以获得更多指导。
总结
以上就是 Exercism 在 2021 年 9 月 1 日发生的一些重大变化。
我们加入了学习练习,让你不必离开平台就能学习;加入了网页编辑器,让你不用安装任何东西就能写代码;还加入了分析器和表示器,让你能立刻获得自动反馈。我们还移除了指导流程中许多令人沮丧的阻碍。
还有很多其他新内容等你探索:我们的贡献专区、徽章、全新的个人资料页、记录你完整 Exercism 历程的历程页面,等等。
快来 exercism.org 试一试吧。
谢谢。