Index: [Article Count Order] [Thread]

Date:  Tue, 23 May 2000 15:07:49 +0900
From:  Yutaka Kamite <y-kamite@....jp>
Subject:  [XP-jp:00383] XPractices 【  24. Pair programming 】 (修正版案)
To:  extremeprogramming-jp@....jp (extremeprogramming-jp ML)
Message-Id:  <392A20631E.16BFY-KAMITE@....jp>
Posted:  Tue, 23 May 2000 15:08:35 +0900
X-Mail-Count: 00383

上手@データ通信システム です。
修正版の案です。
佃さんの指摘を反映させました。ありがとうございました。
ペアプログラミングの脚本の部分を追加しましたので、コメントをお願いします。
脚本の部分を分離した方が良いでしょうか?

XPractices 24.
Pair Programming
ペア プログラミング

全ての重要な開発は複数のペアによって行われる。我々は進捗は早く、開発速
度が乱れることなく長く仕事ができ、品質はより高いことを知った。概して、
(キーボードに向かい)タイプしている人は、コードがどこへ向かっているか
一番良く感じている。観察している人は、細かなエラー(スペリング、フォー
マッテイング、メソッド名)に気づき、同時に開発がどのように進んでいるか
についてのより広い全般的な視野を持つ傾向がある。

それはまるで、タイピストは独立のメソッドを加工しており、観察者は戦略と
細かな詳細を同時に見ているかのようだ。

我々は、ほんのちょっと実行してみるだけで、多くの人々がすぐにペア開発を
採用することを知った。彼らがそれを好きになるのは、進捗が目に見えて速く
なるからだ。

プロジェクトとして見ると、ペアプログラミングの実行は少なくとも2人の人
が全てのコードを熟知していることを確実にする。これは、各チームが別のタ
スクに向かう時に、すぐ成果となる。

<反論>
複雑なタスクでは集中が必要であり、開発者は集中するためにプライバシーが
必要だ。

・我々はプログラマが独自にプロトタイプすることを認めている。お奨めのプ
ラクティスは、その後にそのプロトタイプを投げ捨て、パートナーと一緒に新
しいものを作りなおすことだ。もし、ひとりで何かを作り上げたら(例えば週
末をかけて)、我々はそれをパートナーと一緒に再レビューする。これは、チ
ェックが続いたならOKだ。でもそれを、ペアリングを避けるための賢い方法
だとは考えないことだ。

・もしあるタスクがとても複雑で、かなり集中する必要があるなら、我々が間
違えているのは明白だ。我々の全プロジェクトでこのガイドラインから外れた
例外はない : 単純性はいつも可能であり、いつもベターである。

<反論> 私は一人で仕事をするのが好きなんだ。
・それもいいんじゃない。あなたとは一緒に仕事はできないね。
(訳注:これは、”You just can't work with us.”ページへのリンクです)

Alistair Cockburn がKenと私を”私の言うようにやれ、そうでなければ出てい
け”じゃないかと批判している。これについての議論は上記のリンク参照。


ペアプログラミング 脚本(へのリンク)

 最近のcomp.lang.smalltalkのやりとりが、(二人でなく)実際は三人のプロ
グラマでされていますが、ペアプログラミングをどのように行うかの良い例にな
っています。チェックして下さい。

オリジナル http://www.xprogramming.com/
Copyright (c) 1999, REJeffries et al. (ronjeffries@....org)

--------------------------------------------------------------
参考:
ペア プログラミング
一幕の脚本

<ト書き>
Jackはシステムに幾つかの醜いコードを見つけた。彼は改良をしたが、結果に満
足できない。もう一人のペアに見てもらおうと決めて、Jillにちょっと一緒にや
ってくれないかと頼んだ。

Jack
この胸の悪くなるようなコードはどうだい。生産コードの中にあったんだ。みん
なUIがきちんと応答しないて言ってるし。

       widgetIDs
                  | compNames |
                  compNames := Set new.
                  self builder namedComponents keysAndValuesDo: 
                      [:compName :comp | | wid |
                      wid := comp widget.
                      (wid isKindOf: VisualRegion) |
                      (wid isKindOf: SliderView) |
                      (wid isKindOf: NoteBookComposite) |
                      (wid isMemberOf: View) |
                      (wid isKindOf: SubCanvas) |
                      (comp spec isKindOf: DividerSpec) |
                      (wid isKindOf: GroupBox)
                          ifFalse: [ compNames add: compName ]].
                  ^compNames asArray

<ト書き>
Jillがコード読む時、彼はにやにやする。

<ト書き>
Jillはすぐに、読めるようにするにはフォーマッティングが必要なことに気づく。
これでJackのいうことが正しいのがわかったので、何かをしないといけない。
(何度も繰り返される)#isKindOf: メソッドがJackのリストの最初だ。

Jack
幾つかのクラスを拡張してメソッドを追加した方がいいな、#isSpecialかもっと
良い名前で、Booleanを返すように単純化する。新しいメソッドはポリモルフィズ
ムを使ってこんな感じかな。

<ト書き>
彼は新しい別のウィンドウをクリックして、Jillに新しいバージョンを見せる。

       widgetIDs
                  | compNames |
                  compNames := Set new.
                  self builder namedComponents keysAndValuesDo: 
                      [:compName :comp |
                      (comp widget isSpecial or: [ comp spec isSpecial ])
                          ifTrue: [ compNames add: compName ]].
                  ^compNames

<ト書き>
Jillは#isSpecialのコードを読む。ちょっと考えてアイデアが浮かんだ。彼女は
キーボードを手にする。

Jill
ちょっと待ってね。#isSpecialを出る時に、何か、こんなことをしたいの−−

<ト書き>
Jillはメソッドの新しいバージョンをタイプする。

       widgetIDs
                  ^self builder namedComponents
                      inject: Set new
                      into: [ :sum :each | widget specialAdd: sum]

 
Jill
−そしてもちろん実装は:

         SpecialWidget>>specialAdd: aSet
                  ^aSet add: self name

         OtherWidget>>specialAdd: aSet
                  ^aSet

<ト書き>
Jillはキーボードをつかみ良いソリューションの入力を始めるが肝心のところで
幾つか細かなミスをする。幸いJackが一緒にいる。

Jack
そのspecialAddには#yourselfがいるよ

Jill
そうね、グッドキャッチ。

       SpecialWidget>>specialAdd:aSet
                  ^aSet
                      add: self name; 
                      yourself
Jack
セレクタの名前は、#specialAddTo: の方がいいんじゃないの

       SpecialWidget>>specialAddTo: aSet
                  ^aSet
                      add: self name; 
                      yourself

              OtherWidget>>specialAddTo: aSet
                  ^aSet
Jill
そうね、またまた。

<ト書き>
彼女はコードを直ちに変更する。全ては2,3分の間に起きた。彼らの役割があれ
これ動的にスィッチしたことに注目して下さい。Jackはアプローチを始め、Jillが
それを採用した。Jillがコードをスケッチしている時、Jackは彼女を、シンタック
スサポートおよびスタイルガイドラインでバックアップした。パートナー達は、お
互いにスムースに活動した、一人はバックアップモードでサポートし、タイピスト
はコードを書き込む。

衝突は無い:2人が一つのミッションで協働作業を行い、リードは、瞬間瞬間でス
イッチする。ペアプログラミングは最高の状態だ。