トロントでCoderetreatに参加してきました

Coderetreatとは、ほぼ丸1日、ソフトウェア開発と設計について学んだり挑戦したりするイベントです。詳しくはコチラ Global Day of Coderetreat

もともとは、Corey Hainesさんという方が始めたイベントで、現在は世界中で開催されています。年に1度、Global Day of Coderetreat (GDCD) という日があり、各地でCodeRetreatが開催されます。このGDCDに合わせて開催されたCoderetreatに参加してきました。

GDCDを記念して?Coreyさん著『Understanding the 4 Rules of Simple Design』がお安くなってます。Coderetreatのお題でもあるConway's Game of Life を題材にして、シンプルな設計について説明されています(私も買いました!)。

Coderetreatは、大体このようなルールで運用されています。

  • 朝から始まり、1日で5〜6セッション行う(土曜日に開催されることが多い)
  • 各セッション1時間、コーディング:45分、10分:ふりかえり、5分:ペア組・休憩
  • 毎セッション、パートナーを交換して、ペアプログラミング(日本ではモブもやっていたそうですね!)
  • 毎セッション、コードは削除、スクラッチで開発する
  • 課題はコンウェイのライフゲーム(Conway's Game of Life)を実装する 
  • 言語はなんでも構わないが、ペアのどちらかが詳しいものにしておくと良い
  • TDD推奨
  • お昼、おやつ、飲み物はスポンサー持ち

いきなり知らない人とペアを組んでプログラミングを1日中するので、終盤はクタクタになります。

私は日本で2回(名古屋と東京)参加したことがあり、Coderetreatの楽しさを知っていたので、せっかくトロントにいるし、今回は思い切って英語で挑戦してみました。

 Coderetreat Toronto Edition

今年のGDCDは11月17日でした。

トロントでは、nulogy というダウンタウンにある会社で開催されました。予定としては9:00-17:30、6セッションというかたちでしたが、案の定、9時にはみなさん集まらず、9:15ぐらいからゆるゆると始まりました。参加者は最大で20名ぐらいかな、途中で帰った人も(この辺もゆるい)。

  • 午前中:3セッション
  • ランチ、軽いオープニングワーク
  • 午後:3セッション
  • クロージングふりかえり

私のセッションはこんな感じでした。

1セッション目:
  • 言語:JavaScript、テストフレームワークは使わずにテスト(素のJavaScript)
    • ペアの方がPythonで、JavaScriptならなんとなくわかるということだったので
  • 最初の1回目で、ペアの方もCoderetreat初めてだそうだったので、手探りで進んだ
  • 私がドライバーをしたが、なかなか次のステップをどうするかの意思疎通が難しかった
  • Cellクラスの次世代を作るメソッド名を「passToNextGeneration」をしたのだけど、「pass」としたのは初めてだった
  • Cellのルール実装までは完了
2セッション目:
  • 言語:JavaScript、テストはJestを使用
  • ピンポン形式(どちらかがプロダクトコードを書き、もう一人がテストコードを書くやり方)で、私がテストを書いて、ペアの方がプロダクトコードを書くかたちで進めた
  • Jestは初めてだったけど、特に難しいことはしてなかったので文法的には問題なく記述できた
  • クラス属性としてfunction書いちゃうあたり、JSな感じ
  • テストが通ったら、いえ〜い!
  • Cellのルール、隣人の生きているCellの数の計算までは完了
3セッション目:
  • 言語:Java、テストはJUnit
  • ペアの方がRubyだったので、Javaにしたけど、全然私よりエディタの操作になれていて、速かった
  • Cellクラスから実装するのではなく、Gameクラスから実装
    • コンストラクタで一気に初期化するのではなく、一つ一つaddしていく方法
  • 座標(Coordinatesクラス)をPairの拡張として実装
  • なかなか何を次のステップとするか理解できず、ほぼ書いてもらってた
  • 隣人をCellにセットするところまで完了
4セッション目:
  • 言語:Java、テストはJUnit
    • ペアの方がPythonだったので、Java
  • 今回もドライバーだったが、あまりペアの方の意思が理解できず、とにかく実装して確認、という進めかただった
  • 隣人の生きているCellの数を計算するところの途中で終わった
5セッション目:
  • 言語:HTML, CSS, JavaScript
  • ペアの方がフロントエンドデベロッパーで、UIファーストでやってみたいということでHTMLを書くところからスタート
  • CSSの「grid-template-columns」を使ってCellを表現
  • 次世代を計算するところはJavaScriptで主に私が実装
  • 特にクラスとかも用意せず、単純に2次元配列の[0, 1]で表現していたので、生きているCellをカウントするのは楽だった(足せばいいだけ)
  • 残り次世代をHTMLに反映するところでタイムアップ
6セッション目:
  • 言語:Java、テストはJUnit
    • ペアの方がPythonだったのでJava
  • 今回もドライバーだったが、もう最後ともなると二人とも疲れていて頭回らず
  • Cellが隣人のCoordinatesを返すアプローチ
  • 隣人のCellを取得することろまでで終了

感想とふりかえり

今回のCoderetreatについて
  • HTMLも面白い(Twitter見てたらSQLでやっている人もいた)、ついつい「テスト書くぞ!」ってなると動的な言語を選びがちだけど、もっと自由に楽しくやってもいいのかな、と思った
  • お昼明けに軽いワーク(サークルになって1人が質問して、当てはまる人がサークルの真ん中に集まる、例:仕事でTDDやっている人?)はよかった
    • バックグラウンドの共有もできるし、ランチ食べて眠いところに体動かせる
    • そこで分かったのは、Javaエンジニアは私しかいなかったこと、RubyかJavaScriptかPython、あとはGoもいた
  • ペアの英語はほぼ聴きとれてたと思うけど、何をしたいのかを理解するのに時間がかかった。ペアが何をしたいのか理解するのが難しい、と思ったけどこれは日本語でも英語でも同じだと感じる(私の理解力も足りないのもさることながら)
    • 残念ながら、ふりかえりは、サークルで皆声が小さかったり速かったりでなかなか聴き取るのは難しかった(泣)
  • よくコードで会話しろ、と言われますが、プログラミング言語のおかげでなんとか6セッションやりきることができた
    • 2つの言語を持つ我々強い。もしかしたら、ペアプロしながら英語を学ぶのはよい方法なのかもしれない。サイレントプログラミング(会話禁止、コメントでの会話禁止)もあるそうで、それも挑戦するのも面白そう
  • こっちのMeetupやイベントに出ていつも思うのが、ゆるい。決してダラダラしていたり、集中力がない、というわけではなく、ゆったりと時間が流れている感じ。おかげで、比較的リラックして取り組むことができた
  • 日本との差なのか分からないけれど、日本で参加してたときには、きっちりCellのルールを実装しきってから次、のように確実に進めていくことが多かったが、こっちでは半分ぐらい、Cellのルールを実装し終わらずにGameやBoardなどの実装に移ることがあって、日本と欧米人の違いなのかなと思った
  • もう少しインターフェースや名前を中心に議論したい、最初に軽く設計をしてコードを書き始めて、途中であまりメソッド名やクラス名をふりかえったりしないので(時間がない)、特に仕事では途中で手を止めて全体を見渡す時間をあらかじめ設けることも必要なのかなと思った
Coderetreatについて
  • 毎回思うけど、1(0?)から書くの大事、プロジェクトにいると、まっさらな状態から書くことが少なく、設定の仕方とか忘れちゃう
  • 同じ課題に取り組んでいるのにも関わらず、一度として同じコードを見たこともないし、一度としてペアと進め方が同じだったことはない、100人いたら100通りのアプローチがある
    • このような"チームの文化"ははコード規約やコードレビュー、普段の会話などで擦り合わせられていくのだろうと思うのだけれど、これをすり合わせるのは時間・労力が必要だなあと感じる。そういう意味では、チーム全体で課題に取り組むモブはすごく良さそう(でもまだ体験できてないので、いつか挑戦!)
  • 毎回疲れる、そもそもこのエネルギーで8時間は持たないということだろう
  • ライフゲームは奥が深い
    •  いつも隣人を取得する実装がシンプルでないことが多くて、どうやったらシンプルになるのかいつも模索している、なんかいい方法ないのかな
    •  あと、初期のパターンによってはCellの世界が拡張されていく必要があるのだけれど、まだ実装できていない
    •  四角形じゃなくて、5角形だったり、6角形だったり、世界が陸続きになってたり...やることはたくさん

ということで、疲れたけどとても充実した時間でした。いつもこの素晴らしいイベントを企画してくれるホストのみなさん、美味しい料理と会場を用意してくださるスポンサーの皆様に感謝です。

エンジニア向けのみのイベントではないので、プロジェクトマネージャーやデザイナーさんとかにもオススメです。

あとは、まだ参加したことがないけど、「Legacy Coderetreat」ってのもあります。これは1から実装するのではなく、すでにあるレガシーなコードをリファクタリングしていくCoderetreatです。Reforctoringの練習には良さそう。

f:id:ayumi_h:20181120092030j:plain

f:id:ayumi_h:20181120092057j:plain
f:id:ayumi_h:20181120092139j:plain
右はライフゲームが実装されたオブジェ