null где-то в глубине сервиса. Никто не знал, что он там может быть. Компилятор молчал.А теперь другая история: разработчик 20 минут борется с ошибками компиляции. Исправляет. Деплоит. Всё работает. Никто не просыпается ночью.
Сегодня рассказываю про одну интересную статью. Автор утверждает: компилятор бесполезен не потому что он слабый, а потому что мы постоянно его обманываем:
1️⃣Null — говорим "это String", но на самом деле может быть
null2️⃣Unchecked exceptions — говорим "возвращает String", но может выкинуть исключение
3️⃣Касты — говорим компилятору "trust me bro, это точно Dog", а через месяц там оказывается Cat
4️⃣Side-effects — функция возвращает
void, но делает что-то критичное. Компилятор не знает что
➡️ Что происходит когда перестаёшь лгать
Вместо
null — Option<String>. Теперь компилятор видит разницу и заставляет обработать отсутствие значения.Вместо кастов —
union types. Добавили новый case? Компилятор покажет ВСЕ места, где нужно обработать новую логику.Вместо "это просто int" —
UserId, AppId, PostId. Теперь их невозможно перепутать.
➡️ Реальный кейс
Google Cloud outage в июне 2025 — причина
null в неожиданном месте. Автор показывает, как диалог с компилятором мог бы предотвратить это: изменил тип поля на опциональное → получил сотни ошибок компиляции → понял, что дизайн неправильный → переделал на union type → компилятор показал все места, где нужна новая логика → добавил валидацию → скомпилировалось → задеплоил → спокойно спит.📎 В общем, статья годная
@prog_stuff