software-development
January 28, 2023

"Переписать все к х#ям" или ад рефакторинга

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

Опять пропатчить или переписать? Муки выбора в момент сомнений.

Так бывает, что посещает «души волнение» желание распилить тупой пилой некоторые проекты, вместе с авторами — настолько там все внутри косо и криво.

Да, это п#здец разумная причина для рефакторинга.

Но помимо случаев лечения «пилой и динамитом», бывает и другое:

Проект нормальный, код чистый простой и понятный. Но не модный.

Не на том языке, не на нужном фреймворке, не на модных в этом сезоне технологиях. «Морально устарел», «дедовское легаси», «старческий кринж» — вот это все. Зумеры пугаются, одним словом.

И если вдруг в руководстве модники победят инженеров — начнется разнос и распил вполне живого и успешного проекта.

Да, так тоже бывает когда есть много денег.

Ниже я опишу несколько эпических примеров «полного переписывания с нуля», когда «хотели как лучше» и слили огромный объем работы в никуда.

Поскольку все почему-то считают программистов продвинутыми любителями технологий будущего и новинок вообще — примеры ниже будут только из инструментов для них.

Чтобы вы сами поняли насколько все плохо в мире обычного софта для «массового телезрителя», если даже программисты не очень хотят иметь дело с новым говном.
Могила перла, мечта петониста

Perl 6 (Raku)

Начну с цитаты:

The Raku design process was first announced on 19 July 2000, on the fourth day of that year's Perl Conference,[10] by Larry Wall in his State of the Onion 2000 talk.[11]

Так это начиналось.

Я познакомился с перлом где-то в 2004м и это была все та же 5я версия, которая продолжается до сих пор:

Perl 5.6 was released on March 22, 2000.

Сейчас на дворе 2023й, прошло двадцать три года — ну и где же мой 6й Перл? Где-где, в земле:

As of 2017, only the Rakudo implementation is under active development. No implementation will be designated as the official Raku implementation; rather, "Raku is anything that passes the official test suite."[21]

Если бы Perl 6 был живым человеком — он бы уже закончил ВУЗ и вышел на первую работу, представляете?

Итого:

23 года переписывания с нуля.

И похороны.

Круче только GNU Hurd, но там хоть результаты есть.

А что же случилось со «старым» 5м перлом?

Похоронная команда к нему так и не пришла, так что он живее всех живых:

5.36.0[2] / 28 May 2022; 7 months ago 5.34.1[3] / 13 March 2022; 10 months ago

Думаю еще нас всех переживет.

Одна из немногих приличных шуток про язык со змеей.

Python 3

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

Начнем с двух дат:

Python 2.0 was released on 16 October 2000, with many major new features.[48]

и:

Python 3.0, released on 3 December 2008

Что это означает? Что змеюк в декабре 2008го стало две и развивать пришлось обе, параллельно:

Releases of Python 3 include the 2to3 utility, which automates the translation of Python 2 code to Python 3

Да, они пытались. Нет не помогло:

Python 2.7's end-of-life was initially set for 2015, then postponed to 2020 out of concern that a large body of existing code could not easily be forward-ported to Python 3.[51]

Собственно я сам проходил весь этот процесс миграции петоновского проекта с 2.х на 3.х. Поэтому больше не верю в людей в обратную совместимость легкими средствами.

Что же получается в итоге:

12 лет параллельной разработки, с поддержкой «устаревшей» версии, патчами и бекпортами.

Официально у команды разработки петона все же получилось:

2.7 версия действительно больше не поддерживается, скачать с сайта по большой кнопке не дают и везде пишут страшное слово «Deprecated».

Но вот в репозиториях 2.7 все также есть:

2023й год, последняя Убунту и петон 2.7 в репозиториях. Легаси, легаси никогда не меняется.

А значит 2.7 петон на 2023й год все также собирают, проверяют и выкладывают. Причем делают это официально, с официальной поддержкой.

Как то так наверное и выглядит ад для программистов:

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

Java 1.8 и все все все

Жаба — уникальный язык, единственный язык программирования, который с самого начала был спроектирован, а не просто написан.

Как раз где-то до 1.8 версии Java считалась архитектурным шедевром, примером и эталоном ПО как архитектурной концепции.

А должность «Software Architect» долгое время подразумевала именно джаву и решения на ней:

Слышим слово «паттерн» — подразумеваем джаву.

Вообщем когда-то это было не про "batteries included" а про серьезное проектирование и архитектуру.

Что случилось

Случилась гонка вооружений с Microsoft (с дотнетом), ради места на Олимпе второй ступеньке у трона Си, рядом с плюсами конечно. Затем еще случилась покупка-продажа Sun-Oracle и последующее изменение повестки.

На сегодня дела обстоят как-то так.

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

А очень многое из внутренних частей подверглось заразе переписывания с нуля.

Чтобы вы оценили разницу:

до версии 1.8 включительно, джависты на память различали фичи каждой версии. Когда именно были добавлены генерики или «try-with-resources» знали практически все и спокойно рассказывали на собеседованиях.

С 1.8 и поныне — не знает никто вообще. Один сплошной темный лес.

Вообщем теперь история версий и заметок к релизам в джаве стали напоминать новую часть «Игры Престолов» и конца и края этому нет.

Хотели закончить вот так:

Java 8 was released on March 18, 2014,[173]

но жестокая реальность опять обломала рога фантазерам:

Java SE 8 Update 351[255] 2022-10-18 New features, changes, 95 bug fixes.[256]

Пришлось смириться:

Java SE 8 has gone through the End of Public Updates process for legacy releases. Oracle will continue to provide free public updates and auto updates of Java SE 8 indefinitely for Personal, Development and other Users via java.com.

Вообщем «они просто хотели чтобы их любили»:

8 лет непрерывной разработки старой версии, чехарда с новыми версиями и зоопарк релизов с разными сроками сопровождения.

А все из-за невыносимого желания «переписать все с нуля» и сделать лучше.

Думаю никого не удивит что ИТ-сообщество неохотно приняло все эти пляски с бубном крупные изменения, многие вендоры не торопились поддерживать новые версии джавы, еще большие — забили на сертификацию.

Что вообщем-то пошатнуло популярность языка.

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

Но факт остается фактом:

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

Печальные выводы

Я специально взял примеры из средств разработки — из самых наивозможно высокотехнологичных программных продуктов для инженеров:

Нет софта сложнее чем компилятор.

Ну почти.

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

Но если что — в сети полно подобных статей про более близкие к обывателю проекты.

Суть в том что:

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

А обосраться с переписыванием и загубить успешный продукт может даже огромная корпорация с бесконечным бюджетом.

Вообщем я лично бы многократно подумал, прежде чем пытаться «переписать с нуля» успешный продукт:

стабильность и репутация — не те вещи, которыми стоит разбрасываться в наш век.

Но конечно это лишь мое мнение и мой опыт.

Всем добра )