バグなし、欠陥なし、またはシステム自体の信頼性

今日、Egor Bugaenkoの出版物を見て、 いつテストをやめますか! 、システムに欠点がないことをテストして主張する問題が根本的に解決されていないという事実を理解し、考える人がほとんどいないことに驚いた。 ちなみに、これは電子選挙の導入、およびセキュリティホールがないことの証拠の役人とジャーナリスト側の要件に関連しています。 たとえば、この国(エストニア)では、この議論が本格化しており、政治家は電子選挙システムの信頼性を100%証明したいと考えています。 公的な政治家は一般に、正式な形式の論理に不慣れです。 そして、ヒュームとポッパーはせいぜい、忘れられがちな退屈な哲学セミナーのようなものを思い出します。 しかし、コードがテストされ、エラーがまったくないことをテスターまたはシニアが真剣に証明し始めたと聞いたとき、私の顔はこの表現を取得します:



画像



特にITプロフェッショナルの口先から、このタイプの質問のポーズを除外する必要がある主な点がいくつかあります。



最初の瞬間は論理的です



ヒュームが真剣に考えた帰納の問題は、一連の問題や質問全体を実証する可能性に疑問を投げかけています。 たとえば、特定の私的な観察の存在からいくつかの一般的な結論を導き出すことは不可能です。 何かを無制限に観察しても、声明の真実を確認することはできません。 人類史上最も素晴らしい天才の一人であるカール・ポッパーは、改ざんの問題に注目し、科学哲学の新しいパラダイムの著者になりました。 改ざんの問題の本質は何であり、これは私たちにどのように関係していますか? 最も有名な例はブラックスワンです。 ブラックスワンは、ロンドンの16世紀のあらゆるものの不可能性の象徴でした。 旧世界は、白鳥のすべての歴史的記録が彼らの白い羽を記述したので、すべての白鳥が白いと仮定しました。 そして、この文脈では、黒い白鳥は不可能であったか、存在しませんでした。 しかし、17世紀に、旧世界の代表者はオーストラリアでは不可能に出会いました。



確認と改ざんの間には非対称性があります。 誘導の問題は、この白鳥のような個々の声明が白色であるか、そうすることによって、そのような文脈ではエラーが発生していないため、普遍的な声明に一般化できないことです。 単一の存在の声明は、一般を証明しません。



たとえば、太陽が過去45億年間にわたって定期的に地平線を上回っている場合、太陽が常に地平線を上回っているとは言えません。 あるいは、パラドックス愛好家のB.ラッセルは、七面鳥に餌を与え、世話をする例を挙げています。彼女は、感謝祭という日が来るまで、いつもこうなると考えています。



したがって、すべての白鳥が白いことを証明するために、宇宙のすべての白鳥を確認する必要があり、ライプニッツは私に、これらはすべて可能な世界であるべきだとwhiきます。これは当然不可能です。 しかし、この主張に異議を唱えるには、オーストラリアに来て1羽のブラックスワンに会うだけで十分です。 したがって、確認と改ざんの間には基本的な非対称性があります。



このコンテキストでは、コードにバグがないこと、またはシステムに穴があることについて話すのは間違っています。 このプレーンで質問を提起することさえできません。これは、特に関係者がマタンによって損なわれていない場合、議論を完全に間違った方向に導くためです。



2番目のポイントは計算です



ライスの定理は、完璧なシステムを作成する能力に悲観的な印象を残します。 一般にチューリング機械の停止と計算可能性の問題から生じるライスの定理の帰結は、プログラム、システム、またはアルゴリズムがエラーを含まず、必要なことを行うことを証明または主張するための普遍的なアルゴリズムはないことを述べています。 一般に、自動化されたユニバーサルテストシステムは使用できません。 特に、はい、しかし、私たちが何をしても、バグがあります! 静的型付け、TDD、およびその他の手法は、私たちに自信を与え、恐怖を和らげるだけです。



3番目のポイントはエンジニアリングです



ある時点でこれを観察したため、システムを破壊する特定のバグがあることを知っている場合もあります。 バグがあることがわかっています。 しかし、それを再現することはできません。 私は、非決定性ルールが存在するマルチスレッドアプリケーションの問題を意味します。 サーバーが10分ごとにクラッシュする場合、バグをキャッチする特定の問題はありません。 しかし、問題が再発する前にサーバーが数か月間動作する必要がある場合はどうでしょう。 デバッグすることは文字通り不可能です。 さらに悪いことに、ポール・ブッチャーが述べたように、どれだけ慎重に、またはどれだけ長くテストしても、決して発生しないマルチスレッドのバグを含むプログラムを作成する可能性があります。 スレッドアクセスの順序を変更できるからといって、これが行われるという意味ではありません。 そして、JVMをアップグレードするか別のハードウェアに切り替えるまで、誰も理解できない謎の問題に突然遭遇するまで、問題の存在について完全に無知かもしれません。



これらの3つの点はすべて、バグがないこと、または何かの安全性を証明することは無意味であるという声明そのものです。 非常に多くのIT専門家もこれを理解していません。 Yegor Bugaenkoの投稿の素晴らしい例。



2つの超能力、ゼロで割る能力、またはコード内のすべてのバグを見つける能力の選択肢が提供された場合、これらは同じ順序のものであるため、何をすべきかを考えます。



All Articles