2021年9月はじめ、Exercism v3がついにリリースされました。Angelika Tyborskaは、その完成を後押しした主要メンテナーの一人です。AngelikaはElixirの学習演習とシラバスの共同制作者であるだけでなく、v3の開発期間を通じて重要な発言者であり、構築の過程でアイデアと洞察を加えてきました。Exercismの主要なコントリビューターでもあります。
この動画プレゼンテーションでは、Angelikaが、v3が解決しようとしていた問題、プラットフォームへの主な追加点、そして全体がどのように組み合わさっているのかを説明します。アナライザー、リプレゼンター、そして新しい学習演習を掘り下げていきます。
文字起こし
Exercismの歴史
Exercismはかなり前から存在しています。2013年にKatrina Owenが自分の生徒のためのツールとして初めて作りました。v1では、面白い練習演習を集めたものにすぎませんでした。v2では、無料のコードメンタリングができるプラットフォームになりました。
v3 🚀 2021年9月1日
9月1日、Exercismバージョン3がリリースされました。
この動画では、v3での変更点を順に説明し、なぜその変更が行われたのか、そしてそれがExercismでの体験をどのように改善してくれるのかをお話しします。
自己紹介
これが私です[0:38に表示される写真]。Angelikaです。共同メンテナーのTimと一緒に、Exercism v3のためのElixirトラックのツール一式と30を超える学習演習を作りました。新しい形になったExercismは、新しいプログラミング言語を学ぶための最高のツールになる可能性を秘めていると信じています。
v3の新機能とは?
Exercism v3では何が新しいのでしょうか? 短く言えば、たくさんです。
v3で導入された主要な変更はすべて、v2で利用者が経験した最大の問題に対処するためのものです。
v2の問題点
v3が対処する重要な問題は3つあります。
1つ目は初期設定の難しさ、2つ目は学びのないコード練習、3つ目はメンターの応答時間の長さです。
問題1:初期設定の難しさ
問題その1は、初期設定の難しさです。Exercismを始めるには、Exercism CLIと、試したいプログラミング言語をインストールする必要があり、さらにターミナルに慣れている必要があります。新しい言語の構文の色分けができるようにエディターを設定する必要もあります。経験豊富なエンジニアにとっては、こうした設定は面倒な時間の浪費でしかありません。しかし初心者にとっては、乗り越えられない壁になりかねません。
解決策は、ブラウザーでコードを書けるようにすることです。初期設定は一切不要です。
これを実現するために、Exercismにはウェブエディターが用意され、各プログラミング言語には、Exercismの演習のテストを実行する専用のテストランナーがあります。
ウェブエディター
これがウェブエディターです[2:25に表示されるスクリーンショット]。パネルが2つあり、左側がソースコード、右側が説明とテストスイートです。
凝った機能はありません。お気に入りのツールの代わりになることが目的ではないからです。目的は、必要なツールや依存関係のインストールを後回しにできるようにすることです。新しいプログラミング言語に慣れ、これからも使い続けたいと思えるようになってからインストールすればよいのです。
ウェブエディターは完全に任意です。これまでどおりCLIを使い、自分のパソコンでお気に入りのツールを使って作業を続けることもできます。
テストランナー
ウェブエディターを使えるようにするには、ブラウザーで書いた解答に対してテストを実行する仕組みが必要です。それがテストランナーの役割です。
Exercismの各言語には、それぞれ専用のテストランナーがあります。テストランナーはテスト結果を報告する役割を担いますが、それだけではありません。どんなコードが実行されているのかがわかって失敗メッセージを読み解けるように、テストの本体を取り出す必要があります。また、puts、print、console.logなど、その言語が用意している出力用の関数を使ってブラウザーでコードをデバッグできるように、テストの出力を取得する必要もあります。
テストランナーはブラウザーで演習を解くために欠かせませんが、CLI経由で提出された解答でも使われます。ある演習のコミュニティ解答を見るときや、生徒をメンタリングするときに、解答をダウンロードしてローカルで実行しなくても、テストに合格しているかどうかがわかります。
問題2:学びのないコード練習
問題その2です。Exercismはコード練習のためのプラットフォームですが、特定の言語をゼロから学ぶための教材はありませんでした。まずは別の場所で学ぶ必要があったのです。
Exercismの演習は面白く、やりがいがあるように設計されていましたが、最もやさしい演習でも、新しいプログラミング言語への入り口としては難しすぎることがあります。まったく違う構文の言語や、そもそも異なるプログラミングパラダイムを使う言語を学ぼうとしているときは、なおさらです。
解決策は、練習と並行して学習できるようにすることです。
シラバスと学習演習が加わったことで、Exercismは新しいプログラミング言語にすぐ飛び込める優れたツールになりました。
シラバス
シラバスとは何でしょうか? シラバスは、各プログラミング言語を構成する概念の木です。プログラミング言語ごとに違い、概念も異なるため、シラバスはExercismのトラックごとに独自のものです。
概念は互いに依存し合い、木のさまざまな枝を作っています。枝の中で前の概念を学ばないと、次の概念のロックは解除されません。
たとえば、これがElixirのシラバスの最初の部分です[5:10に表示されるスクリーンショット]。"basics"という概念から始まり、モジュールの定義方法、名前付き関数の定義方法、標準ライブラリのドキュメントの探し方を扱います。この知識は、Exercismのどの演習でも必要です。ほかのどの概念のロックを解除するにも、まずbasicsを学ぶ必要があります。たとえば真偽値について学び、真偽値がわかったらcond式について学ぶ、といった具合です。
参考までに、これがElixirのシラバス全体です[6:16に表示されるスクリーンショット]。現時点で50を超える概念を含んでいますが、まだ拡張が必要です。
一番上には、文字列、配列、マップ、タプルといった概念があります。真ん中には、Enumモジュール、正規表現、構造体、型仕様の記述があります。そして最後には、プロトコル、プロセス、タスクがあります。
学習演習
シラバスの概念は、学習演習を解くことで学びます。学習演習は練習演習とは異なります。学習演習は、そのプログラミング言語をまったく知らないけれど、少なくとも1つの別の言語とプログラミングの基本概念は知っている生徒に、プログラミングの概念を教えるために設計されました。
はじめに
各学習演習ははじめにから始まります。はじめにでは、その演習が教える概念についての基本情報を説明します。ほとんどの学習演習は1つの概念を扱いますが、例外もあります。
この例は、Elixirのマップについてのはじめにです[7:12に表示されるスクリーンショット]。マップとは何か、マップの定義方法、マップ内の値へのアクセス方法などを説明しています。新しい構文を示すコード例もいくつか含まれていますが、はじめにをコピー&ペーストするだけで演習を解けてしまわないように、多くはありません。
説明
次に説明があります。学習演習の説明は、小さなタスクに分かれています。タスクは、その概念で最も重要な部分を使うように生徒を自然に導くよう設計されています。
たとえば、マップを教える学習演習では、生徒はマップを作り、次にマップから値を読み取り、次にマップの値を更新し、次にマップからすべてのキーを取得する、といった流れになります。
各学習演習にはストーリーがありますが、ストーリーはそれほど重要ではありません。"foo bar"や"1 2 3"のような意味のない値を使わずに済むためにあるだけで、練習演習のように演習の中で大きな役割を果たすことはありません。
ヒント
各タスクには、生徒が行き詰まったときのために、少しだけヒントが用意されています。ヒントには、どのタスクでどの関数を使えばよいかが示されていることが多く、その関数のドキュメントへと導いてくれます。
概念を練習する
しかし、学習演習を1つ解くだけでは、その概念を本当に身につけるには足りません。練習も必要です。そこで、v2にすでにあったすべての練習演習を見直し、各概念の練習に使えるものをいくつか選びました。
木の中で1つの概念がどのように表示されるかがこれです[9:01に表示されるスクリーンショット]。点は演習を表しています。電球アイコンの付いた最初の点が学習演習で、ほかの点は練習演習です。
いくつかの演習を解いたあとに概念がどう見えるかがこれです[9:37に表示されるスクリーンショット]。学習演習を完了しているのに、この概念の練習演習のいくつかはまだロックされていることに注目してください。これは、練習演習が1つの概念の練習に限られていないからです。それらの演習のロックが解除されるまでに、アトム[スクリーンショットに表示されている概念]だけでなく、さらに多くの概念を学ぶ必要があるかもしれません。
学習演習は、その言語にすでに慣れている人にとっては簡単すぎるはずです。でも心配しないでください。学習演習は完全に任意です。学習モードから練習モードに切り替えれば、シラバスを最初から進めなくても、興味深い練習演習すべてにすぐアクセスできます。
シラバスの作成は一大作業
期待を裏切らないために一言触れておきたい重要な点は、シラバスの開発がとてつもなく大きな作業だということです。すべてのトラックに、すぐにシラバスを用意できるほど活発なメンテナーがいるわけではありません。
この動画を収録している時点[2021年9月4日]では、学習演習を利用できるのはCommon Lisp、C#、Elm、Elixir、F#、Go、Java、JavaScript、Python、Ruby、Rust、Swiftだけです。Juliaトラックもまもなくシラバスを公開する予定です。
問題3:メンターの応答時間の長さ
問題その3は、メンターの応答時間の長さです。すべてのトラックに十分なメンターがいるわけではありません。メンターがごく少ないトラックでは、メンタリングを待つ時間が1か月に及ぶこともあります。これは生徒にとって常に大きな失望の種でした。Exercismにとってこれほど根本的な問題なので、3つの異なる角度から対処しています。
自動フィードバック
解決策その1は、自動フィードバックを提供することです。メンターが生徒に書くフィードバックの多くは同じ内容の繰り返しです。よくある間違いを自動で検出し、生徒に直接伝えられるようになれば、状況は大きく変わります。
よくある間違いについての自動フィードバックがあれば、生徒はメンタリングを求める前に解答を改善できます。メンターの仕事も楽になります。メンターはsnake_caseとcamelCaseの違いのような細かいことをいちいち指摘せずに済み、解答の本質に集中できます。場合によっては、自動フィードバックだけで生徒が満足し、メンタリングをまったく求めないこともあります。
v3には、自動フィードバックのためのツールが2種類あります。アナライザーとリプレゼンターです。
アナライザー
アナライザーは、解答の中から特定の特徴を探し、見つけた内容についてのあらかじめ用意されたコメントの一覧を生徒に返すツールです。どんな特徴を探すかは、言語と演習によってまったく異なります。
たとえば、Elixirには関数と変数の命名規則があります。Elixirのアナライザーがどの演習でも行うチェックの1つに、すべての変数名と関数名の確認があります。snake_caseで書かれていない名前を見つけると、命名規則を生徒に思い出させてくれます。
Elixirのアナライザーができるもう1つのチェックは、特定のモジュールの使用を検出することです。たとえば、Enumモジュールを使わないためのこのチェック[13:20に表示されるスクリーンショット]は、再帰の学習演習に固有のものです。Enumモジュールを使うと学習演習の目的が台無しになるため、アナライザーはそうしないように、代わりに再帰を使うように生徒に促します。
リプレゼンター
Exercismで自動フィードバックを提供するのに役立つ2つ目のツールがリプレゼンターです。リプレゼンターは解答を受け取り、本質的でない部分を取り除きます。書式を統一し、コメントとドキュメントを削除し、関数名と変数名をプレースホルダーに置き換えます。
リプレゼンターの出力はリプレゼンテーションと呼ばれます。Exercismに提出された各解答はリプレゼンターに渡され、そのリプレゼンテーションは解答と一緒にプラットフォームに保存されます。
メンターは、提出された解答のリプレゼンテーションを閲覧できるインターフェースにアクセスできるようになります。メンターは、それぞれの固有のリプレゼンテーションにフィードバックを残せます。するとそのフィードバックは、同じリプレゼンテーションになる似た解答を提出したすべての生徒に表示されます。メンターは一度フィードバックを書くだけで、それを必要とするすべての人に届けられます。
リプレゼンター自体はすでにいくつかの言語で実装・デプロイされていますが、この動画を収録している時点[2021年9月4日]では、メンター向けのインターフェースがまだプラットフォームにありません。そのため、この機能が完全に利用できるようになるまで、もう少し待つ必要があります。
不要なメンタリングセッションを避ける
メンタリングの待ち行列が長くなることへのもう1つの解決策は、不要なメンタリングセッションを避けることです。v2では、コア演習ではメンタリングが必須でした。コア演習を提出すると自動的にメンタリングを依頼したことになり、メンターの承認がなければ次のコア演習に進めませんでした。多くの生徒はコア演習を進めながら言語を学んでいたので、学習の過程を導いてくれるメンタリングが必要でした。
これはもう当てはまりません。コア演習が担っていた指導の役割とメンターの承認は、学習演習とアナライザーが引き継ぎました。v3では、メンタリングは常に任意で、明示的に依頼する必要があります。
メンタリングの依頼
メンタリングを依頼するには、2つの質問に答える必要があります。1つは「このトラックで何を学びたいですか?」、もう1つは「メンターはあなたの解答をどう手伝えますか?」です。生徒がメンタリングセッションに何を期待しているかを事前に知ることで、メンターは自分の知識とメンタリングスタイルに最も合った依頼を選べます。こうすると、双方が満足してセッションを終えられる可能性が高まります。
メンタリングキューとお気に入り
新しいメンタリングキューでは、メンターは生徒のメンタリング履歴の統計を見られます。これまで一度もメンタリングを受けたことがなく、より丁寧なレビューが必要かもしれない生徒や、何度もメンタリングを受けて仕組みを理解している生徒がわかります。
またメンターは、以前にメンタリングした生徒を見つけて関係を築けるようになりました。生徒をお気に入りに追加し、以前よい経験ができた生徒を優先してメンタリングすることもできます。
ブロックリスト
各メンタリングセッションのあと、生徒もメンターも相手をブロックできます。ブロックリストは2つあり、ブロックした生徒とブロックしたメンターに分かれます。メンターである私が生徒である相手をブロックしても、その人が後で私をメンタリングできる可能性はあります。相手は自分がブロックされたことを知らないので、仕返しはできません。
理由を問わず相手をブロックできますが、相手が行動規範に違反している場合は、ほかの利用者を守るために、必ず改めて通報もしてください。
待ち時間が長いことによる悪影響を和らげる
最後に、待ち時間が長いという問題への対処の仕上げは、ときには待つ必要があるとしても、待つことによる悪影響を最小限に抑えることです。v3では、メンタリングを待っている間もほかの演習を解けます。トラックを先に進めることもできます。
メンタリングセッションはどちらからでも終了できます。生徒で、特定のメンターの進め方が気に入らない場合は、いつでも別の進め方を求めたり、セッションを離れたりできます。セッションがどのように終わっても、生徒は同じ解答について別のメンターに新しいメンタリングセッションを依頼できます。
メンタリング枠
トラックごとに、メンタリング枠を1から4つ持てます。メンタリング枠が複数あると、なかなかメンタリングが付きにくい難しい演習のメンタリングを依頼しながら、同時にほかの演習のメンタリングも受けられます。
メンタリング枠は、評価を獲得するとロックが解除されます。評価は、自分の解答を公開して誰でも閲覧できるようにしたとき、生徒をメンタリングしたとき、Exercismのいずれかのリポジトリに貢献したときに与えられます。つまり、プラットフォームに多く貢献する生徒ほど、多くのメンタリングを受けられます。
まとめ
以上が、2021年9月1日にExercismが変わった主な点の一部です。
プラットフォームを離れずに学べるように学習演習を、何もインストールせずにコードを書けるようにウェブエディターを、すぐに自動フィードバックを得られるようにアナライザーとリプレゼンターを追加しました。また、メンタリングの流れから、もどかしい障害をたくさん取り除きました。
ほかにも探索できる新しいものがたくさんあります。コントリビューションのセクション、バッジ、新しいプロフィール、Exercismでの歩みをすべて確認できるジャーニーページなど、まだまだあります。
exercism.orgに来て、ぜひ試してみてください。
ありがとうございました。