The Rules

Превед \o/

Данный блог — частная лавочка. Орган пропаганды одного, конкретно взятого человека. Меня.

Это не дискуссионный клуб.

Здесь вам не демократия.

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

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

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

Приятного чтения, зайки.

Рубрика: Без рубрики | Метки: ,

Дрессированная обезьяна

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

Дано:
чувак работает в маленькой конторке из 4 подобных ему экземпляров;
используемый стек технологий — .NET;
пишут заказной софт для американских муниципалитетов, что-то по сбору требований для получения разрешений на строительство;
работают напрямую с заказчиками и получают за это в баксах.

Да, мы, хоть и жаберы, собеседуем и дотнетчиков, потому что их достаточно просто переучить. Положительные примеры уже есть.

Для собеседования бэкендеров у нас давным-давно составлен чеклист, состоящий примерно поровну из сугубо технологических вещей и высокоуровневых практик. Спрашиваем как про общие методологические подходы, так и про внутреннее устройство JVM — в случае дотнетчиков CLR. А также и про БД, и про тестирование, и про CI. Короче, гоняем по полной программе. С нашей кашей нам нужны сеньоры, как минимум — крепкие мидлы. Джунов пробовали брать — они ломаются. К сожалению.

Так вот.

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

Выяснилось, что ребята имеют некое общее ядро, и кастомизируемые для каждого клиента модули, которые поначалу велись в отдельных ветках, а затем было решено подтягивать их на этапе компиляции, через #define / #if … #elif …, из отдельных каталогов с исходниками.

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

Деплой для каждого из клиентов при этом производится вручную. База накатывается update-скриптами, тоже практически вручную, на каждом из задеплоенных инстансов. Централизованного управления версиями нет.

Мы не без офигения переглянулись, но продолжили интервью.

На вопрос о блокировках в БД был получен ответ, что сталкивались, но это всё было связано с незакрытием сессии. Дедлоки? Какие дедлоки? Сессиями, кстати, ребята управляют вручную, и вообще, в проекте по историческим причинам используется nHibernate. (В 2016 году? Серьёзно?) Хм. MSSQL, очевидно, очень хорош на низких нагрузках.

Мы переглянулись ещё недоумённее, но продолжили.

— Какие у вас используются методологии? Waterfall, а может быть agile?
Кандидат замолчал.
— Ну, митинги-то у вас бывают?
— Конечно! Мы проводим митинги в GoToMeeting!

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

— Какие бывают структуры данных?
Кандидат просветлел лицом, и сообщил, что бывают массивы, а ещё List и Dictionary. Но вот о том, какими бывают списки, и как внутри устроен словарь, он рассказать не смог. Причём, был крайне удивлён самой постановкой вопроса.

— Ведь это же стандартные реализации! Они просто работают! Берёшь, и пользуешься! Зачем знать, как они устроены изнутри?

Действительно, а зачем?

Какая разница, связанный список, или на основе массива. Какая разница, упорядоченный словарь, или обычная хэш-таблица… Чёрный ящик, который просто работает. Да блин! Впервые в жизни я встретил разработчика, который хотя бы из любопытства ни разу не залазил в исходники и не смотрел, как базовые коллекции устроены изнутри. Потому что ему действительно всё равно.

Мы переглянулись с ужасом во взглядах, и Александр задал финальный вопрос.

— Object.Equals() и Object.GetHashCode(). Во-первых, зачем, а во-вторых, почему, и в-третьих, что будет, если у двух разных объектов хэшкоды совпадут.

Ну что я могу сказать.

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

Десяток лет опыта, зарплата в пересчёте по нынешнему курсу 150 килорублей, и при этом ровным счётом ноль знаний, ноль умений, и ноль понимания.

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

Но нам такие — не нужны.

Рубрика: Без рубрики, Суть | Метки: , , | 2 комментария

Про собеседования

Превед \o/

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

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

Однако, я считаю, что постоянно заниматься одним и тем же вредно, голову надо периодически проветривать. А если временная смена приоритета и для дела хороша, то тем более. Отвлечься от непосредственного написания кода, и побыть маленько сисопом/девопом мне только в радость. (Да, я уже пообещал написать статью на Хабр по итогам этого приключения, мне есть что рассказать. Напишу, обязательно напишу.)

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

Так вот, на интервью я и играю роль задающего каверзные вопросы: для выяснения степени понимания базовых вещей у нас составлен формальный вопросник, там где все эти на «Java core/как работает HashMap/что такое static/зачему нужен HAVING в SQL», и прочая скучная, но необходимая лабуда. Но это всё можно тупо вызубрить перед собеседованием.

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

Почему меня это так сильно удивляет?

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

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

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

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

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

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

Рубрика: Без рубрики

Байки про мышь и UX

Превед \o/

Сегодня я неожиданно решил рассказать пару баек про UX (и мышь). Я к этой теме, конечно, прямого профессионального отношения не имею (и с чего бы вдруг серверному программисту; мой код за редким исключением прямого выхода на конечного пользователя не имеет), но интересуюсь всё равно, достаточно пристально, и много лет. Часть хобби — того, которое про компьютеры.

Так вот. Про то, что коммерческая мышь изначально была трёхкнопочной, знают, наверное, все. Так же как и то обстоятельство, что во второй модели Ксероксы третью кнопку за ненадобностью выкинули, а Эпл и вовсе dumbed down all mouse buttons to single.

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

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

И чуть ли не запатентовали эту фичу как Майкрософт Офис Контекст Зум (и в настройках даже самых свежих Офисов и ИнтеллиПойнт упоминание о ней до сих пор присутствует).

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

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

Вторая вещь:
Когда Майкрософт делали поддержку 4 и 5 кнопок мыши (и как им только в голову вообще такое пришло? вероятно, когда на рынке появились такие монстры), изначально они решили, что они будут использоваться для браузерных действий Назад и Вперёд. Ну, тогда браузерность была в моде, и модель навигации тоже, вспомните-ка Активный рабочий стол и Веб-Шелл в Виндовсах района 1996 года издания и пары следующих версий.

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

Я и сам очень люблю пятикнопочные мыши. На четвёртую кнопку у меня назначена средняя (потому что теперь она всегда под колесом, и нажимать стало неудобно), а на пятую — макрос «активировать окно под указателем + нажать Альт Ф4», то есть, закрыть окно, на который я сейчас указываю. Чертовски удобно, не надо ни к клавиатуре тянуться, ни в крестик в верхнем правом углу целиться.

Ну так вот. В чём прикол?

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

Рубрика: Без рубрики | 4 комментария

Сидя на плато, рассуждаю я

Превед \o/

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

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

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

Дело в том, что я вышел на плато.

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

Это факт, и он, как и все факты, не требует доказательств. Он просто таков, как он есть. А я, соответственно, «программист информационных систем». Такой же ярлык по своей сути, как и «программист 1С» — просто чуть более высокого уровня.

Да, я владею (формально) чёртовой уймой языков и фреймворков, понимаю как работают механики обработки данных, знаю методики, которые позволяют реализовать такие механики за конечное время, и ещё кучу всякого сильно и слабо с этим всем связанного, от проектирования UX до автодеплоя в тестовое окружение, но новизны творчества в этом никакого нет. Ремесло в классическом своём понимании. Набор практик, которыми можно заниматься, не приходя в сознание, изо дня в день. Они позволяют зарабатывать какие-то деньги. Но.

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

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

Возникает вопрос, какого вообще чёрта я этим занимаюсь.

До тех пор, пока опыт накапливался, радость была в его накоплении. Круто чувствовать, как твой персональный уровень растёт, и программистские скиллы получают по +1 за каждую маленькую новую фичу. Но что происходит после того, как новые фичи перестают давать хотя бы по +0.25 к самому непрокачанному скиллу?

Сначала, и довольно долго ничего не происходит. Жизнь движется по накатанной, и какого-то дискомфорта не чувствуешь. Потом вдруг понимаешь, что задолбало, меняешь работу на более ответственную, и радуешься какое-то время новому окружению, после чего понимаешь, что люди вокруг тебя жрут твой мозг — потому что когда ты настоящий сеньор, то 80% времени тебе приходится тратить на общение с коллегами, и только 20% (и то — в самом лучшем случае) программировать. Задалбываешься ещё больше, зона комфорта резко заканчивается, и начинаешь его искать вне работы.

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

В качестве эксперимента я провёл почти полгода в отпуске. К его концу выяснилось, что единственным приемлемым для меня modus operandi является стандартный полный рабочий день в офисе. Обязательна смена режима работы мозгов на рабочую/нерабочую, причём чётко по расписанию, а в противном случае они начинают заметно сбоить. Из-за этого мне, к сожалению, жизненно необходимо находиться днём на работе, а в нерабочее время полностью выбрасывать мысли о ней из головы.

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

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

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

«Это, в некотором смысле, удивительно. Я социопат, и людей как таковых переношу очень плохо. Они меня в большинстве своём раздражают до озверения. (Эх… Была бы возможность писать код только для компьютеров… Люди же чёрта с два могут сформулировать свои требования к софту — потому что, сука, ту-пы-ы-е в массе, как пиздец. К сожалению, компьютеры сознанием не обладают, и программы им не нужны.)

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

— Вообще совсем не то, как я себе представлял (на самом деле не представлял, потому что никогда об этом не задумывался) то, чем и как буду заниматься в 35 лет.

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

Доломать уже до конца, и отстроить заново? Но тут есть один непреодолимый для меня затык: накопленный опыт является ценностью, которой я не готов поступиться. Те годы, которые я потратил тогда, в начале пути, не просто жалко — это были лучшие годы моей карьеры. В то же время, в моей голове закончилось место для усвоения чего-то совершенно нового, относящегося к другой области. Более того, даже сама мысль о том, что неплохо было бы научиться чему-то новому, вызывает желание с разбега врезаться головой в бетонную стену… Физически неприятно учиться, а запихнутые насильно знания быстро забываются. Неинтересно мне больше учиться.

Картинка: я сижу на плато, и мой предыдущий опыт как золотая гиря, прикованная к ноге, и я устал, и всё горит, и гиря горит, и я в аду.

Нет, не настолько всё хреново, конечно. Брести по жизненному плато можно очень много лет, не прилагая особых усилий — а иначе бы оно так не называлось, плоское же.

Закончить я хочу риторическим вопросом; ответ не требуется.

Куда может пропасть из жопы шило, которое заставляет желать развиваться, и менять самого себя? Что делать, если такое шило пропало, причём давно? И как поменять границы зоны комфорта, если текущая превращается в болото?

Рубрика: Болтовня

Пожалуйста, не делайте меня думать

Ну-ка, ну-ка, что за хрень там упала в жиру…

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

Так, так.

Не, ну это элементарно. Я помню этот модуль, вон тот чувак слева писал, консультировался. Опять аналитики странного хотят, ещё и мажорку повесили на фичу. Хотя, хрен там, а не мажорка в самом-то деле. Даже если вчера сделаю, в апстрим это не замержат ещё месяц, да и на кьюэй оно точно попадёт хрен знает когда, им щас некогда.

И? Тут ещё шесть новых параметров. Размазать по трём таблицам, потому что тут эм к эм, а тут надо вылезти на уровень выше, потому что предыдущему мэйнтейнеру было влом предусмотреть тут абстракцию… Ой, что-то нехорошо. Совсем ерунда получается, тогда тут этот кусок никогда не получит управление. Спросить, что ли, что они имели в виду?

Не, не буду, а то опять два дня на бла-бла-бла потеряю, а потом всё равно придётся делать именно так, потому что хрен переубедишь. Я тут тупой программист всего лишь, и делаю, что мне говорят. Ещё и письма пишу медленно.

Чё она мне там в скайпе кинула? Новый гуёк к фиче? Хорошо.

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

Может, спросить на стековерфло, как это сделать элегантнее? А это что за вкладка? А, хабра… может тут… была же статейка… щас найдём. Нет. Детский сад. И на стековерфло детский сад. Сделаем по-моему. И хабру закрыть, а то глаза мозолит.

Теперь бэкэнд. А, может, ну его нафиг с тремя таблицами? Декомпозируем ещё вон эти, и вместе с ними денормализуем. Да, и старый код тогда отработает как надо заодно. Хм, а он вообще реально когда-нибудь работал? Что там с кавериджем? Что, и тестов нет?!

Вашу ж мать…

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

Так, добавил миграцию… Работает. Теперь расширим тут. Работает? Странно, не должен… А! Нет, ну что это за говно? Эй, чувак! Посмотри вот сюда, ты ведь это писал, твой модуль был? Ты здесь вон уверен? А, тебе главный сказал что так должно быть? А потом он ещё сам патчил? А зачем? Поэтому и тестов нет? Ладно, ладно.

Вообще отлично. Я офигеваю, товарищи. Ладно, к чёрту тут всё, пишем в лоб, в начале влупим десяток лишних проверок только, раз тут такой расколбас. Жопа.

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

Теперь работает? Да. Тесты есть? Да. Ну и пофиг, что уродливо внутри, и гуёк сделан… крайне неклассически.

Я тупой программист. Но я хороший программист. Парадокс? Нет. Проза жизни. Я не хочу вести разговоры, я буду делать тупо что мне говорят, как бы оно странно ни было. Коммит. Таску в дан. Ужас! Я хочу фыр-фыр-фыр, где там моя хабра?..

Пожалуйста, не делайте меня думать.

Рубрика: Без рубрики

There is no place like home. Especially, no workplace

Превед \o/

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

Я уже рассказывал, что за 15 лет фантастической карьеры успел поработать в туевой хуче контор, очень разных, с очень разными начальниками и принципами организации труда. Так что мне есть что сказать по сабжу.

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

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

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

Однако, в этой здоровенной комнате сидело максимум человек семь (и то редко), каждый в своём уютном углу, и горы хлама неплохо отгораживал нас друг от друга. Советские столы — они метр на два. Друг друга с соседних мест не только не видно, но и даже не особенно слышно. А в Епаме же в юнитах чуть большего размера помещается по 15–18 человек. Эти самые угловые столы, составленные островками по 4 с перегородками, за которыми спиной всегда к кому-нибудь сидишь. Едва полтора квадратных метра личного пространства, и твой монитор всё время кто-нибудь, пусть невольно, да палит. Вдобавок, твой сосед через перегородку может полдня трепаться с кем-нибудь по скайпу, и хочешь или не хочешь, но заткнуть его не получится, потому что работа такая, а нескольких десятков переговорок в конторе никто строить не будет.

Для программиста крайне важно войти в состояние «потока», когда мысль сфокусирована на текущей задаче, и Бог Кода творит твоими руками. Практически это транс. Его сложно поймать, такое состояние, и из него очень легко выпасть: достаточно любого вторжения в твоё личное пространство, будь оно физическое, визуальное, аудиальное, — всё равно. Поэтому начальство, которое садит программистов в плотные опенспейсы, обосновывая это всякими дебильными книжками, в которых утверждается, что от этого якобы в воздухе разливается атмосфера, блядь, *ТВОРЧЕСТВА*, — по меньшей мере тупые пидорасы. По большей мере — скряжные сволочи, которые экономят на личном пространстве своих сотрудников, потому что аренда площадей, понимаю, штука дорога.

Но, тем не менее. В одной комнате, какой бы площади она ни была, не может сидеть больше 8 программистов. Иначе они будут мешать друг другу. Если больше — то по статистике ВСЕГДА либо кто-то разговаривает, либо кто-то пошёл налить кофе, или отлить. Не говоря уж о войне за кондиционер — при плотной планировке рабочих мест нельзя добиться того, чтобы кого-нибудь не сдувало, и в то же время кто-то не варился в собственном поту. Соответственно, если за весь день программист так ни разу и не смог толком провалиться в «поток» хотя бы на час-полтора, конечный результат его труда будет куда печальнее, чем может быть.

Но это только половина вопроса.

А вторая половина вопроса звучит так: что значит «на работе комфортно»?

Вот, опять же, казалось бы, офис в центре города, в относительно нормальном здании, куда просто добраться, а из окон открывается неплохой вид, с приличным ремонтом, кухней, комнатой отдыха с диванчиком, и даже наличием в раковинах горячей воды. Или взять тот кошмарный офис «Бон Анцы» в далёкой-предалёкой жопе на Татарбазаре, в старом присутственном здании, где тупо некуда поставить не то что диванчик, но даже микроволновку (потому что проводка не рассчитана на дополнительные 600 ватт), и да, воды в туалете не бывает не то чтобы горячей, но временами и вообще. Где будет комфортнее?

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

А вот это уже вопрос по существу.

Уют — штука тонкая и субъективная. Цветок в горшке на подоконнике рядом с твоим рабочим местом создаёт больше уюта, чем наличие Xbox’а в комнате отдыха. Весёлый плакатик, криво повешенный на дверь комнаты, но выбранный тобой лично, даёт 100500 очков форы всем корпоративным баннерам, развешанным эйчарами по коридорам офиса в ознаменование XX-летия Компании. Ну и так далее: уют складывается из мелочей, и неотделим от личности человека, живущего часть жизни на рабочем месте, и не стесняющегося своей жизни здесь.

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

На моём рабочем месте в разные годы можно было найти семью Муми-тролей, Змейсу-пиявсу, самодельные плакаты-демотиваторы разной степени идиотизма, Ежа Большого и Ёжика Маленького, Хрустальный шар, веник полыни, маску Гая Фокса, ловца снов, футболку со Слоупоком, и прочую развесёлую хрень. Большей частью всё это раздаривается бывшим коллегам при увольнении, чтобы место оставалось уютным. Нет сомнения, что и на новую работу я что-нибудь подобное притащу.

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

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

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

Есть ещё третья половина вопроса, которую я не буду касаться сегодня — это межличностные отношения в коллективе. Оставлю на потом. Большая отдельная тема, неизвестно ещё, сподоблюсь ли написать…

Рубрика: Суть | Метки: , , ,

Кстати, да, я ведь ищу работу

Update: таки нашёл. Тут поблизости, и неплохая такая конторка. В Гугль, к счастью, не взяли (слишком тупой), а то пришлось бы в Америку ехать.


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

View Alexey Evdokimov's profile on LinkedIn

Мой Круг — Алексей Евдокимов

Резюме на hh.ru — не нашёл, как там эмбед-карточку сделать.

Хорошую — значит интересную. Интересную — значит, никакого быдлоынторпрайза и прочих всяких биллингов. В Москву/Питер/другие города России переезжать категорически НЕ собираюсь, но вариант с удалёнкой и редкими командировками рассматриваю. А вот что касается релокейта в другие страны — тут я совсем не против.

У вас есть что мне предложить? Пишите / звоните мне в скайпе — workales, в гости зовите.

Рубрика: Без рубрики

8 стрёмных букетов, или Давай сыграем в загадочное псто

Превед \o/

Давай сыграем в игру?

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

Напиши в каментах своё мнение (некоторое время они будут скрыты, так что не стесняйся предполагать любой бред), а где-нибудь через месяц, ну или когда мне будет не лениво, я расскажу, почему, зачем, and why so serious.

Итак, поехали.

24 июня

24 июня

4 июля

4 июля

10 июля

10 июля

17 июля

17 июля

13 августа

13 августа

3 сентября

3 сентября

16 сентября

16 сентября

14 октября

14 октября

А теперь — тебе слово. Мне очень любопытно узнать, что ты думаешь.

Рубрика: Суть | Метки: , ,

Про Епам. The Grand Finale

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

Про бенч

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

Это такое промежуточное состояние. Это не отпуск, сотрудник так же ходит на работу (и зарплата остаётся той же самой), просто человек весь день предоставлен самому себе. Сидеть без дела обычно скучно, и в случае высокого тайтла слишком дорого для конторы, поэтому головная боль РМа (особенно, если специалист сам по себе не слишком хорошо себе представляет, на что можно с пользой потратить свободное рабочее время) — эффективно занять его либо на каком-нибудь внутреннем проекте конторы (обеспечивающем бюрократию и/или предоставляющем внутренние IT-сервисы; и их, прямо скажем, немало), либо заставить пройти курс обучения чему-нибудь профессионально полезному.

В моём случае, например, второй путь — научиться чему-либо — оказался заказан, потому что по 80% курсов для Java специальностей я и сам вполне могу преподавать не хуже, чем минские ребята, а оставшиеся 20% лежат абсолютно вне моей области интересов (ну не хочу я заниматься андроидом, портлетами, и прочей undead нечистью).

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

Вообще, учитывая опыт Большого Проекта Для Зелёного Банка, к тому времени у меня уже вполне сложилось намерение уйти из конторы, потому что — на хрен такие проекты. Но первые полгода после развода я особо не рыпался — не стоит принимать решения подобного рода сгоряча, в расстроенном состоянии духа (ночами я иногда выл на луну. буквально), — а тут на новый год я съездил в Европу, чуток развеялся, и только после этого начал приводить мысли в порядок, и потихоньку собираться в кучу. И тот факт, что бывшая жена по-прежнему сидела в соседней комнате и регулярно мозолила мне глаза — это, сами понимаете, очень сильно меня раздражало (потом она уехала в Москву, но это было уже потом).

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

Так что я бы точно ушёл, но в один прекрасный день меня поймал на кухне Андрей Гребнев.

Про Андрея Гребнева

— Кто это вообще такой?

«Будущая звезда Ижевского и Удмуртского IT-бизнеса» (C) Вылегжанин о своём протеже и единственном (после того, как Купцов уехал в Москву) в офисе ПМе.

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

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

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

Так вот, в один прекрасный день ко мне неожиданно подруливает Андрей Гребнев, и со своим фирменным британским акцентом такой говорит:
— Есть тут один небольшой проект на жабе. Простенький, на полгодика. Не желаешь его полидить?

Про внутренний хайринг

Тут надо рассказать о второй основной функции РМов. И если про первую я рассуждал с точки зрения рядового члена пула, то о другой надо рассуждать с точки зрения компании.

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

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

Такой вот бездушный bodyshop™.

Но к описываемому моменту ситуация с доступностью тел для ещё одного проекта на жабе сложилась довольно специфическая.

Про ситуацию

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

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

Примерно так и вышло — контора (Другой Банк Чего-то Там) решилась заказать стратегическую разработку в Епаме, а свободного народу, кроме меня, и вон тех трёх ребят, в начале прошлого года не нашлось. Причём, раз пресейлом этого проекта занимался не кто иной, как Гребнев, он и выступил ПМом на старте, а не отвечающий за остальные проекты Другого Банка (включая Другой Банк Что-то Там) московский ПМ Лёша.

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

Команда А

The right man in the wrong place can make all the difference in the world. Помните, чем это закончилось? А нас таких было аж четверо.

Первый

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

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

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

В общем и целом он далеко не дурак. Но по человеческим качествам чувак весьма… специфический.

Второй

Про Сашу П. я не могу сказать ничего плохого. Наоборот, он большой молодец и умница.

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

Что делает ему большую честь, все мои замечания Саша учёл, полностью исправился, и на начальном этапе проекта для Другого Банка Чего-то Там выступил в качестве основной движущей силы. Но после участия в проекте Зелёного Банка он, чувак более чем адекватный и чертовски работоспособный, рекомендации получил реально разгромные.

И ещё ему сильно не хватало практических знаний стека EE, потому что на жабу он переучивался с дотнета.

Третий

Что касается третьего (пусть будет «Вадик»), то с ним вышла ещё более неприятная история.

Как я тоже уже говорил, процесс карьерного роста в Епаме во многом зависит от выслуги лет, и начальные тайтлы назначаются вовсе не за реальные достижения, а по совокупности довольно субъективных оценок. Соответственно, «Вадик», которому около сороковника, довольно быстро получил тайтл D2, даже не смотря на то, что за те полтора года, которые он провёл в конторе, так ни разу не поучаствовал в промышленной разработке по основной специализации, Java.

Это так забавно… Ижевск — город очень маленький. Специалисты ходят кругами по одним и тем же конторам, и «Вадик» был одним из тех несчастных, кто после моего ухода из Ижсвязьинвеста (и до продажи конторы Пчелайну) не смог осилить запуск той версии биллинга, которую я для них написал. Соответственно, весь его предыдущий бэкграунд, разработчика 1С, прирос только ковырянием в Оракловских недрах старого ижсвязьинвестовского биллинга. Соответственно, в Епаме его и использовали как SQL-скриптописателя.

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

В общем, мне его продали как крепкого Java D2. И это просто ну абсолютнейше не соответствовало действительности, но в начале я об этом не догадывался.

And the last but not least

Что же касается меня, то я — я просто терпеть не могу руководить рабочими группами.

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

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

Не спорю, подхожу, и прокачать смогу, наверное. Но — не хочу, причём категорически. И не буду. Мне этого ещё в удге хватило с избытком. Я был полностью уверен в этом и до проекта для Чего-то Там Другого Банка, а уж теперь и подавно.

Но Андрей Гребнев умеет добиваться своего. И меня он таки уговорил.

Хотя, может, и не он. Если честно, то я не знаю, на кой чёрт я согласился.

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

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

Про остальных

К счастью, что касается остальной команды, то с ними нам как раз повезло в том плане, что они оказались людьми, которым все мои особенности либо понятны, либо не критичны. С Ириной Н., лидом тестирования, мы постоянно зависали на кухне, московский ПМ Лёша оказался душевнейшим чуваком с крайне позитивным восприятием мира, аналитик Юля из Твери — вообще своя в доску крича…

И то, что мы сработаемся, стало понятно как-то сразу. (Мне в самом деле было очень приятно со всеми вами работать, ребята. Надеюсь, я вас не слишком бесил.)

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

Про поставленную задачу

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

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

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

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

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

Ну что ж. Говно вопрос, сделаем. 85% — это интерфейс, а на остальное у меня есть заготовка. Помните, чем я занимался в «Астарусе»? У меня осталась рафинированная выжимка исходников тамошней системы, в которой и тебе готовый синхронизатор, и управление справочниками, и ещё кучка всякого интересного, но не нужного. Каждый опытный программист держит такую библиотеку домашних заготовок — использовать её вполне безопасно, потому что за время проекта весь изначальный «затравочный» код каждый раз переписывается полностью. Но писать надо уже не с нуля.

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

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

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

Во-третьих, Гребнев попытался забить гвоздь известным ему молотком. Нельзя было делать эту систему на Java EE — её надо было делать на InfoPath Server или SharePoint Forms Services, которые решают как раз такую задачу, а не велосипедить собственную самобытную хрень на JSF. К сожалению, ни на пресейле, ни на старте разработки никто этого не понимал.

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

Про скорость света, или Почему JSF — говно

Как я уже говорил, после проекта для Зелёного Банка я изучил вторую половину технологий на букву J. Осталась третья, в которую мне категорически не хотелось даже соваться, потому что UI и веб-разработка на жабе — это один сплошной непрекращающийся факап и фэйспалм.

Локальный UI на SE — говно, потому что в языке нет нативных событий, а что касается веб-UI… я не знаю, какой безумный индус это всё проектировал.

Если сервлеты ещё более-менее вменяемы (хотя бы идеологически понятны, и убоги только из-за иммутабельности жабовских строк), то «технология» JSP (то есть, шаблоны, которые компилируются под капотом в сервлеты) — это какой-то PHP, отражённый в кривом зеркале ынторпрайза, а JSF (очень плохая пародия на ASP) — это уже совсем какая-то клиника, выползшая из тёмных веков, когда браузеры были совсем тупыми. Ещё есть портлеты и прочая некрофилия, но чур меня, чур!

Вы играли когда-нибудь в многопользовательские онлайновые игры?

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

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

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

Ну так вот, почему JSF говно. Ровно потому, что в нём любой тык на флажок в браузере ведёт к запросу на сервер, где обрабатывается кодом на жабе, который выстраивает по новой дерево элементов всего документа, выплёвывает кусок отличающегося HTMLя обратно в браузер, который там перерисовывается в форме.

А теперь представьте себе, что сервер в Москве, клиент во Владивостоке, а чекбоксов в форме несколько десятков…

А теперь представьте, что заказчик желает, чтобы приложение работало в IE7, в котором перерисовка элемента в зависимости от его положения на странице занимает чуть ли не логарифмическое время от начала документа к концу (при этом ещё и память течёт)…

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

И как вы думаете, что же было выбрано для проекта?

JSF библиотека PrimeFaces!

На то, чтобы отговорить заказчика от IE7, ушло полтора месяца.

Хьюстон, мы не умеем его правильно готовить!

Нет, Гребнев мне изначально сказал, что я де могу выбрать что угодно для веб-интерфейса, но, простите, что?

На жабе больше ничего путного нету, кроме нескольких шаблонизаторов, довольно тупых, или этого гуглового монстрячества, забыл как его кличут. И я, конечно же, не желая трогать всякую гадость, раньше всегда использовал тупо сервлеты с шаблонизатором Apache Velocity, но мне пришлось бы сначала научить ребят его правильно готовить (это реально очень тупой шаблонизатор), на что в проектном расписании совершенно не было времени. Плюс ко всему, все они прошли по учебным проектам с JSFом. По крайней мере, они мне так сказали.

(И уж тем более, мне, как Java специалисту, было бы странно предлагать делать проект на чём-то другом. На PHP, например.)

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

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

Но я об этом не знал, и из ребят, которые просто-таки обязаны были почерпнуть столь важные знания из учебных курсов, тоже никто не догадывался. Соответственно, при планировании я не заложил времени на разработку промежуточного слоя вообще.

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

Впрочем, были проблемы и похуже.

Про «Вадика»

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

С UI лучше всего справился Саша П., с базой — «Мыколай», а «Вадик»… А «Вадик» все три завалил вчистую. Правда, при этом он сделал одну подкупившую меня вещь — подошёл с тетрадкой, и попросил рассказать, как это всё делается правильно.

Ну ОК. Я рассказал, показал, объяснил. «Вадик» сделал большие глаза, и долго благодарил за науку. Мне бы тут сделать определённые выводы, но мне некогда было их делать, потому что надо было разрабатывать ТЗ, и заниматься прочей бумажной работой.

Так что по остаточному принципу именно он и получил разработку конфигуратора.

А ещё он зачем-то попросил меня «рассказать об архитектуре БД». В смысле, не поленился распечатать схему (затравочную на тот момент) на листе А3, и попросил объяснить, зачем тут всё, и почему так, а не иначе. Я тоже не придал особенного значения, и объяснил на пальцах. У остальных ребят проблем с пониманием модели почему-то не возникло.

Прошла неделя.

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

И вот прихожу я как-то к «Вадику» вечером, посмотреть на что он там наклепал по конфигуратору (а клепал он что-то ну очень медленно и крайне некачественно), а он сидит с выключенным монитором, и втыкает в схему БД. Прямо медитирует, глазами её ест.

— «Вадик», — говорю, — зачем ты схему БД гипнотизируешь? «Мыколай» занимается БД, а у тебя задача сейчас другая. Или ты её уже сделал? Почему не залил в репу тогда?
— Нет, не сделал.
— В чём затруднения? Чем тебе помочь?
— Расскажи мне про архитектуру БД. Я её не понимаю, — и глазками хлоп-хлоп.

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

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

Наконец, «Мыколай» в грубой форме (а в другой он и не умеет) доводит до моего сведения, что «Вадик» постоянно достаёт его кучей странных и непонятных вопросов по структуре БД…

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

Ебать мой хуй…

Я сосчитал про себя до десяти, и затем подробно перечислил «Вадику» служебные обязанности D2, а также о том, какие конкретно ожидания у меня связаны с их добросовестным исполнением им, как моим подчинённым в виду его участия на проекте, где я выступаю в качестве лида разработки. Голос у меня звенел, и пару раз сорвался, конечно, но я старался не заорать.

«Вадик» моей пламенной речью наконец, проникся, и, наконец, выложил всё наболевшее начистоту. Во-первых, на жабе он никогда ничего не писал. Весь его программистский опыт — это много лет ковыряния в 1С, и потом работа с Ораклом. В Епам он попал на волне массового набора, и смог на входном собеседовании пустить пыль в глаза Гребневу, а затем ему повезло не попадать на проекты, где пришлось бы писать что-то на жабе. Во-вторых, на проект ему в реальности насрать с колокольни, и всё что, ему вообще от жизни надо — это приходить на работу, сидеть 8 часов, ковыряться в чём-нибудь простеньком (SQL-скрипты, например, писать), и получать за это зарплату. В-третьих, D2 он получил, пользуясь своими soft skills, и природным обаянием, которое на меня, почему-то, не действует, чему он изрядно удивлён.

Блять, мне на проект попался Java D2, который не знает, чем интерфейс отличается от класса… Который хочет получать зарплату за 8 часов сидения на работе… Который врёт РМу, чтобы получить повышение, и вообще всем остальным… ЕБАТЬ ЖЕ Ж МОЙ ХУЙ ТРИТЫСЯЧЕПЁЗДЫМ ПРОЕБОМ!

Я тотчас же вызвонил Лёшу, и выложил ему всё, что думал по этому поводу. Гнать «Вадика» с проекта ссаными тряпками, и по возможности — нахуй из конторы.

Но вы же помните, что выгнать из Епама никого нельзя. Мало того, даже с проекта уйти человека, если он сам того не желает, и ему нет немедленной замены, невозможно.

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

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

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

Впрочем, контору он не покинул. Его оставили на поруки с намерением доучить до настоящего Java D2. Учить пришлось, действительно, с самых азов.

Замену ему нашли, но не сильно лучше.

Шило на мыло

Опять же, единственным, кто нам мог выделить человека в Ижевске, был Гребнев. У него по прежнему ни шатко ни валко шёл пресейл, над которым трудились остававшиеся бенчующиеся ребята, и отдавать кого-то из них он абсолютно не желал. При этом формально я мог проводить интервью с любым из них. Блин. Да наплевать мне на политику… Хрен с ним, ну поссорюсь я с Гребневым, один чёрт после такого эпизода я по окончанию проекта точно сваливаю из конторы.

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

Единственным, кто честно сказал, что ему глубоко фиолетово, на каком проекте работать, был ммм… как бы его назвать… ну пусть будет «Царёв». Ну так вот, он сказал, что Гребнев будет против, но ему реально насрать, потому что у меня вроде как система более прикольная.

Я выдал ему задание на транспортный слой междусерверного синхронизатора (нужно было обеспечить гарантированную доставку) — и он выдал на удивление продуманное решение.

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

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

Если я — клинический тормоз, и выдаю код в неделю по чайной ложке, то «Царёв» принципиально водит задним ходом, ориентируясь исключительно по зеркалу.

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

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

— Мне интересно сидеть на попе ровно и пилить один и тот же проект десять лет. Оптимизировать его, оптимизировать его вусмерть, — улыбаясь, ответил «Царёв», — И можно, я уйду с проекта, а то вы для меня слишком быстрые.

Лицо с чугунной задницей. Но с чувством юмора. Редкий случай. Саша Б. его в конце концов отпустил.

Про кризис на проекте

Вся эта ерунда с «Вадиком» стоила мне огромных потерь психической энергии. Моё дело писать код, а не скандалить со всякими придурками. Я вообще на такое не подписывался…

К середине лета у меня было уже как-то работающее приложение, и огромный дополнительный скоуп к ТЗ, который надо было раскидать, и из-за которого напрочь рушились все планы, тем более что общий темп разработки мог выдержать только Саша П., а остальные, включая меня, выдавали результат крайне медленно. Плюс ко всему, Ирина провела нагрузочное тестирование, по итогам которого последовал неутешительный вывод — мы реально приготовили приложение очень неправильно. Такие нагрузки на сервер ненормальны. Нам однозначно нужен кто-то, кто смог бы нас научить.

Вдобавок ко всему, «Мыколай», пользуясь тем, что в Епаме довольно демократическое отношение к рабочему времени, и сидит он в другой комнате, начал довольно заметное время отсутствовать. Пока он выдавал требуемый результат, я смотрел на это сквозь пальцы, но после того как он просрочил несколько заданий, и я застукал его за откровенным леваком, притащенным неизвестно откуда, он начал давать некоторого джазу. Не особенно приятно, когда тебя постоянно пытаются троллить твоими ошибками — не ошибается только тот, кто ничего не делает, и естественно, в моём коде баги тоже встречаются. До того, как я порекомендовал его на D2, он вёл себя намного лучше. Видимо, зря.

В какой-то момент я вдруг понял, что от всего этого устал, плюнул на всё, и за две недели до отпуска пустил разработку на тормозах, по факту забив на лидерство. Ну, сезон отпусков же. Все поочерёдно отсутствовали, а планы… с планами за это время стало совсем херовато.

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

Если взять D3 и добавить к нему D1, в итоге не получится два D2. Будет два D1, потому что караван всегда идёт со скоростью самого медленного верблюда. Соответственно, все сроки изначально надо было умножать на три. Вот же ж дерьмо… а я ещё удивлялся, почему оно всё такое быстрое.

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

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

И да придет мессия

Лёша поднял всех на уши, и мессию таки нашёл. Мессией оказался Саша Б., тот самый чувак, который изначально участвовал в пресейле, который реально очень хорошо знает JSF, и который уже несколько раз давал нам крайне дельные советы.

Я не знаю, при помощи какой дипломатии он вырвал его из лап Гребнева. Сам Саша Б. потом рассказывал, что по факту всё это время он торчал на бенче и зверски скучал, но уйти к нам до вмешательства Лёши у него не вышло бы.

Ну так вот, Саша Б. — молодой, горячий, прекрасно знающий своё дело программист. Пришёл на проект, и буквально за неделю вытянул производительность с того света. Заодно научил нас всех, как правильно пишутся веб-приложения на основе JSF. М-да, и близко не так, как Саша П., на которого я взвалил задачу по UI, себе это представлял. Он быстро привёл всё в порядок, и наконец-то можно было добавлять новые фичи, не боясь всё окончательно обрушить.

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

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

Не вижу в этом никаких проблем, даже наоборот, я просто счастлив заниматься только тем, что я умею лучше всего — код писать. Так что от лидерства я с огромным облегчением отказался, а новым лидом стал Саша Б. Вот про него нельзя сказать, что он был этому особенно рад, но организовать работу по новому плану у него получилось явно лучше, чем у меня по старому. Опять же, нельзя забывать, что теперь мои руки на все 100% оказались заняты в разработке, а дорвавшись до программирования, я ещё вполне способен дать жару.

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

Терпеть трололо и медлительность «Мыколая» Саша Б. особенно долго не стал, и в итоге смог от него избавиться (впрочем, тот сам с радостью покинул контору), а на его место пришёл другой, уже совершенно нормальный D1.

Короче, наконец-то, после смены почти всей команды, пошла нормальная разработка. Через полгода после старта проекта, но пошла как надо…

Итого

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

Я мог бы ещё понаписать всякое, но мне уже надоело. Надо поскорее выкинуть из головы, и забыть весь этот кошмар.

 

FIN.

Рубрика: Болтовня | Метки: , , , , | 4 комментария