いづいづブログ

アジャイルコーチになりたい札幌在住SEです。アジャイル札幌スタッフ&ScrumFestSapporo実行委員。Like:パクチー/激辛/牡蠣/猫/初期仏教

Agile Japan 2018 札幌サテライトでモブプロを体験してきました

f:id:izumii-19:20190328171732p:plain:w400

2019年03月16日(土)にAgile Japanの札幌サテライトに参加してきました。

実はスタッフとして運営側で参加予定だったのですが、この数ヶ月前に次女が骨折してしまい手術やら通院やらで運営には全く関わることができず、さらに当日も通院日だったので結局サテライトには午後から参加しました。そのため午後から参加した内容のみ(=モブプロワーク)になります。

会場に到着してすぐ入り口から一番近いチームへ飛び入り参加したため、ワークの事前説明などはまったく聞かない状態で参加しました。多分、チームの皆さんに自己紹介もするの忘れてたと思います。

はじめてのGo言語

今日のお題は「自動販売機をプログラミングする」です。 言語の選択は自由ですがうちのチームは「誰もやったことがない言語でやりたい」という理由でGo言語にしました。 まずは「何を実装すれば自動販売機が完成するか」の設計から始めます。みんなでディスカッションして出てきたのは、こんなタスクでした。

  • 商品メニューを作成する
  • お金をいれる
  • 商品を選ぶ
  • 商品が出てくる
  • お釣りが出てくる(そのために、お釣りがいくらかを計算する)

これを今から実装していきます。 果たしてGo言語で自動販売機は完成するのでしょうか?

まず最初は「商品メニューを作成する」部分を実装します。具体的には商品リスト(1:水100円、2:コーラ120円、3:コーヒー130円…)を作成します。

「商品番号」「商品名」「値段」を持つ配列を作ればいいというところまではすぐにイメージが湧いたのですが、Go言語での書き方を誰も知りません。ということでナビゲーター全員でググりはじめ、ドライバーに指示を出し色々試してもらいます。

ここで(・∀・)イイ!と思ったのは、名付けなどの「動かすための実装」以外についてもリアルタイムで議論できること。 ひとりで実装していると自分だけの感覚で名前を付けてしまい後からわかりにくいと指摘を受けて修正することもあると思いますが、こういった点についてもその場でディスカッションしながら進めていけます。
「○○だからこういう名前のほうがいいんじゃない?」「ここで改行したほうが見やすくない?」などの会話も頻繁に交わしながら目的の実装も進めていけるので、出来上がったコードは自然と可読性の高いものになりますね。

f:id:izumii-19:20190328171215p:plain:w400

緊急タスク発生!

ここで緊急の割り込みタスク発生!なんとアイスの差し入れ(o'∀'人)
会場に冷蔵庫はないので、みんなプログラミングの手を止めて緊急アイスタイムに突入です*1
@nemorineはバナナを食べています。バナナは溶けないので急がなくても大丈夫なんですが、バナナを見ると脊髄反射的に「バナナ=俺が食わなきゃ」になってしまうようです。

f:id:izumii-19:20190328155342p:plain:w300

まさかの

その後も7分ずつナビゲーターとドライバーを交代し、チームで試行錯誤しながら自動販売機の実装を進めました。 本来であれば「お金をいれる」という機能では、

  • 硬貨の種類は、500円や100円などはOKだけど1円や5円はNG
  • 500円を入れる場合は、500円玉1枚、100円玉5枚など複数のパターンがありえる

などの考慮も必要なのですが、まずは「お金を入れる⇒商品を選ぶ⇒商品が出る」という一連の動作を完成させたかったので「500円を入れて水を買う」というフローの実現を目指しました。
「 商品メニューを作成する」「お金をいれる」というメソッドまでは全員で協力しながら実装することができたのですが、「商品を選ぶ」メソッドの作成で事件は起こりました。

まさかのどハマり。

「商品を選ぶ」というメソッドは、

  • 標準入力から商品番号を入力する("1"と入力)
  • 入力した商品番号と商品名を、標準出力に表示する("1:Water"と表示)

という感じで実現したかったのですが、水の商品番号である「1」を入れても画面に「1: Water」と表示されない! 「キーボードから入力した数値をキーにして商品リストの配列を検索し結果を表示する」だけの簡単なプログラム*2のはずなのにどうしても「1: Water」が表示されないんです。 ナビゲーターがググってはドライバーが試すをひたすら繰り返して30分ほど経過したところで、ついに原因を突き止めました。

原因は標準入力から商品番号を受け取った際に改行が入っていて、改行を含んだまま文字列から数値に変換しようとしてエラーになっていたのでした。

そう。ハマる時の原因はいつもこんな些細なこと。でも逆に些細すぎて1人だと見つけられなかったかもしれません。

ハマることさえ楽しい

この時思ったことが、モブプロだと「できない・わからない」ということにあまり罪悪感を感じないということでした。 例えば1人で実装していてハマってしまうと不安になったり焦りを感じてしまうのですが、モブプロの場合は「ここにいる全員がわからないんだから仕方ない」「チームでハマっている」という感覚なのです。
「こんな簡単なところで30分もハマってて誰もわからないなんて」という事実がなんだかおかしくなってきて、だんだんみんなハマりHighみたいになってました。

みんなでハマっていた分、画面に「1: Water」が表示されたときの喜びもひとしおで、みんなで声を出して「YATTA!!」と叫びました。プロのエンジニアがただ「1: Water」と表示することに30分もハマるなんてウケる!

あ、そうそう結論からいうと時間内に「お釣りを出す」の実装が間に合わず、500円を入れて100円の水しか買えないけどお釣りはでない自動販売機、つまり100円の水を500円で売るボッタクリ自動販売が完成してしまいました。

まとめ

モブプロの良さはなんでもチームで分け合えることだと思いました。

ハマった時わからないときも全員で解決に向けて取り組むので、個人で責任を負うという気持ちにはならず変な罪悪感はほとんど感じません。
逆に何かを達成できたときも「嬉しい」という感情をシェアすることで、何倍も嬉しく感じました。
コードを見ながら議論することでリアルタイムにリファクタリングできるので「レビュー⇒やり直し」というフローも必要ないし、ドライバーとしてタイピングしていない時間もコーディングに参加している感覚があり「チームみんなでコーディングしている」という気持ちになれます。

あんなにハマったのに振り返ってみると楽しい記憶ばかりでした。

プログラミングだけではなく、「モビング」という働き方をいろんなところで実践していけたらいいなぁと思いました。

講師の及部さん(@TAKAKING22)。3月の北海道でも元気に半袖です。

f:id:izumii-19:20190328171920p:plain

及部さんが書いた当日のブログはこちらです。 ワークショップで行った「Head Firstモブプログラミング」のスライドを見るとモブプロについて詳しく書かれていますのでぜひご覧ください。

takaking22.com

*1:アイスの画像がなくて残念

*2:実際には、商品リストの配列のIndexは0オリジンなので、標準出力に出力する際にはIndexに+1した値を商品番号としています。なので、標準入力から受け取った文字列を数値に変換し、1加算した値を標準出力に出力するということをやりました。