[лонгрид] 20 лет программистской карьеры в большом маленьком городе

We do what we must because we can — GLaDOS

Ижевск, наши дни


Первого февраля исполняется ровно два десятилетия, как я начал официально подвизаться в должности инженера-программиста:

Фото первого разворота трудовой книжки с датой 1 февраля 1999 года

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

Конечно, мерило «успешности» у каждого своё, но моим служит тот факт, что последние 15 лет я работаю на сеньорских должностях на проектах, в основном завязанных на крупных корпоративных или зарубежных заказчиках, и почти каждая новая работа находит меня сама. И всё ещё не устал.

Хочу предупредить, что мой рассказ — это типичный лонгрид в формате интервью от первого лица, местами нудный, и почти без картинок, потому что я, в основном, бэкэндер. Читателю без технического бэкграунда может быть сложно, так как в нём полно программистского жаргона (часть терминов я постарался объяснить, но не все). А ещё порядочно древних мемов, ностальгических подробностей, и локальной культурологии.

Но вы ведь любите автобиографии с аутистическими шутками, не правда ли?

Ижевск, середина восьмидесятых


Началось всё давным-давно. Однажды матушка, работавшая программистом в обычном советском НИИ, занимавшемся реверсным инжинирингом образцов западной вычислительной техники, взяла меня на работу — показать, чего как, и дать поиграть. Недавно к ним пришли контрабандные «персоналки» — PC/AT, на которых запускались всякие диггеры и тетрисы.

До появления «персоналок» НИИ работал на советских ЕС (клон IBM S/360, занимает комнату) и СМ (клоны VAX, PDP-11 и др., обычно шкаф размером с пианино), так что дома у нас валялось некоторое количество бобин использованной перфоленты и распечаток с ассемблерными листингами. Ещё матушка периодически моталась в командировки с пакетами «блинов» — сменных накопителей на магнитных дисках весом этак килограммов по 15, боявшихся поездок в троллейбусах, — так что к экскурсии я был морально готов. Ожидал увидеть нечто, похожее на декорации тогдашних фантастических фильмов.

И увидел. Но мигающие лампочками и гудящие вентиляторами шкафы, в которых что-то крутится, впечатляли не так сильно, как «Диггер», пусть даже на монохромном экране. Как и софт для разводки печатных плат, рисовавший их на плоттере (смотреть, как чернильный маркер летает по листу формата А1 — это казалось просто каким-то волшебством), и бесконечные полотна знакомых уже ассемблерных листингов программ для станков с ЧПУ, над которыми тогда работала матушка.

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

А чтобы стать хорошим программистом, надо хорошо учиться. Первые три класса общеобразовательной школы я закончил с отличными оценками, и смог попасть в лицей с математическим уклоном. Вообще, на тот момент в городе было несколько школ с хорошим качеством обучения — 29, 30, 41 (лицеи), 56 (гимназия). Каждая — локальный брэнд и династический рассадник технической, гуманитарной, или управленческой, в зависимости от профиля, элиты. Особенно «тридцатка» — практически все местные заводские руководители (а Ижевск традиционно был городом-заводом) закончили именно её, причём, как правило, маткласс. Как, впрочем, и моя матушка (и она в итоге тоже стала руководителем, но об этом позже).

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

Культура была высокой, а конкуренция — очень жестокой. Из 30 человек отличников, пришедших со мной в пятый класс, к финалу на математическом направлении осталось десять, остальные разбрелись по иным, или вовсе отсеялись. На самом деле, матклассов было два, но только ученики из первого, занимавшие верхнюю половину рейтинга успеваемости, могли участвовать в олимпиадной команде, традиционно занимавшей места на республике и России (а иногда и в международных соревнованиях).

Я болтался где-то в районе шестого места, периодически забираясь выше, поэтому в периоды подготовки к олимпиадам частенько оказывался с остальными продвинутыми ребятами на задних партах, где мы вместо самостоятельных работ решали задачи+, задачи° и даже задачи**. По правде говоря, олимпиадным мышлением я не обладаю — хорошо вкапываюсь в суть проблем, но мыслю слишком медленно и всегда делаю несколько пробных подходов, так что выше городского этапа ни разу не продвигался. Ну, хотя бы поучаствовал, а результатом можно считать тренировку мозгов на нестандартные (но воспроизводимые, в отличие от решений типичных олимпиадников, которые обычно применимы строго ad hoc) решения.

Да и вообще, даже последний троечник по меркам элитного рассадника был бы отличником в обычной школе, и в универе мне это аукнулось… впрочем, по порядку.

По прошествии многих лет, оценивая свои возможности, я иногда начинаю сожалеть, что не выбрал вместо местного технического университета какой-нибудь столичный, — мои одноклассники успешно закончили и МФТИ, и МГУ (и некоторые в итоге работают в Гугле), —, но это сожаление быстро проходит, когда я вспоминаю, как я учился в общеобразовательные семестры до «экватора». Никак не учился — школьного багажа, включая дополнительные курсы, которые вели те же вузовские преподаватели, было достаточно, чтобы получать «автоматы» почти по всем предметам. Впрочем, даже вступительные я не сдавал — студентом стал ещё в апреле, пройдя подготовительные курсы, и набрав высший балл на пробных экзаменах. Это было, как вы понимаете, несложно.

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

Только самообразование боем могло меня спасти, и на втором курсе я нашёл себе работу. Прямо тут же, на кафедре, сисадмином. Работа так себе, но зато она гарантировала неограниченный доступ к факультетским серверам и интернету, а также позволяла торчать в лабе хоть сутками напролёт — и тратить время не только на трёп в IRC с девочками из соседнего универа, но и кодить что-нибудь для всяческих случайных заказчиков. Минимальная зарплата в 1999 году была 83 рубля 49 копеек (зачем платить студенту больше?), а бутылка «Букета Чувашии» в «деканатском» магазине напротив учебного корпуса стоила 4.60, так что мы с другими такими же студентами-админами иногда скидывались на пару ящиков дешёвого пива для физрука, чтобы не тратить время на бессмысленные круги по стадиону.

Вместо физры время тратилось на собственные поделки на Perl и tcl (запрограммить ирцешного бота-болталку для развлечения девочек из соседнего вуза — это очень интересно), а также на разработку внутренней системы для проведения турниров по правилам ACM.

В ижевском «механе» тоже нашлась своя олимпиадная команда, тоже на тот момент занимавшая далеко не последние места в международных соревнованиях, но мне показалось куда интереснее обеспечивать инфраструктуру для турниров, чем ломать на них голову. Тем более что зачёт полагался и так, и этак. Кроме совсем уж низкоуровневых и скриптовых языков, я не чурался и утилит для бухгалтерии на связке 1С и Visual Basic, и для деканата на FoxPro и Delphi, а для развлечения пописывал аплеты на Java для своего «хомяка» на факультетском сервере.

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

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

Лето 2001 года, Ижевск


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

К счастью, подвернулась конторка с говорящим названием «Виртуальный Ижевск». Микроскопическая веб-студия, но как тогда полагалось любой уважающей себя веб-студии — с каталогом региональных ресурсов, вебчат-сервером, и уймой проектов разного уровня маргинальности. Как вам, к примеру, онлайновый конкурс красоты «Мисс БикиНю-2002»? А если я скажу, что у него был закрытый раздел для спонсоров, с более интересными фоточками «моделей»?

Тот ещё гадюшник, короче. Зато, у директора конторки была идея фикс перевести все разработки студии с тормозного Perl на свежевышедший PHP версии 4, потому что где-то он прочитал, что за ним будущее (а ещё он банально быстрее). В общем-то, директор не ошибся. Продержался я там всего полгода, но хотя бы выучился сносно писать на PHP — причём, из-за специфики проектов приходилось заботиться о безопасности. Ломать их с целью накрутки голосов пытались серьёзно — спонсорские призы в конкурсах были достаточно неплохие, типа поездок на компанию друзей в Турцию, и девочки из того самого соседнего вуза собирали целые команды доброжелателей, готовых вывести их в топы.

Также интересной была инициатива того же самого директора собрать локальное сообщество веб-разработчиков, — форум, в котором бы тусовались все ижевские разработчики и провайдеры, — и, представьте себе, оно в каком-то смысле живо до сих пор, пусть даже в пятой реинкарнации. В каком ещё городе есть собственный рок-фестиваль на полторы тысячи айтишников? А в Ижевске есть РокИжайти. Началось же всё там, на самописной доске сообщений, где разработчики и руководители десятка местных контор поначалу в закрытом режиме культурно делились проектами и опытом, а потом начали разводить эпические срачи, быстро вышедшие и в офлайн. Последние отголоски тех легендарных словесных баталий и бизнес-вендетт начала 2000-х тлеют в местном сообществе до сих пор.

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

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

Подразделение называлось «Центр мультимедиа и Интернет-технологий», и формально занималось поддержкой университетских сайтов, систем дистанционного обучения и т.п., но на самом деле представляло собой гибридную структуру в составе бизнес-окружения вуза, то есть, занималось зарабатыванием денег, и не только для поддержания имиджа.

Отдел мультимедиа выпускал презентационные диски для местных заводов (например, Ижмаша и СЭГЗ), а отдел интернет-технологий и был той самой веб-студией, регулярно бравшей призы на отраслевых выставках. Честно говоря, стена в директорском кабинете, увешанная дипломами от пола до потолка, внушала. В основном, клиентам, приходившим на предмет договориться о разработке очередного представительского сайта.

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

Срочно потребовался «ну хоть кто-нибудь» на замену, а я очень удачно оказался свободен. Матушка просто притащила меня за шкирку, бросила за консоль конторского сервера, и велела брать всё интернетовское в свои руки. Мультимедийный отдел точно так же оказался в руках сына маминой подруги, и мы как начали фигачить!

На самом деле, трудно представить более стрессовую ситуацию: прийти на место признанных профессионалов, подхватить на лету повисшие в воздухе чужие и совершенно незнакомые разработки, и делать вид, что ты способен вот это всё потянуть. Да ещё и как минимум, не хуже. Я плохо помню последующие несколько месяцев — с утра надо было посещать пары (слава богу, не все, часть предметов мне таки перезачли) в своём универе, потом тащиться через весь город в соседний, и там торчать до глубокой ночи. И выходные тоже торчать на работе. Ещё и тусоваться хотелось, а то, как же быть студентом, да обходиться без пьянок…

Потребовалось около полугода, чтобы прочитать все RFC по технологиям, все руководства к используемым языкам и платформам, разобрать все нагромождения унаследованного от старой команды кода (особенно, университетские сайты, написанные на жуткой смеси ранних версий Java и PHP с самописными расширениями), и параллельно вести разработку собственного программного базиса — на PHP only. Не только потому что новая метла должна мести по-новому, но хотя бы из гигиенических соображений: за десять лет работы старой команды в проектах, которые велись без какого-либо контроля версий, накопилось много мусора, и на свежий взгляд это было очень заметно.

Также стоит учесть, что на рынке в тот момент ещё не существовало сколько-нибудь развитых CMS, да и вообще, «рынком» тогдашнее положение дел в веб-разработке назвать было довольно сложно. Каждая контора писала что-то самобытное, с собственным зоопарком. Поэтому я обложился всеми доступными примерами опенсорсных »-нюков», и за последующее лето, в аккурат перед пятым курсом, собрал из запчастей своих форумных и конкурсных «движков» простенькую CMS, позволявшую разрулить сиюминутные задачи. Вдобавок, меня тогда пропёрло по теме UX, и, проштудировав все имевшиеся на тот момент HIG, я почему-то проникся майкрософтовским Wizards 97, идеологию которого и постарался максимально воплотить в интерфейсе, реализовав пошаговые мастера на все случаи жизни.

Поздняя версия CMS, мастер создания страницы сайта

Как ни странно, но шалость удалась. Я не только сумел успешно завершить аварийно повиснувшие проекты, — уже на собственном движке, —, но и ускорил разработку в несколько раз. Более того, из-за необходимости тщательно задокументировать имевшиеся у нас проекты, у меня само собой возникло подробнейшее техническое задание на типовой представительский сайт для какого-нибудь типового завода —, а также методичка для авторского сопровождения сайтов муниципальных образований, так как один из проектов был именно таким, а ФЗ с шаблоном тогда ещё не было.

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

Более того!

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

Но не будем отвлекаться на философию. В мультимедиа-центре, пардон, «Центре мультимедиа и Интернет-технологий Удмуртского госуниверситета» я проработал почти пять лет. Свой диплом для Ижевского гостехуниверситета я сделал целиком и полностью на примере внедрения экспериментальной версии своей CMS для муниципального сайта города Глазова (в будущем он тоже возьмёт награду премии Рунета в своей категории; проект жив до сих пор — в четвёртой версии). Это был первый в истории кафедры диплом на тему чего-то околоинтернетовского, поэтому на вкладыше тема значится как «Система управления континентом [sic!] сайта». Ну не знал ещё в 2003 году никто слова «контент», так что я не стал исправлять тот артефакт эпохи.

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

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

Мне пришлось не один раз поучаствовать в переговорах (особенно тяжело было разговаривать с муниципалами — и, господи, как сильно я удивился, когда в появившемся через время ФЗ нашёл прямые цитаты из своей методички; попала в руки законодателей она скорее всего через одного из наших муниципальных клиентов), разруливать конфликты интересов между членами команды, обучать пользователей, и даже пару раз браться за дизайн. Сам не заметил, как стал сеньором.

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

5c9t4qumunhohoeynjb4yn625tm.png


Однажды я забыл сбросить серверный кеш CSS после восстановления сайта из бэкапа, и кто-то из коллег по цеху мгновенно закинул скриншот с напрочь разъехавшейся вёрсткой на линч к Лебедеву. For lulz. Итог: один известный мем.

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

Для развлечения я однажды провёл совершенно бесчеловечный эксперимент. Была такая программа повышения квалификации сельских учителей информатики — когда со всех 25 районов республики их согнали по разным ижевским вузам, и прочитали им курс про основы сайтостроения. Естественно, я преподавал на примере своего движка, и не смог не воспользоваться такой прекрасной возможностью, чтобы провести A/B тестирование нескольких версий интерфейса на сотнях несчастных. Было весело, узнал несколько совершенно неожиданных вещей о паттернах поведения и восприятии пользователей (майкрософтовцы были ой как правы, когда переделали UI Офиса на контекстно-зависимый — он наиболее эффективен; также из интерфейсов совершенно точно НЕЛЬЗЯ убирать кнопку «Save» с дискетой).

Но, в конце концов, мне всё же стало скучно.

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

Было очевидно, что настало время поступить, например, как предыдущая команда, и выйти из здания. К сожалению, я не обладаю достаточными качествами, чтобы быть директором-коммерсом. Техническим — могу, но вот зачем? На вебе свет клином не сошёлся, да и прогресс на месте не стоит. Что было эксклюзивом в 2002 году, в 2006 уже мэйнстрим, и вообще, Битрикс свёл сайтостроение в ремесло.

А не двинуть ли в смежную область. Почему бы и да?

Только в какую?

Я ходил побеседовать в несколько разных контор. Не везде меня, страшного тролля с Ижайти, встречали с распростёртыми (троллей вообще мало кто любит), но выбор был достаточно богат. Можно было и в десктопный .NET пойти, и железяки программировать (правда, это на заводе, так что скорее нет, чем да). Но особенно мне понравилась идея разработки больших систем для кровавого энтерпрайза — только вот в этом мире рулила Java, а знание Java у меня было только на уровне тех самых аплетов с универского «хомяка», да лапшеобразного легаси, похороненного на прошлой работе. Ещё и версии 1.1.

Поэтому я принял предложение из местного телекоммуникационного провайдера Ижсвязьинвест (он был «мультисервисный», то есть, предоставлял интернет, телефонию, и телевидение; после кризиса 2008 года умер в агонии и был куплен Билайном, но на тот момент процветал).

Тут необходима небольшая ремарка про историю местных интернетов. Она довольно-таки отличается от типичной для России благодаря компании «Марк» (как бы она ни называлась за свою более чем двадцатилетнюю историю) — ещё с середины девяностых Ижевск очень сильно опережал и скоростями, и покрытием, и меньшей ценой не только все соседние регионы, но и Москву. Причём эпоха DSL-модемов сменилась эпохой меди, а потом и оптики до дома очень быстро, и быстрый интернет в Ижевске стал массовым, а сам этот провайдер явился отличнейшей кузницей технических и управленческих кадров для местной отрасли. Даже местная фидошная туса и то была в основном over марковский Ethernet.

Выходцы из «Марка» основали не одну конкурирующую контору, включая и Ижсвязьинвест. Притащили они с собой и биллинг — монструозную систему, работавшую внутри кластерного Oracle, причём, классического, поверх фирменного сановского железа и под солярой. Почти вся бизнес-логика этого хтонического чудища была зашита в чудо-хранимки, даже письма об оплате клиентам рассылались из асинхронного джоба. На Java (версии 1.4) был написан только небольшой кусочек админки, при том, что почти целиком он генерировался через System.out.println (), и выглядел… хреново он выглядел. На пользовательский же веб-интерфейс смотреть без слёз было нельзя (и не только потому что он был весь шрифтом 7.5pt).

Особенно, по сравнению с тем, во что к тому времени превратилась админка моей CMS. А была она HTA-приложением, неотличимым внешне от нативного, и даже не требующем наличия мыши, даром что писана на чистом JS/DHTML. Начальник отдела так впечатлился, что немедленно взял меня как специалиста по UX. Интеншен был прост — натянуть на хтоническое чудище биллинга красивый, быстрый, удобный, и нативный интерфейс, и продавать его другим провайдерам. По набору возможностей и в самом деле он, будучи разрабатываемым с середины девяностых, рвал все имеющиеся аналоги как тузик, но у конкурентов был вменяемый UI, а у TELSI его не было.

To put lipstick on a pig… Однако, нельзя так просто прикрутить интерфейс к логике, если у неё нет эндпоинтов для чего-либо, хотя бы отдалённо похожего на AJAX.

Слой эндпоинтов надо было написать, интегрировав в существующий код. Но в 2006 году Java 1.4 была уже совсем реликтом, так что перво-наперво я переписал имевшийся зародыш админки на актуальную версию с попутным причёсыванием и приведением кода в порядок (ага, опять пришлось копаться в унаследованной субстанции). По ходу изучил технологический стек J2EE, но ввиду специфики ограничился пока что сервлетами и всей сопутствующей обвязкой, а также JDBC (надо же хранимки дёргать), Velocity (как наиболее похожий на PHP шаблонизатор), и, собственно, core Java.

Постепенно пришло понимание, что вся логика, относящаяся каким-либо боком к показу пользователю, и уж тем более к интерактивному с ним взаимодействию, должна быть вытащена из хранимок, и реализована в слое сервисов на Java, потому как меняющиеся со временем требования к фичам делают конструкцию из сырых вызовов хранимок через JDBC трудноподдерживаемой (менять всё надо в двух местах, а с версионностью кода у баз всё до сих пор плохо, что уж говорить про восьмой Оракл) и хрупкой.

— Окей, — сказал начальник отдела.

Чтобы вытащить всё это дело на свет божий, мне потребовался год. Год! Объём кода был просто чудовищен. Я за раз могу запомнить около мегабайта исходников, а тут код только хранимок тянул на пять. Половина неиспользуемых, другая половина рекурсивно вызывают друг друга, и в целом сплетаются в такой клубок лапши, что распутать его без помощи начальника было решительно невозможно.

Работать приходилось шесть дней в неделю, по одиннадцать часов в день — остальные программисты сидели над поддержкой существовавшего монстра и не могли мне помочь. Итогом стал микроинсульт (это в 26-то лет, my ass!) и полгода на таблетках. Урок усвоил — больше с тех пор не перенапрягаюсь. Работа не сбежит, а здоровье вот может.

Через какое-то время оказалось, что часть данных биллинга удобнее хранить в виде справочников — то есть, не совсем обычных реляционных таблиц, а скорее документов, состоящих из наборов ключ-значение с зачастую заранее неизвестными метаданными на каждую запись. Нативно оракл такое не поддерживает, и вообще, с NoSQL в те годы было ещё тухло.

TELSI, редактор справочника АТСTELSI, конструктор представления справочникаTELSI, редактор записи справочника
Картинки кликабельные

Блин, но что-то мне это напоминает… Ах ну да, документ-порталы же. Что же получается, все информационные системы примерно на одно лицо, если смотреть в профиль? Ну и ладно.
Окей, сказал я. И за несколько месяцев реализовал документно-ориентированное хранилище поверх оракловых таблиц при помощи триггеров, хранимок, создающих вьюхи, и какой-то там матери. Получилось не очень быстро, но вроде заработало с полпинка. Пора было шалтая-болтая вводить в опытную эксплуатацию.

И тут в Ижевск пришёл кризис 2008 года


Хотя, он ко всем пришёл.

Денег не стало не только у всех, но и у конторы, особенно чтобы держать программиста, работающего над будущей версией системы. Контора бросилась набирать новых клиентов, просто чтобы выжить, и меня решили бросить на рутинное обслуживание имеющегося древнего монстра, — потому что возросла нагрузка, —, а новый проект положили на холод. Ещё и зарплату срезали, потому что денег нет от слова «вообще».

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

К сожалению, сделать было сложнее, чем сказать. В бушующий кризис с кровавым энтерпрайзом дела обстоят примерно так же, как и с TELSI (то есть, «отложено» на «потом»), но зато в новой экономической реальности западный бизнес в качестве одного из средств снижения расходов обратил внимание на российских аутсорсеров, и у них попёрло. Пришлось отложить на несколько лет энтерпрайз и заняться тем, что приносило деньги.

Очень быстро я нашёл работу в очередной студии (точнее, они нашли меня — всё же, известность в локальном комьюнити, даже слегка тролльская, штука иногда полезная). Ну как студии… Веб-разработки у них были, но в большей степени этот «информационно-издательский центр» позиционировал себя как аутсорсера. Ну и ещё как типографию. Такой вот очередной гибридный бизнес.

Основным направлением аутсорса была разработка геоинформационных систем, — то есть систем, которые что-нибудь делают с картографическими данными.

Например, текущий проект был — что-то страшное для датских байкеров, на Zend, с неким аналогом портлетов (не спрашивайте, что это, я знаю только про аплеты и котлеты) и вообще каким-то крайне странным ТЗ. И только сел я его внимательно почитать, как байкеры скрылись в неизвестном направлении вместе с техническим директором конторы, который таким образом, как выяснилось, заманил меня на замену себе.

Ну как, «на замену». Нужен был ведущий разработчик на новый проект — тоже ГИС, только про спутниковое телевидение. SatBeams.com — жив до сих пор, можете посмотреть, только, пожалуйста, не обрушьте.

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

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

Казалось бы, звучит просто, но погодите-ка… Сотня помножить на несколько, помножить на сотню, помножить на… упс. Декартово произведение всех возможных параметров переваливает за триллион, а нам надо дифф в реальном времени строить. Вполне олимпиадная задача, кстати.

Вот тут мне университетский курс баз данных и пригодился, а также весь предыдущий опыт работы с оными, и весь опыт проектирования систем, который только был. В итоге всё это вылилось в несколько десятков таблиц, нормализованных до 5НФ, денормализованных таблиц с историей, и вороха запросов по нескольку страниц каждый. С хитрыми джойнами, учитывающими поведения оптимизатора выбранной СУБД. MySQL, то бишь. На другую заказчик не согласился.

Вдвоём со вторым программистом справились где-то за год. Работает, — если вы её хабраэффектом сейчас не уронили, — до сих пор. Люблю я этот проект. И не только за бэкэнд, но и за satbar.js — последний интерфейсный виджет, который мне довелось написать (с тех пор я больше к пользовательским интерфейсам не прикасался).

satbar — переключалка спутников — сверху карты

Неожиданным препятствием стало рисование футпринтов транспондеров на Гуглокартах — Гугл вообще класть хотел своё толстое mojo на сторонние интеграции, и планомерно выпиливал из каждого нового релиза API карт 2.х фичу за фичей, в результате чего оное обросло невероятным набором костылей, и потребовало постоянной поддержки со стороны второго программиста после сдачи проекта в эксплуатацию, —, а на третью версию API он его мигрировал, периодически уходя в депрессию. Зато заказчик хвалился фоткой рабочего стола ПМа Гуглокарт с ярлыком нашего сайта с подписью «nice polygons» — он тайком сделал её, когда был в гостях в тамошней штаб-квартире.

Но клёвые проекты имеют об

© Habrahabr.ru