1976年の「ソフトウェアエンジニアリング」という論文を読んだ感想
これは、IEEE TRANSACTIONS ON COMPUTERS, VOL. C-25, NO. 12, DECEMBER 1976に掲載されたベームという有名な方の「ソフトウェアエンジニアリング」という論文の感想です。
最近、ソフトウェアエンジニアリングって言葉の意味を調べ直してました。私たちの仕事は「エンジニア」って言うことが多くありますが、正式にいうとソフトウェアエンジニアだし、エンジニアリングをする人たちだからエンジニアなはずなので、そもそもソフトウェアエンジニアリングって何かからわかっておく必要あると思うからです。
そうしたら、辰巳さんに以下の情報を教えてもらいました。
バリーベームはソフトウェアエンジニアリングを学ぶ上で必ず押さえていた方がよい人です(要件の段階でバグを取り除いたほうがテストで取り除くより効率良いし、本番行ってからより1/100のコストしかかからないって話を最初にしたのはベームです)。
なのですが、私はこの論文を実際に読んだことがありませんでした。ちゃんと知っておくべきだと思い奮発して買ってしまいました。(円安なので高かった!)
読んでみると、50年近く前の論文なのに本質的に書いてあることは今も変わらなくて、刺激的でした。
アブストラクトにはこんなことが書いてあります。
論文について
構成はこうなっています。
はじめに
定義
ソフトウェア要求エンジニアリング
ソフトウェア設計
プログラミング
ソフトウェアのテストと信頼性
ソフトウェアメンテナンス
ソフトウェアマネジメントと統合アプローチ
まとめ
どんなことが書いてあるかと、私の感想をそれぞれ書いていきます。
はじめに
まず、「1950年代ごろは、ハードとソフトのコスト比率だと、ハードが80%以上だったが、今後ソフトのコスト比率が増えて1985年くらいには全体の80%くらいがソフトのコストになり、さらにその中の80%くらいがメンテナンスコストになる」って調査を引用してます。そしてソフトウエアエンジニアリングを「コスト効率よく、信頼に値する」開発の手段であるって書いてます。
定義
ソフトウェアエンジニアリングの定義はこうです。
この定義にいくつか大事なポイントがあるよって書いてるのですが、最後に書いてあるこれ↓
が「だよ、そうなんだよな!」って感じです。私だけでなく、みんな気付いてることだし、いろいろな方による多くの名言もありますが、結局エンジニアリングってサイエンスを適用する際に起きる人間模様とか人のスキルアップのための努力とか組織文化とかそういう話が大事になるんだよなって思います。「1976年から既にわかってることなんじゃん」って思いました。
ついでに書くと、エンジニアリングを「工学」と訳すのは私は嫌いです。エンジニアリングはあくまで「技術の現場への適用」をすることであり、「技術の現場への適用」を学問として学ぶことが工学なので。
ソフトウェア要求エンジニアリング
要求の段階で仕様化するのがなんで大事かというと、「この段階で間違いがわかれば、運用に入ってからよりも1/100の工数で修正できるからだ」っていうベームならではの話が既に図とともに説明されています。この段階でちゃんと仕様化されてないと、他にも問題があるって書いてあり、「トップダウン設計ができなくなる(トップダウンとは、要件が正しく完璧だって前提で設計をして良いという考え方)」とか「テストするのものがわからないのでテストできない」とか書いてます。まったく今に通づる話でこの50年弱の間、私含めてエンジニアは何をしてるんだろうって笑っちゃいます。
ソフトウェア設計
これには「要件と設計のジレンマ」って副題がついてます。「理想的には、ソフトウェア設計に進む前に、完全で、一貫性があり、妥当性が確認され、曖昧さがなく、ハードウェアに依存しないソフトウェア要求仕様があることが望ましい。」けど、それは無理なので複数の設計をして選択が必要になるとのこと。確かに。けど、問題は選択肢がどんどん増えてって自由度が高いために選択のための技術などが必要になるって話が書かれてます。標準化した方が悩まなくて済むとも書いてあります。
プログラミング
プログラミングは研究してる人がたくさんいるからそっち読んでね。って感じでした。
ソフトウェアのテストと信頼性
しょっぱなに「テストにかかるコストが高い(開発工数の40~50%を占める)」にもかかわらず、コードを実行するまでテストのこと何も考えないことが多いって書いてあります。
テスト計画をちゃんと立てるのがよいとか、信頼性の評価でハードウェアの考え方が使えない(ソフトは劣化しないとかですね)、シンボリックエクゼキューションの話とかテストの十分性(入力空間や出力空間が無限になるよって話)、静的解析、デバッグ、再テストなど本当に色々なことが書かれてて、例は古いのですが考え方は今でも全部使えるものばかりで、逆いうと、それだけ進化できなかったのか、難しいのかって感じです。
ソフトウェアメンテナンス
こちらもしょっぱなに「ソフトウェアメンテナンスは非常に重要な活動であるが、非常に軽視されている。」って書かれてます。メンテナンスは、今でいう機能修正や拡張とリファクタリングがあるよとか、ドキュメントのトレーサビリティと、再テスト可能なソフトウェア構造が重要だって話が書いてあります。
ソフトウェアマネジメントと統合アプローチ
こちらのしょっぱなの文章は原文から載せたい!
そのうえで「計画しない」とか「リソース見積もらない」とかマネジメントの問題になる理由をたくさん上げてくれていて、その解決のためにワインバーグやブルックス(人月の神話の著者)の本を始め、たくさん紹介してくれています。けど、問題点としてマネジメントとテクノロジーの断絶(Management-Technology Decoupling)ってことが書かれてて、これも現代でも問題になってるよなーって思いました。マネジメントするにもまずは技術ありきで、技術をどう上手く使うかって話のはずなのに、両者がうまく噛み合ってない、逆に技術の話にはマネジメントが入らない、ここに問題があるって、これも50年近く前から言われてることなんだよなって改めて考えちゃいます。
まとめ
まとめでは、ハードウェアエンジニアリングの世界とソフトウェアエンジニアリングの世界を比較した表を提示してて、ソフトウェアエンジニアリングは「比較的経済性に依存しないコンテキストにおける、専門家によるシステムソフトウェアの詳細設計とコーディング」の領域では発展しているが「普通の技術者によるソフトウェアの要求分析、設計、テスト、保守の適用という、経済的にもっとも大事な問題」で、この領域だと「私たちの科学的基盤は非常に乏しく、現在の技術が "ソフトウェアエンジニアリング "と呼ぶに値するかどうか、真剣に疑問視してしまう」状況だとのこと。なのでこの後者の領域は、リスクが高いけど取り組む価値があり、いろいろな問題の解決に向けた道が開けるので頑張ろうって感じでまとめてます。
全体を通しての感想
この論文は1976年のものですが、「これって実は2024年の論文ではないのか?」って思ってしまう錯覚におちいりました。今、こういうことが書いてあってもそれほど驚かないので。
途中でも書いたけど、ソフトウェアエンジニアリングって、その科学的知識を適用するのが人なんだってところが難しくしてるのかなって思いました。この論文のソフトウェアテストのところでも、テストの入力空間が無限になる理由に「どのような入力xに対しても、プログラムがそれを特殊なケースとして誤って扱わないことを保証しなければならないから」無限になるとか、プログラムの証明も非自明なものは非常に困難で100行のコードでも専門家が1人月かかるとか書いてます。
だからこそ「a fascinating challenge(魅力的なチャレンジ) 」だってベームさんも50年前に言ってるので改めて頑張ろうと思いました。