ObjectSquare [2013 年 4 月号]

[ レポート ]


Coderetreat

〜プログラミングのスキル向上に効果的な教育プログラム〜

株式会社 オージス総研

組み込みソリューション第二部 大西洋平


1. はじめに

読者の皆さんは、Coderetreat というイベントをご存知でしょうか?この Coderetreat とはプログラマのスキル向上を目的に世界中の都市で定期的に開催されているボランティアベースのイベントです。

筆者は Coderetreat に過去 2 回参加してみて、プログラマのスキル向上に効果的なイベントであることを実感しました。本記事では Coderetreat の特徴、そして筆者が参加して感じた Coderetreat の効果、学びを多く得るための活動について紹介します。

<参考>

2. Coderetreat の特徴

Coderetreat は プログラマの retreat(避難所とか静養所という意味)です。普段の業務では常にリリースで追われていて、プログラミング・設計・テストなどの基礎テクニックを習得する機会を作れていないという方は多いと思います。そこで納期とは無縁な場所で基礎テクニックを習得する機会をプログラマに与えるのがこのイベントの趣旨です。筆者は、ソフトウェア開発の歴史の中で培われたプログラミングのノウハウが凝縮された良いトレーニングになっていると感じています。

ここでは Coderetreat の特徴を簡単に紹介します。Coderetreat は全世界で全く同じ内容で開催されています。なお、当日の雰囲気は参加者のレポートを参照ください。

(1) 全員が共通の題材「コンウェイのライフゲーム」を開発する

Coderetreat 参加者は全員が共通の題材として「コンウェイのライフゲーム」の作成に取り組みます。人工生命のシミュレーションとして有名なゲームです。シンプルでありながら、設計の仕方はいくらでも工夫できる良問です。

コンウェイのライフゲーム

(2) 45 分 1 セッションのペアプログラミングを 6 回繰り返す

Coderetreat では、1 回 45 分のセッションごとに新しいペアを組んで、設計の仕方や作業の進め方を毎回話し合い、相手と合意しながらプログラミングを進め、最後に振り返りを行うという流れを6回繰り返します。

(3) 各セッション、ゼロからコードを書く

セッション終了時にはコードを全て削除し、毎回、ゼロからライフゲームというゲームのコードを書いていきます。初参加の人にとってはかなりショッキングなルールです。

(4) プログラミング言語やテスティングフレームワークを限定しない

プログラミング言語やテスティングフレームワークを限定しないため、ペアによってはお互いに得意な言語が共通していないケースもよくあります。そのため、セッションの最初には「どの言語でやりますか?」と話して決めるのがお決まりです。

(5) 様々な開発手法を使う

Coderetreat では、ペアプログラミング、TDD、オブジェクト指向設計といった手法に積極的に取り組むよう奨励されています。Coderetreat には「ファシリテータ」と呼ばれる全体進行兼指導役の人が必ず参加しており、基本的なやり方はファシリテータが説明します。また、各手法に詳しい方がペアの場合、直接教えてもらうことも可能です。

(6) 参加費・昼食・おやつが無料!

公式イベントでは企業がスポンサーとなり、会場・昼食・おやつの費用を負担することがルールになっています。参加費も無料のため、参加者は一切費用を支払うことなくイベントに参加できます。

3. Coderetreat の教育効果とその仕組み

筆者は過去 2 回 Coderetreat に参加して他の参加者の様子を観察したところ、最初はオブジェクト指向設計・TDD・ペアプログラミングに不慣れな方でも最後のセッションには十分こなしている様をよく見て驚いたことがあります。個人で書籍などを読んで学習するのと比較すると非常に効率的にスキル習得ができているのではと思います。ここでは、Coderetreat で効率的にスキル習得が可能な理由について筆者なりの考察を紹介します。

(1) 効率的に学べるよう課題の内容と順番が設計されている

Coderetreatでは、参加者がより良く学べるようにファシリテータが参加者を誘導していきます。ファシリテータがソフトウェア開発の基本原則を噛み砕いて説明し、取り組む課題の内容や順番をコントロールしているため、個人でいろいろな書籍を参照しながら学習するより効率的に学べます。

例えば、Coderetreatの「Coderetreatファシリテータガイド」では以下のようにセッションごとの課題を出すよう推奨しています。

#1 適切なオブジェクト指向設計にするための設計制約です。「ThoughtWorksアンソロジー」の「 5 章 オブジェクト指向エクササイズ」で紹介されています。

#2 Bob Martin が提唱した TDD の三原則に忠実なTDDを指します。

最初に問題を理解して、徐々に難易度の高い開発手法の改善に誘導し、より理想的な形でオブジェクト指向設計や TDD に取り組むようになっていることがお分かりいただけると思います。 このファシリテーションの仕方は、Coderetreat を運営している世界中のファシリテータ達が時間をかけて議論し、洗練させてきたスタイルです。このスタイルをベースにして、ファシリテータがその場の参加者の活動に合わせたフィードバックを返していくことで参加者の理解を改善していきます。

(2) セッションごとのペアプログラミングと振り返りによって取り組みが改善する

Coderetreat では、セッションごとにペアプログラミングおよび振り返りを行います。筆者はこのプラクティスが参加者にとって学びを頭の中で整理して、取り組みを改善するきっかけづくりになっていると感じます。

まず、ペアプログラミングをする上では、自分の設計や実装の方法をペアの相手に強制するわけにはいかないので、相手に対して自分の案を採用するメリットを論理的に説明する必要があります。また、ペアの相手に意図が伝わっていない場合、質問を受けることもあります。ここで、自分の中で案について考えを整理できていないと相手に説明できないので、必然的に「本来どう設計するべきか?」と「なぜそれが良いのか?」を自問して整理するようになります。

次にセッション後の振り返りで、そのセッションの取り組みで良かったことや悪かったことを整理します。この時に出た自分とペア相手の改善案は、自分の頭の中で整理され、次のセッション以降に引き継がれていきます。こうして、セッションを経るごとに各参加者の取り組みは少しずつ改善されていきます。

(3) ペアのシャッフルによって暗黙知が全員に広がる

ソフトウェア開発のスキルは書籍に書かれた形式知を学んだだけでは、実際に使えるようになりません。実際に使えるようになるには自分で実践して経験を積む必要がありますが、すでにスキルを習得している人の所作を間近に見ることで、その暗黙知を理解することは可能だと思います。

Coderetreat では、セッションごとにペアを入れ替えていくため、特定の言語やフレームワーク、設計原則などに習熟している方とペアを組む機会があります。その際に、相手の所作や発言を見聞きするだけで、書籍を読んだだけでは理解できなかったことを直感的に把握できたりします。このペア間での暗黙知の交換を繰り返すことで、1 日が終わる頃には各自の暗黙知が全体に広がっていくことになります。

4. 学びをより多くするための筆者オススメの活動

ここでは筆者が Global Day of Coderetreat 2012 に参加したときに意識したことを紹介します。筆者はイベントに参加する際に、「せっかく丸一日使うのだから十分楽しみ、より多くのことを学べる時間にしたい」と考え、実際に普段とは違うやり方に取り組んだり、他の人から違う考え方を学んだりすることで、視野を広げることができました。

(1) 普段と違う言語・テスティングフレームワークに挑戦する

私は組み込みソフトウェア開発者で、主に業務で使うのは C/C++ です。開発環境のスクリプトを開発する時にVB / Python などを触る機会がありますが、他の言語を触る機会はあまりありません。しかし、他の言語の方が進化しており、他言語のやり方を学ぶことで自分のやり方を洗練することもできます。そこで今回は、あえて自分が普段使っていない言語が得意な方とペアを組み、その言語での基本的な考え方を学ぼうとしました。

今回挑戦してみて一番良かったと感じたのは Ruby とそのテスティングフレームワークの RSpec です。直感的に書いたコードがだいたい動く感じが非常に気持良いです。そして、RSpec の description やcontext という要素でテストコードを構造化していくやり方は非常に頭が整理されていくように感じました。普段の開発で当分 RSpec を利用する機会はありませんが、今回そのエッセンスを理解できたので、次に利用する時のハードルは下がったと思います。

(2) 普段と違う設計手法に挑戦する

今回のイベントの趣旨は、業務ではできない体験をすることなので、普段とは違う考え方で設計をやるのが一番でしょう。普段、モデリングして、オブジェクト指向的に設計していない人はオブジェクト指向にチャレンジする良い機会です。

筆者の場合は、オブジェクト指向設計に慣れているので、あまり慣れていないペアの時はモデルを書きながら、オブジェクト指向設計をリードするよう努めました。

また、for文を使わないようにするという設計制約を乗り越える過程で、普段あまり使わない言語要素の map & filter で簡潔にコードを書く方法を教えてもらったりしました。普段使っていない機能のため勉強になりました。

(3) 未体験の技術プラクティスにチャレンジする

Coderetreat は仕事と違って完成しなくても上司とお客さんに怒られたりしません。仕事ではリスクが高くて手をつけられなかった技術プラクティスに取り組んでみましょう。

例えば、「TDD って知識として知ってはいるけど、実際にどうやるかわからない」という人は絶好の機会なので TDD に挑戦してみて下さい。きっちり歯車が噛み合っている状態でバグを発生せずに少しずつ前に進んいく感覚は非常に気持が良いと思います。

今回、私がやってみたのは「実践テスト駆動開発 テストに導かれてオブジェクト指向ソフトウェアを育てる」で紹介されている「二重のテストループ」です。翻訳者の和智さんがブログエントリ「テスト駆動開発の進化」で紹介されています。詳しくはそちらを参照してください。

(3) 振り返りで面白かったネタをシェアする

セッションの最後にペアで振り返りし、その時の付箋をボードに貼って、皆と体験をシェアします。基本的にはファシリテータの方が全体にシェアすべきことを拾ってくれますが、特にこれは!と思う内容は付箋を貼る時に皆に話してみると取り上げてもらえる確率も上がるでしょう。

(4) 海外の参加者と交流する

Coderetreatでは毎年「Global Day of Coderetreat」という世界中の都市で同時にイベントを開催する日があり、直近では2012年12月に世界の約 150 都市以上(以下の図で目印が立っている箇所)で同時に開催されました。世界中のプログラマと一緒に同じ活動をする一体感を感じられるのも、このCoderetreatの醍醐味だといえるでしょう。

Global Day of Coderetreat 2012 開催都市

より大きな地図で GDCR2012 を表示

2012 年は Twitter で世界共通のハッシュタグを使い、リアルタイムにお互いの状況を共有しました。私も #gdcr12 に対して Coderetreat で推奨されている手法について質問したところ、J. B. Rainsberger@jbrains)さんというヨーロッパ系カナダ人のコンサルタントの方から即座にコメントがありました。

この時の質問は、coderetreat.org の Activity Catalog というページで紹介されているアクティビティの一つ「Verbs Instead of Nouns」とは何か?というものです。Rainsberger さんからの回答は「Name your modules or classes with verbs instead of nouns(モジュールやクラスの名前に名詞ではなく動詞を使いなさい). It affects how I divide responsibilities(このやり方は責務の分割に影響します).」とのことでした。

この「Verbs Instead of Nouns」は英語ライティングの時によく習う「簡潔な文章を書くためのテクニック」です #3。コードをより明確かつ簡潔に書くべき、そしてそう書けるようにクラス設計しようというアドバイスだと考えられます。この考え方は、日本のソフトウェアエンジニアの間ではあまり認知されていない考え方ではないでしょうか?筆者は、この考え方を学べただけでも Twitter に質問してよかったと感じています。

#3 google 検索すると英文ライティングの解説がたくさん出てきます。気になる方は調べてみて下さい :)

5. おわりに

本記事では、Coderetreat の特徴、筆者の考える教育効果とその仕掛け、学びをより多くするための活動について紹介してきました。

Coderetreat は世界中のソフトウェアエンジニアが一緒になってアイディアを出し、改善されてきただけあって、非常に良い教育イベントです。今後も定期的に開催されます。興味ある方は、一度参加してみてはいかがでしょうか?



©2013 OGIS-RI Co., Ltd.
HOME HOME TOP オブジェクトの広場 TOP