Чайник, который наказывает
У чайника мазохиста носик и ручка находятся с одной стороны:

Обязательно обожжётесь потому что с таким чайником ошибки становятся неизбежными.
Вот как выглядит эквивалент такого чайника в коде:
function formatName(user) {
// Что если user undefined?
// Что если firstName null?
// Что если lastName пустая строка?
return user.firstName + ' ' + user.lastName;
}
Он провоцирует ошибки. И как с чайником — проблема не в пользователе, а в дизайне.
Поэтому я предлагаю новый подход: дизайн, осознающий ошибки.
Осознание ошибок ≠ Обработка ошибок
Обычно разработчики думают об ошибках так:
- Пишут код
- Добавляют обработку ошибок
- Документируют крайние случаи
Дизайн с осознанием ошибок переворачивает этот процесс:
- Исключаем предотвратимые ошибки
- Делаем оставшиеся ошибки очевидными
- Аккуратно обрабатываем то, что осталось
Цена плохого дизайна
Кажущийся безобидным API стоит нам:
- Времени на отладку: “Почему это работало, а потом сломалось?”
- Интеграционных проблем: “Но в документации сказано…”
- Инцидентов в продакшене: “Мы не знали, что так может быть”

Основной принцип: Ошибки, которых никогда не было
Лучшая обработка ошибок — их полное предотвращение:
- Сделайте опасные состояния непредставимыми. Как чайник, который физически не может обжечь.
- Падайте быстро и громко. Как чайник, который кричит при переполнении.
- Ведите пользователей API к успеху. Как чайник с чёткой линией наполнения.
// Это TypeScript вместо JavaScript
interface User {
firstName: string;
lastName: string;
}
function formatName(user: User): string {
return `${user.firstName} ${user.lastName}`;
}
В следующей части: Инструментарий
Следующий пост даст конкретные шаблоны дизайна, учитывающего ошибки. В хорошем дизайне правильный путь должен быть единственным.
Задание: Вспомни последний инцидент в продакшене. Можно ли было предотвратить его на уровне дизайна API?
- Философия «Error-Aware Design»