ソフトウェアと機械部品を設計しています。
それは複雑です。
現代のソフトウェアには何百万もの「部品」があるためです。
ソフトウェア部品は非常に複雑であり、多くの状態があります。機械的に動かない部分には状態がありません。
機械的な可動部品には位置があります(1つの変数)。
実行中の1MbのRAMを使用するプログラムには、100万バイトの状態があります。これは、通常の機械システムよりもはるかに多くの状態です。
まれにしか発生しないため、テストされない状態の組み合わせがあります。機械システム(自動車など)では、動作中に機械部品が互いにぶつからないことを簡単に確認できます。私が職場で使用している機械式CADソフトウェアは、自動的にそれを行います。
目に見えない非接触部品から機械を構築し、数百万の可動部品があり、それらすべてが互いに見逃していた場合、単純なプログラムのようになります。
「hello world」でさえ、オペレーティングシステム上で実行されます。古い8ビットシステムとミニコンピューターのオペレーティングシステムは、シンプルであるため非常に信頼性が高くなりました。
DLLや共有ライブラリなどは、ウイルスの更新やソフトウェアのインストールの一部として置き換えられ、目的のプログラムが機能しなくなります。車のタイヤを自転車のタイヤに交換するようなものです。ライブラリ関数のエッジ状態のいくつかは干渉します(プログラムが期待するように動作しません)。
オブジェクト間の多くの設計されていない相互作用(ポインターの再利用、配列境界のオーバーフロー)を許可しないJavaのような言語で書かれたプログラムは、それらを動作させると一般にかなり信頼できます。
静的ライブラリを備えたオペレーティングシステムを使用する場合、プログラムが動作すると、動作し続けるだけです(ただし、状態サイズに基づいて多くのエッジ条件があります)。
Dave Parnasは、プログラムの状態を小さくすることにより、ソフトウェアの信頼性を高めることについて書いています。厳密な関数型プログラミングの担当者は、単一の静的割り当てを強制することで同じことをしています。