Skip to content.

Sections
Personal tools
You are here: Home » コミュニティ » XP-jp » XP関連記事 » XP実践レポート

Document Actions
XP実践レポート
- 医療パイロットプロジェクト作業完了報告

(株)永和システムマネジメント   オブジェクト倶楽部
作成日:初版 2001/8/13
    Index

  1. 概要
  2. メンバ
  3. スケジュール
  4. 構成
  5. ストーリ
  6. プラクティスの実践
  7. イテレーションの結果
  8. xpの風景(現場)
  9. 感想
  10. 最後に
  1. 付録a.イテレーションの考察
  2. 付録b.アンケート集計結果

   概要

医療患者管理を題材としたwebシステム開発を。新しい開発手法である xp(extreme programming) を実験的に利用して行いました。プロジェクトコード名は「mpilot」。 目的は,その開発手法の習熟と評価です。

xpの概要については
/community/XP-jp/xp_relate/xp-intro を参照してください。


【戻る】

   メンバ

メンバ名 開発経験 j2ee経験 oo経験 役割
sh 経験豊富 2年 1年 マネジャ、プログラマ
kh 経験豊富 1年 10年 コーチ、トラッカ
yt 入社3年 2年 2年 プログラマ
st 入社2年 1年 1年 プログラマ
kk 新人 プログラマ
ay 経験豊富 (擬似)顧客

今回は新入社員がいたり、オブジェクト指向開発の経験がなかったり、 経験が浅かったりと、ちょっと頼りないメンバ6名で構成しました。 でも、実際の開発現場に近いことは確かです。 唯一、全員がなんらかのjavaプログラムは書いたことが頼みの綱です。 また、仕様に関しては顧客役に一名参加してもらいました。顧客には、 フルタイムではなく、週に二日、作業場所を共にしてもらいました。


【戻る】

   スケジュール

2001年7月
10 11 12 13 16 17 18 19 23 24 25 26 27 30 31
リリース計画 計画
id検索 第1イテレーション
条件検索 第1イテレーション
登録機能 第2イテレーション
血縁関係 第3イテレーション
トランザクション機能 第3イテレーション
ソート機能 第4イテレーション
ログイン機能 第4イテレーション
まとめ 全体

実践期間は、2001年7月の1ヶ月間としました。 リリース計画では、開発要件からストーリを切り出し、各イテレーションに ストーリを割り当ててスケジュールしました。
実践期間の都合で、1イテレーション=1週間(本来は2週間程度)、 リリースは全体で1回のみとしました。


【戻る】

   利用ツール,ミドルウェア

以下のようなソフトウェアツールを使って,システムを構成しました.

  • os - windows 98, 2000
  • webサーバ/servletエンジン - tomcat 3.2
  • ビルドツール - ant1.3
  • ユニットテスト - junit 3.7
  • ソース管理 - wincvs 1.2
  • コンパイラ - java sdk 1.3
  • クライアント - web browser(ie5.x)

一般的なservlet/jspによるwebアプリケーションです. データベース製品は利用せず,簡易なcsv形式のファイル を用いて永続性を実現しています.


【戻る】

   ストーリ

開発要件は、個人の基本情報、患者情報や健診情報、職員情報の検索、表示、登録、変更としました。 特殊機能として、血縁情報を追加して親子を順次検索できる機能も加えました。 これらの開発要件をストーリとして、以下のように切り出し,カードに書きました。

ストーリは,「誰にでも分かる仕様書」でないことに注意してください. 顧客が書き,ストーリの説明に参加した全員が,このカードを見れば 会話のことを思い出すことができます.また,質問があれば,このカード を持って顧客とさらに会話をすることができます.

  1. id検索機能 【スケジュール】

  2. ・人物のidを入力して検索することができる。
    ・データが見つかった場合は詳細情報画面にデータを表示する。
    ・見つからなかった場合は検索画面に戻る。
    ・見つからなかったというメッセージを表示する。
  3. 条件検索機能 【スケジュール】

  4. ・条件を入力して検索することができる。
    ・データが見つかった場合は検索結果を一覧画面に表示する。
    ・検索条件は、ふりがな、氏名、性別、生年月日、電話番号、属性をand条件で検索する。
    ・条件が1つも指定されない場合は全件表示とする。
    ・一覧表示から詳細情報画面へ遷移する。
  5. 登録機能 【スケジュール】

  6. ・登録画面からデータ(基本情報)を登録することができる。
    ・患者情報、健診患者情報、職員情報を選択して登録できる。
    ・登録画面(4画面)は任意に画面を切替えることができる。
    ・登録実行時に、確認画面を表示する。
    ・各種データはバージョン管理する。
  7. 血縁関係の追加 【スケジュール】

  8. ・基本情報に父親、母親、配偶者の情報を追加する。
    ・詳細情報画面、登録画面(基本情報)、登録確認画面に血縁関係を追加する。
  9. トランザクション機能 【スケジュール】

  10. ・各種情報のトランザクションを一元管理して、情報矛盾をガードする。
  11. ソート表示機能(一覧画面) 【スケジュール】

  12. ・一覧画面にソート表示を追加する。
    ・ソート条件は、id,ふりがな,生年月日とする。
  13. ログイン機能 【スケジュール】

  14. ・ログイン画面を作成して、セキュリティ機能を追加する。
    ・ログインなしによる各種参照画面、登録画面へのアクセスをガードする。

【戻る】

   プラクティスの実践

xp には14のプラクティス(実践項目)があります.それらを,今回の プロジェクトでどのように実行したか,をまとめます.

  1. 計画ゲーム

  2. ・(擬似)顧客を交えて,ストーリーカードを利用して行った.
    ・リリース計画は一回のみ.イテレーション計画は4回行った.

  3. 小さなリリース

  4. ・リリースは一回のみ.

  5. メタファー

  6. ・今回行わず(思いつかなかった)

  7. シンプルデザイン

  8. ・徹した.できるだけ明日への設計をしなかった.

  9. テスティング

  10. ・ユニットテストは,モデルクラスについてほぼ全クラス行った.
    ・servlet/jspについては,行えなかった.
    ・受け入れテストは,httpunitを用いて行った.

  11. リファクタリング

  12. ・適宜行った.

  13. オープンワークスペース

  14. ・席の並び替えを行い,できるだけ近くで作業をするようにした.
    ・オープンなスペースもあった.

  15. ペアプログラミング

  16. ・徹底して行った.すべての製品コードはペアによって書かれた.

  17. 共同所有権

  18. ・cvsを利用し,全員が自由に変更した.

  19. 継続的インテグレーション

  20. ・今回は統合マシンによる自動ビルドや自動テストは行えなかった.

  21. 週40時間

  22. ・結果的に達成できた.

  23. オンサイト顧客

  24. ・擬似顧客をオンサイトに置いた.ただし,週に2日のみ.

  25. コーディング標準

  26. ・オブジェクト倶楽部バージョンのコーディング標準を採用した.

  27. 日ごとのデータベース移行

  28. ・データベース製品は利用しなかったが,常に最新スキーマを用いた.

【戻る】

   イテレーションの記録

イテレーション終了時には、イテレーション評価をすると共に、 作業量や実装速度を算出しました。
また、イテレーション毎の感想等は、付録a.イテレーションの考察 を参照してください。

* リリース計画

--------------------------------------------
ストーリー名: 検索
データの一部を入力して,検索することができる.
見つかった人のデータを表示する.

・複数見つかれば一覧表示
・1名なら詳細表示
・0名なら登録画面となる
--------------------------------------------
見積り: 2理想週(10理想日)

--------------------------------------------
ストーリー名: 登録
登録画面から基本データを登録できる.さらに,
    患者,職員,検診患者
を選んで詳細を登録できる.画面フォーム,遷移は別途定義.
--------------------------------------------
見積り: 2理想週(10理想日)

--------------------------------------------
ストーリー名: 血縁検索
人物を選んで「1親等」内の人物をツリー表示できる.
ツリーは辿れる.
--------------------------------------------
見積り: 2理想週(10理想日)

全体で3週間,3イテレーションとする.
上から順に1イテレーション1週間とする.

我々の1週間の保有人日は,5名 x 1週間で5人週.
負荷係数として,2.5 を採用し,一週間で2理想週の作業を行う.

こうすると,ストーリー1つにつき一週間(1イテレーション)の計算
となる.

* 第1イテレーション

・イテレーションに入力されたストーリー
--------------------------------------------
ストーリー名: 検索
データの一部を入力して,検索することができる.
見つかった人のデータを表示する.

・複数見つかれば一覧表示
・1名なら詳細表示
・0名なら登録画面となる
--------------------------------------------
見積り: 2理想週(10理想日)

このストーリーは,途中で結局2つのストーリーになった.
--------------------------------------------
ストーリー名: id検索

人物のidを入力して検索することができる.
データが見つかった場合は情報表示画面に
データを表示する.
見つからなかった場合は,検索画面に戻る.
見つからなかったというメッセージを表示する.
--------------------------------------------
--------------------------------------------
ストーリー名: 条件検索

条件を入力して検索することができる.
検索結果を一覧表示する.

検索条件は,

ふりがな,氏名,性別,生年月日,電話番号,属性

の1つ以上の入力を and 条件で検索する.
条件が1つも見つからない場合,全件表示.
--------------------------------------------
見積り: 2つで2理想週(10理想日)


・ブレークダウンされたタスクと,見積り値
--------------------------------------------
第1イテレーション(7/3 - 7/9) 計画
--------------------------------------------
1. cvs 環境整備(0.5) ... done 7/4
    sh - 0.5
2. コーディング規約 ... done 7/4
    --- 
3. 画面設計,遷移  ... done 7/4
    ay(顧客)に任せる
4. 人物・患者等のモデルクラス作成(1.0)  ... done 7/5
    yt - 1.0
5. モデルストア(簡易csvファイルdbメカニズム)の仕組み(1.0) ... done 7/6
    kh - 1.0
6. 検索サーブレット(2.0) ... done 7/9
    sh - 1.0
    st - 1.0
7. 表示用jsp(1.5) ... done 7/9
    yt - 0.5
    st - 0.5
    kk - 0.5
8. html 検索フォームファイル(1.0) ... done 7/9
    kk - 1.0
--------------------------------------------

・メトリクス
==========================================
カテゴリ    クラス数      テストクラス数
---------------------------------------------
model          4           3
servlet        3           0
jsp            2           0
html           2           0
---------------------------------------------

==========================================
受入テスト数         3 件
---------------------------------------------
ユニットテスト成功   100%
受入テスト成功       100%
---------------------------------------------

==========================================
実時間: 1 週間 = 5 日/イテレーション
人数: 5名
ストーリの見積り: 10 理想日/イテレーション
全タスクの見積り: 7 理想日/イテレーション(=プロジェクト速度)
実作業人日: 25人日
負荷係数: 3.6
---------------------------------------------
3理想日あまったが,実際は作業がのびた.

* 第2イテレーション

・イテレーションに入力されたストーリー
--------------------------------------------
ストーリー名: 登録
登録画面から基本データを登録できる.さらに,
    患者,職員,検診患者
を選んで詳細を登録できる.画面フォーム,遷移は別途定義.
--------------------------------------------
見積り: 2理想週

・ブレークダウンされたタスクと,見積り値
--------------------------------------------
第2イテレーション(7/10 - 7/16) 計画
→ 結局,(7/10 - 7/17)となった.
--------------------------------------------
1. 患者・検診患者・職員クラス ... done 7/11
    sh - 1.0
2. 基本jsp + servlet ... done 7/17
   (基本情報・確認・エラー)
    kk - 1.5
3. 詳細情報 jsp + servlet ... done 7/17
    st - 1.5
4. mpilotmodelstore 修正 ... done 7/13
    yt - 1.0
5. person 修正  ... done 7/13
    sh - 0.2
6. servlet 修正・jsp修正 ... done 7/13
    yt - 0.3
7. 用語辞書(日英)  ... don 7/11
    yt - 0.2
8. 患者,人物,参照方向の変更 ... 7/12 追加・7/14 done
    sh
--------------------------------------------

・メトリクス
今回(前回)
==========================================
カテゴリ    クラス数      テストクラス数
---------------------------------------------
model          8(4)         7(3)
servlet       10(3)         0(0)
jsp            8(2)         0(0)
html           2(2)         0(0)
---------------------------------------------

==========================================
受入テスト数         5(3)
---------------------------------------------
ユニットテスト成功   100%(100%)
受入テスト成功       100%(100%)
---------------------------------------------

==========================================
実時間: 1 週間 = 5 日/イテレーション
人数: 4名
ストーリの見積り: 10 理想日/イテレーション
全タスクの見積り: 5.7 理想日/イテレーション
実作業人日: 20人日
負荷係数: 3.5
---------------------------------------------
人数が減ったが,タスクブレークダウン後の全
見積値も減ったのでこのまま進める.

* 第3イテレーション

・イテレーションに入力されたストーリー
--------------------------------------------
ストーリー名: 血縁検索
人物を選んで「1親等」内の人物をツリー表示できる.
ツリーは辿れる.
--------------------------------------------
見積り: 2理想週

・ブレークダウンされたタスクと,見積り値
--------------------------------------------
第3イテレーション(7/17 - 7/23) 計画
→ 結局,(7/17 - 7/20)となった.
--------------------------------------------
画面変更 + 不正入力チェック+エラー処理
1. 一覧画面 ... done 7/18
2. 基本入力 ... done 7/19
    sh - 1.0(上記2つ合わせて)
3. 詳細表示 ... done 7/19
    yn - 1.0
4. 検患入力 ... done 7/19
5. 職員入力 ... done 7/19
    kk - 1.0(上記2つ合わせて)
6. 入力確認 ... done 7/18
    st - 1.0
7. mpilotmodelstore ... done 7/18
8. person ... done 7/18
9. mpilotutil ... done 7/18
    yt - 1.0(上記3つ合わせて)
10. xmlgenerator(クラス,サーブレット) ... done 
    yt - 1.0
--------------------------------------------

・メトリクス
今回(前回)
==========================================
カテゴリ    クラス数      テストクラス数
---------------------------------------------
model          9(8)         8(7)
servlet       12(10)        0(0)
jsp            9(8)         0(0)
html           5(2)         0(0)
---------------------------------------------

==========================================
受入テスト数         5(5)
---------------------------------------------
ユニットテスト成功   100%(100%)
受入テスト成功       100%(100%)
---------------------------------------------

==========================================
実時間: 0.8 週間 = 4 日/イテレーション
人数: 5名
ストーリの見積り: 10 理想日/イテレーション
全タスクの見積り: 6 理想日/イテレーション
プロジェクト速度: 6 理想日/イテレーション
実作業人日: 20人日
負荷係数: 2
---------------------------------------------

* 第4イテレーション(予定外)

・イテレーションに入力されたストーリー
--------------------------------------------
ストーリー名: ソート
検索結果をソートする.ソートは,あいうえお順,
生年月日順.
--------------------------------------------
見積り: 2理想日
--------------------------------------------
ストーリー名: ログイン
ユーザは,セッションに入るためにidとパスワードで
ログインする.一度ログインしたら,もうログインの
必要はない.
--------------------------------------------
見積り: 3理想日

・ブレークダウンされたタスクと,見積り値
--------------------------------------------
第4イテレーション(7/23 - 7/31) 計画
→ 結局,(7/23 - 7/25)となった.はやく終った.
--------------------------------------------
1. (ソート) list.jsp ... done 7/25
2. (ソート) categorysearchservlet .. done 7/25
    st - 1.5(上記2つ合わせて)
3. (ログイン) search.jsp(search.html)
    リンクまわり/セッションまわり ... done 7/25
4. (ログイン) loginservlet ... done 7/25
    yt - 1.5(上記2つ合わせて)
5. (ログイン) user.java, mpilotmodelstore ... done 7/24
    kk - 1.5
--------------------------------------------

・メトリクス
今回(前回)
==========================================
カテゴリ    クラス数      テストクラス数
---------------------------------------------
model         11(9)         9(8)
servlet       13(12)        0(0)
jsp           12(9)         0(0)
html           8(5)         0(0)
---------------------------------------------

==========================================
受入テスト数         5(5)
---------------------------------------------
ユニットテスト成功   100%(100%)
受入テスト成功       100%(100%)
---------------------------------------------

==========================================
実時間: 0.6 週間 = 3 日/イテレーション
人数: 4名
ストーリの見積り: 5 理想日/イテレーション
全タスクの見積り: 4.5 理想日/イテレーション
プロジェクト速度: 4.5 理想日/イテレーション
実作業人日: 12人日
負荷係数: 2.1
---------------------------------------------

* 全体

==================================
実作業人日           77
製品クラス数         44
製品loc            7314
テストloc          1655
全loc              8969
製品loc/人月       1899
全loc/人月         2329
==================================
( loc = line of code  コメント・空行ぬきの行数 )

※全作業時間の80%がペアプログラミング時間となっていた。




プロジェクト速度が一定していないのは,イテレーションによってメンバーの増減や利用可能日数が違った ため.ストーリー見積とタスク見積(プロジェクト速度)が一致しないのは,ブレークダウンにより問題がよ り簡単であることが分かったため.本来一致すべきだが,メンバーの増減があったため,余分のタスクを入 れなかった.負荷係数は,通常のxpでは3程度から始めることが推奨されている. 今回は最初は 3.6 であり、最終イテレーションでは 2.7 になった. 結果的に徐々に下がったことになる.




クラス数には,servlet/jsp/htmlのすべてを含む. ユニットテストは,モデルクラス(servletやjsp以外のjavabeans)にしか用意しなかった. 受け入れテストは,全体をカバーするだけの工数が顧客に足らなかった.



   風景

サンプル画像
画面遷移はこんな感じ。必需品です。
いつも、この図を使って討論していた。


サンプル画像
sh:「見られるとパンチし辛いなあ....」(^-^;
   「 (ムム!) 間違っちゃったよ!..」(t-t)

kk:「 .... 」(@_@)


サンプル画像
yt:「疲れてきたよぉ~」

st:「お菓子ありますよ。食べます?」

yt:「食べゆ~♪」


サンプル画像
「プロペラ帽」はハッカーの印、トリッキーなコードを書いた人はこれをかぶらないといけない.


サンプル画像
タスクはこんな感じ。終わったものは消し込む。



 「やったあー!」
 「第3イテレーションまで終わったぞお。」\(^o^)/



 「最近、慣れてきて[スイスイ]って感じ!」\(^-^)\


画面のサムネイル
クリックするとhtml版が見れます.画面を表示した場合は、ブラウザーのプルダウンメニューで前画面に戻ってください。

ログイン画面 条件検索画面 一覧表示画面 詳細表示画面 基本情報登録画面 患者情報登録画面 健診患者情報登録画面 職員情報登録画面 登録確認画面


【戻る】


   感想(アンケート結果より抜粋)

***********************************************************
  ■ xpプラクティスの評価(5段階 - 0=無効, 5=有効)
***********************************************************

プラクティス名5段階評価
計画ゲーム(タスク挙げ、サインアップ、見積)***3.4
シンプルデザイン(設計を固定せず、随時変更)***2.6
ペアプログラミング****4.0
テスティング(ユニットテスト)****4.2
テスティング(受け入れテスト)***2.6
リファクタリング*****4.7
コードの共同所有****4.0
週40時間****4.0
オンサイト顧客******4.5
コーディング標準****4.0
*********************************************************** ■ 良かった点 ***********************************************************
  • 毎朝、全員参加して各人の作業確認ができた。(stand-up meeting)
  • 全員が意見を出してイテレーションができた。
  • 達成感が得られ易かった。
  • コミュニケーションがとれて和気あいあいとした雰囲気だった。
  • 楽しく仕事ができた。
*********************************************************** ■ 改善すべき点 ***********************************************************
  • 1イテレーション=1週間としたが期間が短かった。
  • バランス良く全体に関われるようなタスク分担をすべきだった。
  • もっとコミニュケーションを取るべきだった。
  • ペア相手に頼り過ぎだった。

【戻る】

   最後に

マネジャとコーチからの感想です.

■(sh: マネジャ)
本プロジェクトで初めてxpを体験する人ばかりでしたが、 コーチの指導の下でペアプログラミングテストファーストなど. 多くの手法を楽しく学べたことが非常に良かった と思います。今回でxpのすべてを実践した訳ではないですが、今後のプロジェクトに 役立つことは間違いないと確信しました。

■(kh: コーチ/トラッカ)
今回のプロジェクトで気付いたことを,ポイント毎にまとめてみま す.

  • 知識の伝搬
    今回の発見の1番は,ペアプログラミングによる知識の伝搬の速さ です.ツールにしろプロセスにしろ,今回ははじめての要素だらけ でした.今までの開発であれば,ツールの利用方法のドキュメント をまとめたりしていたのですが,実はそんなことは肝要ではなく, ペアになって作業を通して理解を伝え合う方がよっぽど効率的です.
  • プランニング
    xpプロジェクトを起動に乗せる上でもっとも重要なのは,イテレー ションミーティングだと感じました.特に,このミーティングの司 会を首尾よく行うことには,経験とスキルと信頼,が必要です.

    また,xpに対する批判として,「スキルの高いチームであることが 必要条件ではないのか」というものがあります.今回は全体的に高 スキルとは言えないチームです.しかし,「予測可能な進捗」(速 い進捗ではない)を得ることができ,見積の精度は非常に高かった といえます.これは,マネジャにとって低リスクというメリットが あるでしょう.

  • 先行型設計と進化型設計
    データベースとなるクラスの設計を途中で大きく変更しています. 実際,途中で大きなリファクタリングが起こり,そのために一日以 上がつぶされました.もしかしたら,最初にしっかりとモデリング を行えば,この作業は不要だったかもしれません.ただ,本当にそ うだったかは,誰にもわかりません.私たちは必要になった時点で それを行った,ということは言えます.

    ただ,あまり頻繁にそれが起こるのは辛いだろう,という印象は持 ちました.

  • マネジャとコーチの役割
    マネジャとコーチは,障害物をどけてまわることが一番大事な役割 です.つまづいているペアがいたら,相談にのって,つまづいてい る小さな石をどけること.これが全体を前にすすめるコツでした.
  • 中心的プログラマ
    自然発生的に,リーダーシップをとり,全体にアドバイスを与える ことができる中心的プログラマが出現しました.彼女は全体のバラ ンスを見ながら構造に関しての一貫性をシステム全体に浸透させま した.もしかしたら,xpでアーキテクチャが自然発生するように, 「アーキテクト」という役割も自然発生するのかも,と考えています.
  • junit
    junit によるユニットテストは非常にうまく機能しました.最後ま でmodelのユニットテストは 100% をキープしました.ただ, servlet/jsp のよいユニットテストの方法を発見できませんでし た.servlt/jsp からはできる限りロジックをmodel のコードに追 い出す,という戦略を取りました.
  • ant/cvs
    この組合せでの構成管理は,大成功と言えるでしょう.第1イテレー ションで全員が使い方をマスターしたことは,ペアプログラミング の効用でもあります.
  • テストファースト
    残念ながら,あまり浸透しなかったようです.アイディアは前もっ て布教したのですが,やはり,製品コードを先に書き,テストす る,という方が「楽」に感じたようです.先にテストを書く,とい うのには,面倒な印象があり,結果としては定着しませんでした.
  • オンサイト顧客
    そこに顧客がいる,というのは,いつでも質問でき, 曖昧な仮定のままでプログラミングを行わないでよいという利点が あります.通常の方法で開発を経験しているプログラマからも,この 点は大きなメリットとして指摘されました(現実問題としてできるか, というのは置いておいて).また,顧客がテストを決めるとなると, 顧客の負荷もかなり大きいことは事実です.今回は時間がなくて 受け入れテストの数が足らないことが残念でした.
  • 新人育成の場としてのxp
    今回は,このプロジェクトには新入社員のojtの場としての役割も ありました.私自身は,今回の結果に非常に満足しています.新人 が,仕事のやり方,言語,ツール,進捗報告,などソフトウェア開 発に一通り必要な能力を,複数の人とのコミュニケーションの中で 獲得することができたからです.彼女は常にタスクをコミットして いましたし,通常のojtにありがちな,「放っておかれる」という 状況がありませんでした.
  • 温室プロジェクト
    今回のプロジェクトは,契約,予算,納期,実際の顧客などという 実プロジェクトではクリティカルな要素がほとんどない,ある意味 で温室プロジェクトであることは告白しておくべきでしょう.全体 が和気合い合いとした雰囲気の中でできたことは,xpという手法 以上に,このことが大きいと感じています.

【戻る】

以下,各イテレーションで出た生の感想,生のアンケートデータなどです.


   付録a.イテレーションの考察

第1イテレーション

  • ant/cvs
    • cvsで,フォルダの追加/削除は鬼門だ. プロジェクトが少し混乱した.(sh)
    • テストまで含めた build.xml がまだできていない.(sh)
    • model と servlet で build ターゲットを分けたが, その御蔭でservlet をコンパイルすると*必ず* model がコンパイルされてしまう. よい方法は? (sh)
    • 見積り意識しなかった. 次のイテレーションでは見積りの感覚を掴みたい.(kk) (新入社員)
  • 開発
    • ペアプロは緊張感が持続してよい.(yt)
    • タスクが完成した,と言えるのはいつなのかがはっきりしない.(yt)
    • ・ペアプロは楽しい.リファクタリングの仕方など勉強になった.(st)
    • テストコードを書くのは難しい.次からはうまくできる.(st)
    • servlet のテストは難しい.今回,cuctas は不採用.httpunit の受け入れテストで併用.その代わり,servlet/jsp にはロジック は持ち込まず,model に追い出す.(kh)
    • 全体的にテスト不十分.日付や年齢の境界値とかやっていない.
    • テストのドキュメント書かないの? デフォルト xp では書かないが,ユーザが欲しいといえば, それをタスクとして追加.
    • ちょっと,進捗が遅い気がする.入社1-3年が主体なのでしょう がないか...それともペアプロの負荷?
  • 受け入れテスト
    • 受け入れテストを httpunit で作ったが,結局動くコードを見なが らテストを作ってしまった.(kh)
    • 初期テストデータは,ファイルで格納してそれに依存したテスト になってしまったが,本来ならテストの中で初期テストデータも作るべき.(ay)
    • 受け入れテストの初期データ,どうしよう... 「登録」ストーリーが出来たら,検索と対にしよう.
    • 受け入れテストは難しい.見た目をコードでチェックするのは難しいし, レイアウトデザインの変更でテストが変更になるのは苦しい. あまりレイアウトに敏感でないテストがよい.(ay)


第2イテレーション

  • もともと10 ポイントのストーリーであるが, 実質持っているポイント数(プロジェクト速度)は 6 である. すなわち,4人が一人 1.5 ポイントずつ持っている. ちょっと厳しいと思いながら見積もったが, 全タスクを総計すると 5.7 でぎりぎり収まった. すなわち,「10ポイントだ」と予測していたストーリーを, 少ない資源でやらなくてはならなくなったが,再見積もりしてみると, なんとか収まった,という状況.
  • 途中で,モデルのビッグリファクタリングが入った. 基本情報と詳細情報の参照方向の逆転. おそらく,最初にモデリングを行っていればこのリファクタリングは 避けられたのではないか.
  • モデルに非常に頻繁に修正が入る. 今回も,その御蔭でだいぶ作業が膨れた. やはり,初期にある程度モデリングしないと辛い?
  • 画面遷移図を模造紙に書いてはった. みんなが参照する図を貼る効果は高い. 議論をする時には,必ずそれを指さす.
  • 日本語で議論して,英語でコーディングするので名前付けが どうしても一貫性を欠いてしまう. そこで,日英用語辞書を作る,というタスクを作った. しかし,うまく運用されなかったようだ. 結局,登録日,生年月日などの「日付」に使う英語が, day と date で 2つ出て来てしまった.
  • イテレーション最終日に「日付」に対応する英語を全体的に date に統一した. この作業は,ytが終業後,2時間で行った.これはいいこと? 悪いこと?
  • 結局,一日オーバーしてしまった. 偶然,次のイテレーション会議が1日延びたので,遅れは健在化しなかった. しかし,見積と実績の差異理由については,みんなの意見を聞いた.
          2. 基本jsp + servlet ... done 7/17
             (基本情報・確認・エラー)
              kk - 1.5
    
    これが,結局は 1.5 -> 3.0 に膨れた. 画面まわりの作業は,これから少し慎重に見積もるべきだ.
  • 受け入れテストは,まだテスト数が少ない. しかし,主要な画面遷移を一順している,長いテストがある. これは testxxxxx()メソッドを分けるべきか? (そうすると順序制御が必要になったり,テスト間依存ができてしまう)
  • 「登録フォーム」--(登録ボタン)-->「確認画面」--(確認ボタン)-->終了 という画面遷移で,終了後,ブラウザの「戻る」ボタンを使うと,確認ボタンに戻り, そこで「確認」ボタンを押すと再度登録されてしまう. 「確認画面」を meta タグで no-chache とし, さらに確認ボタンでセッションをクリアするようにした.これって,一般的?
  • form の送信ボタンを2度素早く押す,という操作に対してのガー ドは一般的にどうするのだろう.
  • レイアウトにボーダーなしテーブルを多用し,幾つかの背景色を 使っている.色調を統一するために,色使いを統一したい.一般的 にはどうするのか? jsp で,bgcolor=<% getproperty("color1") %> などと間接化するんだろうか.
  • junit3.7 で,assert() は deprecated とされ,asserttrue() を使うようになった.これって,jdk1.4 で assert がキーワード になったからか !? assert を今ごろキーワードにするなんて, ちょっと横暴じゃないかな.
  • cvs diff で,-d オプションに文字列が入れられることを発見. yesterday とか,2 hours ago などがオッケー.何時間前のバー ジョンと比べることができて便利.
          % cvs diff -d "yesterday"    
    など.wincvs でも,日付チェックボックスでこれに対応している.
  • jsp が長くなる傾向にあったため,良く使うユーティリティメ ソッドを,util クラスに入れた.


第3イテレーション

  • 今回は早くタスクが終ってしまった.空いた時間は調整+リファ クタリングを入れていた.
  • 血縁関係のツリーを,flash で表示する,という案が顧客から出 た.そのために,xml でデータを返すサーブレットを作る.
  • 顧客が忙しくなり,flash は今回は止めることになった.
  • yn が新しく加わった.
      実質作業工数は,4日 x 5名 = 20 人日.
      見積は6理想人日の作業なので,負荷係数は,3.3.
    
    すなわち,理想見積を3.3倍して作業していることになる.


第4イテレーション

  • 今回も早くタスクが終ってしまった.
  • 実質作業工数は,4日 x 3名 = 12 人日.
    見積は 4.5 理想人日の作業なので,負荷係数は,2.7
    見積比で効率が上がっている.
  • 全 jsp の先頭にログインチェックを入れた. include を始めて使って見る.
  • java.utils.collections のソートを駆使する.

【戻る】

   付録b.アンケート集計結果

プロジェクトメンバ紹介

----------------------
(1) 氏名
(2) 役割
(3) 開発経験(自己紹介)
----------------------

(1) yamamoto(以下 ay)
(2) 顧客
(3) プログラムを書き始めたのは高校1年から、学校にあったtk-80bsを使い
    tinybasicで遊んでました。記憶デバイスは300bpsのオーディオテープしか
    なくて大変でした。ですから開発経験は20年ってことになります。
      これまで手を出した言語は、basic、アセンブラ、cobol、fortran、c(c++)、
    lisp、prolog、pascal、javaと一通りやってきました。使い込んだ言語と
    しては basic、アセンブラ、cobol、c(c++)、pascalですが、最近はcobolと
    pascal(delphi)が中心です。
      javaも興味があって少し手を出しかけたのですが、時間が無くて開発経験と
    呼べるようなものはありませんでした。今回少しいじってみて、ある程度判っ
    てきたように思います。文法がcと大差ないので、java特有のコツがもう少し
    判れば何とかなりそうです。

(1) 花田臣二(以下 sh)
(2) マネジャ、プログラマ
(3) cobol開発:17年
    java開発 :基礎教育程度の知識

(1) 平鍋健児(以下 kh)
(2) コーチ,トラッカ
(3) c, c++, java, pascal など一通りの言語経験あり.
    プロジェクト管理,オブジェクト指向設計,アーキテクト,コンサ
    ルティングなど.

(1) 中谷(以下 yn)
(2) プログラマ
(3) 高校の時、プログラム電卓でゲームを作ったのが最初。
    以後、約20年間で basic, c, java, c++ 等を経験。
    主にos(unix), cad, caseツールの開発に従事。

(1) yt
(2) プログラマ
(3) 入社 3年目。javaでの開発はもうすぐ 1年。
    サーブレットや jsp にも慣れてきて、
    java“らしい”プログラミングがやっと分かりはじめたところ。

(1) st
(2) プログラマ
(3) 開発経験1年、java歴半年の初心者プログラマです。やっとjavaでの
    プログラミングに慣れてきたかんじですが、設計する力がまだ
    全然ないなって感じてます。

(1) kk
(2) プログラマ
(3) なし。言語教育で、初めてc、javaの言語を学びました。



mpilotプロジェクトで、もっとも苦労したと思う点はなんですか?

  • テストを書くのがしんどかった。(ay)
  • java言語(基礎知識のみなので、model,clone,list,sort...etc)(sh)
  • エディタ(meadow)が不慣れなので大変に苦労した。(今だにうまく使えない!)(sh)
  • ネーミングが難しい。(英語力の問題か?)(sh)
  • 朝のミーティングが長くなりがち(→スタンドアップにすべきだった).(kh)
  • 以下について,ある程度初期デザインした方が,全体効率はよかったかも.
    1. セッションの管理についての指針.セッションローカルとなる 変数名やクラスによる構造化の指針.(グローバル変数と同等なので)
    2. データベースレコード
  • sybase(dbms)のインストールに、ちょっとしたコツが必要だったこと。(yn)
  • 修正がこまめに入ったこと。
    以前のプロジェクトでは、dbの関係上、最初に慎重な設計をして、それでも変 更になった場合には、できるだけ少量で済む修正を入れていた。今回は、修正 に対し「かかってこい」の態度だったので、初期にしておくべき考慮をほとん どしなかったと思う。(yt)
  • ブラウザの「戻る」ボタンで画面遷移することによって、
    2度登録できてしまったこと。 結局どうにもできなかった。
  • ペアを組む相手に声をかけるのが難しかった。(kk)


xpプラクティスを実践してみて、どう思いましたか?

● 5段階評価の平均値

プラクティス名 評価
計画ゲーム(タスク挙げ、サインアップ、見積) 3.4
シンプルデザイン(設計を固定せず、随時変更) 2.6
ペアプログラミング 4.0
テスティング(ユニットテスト) 4.2
テスティング(受け入れテスト) 2.6
リファクタリング 4.7
コードの共同所有権 4.0
週40時間 4.0
オンサイト顧客 4.5
コーディング標準 4.0

● 各プラクティスに関する感想・コメント

◆ 計画ゲーム(タスク挙げ、サインアップ、見積)

  • 核となるメンバで行った方が良いかもしれない。(タスク挙げ、見積など)(sh)
  • 司会者の技量となれが必要.(kh)
  • サインアップをすることで,やる気がでる.(kh)
  • 見積もりは2回目からかなり自信がでる.(kh)
  • ついつい慣れたタスクばかり選んでしまった。もっとバランスよくサインアップす べきだった。(yt)
  • 自分がどの程度の時間でできるのかがつかめず、タスクを率先して選ぶことができ なかった。(kk)

◆ シンプルデザイン(設計を固定せず、随時変更)

  • シンプルさの基準が解らない。(sh)
  • 自分が使っている既存のコードが頻繁に変更されると戸惑う。(コミュニケーショ ン不足の問題か?)(sh)
  • 手戻りが多過ぎ.(kh)
  • 将来、必ず必要になる機能(例: dbアクセス機能)でも後で追加した方がよいのだ ろうか?(yn)
  • 最初はちゃんと設計した方がよい。(モデル間の参照方向が2イテレーションめに変 更され、作業が増えてしまった。)(yt)

◆ ペアプログラミング

  • (自分の役割は顧客だが)やってみたかった。(ay)
  • 一方が主導権を持ってしまう傾向がある。(sh)
  • 一人でやるより疲れる。(説明しながらパンチしている。)(sh)
  • 見ていると違うことを考えてしまうことがある。(集中力が薄れる?)(sh)
  • ずっとペアプロするのは難しい。調査時や考えをまとめるときはプレッシャーにな る。(sh・st)
  • 教育的効果が高い.(kh)
  • ジュニアが指摘するミスとシニアが指摘するミスの数は変わらない.(kh)
  • 楽しい.(kh・yn)
  • 最初は面倒と思っていたが、実際にやってみて良さが分かった。コンパイルしなく ても相棒がエラーを見つけてくれるのがよい。 コンパイルエラーより優しいし音声だし。(yn)
  • 勉強になる。(yt)
  • 変数名の付け方が丁寧だった。(yt)
  • 緊張した。(st)
  • リファクタリングなど勉強になることがいっぱいあったが、ずっとペアで プログラミングしていると、たまにはひとりでやりたいと思うこともあった。(st)
  • ほとんどが、見ているだけの状態であったが、とても勉強になった。(特 にエディタの使い方)(kk)

◆ テスティング(ユニットテスト)

  • モデルでは十分に確認できている。サーブレットでは現状のままでは不十分。(sh)
  • これを全クラスに用意できるとよかった.(kh)
  • サーブレット/jsp のテストは難しい.モデルにロジックを逃がしたり、 doget()/dopost()以外のメソッドに処理を出すなどの工夫が必要.(kh)
  • 楽しい.(kh)
  • システムが大きくなると、テストへの修正だけで負担がかかるように思う。(yt)
  • 実装してすぐテストをすると、デバッグを早くできてよい。(st)

◆ テスティング(受け入れテスト)

  • 受け入れテストを顧客が作るというのは問題がありそうに思う。(ay)
  • なんで、受け入れテストはペアプロじゃないの?(ay)
  • テスト内容も解っていないので、評価できないのが正直な所です。(sh)
  • 顧客が全部用意するのは大変.非常に労力がいる(kh)
  • httpunit は非常によい.(kh)
  • ついつい手でテストして終りにしてしまう. 再現可能なテストコードとして残すのは手間がかかる.(kh)

◆ リファクタリング

  • 実は、結構好きなんですリファクタリング。 自分の仕事でリファクタリングやりすぎて時間が足りなくなったりするんで、 どこで歯止めを掛けるかが問題かも。ただし、リファクタリングの前提としては、 しっかりとテストが書かれていることが前提として必要なのでは?(ay)
  • システム規模やリファクタリングに当てられる時間によっては、 なかなか難しいと思う。(sh)
  • ペアプロをしながら,リファクタリングをジュニアに伝授することが できてよかった.(kh)
  • 大規模リファクタリングは,全体を一旦フリーズして行った. (定時後に一名がやってしまう)
    - 例: ユーティリティクラスの名前の変更.
    これはよかっただろうか.現実にはこれがいいと思う.(kh)
  • “この部分がリファクタリングできる”と思い付いた時が快感。
    でも、リファクタリング後に“前の方がよかった”と気付くこともあるので、 週40時間(実際に取り掛かる前に時間を置ける)と cvsの利用(前の版に戻せる) は不可欠。
  • コードがすっきりして気持ちがいい。(st)
  • コードが短くなっていく様子を実際にみることができ、リファクタリング のすごさが実感できた。(kk)

◆ コードの共同所有権

  • コミュニケーションをしっかりとらないと難しい。(sh)
  • 結果的に,ほぼ守れた.(kh)
  • 特別な意図があって書いたコードには、ちゃんとしたコメントを書かなく ては危険だと思った。(つぶされてしまう可能性がある。)(yt)
  • cvsで格納の際にうまく処理できず、ファイルを壊してしまうことがあった。(kk)

◆ 週40時間

  • マネジャには他の仕事もあるので難しい。(kh)

◆ オンサイト顧客

  • (顧客からの感想 -- ay)  オンサイト顧客という立場もなかなか難しいものがありました。 自分の仕事を抱えたままでしたので、十分に役割が果たせたとは言え ませんし、要求の優先順位がうまく伝わらなかったこともありました。

     xpでのオンサイト顧客のプラクティスについて思ったこと

    • 要求(特に細部での仕様)を即座に伝えられることで、仕様の 不足や無駄を修正しやすいため、最初に細部の仕様の決定に長 い時間を割かなくても良い。
    • 顧客要求を熟知した人物がオンサイト顧客として得られるかが 大きな問題であり、オンサイト顧客となった個人にプロジェクト が左右されやすい。
    • 受入テストは開発側が作成し、顧客が検収するべきだと思う。 受入テストの修正も必要となるようなストーリ変更が出せなくなる。
  • 疑似顧客だったが,すぐに質問に答えられるのは全体の効率を著しく上げる.(kh)
  • すぐに質問できるのは進めやすかった。(yt)

◆ コーディング標準

  • ペアのどちらかがコーディング標準を熟知している場合しか、 ちゃんと機能していなかった。(yt)


作業スペースとして、よかった点・改善すべき点があれば教えて下さい。

  • 専用のホワイトボードがあるとよかった。(yt・kk)


うまく書けたと思うコードはどの部分ですか?
    また、うまくリファクタリングができた箇所などもあれば教えて下さい。

  • acceptanceのhumanlist classやmpilottest classで書いたコードは面白かった。
    特にmpilottest classのcellstringhasは最初書いたコードでは、 行と列がテーブルに含まれるか調べてからセルをテストしていたので コードが単調で汚く、非効率だったのがうまくリファクタリングできたと自分では思っています。(ay)
         リファクタリング前
         boolean cellstringhas(webtable wt, int row, int col, string keystr) {
         if (row >= 0 && row < wt.getrowcount() 
         && col >= 0 && col < wt.getcolumncount())
           return stringhas(wt.getcellastext(row, col), keystr);
           return false;
         }
    
         リファクタリング後
         boolean cellstringhas(webtable wt, int row, int col, string keystr) {
         try {
         return stringhas(wt.getcellastext(row, col), keystr); 
         } catch(indexoutofboundsexception ex) {
         return false;
         }
         }
    
  • mpilotmodel.issame()メソッド:ポリモーフィズムを利用できた。(yt)


どんなところを改善した方がよいと思いますか?

● xpに関して

  • 受け入れテストのことを考えると、htmlではなくxmlとxslで 画面を作るように持っていきたいですね。
    今のままでは、画面デザインを変えるたびに受け入れテストを画面に合わせなければ ならないので(ay)
  • 少し大きな単位で分担した方が、担当者間の独立性があるのではと思う。
    (1イテレーション=2週間程度として、その間はペアを変えないで実施した 方が良いかもしれない。)(sh)
  • 自分としては、もっとコミュニケーションをとるべきだった。(kk)
  • ペアの相手に頼りすぎてしまった。(kk)

● mpilotプロジェクトに関して

  • modelstoreの実装が多すぎるように思う。(sh)
  • 日付の入力で"/"不要(例: 20010727)とした方がよいと思う。(yn)
  • build.xmlにjavadoc機能(ant javadoc)を追加した方がよいと思う。(yn)
  • javadocのコメントを、しっかり書いた方がよいと思う。(yn)
  • meadowでファイルの最後に空行を入れない設定をしていない人がいるようなので 設定した方がよいと思う。(yn)
  • バランスよく全体に関われるようなタスク分担をすべきだった。(yt)


感動した出来事やコードがあれば教えて下さい。
    また、「今回勉強になった」と思うことがあれば教えて下さい。

  • 感動したというか勉強になったというか...
    インターフェースを関数の中で定義してパラメータとして渡せるって事が判って、 面白かったですね。
    cやpascalでは引数として関数(のポインタ)を渡したりはしますが、 ここまでの柔軟性はないと思います(ay)
         acceptanceのhumanlist classより
    
         public interface humanpredicate {
               public boolean istrue( human hu );
             }
    
         上記のインターフェースを引数としてループ内で使用する
    
         public int indexwith(int index, humanpredicate predicate){
                                         ~~~~~~~~~~~~~~~~~~~~~~~~
           for(; index < size(); ++index)
             if ( predicate.istrue( (human)get(index) ) )
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               return index;
           return -1;
         }
    
         public humanlist getlistwith(humanpredicate predicate){
                                      ~~~~~~~~~~~~~~~~~~~~~~~~
           humanlist hulist = new humanlist();
           for(int i = 0; (i = indexwith(i, predicate)) != -1; ++i)
                              ~~~~~~~~~~~~~~~~~~~~~~~
             hulist.add( getof(i) );
           return hulist;
         }
    
         public humanlist getlistwithkana(final string kana) {
           return getlistwith(            ~~~~~~~~~~~~~~~~~
             new humanpredicate() { 
               public boolean istrue(human hu) {
                 return (hu.kana.indexof(kana) == 0); 
               }                         ~~~~ここに注目
             } 
           );
         }
    
         何に感動したか判ってもらえます?
         indexwithとgetlistwithは簡単に使い回せるってところがミソですね
         そして、getlistwithkanaのようにfinal宣言されたパラメータを条件
         判断に利用できてしまう所も大きなポイントです。
    
  • ユニットテストを理解できたこと。(sh)
  • antによる自動化ができたこと。(sh)
  • cvsによるマスタ管理がよかった。(sh)
  • 二人組が,テストをパスさせて手をパチパチ叩いている姿.(kh)
  • コーチがお菓子を支給していたが, しばらくすると全員がお菓子を持ち寄るようになったこと.(kh)
  • ツールの利用方法などが,ペアプロを通してスムーズかつ高速に伝搬すること.(kh)
  • タスクやキーとなる画面遷移を模造紙に書いて壁にはったこと.(kh)
  • wincvsの使い勝手がよかった(例: 変更したファイルの色が変わる)こと(yn)
  • ユニットテストでバーが緑になったこと。(yt)
  • リファクタリングのし方が分かった。(yt)
  • やっとポリモーフィズムの便利さがわかった。(yt)
  • interface を new して無名クラスのコンストラクタを作ることができるということがとても勉強になった。(st)
            collections.sort(persons, new comparator(){
                                      ^^^^^^^^^^^^^^^^
                     public int compare(object o1, object o2){
                     }
            });
    
  • また、リファクタリングが勉強になった。これから積極的にリファクタリングすることを心がけたい。(st)
  • リファクタリングによるコードの短縮。(kk)
  • junitによるテスト。(kk)


どんなところに心残りがありますか?

  • flash作る暇が無かった(ay)
  • antをもっと活用したい。(javadocなど)(sh)
  • servlet/jsp のテスティング.(kh)
  • 受け入れテストの数が足りない.(kh)
  • 継続的インテグレーションができなかったのは惜しい.統合用マ シンで常にビルドとテストを走らせなければならなかった.(kh)
  • インテグレーションのシリアライズのために,統合マシンを用意 することをしなかった.cvs でそれぞれ単体テスト終了でコミット してしまった.(kh)
  • 結果的に 40 時間を達成できたのは,本当の顧客や本当の契約に よるプレッシャーが無かったからかもしれない、というわだかまりを感じる.(kh)
  • dbアクセス機能を実装する前にプロジェクト異動となったこと。(yn)
  • ダイエット中で、お菓子が食べれなかったこと。(yn)
  • ネーミングルール・コーディングルールがちゃんと適用できなかった。(yt)
  • セッションにログインフラグを立てるのでなく、ログイン名を保持させればよかった。(yt)
  • 新人さんにもっとコードの意味をこまかく説明すればよかった。(yt)
  • 計画ゲームのタスク挙げにあまり参加できなかった。 設計する力をつけたい。(st)
  • タスクを振り分けるときに、自分から全く発言できなかったこと。(kk)
  • わからないところ、動きをもっと質問するべきだった。(kk)
  • 全体の動きを把握できていなかった。(kk)


なにか感想があれば、教えて下さい。

  • javaって結構面白かったです。いままで、あまり良い印象が無かったんですが。
    今度はプログラマーとして参加してみたいですね。(ay)
  • 毎朝の会議は、全員が参加して各人の作業を確認することができて良かった。(sh)
  • 全員が意見を出し合って完成できたことが良かった。(sh)
  • 終了の飲み会しなきゃね.(kh)
  • プロジェクト途中で異動となり心残りですが、是非よいものを作ってください。(yn)
  • 達成感が得られやすいプロジェクトだった。
    テストのおかげもあるし、結果が目に見えやすい開発でもあったからだと思う。(yt)
  • コミュニケーションがきちんと取れて、和気あいあいとした雰囲気だったので 楽しく仕事ができてよかった。(st)
  • 今回は、隣で見ているだけでも、精一杯でした。(kk)

fin