Перейти к основному содержимому

Ошибка Mars Climate Orbiter: маленькая ошибка единиц, большой урок

32061 Просмотры

Иногда программная проблема — это не сломанный алгоритм. Это неверное предположение.

Один из самых известных примеров в истории инженерии — потеря космического аппарата Mars Climate Orbiter в 1999 году. Проблема была не в отсутствии таланта, технологий или амбиций. Причина провала оказалась удивительно простой: одна команда использовала английские единицы измерения, а другая система ожидала метрические единицы.

Эта история стала сильным уроком для программистов, инженеров, продуктовых команд и бизнеса: маленькие несоответствия могут иметь огромные последствия, когда системы зависят друг от друга.

Что произошло простыми словами

Космическому аппарату нужны были очень точные расчёты, чтобы выйти на правильную траекторию возле Марса. Но часть данных обрабатывалась в одной системе измерения, а другая часть ожидала другую систему измерения.

В бытовом примере это похоже на ситуацию, когда один человек даёт расстояние в милях, а другой думает, что число указано в километрах. Число может выглядеть правильным, но его смысл будет неверным.

В программировании и инженерии такое несоответствие опасно, потому что компьютеры обычно делают именно то, что им сказали, а не то, что люди имели в виду.

Почему эта ошибка всё ещё важна

Эта история не только о космосе. Такая же проблема может возникнуть в обычных программных проектах:

  • один сервис отправляет центы, другой ожидает доллары
  • одна система отправляет килограммы, другая ожидает фунты
  • одна дата указана в местном времени, другая система ожидает всемирное время
  • одна система отправляет секунды, другая ожидает миллисекунды
  • одна команда считает поле необязательным, другая считает его обязательным

Такие ошибки могут выглядеть маленькими в коде, но они могут сломать платежи, отчёты, аккаунты пользователей, заказы, аналитику или важные бизнес-решения.

Главный урок: предположения нужно записывать

Многие ошибки появляются потому, что люди предполагают, будто все понимают одно и то же. Но программные системы небезопасно строить на скрытых предположениях.

Если значение имеет единицу измерения, формат, часовой пояс, валюту, ограничение или конкретный смысл, это нужно явно указать. Само число часто недостаточно. Система должна понимать, что это число означает.

Хороший код делает смысл видимым

Переменная с названием amount может быть неясной. Это доллары, центы, евро или баллы? Поле duration тоже может быть неясным. Это секунды, минуты или миллисекунды?

Более понятные названия уменьшают путаницу:

  • amountInCents
  • durationInSeconds
  • weightInKg
  • createdAtUtc
  • distanceInMeters

Понятные названия не решают все проблемы, но они затрудняют появление скрытых ошибок.

Тестирование должно проверять не только значение, но и смысл

Тест, который проверяет только наличие числа, слабый. Более сильные тесты проверяют, правильно ли число в своём контексте.

Например, если платёжная система ожидает центы, тест должен подтверждать, что 10 долларов превращаются в 1000 центов, а не просто в “10”. Если система ожидает миллисекунды, тесты должны подтверждать правильное преобразование времени.

Хорошие тесты защищают команды от тихих недопониманий.

Почему коммуникация так же важна, как код

История Mars Climate Orbiter напоминает, что технические системы создают люди. У разных команд могут быть разные привычки, инструменты, стандарты и представления.

Поэтому ясная коммуникация, договорённости между системами, документация и проверки очень важны. Система может провалиться не потому, что кто-то был невнимателен, а потому что общее соглашение было неясным.

Полезные привычки для разработчиков и команд

  • По возможности указывайте единицы измерения прямо в названиях полей.
  • Ясно документируйте договорённости между системами.
  • Проверяйте входящие данные перед тем, как доверять им.
  • Используйте общие стандарты для дат, валют и измерений.
  • Добавляйте тесты для преобразований и пограничных случаев.
  • Не предполагайте, что другая команда понимает ваш формат.

Скрытый урок: простые детали заслуживают уважения

Большие провалы не всегда вызваны сложными проблемами. Иногда они возникают из-за базовых деталей, которые никто не проверил достаточно внимательно.

В программировании «маленькие» детали вроде единиц измерения, часовых поясов, округления и форматов часто решают, будет ли система работать правильно или тихо ошибаться.

Итог

Ошибка Mars Climate Orbiter учит, что качество программного обеспечения зависит от ясности, а не только от ума. Когда команды явно указывают единицы, форматы и предположения, они уменьшают скрытые ошибки и создают системы, которым легче доверять.


Подписывайтесь на нас

Оставайтесь на связи и получайте последние обновления

Статьи для чтения

Логические задачи — откройте по названию

Наши проекты и бренды