ソフトウェアの品質、複雑性、生産性などを具体的な数値で計るのが「ソフトウェア・メトリクス」ですが、何をどう計測し、計測値をどう使えばよいかという根本的な問題は、いまだに解決されていません。本コラムでは、ソフトウェア・メトリクスの歴史をひもときながら、ソフトウェア・メトリクスの本質に迫ります。
ソフトウェア・メトリクスの歴史を「混乱期」「胎動期」「活動期」「反抗期」「成熟・定着期」に分割し、前回「人類初のソフトウェア・メトリクスをめぐる熱い論争」では胎動期を取り上げ、McCabeの「Cyclomatic Number(循環的複雑度)」の概要や課題、その怪しさについて述べました。今回は、循環的複雑度より、もっと怪しい(?)「ソフトウェア・サイエンス」について解説します。
ソフトウェア工学関係の学会誌で圧倒的に権威が高いIEEEの「Transactions on Software Engineering(通称、IEEE TSE)」に、Thomas McCabeが「A Complexity Measure」と題した論文を発表しました。これが、世界で最も有名なソフトウェア・メトリクスの論文です。ソースコードやフロー・チャートのアーク(矢印)の数、ノード(結節)の数、プログラムの数から、プログラムの複雑度(循環的複雑度)を計算するというものです。
循環的複雑度の計算は非常に簡単ですが、問題はその計算法ではなく、“意味”にあります。「循環的複雑度の定義」をめぐって、当時のソフトウェア工学の学会は大紛糾しました。IEEE TSEに発表した論文には、「循環的複雑度とは何か?」や「複雑性の定義」についてどこにも記されていないのです。「このように計算すると、ソースコードの循環的複雑度を計算できる」としか書いてありません。McCabeの循環的複雑度が発表された当時、「素晴らしい考えだ!」と無条件に信じた人と、「科学的根拠がない!」と懐疑的な態度を取る人たちに二分されました。
Maurice H. Halsteadが1977年に発表したのが、「Elements of Software Science」という論文です(注1)。これは、プログラムをコーディングするときに使うオペレータ(+、−、*など)やオペランド(Data01、8のような変数や、定数)の種類や数に注目したメトリクスです。要は「幼稚園児用の絵本は、語彙(ごい)の種類や数が少ないので読みやすく、理解しやすいけれど、科学技術の専門書は、その反対なのでものすごく読みにくいし、理解が難しい」ということを数式化したもの(らしい)です。
具体的な計算法を図1に示します。この数式を見て、平均的なソフトウェア技術者が感じることは、「えっ、何この複雑な式は? 何をどう計算しているの?」でしょう。数学嫌いの理科系と、なぞなぞが好きな文科系が大集合するソフトウェア業界では、少し複雑な数式が出てくると、死んだふりをする人が多いので、ごく自然な反応だと思います。
図1 ソフトウェア・サイエンスでの計算法
※注1:Halstead, M.H.,“Elements of Software Science,”New York, Elsevier North- Holland, 1977
McCabeの循環的複雑度が発表された翌年に、Halsteadのソフトウェア・サイエンスが出現し、大きな話題となりました。
まずは、その名前です。たかだか、ソフトウェアの複雑性の計測なのに、“ソフトウェア・サイエンス”とは、大風呂敷を広げた感が否めません。名前から受ける印象は、「ソフトウェア工学」の片割れみたいに雄大で巨大なものです。そのため当時、この名前に惑わされたり、反発したりする人は多かったようです。
ソフトウェア・サイエンスでの算出式を見ると、オペレータの種類と数、オペランドの種類と数が分かると、プログラムがメモリ上に占める大きさやプログラム開発に必要な時間まで計算できることになります。しかも、その根拠は、どこにも示されていません。このあたりの事情は、循環的複雑度と同じです。循環的複雑度と同様、「信ずる者は救われる」という考え方です。「科学的根拠がない!」と反発する人は、循環的複雑度とソフトウェア・サイエンスをまとめて攻撃しましたし、一方の信奉者は、両方を庇護(ひご)しました。
ソフトウェア・メトリクスの歴史は、混乱期、胎動期、活動期を経て、反抗期へ移行するのですが、反抗期では、メトリクスが中世の「魔女狩り」のようなバッシングを受けました。バッシングにおいて、循環的複雑度とソフトウェア・サイエンスを比べると、大風呂敷を広げ、開発時間まで計算できると大見得を切ったためか、ソフトウェア・サイエンスに対する風当たりが圧倒的に強く、かつてソフトウェア・サイエンスを熱心に適用していたエンジニアや研究者までが、手の平を返したように攻撃側に回ったこともあったようです。
これで、循環的複雑度とソフトウェア・サイエンスという“ソフトウェア・メトリクス劇場”の2人の主演俳優がそろいました。そこへ、ソースコード行数(LOC:Lines of Code)も含めて、三つどもえになって活動期へ移行し、世界中で計測大会がはじまるのです……。次回は、活動期について解説します。(次回に続く)
これまで、ソフトウェア・メトリクス関連のコラムを書いてきましたが、今回、ある読者の方から、間違いの指摘や貴重なコメントをいただきました。ここでおわびの意味も込め、指摘の詳細な内容と、それに対する回答を記します(なお、以下指摘個所に対する修正は対応済みです)。
まずは、最終年の1977年について。翌1978年、世界で初めてソフトウェア・メトリクスの論文が権威ある学会論文誌に掲載されました。1978年は、「メトリクス誕生の年」です。
⇒McCabeの「A Complexity Measure」の論文を指しているはずですが、この論文の掲載年は「1976」年です。
⇒過去10年間、A Complexity Measureの初出が「1978」年だと思い込んでいました。その間、誰からも指摘を受けず、間違いに気が付いたのは半年前でした。
これは1966年、ソフトウェア工学の大家であるBarry Boehm(バリー・ベーム)が唱えたもので、どんなプログラムでも、「連結(Concatenation)」「選択(Selection)」「反復(Iteration)」の3つで表現できるという理論です。
⇒これはまったく間違っています(名前は似ていますが……)。この理論は「構造化定理」と呼ばれているもので、イタリアのCorrado BöhmとGiuseppe Jacopiniが1966年に以下の論文を発表しています。
Böhm, C. and Jacopini, G., "Flow diagrams, turing machines and languages with only two formation rules." Comm. ACM 9, 5(May. 1966), pp.366-371
⇒これも、完全にわたしの勘違いです。8年前から間違っていました。お恥ずかしい限りです。わたしの手元にあるソフトウェア工学の本に、“Mathematics Theory [Boehm66]”とあり、巻末の参考文献一覧にある[Boehm66]を見たところ、10ほどあるBarry Boehmの論文や文献の中にあったため、自動的・短絡的に、あのBarry Boehmの論文であると思い込んでいました。
1976年、銀河系で最高のその論文誌に、Thomas McCabeがA Complexity Measureと題した論文を発表しました。これが、世界初のソフトウェア・メトリクスの論文だといわれています。筆者は、このことに(一応)敬意を表して、本講では、ソフトウェア・メトリクスの胎動期の開始年を1976年としました。
⇒寡聞にして、McCabeの論文が「世界初のソフトウェア・メトリクスの論文」だといっている人を知りません。ソフトウェアにおけるメトリクスについてはすでに1968年の以下のRubey&Hartwickの論文(注2)で提案されており、Barry Boehmの論文(注3)でもRubey&Hartwickの論文を品質の属性やメトリクスに関する先行研究としてリファーしています。このRubey&Hartwickの論文には、参考文献が挙げられておらず、これよりさかのぼることはできないので、もしかするとこれがメトリクスに関する最初の論文かもしれません。なお、メトリクスの前にソフトウェアを付けた“ソフトウェア・メトリクス”という名前は、1976年にTom Gilbがはじめて使った(造語した)といわれています。
注2:Rubey, R. J., and R. D. Hartwick, "Quantitative Measurement of Program Quality," Proceedings," ACM National Conference,1968, pp. 671-677.
注3:Boehm, B. W., Brown, J. R, and Lipow, M. "Quantitative evaluation of software quality," 2nd ICSE, 1976
また、同様の記述はBarry Boehmの1973年のTRWのレポートにもあります。以下のように書かれています。
Previous Studies. Development of methods for evaluating software quality appears to have first been attempted in an organized way by Rubey and Hartwick.(3) The method of Ref. 3 was to define code "attributes" and their "metrics," the former being a prose expression of the particular quality desired of the software, and the latter a mathematical function of parameters thought to relate to or define the attribute.
⇒わたしは、以下の理由から、Thomas McCabeのA Complexity Measureが“世界初のソフトウェア・メトリクスの論文”と考えました。
(1)書籍や学会のプロシーディングではなく、権威のあるジャーナル・ペーパー(特に、IEEE TSE)に載ったメトリクス関連の論文であること。
(2)最も有名で、世界的かつ広範囲に適用されたメトリクスとして最初であること。
いずれにせよ、連載第24回の記述は説明不足で、誤解を招くため、ご指摘いただきました内容の説明を追記することで対応します。
【 筆者紹介 】
山浦 恒央(やまうら つねお)
東海大学 大学院 組込み技術研究科 助教授(工学博士)
1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科助教授、現在に至る。
主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。