прошлое_там
September 4, 2021

Цифровые антресоли

У каждого где-то в пыльных закромах цифрового хранилища имеется папочка с названием вроде «temp», «разобрать», «помойка», «сортануть» или типа того. Я в этом уверен, хотя бы потому, что у меня такой уголок неразобранного цифрового мусора также есть. Скачки с интернетов, какие-то древние проекты, логи чатов, забавные скрины, фотожабы и прочее такое, представляющее собой прелюбопытнейший срез цифровой истории.

Многим из этих артефактов уже десятки лет, и хотя они не представляют уже никакой ценности, сама процедура их изучения обходится дороже, чем решение оставить, как есть. Дисковое пространство в домашнем хранилище исчисляется десятками терабайт, так что само собой напрашивается решение «зипануть, и пусть дальше валяется».

Но раз в десятилетие всё-таки можно и навести порядок, да? Особенно, если тебе на днях поставили новый зуб, и надо отвлечься от мерзкой ноющей боли в десне; уборка, пусть даже и цифровая, — хороший способ.

Втюхинг кредитов

Нашёл, например, отвёрстанную и полностью заскриптованную кредитную страницу, запиленную для «Русского Стандарта» в моё бытие там веб-разработчиком.

Там таких страниц ещё много.

Таймстампы у файлов не сохранились, но это начало 2013 года. Веселуха с этой страницей была в том, что кроме попиксельной вёрстки («ты чё, это ж студиялебедева рисовала!») требовалось сделать всю логику на клиентской стороне. Я и сейчас крайне херовый фронтендер, а тогда умел примерно ничего. Какие тогда JS-фреймворки уже существовали — я не очень в курсе, но всё, что мне было доступно — jQuery 1.8.3.

Там таких страниц ещё пять штук, и на каждой пара десятков валидаций а-ля «если паспорт выдан больше 14 лет назад, но меньше 18, то максимальный лимит кредита устанавливается равным X*Y, где X — коэффициент, зависящий от страны проживания, а Y — выставленный желаемый срок». Кроме этого присутствовали и другие приколюхи, вроде подсказок из КЛАДРа при вводе адресов, всяких хитрющих условных переходов, сбора статистики о клиентском устройстве (если клиент входит с айфона, то кредитный лимит у него увеличивается — я не шучу, это реальное условие), и прочей мерзотни.
Короче, отдел кредитного втюхинга разрывался между желанием выдрать из клиента как можно больше инфы, и желанием сделать получение кредита как можно более простым. Чтоб чувак такой только ввёл телефон, а на него уже кредитка выпущена. Хоба!
Воплощать эти противоречивые хотелки местных кабанчиков приходилось нам, местному отделу веб-разработки. Требования, естественно, менялись чуть ли не каждый день, и набор реакций страницы, захардкоженный в едином JS-скрипте приходилось пересобирать ручками.

Но я даже не поленился заскринкастить, что оно вполне работало:

Иди и смотри. Или не смотри — у нас свободная страна.

В какой-то момент править хардкод меня достало, и я в качестве инициативы решил всё это дело автоматизировать. И за пару недель написал для jQuery плагин, а когда убедился, что он вышел хорошо (я и сейчас считаю, что для первого подобного опыта вышло прекрасно), по честному спросил разрешения выложить его в опенсорц. Мою щепетильность не очень поняли (типа, выложил бы без спроса, кто б узнал?), но преград чинить не стали. Я и выложил.

Братская помощь

Или вот другой проект примерно тех же времён:

Ниже мы эти исходники попробуем завести.

Брату надо было писать диплом по итогу заочного обучения в шараге на погромиста. Хотя все понимали, что это просто покупка корочек в рассрочку, что-то рабочее предъявить требовалось. Погромиста из брата не получилось, и сам он родить ничего не мог, а мне писать чужие дипломы было не в первой, я взялся помочь.

Тогда идея сервисов-агрегаторов, вроде «Деливери» уже бродила в головах, но нормальной реализации ещё не достигла. Очевидная сейчас бизнес-модель, в которой заведение платит процент за включение в каталог, тогда выглядела максимум странно. В родной димитровградской перди подобные выкрутасы и по сей день выглядят странно — заказывать еду из заведений домой за деньги?! Столичный выпендрёж!
Тем удивительнее, что я решил сделать брату именно нечто подобное, хотя бы в базовом виде. Ну как, решил, — у меня уже были заготовки другого подобного проекта, но это совсем другая история. Я доработал код, брат напряг каких-то своих умеющих в рисование корешей, получив очень симпатичный дизайн. Мы зарегали домен eddim.ru, в поясниловке налили водички про вот это вот всё — и свой отличный диплом братик получил.

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

Наткнувшись на эти исходники — голый пятый PHP, никаких фреймворков — я страшно захотел их завести.

Кидаем исходники в созданный каталог локального домена, открываем в PHPStorm:

Ух, бля,это похлеще, чем батин суп

Ну да, это были дикие времена, мы писали, как умели. А умели мы херово: актуальный статанализ находит сотни и сотни кривостей даже для PHP 5.6:

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

Ну и код, конечно, дико устаревший. Все подключения к БД — через mysql_*-методы, которые, по-моему, уже тогда были deprecated, а в 7.0 уже и вовсе выкинуты. Хотя бы поэтому оно с актуальной версией языка (8.0) уже не заведётся:

Но вообще — это ж пыха. Достаточно заменить вызовы mysql-функций на mysqli — логическая совместимость меж ними присутствует. И этого уже достаточно, чтобы код пытался залезть в БД (и обломался от отсутствия нужного подключения).

Если создать нужную БД, то падать уже начнёт от отсутствия нужных таблиц. Увы, но дампа структуры базы не сохранилось, а про такую штуку, как миграции, я и представления не имел. Можно повозиться, и по запросам (а это всё инлайновый SQL) восстановить структуру...

Формируем запросы в лучших студенческих традициях.

...но и это не поможет — код завязан на какие-то идентификаторы, наличие которых в БД явно подразумевалось.

Это всё тоже можно восстановить, но муторность такого занятия перевешивает любое веселье (если рефакторинг тухлых исходников вообще способен вас развеселить).

Ну и подобного окаменелого дерьма нашлось до фига. Какие-то утилиты, писаные для себя и на заказ, автоматизации, сделанные для упрощения жизни в Мегафоне, уже не запускающиеся из-за отсутствия нужных библиотек демки и игры.

И, конечно, «РПБСка»

Вот это прям реально легендарная софтина, однозначно стоящая нескольких абзацев воспоминаний. Километры кода на Delphi 7, триллионы сэкономленных человекочасов и первый мой околопромышленный проект.

Серёга, я сохранил твои копирайты.

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

Софт изначально занимался тем, что цеплялся к оракловой БД с инфой от базовых станций, мониторил какие-то параметры, и позволял даже немножко этим всем рулить. Например, просекал попытки проникновения на станцию, проверял санкционирование доступа и гасил передатчики. В обычном режиме этим должен был заниматься дежурный через несколько вендорских софтин, работающих исключительно в Solaris, что несло понятные издержки.
А RPBS тупо брала всё это на себя. Дежурный подключал к ней служебный мобильник — и софтина регистрировала входящий вызов ремонтника, по справочнику определяла его полномочия, по привязке к БС — положение, заводила, если нужно, аварию, писала отчётность, ух, сколько там было всяких хитрых умений!

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

Но всё хорошее когда-нибудь заканчивается. Так закончились времена согласия и консенсуса: РПБС у меня решили отобрать, передав на поддержку подрядчикам. Я залупился: исходники мои, хотите — покупайте, незадорого отдам. Или пишите заново, там всего-то несколько человеколет разработки, лол.
Ох, какая вонь поднялась: мне усиленно пытались доказать, что раз я писал код в рабочее время, то он принадлежит компании. Я в ответ хлопал глазками и просил предъявить мне подписанное ТЗ на разработку, или хотя бы показать строчку в должностной инструкции. Нет такого? Ну вот, я по собственной инициативе сделал рационализацию, давайте договариваться.

Договориться, в общем, удалось: исходники я отдал, мне закрыли повышенную квартальную премию. Начальство не потеряло лица, я не потерял в деньгах. Но отношения с руководством, и так к тому моменту натянутые, стали ещё хуже, что, пожалуй, повлияло на моё желание уволиться.
А через несколько месяцев после увольнения то самое недовольное начальство мне позвонило и предложило вернуться уже на должность разработчика — поддерживать РПБС, а то подрядчики стали обходиться дорого. Но то, что я много раз предлагал раньше, теперь мне было совсем уже не интересно.

Бинарник софтины прекрасно запустится и сейчас — но дальше загрузочного экрана работать не будет всё по той же причине отсутствия нужных коннектов к базам данных. Исходники какой-то изначальной версии под Delphi 7 без особых проблем открываются в достаточно актуальной BDS 10.4, и, думаю, если доставить/вырезать отсутствующие компоненты — то оно даже соберётся. А вот последняя «моя» версия исходников, переписанная уже на Delphi 2007, имеет какие-то несовместимости в синтаксисе. Я уверен, что и её, при желании, можно допатчить и собрать — но это всего лишь клиент, в котором без серверной составляющей можно только на формочки посмотреть. А это можно сделать и гораздо проще, скачав, например, сохранившуюся справку к одной из версий:

Весь хелп написан мной в подобном стиле — я считал и считаю, что документация не должна быть нудной.

Фух, в таком стиле я могу продолжать ещё долго, и не только про код, но это как-нибудь потом, когда ещё какой-нибудь зуб вставят, или типа того.