モブプログラミングのやり方で私が重要だと思うこと

他のプラクティスと同じくモブプログラミングに関しても、たった1つの正しいやり方というものはないと思います。

チームの状況や目的により、やり方は変わってくるでしょう。

とはいえ、非常に重要なポイントというものも存在し、もしそれを破るなら、それ相応の理由が必要というものもあるかと思います。

今日は、1か月以上フルにモブプログラミングをしてみて、今、私が最も重要だと思っているモブプログラミングのやり方に関することを書きたいと思います。

ドライバーをタイピストにする

通常、モブプログラミングでもキーボードを持つ人は「ドライバー」と呼ばれます。

ドライバーは運転手で、これは車の運転のメタファーです。通常は、ドライバーは自分の行きたい場所に自分で運転して行くことができます。

プログラミングでも同じく、ドライバーは自分の考えたコードを自由に入力できます。

このようなモブプログラミングのスタイルもありえるとは思いますが、もっとよい方法があります。

それが、ドライバーをタイピストにする方法です。

タイピストは考えない

タイピストの役割はタイプするだけです。原稿は別の人が考えます。

モブプログラミングでは、ナビゲーターがどう実装するかを考えます。タイピストはナビゲーターの指示をコードに翻訳します。自分で勝手に考えてコードを書き進めてはいけません。

タイピストは、ナビゲーターの指示が理解できればコードをタイプします。理解できなければ、コードが入力できるようになるまで質問します。

ナビゲーターが考え指示する

ナビゲーターがどう指示するかは、タイピストの理解できるレベル(スキル)によりますが、タイピストが理解できる最も高い抽象度で指示を与えることが理想です。

高い抽象度の指示が理解できなければ、より抽象度を下げて指示をします。

タイピストのスキルが低ければ、最終的に、

「x行目の上に何々を入力して…」 「y行目をコピーして、z行目の上にペーストして…」 「どこどこを選択して、ctlキーとcキーを同時に押して…」

のような指示になるかも知れません。

何がいいのか?

この方法だと、あるアイデアがコードになるために、必ず、他人を通す必要があります。ナビゲーターがタイピストに言葉や図などで実装方法を説明しなければなりません。

タイピストを含む他のメンバーは必ず、その説明を聞くことになります。

チーム全員のコードや設計についての理解度が向上し、レビューの質も高まります。

ドライバーが勝手にコードを書いて、他のメンバーは見ているだけ。さらに見ているだけで実はよく理解できていなかったというが、モブプログラミングでのアンチパターンです。

そのようなアンチパターンを自動的に防いでくれるのがこのスタイルです。

また、タイピストはキーボードが打てさえすれば誰でもできます。例えば、使っている言語をよく知らない人でもタイピストをすることは可能です。

コードが実装された後

タイピストは基本的にナビゲーターの指示をコードにするだけですが、一区切りのコードが実装された後になっても、そのコードが理解できない場合は、ナビゲーターに質問する必要があります。

タイピストもモブの一部です。役割を交代すればナビゲーターになります。よく理解できずに言われたままにタイプすることもあるでしょうが、それは好ましいことではありません。

まして、コードが完成した後も理解できないままなら、モブプログラミングの意義は相当薄れます。そのような状態は放置すべきではありません。

タイピストだけど実装したいアイデアがある

タイピストは勝手にコードを実装してはいけません。もし、こう実装すべきだというアイデアがある場合は、次の人に交代し自分はナビゲーターになります。

まとめ

  • ナビゲーターはどう実装するかをタイピストに指示する
  • タイピストは考えない
  • タイピストは指示をコードに翻訳する

Tags: mobbing

CodeIgniter 3.xのForm validationで知っておいたほうがいいかも知れないこと

1. CallbackはControllerでしか定義できない

検証ルールをメソッドに定義するCallbackと呼ばれる方法は、Controllerでしか使えません。つまり、Modelに検証メソッドを定義する場合には使えません。

2. Callableにパラメータを渡す方法は用意されていない

Callbackではパラメータをcallback_foo[bar]のように渡すことができます。

If you need to receive an extra parameter in your callback method, just add it normally after the method name between square brackets, as in: callback_foo[bar], then it will be passed as the second argument of your callback method.
https://www.codeigniter.com/userguide3/libraries/form_validation.html#callbacks-your-own-validation-methods

しかし、Callableではパラメータを渡す方法は用意されていません。

パラメータを渡したい場合は、クロージャを使うことを検討してください。

3. Callback/Callableは最優先で検証される

検証ルールは定義した順番で実行されると思うかも知れませんが、実は違います。Callback/Callableが最優先で実行され、その後、requiredが検証されます。

"Callbacks" are given the highest priority (always called), followed by 'required' (called if callbacks didn't fail), and then every next rule depends on the previous one passing.
https://github.com/bcit-ci/CodeIgniter/blob/develop/system/libraries/Form_validation.php#L505

4. set_data()は検証ルールを定義する前に実行する必要がある

$_POST以外のデータを検証する際に使うset_data()は、set_rules()を呼び出す前に実行しなければなりません。

You have to call the set_data() method before defining any validation rules.
https://www.codeigniter.com/userguide3/libraries/form_validation.html#validating-an-array-other-than-post

まとめ

  1. CallbackはControllerでしか定義できない
  2. Callableにパラメータを渡す方法は用意されていない
  3. Callback/Callableは最優先で検証される
  4. set_data()は検証ルールを定義する前に実行する必要がある

参考

Tags: codeigniter