開発プロセス標準化の幻想
ステンドグラスとレンガ積み
「定型的な開発プロセス標準化」が常に失敗するのは,ソフトウエアの持つ本質的な複雑さ-それこそ巨大なステンドグラスを組み立てるような*1-による部分が大きい.ソフトウエア開発が本質的に複雑なものであるという点については,まず異論はないだろう*2.ソフトウエア開発の大半は単純作業ではなく,非定型的で定式化できない知的作業である.これはソフトウエア開発に関わる者であれば,だれであろうと経験的に知っているものと思う.
これに対しソフトウエア開発の経験がない者は,「ソフトウエア開発は単純作業で−それこそレンガを積み上げて花壇を作るように− 簡単に誰にでもできるものだ」という幻想を持っている人もいるようだ.そして「簡単にできるはずのものができないのは,現場の技術者のレベルや意識が低いからだ,もっときちんと作業を標準化し,品質意識を徹底し,マニュアルを整備して開発現場に『秩序』をもたらせば,花壇を作るのと同じように誰にでもソフトウエアが作れるようになる」という幻想に捕らわれるものも出てきたりする.
しかし残念ながらそれは事実ではない.ソフトウエア開発においてもレンガを積み上げるような作業もないわけではないが,それらは全てソフトウエアにより自動化する方向に向かう.よく挙げられる例としてはコンパイラや,makeやantなどのビルドツール,GC,adaptive dynamic compilationなどがそうだ.*3そして最後まで人手に残されるのは,ソフトウエアによる複雑なルールを持ってしても自動化できない,ステンドグラスを汲み上げるような非定型的で知的な(言い換えれば『無秩序な』)作業だけになる.
しかも重要な点は,技術進歩により同じサイズのステンドグラスを汲み上げることが容易になったとしても,その時にはより巨大で複雑で,より芸術的なデザインのステンドグラスを,現在の半分の期間とコストで汲み上げることが求められるようになるということである.そのため,どれだけ技術が進歩しても,ステンドグラスを汲み上げる作業が誰にでも簡単にできるようになる日は永遠に来ない.
OOPで行われる設計と実装は,こうした非定型的な知的作業のなかでも最たるものだ.一般にOOPを活用した良い設計では非定型的で不規則なものになる傾向がある.よって「定型的開発プロセス標準化」による「オブジェクト指向設計の自動化」即ち「非定型的作業の定型化」は,必然的に失敗することになる.これはソフトウエア開発全般に対しても同じ事が言える.
ソフトウエアの品質
ソフトウエアの『品質』に関する議論も同様だ.「ソフトウエア開発では『品質』のばらつきが大きい」と言う言葉尻だけを捉えて,「製造業では『品質』は一定している.」「ソフトウエア業界で『品質』が一定していないのは,ソフトウエア業界の『品質管理』が製造業より遅れているからだ.」「製造業の品質管理手法をソフトウエアに『適用』すれば,きっと品質は一定にできるはずだ.」という幻想に捕らわれる者も出てくる.しかしソフトウエアにおける『品質』と,製造業の,特に組み立て工程における「品質管理」が意味する『品質』はその意味が全く異なる*4.
製造業における品質は,たとえば設計図通りに組み立てられているか,設計図通りの精度で作られているかなどが基準になる.設計図通りの位置,方式,精度等々が維持できていれば品質は高く,基準から外れれば外れるほど品質は低くなる.レンガ積みで言えば,ブロックの個数や位置,きちんと水平に積まれているかと言ったことがこれに相当する.*5
これに対しソフトウエアの品質では,そういう基準は本質的に存在しない.そもそもソフトウエアでは,精度については限りなく高い.ソフトウエアを構成する何MB,何GBというビット列のうち1bitのズレ(即ち誤差)さえも許されない.もしそれが1bitでも反転すれば,そのソフトウエアは誤動作する恐れがある.精度が高ければ品質が高いというのであれば,ソフトウエアほど「品質」の高い商品は他に類を見ないだろう.(デジタルデータなので,アナログとは精度の持つ意味合いが全く異なるのだが.)
ソフトウエアにおける「品質」は絶対値に対して近いか遠いかという誤差ではない.むしろ「高級品と安物」の違いという意味での「品質」に近い.「やはり高級品だけあって味が違う」と言うようなものがこれだ.では,味がどのように違えば品質がよいと言えるのだろう?*6或いは芸術的に価値の高いステンドグラスと,初心者が練習がてらに作ったステンドグラスの差と言っても良い.芸術的に明らかな差があるとして,それを一体どうやって計測すればいいのだろう?
ソフトウエアの品質は複数の指標の集合である上に,各々の指標自体も「ひと味違う」というような定量的に測定するのが困難なものが多い.「品質」を測ること自体が不可能に近いので,計測器に依存する品質管理手法はその時点で使えなくなる.*7他の管理手法があったとしても似たようなものだ.
「ソフトウエアにも同様の品質管理手法を適用できるはずだ」と主張する者はいても,実際に品質管理手法を適用する具体的な手法を提案し,実現したものがいるなど聞いたことがない.大抵は「論外」の一言で済まされてしまう.反論することさえ時間の無駄だ.
*1:「ステンドグラスの価格設定はとても難しいものです。材料費、制作時間、オリジナルかどうか、サイズ、何枚の構成か等で変わってきます。(http://www.octp-net.ne.jp/~jiro526/)」という問題は,ソフトウエア開発と類似していて興味深い.ステンドグラスの価格はその大きさだけで決まるわけではなく,デザインの複雑さや芸術性,使われるガラスの枚数などによって,様々に変化する.デザインが決まらない限りは見積もりもできない.
*2:この言い回しは,たしか「人月の神話」で使われた物だ.この本の邦訳は堅いことでも有名.この部分も「ソフトウエアというものはそれ自体が非常に複雑なもので,だからソフトウエア開発は大変なんだよ.苦労して当然なんだよ.」という程度の軽い言葉だと思われる.ただひたすらレンガを積んでいけば完成する花壇と,芸術的な色合いと形状まで考慮して試行錯誤しながら組み立てていくステンドグラスとでは,その複雑さが桁違いに異なる.それは複雑さに対する「量的」な差であるが,圧倒的な量的な違いは質的な違いになるものだ.
*3:ここでいう「単純作業」でさえもが,いかに複雑で高度な物であることか.コンパイラ技術を学んだものならば誰にでも理解できるだろうが,これもソフトウエア開発の経験が無い者には理解できない.たとえばJavaの文法を表すBNFがhttp://java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html#44467だ.オートマトンを使ってこれを処理するのも一種の「単純作業」だが,はっきり言って手作業で行うのはおよそ現実的ではない.
*4:異なるというのは本当に異なるのである.これもソフトウエア開発を知らない者には理解さえできず,「そんなのはソフトウエア業界の詭弁だ」と決めつける者もいるようだ.
*5:追記:たとえば「日本車は高い品質を誇る.」と言った場合に,前述の意味での「品質」意外の意味も含まれるかも.たとえば「摂氏50度にもなる砂漠から零下40度の雪原まで,いかなる環境化でもエンストやオーバーヒートなしに正常に動作する.」という車は「摂氏40度で長時間走るとオーバーヒートし,零下40度ではエンジンがかからない車」よりは「高い品質を誇る」というのではないか?だがこういう意味での「品質」は,(製造フェーズにおける)品質管理手法とやらによって得られるものではないだろう.しかもこの意味での「品質」は,メーカーによっても開発者によってもバラ付きが生じる.
*6:食塩などは分かりやすい例だ.1kgあたり100円そこそこの通常の食塩でさえ,純度99%以上のNaCl,非常に高純度の塩化ナトリウムでできている.これに対し,その数倍の価格の高級品には様々な「不純物」が混ざっている.純度が高く,不純物が少なく,品質にばらつきがないほど高品質であるのならば,高級品の方が「品質」が悪いことになる.
*7:最近では果物の糖度まで計測機で測定している.それでも食品の「味」に関しては,未だ人手(いや人舌)に依存している.試料に含まれる化学物質を計測する測定器も無いわけではないし,精度だけならば人間の味覚をも凌駕するものもでてきているという.しかし,もっと主観的で属人的な「味覚」というものを定量的に測定し,評価する方法は未だ存在しない.