The Rules

Превед \o/

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

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

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

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

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

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

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

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

Ненормальное программирование

— На Хабре есть такая рубрика

Превед \o/

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

Ну а уж что касается поддержки программных решений, которые делают «ненормальные» вещи…

Case 1

У заказчика SatBeams была в некотором роде killer-feature в плане визуализации с этими его картами покрытия спутникового телевидения, но при этом не было данных по каналам, которые можно было бы в этих зонах покрытия принимать. Обычно такие данные собираются краудсорсингом, но для этого необходима активная пользовательская база.

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

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

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

Пиздить чужие данные нехорошо, задача — ненормальная. Зато повод поупражняться в ненормальном программировании.

Case 2

Система, которую злобный Епам за ? 000 000 000 рублей разрабатывал для Зелёного банка, на самом деле представляла из себя порядка 50 enterprise приложений. Каждое — отдельные по функциональности модуль, который может крутиться на собственном сервере.

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

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

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

— Да вы, ребята, издеваетесь!
— Окей. Это кто ещё издевается. Архитектуру с распределением модулей, централизованным хранилищем конфигурации, и копропротивной шиной придумали, вообще-то, вы… Но для тестовой топологии мы сможем выкатить решение!

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

Так родился Deployer — утилита, которая на вход принимает две жирные XML-ины, в которых описывается 1) состав модулей с их зависимостями и антипатиями, и 2) топология серверов, куда чего развернуть. И дальше происходит МАГИЯ: утилита сама обзвонит все сервера, отконфигурит и задеплоит что куда следует, а при необходимости добавит недостающие модули, или рестартанёт если где что уже было, или обновит версию.

Результат: логика этого продукта моего сумрачного гения оказалась настолько нетривиальной (сами попробуйте как-нибудь дискретную сову на направленный граф натянуть, чтобы её не порвало), что в итоге его выпилили из проекта. Впрочем, applications.xml остался. Удобная штука для зависимостей получилась.

Case 3

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

Была и третья категория, к тому времени наиболее развитая — форумные движки. Всякие разные ****nuke, жутко функциональные, но выглядели они мягко говоря, не очень, не говоря уж об удобстве. Помните, наверное, эти формочки с сотнями полей и тысячами рамок. 8 шрифтом, чтобы влезло в экран, и глаза закровоточили. Они до сих пор, между прочим, живы.

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

Вот же ж.

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

HTML+TIME — помните такую технологию от Майкрософта? Нет? Active Desktop? HTA? Окей, это всё такие древности. Но это сейчас разработкой полноценных приложений на HTML+JS не удивишь, а в 2002 году такими тайными знаниями никто толком не обладал, кроме особо любопытных.

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

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

Case 4

Представим себе процесс разработки, в котором активно используется feature branching. Гиперактивно используется. Штук 50 бранчей, активных одновременно, — да только в путь.

— Какая боль! — скажете вы.
— Ага, попался! Ловите QA инженера! — захохочу я.

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

И вот в один прекрасный момент один из архитектов пишет задачу в духе «if it is possible, could research for an ability to automate parallel branch deploying on a dedicated stand». Ну, может чуть, более экспрессивным английским.

Меня всегда очень забавляют подобные «if it is possible». Возможно, как я уже говорил, всё. Вопрос в том, насколько сильно у вас пригорела эта проблема, и сколько вы сможете позволить мне потратить на это времени. Я неоднократно это говорил, и конечно же, задачу назначили мне.

Окей. Всё оказалось намного проще, чем казалось. Хотя, конечно, момент озарения тоже присутствовал — мне пришло в голову подсмотреть, как IDEA деплоит сборку WAR-проекта, не складывая её к Tomcat. Ну а дальше уже дело техники: повторить вручную, а затем заскриптовать. Скрипты завести на TeamCity, и увязать билды на события коммитов в feature branches репозитория.

Ну и в качестве вишенки на торте — нафигачить вебовую консоль для управления задеплоенными инстансами бранчей (старт, стоп, посмотреть в out и т.д. А ещё мега-фича «сделать копию»). Через CGI, на bash. За один вечер. Просто потому что могу! (Потом-то переписал, но уже сильно позже. Почти год так и работало.)

Nuff said

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

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

Вот забавная получается ситуация. Душу сильнее греют решения, которые выходят в прод, но они как правило, абсолютно традиционная рутина, в которой нет места полёту программистской фантазии. Но кайфа получаешь больше от странных задач, которые требуют всяческих вывертов в параллельные предметные области (разбор semi-uniform текстов? DevOps? юзабилити? CI?) и экзотические технологии.

Хоть все они и ad hoc, одноразовые до ужаса…

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

Карта-схема ижевских трамваев. Процесс, часть III: красим макароны

Превед \o/

Пора поговорить о сути схемы. Начну с линий, и первым вопросом будет

— Почему именно макаронная схема?

Это простой вопрос. Ответ столь же прост: да потому что по трамвайным путям почти везде проходит по нескольку маршрутов.

В Ижевске только одна ветка, — на Татарбазар, — обслуживается (и почти всё время своего существования обслуживалась) единственным маршрутом, пятым (раньше шестым, но потом их объединили). А по всем остальным веткам и контурам проходит от двух до шести.

В Центре же сходится 8 маршрутов из 11. Там Т-образное примыкание, 5 идут на север, 5 на юг, и 6 на восток, причём на 90° поворачивают в обе стороны по три, и только два минуют его прямо. Официальная схема даже не пытается изобразить, какой куда следует в точке примыкания, и беспомощно помещает маршрутные знаки у конечных и вдоль трасс, примерно в середине перегонов между примыканиями:
shema

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

Ещё больше сложности добавляет тот факт, что «двойка» и «восьмёрка» имеют одинаковые конечные, и встречаются друг с другом аж дважды:

Приезжим эти маршруты ломают мозг, потому что заметить маршрутные знаки вдоль Халтурина и Авангардной удаётся далеко не сразу, а у конечных они бросаются в глаза. Возникает логичный вопрос: почему конечные одинаковые, а маршруты разные? Это они в разные стороны разные, или ещё в чём-то подвох? И только потом доходит, что в средней части №2 и №8 проходят по противоположным районам города. И если надо попасть с Промышленной на Буммаш, то лучше садиться на «восьмёрку», потому что она идёт существенно более коротким путём.

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

Но тут сразу же возникает следующий вопрос,

— Что за дикие цвета, брат?

Блин. Цвета не мои, я просто использовал официальную раскраску маршрутных знаков…

Никто раньше так не делал (на предыдущих попытках авторы схем придумывали собственные раскраски макарон), а я решил выпендриться. Зря, наверное, потому что, мягко говоря, выбор цветов получается крайне неудачный. Вот поглядите:

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

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

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

— Логика, говоришь?

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

А вот дальше начинаются, гмм, история с географией.

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

После реорганизации и объединения №№5 и 6 «десятка» (Ворошилова — Центр), и имевшая красный знак, как и «однёрка»… Мда. Красный знак она имела потому, что обслуживалась вторым депо, и цветовое кодирование маршрутов первого было ему не указ. Так вот, «десятка» была продлена в Металлург, и чтобы уменьшить путаницу с №1, её маршрутные знаки были перекрашены в белый, хотя никакого отношения к шестому она не имеет.

Маршрут №7 изначально имел двуцветный знак, составленный из половинок №№ 3 и 4, то есть, сине-жёлтый, потому что математически 7=3+4. Но впоследствии он стал тёмно-синим, впрочем, из-за того, что знак на Tatra T3 подсвечивается маломощной лампой накаливания, цветовое сочетание никуда не девалось — жёлтый, просвечивающий через синий (я имею наглость использовать это в качестве одной из пасхалок схемы). К счастью, тёмно-синий «семёрки» и насыщенный голубой «тройки» никак не конфликтуют, так как у маршрутов нет совпадающих участков.

А вот что касается восьмого и девятого маршрутов, то надо смотреть на то, как они проходят. №8 большую часть пути идёт вместе с №5, и кусок вместе с №4. Так что он получился фиолетово-жёлтым, но, видимо, из-за отсутствия нужной краски, фиолетовый в какой-то момент стал малиновым, да так и прилип. «Девятка» — аналогично, один хвост маршрута это №1, а другой №2, посередине же — оба два сразу.

Цвет одиннадцатого возник из ниоткуда совсем недавно, и сдаётся мне, что кто-то во втором депо взял первый попавшийся неиспользованный. Тоже не очень, потому что по Орджоникидзе он проходит вместе с четвёртым.

А вот цвет двенадцатого, относящегося к первому депо, составлен механически из цветов первого и второго, "12"="1"+"2". То есть, он опять красно-зелёный, или зелёно-красный, как и «девятка». Блин! Опять же, совпадает с ним на половине протяжённости… Причём, ладно бы один из них использовал цвета в определённом порядке, противоположном другому, но нет, на трамваях оба варианта встречаются без какой-либо системы, и так, и этак.

— И что делать?

Снимать штаны и бегать :(

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

Психоделика:
trams-psycho

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

Так что зря я взял официальные цвета в том виде, как они есть. Надо будет подвигать их немного по цветовому кругу, и успокоить, чтобы они перестали звенеть друг рядом с другом. Что касается пунктира — то тут придётся ещё подумать. И если №№ 9 и 12 на участке Вокзал — Центр можно объединить, сделав этакую вилку, то что сделать с №8 мне пока совсем непонятно.

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

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

Карта-схема ижевских трамваев. Процесс, часть II: подготовка инструментария и технические детали

Превед \o/

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

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

Вопрос только один — а каким инструментом отсекать лишнее, и добавлять недостающее?

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

Окей, попробуем взять более привычный, кореловский ПэйнтШоп Про. Помню я его ещё со времён, когда Корел его не купил с потрохами, и не превратил в младшего брата-дебила Дро. Когда-то программа эта была относительно базовым графическим редактором в плане растра, но зато обладала очень мощными средствами управления текстом и векторной графикой — нарисовать кривую Безье и пустить вдоль неё текст, раскрашенный весёленьким градиентом, всегда было легко, в отличие от какого-нибудь Фотошопа. И интерфейс PSP изначально близок к офисному, даже основные горячие клавиши в нём такие же, как в Ворде. Ну, 10 лет назад он такой был. Я его даже покупал для нужд ММЦ, помнится — и пользовались мы им в конторе с большим удовольствием.

Но только вот, к сожалению, старые версии под новыми виндами работать не хотят, а сколько-нибудь современные Корел перезаточил на обработку фотографий, отчего нужная мне в данный момент векторная часть оказалась заброшенной, покрылась паутиной, и обросла раздражающими глюками. В древнем PSP 7 можно было хоть тысячу объектов выделить и двигать по пол-пикселя, а относительно новый X7 на таком количестве норовит очень громко и больно упасть. Вдобавок, с поддержкой форматов даже у самого свежего ПэйнтШопа всё ОЧЕНЬ плохо: фигуры импортируются из SVG без стилей как таковых, да ещё и в один слой, и их приходится сначала проявлять из невидимости, да раскидывать ручками, чтобы хоть как-то можно было работать. А экспортировать можно и вовсе только в древние как мамонтовое говно EMF/WMF с потерей всего, что имеет ценность.

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

Остаётся не так уж много вариантов. Во-первых, Инкскейп. Тот самый, в котором нарисована исходная карта. Окей, скачиваем, устанавливаем, и… божечки, как же он тормозит! Ладно, подождать полминуты пока файл (несчастные пару десятков тысяч объектов) открывается ещё не страшно, но вот десяток-другой секунд на простую отрисовку слоя после скрытия… А-а-а-а-а! Пиздец, тормоза так тормоза, давно уже ничего подобного ни в одной программе не видел. Более того, после сдвига на пару пикселей какого-нибудь заковыристого path он точно так же тупит фиг знает сколько, пока не прочухается.

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

И вот, у меня остаётся второй и последний из альтернативных вариантов: Microsoft Visio.

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

С поддержкой SVG у Visio всё довольно неплохо тоже, особенно в сторону импорта. Не теряется ни группировка, ни стили, — потому как у самого Visio в родном формате эти фичи развиты достаточно хорошо. Единственное, что пунктиры и градиенты могут не совпасть — они должны соответствовать теме документа по умолчанию, или Visio насильно приведёт их к своим. Ну, по крайней мере, попытается. Слава богу, SVG — это XML, и косяк со stroke-dasharray можно потом поправить руками.

Что же касается экспорта, то здесь Visio удивляет в хорошем смысле. Например, в SVG нет такой штуки, как стиль текста Малые Прописные, но их можно сэмулировать через финты с текстовыми группами, что Visio с успехом и проворачивает. Инкскейп так не умеет, а я изначально хотел писать названия остановок именно так, а не иначе.

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

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

Наличие же явных master shape для первого этапа макаронной схемы здорово ускоряет процесс. Протянуть 4 идентичных шнура параллельно друг другу — легко:
trams-visio

Я просто нарезал path с трассировкой линий из исходного файла на мастеры, да и покидал их по нужным местам. Затем экспортнул обратно в SVG, и соединил куски в единые макаронины для каждого маршрута вручную, выкинув мастеры, чтобы потом было проще их форматировать по отдельности (так оказалось действительно быстрее). Каждой фигуре Visio назначает уникальное имя, и понять, что к чему в этой мешанине XML-ных тегов, — достаточно легко.

Вторым этапом я отрезал все ненужные куски подложки, выходящие за рамки схемы; почистил дорожную сеть от мелкой геометрии, которая излишне пестрит в глазах, и всё равно будет теряться; добавил подписи к паркам и промзонам… Впрочем, это мы уже забегаем в тематику следующей части, а пока что предлагаю посмотреть, как схема стала выглядеть к концу третьего дня:
trams2

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

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

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

Карта-схема ижевских трамваев. Процесс, часть I: предыстория

Превед \o/

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

Вот в автопарке когда-то были. Я помню ту старую чёрно-белую схему автобусных маршрутов, сделанную в духе геодезических кроков 40-х годов прошлого века, и она была вполне прекрасна (пока в 90-е её не заменили на тот кошмар, который развешан в салонах автобусов сейчас). А официальная трамвайно-троллейбусная всегда была вырвиглазным неудобочитаемым кошмаром.

Вот что это за жуть, скажите на милость?
shema

Минимум с середины 80-х в таком вот виде. Смотреть на неё все эти годы просто больно.

И не только потому, что цвета подобраны плохо, и плотность зашкаливает. Хотя, в том числе и поэтому. Цвета подобраны плохо, а плотность — зашкаливает. Даже если распечатать схему на А3, то пустого места на Заречной части попросту нет, отчего названия остановок пришлось лепить под углом, потому что иначе они не влазят ни фига. А по Ленина — и вовсе вертикально. Вот как это читать? Выгибая шею, и наклоняя голову? В движущемся трамвае? В вечерний час пик? Красные буквы на белом фоне? Вы издеваетесь?

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

У меня есть и более сильная претензия, которую долго и тяжело объяснять, но я попытаюсь.

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

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

Вы можете сказать, чё это я прикопался к схеме? Не карта же. Отвечу: зря, что не карта. Потому что карта в данном случае выигрышнее, чем схема.

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

В конце-то концов, сколько можно ждать? Встал и сделал сам. Можешь же, не инвалид.

А, может, и вправду смогу? Хм. Не попробовав, ведь, и не узнаешь.

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

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

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

Первым делом идём в Википедию, статью про ижевский трамвай. Ба! трассировка-то — вот она.
izhevsk_tram_system

Как удачно. Спасибо, анонимусы с OpenStreetMap и лично Никита (мир тесен) за замечательную заготовку. Практически, больше чем пол-дела в кармане: картинка в векторе, и лицензия подходящая для прямого создания производных работ.

Да, и вот ещё. Не только я один мыслю инженерными категориями, есть ещё люди со схожим пониманием. Например, такая вот карта-схема
transphoto-scheme

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

Такая вот предыстория. Продолжение расскажет о техническом подготовительном этапе.

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

Карта-схема трамвайных маршрутов Ижевска

— Тада-аммм! Сабж, версия 0.4:

Карта-схема трамвайных маршрутов Ижевска

Не буду томить, сразу дам ссылку на исходник в Visio, экспорт в SVG, и гигантскую PNG 10k пикселей шириной для печати:

Лицензия CC BY-SA 2.0, так что любителям поиграться — играйтесь на здоровье, только указывайте, у кого взяли.

Вообще, распространение всячески приветствуется. Распечатайте и повесьте на стену, а также лайк, шер, ретвит.

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

Конструктивные замечания принимаются по всем каналам. Неконструктивные идут в пизду.

Процесс:
I. Предыстория
II. Подготовительный технический этап
III. Раскрашиваем макароны

Stay tuned for updates.

Изображение | Posted on by | Метки: , , ,

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

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

Дано:
чувак работает в маленькой конторке из 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 лет.

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

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

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

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

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

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

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

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

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

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

Так, так.

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

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

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

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

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

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

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

Вашу ж мать…

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

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

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

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

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

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

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

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