Slide 1

Slide 1 text

より協力的なペアプロを促すには
 どうするかを考える
 2023/09/30 #xpjug Jun Nakajima

Slide 2

Slide 2 text

自己紹介
 なかじま(@jnuank_)
 ● 前職でスクラムを実践
 ● 2年半前からUZABASEにJoinしてからXPを実践してます
 ● 普段からペアプロとTDDをフルタイムでやってます
 ● 社内で和尚と呼ばれます
 2

Slide 3

Slide 3 text

みなさんのペアプロのモチベは?


Slide 4

Slide 4 text

自分がペアプロをやっている動機
 ● より良いソフトウェアの設計をするため
 ● レビュープロセスを無くしてより早く価値を届けるため
 ● ペアで知識・情報を共有することで、コーディングの大事なポ イントをチームで確立していくため
 ● 楽しいから
 4

Slide 5

Slide 5 text

私のペアプロ・モブプロの原体験
 ● 2018年XP祭りでTDDワイワイ会のワークショップに参加
 ○ 普段知らない人たちでも一緒に協力してコードを書くのが 楽しかった
 ● 同年のTDDBCでペアプロ×TDDをした
 ○ お互いが設計に対して意見し合い、自分の想像以上の設 計を考えられたのが楽しかった
 5

Slide 6

Slide 6 text

楽しいが、今はのびしろも感じてる


Slide 7

Slide 7 text

いまのチーム状況
 自分と、4月に組織にJoinしたばかりのメンバー
 7 私


Slide 8

Slide 8 text

最初の1週間
 8 まずはテストから書い ていきましょう。 ◯◯ファイル開いて、 そこに追加しましょう はい (言われた通りにファイルを開く) OK。じゃあまずは落と す為に、こういう風に 書いて… はい…はい… (言われた通りにコードを書く) 私


Slide 9

Slide 9 text

約1ヶ月後…
 9 よし、今日は◯◯のス トーリーをやります か。じゃあ△△のファ イル開いて はい (言われた通りにファイルを開く) じゃあ@Testって書い て次にfun hoge()っ て〜 はい…はい… (言われた通りにコードを書く) 私


Slide 10

Slide 10 text

あれ?
 10 ずっと一方的 に喋っている な…。

Slide 11

Slide 11 text

のびしろを感じた場面
 ● 一緒にやるメンバーに細かく伝え続ける事が多かった
 ● 私が喋る事を別の方にそのままアウトプットしてもらっている
 11

Slide 12

Slide 12 text

ペア作業は仲間との協力だが、ベテラン開発者が経験の浅い開発者とペア を組むときもあるだろう。この場合、先生と生徒という立場になってはいけな い。2人のメンバーが一緒に学ぶ機会を作ることによって、対等なバランス を取り戻そう。
 12 『アート・オブ・アジャイルデベロップメント』pp.80-81


Slide 13

Slide 13 text

先生と生徒の関係から早く脱却したい
 ● 前提として先生と生徒の関係が必要なときはある
 ● だけど、長く続けるべきではない
 ○ 先生役以上の意見が生まれにくい
 ○ 生徒役自身の創造性が押さえつけられる
 ○ ペアプロで期待する相互作用が生まれにくい
 13

Slide 14

Slide 14 text

なぜペアなのか?
 
 本章のタイトルを考えることとした。それにもかかわらず、最初のプラクティ スをペアプログラミングにした。
 それはペアプログラミングが知力を高めることそのものだからだ。
 14 『アート・オブ・アジャイルデベロップメント』p.77


Slide 15

Slide 15 text

ペアプロの本質は考えること
 ● ペアプロは単に二人一緒に作業をするだけじゃない
 ● お互いが考えていることをぶつけ合い、そこからお互いが考 えを深めて、コードを生み出していく
 15

Slide 16

Slide 16 text

どうやって
 先生と生徒の関係から脱却するか


Slide 17

Slide 17 text

よりよい協力関係を築く


Slide 18

Slide 18 text

チームとして振る舞うためにペアになるのだ。チームメンバーは孤独に作業 せず、秒単位で協力しながら作業する。
 ひとりのメンバーが失敗しても、他のメンバーがその穴をカバーしながら、 ゴールに向かって進み続けるのである。
 18 『Clean Agile』p.124


Slide 19

Slide 19 text

協力とは
 ● 協力(きょうりょく)とは、複数の個体が共同で行動し、特定の 目標を達成するための行為を指す
 19 https://www.weblio.jp/content/%E5%8D%94%E5%8A%9B
 


Slide 20

Slide 20 text

ペアプロの文脈においての協力とは


Slide 21

Slide 21 text

お互いの思考を刺激しつづけながら
 ゴールに向かって進み続ける


Slide 22

Slide 22 text

1. ペアプロはフィードバックループをつくる
 22 2. ペアプロのスキルを磨く
 今日話すこと
 3. まとめ


Slide 23

Slide 23 text

1. ペアプロはフィードバックループをつくる
 23 2. ペアプロのスキルを磨く
 今日話すこと
 3. まとめ


Slide 24

Slide 24 text

ペアプロによるフィードバックループ 24 引用元:http://www.extremeprogramming.org/map/loops.html


Slide 25

Slide 25 text

(頻繁な)会話のフィードバックループ 25 いやいや、こうした方 が…。 ここの実装はこうしたい なるほど…。あれ、待って。この エラーハンドリング考慮した方 が…。

Slide 26

Slide 26 text

一方的に教える(極端な)例 26 ここの実装はこう書い てー。この言語の場合 はこういう書き方があ り…。 はい…はい… (言われた通りに書く) フィードバックループが途絶えてしまう


Slide 27

Slide 27 text

なぜフィードバックループを作りたいか ● ペアの間でフィードバックループが作れれば、数秒ごとに相手 の見方・考えが手に入る
 ○ 大体が自分では思いもよらなかった考えのはず
 ● 思考を深めるきっかけとなる
 27

Slide 28

Slide 28 text

フィードバックループを作る
 →頻繁に会話をする


Slide 29

Slide 29 text

頻繁に会話をするためには


Slide 30

Slide 30 text

23. 10分から15分おきに、ドライバーとナビゲーターを 交代しています か? 頻繁にドライバーとナビゲーターを交代することに より、より自然に知 識の共有・システムの理解度を深めることができます。
 30 『ペアプロの心得』https://gist.github.com/j5ik2o/2970973


Slide 31

Slide 31 text

頻繁なドライバーとナビゲーターの交代


Slide 32

Slide 32 text

ドライバー交代のパターン
 ● 時間による交代
 ● テストによる交代
 ● 自然な交代(キーボードを取り合う)
 32

Slide 33

Slide 33 text

ドライバー交代のパターン
 ● 時間による交代
 ● テストによる交代
 ● 自然な交代(キーボードを取り合う)← オススメ
 33

Slide 34

Slide 34 text

34 じゃあやりましょう。どのへんのコード 触るか当たりつきます? キーボードを取り合うイメージ

Slide 35

Slide 35 text

35 じゃあやりましょう。どのへんのコード 触るか当たりつきます? ◯◯ユースケースのメソッドのとこ ですかねー キーボードを取り合うイメージ

Slide 36

Slide 36 text

36 じゃあやりましょう。どのへんのコード 触るか当たりつきます? ◯◯ユースケースのメソッドのとこ ですかねー OK。じゃあテストコード書きましょう キーボードを取り合うイメージ

Slide 37

Slide 37 text

37 テストコードのアサーション書きま す…(止まる) じゃあやりましょう。どのへんのコード 触るか当たりつきます? ◯◯ユースケースのメソッドのとこ ですかねー OK。じゃあテストコード書きましょう キーボードを取り合うイメージ

Slide 38

Slide 38 text

38 テストコードのアサーション書きま す…(止まる) お、なんか悩んでます? じゃあやりましょう。どのへんのコード 触るか当たりつきます? ◯◯ユースケースのメソッドのとこ ですかねー OK。じゃあテストコード書きましょう キーボードを取り合うイメージ

Slide 39

Slide 39 text

39 テストコードのアサーション書きま す…(止まる) お、なんか悩んでます? …あーっと…Kotlinのユニットテス トってアサーションどうするんでし たっけ じゃあやりましょう。どのへんのコード 触るか当たりつきます? ◯◯ユースケースのメソッドのとこ ですかねー OK。じゃあテストコード書きましょう キーボードを取り合うイメージ

Slide 40

Slide 40 text

40 テストコードのアサーション書きま す…(止まる) お、なんか悩んでます? ああ、なるほど。ちょっとキーボード 借りますね …あーっと…Kotlinのユニットテス トってアサーションどうするんでし たっけ じゃあやりましょう。どのへんのコード 触るか当たりつきます? ◯◯ユースケースのメソッドのとこ ですかねー OK。じゃあテストコード書きましょう キーボードを取り合うイメージ

Slide 41

Slide 41 text

41 このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 42

Slide 42 text

42 ああ、なるほど。そう書くんです ね。じゃあ続き書きます (キーボード取り返す) このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 43

Slide 43 text

43 はい ああ、なるほど。そう書くんです ね。じゃあ続き書きます (キーボード取り返す) このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 44

Slide 44 text

44 はい ああ、なるほど。そう書くんです ね。じゃあ続き書きます (キーボード取り返す) …よし、テスト期待通り落ちました ね このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 45

Slide 45 text

45 はい ああ、なるほど。そう書くんです ね。じゃあ続き書きます (キーボード取り返す) …よし、テスト期待通り落ちました ね じゃあ実装やっちゃいますね(キー ボード取る)……よし、通った このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 46

Slide 46 text

46 はい ああ、なるほど。そう書くんです ね。じゃあ続き書きます (キーボード取り返す) …よし、テスト期待通り落ちました ね じゃあ実装やっちゃいますね(キー ボード取る)……よし、通った あ、ちょっとそこリファクタしたいん でいいすか?(キーボード取る) このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 47

Slide 47 text

47 はい ああ、なるほど。そう書くんです ね。じゃあ続き書きます (キーボード取り返す) …よし、テスト期待通り落ちました ね じゃあ実装やっちゃいますね(キー ボード取る)……よし、通った あ、ちょっとそこリファクタしたいん でいいすか?(キーボード取る) 確かに。そっちの方が良さそう。それ だったら、こっちのコードも直したい (キーボード取る) このライブラリ使っているんで、こう書 けば…(タイピングする)

Slide 48

Slide 48 text

キーボードの取り合いが会話を生む ● お互いがキーボードを頻繁に取るので、コードについてよく話 し合うことになる
 ● 慣れると、どっちがドライバーかみたいなロールに拘らなくな る
 ○ スクラム現場ガイドでも、数分単位で交代するマイクロペ アリングという手法を紹介してる
 48

Slide 49

Slide 49 text

じゃあ、キーボードを取り合うことを
 明日からやってみるぞ!


Slide 50

Slide 50 text

それが難しい


Slide 51

Slide 51 text

いきなりは難しい
 ● 慣れてない人に、いきなりキーボードを「いつでも取って」とい うのは難しい
 ● 様々な要因
 ○ 目の前のコードや仕様技術の理解
 ○ ペアプロ自体のスキル
 51

Slide 52

Slide 52 text

いきなりは難しい
 ● 特にペアプロのスキルは
 相手がいる中で磨かなければならない
 52

Slide 53

Slide 53 text

1. ペアプロはフィードバックループをつくる
 53 2. ペアプロのスキルを磨く
 今日話すこと
 3. まとめ


Slide 54

Slide 54 text

ペアプロのスキル
 ● いろいろある
 ○ 自分の考えを口に出す、問いかける、相手の話を傾聴す る、自分の考えをいつでも変えるマインド
 ● 今回はペアプロに慣れてないメンバーが
 キーボードを取り合うことを促す方にフォーカスする
 54

Slide 55

Slide 55 text

相手に積極的にドライバーを促すスキル
 ● 場づくり
 ● ナビゲートの抽象度のコントロールする
 ● 問いかける
 ● パートナーの認知負荷を把握して助ける
 ● キーボードを奪わせる
 ● ペアプロのふりかえり
 55

Slide 56

Slide 56 text

場づくり
 ● リスペクト・信頼関係が無いとペアプロは成り立たない
 ● チームができたばかりなら、相互理解を深めるワークをする のがオススメ
 ● Joinしたてのメンバーや、新しくペアプロを取り入れるといった 場合はペアプロの心得の読み合わせなどをする
 56 『ペアプロの心得』https://gist.github.com/j5ik2o/2970973


Slide 57

Slide 57 text

経験の浅いメンバーへ伝えること
 ● ペアプロを楽しいと思う一方で、思うように書けないと自分は 貢献できているのかと不安に思う人も少なくない
 ● ペアに一番貢献できるのは、質問することだと伝える
 ○ どんなに素朴な質問でもそれは相手の為になる
 ○ 無知をさらけだす勇気を出すことを讃える
 57

Slide 58

Slide 58 text

ナビゲートの抽象度をコントロールする
 ● 最初はなるべく抽象的なナビゲートから
 ○ ◯◯のストーリーやりたいから、まずテスト書こう
 ● そこで手が止まるようであれば、何がわからないかを聞いて、 それに応じて抽象度を下げていく
 ○ xxxClassを書いて、次にxxxメソッドを書いて〜という詳細 にするのは最後
 58

Slide 59

Slide 59 text

問いかけをする
 ● パートナーの手が止まったり「わからない」と口にしたら、問い かけてわからないの解像度を上げていく
 ○ 言語知識が少なくて書けないのか
 ○ ソースコードが複雑で追いづらいのか
 ● なるべく相手本人が言葉にできるようにする
 59

Slide 60

Slide 60 text

パートナーの認知負荷を把握して助ける
 ● コードベースや言語知識が少ないと認知負荷を起こしやすい
 ● 何度も手が止まる場合は、まずは一緒にコードを読んで理解 するところから始める
 ○ 読んで図を描いてもらい、記憶の補助に使う
 60

Slide 61

Slide 61 text

(余談)プログラマーがコードを書く際の5つ活動
 ● 検索:コード内を調べ、特定の情報を探す活動
 ● 理解:コードを読んで実行し、その機能を把握する活動
 ● 転写:単にコードを書く活動
 ● 増強:既存のコードに新しい機能を追加する活動
 ● 探索:目指すゴールが漠然としたまま探索する活動
 これらの活動を同時にやると認知負荷高まりやすいらしい
 61 参考:『プログラマー脳』


Slide 62

Slide 62 text

ある程度慣れたらキーボードを奪わせる
 ● キーボードを奪う経験は大抵は無いので積んでもらう
 ● 今日はキーボードは譲らないと宣言してペアプロする
 ○ 「ドライバーやります! …で、ここからどう書くんです か?」はアリと伝える
 ○ 「書きたくなったら、キーボード奪って下さい」と伝える
 62

Slide 63

Slide 63 text

ペアプロのふりかえりをする
 ● 1日の終わりに15〜30分程度でペアプロのふりかえりをする
 ○ ペアプロ中に良かった行動をフィードバックする
 ○ ペアプロのやり方について改善できることはないか
 ○ ペアプロ中に質問できなかったところを質問する
 63

Slide 64

Slide 64 text

いくつか試してみて


Slide 65

Slide 65 text

数か月くらいで効果は見えてきた
 ● 最近Joinしたメンバーに試してみた
 ● 2〜3ヶ月くらい経つと、特定のAPIの開発などは「じゃあ書きま す」と宣言してリードしてくれる姿が増えてきた
 ● まだ1人にしか試してないので、再現性があるかはもっと検証 が必要
 65

Slide 66

Slide 66 text

自分の伝え方についてものびしろが見えた
 ● もともと私もJoinしたてはキーボード取って慣れよ。というスタ イルだったので、チーム立ち上げ時もそれで上手くいくと思っ てた
 ● 今回の経験を機に、もっと新しく入るメンバーに寄り添えるよう なペアプロができるかもしれない。という学び
 66

Slide 67

Slide 67 text

まとめ


Slide 68

Slide 68 text

まとめ
 ● ペアプロの本質は考えること
 ● ペアの相互作用により思考を深めてゴールを目指す
 ● 数分おきにキーボードを取り合い、
 自然に交代するのが理想のペアプロの1つ
 ● いきなりそこを目指すのは難しいので、経験者のサポートす るスキルは磨く必要がある
 68

Slide 69

Slide 69 text

参考文献
 ● Kent Beck, Cynthia Andres(著), 角 征典(訳) (2015) 『エクストリーム・プログラミング』オーム社 
 ● Mitch Lacey (著), 安井 力, 近藤 寛喜, 原田 騎郎(訳) (2016) 『スクラム現場ガイド』マイナビ出版 
 ● Robert C. Martin(著), 角 征典, 角谷信太郎(訳) (2020)『Clean Agile 基本に立ち戻れ』ドワンゴ 
 ● フェリエンヌ・ヘルマンス (著), 水野貴明 (著), 水野いずみ (著) (2023) 『プログラマー脳 ~優れたプロ グラマーになるための認知科学に基づくアプローチ』秀和システム 
 ● James Shore (著), Shane Warden (著), 木下 史彦(監訳), 平鍋 健児(監訳), 笹井 崇司 (訳) (2009) 『アート・オブ・アジャイル デベロップメント』オライリージャパン 
 ● 『ペアプロの心得』
 
 69

Slide 70

Slide 70 text

Thank you!