ソフトウエア設計


  「リファクタリング」  
  「EclipseによるJavaアプリケーション開発」  
  「JAVA言語で学ぶデザインパターン入門」  
  「UML モデリングのエッセンス 第2版」  
「達人プログラマー システム開発の職人から名匠への道」  
「XP エクストリームプログラミング 入門」  
「コードコンプリート」  
「ライティング ソリッドコード」  
「ソフトウエア技術レビュー・ハンドブック」  
「アンチパターン」  
「え〜、全部テストするんですか!」  
「ソフトウエア・テストの技法」  
"MANAGING THE TESTING PROCESS"  
「パーソナルソフトウエア プロセス技法」  
  「ソフトウエア インスペクション」  
     
     
     
     


「リファクタリング」
マーチン・ファウラー
ピアソン・エデュケーション(2000)
評価:★★★★☆
cover
原書の副題は「既存のコードのデザインを改善する」というものです。 リファクタリングの定義は、「外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること」です。 多くの手法のカタログ的な構成になっていて、各手法は以下のような構成です。
(1)まず概要が簡単なコードの例やクラス図を使って説明されます。
(2)「動機」:なぜこのコードはリファクタリングされなければいけないのかが説明されます。ある種のアンチパターンのようなものです。
(3)「手順」:リファクタリング手順が詳細に示されます。少し修正して、少しテストというXPの見本のような手順がくどいほど繰り返されます。
(4)「例」:実際のコードの例が示されます。
デザインパターンもよく参照されますし、各手法も相互に関連していて、Javaの中級〜上級者向けの本だと思います。 得る所が大きいのは、まず、Javaで、こうコーディングしてはいけない、というアンチパターンと、それをリファクタリングした結果の、 こうあるべきだという常識が、コードのサンプルから学べるところです。その意味ではJavaのプログラム作法的な本でもあります。 読み方としては、プログラム作法の勉強のために精読するもよし、どんな手法があるのか、ざっと眺めた上で、リファクタリングが必要になったときに、必要な部分を精読するのもよいと思います。
「リファクタリングはなぜ有効か---Kent Beck 今できることを作り込めばそれで終わりと考えているのであれば、長くプログラマを続けていくことはできないでしょう。 今日はできたからといって、明日には通用しないかもしれないそのやり方を通せば、いつかは敗者となってしまいます。 重要なのは、今の時点で何が必要かが把握できても、明日については何もわからないということです。 多分こうだろうと推測しても、想像もしなかったことが起こるかもしれません。 今日については十分把握できますが、明日については不十分なままです。 しかし、今日のためにしか仕事をしないとすれば、やがて明日には何もできないことになるでしょう。 リファクタリングは、この苦境から抜け出すための手段です。 昨日の決定が、今日には意味を持たなくなったと気づいたならば、過去の決定を変更してしまえばいいのです。 そうすれば今日の仕事ができるようになります。 明日には、今日の理解が多少未熟だったと思うかもしれません。だったらまた変更すればいいのです。」
実際に中規模のリファクタリングをやってみた感想としては、リファクタリングとして、特別に作業を行うのではなく、 普段のプログラミングの一部として、少しづつ行うのが効果的であると思います。 ファウラーさんの本にも書いてあるのですが、大きなリファクタリングは、小さなリファクタリングを価値あるものとしている多くのメリットを欠いています。 (例えば、即座の満足、目に見える進捗) 実際、リファクタリング中の3日間は、外から見たら目に見える進捗は有りません。 しかし、その後のコーディングの進み具合には大いに貢献しましたし、コードレビューをやったのと同じ効果がありました。(バグもいくつか発見しました) 使ったのはTemplate Methodだったのですが、具体的な手順として、 (1)類似したコードから異なるコードを分離し、差異部分を抽出 (2)差異部分を同じシグニチャを持つメソッドを作成する (3)メソッドの引き上げ とあり、例題のコードを使って説明されていて、分かりやすいものでした。

 

「EclipseによるJavaアプリケーション開発」
水島和憲
秀和システム(2003)
評価:★★★★
cover
Eclipseとプラグインのファイルのダウンロードの仕方から、細かい設定、使い方まで、かなり至れり尽くせりの本です。 それにJUnitやリファクタリングやUML、CVS等本当に盛りだくさん。オープンソースの威力をまざまざと見せ付けられました。 一見、PCの画面を多用した、よくある表面的なHOW-TO本に見えますが、実はソフトウエア開発に対する深い知識に裏付けられています。 リファクタリングやCVSの章でそれを感じます。 内容は、この1年、Windowsの開発ばかりだった私にとって、本当に刺激的です。LombozによるWEBサービスクライアントを作るところが特に面白い。GoogleやAmazonのAPIを使えるなんて!何か面白いことができそうだと思ったのですが、 実際にGoogleのAPIを読んでみるとかなり制限があって、当然ですがGoogleが提供している以上のサービスを実現するのは難しいことが分かりました。しかしWEBサービスの可能性を感じさせてくれるサンプルです。 お勧めなのですが、こういうHOW-TO本の宿命として、すぐに古くなってしますのが難です。実際、必要なファイルのバージョンはすでに付録のCD-ROMよりも新しくなっています。今年の10月15日初版なのですが。 しかし、実際の試用には、CD-ROM付属のソフトを使うことを薦めます。 というのは実際に試しながら読んでいくと、書いてある通りに進まないことが何箇所かあったからです。Tomcatのバージョンを4.1.29にするとEclipseから起動できなかったことや、(本に書いてある通りの4.1.27ではOKでした)、Checkstyleのプラグインを認識してくれなかったこと、「インストール構成ビュー」が正常に表示されなかった件などです。これらは私が試したEclipseのバージョンが2.1.2で、本で述べられている2.1.1と違っていることが原因かもしれません。 蛇足ですが、参考文献にダニエル・キースの「アルジャーノンに花束を」が載っています。Googleのスペルチェックのサービスのサンプルテキストに、「アルジャーノン・・・」の最後のチャーリーの文章が使われていて著者に親近感を持って、なんだかうれしくなりました。

 

「JAVA言語で学ぶデザインパターン入門」
結城浩
ソフトバンク パブリッシング(2001)
評価:★★★★★
cover
多くの人が推薦するベストセラー。デザインパターンの入門書としてだけではなく、JAVAの入門書、UMLの入門書、オブジェクト指向プログラミングの入門書としても読める。インターネット上でレビューして出来たそうで、非常によく考えられた本であると感じる。懇切丁寧で至れり尽くせりである。読者のあらゆる疑問に先回りして解説してしまうし、関連情報も万全である。 本書で、抽象クラスとインタフェースの使い方が遅まきながら理解できたのは収穫だった。ということでお勧めであるが、いくつか欠点もある。あまりに解説が易しく、本当は考えなければいけないところを、分かった気になって読み進めてしまうところ(御注意あれ)と、理解を助けるためにサンプルが非常にシンプルなものになっており、実際に使えるのか疑問に感じてしまうところだろうか。 練習問題を解きながら一通り読み終わったら、関連パターンに注意しながら全体をざっと目を通すとよい。だが仕事への応用は・・・簡単ではなさそうである。

 

「UML モデリングのエッセンス 第2版」
マーチン・ファウラー/ケンドール・スコット

翔泳社(2000)
評価:★★★
cover
本書はUMLに関するロングセラーである。薄い本だが簡単には読みとおせない。第11章の「UMLとプログラミング」を理解できれば第1段階は卒業だろう。もっと手軽にUMLの概要を知りたい向きには@ITのサイトが参考になる。(@ITは素晴らしいサイトでよくお世話になっている)

 

「達人プログラマー システム開発の職人から名匠への道」
The Pragmatic Programmer
Andrew Hunt and David Thomas
ピアソン・エデュケーション(2000)
評価:★★★★
cover
実際の開発経験に基づく、実践的な開発手法。役に立ちそうなアイディアがたくさん詰まっている。あなたの開発手法が先端の開発チームからどのくらい遅れているかのベンチマークにもなり、開発者に強く勧める。DRY、直交性、リファクタリング・・・すぐにでも使いたいものがたくさんある。あなたが読めば、また違った発見が必ずある。








「XP エクストリームプログラミング 入門」
Kent Beck
ピアソン・エデュケーション(2000)
評価:★★☆
cover
Amazon.comでソフト関係の本を何冊か買ったことがあるのだが(本棚でも紹介した、McConnell、Black、DeMarcoやWiegers)、その私に対する現在第一のお勧めに、この本があがっていた。Amazon.comでの評価は4つ★である(5点満点)。書店で翻訳を見つけたので早速買った。
私なら、この本で述べられている手法を、究極のプログラミングと言う勇気はない。著者も言うように個々の手法は、昔から言われていることである。著者がこの方法で成功したのは、プロジェクト規模が小さかったことと、コンペティタがいなかったからではないか。所々、共感できる部分もあるが、かなり読みにくい本である。ペアを組んで作業する方法や、テスト可能にするためにコードをシンプルにする等、参考にできそうなところもある。レビューやインスペクションについて、ほとんど述べていないところが面白い。


「コードコンプリート」
STEVE McCONNELL(1993)
アスキー出版局(1994)
評価:★★★★
cover
この900ページを超える大著は、例のMicrosoft Pressの一冊である。ソフトウエアのインプリ工程を中心とし、関連する品質保証、検査、プロ意識の話題を含んでいる。「マイクロソフトシークレット」の著者らは、マイクロソフトの人間はソフトウエア工学を勉強していないといっているが、本書の著者は勉強家である。巻末には300冊を超える参考文献がある。







「ライティング ソリッドコード」
−バグのないプログラミングを目指して−
WRITING SOLID CODE
STEVE MAGUIRE(1993)
アスキー出版局(1995)
評価:★★★★
cover
MAGUIREによる実践的コーディング、テストのテクニック。











「ソフトウエア技術レビュー・ハンドブック」(1977,1979,1982)
D.P.フリードマン/G.M.ワインバーグ
TBS出版会(1987)岡田正志監訳
評価:★★★★☆
cover
古い本ですが、レビューに関する古典です。Q&A形式のソフトウエア・プロダクトのレビューに関するアドバイス。レビューの目的に関し、実にはっきりとした、そしてすっきりとした見解を持っている。ありとあらゆる、起こるであろう問題を想定していて、その回答が非常に論理的である。読んでいて、「そうだ、そのとうりだ!」と言いたくなる。我々がこのようなノウハウを独自に蓄積するには、楽観的にみても数年はかかるであろう。しかし1977年に出版された本書が我々にとって非常に参考になるということは、20年遅れているのだろうか?後半、具体的なレビューのための判断基準がでてくるが、本書のノウハウの基礎となっているのがCOBOLで書かれたファイル・アクセス・システムらしいので、我々のレビューにそのまま適用できないのが残念。だが、それは怠慢というものであろう。我々は対象に合った基準を作成するべきである。(そして、もちろん基準はレビューされるべき。)
わけもわからず、レビューに参加させられて不満を持っている人(この忙しい時に、なんだ!)に読んでもらいたい。内容は、そう易しくはないのだが、Q&A形式で短くまとめられ、とても読み易い。


「アンチパターン」W.J.Brown,R.C.Malveau,H.W.McCormick & T.J.Mowbray
ソフトバンク(1999)
評価:★★★
cover
ワースト・プラックティスをまとめたもの。「ソフトウエア開発のアンチパターン」「ソフトウエアのアーキテクチャのアンチパターン」「プロジェクト管理のアンチパターン」に分類されている。もともとオブジェクト指向開発のためにまとめられたものだが、本質は、そうでない開発にも十分通用する。他のワースト・プラックティス物と違うところは、症状だけでなく、原因の分析、例外、解決法などを併記している点であろう。耳の痛い話が多いが、序文に次の言葉がある。「あなたは、真実に堂々と直面できるタイプだろうか?一般的にいって、他人に真実を理解させることは非常に難しい。真実の指摘は往々にして、余計なでしゃばりとみなされたり、他人への無理解や思いやりのなさと思われたりする。世の中がまるくおさまるためには真実を語ってはならない、ともいわれる。真実は、一部の人々を不愉快にする。」原書の副題は”Refactoring Software,Architectures and Projects in Crisis”で、いわば危機的な状況にある、ソフトウエア、アーキテクチャ、プロジェクトを再編(本訳書では再構想と訳している)するというものである。


「え〜、全部テストするんですか!」
山村吉信
三元社(1999)
評価:★★☆
cover
IBMの山村氏のソフトウエアのテストと統計的手法を応用する場合の理論的な背景を具体例を使ってわかりやすく解説している。題名から画期的なテスト手法を期待したりすると肩透かしをくう。著者はホワイトボックステスト、ブラックボックステストのいずれも問題があることを示し、統計的なテスト管理手法を提案する。N本の母体からm本を取り出してテストし、k本にバグがあった等とやるのだが、前提となる仮定が現実的ではないように私には思える。しかし、では大量のテストをどうするのかと言われれば、私は明確な答えを持ち合わせていないのだが。





「ソフトウエア・テストの技法」
The Art of Software Testing /Glenford J. Myers(1979)
近代科学社(1980)
評価:★★★★
cover
テスト技法に関する古典。なぜもっと早く読まなかったのかと後悔している。テストにかかわるすべての人に薦めたい。理論面に偏ることなく、心理学的、経済学的な考察も貴重である。数学の証明のように、論理を追うのに少々疲れるところもあるが、結論だけにでも目を通す価値は十分ある。








"MANAGING THE TESTING PROCESS"
Rex Black
Microsoft Press(1999)
評価:★★★☆
cover
マイクロソフトでは開発者1人につきテスト担当者が1人いるそうだが、そのマイクロソフトプレスからのソフト、ハードのテストに関する実践書。理論を解説した本ではなく、コンサルタントとしての著者の経験から導かれた方法論、経験談である。当然と思われることもたくさん書いてあるのだが、時々、「これは使えそうだ」というアイディアがきらりと光るところがある。扱っている範囲は、

・テスト計画(2章)
・テストシステムのアーキテクチャ:項目とカバレージ(3章)
・バグ追跡データベース(4章)
・テスト項目管理:テスト状況追跡スプレッドシート(5章)
・危機的場面での変化する状況の管理(6章)
・実験室を確保し管理する(7章)
・人を集め、テストチームを管理する(8章)
・テスト管理者の組織内でのチャレンジ(組織間の政治問題)(9章)
・テストプロジェクトを分散する(10章)


「パーソナルソフトウエア プロセス技法」
Watts S. Humphrey
共立出版株式会社(1999)
A Discipline for Software Engineering(1995)
評価:★★★
cover
CMMモデルで有名なSEIのハンフリーの著作である。CMMがプロジェクトや企業のソフトウエア開発プロセスの改善モデルであるのに対し、PSP(Personal Software Processである。Paint Shop Proではない)は「大規模ソフトウエア開発に必要な個人レベルのソフトウエア工学スキルを身につける」ことを目的とする。また3つ目の柱として(私は詳しくないが)TSP(Team Software Process)と呼ばれる、チームに対するガイドがある。
PSPは簡単に言えば、個人が自分のソフトウエア開発において、様々な記録をつけ、測定を行い、それを統計的手法により分析して、プロセス改善に繋げる枠組みを提供している。
ハンフリーのアプローチは抽象的なレベルでは理解できる。過去の経験から将来を予測可能でコントロール可能にしようというのである。が、7章まで読んで、様々な疑問がうかんでくる。まだ全てを読んだわけではないので、勘違いがあったらお許し願いたい。
(1)個人の限られた計測データを統計的に処理して意味があるのだろうか?計測値は作成するソフトウエアの種別や領域と個人の経験との関係に密接に依存するのではないか?ちなみに現在までの演習問題で得られた私のデータは意味のある相関関係がないという結果に終わっている。
(2)ハンフリーは測定結果を使ってプロセスを変えないかぎり、改善はないとしている。ここで言われているプロセスを変えるとは、具体的にどういうことを意味するのだろう?PSP0からPSP1、2,3に至る進化のことをいっているのだろうか?各PSPのプロセス自体はウォーターフォールを前提としてかなり具体的に定義されたプロセスのように見受けられるが、そこまで決められると後はどういう改善が残されているのであろうか?
(3)ソフトウエア開発において、規模や工数を見積もることが最も重要な要素なのであろうか?例えば企業が開発者に対してPSPを適用させようとした場合、これは高度にモチベートされた向上心のある開発者が前提になっている。つまりPSP適用の前に、開発者のモチベーションを向上させるというPSPよりはるかに難しい課題に直面することになる。また高度にモチベートされた集団ならPSPを導入するまでもなく、良い仕事をするだろうと私には思われる。
(4)ハンフリーはソフトウエア開発をかなり単純化して考えているように思える。例えばターゲットとなる領域の知識(ネットワークやDCOM等)を持っているかいないかは決定的である。PSPに従わなくても開発はできるが、ターゲット領域の知識なくしては開発できない場合もある。経験から蓄積されるのは、数値だけではないことを見落としていないか?また蓄積される経験からの情報としては数値でないものほうが重要度と次の開発に対する影響度は大きいと思うのだが。
(5)統計的な手法が有効なのは、多数の開発者からデータを集めたときだと思うが、その場合に、データの使い方によっては、開発者が正確なデータを提出しなくなる可能性がある。(日立で起こった例のように)一方、純粋に個人でのデータ使用に統計的手法を適用することには疑問がある。
(6)PSPが「大規模ソフトウエア開発」における「個人のプロセスの改善」というのは矛盾しているように見えます。大規模ソフトウエア開発において、個々人が別々のプロセスを選択することは可能なのだろうか?
(7)ストップウォッチ片手にソフトウエアを開発するのは(本当である。私は演習問題を解くためにストップウォッチを買った。)、とても煩わしく、従って、今のところ他の人には薦めるわけにはいかない。

結論として、PSPで使われている統計的手法は、大規模なソフトウエア開発で、開発規模、工数を予測するのに役立つ可能性があるが、個人レベルでは疑わしい。PSPを適用することで開発手法に枠をはめたり、モチベーション等、もっと重要なソフトウエア開発の他の側面が指の間からすり抜けてしまう危険性がある。

否定的なことばかり書いたが、参考になる点も多い。私には特に、開発規模、工数を見積もるPROBE法が参考になった。技術者というものは、常に「銀の弾丸」を捜し求めている。特に人間的な要素が全くない手法には心を引かれる。うまくいきそうに思えるからである。だが最も重要で影響度が大きいのは、その人間的な要素である。外部にソフトウエアを発注するときに、CMM3で凡庸な管理者のいる組織より、CMM1でも優秀な管理者のいる組織(そういうものがあるとすれば)を選びたいと思うのは私だけであろうか。



「ソフトウエア インスペクション」
Tom Gilb, Dorothy Graham (1993)
共立出版(1999)
評価:★★★★☆
cover

レビューが効果をあげていないと悩んでいる人にはアイディアの宝庫である。もっともGilbは、レビュー、ウォークスルーとインスペクションに明確に一線を画している。インスペクションは、次の手順に厳密に従う。@計画、Aキックオフ、Bチェック(個々人の)、Cロギング(ミーティング)、Dブレーンストーミング、E編集、Fフォーローアップ。

読み進むほどに、我々が行っているレビューとインスペクションの乖離に驚かされ、これはとても実現できないという絶望感に襲われる。開発工数の15%をインスペクションに割くべきという主張や、インスペクション速度は重要で、1時間につきドキュメント1ページが標準ということにもショックを受ける。だがGilb自身が述べているように、カスタマイズあるいは役立ちそうなところを取り入れればよいのである。絶対に外せないところは効果の定量的な確認とインスペクションプロセス(或いはパラメータ)の改善である。本書には、導入に関するアドバイス、一般的な失敗しやすい場合、6つの企業のケーススタディ、メトリクス・書式のサンプルと、至れり尽せりである。私の抜粋では全体を把握しにくいが、リーダー、管理者に読んで欲しい1冊である。翻訳の質がよく、非常に読みやすかったことを付け加えておく。