Exercism.ioは,フィードバックとディスカッションを通じて,プログラム言語における開発者のクラフトマンシップ向上を支援する。コードを書き,議論することによって,自身の問題解決能力を強化することができるコミュニティとツールである。
InfoQでは,Exercismを生み出したKatrina Owen氏と,C++言語トラックで貢献したRichard Thomson氏にインタビューした。
InfoQ: 読者のために,Exercism.ioについて簡単に説明して頂けますか?
Richard: Exercismは演習を通じて,ソフトウェア技術を向上させる場です。ソフトウェアの開発には,2つの力が影響します - 実用性とクラフト(craft)です。実用性の方は明確で,目的とするタスクを行うことができるかどうかが問われます。実用面での目的を達成するというのは,プログラミングを教える上で最も重要視される部分です。正しく動作するか? 堅牢か? このエラーはどうやって修正するのか?
クラフトの方は,それよりも漠然としています。ソフトウェアのクラフトは,経験を積み,他人の仕事を見ることで身に付けるものです。誰もクラフト面を尊重していないコードベースで作業を始めれば,その必要性を深く感じます。そのコードは長いメソッド,不適切に選択された名称,混乱した責務など,雑然さと重複で満ちているでしょう。
ソフトウェア業界は長い時間を掛けて,SOLIDやDRY,Demeterの法則などの設計上の原則を通じて,クラフトの望ましい側面を表現する用語を生み出してきました。コードにクラフトマンシップが不足していることを具体的に示す指標が,重複コードや長いメソッド,巨大なクラスなどといった,さまざまな"コードの匂い(code smell)"に体系化されました。
Exercismでは,プログラムの実用面を達成する方法についてはすでに知っている一方で,クラフトを向上させる方法を求めている,という人を前提としています。クラフトを向上させるということは,すでに理解している問題に対して示されたソリューションを評価する上で,そのベースとして利用可能なコードについて,他のプログラマと対話し,議論する,という意味です。
Katrina: Exercismでは,対象とする言語のシンプルさやスタイル,イディオムについて会話するための出発点として,簡単なプログラム演習を行います。プログラムの演習が目的だった人も,たいていは会話を交わすために留まっています。
InfoQ: Exercismでは,どのようなプログラム言語をサポートして,どのような種類の演習を提供しているのでしょう?
Katrina: 現時点では19のアクティブな言語があります。アルファベット順に,Clojure, CoffeeScript, Common Lisp, C++, C#, Elixir, Erlang, F#, Go, Haskell, JavaScript, Lua, Objective-C, OCaml, Perl (5), Python, Ruby, Scala, それから Swiftです。
PHPとJavaのトラックについても現在,最終的な詳細を詰めているところです。
演習それ自体は,基本的には非常に単純な例題です。形式としてはREADMEと,ローカルにフェッチして,ユーザが通常使っている環境とツールで作業するテストスイートです。テストスイートは中継点として適当なものですが,課題の面白いところは,ソリューションを繰り返し行うことです。さまざまなアプローチを試して,他のプログラマから批評をもらうのです。
Richard: Exercismで現在利用可能な言語と,各言語のトラックで行える課題をまとめた概要ページを用意しています。
InfoQ: Exercismは,開発者がよいコードを作ることの支援を目的としていますが,よいコードとはどのようなものなのでしょう?本当にそれが分かるのでしょうか?
Katrina: ほとんどの場合において,“よい”というのは直感に過ぎません。
直感は主に,経験に根ざしているものです。あなたの“よい”と私の“よい”とは,まったく違うでしょう。理由は単純で,私たちがまったく違うタイプのコードベースで仕事をしていて,まったく違う課題を解決しているからです。あなたが馴染んでいるものが,私にとっては得意なものなのです。
コードの静的解析を行って,議論の現実的な根拠を得ることも可能ですが,正直に言うと,このようなものはExercismdではあまり取り上げていません。会話の中心となるのは,どちらかと言えばコードの匂いや可読性などの方です。
私たちの言う“よい”とはまったく主観的なものですが,それでも議論する上ではとても便利なのです。
Richard: Katrinaと同じように私も,コードはある面において主観的だと思います。名前の選択に関わる話は普通に目にしますし,何といっても代表的なのは,空白とフォーマットに関して,際限のない強硬な意見がいくつもあることです。
ですが私は,時が経つに連れて,よいコードとはどんなものなのか,という客観的な基準に向かって進んでいると思っています。“複雑な関数/メソッドとはどういった時か?”といった単純な疑問には,循環的複雑度のようなコード指標で応えることができますし,“関数のパラメータは5つまで”というような経験則に対しても,あるバージョンのコードが別のものに比べてよいかどうか,答えることができます。
ソフトウェアには無限の柔軟性があります。Exercismでは,実用面では同じでも,他の人々がより理解しやすいような,別のコード形式について議論する方向に,人々を導こうとしています。もっと深い部分では,経験則の背後にある原則や,複雑度のような客観的データの利用に関する議論が行われます。これらは経験に深く根ざしたものですが,近年の認知科学の発展によって,このような直感についても,科学的な根拠が得られるようになってきました。Steve Halladay氏の近著“Principle-Based Refactoring”では,氏が学生に対して,よいコードを作り出す方法について助言する中で,直感の背景にある基本原則を明確化しています。
InfoQ: InfoQでは以前,ソフトウェアクラフトマンになるためのプログラムスキルの開発について,記事を書きました。Exercismはその上で,どのようにプラスになるのでしょう?
Richard: Exercismではまずテストを書いて,そのテストをパスするために実装を書きます。それによって,テストと実装を同時に考えなければならない場合に比較して,もっと穏やかにテスト駆動開発を導入することが可能になります。テストを書くことが,問題の解決方法を議論する上で出発点となり,その議論から,まさしく“ああ,なるほど!”が起きるのです。
私自身,PythonとJavaScriptの最初の演習を解決する中で,それぞれの言語を上達する新たな方法を学びました。最初の解法はちゃんと動きましたが,きれいではありませんでした。JavaScriptの最初の課題で使った,regexの乱れ打ちのようなやり方に納得できていなかったのです。もっとよい方法があるはずだと思いました。これらの言語での解法を提出した後で,他の人たちのソリューションを見ることができて,同じことをもっとシンプルに行う方法が分かりました。他の人たちからのフィードバックがなくても,別のソリューションを眺めているだけで,コードを改良する方法や,それらの言語でのより"自然"な方法が理解できたのです。
Katrina: スキル向上を達成する上でExercismが最もパワフルなのは,他の人たちのコードを見る集中的な方法と,それを改善していくための明確な方法を提供してくれる点だと思っています。Exercismは,自分で書いたものではないコードを読んで理解し,それについて体系的かつ批判的に考えるように仕向けます。それによってパターンやコードの匂いを理解し,可読性の有無に対する極めて実践的な感覚を身に付けられるのです。
さらに重要なのは,この批評を,分別を持った方法で明確化しなければならないことです。“こうしなさい”では不十分です。直感の理由付けを行わなければならないことで,自分自身のバイアスについて密接に調べ,時には自分自身の洞察に自ら驚くことにもなります。
InfoQ: hack.pledge()は,プログラマが集って相互指導を行うという世界的なトレンドになっていますが,このイニシアティブについてはどう思われますか?
Katrina: hack.pledge()や#pairwithme, CodeNewbiesのようなイニシアティブは素晴らしいと思います。彼らには,時としてプログラムの上達に関する数多くのブログ記事に没頭する,重要な人的コンポーネントがあるのです。
Richard: hack.pledge()を実行するためには,Exercismがよい方法だと思います!
InfoQ: 今が2015年12月だとしましょう。この1年間でExercismは何を達成して,どのようになっているでしょう?
Katrina: まずは,すべての言語トラックに一貫して,議論の質を向上したいと思っています。現時点では,他と比較してずっとアクティブなトラックがいくつかあります。すばらしいフィードバックがいつも受けられる言語(Haskellがそうです)がある一方で,ソリューションを提出する人は多いのですが,フィードバックを提供する人が少なかったり,その質がさまざまであったりしています。
その次には,サイトのユーザビリティを向上したいと思います。具体的には,既存の課題とソリューションの検索とフィルタリングを可能にしたら,関心を持った人たちと課題に対して通知できるようにしたいですね。
Richard: 今後1年間は,利用可能な言語トラックの数を増やして,さまざまな言語でもっと多くの課題を提供できるようにしたいと思います。それぞれの言語に特有の課題の数も増やしたいですね。Exercismに参加するユーザの数が増えて,プロジェクトへのコントリビュータも増えて,すべての人たちにとって,さらによいものにしたいと思っています。