読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

2004年に出たJUnit本が予想以上に勉強になった。

<スポンサーリンク>

古本屋でこんな本を買ってきた。

JUnitによるテストファースト開発入門 (次世代エンジニアへのパスポート)

JUnitによるテストファースト開発入門 (次世代エンジニアへのパスポート)

「買いに行った」というよりは、目についたので思わず買ってしまった感じだ。

この本が出たのは2004年で、10年前の本だ。
Eclipseがオープンソース化されて3年目の話で、Ruby on Railsが誕生した年でもある。
俺はまだパソコンに触ったことがなかった。
バージョン管理にはCVSが使われていたようだ。


書いてある内容は若干の年季を感じるが、現在は過去の積み重ねの上にあるもので、けっして断裂したものではない。
むしろ、古い内容を学ぶことが現在の技術の「元になったもの」を知るために役に立つだろう。

というわけで、100ページくらい読んだんだけど、面白かった部分をメモとして残すことにする。
この本は、実際のコードというよりは、思想的な部分が説明されていて、それは今でも役に立つと思う。

技術は変わっても、思想はあまり変わらないからだ。


■Eclipseの歴史
いま読んでいる、この古いJUnit本を読んで、ふと思い出したのが、大学時代のときのことだ。

元々すごく仲良かった女の子がいた。
友達として、よく遊んだり話したりしていた。

仲の良い男友達がいて、その男と遊ぶときに、友達の女の子も呼んだ。
仲良くなった。みんなで楽しかった。はずだった。

が、いつの間にか、女の子はその男の子と付き合い、だんだんと疎遠になって、俺とは遊ばなくなっていった・・・・。

みたいな。

俺がIBMで、女の子がEclipse。友達の男はオープンソース。みたいな。


EclipseはIBMのWebSphere Studio4.0がベースになっていて、本来はIBMが開発したものらしい。
それが2001年11月に、オープンソース団体であるEclipseプロジェクトの手に渡り、オープンソース化された。

今ではWebSphereなんて使っているのはよっぽど金に余裕があるSIくらいじゃないか?
だいたいのことはEclipseでできるし、プラグインも提供されている。

パッと調べた感じ、WebSphereのライセンスはベラボウに高い。
Eclipseがあるのに、こんな高いライセンス料を払う奴がどこにいるのだろう。

でも、元々はWebSphereから派生したものだとしたら、僕たちはIBMに感謝しなければならない。
そして、感謝しつつ、IBMには1円も払わない。

本にはWebSphereがベースとなってるって書いてたけど、ネットを色々調べてもそういう情報が出てこないんだよね。
wikipedia→http://goo.gl/cQnmnT

詳しい経緯を知りたい。


■テストファーストって何?
以下のように、テストを最初に持ってくる開発手法のこと。
1.設計
2.テストケース抽出
3.テストケース作成
4.プログラム作成
5.テスト実行

みたいに。
従来は以下のような順番で開発されていた。
1.設計
2.プログラム作成
3.テストケース抽出
4.テストケース作成
5.テスト実行

設計だけに基づいていた従来の手順に比べて、設計とテストケース双方に基づいてプログラミングするので、より仕様に忠実なプログラム開発が期待できる。XPではテストを重要項目(ベストプラクティス)としてあげている。

また、テストを最初に考え、テストケースを作っておけば、仕様がより明確に、わかりやすくなる。

テスト駆動開発(TDD:Test Driven development)は、テストファーストの思想に基づいている。


■テストいろいろ
単体テストとは、プログラムのロジックやインターフェースの動作を確認するテストのこと。
結合テストとは、画面やその裏の事務処理を連結したテストのこと。連結テストともいう。
運用テストというのは、システム全体で要件を満たしているかどうかを確認するテスト。

■V字モデル
システム開発の流れをV字に示したものがV字モデル。
要求分析・要件定義→基本設計→詳細設計→プログラミング→単体テスト→結合テスト→運用テスト
の順でシステム開発を行い、それぞれ「要求分析・要件定義が満たされているかどうか」を運用テストで確認。
基本設計の仕様が満たされているかどうかを結合テストで確認するように、対応している。

それをV字で表現しているってわけだ。

要求分析・要件定義----------------運用テスト
    基本設計---------------結合テスト
      詳細設計-----------単体テスト
              プログラミング

2014年になった今でもSIerではこの開発手法が主流と思われる。
イテレーションを回す開発手法を理解した上でV字にこだわるならよいが、V字モデルしか知らない勉強不足な管理職が、
「自分の知らないことは許さない」という理由で、テストファーストや継続的イテレーションを否定するなら、それは大いに問題があるだろう。

要求分析とは、顧客からの要望をインタビューしたもの。

要件定義とは、インタビュー結果を明確に定義したもの。
要件をユーザ機能としてリストする。

基本設計は、設計者が理解できるように、要件定義を変換したものである。クラス図やシーケンス図が成果物となる。

詳細設計とは、設計者がプログラマが理解できるように「分析」で得た結果を変換したもの。
オブジェクト指向開発では設計クラス図や設計シーケンス図が成果物となる。

プログラミングとは、設計で考えられた仕様に基づいて、プログラムを作成していくフェーズのこと。

なお、詳細設計書というモノはゴミという意見もあり、密かに同意している。

コードを書けばいいものをわざわざ、コード読めない人のために、日本語の資料をExcelで残すというのは、どう考えても無駄だよね。
コードで理解できないものを、それより抽象度の高い流れ図にしたところで、理解できるとは思えない。

全プロジェクトメンバーの中で、一番スキルレベルの低い人に合わせて作業しているとしか俺には思えないんだが、それは客から金もらって働くProfessionalな仕事の仕方なわけ?
それに、プログラミング能力のない人がプログラムの書き方を、Excelでプログラマに指南して、なんかいいことあるか?

http://gm7add9.wordpress.com/2012/11/30/%E8%A9%B3%E7%B4%B0%E8%A8%AD%E8%A8%88%E6%9B%B8/

コメント欄が味わい深い。
「通りすがり」で噛み付いてる人は間違いなくプログラミングの知識がない人で、SIではこういう人が大半だ。

そして、こういうSI議論を見るたびに、社会人になりたての頃の嫌な思い出がフラッシュバックして、嫌な気分になるのが辛い。


■テストで発覚するエラーの種類

エラー名 意味
計算エラー 計算結果が不正なエラー
比較エラー 2つの値の比較が不正なエラー
インターフェースエラー 与えたデータに対する返り値の型の不整合、あるいは引数の数の不一致によるエラー
データ構造エラー データ及びデータ構造によるエラー

情報処理試験の勉強でこんなんやった気がする。


■テストするべき事項

テスト事項 意味
制約値テスト システムの制約(言語仕様含む)に依存するテスト
限界値テスト アプリケーションが許す限界値を確認するテスト
例外処理テスト システムの制約に依存するテストあるいはアプリケーションで発生する例外処理に対応するテスト
妥当性テスト 処理結果が正しいかどうかを確認するテスト
存在テスト ある値がデータとして存在するものかどうかを確認するテスト

制約値テストと限界値テストは、「境界値テスト」に分類される。

Javaの制約値

最大値 最小値
byte 127 -127
short 32767 -32768
int 2147483647 -2147483648
long 9223372036854775807 -9223372036854775808
float +-3.4×10の38乗 +-1.4×10の-45乗
double +-1.7×10の308乗 +-4.9×10の-324乗
char 65535'\uffff' 0'\u0000'
boolean 1 0


■エラーにするか、例外にするか
・「あらかじめ予測できる場合」はエラーとして処理する。ユーザは処理を続行できる
・「あらかじめ予測できない場合」は例外として処理できるようにする

→この辺の基準は自分の中で曖昧だったから勉強になった。

■MavenとEclipseの連携
Maven1の話だけど。
この本が出た当初はEclipseもMavenも出たばっかりで。

MavenプロジェクトをEclipseに取り込む手順が詳しく載っていたので、メモ。

1.maven genappでプロジェクトを作成する。
2.maven eclipseでEclipseが必要とする.classpathファイル、.projectファイルを生成する
3.Eclipseから「既存プロジェクトをワークスペースへインポート」する

Maven2、Maven3でもやることは同じかな?
mvn genappとかあった気がする。