– И что же делать? – в голосе Легаси снова послышались нотки отчаяния. – Я чувствую, как старые зависимости, словно ядовитые водоросли, опутывают моё ядро. Мои индексы фрагментированы, а таблицы раздуты до неприличия!
Путник достал из сумки потёртый артефакт, похожий на планшет, но сделанный из лунного камня. Экран вспыхнул мягким светом, отображая сложные диаграммы связей и потоков данных.
– Есть более могущественное колдунство, – сказал он, проводя пальцем по экрану. – «Великий Рефакторинг Ядра». Оно требует огромной концентрации и точных расчётов. Мы должны будем слой за слоем распутать твои старые скрипты, оптимизировать запросы, возможно, даже применить «Микросервисное Расщепление» на самые тяжелые модули. Это как пересобрать тебя заново, сохранив твою мудрость, но избавив от балласта.
Чудовище замерло, обдумывая слова путника. Из озера донеслось тихое шипение – это старые сессии начали корректно завершаться под действием временного редиректа.
– Но это… это же изменит меня до неузнаваемости! – прошептало оно. – Смогу ли я остаться собой после такого вмешательства? Сохранится ли моя… моя уникальная бизнес-логика, накопленная веками?
– В этом и заключается искусство, – улыбнулся путник. – Мы не будем ломать то, что работает, а лишь улучшим и оптимизируем. Представь: твои кеши будут работать как часы, Redis будет летать, а SQL… SQL будет петь от радости чистых и оптимизированных запросов. Ты станешь быстрее, надежнее, и сможешь обрабатывать запросы нового поколения, о которых сейчас даже мечтать не можешь. Но для этого нам понадобится тщательно проанализировать твой «Swagger», твою карту API, и, возможно, провести несколько «A/B тестов» на отдельных щупальцах. - Он указал на одну из диаграмм на лунном камне.
– Смотри, вот здесь, в самом сердце твоего озера, лежит монолитный артефакт, известный как «Главный Контроллер Всего». Он отвечает за всё и сразу. Мы можем аккуратно выделить из него несколько более мелких, но специализированных сервисов. Каждый будет жить в своем небольшом, чистом «докер-пруду», и общаться с другими через быстрые «gRPC-потоки».
Лохматое Легаси чудовище медленно кивнуло одним из своих многочисленных отростков. В его древних, мерцающих глазах, отражающих консольные логи, загорелась искорка надежды.
– Я… я готов попробовать, о Мастер Деплоя. Но скажи, с чего мы начнем это великое таинство? Каково будет первое заклинание на пути к моему обновлению?
Путник закрыл артефакт-планшет и спрятал его в сумку.
– Первое – это всегда git checkout -b feature/refactoring_core. Мы создадим безопасную ветку реальности, где сможем экспериментировать без страха обрушить то, что еще дышит. А затем… затем мы начнем с самого простого: npm audit fix --force для твоих внешних зависимостей. Это может быть больно, но необходимо.
Чудовище издало звук, похожий на скрежет старого жесткого диска, но в нем уже не было прежней безысходности.
– Да будет так, – прошелестело оно. – Начинай свое колдовство, путник. Моя uptime в твоих руках.
Путник кивнул, доставая из своей сумки видавший виды свиток пергамента, исписанный мелким, убористым почерком. Это был «Манифест Гибких Заклинаний».
– Прежде чем мы погрузимся в git blame по твоим самым древним артефактам, о Легаси, поведай мне. Как ты дошел до жизни такой? Кто те маги и чародеи, что сотворили тебя и чьи заклинания ты до сих пор исполняешь?
Лохматое Легаси чудовище издало серию булькающий щелчков, который мог бы быть смехом, если бы не был полон тины и старых логов ошибок.
– О, это была эпоха великих надежд и быстрых релизов! Я был задуман как «Единый Портал Всего Сущего» для Королевства. Изначально всё было просто: учёт маны, перепись населения, доска объявлений для рыцарских турниров. Но потом пришли они… стейкхолдеры.
Путник сочувственно хмыкнул. Он знал этот тип сущностей.
– Первым был Королевский Казначей, – продолжало Легаси, одно из его щупалец начало нервно подрагивать, вызывая рябь на воде. – Ему нужна была «абсолютная точность в расчётах десятины и налогов НДС на драконьи клады». Пришлось встроить модуль на 1С-заклинаниях, потому что только старый гном-бухгалтер знал, как правильно обсчитывать чешую и драгоценные камни. Этот модуль до сих пор работает, и никто не решается его трогать. Он… он critical path.
– Затем явилась Гильдия Торговцев Специями, – голос Легаси стал ещё более заунывным. – «Нам нужна интеграция с межконтинентальной системой доставки на грифонах! И чтобы цены обновлялись в реальном времени, в зависимости от направления ветра и настроения драконов-покровителей пути!» Их API был написан на эльфийском диалекте LISP, и документация существовала только в виде устных преданий. Каждая новая версия их «Грифон-Экспресса» ломала мне половину логики.
– А потом… потом пришла Принцесса, – тут чудовище совсем сникло, и озеро вокруг него помутнело от поднявшегося ила, и пошло странной пеной. – Она захотела «социальную сеть для фей и других волшебных существ, с возможностью делиться пыльцой и лайкать радуги». И чтобы «всё было розовое и с блёстками!» Её команда UI/UX-фей наложила столько !important стилей поверх моих старых табличных раскладок, что браузеры старых гоблинов до сих пор падают в kernel panic.
Путник медленно кивал, листая свой Манифест.
– Понимаю. Каждый тянул одеяло на себя, добавляя свои feature request-ы, не думая об общей архитектуре. И, конечно, всё это нужно было «вчера», не так ли? У нас в ордене ходили слухи про странный культ: «Лучше два раза быстро, чем один раза правильно!»
– Именно, но про культ мне ничего не известно! – воскликнуло Легаси, вздымая волну. – А так, да «Нам нужен MVP к Новолунию!», «Релизим перед Зимним Солнцестоянием, допилим потом!». «Рефакторинг? Нет времени, вражеские орки-хакеры наступают на наши файрволы!» И так десятилетиями. Костыли на костылях, обёрнутые в заплатки из try-catch блоков, которые ловят Exception и просто пишут print("ололо, что-то пошло не так") в логи забвения.
– А что насчёт безопасности? – осторожно спросил путник. – Обычно на таком этапе появляются «Рыцари Белого Хэша» или «Инквизиторы SSL-сертификатов».
– О, да! – глаза Легаси вспыхнули красным светом, как индикаторы перегрузки сервера. – Они появились в самый последний момент перед запуском модуля «Королевская Сокровищница Онлайн». Когда уже были розданы все рекламные флаеры, а менестрели пели хвалебные оды по всем тавернам. Эти «Специалисты по Информационной Магобезопасности» из Ордена Непробиваемого Щита пришли с толстенными талмудами политик и процедур.
– Представляешь, они заявили, – продолжало чудовище, его голос дрожал от негодования, – что мой «Протокол Аутентификации по Родовому Гербу» недостаточно надёжен! Что «использование общедоступных порталов для передачи секретных указов – это дыра размером с Великое озеро Байкал»! А вишенкой на торте их аудита стал… мой летающий трон!
– Что прости, Летающий трон? – путник удивленно поднял бровь.
– Да! Это была гордость Короля! Летающий трон на интернет-тяге! Он должен был парить над столицей, транслируя королевские указы через Wi-Fi и раздавая бесплатные NFT-портреты Его Величества! Инженеры-гномы потратили на него полгода! А эти… эти безопасники заявили, что «незащищённый root-доступ к антигравитационным рунам трона, управляемый через незашифрованный HTTP-канал с дефолтными кредами admin/admin123 – это…» Ну, ты понял. Они грозились наложить iptables -F на всё королевство!
– Путник покачал головой. – Классика. И что же?
– Пришлось выбирать, – тяжело вздохнуло Легаси. – Либо трон, либо запуск Сокровищницы. Король был в ярости. Он метал молнии (буквально, он же маг четвертого уровня). Но Казначей и Гильдия Торговцев убедили его, что работающая экономика важнее парящего пиар-инструмента. Трон отправили на «доработку в соответствии с ГОСТ Р 52069.0-2013 Небесной Канцелярии», и с тех пор о нём никто не слышал. А мне в ядро вшили столько правил и двухфакторных заклинаний, что я стал медленнее ленивца на транквилизаторах. Но зато «безопасный». – Вода в озере немного успокоилась. Чудовище перевело дух.
– Вот так, путник, я и стал тем, кто я есть. Сплетением противоречивых требований, поспешных решений и отчаянных попыток всё это как-то удержать на плаву. Теперь ты понимаешь глубину моих болот из spaghetti code?
– Путник задумчиво смотрел на Легаси. – Понимаю, – сказал он наконец. – Твоя история – это сага о многих системах. Но даже самое запутанное наследие можно распутать. Если есть воля и хороший debugger. Начнём с анализа зависимостей тех самых 1С-заклинаний. И посмотрим, нельзя ли их обернуть в какой-нибудь более современный API-шлюз, чтобы хотя бы изолировать эту древнюю магию. А Принцессины, блёстки… боюсь, тут придётся применить глобальный CSS Reset и объяснить ей прелести адаптивного дизайна.
Легаси издало звук, похожий на скрип старого винчестера, пытающегося загрузить операционную систему. Но в этом звуке уже слышалась слабая надежда.
– Хорошо, – кивнул Путник, обводя взглядом мутные глубины озера и прикидывая объем предстоящих git log --graph --oneline --decorate --all. – Но прежде, чем мы начнем распутывать твои самые древние commit-ы, скажи, о Легаси, а что с документацией? Не всё же можно понять, силами реверс-инжиниринга. Где твои «Свитки Архитектуры», «Манускрипты API Эндпоинтов», «Руководства Пользователя для Заклинателей Низшего Звена»?
Лохматое Легаси Чудовище издало звук, похожий на одновременный скрежет тысячи модемов, пытающихся установить соединение.
– Документация… – прошелестело оно, и несколько пузырей с запахом старого озона поднялись со дна. – Она существует… в виде легенд. В виде устных преданий, передаваемых от одного уволившегося Архимага другому. Часть её была начертана на стенах «Пещеры Первых Коммитов», но после обвала, вызванного неудачным DROP TABLE users; без условия WHERE, те фрески утеряны.
– Что-то есть в виде комментариев в коде, – продолжало Чудовище, одно из его щупалец задумчиво почесало нарост из устаревших библиотек.
– Но они в основном гласят:
// TODO: Rewrite this before the dragons notice
или
// Здесь магия, не трогать, работает на честном слове и синей изоленте.
– Иногда встречаются целые поэмы на Древне-Ассемблерском, описывающие элегантность решения, которое теперь вызывает лишь воспоминания о былом StackOverflowException.
– Путник вздохнул. – Знакомая картина. «Знание, передаваемое путем болезненной отладки» – самый распространенный вид документации в подобных системах. То есть, никакого «Confluence -Хранилища Знаний», никакого «Jira - Трекера Задач и Багов» с подробным описанием фич?
– Ой, да был когда-то «Вики-Гримуар», – призналось Легаси. – Но последний Хранитель Знаний, эльф по имени ЛегоЛАГ, ушёл в «Бессрочный Отпуск в Валинор» после того, как его правки по «Оптимизации Запросов к Оракулу Судьбы» откатили в пятый раз. С тех пор гримуар зарос паутиной 404 Not Found.
Взгляд Путника скользнул выше, к потолку пещеры, где сквозь мутную воду виднелись контуры следующего уровня системы – вероятно, то, что когда-то было «Бизнес-Логикой Верхнего Уровня». И тут он заметил его.
– А это что? – Путник указал на гигантскую конструкцию, уходящую из глубин озера и подпирающую что-то массивное на втором ярусе. Конструкция была сделана из грубо сваренных стальных балок, но наверху, там, где она упиралась в свод, виднелся искусно сделанный, поблескивающий даже в мутной воде, мифриловый набалдашник. – Этот огромный стальной костыль с мифриловым набалдашником… он ведь не часть изначального дизайна, верно?
От Легаси какой-то подозрительный смешок, перешедший в кашель, который мог бы означать «о, только не это».
– А, ты про «Великую Подпорку Стабильности Имени Архитектора Глюкона»… – с трудом выдавило оно из себя фразу. – Это… это долгая и печальная история о том, как «быстрое решение» становится «вечной инфраструктурой».
– Рассказывай, – Путник устроился поудобнее на выступе из застывшего JSON-а.
– Это случилось во времена «Великого Запуска Модуля Предсказаний Погоды для Королевских Пикников», – начало Легаси. – Требование было простым: «Точность 99.999% за 24 часа до события». Но команда метео-магов перемудрила с «нейронной сетью на рунах хаоса», и модуль начал потреблять немыслимое количество CPU time и RAM-эссенции. Каждый раз, когда он пытался просчитать вероятность дождя над конкретной полянкой, весь второй этаж, где крутились основные сервисы Королевства, начинал вибрировать и проседать. Логи сыпались ошибками OutOfMemoryError и Kernel Panicus Totalus.
– Архитектор Глюкон, известный своим девизом «Работает – не трогай, падает – подопри!», вместо того чтобы оптимизировать прожорливый модуль (на это не было «времени в спринте»), предложил гениальное решение. Он вызвал бригаду гномов-кузнецов и велел им сковать этот… костыль. Сталь – для прочности, а мифриловый набалдашник… он не просто для красоты. В него встроены «Руны Аварийного Распределения Нагрузки». Когда сенсоры фиксируют критическую просадку производительности на втором этаже, набалдашник начинает светиться и перенаправлять часть вычислительной магии на резервные кластеры в «Подземельях Холодного Резерва».
– То есть, вместо того чтобы починить протекающий кран, вы просто поставили под него ведро побольше и автоматизировали его выливание? – уточнил Путник.
– Именно! – подтвердило Легаси. – И это «ведро» стало настолько критически важным, что теперь вокруг него построена целая экосистема мониторинга и поддержки. Есть даже специальный «Орден Хранителей Костыля», которые дважды в день проверяют затяжку болтов и уровень магической смазки в мифриловом шарнире. Попытки убрать его приводили к немедленному segmentation fault всего «второго этажа». Он стал неотъемлемой частью моей… сущности. Символом того, как временное решение, принятое под давлением «бизнес-требований» и «сжатых сроков», может врасти в систему так глубоко, что его удаление становится сравнимо с операцией на открытом сердце без анестезии.
Путник покачал головой, но в его глазах читалось не только сочувствие, но и профессиональный азарт.
– Что ж, Легаси, – сказал он, поднимаясь. – Похоже, наш backlog пополнился ещё одной эпической задачей. Но сначала – документация. Мы должны найти хоть какие-то следы первоначального замысла. Возможно, в архивах Королевской Канцелярии сохранились «Технические Задания на Пергаменте» или «Протоколы Совещаний с Резолюциями Его Величества». Без этого мы рискуем, удалив один костыль, породить десяток новых гидр-багов.
– Удачи тебе, путник, – прошелестело Чудовище. – Поищи в «Забытой Библиотеке Закомментированного Кода». Говорят, там иногда находят фрагменты древних диаграмм последовательности, нацарапанные на обратной стороне счетов за эльфийский эль.
Всех обнял, продолжение возможно будет.