Skip navigation.
Home

Вести из окопа

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

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

Сижу, разбираюсь с проектом. Вот самое вкусное, что я нашел и с чем я работаю:

фронт-энд писан на смеси JSP, JavaScript и JSF. Никаких вам Primefaces, от лукавого это. Данные между фронт и бэкендом передаются как параметры сессии. Все данные. В сессии - 768 параметров, и список пополняется каждый раз. Подождите, валерьянку и коньяк возьмете чуть позже.

Для неспециалистов: есть такой чудный анкедот:

- Родион, голубчик!
- Чего изволите, барыня?
- Там в гостинной на рояле рюмка коньяку, неси сюда рояль!

То есть во-первых, все что можно свалено в одну гигантскую помойку, а во-вторых если вам нужна всего одна вещь, то извольте притащить с собой еще 767, и никак иначе. По клику мыши (все происходит на локальной машине, т.е. крутится прямо у меня, а не где-то далеко), страница запросто может грузиться 20-30 секунд. У конечного клиента в боевой обстановке это запросто может занимать 1-3 минуты.

Интерфейсы для классов обьявлены чуть реже, чем никогда. Для неспециалистов: если у вас дома пять собак, то вы не можете для выгула конкретной собаки взять любой поводок и пойти ее выгулять: вы должны поймать собаку, лично принести ее к месту выгула и прицепить ей на шею личный, именной поводок. Не существует вещей типа: "просто поводок", или "просто собака", невозможно сделать однотипные операции типа:"помыть/накормить/расчесать собаку", все операции индивидуальны. Следствием этого является многократное копирование одного и того же кода, который отличается от предыдущего только тем, что вместо "взять шампунь, привести Жучку в ванную, намочить Жучку, намылить Жучку и вымыть Жучку" вы должны вставить Тузика или Бобика.

База данных. В ней около 5 сотен таблиц. Для демонстрации уровня организации я приведу всего лишь два факта:

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

- давеча в почту падает отчаянный крик менеджера, цитирую:

"Господа, кто-то гадит в таблицы (список прилагается) со следующего списка IP-адресов (список прилагается) проверьте, что вы пишете туда и зачем???".

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

Некто проявил творческий подход и для одной единственной jsp-страницы сделал полностью свои контролы следующих элементов: radiobutton, button, checkbox.... Причем сделал их жестко завязанными на имена классов на back-side и на функционал: к примеру, этот самопальный radiobutton поддерживает только выбор из трех позиций. Не двух. Не четырех. Только трех. И да, жестко завязан на инстансы (мы ведь помним, что интерфейсы пишут только геи?) определенных классов.

Для неспециалистов: вместо покупки стандартного набора гаек и болтов в магазине вы:
- делаете собственную литейную мастерскую на дому.
- добываете железную руду, учитесь плавить металл.
- отливаете сами гайки и болты с треугольными (вместо шестиугольных) головками.
- можно использовать только аутентичные гаечные ключи с личным вензелем августейшего семейства императора Александра II, другие не подойдут.
- занимает это все добро отдельную комнату у вас в доме.
- вы все это сделали для того, чтобы отлить один болт, одну гайку и один гаечный ключ.
- делали вы это примерно месяц, в отрыве от собственно, работы.

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

Для неспециалистов: на каждом шкафчике у вас подписано на четырех языках, что именно лежит в шкафчике. При этом все надписи на языках, отличных от русского, закрыты черной табличкой, намертво прикрученной к шкафчику на шурупах.

Проект представляет из себя Большой Набор Умолчаний. Например, все знают, что постоянно встречающееся по всему коду (211 включений, если быть точным) число "43" - это Австрия. Почему нельзя в одном месте определить, что "Австрия" это 43, а потом использовать переменную вместо константы - великая тайна есть.

Для неспециалистов: вам в руки попадает инструкция к микроволновке, причем производитель вместо слова "пользователь" или "владелец" везде поставил вашу фамилию. Если вы завтра выйдете замуж и смените фамилию, то инструкция станет недействительной.

Валидация обьектов - это от лукавого. NullPointerException у нас настолько же обычное дело, как восход солнца по утрам.

Для неспециалистов: в обезьянник забросили открытый ящик, полный ручных гранат. Усы чеки заботливо разогнули на каждой гранате, осталось только дернуть. Каждый раз, когда вы слышите взрыв, то приходится идти и долго и нудно выяснять, какая именно макака потянула за кольцо, кто ее при этом дернул за хвост. Хотя бы заколотить ящик с гранатами, не говоря уже о том, чтобы просто убрать его из обезьянника, администрации зоопарка в голову не приходит.

Мы не ловим специализированные эксепшены. Мы ловим просто эксепшены.

Для неспециалистов: в нашей больнице нет паталогоанатома, и есть лишь один диагноз: "в морг".

И вот так тут все. Совсем все. Но именно поэтому я полон оптимизма и веры в будущее: на мой век работы хватит.

Про гранаты,

Про гранаты, увы, это только влажные мечты :(
Я бы тоже очень хотел, чтобы каждый NPE отзывался взрывом гранаты в пукане релиз-манагера. Но увы мне, увы.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.