こんにちは、mossanです。今回はMOBプログラミングについて紹介したいと思います。こちらすでにノートや禅に記事が上がってますので、それをもとに紹介していきたいと思います。
こちらの記事ですが、書籍Code is the wisdom of the cloudというMOBプロの本の読書メモ的な内容を記事にしたものです。
一般的な読書メモとは違って、読書している時に出てきた用語であったりだとか、その時学んだ概念であったりだとか、またその読んだ内容から新たに生じた疑問点、そういったものを随時チャットGPTに投げて、その結果をもとに構成しています。
ですので、書籍の内容そのままというわけではありませんが、書籍で得られるような知見は同様に得られるというような内容になっています。
また、チャットGPTの結果を使ってはいますが、内容的におかしい箇所に関しては手動で修正、もしくは場合によって削除もしています。
では、内容の方に行きたいと思います。
そもそもMob Programmingとは何なのかというところなんですけれども、知っている方も多いと思いますが、複数のチームメンバー、下りには3名以上が同時にプログラミングするというようなイメージのものです。
例としては、1人だけドライバーというコードを書く人がいて、残りの人は全員ナビゲーター、もしくはモブというふうにも言ったりしますという形になります。
ナビゲーターがこういうふうにコードを書いたらいいんじゃないのだとか、そういった意見を出しながら、それをドライバーが実装していくという流れになります。
ポイントとしては、みんなで同時に同じ画面を見ながら、同じ時間共有して問題に対して解決するコードを組み上げていくという中でですね、
近い概念でペアプログラミングというものがありますが、あれが2人でやるのに対してMob Programmingが3人以上というところが大きな違いになっています。
もうプログラミングの特徴ですが、先ほど言ったように3人以上の集団作業であり、同時に同じコンピューターで作業しますよと。
あと先ほどドライバーが1人と言いましたが、これも決まった時間で順次入れ替わっていきますので、ローテーションでドライバーを書いていきます。
またコーディングしながら即時、あでもないこうでもないとナビゲーターから指示が入ってくるという感じになってくる。
そうすることでリアルタイムにどんどんどんどん良くなってくるという感じですね。
またコーディングをやっている様自体をみんなで共有するので、コーディングの時のある種のチップスというか、
ショートカットキーでこういうのを使えるようだとか、こういう風にするともっといいよみたいな、そういった知識も共有できたりします。
またコードに対するドメインの知識的なものも共有できるかもしれません。
あと全員が同時に改善を行うということによって、コードの品質が上がりやすいということがあるらしいです。
私もそんなやったことないんでよくわかんないですが。
あと同時にみんなで同じ空間をシェアして行うというところで学習がより促進されるというところはあるかと思います。
他のメンバーから新人メンバーで与えたとか、そうじゃなくてもメンバー間での学習促進はあるかと思います。
これらをトータルで2時間ぐらいで行うという感じですね。
続いて明確なコミュニケーションと書いてますが、わかんないことがあったら、もしくは曖昧だなと思ったらすぐに質問するようにしましょう。
曖昧な内容をその前にしておいてしまうと、バグを仕込んでしまったりする恐れがありますので、随時今何をやっているのか、どういう指示を出されているのかを明確にするようにしましょう。
続いては特にエキスパートの人に気をつけてほしいところではありますが、速度をいい感じに頼もしましょうというところですね。
結構慣れた人だとバンバンタイミングしがちですけれども、他の人が今コードエディター上でどういうことが起こっているのかを追従できるように、
それこそやっていることを自分で話しながらコーディングしたいだとか、あとは特殊なショートカットキーとかを使うときはそれについても説明をするなども重要ですし、
そのように他の人たちを置いてきぼいにしないように気をつけた方がいいかと思います。
また読みやすいコードを書きましょうというのは当然なので、そうしましょうというところですし、
あと切り替えの時ですね、これはここにはちょっと書かれてはいませんけれども、時間が来たんだけどもあと少しで書けそうだからってついつい書きたくなるんですけれども、
そこはもう時間をきっちりと切り上げて次の人にすぐに書いてもらうようにしてください。
あとツールや環境に関してはみんなが同じツールにおよびセッティングに慣れておく、
そこら辺について事前に合意をしておいてセットアップしておくというところが重要になってきます。
なのでこのエディターで一般的にはデフォートの設定を使うというふうになると思うんですけれども、
そういうふうにしておくことによって、このタイピストが変わった時にこのツール慣れてないんですってのがちょっと避けられるようにした方がいいかと思います。
あと細かいところではありますが、行番号とかを表示しておくことで指示を出しやすくしておくとかも基本のことなのでそれはやっといていただければと思います。
続けてナビゲーターの方が気をつけるべきことを共有したいと思います。
まず明確な指示ですね。コーディングするにあたって何を実装したらいいのかわからないような指示はやめてほうがいいので、
それこそこの何行目にどういうふうなコードを書いてっていうのを明確に指示すると。
特に行番号を指示する場合には相対的に今カーソルがあるところから下行を下がってとかじゃなくて、
何行目っていう絶対値の行番号で指定してあげることが重要になります。
カーソルは常に動くので相対的な内容だと理解ができなかったりします。
あと書く内容についても明確に何を書くのかというところを指示してあげるのが重要かと思います。
あとは積極的なコミュニケーションですが、これは当然ナビゲーターが全然しゃべらないと話にならないので積極的に
指示があったりだとか場合によっては質問も含めて投げていくというのが重要になるかと思います。
あとドライバーのペースを尊重するというところで、先ほどエキスパートが急ぎすぎるというところがありましたが、
ドライバーの方も習熟度はバラバラだったりするので、その人のペースで書けるようにあまり急かしすぎたりしないようにしてあげた方がいいかと思います。
続きまして、解く問題についてちょっと話していきたいとおもいます。
モブプログラミングではあるんですが、向いてる問題と向いてない問題というのがありまして、そこらへんをちょっと雰囲気つかんでもらいたいなというふうに思います。
まずモブプログラミングが向いている問題ですが、ある程度複雑な問題は結構モブプログラミングが向いてるんじゃないかなというふうに思います。
いわゆる3人ヨーダーはモンジューの中枝じゃないですけれども、複数人の頭脳を使って一人だとちょっと時間かかってしまうような問題に対しても、
モブプログラミングであれば解決策を出せるというところはあるのかもしれません。
あとコードの品質を上げるというところで、リファクタリングだとかそこの辺をみんなで一緒にやるっていうのもある意味ありつやありかなというふうには思います。
特にこれは側向いているような場合だとリファクタリングにおいてのどういうふうに直すのが適切かというところの合意が取れてないようなケースですね。
すでにどういうふうにリファクタリングした方がいいですよみたいなところがもうルールかもしくは文化が築き上がっているようなところであればまあいい。
わざわざモブプログラミングする必要はないと思うんですが、
そこがまだできてないような組織でおいてはこういった用途にモブプログラミングでこういうふうに直した方がいいんじゃないのっていうのをああでもないこうでもないといってみんなで最適解を求めるっていうのは手がともいます。
あとここには書かれていませんが、いわゆるコード型というかリードコード的な問題ですね。
ああいった特定の小さい問題をみんなで解くっていうのも結構向いている問題というふうな感じで挙げられていました。
特に練習とかではそういうリードコードとかの問題を解くのがおすすめらしいです。
逆にモブプログラミングが向いてない問題としてはまあ単調の問題ですね。
まあ誰でもこれやりやすぐ解けるでしょうみたいなやつをまあ複数の頭脳を使ってやる必要はないですからそういった問題に関してはわざわざやる必要はないかなと。
また複数人で集まってもすぐには答えが出ないような極度に専門的な問題もちょっと向いてないと思われます。
まあそういった場合にはちょっとあのこの後の説でどういうふうにすればいいかというところは後で話します。
ちょっとその前にまた時間が結構限られているような場合ですね。
まあリリース前直前のところで明日までリリースしなきゃいけないみたいな時にやるのはまあそっちを向いている時もあるのかもしれませんが、
まあそういうふうにあまり時間のないときは特定のデバッグとかは向いているのかもしれませんがそうじゃない場合は適応しない方がいいかなというふうに思います。
で先ほどの極度に専門的な問題、要は数に答えが出ないような問題に対する対処策として実際にこちら小説の方でも書かれてた対策案としまして、
この場合だとこの1の研究時間ってやつですね。この緊急時間を設けるっていうのがですね一つ対策の案かと思います。
これどういったものかと言いますと一旦ちょっとMOVプログラミング、一つのコンピューターでみんなで作業するという前提でしたがそれをちょっと解除しまして各人が自分個人個人でこの今抱えている問題をどうやって解決すればいいかってのをそれぞれ調べます。
調べてそれで何か糸消しとかが見つかったら随時メンバー間に共有しつつ、何か解けそうってなったらみんなで解いていくという感じですね。
そういった感じの個人個人で調べる緊急時間というのを設けるというのはありかと思います。
それ以外にもGPT的には専門家に聞いたりだとか、一旦ちょっと落ち着こうって感じで置いた時間を空けたりだとか、
もしくはその仮説自体を問い直したとか、いろんなそういったアプローチが提案されてて確かにそうだなというような内容でしたので紹介しておきたいと思います。
続きましてMOVプログラミングにおける人間関係の重要さというところを紹介したいと思います。
MOVプログラミングはみんなで一緒にやるので、当然人間関係が良くないとうまく機能しないというのは想像できるかと思いますが、実際そうです。
そういう意味ではこのMOVプログラミングを効率的に行えるチーム状態ってどういう状態なのっていうのをここにいくつか挙げています。
まず一つ目が尊重と信頼というところで、互いに必要が引っ迫とし合いましょうねというところで、あとはオープンなコミュニケーションというところですね。
この1-2ですね、あとその3-2プラスの3強調性、3-2-4の共感というところ、ここの1-4でほぼほぼ心理的安全性高いよっていう風に言ってもいいかと思いますが、そういった状態が好ましいっていうのが言えるかと思います。
またですね、Win-Winの思考っていうのも重要だと思われますね。
互いに寄与するのを良しとするっていう状態があるべきかと思います。
そんな感じなのがまず良い状態ですよっていう話なんですが、プログラミングにおける人間関係において結構ハマりがちなトラップと言いますか、良くない状態として挙げられていたのが集団思考、グループシンクというものがあります。
これどういったものかと言いますと、心理的安全性が単純に低いと言ってもいいかと思いますが、そういうのが抜度を逸れて何か言いたいことが言えないというよりは、気を使って言えないっていうのが入ってくるのかなというふうに思いますけれどもですね。
そういったちょっと自分の意見を表明するのをためらうような状況、そういったものがグループシンクという状況かと思われます。
こういうグループシンクに陥らないためには、結局やっぱり先ほど言った心理的安全性を確保するため、確保するためにはどうすればいいのかっていうのはなかなか難しいんですが、
一般的に良しとされている、そういういろんなプラクティスだとか文化形成だとかを、もしくはチームビューティング的なものだとかを行う必要があるというような感じかと思います。
続きまして、まだ人間関係のところ続いてまして、MOBプログラミングにおいてメンバーの個性、強みとか弱みですね、そういったものが結構重要ですよっていうようなところが書かれていました。
ここでいう強み弱みっていうのは、いわゆるストレングスファインダーとかの性格分析的なもので出てくるようなやつのことを指しています。
MOBプログラミングでは、こういった各個人の特性を生かすように工夫をすることで、MOBプログラミングの効率が上がりますよということが書かれていました。
具体的には各人の強みを生かしてあげましょう、逆に弱みを保管してあげましょうだとかですね、そういったところを書いていました。
続きまして、今度はメンバーが新たに入ってくるとき、オンボーディング時ですね、そういったときの注意事項がいくらか書かれています。
ここらへんは多分チームビーディングのプラクティスに結構近いかなというところではあるんですが、練習とかトライアルをやってみると。
また結局ですね、新しく入ってきて、早く馴染んでもらうというところが重要になってきますので、
心理的安全性が確保できるような工夫が重要になってくるんじゃないかなと、この最後に書かれていますが、
結局やっぱり一般的なチームビーディングのノウハウがそのまま生きてくるというところからと思います。