BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース すべての質問には答えがある - 開発者にとって不可能とは

すべての質問には答えがある - 開発者にとって不可能とは

原文(投稿日:2022/05/09)へのリンク

すべての質問には答がある、と我々は思いがちだ。しかしながら、現在時刻を知りたい時のように、必ずしもそれは真実ではない。開発者は、想定外の障害モードに対する認識を高め、障害の可能性を広く告知し、戻ることのない返答待ちからの復帰にタイムアウトを用いる必要がある。

Kevlin Henney氏はQCon London 2022で、6つのあり得ないこと(Six Impossible Things)について基調講演を行った。さらに氏は、2022年5月10~20日のQCon Plusでも講演する予定である。

不可能なこと — "非常に難しい"、あるいは時間的ないし予算的に非現実的である、というのではなく、宇宙の仕組みに関する我々の理解という面から、実際に不可能なことは存在する、とHenney氏は主張する。

このような物理的および数学的限界という考え方には、自分の仕事の限界を考えさせられる、という意味で関心を持っています。"努力とイノベーションさえあれば何でも可能だ"というナラティブに対して、もっと合理的な対案を与えてくれるからです。"そうではない"と宇宙が言っているのです。

フレームワークに対して現在の日付と時刻を要求する場合、我々は、現在の日付と時刻を表す値を回答として受け取るものだと考える。通常気にするのは回答の精度か、あるいは要求が頻繁であれば呼び出しコストだ、とHenney氏は言う。"その問いには回答できない"という可能性を意識することはまずないだろう。

現在の日付や時刻は、コードが虚空から取り出せるような普遍的真理ではありません。時間はグローバル変数ではなく、サービスなのです。オペレーティングシステムやネットワークから取得できなければ、呼び出しは失敗する可能性がありますし、事実、失敗します。

これが実際に意味するのは、テスト可能で我々のコントロール下にある動作と、コントロール下にない外部依存関係を持つコードとを区別して、想定外の障害モードに対する認識を高めなければならない、ということなのだ、とHenney氏は説明する。

このような特性を持つコードを書く場合には、失敗の可能性を呼び出し側に対して、明確に告知する必要があります。

戻ることのない回答を待つという、この極めて単純な状況は、多くの場合において起こり得るものだ、とHenney氏は説明する。タイムアウトの存在する理由はここにある。ネットワーク処理から自動アプリケーションテストまで、ソフトウェアスタックのあらゆる層において、タイムアウトは不可欠な部分となっているのだ。

"答のない質問"について、Kevlin Henney氏にインタビューした。

InfoQ: 答のないシチュエーションが存在した場合、何が起こるのでしょうか?

Kevlin Henney: 時間を必ずしも答としない時間の要求は、解決領域における失敗ではなく、問題領域に関する仮定に起因するものです。考えてみてください。たくさんのサイトや新聞が、その日の各地の日の出時刻、日の入り時刻を掲載しています。ですが、"日の出は何時ですか?"、"日の入りは何時ですか?"という質問に、常に有意義な答があるとは限りません。例えばノルウェー最北部のトロムソ(Troms)では、極夜(permanent night)の起こる11月下旬から1月中旬と、白夜(permanent daylight)の起こる5月中旬から7月下旬には、日の出時刻も日の入り時刻もありません。多くの開発者がこれを見落としていて、結果としてランタイムエラーが発生したり、誤って00:00を表示したりしています。

答のない質問が存在するという、もうひとつの有力な例は、リソースやドメインの仮定よりも計算可能性に関わるものです。先程の例では、クエリの参照条件に基づいた答を返すことができませんでした。何の答も返すことができないと、どうなるのでしょうか?

InfoQ: "答えられない質問"もあるのでしょうか?

Henney: 終了する手続きには特別な名前があります — それがアルゴリズムです。定義の上から、終了しないアルゴリズムというものは存在しません。例えば、円周率の最後の1桁を見つけるアルゴリズム、というものはありません。これを求めるコードを実行したとすれば、それが終わることはないでしょう。この質問に答はありません。重要なのは、質問を言い換えるだけでは、何らかのエラーリターンに対応することはできない、という点です。

同じように、任意のコードが終了するかどうかを判断するような、汎用性のあるアルゴリズムを書く方法はありません。これは停止性問題(Halting Problem)と呼ばれるものです。1936年にAlan Turingが、そのようなアルゴリズムが存在しないことを証明しました。もし存在すれば、何らかのコードを入力することで、常に"yes"または"no"の答を受信することが可能になるでしょう。ただし、第3の可能性として、終了しないコードを使って他のコードが終了するかどうかを判断する、という方法もあります。その質問に答が与えられることはありません。

作者について

この記事に星をつける

おすすめ度
スタイル

BT