ソフトウェアになぜバグがあるのか


これまで、システムエンジニアに必要なスキルは、ソフトウェアを作る際に必要な技術に関するスキルとその人なりの資質である基礎スキルの2つのスキルが必要であることを書いてきました。

基礎スキル システムエンジニアの資質
技術スキル ソフトウェアを実現するスキル


別の面では、ソフトウェアを設計、コーディングする際には、ソフトウェアを作成するために提供する技術を身につけ適用するスキルとソフトウェアのコードをどのように表現すするかのデザインを設計するスキルが前述の技術に内包されるスキルが必要です。

基礎スキル システムエンジニアの資質  
技術スキル ソフトウェアを実現するスキル 技術を身につけるスキル
    デザインするスキル


ソフトウェアを実現する道具は通常、言語として提供され、言語を道具として利用する方法を身につけることでソフトウェアを作成することができます。ただ、その言語を実現する道具としてどの機能をどのように使うかは言語でソフトウェアを作成するシステムエンジニアにかかっています。


同様に、ソフトウェアを言語を使ってどのようなデザインにするかは、デザインするシステムエンジニアに依存していまいます。デザインについて少し補足をすれば、アルゴリズムやパターンを学習し、適用技術を身につけることで体系化されたプラクティスをもとにベースとなるスキルとすることができます。


ここまで書いてきて思ったことは、ソフトウェア作りには、工業製品を生産するように同じ品質特性を持つソフトウェアはどだい無理なんだということです。なぜなら、ソフトウェアを生産するベースであるシステムエンジニアに型を持たせ、繰り返し作業でソフトウェアを作ることはできないからです。

基礎スキル システムエンジニアの資質  
技術スキル ソフトウェアを実現するスキル 技術を身につけるスキル
    デザインするスキル


表のどれをとってみても、ソフトウェアをつくるシステムエンジニアの資質に依存してしまう。型を使った生産なら、試作して、不良があれば型を直して量産すればいいわけです。でも、ソフトウェアを生産する型に相当するシステムエンジニアがひとによりバラバラなんですね。型の出来具合により品質特性がバラバラなんです。


同じ言語を適用するにしても、どのように使うか、どうデザインするかは型であるシステムエンジニアにかかっています。もう、これはひとがソフトウェアを作る限り、システムエンジニアの思考が入り込む余地があるかぎり、特性のばらつきが生じそれがバグとして潜り込み、発現するのです。


この考え方であればシステムエンジニアのスキルの成熟度に依存することはありません。だれでもソフトウェアを作る際に必要となるスキル自体にバグを潜り込ませる可能性を持っています。ただ、成熟度が上がれば上がるほど、その可能性は小さくなると言うことができます。それは前述の表のそれぞれのスキルが高いためにバグを混入を低減するためです。


これらのことからソフトウェアのバグはそのソフトウェア作りに必要となるスキル自体にバグを潜り込ませる要因を持っているということが言えます。この方法をとっているかぎり、バグはゼロにはならないわけです。