3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【NULL の歴史】10億ドルの失敗 【アントニー・ホーア】

Posted at

はじめに

皆さんはプログラミングをしていて、一度は NullPointerExceptionCannot read property of undefined というエラー画面に絶望した経験はありませんか?

「なぜ値が入っていないんだ!」
「そもそもなぜ NULL なんてものが存在するんだ!」

そう思ったことがあるエンジニアは多いはずです。
実はこの「NULL」という概念、発明者自身が 「10億ドルの失敗(The Billion Dollar Mistake)」 と呼んで後悔していることをご存知でしょうか?

今回は、プログラミングの世界に多大な影響(と損害)を与えた NULL の歴史について解説します。

NULLの歴史

時計の針を 1965年 まで戻しましょう。
当時、アントニー・ホーア(Tony Hoare) 氏は、ALGOL W というプログラミング言語の設計に携わっていました。

彼は、現代のプログラミング言語でも当たり前のように使われている「参照(Reference)」の型システムを設計していました。
彼の目標は、「コンパイラによって自動的にチェックされる、完全に安全な参照の使い方」 を確立することでした。

もしこれが完全に実現されていれば、私たちはメモリエラーに怯えることなくコーディングできていたかもしれません。

しかし、そこで一つの「誘惑」が彼を襲います。

10億ドルの失敗

ホーア氏は、参照が存在しない状態、つまり「無」を表現する方法を模索していました。
そこで彼は、「何もしないこと(参照がないこと)」を実装するのがあまりにも簡単だったため、ついつい NULL 参照を導入してしまったのです。

これが、後に彼自身が語る「10億ドルの失敗」の始まりです。

なぜ失敗だったのか?

NULL が許容されると、変数の型が「String」だとしても、実際には「String または NULL」である可能性があります。
コンパイラは「これは String だ」と信じて通しますが、実行時に NULL がやってきて、メソッドを呼び出そうとすると……

// Javaでの例
String text = null; // コンパイラはString型として扱う

// 実行時にクラッシュ!(NullPointerException)
if (text.length() > 0) {
    System.out.println(text);
}

このように、コンパイル時には見抜けないエラーが実行時に爆発します。
これにより、過去数十年にわたり、無数のシステムダウン、バグ修正費用の浪費、セキュリティホールが発生しました。

これによる損害の総額は計り知れず、「おそらく10億ドル(約1500億円以上)では済まないだろう」 と言われています。

アントニー・ホーア

この「NULL」を生み出したアントニー・ホーア氏は、クイックソートの考案者としても知られる、コンピュータ科学の偉人です。チューリング賞も受賞しています。

彼は2009年のカンファレンス(QCon London)で、自身の過ちを率直に認め、謝罪しました。

"I call it my billion-dollar mistake."
(私はこれを、私の10億ドルの失敗と呼んでいます。)

彼は当時の心境をこう語っています。

「1965年当時、私は ALGOL W というオブジェクト指向言語のための最初の包括的な型システムを設計していました。私の目標は、コンパイラによる自動チェックで、すべての参照の使用が安全であることを保証することでした。

しかし、私は 『NULL参照』 を入れるという誘惑に勝てませんでした。理由は単純で、実装するのがあまりにも簡単だったからです。」

この「実装の容易さ」が、その後のプログラミング界にこれほど長く、暗い影を落とすことになるとは、当時の天才ですら予測できなかったのです。

最後に

アントニー・ホーア氏の「失敗」は、現代のプログラミング言語に大きな教訓を与えました。

最近の言語(Kotlin, Swift, Rust, TypeScriptなど)では、Null Safety(Null安全性) という概念が標準になっています。
「NULLになり得るもの」と「絶対にNULLにならないもの」を厳密に区別することで、コンパイル時にエラーを防ぐ仕組みです。

// TypeScriptの例
let name: string = "Bob";
name = null; // コンパイルエラー! (型安全)

let nameMaybe: string | null = "Alice"; // 明示的にnullを許可する必要がある

私たちが普段コードを書く際も、「とりあえず NULL で初期化」とするのではなく、「本当にここで NULL が必要なのか?」を一歩立ち止まって考えることが、10億ドルの失敗を繰り返さないための第一歩かもしれません。

歴史を知ると、技術選定や設計の視点が少し変わって面白いですね。

参照

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?