Стучит..гремит..на пороге стоит..дверь открывает..на порог ступает..

Стучит, гремит, на пороге стоит… Открой дверь и погрузись в захватывающую историю, где каждый звук — тайна!

История эта началась в 1965 году, когда Тони Хоар, создавая типовую систему языка ALGOL W, «изобрёл» NULL-ссылку.
Через полвека он назовёт это «своей миллиардной ошибкой».

Что же такое NULL на самом деле?

  • В SQL выражение NULL = NULL возвращает NULL, а не TRUE.
    Попытка отсортировать записи по столбцу, содержащему NULL, приводит к тому, что все NULL-значения считаются равными,
    но их порядок относительно «обычных» значений остаёться на усмотрение конкретной СУБД.
  • В JavaScript null и undefined строго различны:
    • null — это явное «ничто», заданное программистом;
    • undefined — автоматическое «ничто», которое получает переменная, не имеющая значения.

    Проверить оба состояния можно с помощью value == null, единственное сравнение, которое истинно и для null, и для undefined.

  • В C# оператор ! (null-forgiving) позволяет обмануть компилятор, «пообещав», что null! не является null.
    Это не делает значение безопасным, а лишь подавляет предупреждение.
  • В C/С++ NULL, 0 и '' (NUL), разные сущности, хотя все они сводятся к нулевому байту.

    А вот 0x30 уже совсем другой символ — ASCII-цифра «0».

Сколько же стоит «ничто»?

С 2009 года (когда впервые прозвучала фраза «Null: The Billion Dollar Mistake») сумма убытков от ошибок, связанных с NULL,
только в банковском секторе превысила 320 млрд долларов. Крупнейшие инциденты:

  1. 2008 — ошибка в системе NULL-хэндлинга биржи Tokyo Stock Exchange стоила $400 млн.
  2. 2012 — система Knight Capital потеряла $440 млн из-за «забытого» NULL-проверяющего условия.
  3. 2020 — в системе COVID-тестирования Великобритании NULL вместо нуля привёл к недооценке 16 000 случаев.

Как не открыть «дверь» к NULL-ошибке?

  • В SQL — всегда использовать IS NULL / IS NOT NULL, а не = NULL.
  • В TypeScript включать строгий режим strictNullChecks.
  • В Java/Kotlin отдавать предпочтение Optional<T> и ?. let.
  • В C# 8.0+ применять nullable reference types и избегать !-оператора без явной необходимости.

NULL, «ступая» на порог наших программ, приносит не только «ничто», но и огромные издержки.
Понимание различий между null, undefined, 0 и отсутствием значения — первый шаг к тому,
чтобы дверь, которую он открывает, вела не к краху, а к надёжному коду без «миллиардных» сюрпризов.