知識差-スキル差を埋めるためのペアプロ+αのコツ(1)

ペアプロを始めてみたものの、熟練者と初心者の間で知識差-スキル差が大きくうまくいかない時のコツ

Eiji Ienaga
時を超えたプログラミングの道

--

はじめに

ペアプロを始めてみたものの、熟練者と初心者の間で知識差-スキル差が大きいあまり、ペアのやりとりが噛み合わなかったり熟練者に依存し続けて初心者のままで成長しない、といったことを耳にすることがあります。では、どうすればその差を埋め、コラボレートできるペアプロになっていくのでしょうか?この記事では、指導役となる熟練者側向け中心に知識差-スキル差を埋めることを主目的としたペアプロの実施のコツを解説していきます。

大切にする価値

ペアの間では、基本ルールを守ってコミュニケーションを取ることが大前提です。書籍『Team Geek』で紹介された、HRT原則(1. 謙虚(Humility)、2. 尊敬(Respect)、3. 信頼(Trust))や、Hunter Industries 社の本家のモブの場合は、Kindness, Consideration, Respectの3つを基本ルールが参考になるでしょう。2人の間にある一定の信頼関係が築けなければ、単にペアで作ってもお互いに学び合い成長し合うことは期待できません。

指導役は、ペアプロの際に、テクノロジーハラスメント、圧迫面接のような場にならないように注意が必要です。学習役を萎縮させてしまっては学びの阻害要因となってしまいます。

前提知識

教育目的のペアプロといえど、最低限の知識がないと言葉も発せられず指も動かずコードも書けません。教育をペアプロだけに頼る必要はありません。バージョン管理、プログラミング言語、フレームワーク、テスティングフレームワーク、エディタ操作などはチュートリアルを使って練習して最低限の知識を獲得してから、実務でペアプロがお勧めです。「練習、練習、練習」はアプレンティスシップ・パターンでも紹介された学習コツですが、40代に突入した私も続けています。その他にソースコードリーディングもオススメです。本家のモブでは、毎朝1時間のスキルラーニングセッションを設定しているようです。チームで共同の練習を続けながら、実務でのペアプロはオススメです。

既知と未知

ペアで組んだ際、熟練者と初心者で既知と未知のエリアが大きく異なり、非対称性の知識差を試行錯誤しながら埋める必要があります。指導役も教えることによる学び直しのほか、学習役に対して指導の仕方の振る舞いを獲得していく必要があります。

熟練者同士でも、テストが得意、設計が得意、プログラミング言語が得意など、得意領域の違いがあるのが普通です。2人とも練度があるペアプロの場合は、お互いの得意領域を活かしたフォローや相互学習で、ペアで仕事を確実にすばやく終わらせ、各々も成長していきます。

たとえ熟練者同士でも不確実性が高い領域では、2人とも知っていることよりも知らないことが多々ある状態からスタートします。何を作れば顧客に価値が届けられ市場に受け入れられるか?新たな技術要素xでどう実現するか?市場や技術の変化にどう適応していくか?などを誰もが知っていて、誰でも何時でも同じ結果のコードになるのであれば、ソフトウェア開発は苦労しません。不確実性の高い領域では、熟練者も指導役というより学習役としての振る舞いが多くなります。

熟練者は、何かを知っているだけでなく未知から既知への変え方を熟知しているのが特徴で、学習役にそれも伝える必要があります。未知から既知への変え方は、日々の継続的な学びの習慣のほか、コードやエラーなど読んで仮説立てて試して確認を繰り返すトライ&エラーの進め方、自分とは異なる他者と学び合う作法などです。

このあとは、熟練者同士ではなく、熟練者が指導役となってペアプロを進める方法にフォーカスします。

ペアのリズム

Ping-Pong, 短い時間でのドライバーとナビゲータの交代がポピュラーですが、小さなリファクタリングの一連ステップ、TDDのコツ(TODOリスト、レッド・グリーン・リファクター、仮実装経て本実装へ、明白な実装、アサートファースト、はじめのテスト、説明的なテスト、脱線はTODOリストへ、一歩を示すテスト、小さいテスト、差異をなくす、休憩、戻る…)は、ペアのリズムを作るコツにもなっています。ペアのリズムを作るためにも、リファクタリングやTDDを予め練習しておくことをオススメします。書籍を使って「練習、練習、練習」すれば、そのステップ幅の小ささやプログラマの暗黙的になりがちな振る舞いをなんとか言語化して伝えようとしているKent BeckやMartin Fowlerの努力に改めて驚くでしょう。

ドライバーとナビゲーター

ペアプロの際に、コードを書く人をドライバー、ドライバーに対して支援や代案の提示や指示する人がナビゲータという役割名で呼びます。この役割を、頻繁に交代しながら、プログラミングを進めます。

リードとサポート

リード役は例えば、タスクだしと順序付け、どう作るかべきか選択案のリスト化と選択、テストで最初の一歩を示す、トライ&エラー、リファクタリングステップを刻むなどの振る舞いでパートナーを引っ張っていきます。ドライバー、ナビゲータどちらでもリード役は可能です。サポート役はリード役が考えていることをコードにする活動のフォローに注力します。

ついつい、話好きでいろいろ知っている熟練者がドライバーでもナビゲータでもリード役を引き受け、初心者がリード役をする機会を奪いがちです。が、初心者を伸ばしていくには指導役となる熟練者が意図的にリード役とサポート役の割合をコントロールし、学習役となる初心者側がリード役をする機会を増やす必要があります。

理想のペアプロ形態の1つは、ダブルリードでペアのどちらもがリード役でサポート役です。得意領域を生かしてリード役サポート役を頻繁にスイッチし、相互学習しながら2人の頭の中をコードへと具現化します。未知の領域については、お互いに助け合いながら勇気を持ってトライ&エラーを繰り返して確実にゴールへ近づきます。指導役と学習役は、師弟関係でこの理想のペアプロを目指しつつ、いくつかのパターンを試行錯誤します。割合の移行例は、リード:サポートの割合を9:1 から前後しながらに 1:9に移行したのち、改めてダブルリード状態の5:5を目指します。

指導役がリードドライバー

指導役の振る舞いを一言で表現するなら、山本五十六の言葉の「やってみせ、言って聞かせて、させてみせ、ほめてやらねば、人は動かじ」です。指導役がリードドライバーになるということは「やってみせる」に相当します。学習役にとっては見稽古ができます

プログラミング活動は、熟練者と初心者で大きな開きがあるのが一般的です。プログラミングの活動は、単にコード読んで書くだけではない、名前付けが難しい多数の振る舞いで構成されます。自分とは異なる熟練者とペアプロしたり、自分のプログラミング活動を動画撮影して見たら、プログラミング中に実に多様な振る舞いにしていることに気づくでしょう。学習役にとっては、複数の多様な熟練者の振る舞いを間近で観察することで、プログラミング活動が具体的に何を指しているのかの暗黙的な知識や振る舞いが獲得できます。指導役にとっては暗黙的にやってきたことを、教えることで学び直すことができます。

学習役は、対話のほか指導役の振る舞いを間近でみることで、わからなかったら質問したり、あとで調べます。ペアプロ中に質問することは億劫になりがちですが、タイミングをうまく見つけて質問し、プログラマーとしての期待する振る舞いを1つ1つ獲得していきます。

指導役は、説明しながら進めますが学習役の発言や表情などから推察して、理解が揃っていない場合は疑問を解消する質問を促したり、リファクタリングやTDDのプログラミングのコツを使って、小さな歩幅に切り替え、ペアの呼吸を揃えていきます。プログラミング活動の歩幅を小さくして2人の呼吸を揃えるのは、ペアプロのよくある振る舞いの1つです。指導役は学習役に質問歓迎と言いつつも、質問を遮るような振る舞いをしてしまうダブルバインドのメッセージングを送らないよう、声のトーンやボディーランゲージにも注意を払います。

ペアプロのセッション終了時のミニふりかえりを設定しておき、安心して対話して学べる時間を設けておくのはお勧めです。チームによっては、ペア単位ではなくチーム単位で短く対話する時間を設定しています。この場は、ペアプロ途中に質問が難しい場合も安心して質問できる場としても機能します。

ただ見稽古&質問するだけでは初心者はまだ受け身な振る舞いで、理想のダブルリードのペアプロには遠く、この状態にとどまり続けるのは望ましくありません。指導役がリードナビゲーター、サポートドライバー、サポートナビゲーターを行う他、あえてペアを解散するなど工夫が必要です。(つづく

--

--