Shinya’s Daily Report このページをアンテナに追加 RSSフィード

2011/12/03(土)

[][][]Global Day of Coderetreat in Tokyoに参加してきた #gdcr11 00:33 Global Day of Coderetreat in Tokyoに参加してきた #gdcr11を含むブックマーク Global Day of Coderetreat in Tokyoに参加してきた #gdcr11のブックマークコメント

f:id:absj31:20111204012030j:image:w800

(写真:世界中で同時開催されている各地会場の幾つかと、直接映像・音声で交流する一幕。写真右側には東京イベントのファシリ−テータ:原田 騎郎さん。)


この日は、『Global Day of Coderetreat in Tokyo』というイベントに参加してきました。

場所はクラスメソッド株式会社飯田橋。以前RIA関連の3日連続でセミナーが開催された時に訪れて以来の訪問です。

f:id:absj31:20111203105600j:image

開催時間は8:30〜17:30。普段の平日お仕事よりも遙かに早起きでした。つか5時台起きって!(;゚Д゚)(笑)(※まぁ、これには主催側からの意図もあったのですが、これは後述)

今回は勉強会そのもののレポートの前に、このイベントについても少し説明を加えていきたいと思います。


イベント『Global Day of Coderetreat』とは

以下はこくちーず概要文から転載。

Coderetreat は、プログラマのための練習、学習のためのイベントです。
同じ課題をペアプロで実装しながら、プログラミング、設計、テストなどの技術を学びます。 

詳細は、InfoQ の記事を参照ください。 

12/3 には、世界80カ所以上、2000 人を超えるプログラマが同じ課題に取り組む予定です。 

そしてInfoQの関連エントリはこちら。

Global Day of Code RetreatはCorey Haines氏と世界各地のファシリテータが開催する国際的なイベントで、世界中で一日で可能な限りのCoderetreatsを同時実行するというものだ。技術力を研磨するだけでなく、 Coderetreatsに対する理解を高め、ソフトウエア開発者の具体的なスキルを改善することを目的にしている。

抜粋・要約すると、『Global Day of Coderetreat(以下"Coderetreat")』はこんな感じのイベントでしょうか。

  • イベント自体は2009年から始まっており、フィードバックを得て世界的に広まる一大イベントとなった。
  • 今回開催するこのイベントは、全世界80箇所以上、総勢2000人以上が参加するまさに『世界規模』のイベントである。(2011/12/03に32時間を掛けて全世界で順次開催)
  • 日本としては今回が初参加。
  • 世界同時開催なので、途中海外との中継もあったりする。
  • 扱うテーマはただ1つ、『ライフゲーム(Conway's Game of Life)』。
  • 1日で複数回ペアプロセッション(今回は45分×6回)があり、ペアプロの度に相手を変える。
  • ペアプロ変更の際には、そのセッションで作ったコードを破棄しなければならない。
  • 開発言語はオブジェクト指向プログラミングが可能な言語であれば何でも構わない。
    • (※事前に個別の環境準備が必要。ペアプロ組みも各自簡単な自己紹介にあわせて言語の経験有無、要望等を掲げた上で休憩時間中等に臨機応変にペアを探していた。ペアプロなので(当然)片方の端末に開発環境が入っていれば良く、今回新たに○○でペアプロしてみたい→実践した、という人も非常に多かった)

以下はほぼ英語サイトですが、イベントに関する主なサイト一覧です。

  • Global Day of Coderetreat:今回のイベントに関するエントリページ。世界各地の開催場所を示すGoogleMapや全世界一括のスケジュール表など、ワールドワイドな面を持つイベントの凄さが実感出来ます。
    • f:id:absj31:20111204033913j:image
  • GDCR 2011 Timeline.pdf:全世界中の開催地一覧及びタイムスケジュール。御覧の通りものすごい数の地域が参加しています。
    • f:id:absj31:20111204034453j:image
    • その中で日本は日付変更線の影響もあり、かなり早めのスタートとなっていました。
    • f:id:absj31:20111204034726j:image


課題『ライフゲーム(Conway's Game of Life)』とは

こちらの課題については(その世界では有名なものらしいのですが)当イベントに参加するにあたり個人的には始めて知った内容でした。

ライフゲームの仕組みそのものについては以下の各種リンクを御覧ください。

このイベントに於いては、この課題『ライフゲーム(Conway's Game of Life)』の主に準備・判定・描画に関する部分をペアプログラミング with TDD する、というのが唯一の共通課題となっています。


本編:開場〜趣旨説明〜準備

f:id:absj31:20111203085540j:image

当日のタイムスケジュールはこちら。御覧の通り、休憩と冒頭の準備時間以外は全て『ペアプロ+ふりかえり』のみ。午前と午後に共に3回。朝8:30からの開催については原田さん曰く『午前中に3回ペアプロを組み込みたかった』意向があっての事だそうです。午前2+午後4案も考えたが比較的疲労が蓄積していきやすいと思われる午後に4つこなすのは…という考慮もあってのことだそうです。

08:30 - 09:00 会場、趣旨説明、準備 
09:00 - 09:45 ペアプロ セッション#1 
09:45 - 10:00 ふりかえり#1 
10:00 - 10:45 ペアプロ セッション#2 
10:45 - 11:00 ふりかえり#2 
11:00 - 11:45 ペアプロ セッション#3 
11:45 - 12:00 ふりかえり#3 
12:00 - 13:30 昼食(昼食は提供されます) 
13:30 - 14:15 ペアプロ セッション#4 
14:15 - 14:30 ふりかえり#4 
14:30 - 15:15 ペアプロ セッション#5 
15:15 - 15:30 ふりかえり#5 
15:30 - 16:15 ペアプロ セッション#6 
16:15 - 16:30 ふりかえり#6 
16:30 - 17:00 全体ふりかえり

イベント趣旨及び会場の説明等を終えた後は、各自簡単な自己紹介と『これまで経験してきた言語』『今日チャレンジしてみたい言語』などペアプロを組む上での材料となり得る情報を各自展開。

ちなみにここで各種協賛企業等の紹介があったのですが、こんな情報も。皆さん明日からは発音に気を付けていきましょう。

自分は『使用言語は主にJavaですがこの機会に新しい言語に触れてみたいと思いますので宜しくお願いします』的な感じで行きました。



本編(午前):ペアプロセッション〜ふりかえり 1〜3

1.PHP

お互い参加が決まった当初から『当日は是非PHPで!』とお誘いを受けていたのでどこかのタイミングでこちらも是非とも…と思っていたのですが、まさかの初回組み合わせ(笑) 勿論、利用言語はPHPで実践。私自身は仕事外でちょこっと(部分改修位で)触った程度のPHP力であったので、今回始めてオブジェクト指向PHPを一から構築する…という経験が出来ました。

私自身『ライフゲーム』のルールをきちんと把握せずに来てしまっていた部分があったのでまずはその辺りのルール理解に時間を少々費やす形に。その後は議論を重ねつつ、基本的な構成クラスのTDD及び作成辺りに差し掛かったところであっと言う間に45分を消化。@ShiroKappaさんとはもう少し後の方で、十分ルールを理解した上でペアプロしてみたかったな〜と言うのはあったかも。^^;

とは言え、第1セッションでは『ペアは、問題ドメインの感覚をつかむ。コンウェイライフゲームを全員が知っている訳ではないので、このセッションはまずは問題を理解するために使わせてよい。』(原田さん翻訳エントリより抜粋)とあるので、そういった意味ではルールを理解するというハードルをクリア出来たのは良かったです。

f:id:absj31:20111203160114j:image

(セッションを終える毎に追加される『ふりかえり』の付箋。)


2.Java

第2セッション以降第5セッションまでは、今回のイベントが初認識(TwitterIDとリアルが一致し、ご挨拶させて頂いた)の方々になりました。

@yukungもJava経験者ということでこのセッションは私の環境を使ってJavaコーディングする事に。@yukungさんが第1セッションペアプロされていた内容(最低限の要素:配列,インデックス等を用いたスピード重視的な実装)と私が第1セッションで試みた内容(クラス構成を意識した設計重視的な内容)でお互いの実装ゴールというかイメージの共有が曖昧ながらも『プログラミングしながら議論して決めていく』という手法で進めていきました。

…なのですが、合間合間で意見がブレてしまったりしてたところが出て来てしまい、こちらも気付いたらあっと言う間に45分終了。これには終了後お互いに『最初に方針を決めるべきですね』的なふりかえりポイントは一致していました。45分という制限された時間の中で『とりあえず実装し動くものを目指す』のか、『後の変更に耐えうるように設計をしっかり行って積み上げていく』のか、ペアとしてどっちを(そのセッションで)採用するのか。

イベントの趣旨として『完成させる事が目的ではない』と言いつつもやっぱり作って動くところまで行きたいよね〜と思ってみたり振り払ってみたり…という葛藤もあったりでのこの結果でしたが、逆にそういったゴールや設計イメージの共有を(100%までとは言わないまでも)ある程度行っておくことの重要性を認識したセッションとなりました。

f:id:absj31:20111203105324j:image:w400

f:id:absj31:20111203160122j:image


3.Java

C#等の経験をお持ちの @JibrielShibata さんとは、第2回に引き続きJavaでチャレンジすることに。

このセッションでの取り組み内容はこれまでと若干変わってました。変わってましたが非常に印象深いセッションとなりました。

@JibrielShibata さん的にはこれまでの2セッションで『何か見えてきたものがある。2次元配列でも3次元配列でも対応可能な、新しい仕組み的なものが…』という旨の発言をされていて、自分もこれまでの2回のセッションで設計イメージの重要性を痛感していたところでした。なのでこのセッションは@JibrielShibataさんの提案に乗る形で、その『新しい設計アイデア』について一緒に考えていくという作業に取り掛かる事に。

詳細な解説は自分の中でも文字情報としてアウトプットするには至らなかったので割愛しますが、@JibrielShibata の提唱する『近傍(きんぼう)情報』という考えに基づいて隣り合うセルの情報を集約し、判定すればだいぶスッキリした実装が出来る(のではないか)、という感じの内容でした。

実際ディスカッションを進めていくうちに良い感じのアイデアまとまり具合になってきて、『お、行けんじゃね?』ってとこまでひたすら紙とペンで盛り上がっておしました。ペアプロイベントなのにプログラミングしてないというこの状況(笑)

結構長い時間ディスカッションで白熱していたので、『じゃ実装しますか』となった時に正直もう時間は残ってないだろう、と思っていたんです。あれだけ長く話してたんだから正直5分程度、下手したら設計議論だけで終わるんじゃないかと。

実際は、45分のうち20分程しか経っていませんでした。この感覚には正直ビックリしました。

実装(ペアプロ)に取り掛かっていると、時間は本当〜〜〜にあっという間に過ぎるのですが、そうでない時間(ここでは設計ディスカッション)の場合は時間の進みが実装(ペアプロ)程早くは無いんですね。

設計(での時間の進み)が遅い訳では無くて、ペアプロ時(の時間の進み)が異常に早く感じた、というのが正しいのかな。この差は一体何だろう?

設計ディスカッションである程度の意識の共有は出来ていたので、実装の際は比較的スムーズに構築出来、肝心の判定処理に関する部分も『ここだけ入れ替えれば応用が効くであろう』という内容までは把握することが出来ました。実装完了までには至らなかったですが、設計である程度の達成感を得られた部分はあったので『これはアリですね』という意見で一致したセッションとなりました。

f:id:absj31:20111203160130j:image

第3セッションふりかえりのあとは、katzchang(TwitterID:@katzchang)さんペアが実装されたコードの素晴らしさを拝見しにみんなで卓に集まり、設計思想を聞くという一幕も。

f:id:absj31:20111204051843j:image:w300

聞いていて『おぉ〜、なるほど』と頷くばかりの内容でしたが、嬉しかったのはその設計思想に方向性が合っていて、もう少しで辿り着けていたって事ですかね。まぁほぼ@JibrielShibataさんの凄さ炸裂(この後午後のセッションでより強調される形になります)、という感じではあると思うのですが、そこの議論に少しでも関われていた事が嬉しかったですね。


昼食

時間的には12:00 - 13:30と90分の長尺となったお昼休み。当初は長いかな〜とも思いましたが、ここまで3セッション、ほぼ(脳味噌的には)ノンストップでしたので心身共に休息を入れる&午後に備えると言う意味でも、ちょうど良い長さだったのかも知れません。

この時間では昼食の他にも原田さんが作成された例のブツ(実物)を触って遊んでみたり、

f:id:absj31:20111203122042j:image

ご自宅でお子さんと寛がれていたRyutaro YOSHIBA(TwitterID:@ryuzee) さん(とそのお子さんも!)とひととき連絡を繋いでみたり、

f:id:absj31:20111203124304j:image

牛尾さんが今某所で評判のヘッドマッサージを会場で実践してもらっていたり、

f:id:absj31:20111203130526j:image:w300

ほぼ同じ時間帯に開催されていた海外会場の人々と回線を繋いでみたり。課題の話も交えつつのリラックスしたお昼休みでした。

f:id:absj31:20111204053633p:image


本編(午後):ペアプロセッション〜ふりかえり 4〜6

4.C#

C#環境でのプログラミング。こちらのセッションでは前回セッション3同様、まずはお互いのこれまでのざっくり振り返りとゴールとしたい設計イメージの共有に幾らか時間を割くところから始めました。時間にしたら10分〜15分とかそこいら位だったかな?

その後はゴールに向かって実装。

実は45分で意識合わせ/テスト駆動開発/ペアプログラミングをしつつゴールを目指すとなると、45分と言うのは意外と短いんだな〜と実感。課題がもう少し平易なものとかであれば回せるんでしょうけど、『ライフゲーム』の課題を上手いこと設計しつつ(しかもソースコードを都度破棄し、引き継げないという前提で)という条件が重なると結構大変。

なので『動くもの』をメインに作ろうとペアで意識あわせを行い、テスト駆動開発の実装も必要最低限の確認に留める形となりました。

まぁ『ペアプロ』が主といえば主なのでまぁ良いかなという感じではありますが、一方でやはりテスト駆動開発を絡めてバシッと作りたいな〜という気持ちもありますね。


お互い慣れている言語であれば如何に早く、意識合わせ/テスト駆動開発/ペアプログラミングのセットでゴールに向かえるか。

そうでない言語の場合は言語間の差異とか共通点を探しながら楽しみつつ、ペアプロメインで進めていくか。

そういったセッション毎のゴールであったり重視する点であったりって部分も個人なりペアで共有して/意識して進めると、よりイベントとして楽しめるのかなという気がしましたね。(※抜群のスキルがあれば毎回圧倒的なスピード感で回せるのだろうけど…修練が必要ですね^^;)

f:id:absj31:20111203160145j:image

5.Ruby

セッション4程では無いにしても、ほぼ未経験に近い形での初Rubyプログラミング

@changeworlds さんともまずは設計の意識合わせから。その過程で『セル毎に位置情報(position)を持たずに、配列インデックス要素で何とか使用』という方向で作業を進めていたのですが、実装を推し進めて行くに当たって結構位置情報が無いと面倒臭い事になってしまう事が分かり、二人して『あ〜!』と叫ぶ事数回(笑)

実装的には若干べた書きに成らざるを得ない部分が幾つか出来てしまいましたが、ここは意識を変えて『位置情報を使わないという制約』でどれだけ行けるか、という風に切り替えていきました。:-) 判定部分の実装については若干間延びした記載になってしまいましたが、お互いの認識を共有しつつ進められたので良かったのではと思います。

※ちなみにこのイベント、セッション毎にはそれぞれ制約があり、(可能であれば)それらの制約を自らに課した上で課題に挑戦してみよう、という試みもなされていました。(主にセッション4,5,6辺りで) 一応提示はするけれども、採用するか否かはペアで決める、というスタンスでした。

  • if 文を使わない
  • ループを使わない
  • メソッドを小さくする(5行以下、1行?)
  • 言語のプリミティブを使わない
  • 本来の意味での TDD
  • お互い言葉を発さず、テストコード・実装コードでお互いの意図を伝え、条件を満たすまで発言しない(出来ない)
  • マウスを使わない(Eclipse利用者については『mousefeed』というEclipse Pluginでマウス操作を抑制(ショートカット利用を指示?)する事も出来る(開発者の開発スピードを上げる事が目的)

こちらのセッションも設計&実装で時間終了、テストコード的な部分については時間的に余裕が無かったため行いませんでした。

f:id:absj31:20111203160150j:image

6.休憩&見学

本来であれば最終第6セッションペアプロする予定だったのですが、ここまでの5セッションで予想以上にぐったりしてしまっていたため(笑)、このセッションは休憩を取りつつペアプロ実践中の他の席を色々見て回る事に。(一応、イベント開始時には『各自自分のペースで、疲れたと思ったら休憩も適宜取ってくださいね』的なアドバイスを頂いていたので、ここはそれに乗ってみた形)

ペアプロ自身実践する事で色々と勉強になる事も多いですが、客観的にペアプロ風景を眺めているのもそれはそれで面白い時間でしたね。TsuyoshiUshio(TwitterID:@sandayuu)さんとYASUI Tsutomu (TwitterID:@yattom)さんのScalaペアプログラミング等は、組み合わせ的にもそうそうあるものでは無いでしょう。その他にも色々とペアプロ風景を見て回らさせてもらいました。

f:id:absj31:20111203155425j:image

時間は左右しますが、午後セッション休憩時のおやつにはこんなケーキも提供されておりました。美味しゅう頂きました♪( ´∀`)

f:id:absj31:20111204232647j:image

f:id:absj31:20111203173007j:image

本編(午後):全体ふりかえり〜撤収

6セッション終了後のセッション毎のふりかえり付箋はこんな感じになりました。こちらの内容を眺めているだけでも十分楽しめますね。異彩を放っているのが『LINQ かわいいよ LINQ』。まぁこれは実際コードを拝見していて、確かに『すげ〜』な感じだったのですが...(笑)

f:id:absj31:20111203173017j:image

イベントを通じて、原田さんの方からは『Coderetreat』の開催の趣旨や思いが語られました。(※おおよそこんな感じの内容だったと思いますが、もし相違あればご連絡ください。修正致します。)

  • ふりかえり
    • 各自KPT
    • 設計を試せる
    • スピード感がある
    • ツールを使いこなせる
    • コードを書けてる人でもツールが使いこなせてない感もある

  • 45分で終わらなくても良い。でも終わりたがる。
  • 設計には時間が掛かる。
  • 良く書く事に気をつかおう。
  • 時間を区切るのは必要。時間を区切ったからといって設計がいい加減で良いという訳ではない。


そして全体を通した長めの振り返り。以下のテーマについてディスカッションを行いました。

  • 今日、何か学んだことは?
  • 今日、何かびっくりしたことは?
  • 明日以降、何か今までとやり方を変えることは?

まずはテーブル単位で。

f:id:absj31:20111203172726j:image

そして参加者全体で。

f:id:absj31:20111203172917j:image:w800

今回の開催を機に、次回以降東京で、または東京以外でも近いうちに開催したいですね〜という話もちらほらと出ていました。タイミングが合えば、是非ともまた参加してみたいですね。Javaの他にもPHP/Ruby/Groovy、そしてScala辺りは実践して/見ていて面白いな〜と思ったので次回には楽しんでこれらの言語でもペアプロ出来るようにスキルを身に付けておきたいとも思いました。

最後には(途中退出された方を除いて)参加者全員で記念撮影。今後はこういうイベントが日本各地で開催される事を期待!


会場提供・そして各種スポンサーとして今回のイベントにご協力頂いたクラスメソッド株式会社様、 株式会社アルティネット様、株式会社Odd-e Japan様。

また当日会場利用に際して諸々担当して頂いたTakehara.Masashi.3k(TwitterID:@take3000)さん。ファシリ−テーターを務めて頂いたHARADA Kiro(TwitterID:@haradakiro)さん。そして当日参戦された皆様方。ありがとうございました!!


  • (追記)当日は牛尾剛さんも参戦されるという事で、著書を持参し、サインを頂きました。牛尾さん、ありがとうございました!

f:id:absj31:20111205043916j:image

その他関連エントリ等:

トラックバック - http://d.hatena.ne.jp/absj31/20111203/1323012805