Главные грехи разработчиков: обратная несовместимость

Никто не любит поддерживать старое.

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

Я был молод и у меня постоянно горела жопа от того, что приходилось думать как держать кучу легаси в коде и не поломать то, что и так работало. Я тогда мыслил так—неужели так сложно поменять пару сигнатур тут и там, пересобрать  и зарелизить? Иногда это удавалось провернуть и код выбрасывался, иногда проектное руководство имело больше веса и приходилось городить костыли.

В целом, в большей части своей карьеры я придерживался позиции "плевать на пользователей, мы рефакторим код".

Недавно это начало меняться, особенно когда я сам столкнулся с последствиями недальновидного поведения других разработчиков. Про питон 2 и 3 все в курсе, да? Ну это так уже, часть истории, с грехом пополам всё уже мигрировали, хотя и несколько раз продлевали sunset. А вот скала 2.11 vs все остальное это похуже. Разработчики скалы оказались настолько самоуверенными, что сделали бинарную обратную несовместимость. То есть код, написанный и собранный под scala 2.11 не будет работать с рантаймом scala 2.12. В итоге что? Правильно, весь мир сидит на 2.11 и в ус не дует. Spark до сих пор по-дефолту собран под 2.11. Я тоже в ус не дул, пока не оказалось что надо собрать библиотеку, над которой я работаю под 2.12, потому что у заказчика один из тех самых редких случаев когда всё собирается под 2.12. И тут началось... Long story short, все заработало, но нервов было потрачено изрядно.

У меня на саппорте есть несколько продуктов которые предоставляют внешний rest api. Ещё давно у меня были идеи сделать его более "красивым", ну знаете, поменять параметры с snake_case на camelCase и наоборот, урлы там более прилично назвать и так далее.

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

Сейчас я четко понимаю, что это плохая идея. Хочешь красивое API? Ок, делай /v2 (или другой способ версионирования) и поехал. И не забудь в старом добавить костылики чтобы ничего не поломалось.

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


Понравился материал? Подписывайся на мой телеграм канал: https://t.me/full_of_hatred