第2話 皆で楽しく開発できるモブプログラミング
翌朝、オフィスに着くと、私はまず真山くんに昨日のことを謝ろうと決めていた。
「真山くん、おはよう」
「・・・おはようございます」
昨日のやり取りが影響しているのだろう、少しぎこちなさを感じる挨拶だった。
「昨日のコードレビューで、厳しいことを言ってしまったよね。本当にごめん。もっと違う言い方ができたと思って、反省している」
真山くんは、一瞬目を丸くしたが、すぐに微笑んだ。
「いえ、自分がちゃんとできていなかったのが原因なので・・・。それに、教えていただいたことはすごく勉強になりました」
救われた気分だったが、真山くんの表情にはまだどこか不安そうな影が見えた。
私は、すかさず話を切り出す。
「ところで、これからの開発のやり方について少し変えてみようかと思っててね。ペアプログラミングって知ってるかな?」
「名前は聞いたことがありますが、詳しくは分かりません」
私は簡単にペアプログラミングの概要を説明した。そして、さらにこう続ける。
「今日の午前に、テックサークルがあって、ちょうどそこでペアプログラミングを試せそうな機会があるんだ。そこでうまくいったら、午後に私と真山くんでペアプログラミングをやってみよう」
そう言い残して、私はテックサークルをやる会議室へと向かった。
テックサークルというのは、メインで進めているプロジェクトとは別で、有志で集まって興味のあることを学習する集まりで、会社の中にいくつものテックサークルが存在する。
私が所属しているテックサークルは、Webアプリの初心者向けの勉強をやっている。
2019年の現在、ITエンジニアという職種でありながら、Webアプリを全く作ったことがないのはまずいと感じて同期の2人と一緒に最近勉強をし始めたところだ。
今日のテックサークルは、私が進行役として何をやるのか準備する回で、もともとは勉強用に作るWebアプリの仕様を他製品と比較しながら皆で検討しようと考えていた。
その予定を変更してペアプログラミングでWebアプリを作ってみるつもりだ。
いや、正しくは、ペアプログラミングでなく、モブプログラミングだ。
昨日、調べたところ、2人で一緒に作業をするのはペアプログラミング、3人以上でやるのはモブプログラミングということを知った。
私が調べた限りでは、2人でやるのも3人でやるのも、複数人の頭脳を使って相談しながら問題を解決するという本質は同じなので、モブプログラミングを試すことで、ペアプログラミングの有効性を検証できると判断した。
私が会議室に入ると、すでに同期の森くんと林くんが待っていた。
森くんは大柄な体格でのんびりした優しい感じの人だ。
林くんはその反対で、背が高くて細身でキレの良いツッコミが得意だ。
「お待たせ。今日は急だけど、モブプログラミングでWebアプリを作ってみようと思うけど、いいかな?」
森くんが首をかしげた。
「モブプログラミング?ペアプログラミングは聞いたことあるけど、それと違うの?」
私は簡単にモブプログラミングの概要を説明した。
「なるほどねー、おもしろそうだねぇ」
「いいじゃん。それで、何を作る?」
森くんも林くんも、急な提案を快く受け入れてくれた。
話が分かる同期で助かる。
「何を作るかについてだけど、うちの会社って、社内の中で技術記事を投稿するシステムがあるでしょ?200人以上の社員がいて、投稿しているのは数十人だけで、いまいち盛り上がりに欠けると思うんだ。だから盛り上げるために、技術記事をいいねの数でランキング表示するWebアプリはどうだろう?」
「なるほどねー。技術記事がランキング形式で見えるようになれば、上位を目指してモチベーションが上がるってことね。ぼくは良いと思うよ」
「オレも良いと思う。記事の週間ランキング、月間ランキング、それからユーザーごとの通算ランキングなんかもあると燃えるよな」
ノリがよくて本当に助かる同期たちだ。
「じゃあ、今日はまず手始めに記事の月間ランキングを作ろう。作る画面は1つだけで、記事ごとに、タイトル、投稿者名、投稿日時、いいね数をランキング形式で表示する感じでいいかな?」
私の提案に林くんがキレの良いツッコミを入れる。
「表示するものはそれでいいけど、記事タイトルをクリックしたら、該当記事のURLにジャンプするのも必要だろ?」
「うん、ありがとう、それは絶対必要だね。それがないとUXが繋がらないし」
作るWebアプリの仕様はこれで決定だ。
そこで森くんが少し不安な表情でつぶやいた。
「でも、全員がWebアプリ開発の初心者で、前回ちょっとチュートリアルを見ながらサンプルプログラムを作っただけだよね。今のぼくたちのスキルでWebアプリが作れるのかな。ちょっと不安かも」
問題ない。これは想定内の発言だ。
「それは大丈夫。事前に Web API のレスポンスを画面に一覧表示するWebアプリのサンプルプログラムを探してコピーしてきたんだ。それをベースに呼び出す Web API と見た目を少し変えれば、きっとできるよ!あとは、モブプログラミングの力を信じよう。お互いの知恵を出し合えば、きっとできるよ」
こうして、3人でモブプログラミングの準備にとりかかった。
私は昨日モブプログラミングのやり方を調べて学んでいたが、私は一番重要だと思う1つだけを二人に伝えた。
いきなり多くのことを伝えても混乱してしまうと考えたからだ。
「とにかく自分が思ったことを話して欲しい。結論がまとまっていなくてもOK。モブプログラミングは黙っているのが一番よくないから、とにかくお互いが考えていることを発言して、それをきっかけに知恵を出し合おう!」
まずは私がPCを操作する役割を担当し、他の二人は会議室の大画面を見ながら、指示を出していく。
「記事一覧を表示するために、まずは社内システムに投稿された記事一覧を取得する Web API がどんなレスポンスを返すか知りたいね」
「じゃあ、Web API のヘルプを確認するか」
「・・・あれ?ヘルプに Web API のレスポンスの仕様が書いてないね」
「じゃあ、実際に Web API を実行してレスポンスを確認するか」
「はいっ、実行したよ。記事タイトル、投稿日時、いいね数が取得できるね」
「あれ?レスポンスに投稿者の Id はあるけど投稿者の名前がないね」
「これじゃあ、投稿者の名前が表示できないな」
「投稿者の名前を表示するには、投稿者一覧の Web API を実行する必要があるよね。ちょっと大変そうだね」
予期せぬトラブルが発生し、いきなり暗雲が立ち込める。
「じゃあ、投稿者を表示する機能は無くすか!初回バージョンで完璧に作らなくてもいいだろ」
「それだ!」
林くんのWebアプリの仕様を変える提案に、私は勢いよく乗った。
事なきを得たように思えたが、森くんが Web API のパラメータを見ながら不安げにつぶやく。
「記事一覧を取得する Web API のパラメータに投稿日時でフィルタする機能が・・・ない」
「ええっ!?それ、やばくね?フィルタができないと、月間ランキングが表示できないじゃん」
眉をひそめる林くんに、森くんは苦い顔で「そうだよね・・・」とうなずいた。
2人は月間ランキングの表示を諦めかけていたが、私はふとアイデアが浮かんだ。
「いや、投稿者のモチベーションを上げることが目的なんだから、まだ方法はあるよ!」
勢いを込めて言う。
「直近の投稿記事30件のランキングにしよう。1ヶ月間の投稿数は約30件だし、それでも十分価値は提供できる・・・と思う!」
沈黙の後、「それだ!」という声が重なり、全員の顔に笑みが戻った。
この時、私はモブプログラミングの効果を実感した。
おそらく、裁量が大きく選択肢がたくさんあるタスクであるほど、モブプログラミングは効果を発揮するのだ。
皆で議論して知恵を出し合うことで、最良の選択肢を選ぶ確率が高くなるということだ。
そういう意味では、今回は仕様も設計も3人で自由に変更できるので、モブプログラミングの恩恵を受けやすかったと言える。
そして、モブプログラミングでどんどん開発は進んでいった。
30分ごとにPCを操作する役割を交代し、今は森くんがPCを操作している。
「あとは、Web API で取得した記事一覧を画面に表示する所だね」
「ベースのプログラムが Web API のレスポンスを用いて画面に一覧表示しているから、それを少し変えればできそうだな」
「ちょっと待って。Web APIのレスポンスを格納した変数名が、ベースのプログラムの変数名のままだと、混乱しやすいかも。変更する関数内の変数名は、適切な名前に直そう」
「確かに・・・・こんな感じでどう?」
「うん、これで何をやっているか分かりやすくなったね」
私の助言で変数名を直してもらった後、なるほど、これがPCを操作しない人がいるメリットなのかと気づいた。
PCを操作している人と比べて、その他の2人は俯瞰した視点になる。
だから、変数名が分かりにくいなど、1人だと気付きにくい問題が、見つけやすくなるのだ。
その前にも、「先にこっちのクラスを作った方がいんじゃね?」と林くんが作業の優先順位を見直す発言をしたり、「なんでその方法で実現するんだっけ?」と私が判断の妥当性を確認したり、俯瞰した視点からの発言が、最良の選択を選ぶための助けになっている。
そして、モブプログラミング開始から1時間半が経過した頃、Web API で取得した記事一覧を画面に表示させることに成功した。
あと一息で完成だ。
「とりあえず Web API で取得した記事一覧を画面に表示できたね」
「あとは、これをいいねの多い順にソートすれば完成だ」
「でも Javascript で、連想配列をソートする方法なんて知らないよね」
「じゃあ、検索だ!キーワードは?」
「Javascript、連想配列、ソート!」
「あった!これでソートできる!」
「できた!記事をいいね順に表示できたぞー!」
「完成だ、やったー!」
まさかWebアプリの初心者だけで、2時間以内で目的のWebアプリが完成するとは驚きだった。
そして、モブプログラミングの効果として、暗黙知を共有できるということも実感した。
暗黙知というのは、言語化して他の人に伝えづらい知見のことだ。
今回の場合、分からないことがあった場合の調査方法や、仕様や設計を決める時の思考過程、タスクを進める優先順位の判断方法、各種ツールのちょっと便利な使い方など、たくさんの暗黙知が共有できた。
暗黙知が共有できるという効果は、私が真山くんとペアプログラミングする際に、私の暗黙知を真山くんに伝えられるという点で、大きく効果を発揮しそうな予感がした。
なにより想定外に大きな効果は、みんなで一緒にワイワイ会話しながら物ができていくことが、とても楽しかったことだ。
タスクが完了した時の達成感は格別だ。
「楽しい」というのは、おそらく大事なことで、今回、効率よく進められたのも、楽しい時間だからこそ、集中して取り組めたからだろう。
真山くんとのペアプログラミングも、きっとうまくいくような気がして、私はうきうきした気持ちで満ちていた。
心の中で、わっしょいわっしょいと元気におみこしを担いでいた。
しかし、このときの私はまだ知らなかったのだ――――
――――そのわっしょいのおみこしが、ぐらりと傾き、肩からずり落ちる瞬間を。
<後書き>
続きが読みたいと思ってくれた場合は、この下の欄から★をいっぱい付けて評価していただくか、このページをはてなブックマークで登録していただけると、とても嬉しいです。
はてなブックマークの登録方法はこちら↓
https://b.hatena.ne.jp/entry/s/ncode.syosetu.com/n0344iu/2/