表1 ●XPの12の実践項目(プラクティス) |
No | 実践項目 | 概要 |
1 | 計画ゲーム(The Planning Game) | ビジネスの優先度と技術的判断から、次回リリースの計画を立てること |
2 | 短期リリース(Small Releases) | 小さなシステムでいいから、新バージョンのソフトウェアを短期間にリリースすること |
3 | メタファ(比ゆ)(Metaphor) | ソフトウェアの動きや仕組みを、何らかのたとえとしてメンバー間で共有すること |
4 | シンプルな設計(Simple Design) | 本当に必要な機能だけを設計すること |
5 | テスティング(Testing) | 単体テストと機能テストを繰り返し行うこと |
6 | リファクタリング(Refactoring) | ソフトウェアの動作を変えることなく、コードをきれいにすること |
7 | ペア・プログラミング(Pair Programming) | 二人のプログラマが1台のマシンを使ってコーディングすること |
8 | 共有所有(Collective Ownership) |
開発メンバーの誰もがコードを変更できるようにすること |
9 | 継続的な結合(Continuous Integration) | 1日に最低1回でも結合(ビルド)を行い、テストを必ずパスさせること |
10 | 週40時間労働(Forty Hour Week) | 開発にかかる労働時間は、一週間に40時間とすること |
11 | オンサイト顧客(On-site Customer) | ユーザー(顧客)を開発にフルタイムで参加させること |
12 | コーディングの標準化(Coding Standards) | コーディングのルールを定めること |
Mizuho’s Web Site Copyright 2004 All rights reserved
![]() |
・・・ |
リリースn |
リリース2 |
![]() |
リリース1 |
リリース |
![]() |
![]() |
運用/メンテナンス |
テスト |
プログラミング |
![]() |
分析/設計 |
図1●「ウォーターフォール型開発」と「繰り返し型開発」 |
(b)繰り返し型開発 |
(a)ウォーターフォール型開発 |
![]() |
![]() |
ポイント |
●ディスプレイ、キーボード、マウスは共有 ●一人はコードを入力、もう一人はコードの方向性を検討する(ただし、役割固定ではない) ●二人の会話全体で作業を進めること |
図3 ●ペア・プログラミングのイメージ |
ますが、実際にやってみると、プログラミング作業が賑やかになって楽しくなるなど、さまざまなメリットが得られるようです。中でも大きいのは、コード品質の向上とコミュニケーションが円滑になることです。
ペア・プログラミングでは、会話主体で作業が進みます。二人のプログラマのスキルがまったく同じということはないでしょうから、ベテランと新人が組めば教育的効果があるでしょう。逆にベテラン同士または新人同士が組めば、互いに切磋琢磨する効果があります。その結果、一人で黙々とプログラミングするのに比べて、バグを見つけやすくなり、結果的にソフトウェアの品質は向上する、というわけです。また、ペアで作業するということからコミュニケーションが円滑になり、メンバー間の士気が高まる、という効果もあります。Kent
Beckは「最初は一時的に生産性は落ちるかもしれないが、トータルで見ると生産性/品質とも向上する」とそのメリットを説明します。
とはいえお互い人間。一人のほうが生産性は高いというプログラマもいれば*10、相性もあります。その場合は「無理にペアにすることはない」というのがXPの考え方です。要は、無理なく適度な緊張感を持ってコーディングできればいいわけです。すると、意外に「厳しさ」より「楽しさ」のほうが体験できるようです。
問題 |
「形だけ」の繰り返しでは・・・ |
![]() |
●開発者の負荷が高まる ●スケジュールが混乱する ●ユーザー要求がなかなか確定しない ●ソフトウェア品質が低下する |
図2 ●中途半端な「繰り返し型開発」は、かえって問題が多い |
後 |
前 |
クラス1 |
![]() |
クラス2 |
クラス1 |
メソッド1 |
クラス2 |
メソッド1 |
メソッドを移動するときの手順 |
1)クラス1のすべてのメソッドを調べて移動すべきかどうかを検討する 2)クラス1のサブクラスまたはスーパークラスでメソッド1が宣言されていないかをチェックする 3)移動のクラス2でメソッド1を宣言する 4)クラス1のメソッド1のコードを、クラス2のメソッド1にコピーする 5)クラス2をコンパイルする 6)クラス2のメソッド1を参照する方法を決める 7)クラス1のメソッド1を委譲メソッドにする 8)コンパイル/テストする 9)クラス1のメソッド1を委譲メソッドにするか削除するかを決める(削除するなら、メソッド1の参照先をクラス2に置き換える) 10)コンパイル/テストする |
図4 ●リファクタリングの例。メソッドを移動する方法 |
これからは、ソフトウェアの開発プロジェクトがもっと少人数になってくると思います。大きなプロジェクトだったとしても、小さな単位に分割されることが多くなるでしょう。そのほうがネットワークを軽くでき、技術や世の中の変化に柔軟に対応できるからです。メンバー間のコミュニケーションも良くなりますしね。その意味で、少人数で最大結果を出そうというXPは、いいタイミングで出てきた手法だと思います。
XPが普及するかどうかは、XPだとどれくらいの納期やコストになるのかを見積もれるかどうかにかかっているでしょう。今の段階では、まだわからないことばかりですが、それがある程度予測できるようになれば、もっと事例が増えてくると思います。
ただし、XPはけっして簡単な手法ではありません。テスティングやリファクタリングを実践するには、それなりのスキルが必要です。その意味では、一人ひとりのプログラマがもっと勉強しないとXPは普及しないかもしれませんね。
(日本XPユーザーグループの代表(暫定)者の意見)
ここまで読んでみて「面白そうだ。ぜひXPを実践してみたい」と思った方もいるかもしれません。実は、すでに国内でXPを使った事例があります。この事例では、わずか2ヶ月間でインターネット・ベースのB2B(企業間電子取引)システムを完成させることに成功しています(別掲記事「たった2ヶ月で開発完了!XPの威力を実感した」参照)。XPは、けっして机上の空論ではないわけです。
それでも、XPを本格的に実践するには、さまざまな課題があるでしょう。実際には、できるところからやってみるしかありません。例えば開発プロジェクトが大きな場合は、10人以下の小さなプロジェクトに分割する、というカスタマイズも必要です。ペア・プログラミングも試行錯誤するしかないでしょう。しかしやってみるだけの価値はありそうです。
特集の冒頭で、ソフトウェア開発に「スピードと変化」の波が来ていると述べました。この「スピードと変化」に対応する最大の武器は、XPで語られた「コミュニケーション」です。プログラマ同士、またはユーザーとの会話など、これからますます良いコミュニケーションが必要になってくるでしょう。良いコミュニケーションなしに、良いソフトウェアは作れないからです。その意味でXPは、ソフトウェア開発を見直す、いいキッカケになるはずです。
ソフトウェアのを開発するとき、行き当たりばったりの思いつきで作業を進めることは、ほとんどないでしょう。それが趣味のプログラミングであったとしても、「どのような機能が必要なのか」という作業(いわゆる分析/設計)の後で、実際にプログラミングをスタートし、ある程度プログラムができたら、テストを実施して機能やバグをチェックしリリースします。この一連の流れは(きちんと守るかどうかは別として)ソフトウェアの種類や大小にかかわらず共通しています。
しかし、ビジネスとしてソフトウェアを開発するとなると、決めなくてはならないことが格段に増えます。ユーザーとの契約で納期も厳しく決められます。したがって、「どのような手順でソフトウェアを開発するのか」「スケジュールはどうなるのか」「どのような役割のメンバーが必要か」「各メンバーが行う作業は何か」「成果物として残すべきドキュメントは何か」・・・といったことをあらかじめ決めて、進めていく必要があります。
このような開発のやり方を、建築や機械製造などのエンジニアリング手法をヒントに、体系化してまとめたものが「ソフトウェアの開発手法」です。これまで、さまざまな開発手法が考え出され、実際の開発プロジェクトで利用されてきました。
しかし、最近、従来の開発手法にほころびが出始めています.その原因が”開発のスピード化”と”要求仕様の頻繁な変更”です。
開発手法の多くは、ソフトウェア開発プロジェクトがもっとも大規模で、開発期間も1年以上かかる時代に考えられたものです。開発工程は、分析/設計、プログラミング、テスト、運用と明確に分けられ、順番に開発を進めていく「ウォーターフォール型開発」が主流でした(図1の(a))。さらに、これらの各工程は、たっぷり時間がとれることを前提にしていました。高いところから流した水は、けっして上に逆流することなく低いところへ流れていくように、ウォーターフォール型開発では、原則として前工程への後戻りはありません。ユーザーの要求しようはスケジュールの早い段階で完全に固定化する、というのが前提になります。
しかしIT技術の急速な進歩と、企業経営のスピード化が、ウォーターフォール型開発の問題点を一気に表面化させました。最近の開発プロジェクトの開発期間は、1年どころか3〜6ヶ月あるいは1ヶ月というのも珍しくありません。この短いサイクルの中で、ウォーターフォール型開発手法通りの作業を進めることは、工数的に見てかなり無理があることがわかってきたのです。また、最近のソフトウェア開発では、途中でユーザーの要求が変わったり、機能の変更や追加を頻繁に行ったりすることがよくあります。開発の早い段階でユーザーの要求仕様を固定化してしまうウォーターフォール型開発では、その後の変化に追従するのが非常に難しくなります。その結果、「完成したときには、もうそのシステムや機能は必要とされない」という状況すら発生するようになっています。
*1 RAD(Rapid Application Development) ツールは、プログラマがアプリケーションの完成イメージ(GUI)を把握しながら開発できるツール。
そこで新たに考え出されたのが、ウォーターフォール型の開発サイクルをもっと短くし、Visual
Basic(VB)やDelphiなどのRADツール*1を駆使して生産性を高める「繰り返し(スパイラル)型開発」です(図1の(b))。「繰り返し型開発」では、短期間の開発に対応するため、一気にすべての機能を開発しようとはしません。機能を絞り込んだプロトタイプ(準完成品)をユーザーに提供し、ユーザーから性能や使い勝手などのフィードバックを得て、何度も設計〜プログラミング〜テスト〜リリースを繰り返します。こうして、少しずつ機能を変更したり追加していけば、ウォーターフォールで陥りがちな、ユーザーのニーズを見失うリスクを回避できるというわけです。繰り返し型開発は、ウォーターフォール型開発に代わる効果的な手法として、1990年代後半からさまざまなソフトウェア開発で行われるようになりました。
しかし、現実に繰り返し型開発を実践するのは、それほど簡単ではありません。中途半端な「形だけ」の繰り返しは、かえって問題を複雑にします(図2)。例えば、ウォーターフォール型開発での作業量を変えずに開発期間を短縮されただけでは、開発者への負荷を高めてしまいます。また、1回あたりの開発期間はどれくらいか、繰り返しは何回行うのか、などをきちんと決めておかないと、全体として無計画なプロジェクトになってしまう危険もあります。さらに、十分な機能や性能を持っていないプロトタイプをリリースしても、ユーザーからはいつまでもOKが出ませんし、的確なフィードバックが得られません。結局、最終的なソフトウェアの品質は低下します。
*2 米国では、XPのようなライトな開発手法は「Agile Software Development」と呼ばれ、ほかにもいくつか登場している。例えば、Cockburn’s Crystal Family,SCRUM,FDD (Feature−Driven Development)などが挙げられる。これらは、米国のソフトウェア技術者Martin Fowler氏による論文「The New Methodology」で詳しく分析されている(同論文は、http://www03.u-page.so-net.ne.jp/dc4/tnaka/fowler/new-Methodology_j.htmlで日本語版が読める)。
*3 http://www.xp.medinfo.m.ehime-u.ac.jp/
*4 「XPエクストリーム・プログラミング入門」(Kent Beck著、永田渉、飯塚麻里香 訳、長瀬嘉秀監訳、ピアソン・エデュケーション発行)、「XPエクストリーム・プログラミング実行計画」(Kent Beck、Martin Fowler 著、飯塚麻里香 訳、長瀬嘉秀監訳、ピアソン・エデュケーション発行)などの書籍もある。
そこで、繰り返し型開発のメリットを生かしつつ、より実践的な開発手法として登場したのが、「XP(Extreme Programming:エクストリーム・プログラミング)」です。ウォーターフォールに代表される従来の開発手法が、開発手順を細かく規定したり、大量のドキュメント作成を要求するのに対し、XPは実践項目も単純で、ドキュメントもほとんど作りません。また、後述するように、比較的少人数向けの開発手法のため、「ライトな(軽量な)手法」と呼ばれることもあります*2。
XPは、オブジェクト指向言語Smalltalkのプログラマとして有名な、Kent
Beck氏らが中心になって考案した開発手法です(別載記事「XPを実践すれば、よいプログラマになれる」参照)。日本でも2000年ごろからオブジェクト指向開発を行っている開発者たちに知られるようになり、今年に入って「日本XPユーザーグループ(XPJUG)」*3も発足しました。4月には提唱者のKent Beckを招いたセミナーが開催されるなど、ちょっとしたブームになっています*4。
どうしてXPは注目を集めるのでしょうか。それはXPに、ソフトウェア開発者を引きつけるさまざまな魅力があるからです。
その一つは、XPが特定のツール・ベンダーやコンサルタント会社の「製品」ではない点でしょう。有志によるユーザー・グループではあっても、特定の権利団体はなく、後述するXPの実践項目(プラクティス)を行ったところで、だれかに使用料を払う必要はありません。従来の開発手法の多くが「製品」で、ベンダーが主催する有料のセミナーや講習を必要とするのとは大違いです。その意味でXPは、手法というより「ソフトウェア開発者が共有すべきノウハウのかたまり」と言ったほうがいいかもしれません。
XPのもう一つの魅力は、「Embrace Change(変化を抱擁せよ)」という精神です。ウォーターフォール型が最初に仕様をきっちり決めて、後はその実現に向かってまっしぐらに進むという開発スタイルであったのに対し、XPはざっくりと目標を定めるだけで、後は右へ左へフラフラと進むスタイルをとります。一見イイカゲンに見えますが、XPでは「ソフトウェア開発に変化はつきもの。ユーザーのニーズも変わるし、機能やコードの変更も当然。問題は、いかにその変化に対応するかである」と説きます。これは過去の開発手法とは180度違う発想です。従来「仕様が決まってからの変化や変更」は”悪”でした。「変更すればするほど、後工程の変更コストは上昇する」ので、早期に設計を固定化させて「変更コストを抑える」ことが重要と考えられていたからです。しかし、XPの発想は逆です。第1部で解説したオブジェクト指向プログラミングや、後述するさまざまな実践項目(プラクティス)を究極的に(Extreme)実践すれば、「変更のコストは時間とともに上昇しない場合がある」と考えるわけです。
その考え方を実現するためにXPでは、 『 ●コミュニケーション ●シンプル ●フィードバック ●勇気 』
の四つの価値を重視します。「開発者同士または開発者とユーザー間の風通しを良くし(コミュニケーション)、余計な開発は行わず(シンプル)、ユーザー・ニーズやコード変更などの情報を頻繁に交換し(フィードバック)、ニーズの変化やコードの変更を恐れなければ(勇気)、変化に柔軟に耐えられる」というわけです。
「何だか宗教みたいだな」と思われる方もいるかもしれません。確かにそんなところはあります。しかし、従来の開発手法の多くが、ち密な決まりごとで開発者の行動をきっちり統制したのに比べ、XPは開発者、特にプログラマの自主性を尊重するなど、もっと自由な雰囲気があります。この点がXPが人気を集める最大のポイントかもしれません。
◆XPは、どんな分野のソフトウェア開発に向いていると思いますか。
XPはどんなソフトウェア開発でも使えると思います。業務アプリケーションの開発でも、組み込み機器の開発でも関係ありません。なぜならXPは、コミュニケーション、つまり人間関係に注目しているからです。実際、米国でも、金融システムの開発から医療機器のような組み込み機器開発まで、さまざまな分野でXPの取り組みが始まっています。
◆XPはオブジェクト指向開発に限られた手法なのでしょうか?
そんなことはありません。基本的にXPの実践項目(プラクティス)は、プログラミング技術や言語に依存しないと考えています。私は、父がアセンブリ言語でソフトウェアを開発する様子を見てXPのヒントを得ました。テストを繰り返したりプログラミングを見直したりすることは、プログラミングの方法や言語とは関係ないと思います。ただし、オブジェクト指向言語を使ってプログラミングを行った方が、設計やコードの変更コストをより低く抑えられる、ということは言えるでしょう。COBOLやVisual Basic(VB)のような非オブジェクト指向言語でもXPはできますが、工夫は必要だと思います。
◆XPを実践する上で難しいところは何でしょうか?
プログラマにとって、もっとも問題になるのはペア・プログラミングでしょう。約2週間で一つの開発(イテレーション)を行う、というのも工数的に不安かもしれません。でも、やってみるしかありません。それには勇気が必要です。XPを実践していけば、プログラマは「良いテスター」「良いリファクター(リファクタリングできる人)」「良い設計者」になれます。そのためには、別にコンピュータ・サイエンスの学位や才能が必要なわけではありません。実践しながら学んでいけばいいのです。
◆XPはこれからソフトウェア開発手法として広まると思いますか?
テスティング・フレームワークの整備など、課題はいろいろあるでしょう。それに、従来のソフトウェア開発手法に慣れた人は、好きになれないかもしれません。しかし、新しい世代のプログラマなら、それほど抵抗なくXPになじんでいくと思います。そうすれば、自然とXPは広がっていくでしょう。
*5 熱心なXP信者の中には、これらすべてを実践できなくてはXPと呼べない、という人もいる。
*6 ストーリー・カードにフォーマットはないが、紙のカードを用いることが多い。後述するタスク・カードも同様で、CASEツールのようなソフトウェアは使わない。
*7 これは決まっているわけではない。経験的に、1〜3週間程度が適切と考えられている。
*8 XPでは、「変更が必要になったときにプログラムを変更するコストのほうが、今日のうちにプログラムを変更して、結局使われないコストより低い」と考える。
XPには前述の四つの価値をベースに、具体的な実践項目(プラクティス)が12個用意されています(表1)。「XPを実践する」ということはこれらすべて、もしくはいくつかを実践することを意味します*5。
最初の「計画ゲーム」では、ユーザー(顧客)が「ソフトウェアにどのような機能が必要か」を”ストーリー・カード”*6に書きます。このときプログラマも参加し、ビジネスの優先度や技術的見地から、計画達成の日程を決めます。システムの全体像は「メタファ」を考えて、そのイメージをメンバーで共有し、ストーリーは、より具体的な作業単位として”タスク・カード”(だれがどんなプログラムを作成するか)に分割して記述します。
開発作業はタスク・カードに従って行われ、繰り返し「短期リリース」します。XPではだいたい2週間程度が一つのリリースを出荷するまでの時間と考えられています*7。1回あたりの開発(イテレーションと呼ぶ)で重要なのは、たとえ後で必要になることがわかっていても、最初に決めた以外の機能は設計しない「シンプルな設計」です*8。また、コードはメンバー全員で「共同所有」できるようにし、だれのコードを見ても理解可能なように、インデントの文字数やコメントの書き方など「コーディングの標準化」を行います。
プログラミングは二人でチームを組んで一つのマシンを共有する「ペア・プログラミング」を実施します。作成したプログラムに対しては、単体テスト(プログラムの動作チェック)や機能テスト(ユーザーの必要とする機能があるかどうかのチェック)などの「テスティング」を徹底して行い、テストを徹底させるため、ユーザー(顧客)は「オンサイト顧客」として、フルタイムで開発に参加します。
プログラムは、テストを通過すればOKではありません。"よりわかりやすく、より修正しやすく”するため「リファクタリング」も頻繁に行います。このようにして作成したプログラムは「継続的な結合」によって、毎日最低1回は結合(ビルド)し、テストを必ずパスさせるようにします。ただし開発作業を延々と続けても能率は上がらないので、働く時間は「週40時間労働」を目安にします。
----以上が、XPを実践してみたときの開発の流れです。皆さんはどう思われましたか?
*9 CASE(Computer Aided Software Engineering) ツールは、ソフトウェア開発の主に設計工程を支援するツール
*10 そもそも一人で仕事をしたがるタイプの人間がプログラマには多いのではないだろうか。
さまざまな意見があるかもしれませんが、12のプラクティスすべてを忠実に実践するのは、結構難しそうですね。それにコミュニケーションに価値を置くといっても、開発メンバーが多くなれば、全員の意思疎通を図るのは容易なことではありません。実際、XPは「2から10人以下の少人数の開発プロジェクトに適した方法で、それ以上だと失敗する可能性が高い」と提唱者のKent
Beckは述べています。
しかし、それでもXPには従来の開発手法にはない魅力があります。例えば、XPを実践するのに、高価なCASEツール*9は必要ありません。ドキュメントと言っても、ストーリー・カードやタスク・カードなどの紙のカード程度で、仕様を作らないというのが根本姿勢です。そこには、「仕様書や設計書ではソフトウェアは動かない。コードこそ最良の設計書である」という思想があります。
また、従来の開発では当然であったSE(設計者)とプログラマという明確な区別も、XPにはありません。プロジェクト・メンバーには最低、ユーザー(顧客)、プログラマ、テスター、トラッカ(進捗管理者)、コーチ(アドバイザ)の役割があればいいのです。これは、システム分析者、設計者・・・などと30種類以上の役割を用意する米
Rational Softwareの開発手法 RUP(Rational Unified
Process)とは大きく異なるところです。(別掲記事「RUPとはどういうものか?」参照)。
XPがほかの開発手法と決定的に違うのは、「ソフトウェアを作るのは機械ではない、人間だ」という精神にあふれていることでしょう。コミュニケーションや勇気などにこだわるのもそのためです。しかし、けっして、理想を追い求めただけの精神論ではありません。その実現には、技術的な裏付けがあります。それが、「ペア・プログラミング」「テスティング」「リファクタリング」です。
オブジェクト指向技術をベースにした開発方法にはさまざまなものがありますが、米国を中心に広く採用されているのが、米Rational SoftwareによるRUP(Rational United Process)です。RUPは開発ツールやCASEツールのようなソフトウェアではありません。実体は、ソフトウェア開発の進め方や、作業内容、作成すべき成果物などを詳細に定義したHTMLベースのドキュメントです。
特徴はその詳細さです。初心者でも迷わずに実践できるように、ブレーンストーミングのやり方から、クラスやメソッドの定義方法まで細かく定義されています。メンバーの役割もシステム分析者、設計者、実装者、テスト設計者、などと30種類以上に分かれ、ビジネス・ルール集、ソフトウェア要求仕様書、設計モデルなど50種類以上の成果物(ドキュメント)が指定されています。とはいえRUPは、定義された作業項目や成果物を、すべてその通り実践しなければならない、という手法ではありません。むしろ、ユーザーそれぞれの開発ニーズに合わせてカスタマイズして運用することが奨励されています。
「RUPは、XPと同じく過去のオブジェクト指向開発のノウハウを集めた”ベスト・プラクティス”です」と日本ラショナルソフトウェアのソフトウェアエンジニアリングスペシャリストは説明します。XPが少人数の開発プロジェクトをターゲットにしているのに対し、RUPは「小規模から大規模まで幅広く対応できる」点が大きく異なるわけです。
XPを支える最も技術的な要素と言えば、「テスティング」と「リファクタリング」です。
テストに対するXPの姿勢は、かなり厳しいものがあります。従来の開発手法では、テストはプログラミングの後にまとめて実施するのが普通でした。しかしXPは逆です。まずテスト用のプログラムを作成し、それから本体のプログラムを作るのです。そして、本地プログラムができたら、すぐにその場でテストします。これがポイントです。
テスト用プログラムのコードは、プログラマ自らが書きます。こうすることで、「どんなプログラムを作るべきか」ということが明確になるからです。プログラマが作成するテストは「単体(Unit)テスト」と呼ばれ、作成したプログラム(オブジェクト指向言語ならクラス)が、エラーなく動作するかどうかをチェックします。
しかし、テスト作業がプログラミングの工数を奪うようでは本末転倒です。そこでXPは、できるだけテストを簡略化かつ自動化させるためのツールとして、「テスティング・フレームワーク(テスト環境)」を使うことを推奨しています。テスティング・フレームワークは、XPの支持者によって開発され、Java、C/C++、VB、Perlなどプログラミング言語別に無償で入手することができます。
(http://www.xprogramming.com/software.htm)。
テストには「単体テスト」のほかに、ユーザー(顧客)が作成する「機能テスト」もあります。「システム全体が、ユーザーの指定したストーリー通りに機能するかどうか」をチェックするものです。といってもユーザーが自らテスト・コードを書くことは通常できませんから、実質的には専任のテスターがユーザーの意見を聞きながら機能テストを作り上げ、テストを実施します。このようにXPでは、小さな「単体テスト」とシステム全体の「機能テスト」を頻繁に繰り返し、徹底的な品質の向上を図るわけです。
*11 リファクタリングの手法は「リファクタリング:プログラミングの体質改善テクニック」(Martin Fowler著、児玉公信、友野品夫、平澤章、梅澤真史 訳、ピアソン・エデュケーション発行)に詳しい。
さらに重要なのが「リファクタリング」です。リファクタリングは「システムの振る舞いを変更せずに”理解や修正が簡単になるように”内部構造を変化させること」を意味します。要は、一度書いたプログラム(それもテストを通過したもの)をもう一度見直しすること、と考えればいいでしょう。これは、プログラムの実行速度を向上させるパフォーマンス・チューニングとは意味が違います。チューニングは速度向上のためならトリッキーなコードでも許しますが、リファクタリングは性能より「わかりやすさ、保守しやすさ」を優先するからです。
通常、テストを通過したプログラムは一応完成品ですから、できることならコードをいじりたくはありません。「きちんと動いているのだから、そっとしておいてよ」というのがプログラマの本音でしょう。それでもリファクタリングを実施するのは、
●重複したコードを削除できるなど、コード設計が向上する
●プログラムの中身が理解しやすくする
●バグが見つけやすくなる
といったメリットがあるからです。
リファクタリングは、単なる"メンテナンスのススメ”とは違います。プログラムを修正することで新たなバグが生まれたら元も子もありませんから、「サブクラスの抽出」「引数の追加」など70種類以上の”リファクタリングの仕方”が体系化され、メンテナンス手順が具体的にルール化されています*11。例えば、クラス1にあるメソッド1をクラス2に移動させたい場合は、図4のような手順で行うことが決められています。この手順に従えば、メンテナンスをしたことによる新たなバグ発生を防げるからです。
このように、テスティングとリファクタリングは、単なる「繰り返し型開発手法」とXPとの違いを明確に分けるものです。逆に、この実践項目(プラクティス)を実施できなければ、XPのメリットは得られない、と言ってもいいかもしれません。「変化を柔軟に受け入れる」という姿勢から、XPのことを無計画でいいかげんな手法だと批判する人たちもいますが、Kent
Beckは「常にテストやリファクタリングの可能性を考えながら作業を進めるXPは、むしろきわめて慎重な開発手法である」と述べています。