上手@データ通信システム です。
修正版の案です。
佃さんの指摘を反映させました。ありがとうございました。
ペアプログラミングの脚本の部分を追加しましたので、コメントをお願いします。
脚本の部分を分離した方が良いでしょうか?
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人が一つのミッションで協働作業を行い、リードは、瞬間瞬間でス
イッチする。ペアプログラミングは最高の状態だ。