ソフトウェア開発で問題が出るのは自分が作ったプログラムだけとは限らない
ソフトウェア開発をしていて問題が出る箇所と言えば、多くの場合は、自分が作ったプログラムの部分だと考えることでしょう。でも良く考えれば、コンパイラはもちろん、OSだってプログラムですから、問題がないとは言いきれないのです。
当社ではネットワーク関連を得意とするメンバー達が、かなり難易度の高いネットワークシステムの開発をしてきましたが、例えばプロバイダーで使うようなシステムを開発する場合には、自分のプログラム以外の問題がかなり立ちはだかります。
コンパイラの問題は昔は多かったのですが、最近はかなり少なくなった気がします。最適化のレベルを上げた際に意図した動きが省かれてしまったりすることがごく希にあるくらいでしょうか。
OSの、カーネルやドライバーは結構問題が出ます。普通の使い方をしていればほとんど問題が表面化することはないレベルだと思いますが、超高負荷をかけると意外なほどあっさりと不具合が出ます。
パケットを加工しながら処理するようなシステムを開発する場合、カーネルやドライバーをだまして使うことがよくあり、想定外の状態になった際に、例外処理がヌケていたり、リソースを食いつぶしたり、ひどい場合にはOSごと落ちてしまうようなことが起きます。まあ、想定外の使い方なので仕方ないのかもしれません。
なぜそんな想定外の使い方をしてまで標準品のLinuxなどを使うのか?ということを考えるかもしれませんが、一つは「ゼロから作る手間の問題」、もう一つは「互換性の問題」です。例えば、TCP/IPの処理をそれなりに自作することは可能ですが、それがどこまで世の中のネットワーク機器と問題なく通信ができるかということを考えると、少しでも多く使われてきたものを利用する方が確実なのです。インターネットを相手にするシステムの場合、標準に準拠していない機器も数多く存在し、それらは想定外だから、と通信できなかったり、あるいは不具合が発生してしまうのはよろしくないわけで、基本部分では「枯れた」システムをできるだけ使うのが確実なのです。
さて、自分が作った部分以外で問題が見つかった場合にどうするか、ですが、基本的には問題を回避する方法を見つけて、逃げます。Linuxなどのようにカーネルやコンパイラのソースコードも公開されていれば、自分で修正することも可能ですが、その修正が他に影響しないかなどを確認するのはかなり大変です。Windowsなどのようにソースが公開されていない場合は、そもそも逃げるしかなく、しかもどう逃げればよいのかも、ソースを調べて考えることができないので、大変です。
自分が作った部分に問題がないから、依頼者に「私のせいではない」と言いたくなることもありますが、依頼者はどこが悪いかを知ったところで何の意味もなく、目的を達成できるかどうかがポイントです。そういう意味では、自分が作ったところの問題を直すのなど簡単なことで、むしろOSやコンパイラの問題に気がつき、回避する方法を考える方がはるかに難易度が高く、そこまでやって初めて依頼者が喜ぶシステムが作れた、と言える状態なわけです。