ビジネス
【連載】第2回:ソフトウェアテストそもそも話~ソフトウェアテストの黎明から揺籃の時代(前編)~

「HQW!」の読者の皆さん、こんにちは。辰巳敬三です。
この連載コラムでは、ソフトウェアのテスト技術や品質技術の歴史を紹介しています。
第1回は、ソフトウェアテストという名称の「そもそも」の話として、「テスト」「プログラム」「ソフトウェア」といった用語の由来や、「ソフトウェアテスト」という呼び方が一般的に使われるようになった時期について前後編で紹介しました。
今回は、テストや品質技術の個別の話題に入る前に、全体の歴史を整理し、ソフトウェアテストの黎明期から揺籃期、つまり1950年代から1960年代の状況を2回に分けてお伝えします。昔の人は「そもそも」どのようなテストをしていたのでしょうか。なお、当時はまだ「ソフトウェアテスト」という用語は使われていませんが、本稿では便宜上「ソフトウェアテスト」という表現を用います。
ソフトウェアテスト技法タイムライン
まず、コンピューターやソフトウェア開発の歴史、そしてテスト技術の歴史をタイムライン(年表)で確認しましょう。
タイムラインの上部には、Capers Jonesが示したソフトウェア工学の歴史に基づく年代区分を記載しており、それぞれのタイトルが当時の状況を表しています[1]。年代区分の下には、各時代におけるエポックメイキングなハードウェア、ソフトウェア、稼働システムを示し、中段以下には、テスト技法が考案された時期を記載しました。このタイムラインを見ると、テスト技法が本格的に登場するのは、1970年代に入ってからであることが分かります。

夜明け前(1950年代初め)
前回紹介したように1946年に開発されたENIACでは、スイッチ群やケーブルの配線を変更することでプログラムが設定されていました。現在のコンピューターのようなプログラム内蔵型、いわゆるノイマン型コンピューターの最初のものといわれているのが1949年に英国ケンブリッジ大学のMaurice Wilkesらが開発したEDSACです。EDSACで最初に動作したプログラムは0から99までの整数の二乗の表を作るプログラムだったそうで、1949年5月6日に動作した際の手書きのメモが残されています[2]。
テストの歴史の観点からは、1951年には早くもバグ分析やデバッグに関する論文が発表されています[3]。EDSACの開発メンバーのStanley Gillは、この論文でプログラムの誤りを、実行順誤りと数値誤りに分類し、それらをチェックするためにEDSACで提供しているチェック用サブルーチンを解説しています。ただ、この論文ではチェック用のデータをどのように選ぶのか(すなわちテストデータの設計)までは言及されていません。また、Gillは、「難しいのは間違い(mistake)の存在を検出することではなく、異常原因の究明(diagnosis)である」という認識を示しています。
プログラムの誤りが2種類に収まり、ハードウェアの信頼性が低い時代としては、この認識は当たり前だったのかもしれません。この論文では、bugではなくmistake、 debuggingではなくdiagnosisが用語として使われていますが、これはGillが英国の人だからなのか、bugやdebugという用語がまだ一般的ではなかったからなのか、理由は分かりません。
黎明期(1950年代)
デバッグ指向の時代(~1956年)
David Gelperinらの論文『The Growth of Software Testing』[4]では、テストに対する考え方の成長(進化)の歴史を五つの時代に区分し、1956年までを「デバッグ指向の時代」としています。ソフトウェア自体をテスト対象にするという意識は薄く、ハードウェアの信頼性の一部として考えられていました。また、プログラムを書いたらチェック(checkout)するという程度の認識であり、プログラムのチェックアウト、デバッグ、テストの概念は明確に区別されていませんでした。
当時のチェックアウトあるいはテストの方法を伺い知れる文献として、1956年発行の『IBM 650 Program Testing Manual』[5]と1957年発行の『Digital Computer Programming』[6]があります。
前者から当時の状況を見てみましょう。『IBM 650 Program Testing Manual』は、IBMデータ処理センターを利用してプログラムをテストする顧客向けに作成されたマニュアルです。センター利用規則、機器や備品の紹介などセンターの利用手引きの内容に加えて、テスト前の準備、テストの実施、効率的なテストのための注意点に関する技術的な事項が書かれています(筆者訳)。
テスト前の準備 | ・プログラムへのデバッグ支援機能の組み込み ・ブロック図、プログラム、パンチカードの机上チェック ・データや命令のアドレス、全ての定数などのリストの作成 ・全体ブロック図、詳細ブロック図の準備 ・サンプルデータカードとサンプル結果カードの準備 (筆者注:テストデータ、テスト結果判定データに相当) |
---|---|
テストの実施 | ・アドレス停止、メモリ出力、トレース機能を活用してエラーを特定 ・明確に特定したエラーのみをコンソールで修正 ・テスト時の手動操作は最小限に |
効率的なテストのための注意点 | ・プログラム設計時にエラー処理や停止コードを活用 ・コンソールエラーの原因と対処方法 ・コントロールパネルの配線の共通エラーとその修正方法 |
デバッグに関するものが多い中で、事前の机上チェック(レビュー)が推奨されていることに注目しました。これは、計算機が大変高価な時代であったことが大きいでしょう。テストデータの設計の観点では、次のように、現在にも通じるテスト設計の基本的な考え方が書かれていることに(先人には失礼ですが)少し驚きました。
・実際のジョブで遭遇する典型的なデータを含むカードを最小限の数用意する
・単純な側面から始めて最も複雑なケースまでテストが続けられるように設計する
・最初のテストサンプルは基本的なプログラムで処理し、後続の各サンプルでは新しい複雑な問題を一つだけ取り入れる
・さまざまな異常な特性を組み合わせ、個々のサブルーチンに加えて、プログラムスイッチと分岐のネットワーク全体をテストする
テストとデバッグの区別(1957年~)
前述の『Digital Computer Programming』はプログラミングの教科書としては最初の書籍です。"Program Checkout"と題された章でデバッグやテストに関する事項が書かれていますが、Rand社のCharles L. Bakerは書評で、デバッグとテストが区別されていないと批難し、次のように指摘しています(筆者訳)[7]。
McCrackenはプログラムのチェックアウトにおける2つのフェーズ、デバッグとテストを区別できていない。デバッグとは、プログラムがコーダーの意図通りに動作することを確認するプロセスを意味し、テストとは、解決しようとしている問題をプログラムが正しく解決することを確認するプロセスを意味する。この違いは大きいが、経験豊富なプログラマーであっても、テストフェーズをしばしばひどく軽視している。
1957年に書かれたこの書評を、Gelperinらは、デバッグとテストを区別し、テストをプログラムが仕様を満足しているか否かの確証を得るためのものと考えた時代の幕開けとして位置付け、1957年から1978年を「論証指向の時代」としています。
ところで、Bakerによるデバッグとテストの定義は、現在のわれわれの認識(テストは、欠陥に起因するソフトウェアの故障を見つけるプロセス、デバッグは、故障の基となる欠陥を見つけて取り除くプロセス)とは異なっています。現在の定義に照らすとVerification(検証)とValidation(妥当性確認)の意味合いに近く、この時期にV&Vの考え方の萌芽があったとも言えそうです。
では、デバッグとテストが現在のように定義されたのはいつごろでしょうか? 1973年に出版された『Program Test Methods』の編著者であるWilliam C. Hetzelは、"A Definitional Framework"(定義的枠組)と題してテスト関連の用語を整理し、デバッグとテストについては次のように考えを示しています(筆者訳)[8]。遅くとも1970年代初めまでには現在の定義に落ち着いたと思われます。
歴史的には、デバッグとテストとはひとまとめにされてきたが、実際はまったく別のものである。デバッグは既知の誤りで始まり、正しくしようとすることであるが、テストは仕様がどれほどよく満たされているかを測定することである。
以上、前編では、ソフトウェアテストの黎明期である1950年代にどのようなテストが行われていたのかを紹介しました。後編では、ソフトウェアテストの揺籃期である1960年代の状況を詳しく見ていきましょう。
<参考文献>
[1] C. Jones, "The Technical and Social History of Software Engineering," Addison-Wesley, 2013
[2] EDSAC99, https://www.cl.cam.ac.uk/events/EDSAC99/
[3] S. Gill, "The Diagnosis of Mistakes in Programmes on the EDSAC," Proceedings of the Royal Society of London. Ser. A, Mathematical and physical sciences, vol. 206, Issue 1087, pp. 538-554, May 22 1951
[4] D. Gelperin and B. Hetzel, "The Growth of Software Testing," Communications of the ACM, Volume 31 Issue 6, June 1988, pp. 687-695
[5] "IBM 650 Program Testing Manual," IBM, 1957
[6] D. D. McCracken, "Digital Computer Programming," John Wiley & Sons, 1957
[7] C. Baker, Review of D.D. McCracken's "Digital Computer Programming," Mathematical Tables and Other Aids to Computation, Vol. 11, No. 60, October, 1957
[8] W. C. Hetzel(Ed), "Program Test Methods," Prentice-Hall, 1973(鳥居 宏次(訳),プログラム・テスト法,近代科学社,1974)
この記事は面白かったですか?
今後の改善の参考にさせていただきます!