Красота, которая не спасла программиста
«За что тебя приняли, за то тебя и уволят», гласит старинная мудрость. Меня позвали на этот завод для аудита учета, информационной системы, кода, процессов и т.д. Но начали с того, что у них — плохой программист. Стандартный, заводской, ужасный.
Завод создавал красивые продукты. И сам был красивый. Реально красивый — видимо, в проектировании здания участвовали те же дизайнеры, что рисуют продукцию. В цехах — тоже красота и гармония. Чистота, порядок, всё на своих местах. А главное — весь производственный процесс красиво автоматизирован.
Каждую партию продукции сопровождает маршрутный лист, в котором расписаны все необходимые технологические операции, что где брать, куда потом отправить и т.д. На бумажке — только штрихкоды, с минимумом текста.
Рабочий просто берёт партию деталей, пикает сканером — и система тут же знает, что он начал обработку. Партии небольшого размера, обрабатываются не больше одной смены, поэтому нет необходимости её дробить при отражении факта выпуска или прохождения операции. Рабочий, когда закончит обработку всей партии, просто пикает сканером, и система знает — партия готова, и может ехать к следующему человеку. О том, что детали зависли между обработками, система тоже знает — есть пик об окончании, но нет пика о начале следующей операции.
Красота и гармония. Мечта любого руководителя. Полная прозрачность — всегда известно, что, где, когда. Потому руководитель и проводит экскурсию в таком приподнятом настроении. Ему нравится, как всё устроено. Красивая автоматизация.
Мельком замечаю, что рабочие как-то подозрительно много разговаривают по телефону. Когда мы подходим к кому-нибудь, стоим и разглядываем красивый станок или проворную работу рук — человек улыбается и работает. Как только отходим — начинает кому-то названивать.
Ну, мало ли, может они тут общительные. Или корпоративная культура такая — можно трындеть хоть целый день. Мне некогда — надо разобраться, где тут скелет в шкафу. По-любому ведь бухгалтерия где-то сидит и вбивает дикое количество документов, фиксирующих выпуски, тех.операции и перемещение полуфабрикатов.
Идём в бухгалтерию — нет, там тихо. Сидят, пьют чай. На экранах компьютеров — да, конечно, информационная система –, но точно не ввод выпусков. Обычная бухгалтерская работа. Идём дальше.
Наверное, завал в планово-диспетчерском отделе (ПДО). Идём туда. Ну, не то, чтобы завал — просто работы много. Руководитель честно говорит, что узким звеном в настоящее время является печать большого количества маршрутных листов — на каждую партию и заказ. С учётом небольшого их размера, бумаги получается довольно много — по сути, на неё и уходит основное время сотрудников ПДО.
Так, а где скелет? Не может быть, чтобы всё было так хорошо. Ладно, расстаёмся с руководителем, иду поговорить с программистом. Уж он-то точно знает.
Программист сидит в тесной каморке, и разговаривает по телефону, одновременно судорожно что-то делая в системе. Жду несколько минут, пока натрындится, успеваю быстро познакомиться — и опять у программиста звонит телефон. Снова жду. В следующую паузу вставляю вопрос «Можно глянуть, как устроена ваша система?» — и опять звонок. Одновременно на компьютере программиста мелькают мессенджеры всех известных цветов — зелёный, синий, фиолетовый.
Программист, продолжая разговаривать, на соседнем компьютере открывает мне систему и исходники. Отъезжает обратно, открывает чаты, смотрит фотки, что-то быстро вбивает в систему.
От нечего делать смотрю систему. Формирую отчеты — по продажам, выпуску, себестоимости, ценообразованию и т.д. Все отчеты, как один — красивые. Минимум доступных настроек — только красивые переключатели, типа по регионам, группам продукции и т.д. Щёлкаешь и наслаждаешься красивыми видами — всё аккуратненько, вылизано, причёсано.
Обычно так не делают в корпоративных системах, для внутреннего использования. Там подход технологичный — есть некая универсальная форма, а от отчёта к отчёту меняется только запрос, добывающий данные. Дальше движок их крутит, как надо, даёт пользователю настройки — группировки, фильтры, сортировку, раскраску и т.д. Примерно как в BI-системах, только попроще, без кубов и прочей красоты. Странно, надо глянуть код.
Гляжу код — в рот мне ноги… 4–5 тыс. строк кода для формирования отчета по выпуску. Для сравнения — обычно достаточно 50–100 строк, и все они — текст запроса, остальное обеспечивается платформой. Странно, что он тут делает, в этих 4–5 тысячах строк?
Смотрю имена процедур и функций — опять дикость какая-то. Они человекочитаемые, и уже по названиям понятно — у него, блин, на каждое подразделение своя процедура. Одна выводит данные по цеху 1, вторая — по цеху 2 и т.д.
Не, ну ладно, бывает такое — декларация по прибыли пострашнее будет. Разворачиваю тексты, смотрю. Сколько видим отличий? Одно — параметр запроса меняется. Вместо цеха 1 — цех 2.
Шарю еще несколько модулей — та же фигня. Килотонны кода, которые рисуют красивые отчеты. Хотя, теперь отчеты уже не кажутся такими красивыми. Жду обеда. Обед — это святое.
Так и есть. Ровно в 12–00 программист завершает разговор, швыряет телефон под монитор, встаёт и направляется прочь из кабинета. Увязываюсь за ним. К счастью, он так зол, что готов поговорить.
Ну и оказалось. Работал себе программист на заводе, никого не трогал. Потихоньку помогал пользователям, чего-то дописывал, обслуживал систему и серверы, картриджи заправлял. Как обычно.
Но тут руководитель предприятия съездил в зарубежную командировку — посмотрел, как люди живут. А люди за рубежом живут красиво.
И привёз идею красивой автоматизации. Спросил программиста, тот ответил — чушь какая-то. Слабак. Руководитель нашёл подрядчиков, те вписались — чего не вписаться-то? Ключевые функциональные требования — чтобы в цехах все пикали сканерами, и не работали с компьютером руками, и данные о выпусках, операциях и перемещениях появлялись мгновенно, вслед за осуществлением реальных событий в жизни.
Сказано — сделано. Несколько месяцев мучений, и цеха наполнились волшебными пиками сканеров штрихкода, как заправский гипермаркет. На сдачу работ позвали руководителя, чтобы лично убедился в красоте автоматизации. Притащили большой телевизор, вывели табличку, которая отображала жизнь цеха в реальном времени.
Сдали «на ура». Рабочий пикал сканером — результат тут же отображался на телевизоре. Второй пик, третий, десятый — жизнь закипела, и в цехе, и на телевизоре. Руководитель был доволен. Акты подписал, подрядчики уехали.
А программист остался. Он пробовал сказать руководителю, что сделано было, мягко говоря, не то, что нужно. Что простая плоская таблица, в которую последовательно добавляются результаты считывания штрихкодов — это не есть отражение выпуска. Это просто лабораторная работа по подключению сканеров в режиме клавиатуры — прочитать данные, записать в таблицу, расшифровать штрихкод — он был длинный, составной, с зашитыми внутрь номерами заказа, партии, тех.операции, номенклатуры и т.д.
Но руководитель не хотел слушать эти глупости. В цехе было красиво. Мало ли, что несёт этот деревенский задрот. Остался без отката, наверное — и поделом ему.
Ну, а дальше начался ад, для программиста. Несколько суток он безвылазно работал, чтобы обеспечить хоть какое-то функционирование системы. Сами посудите: раньше, хоть и через одно место, с опозданием, но данные о выпуске поступали туда, где они нужны. Были стандартные бумажки с цифрами выпуска, которые из цеха тащили в бухгалтерию или ПДО, и эти цифры вбивались в систему, внутренний товарооборот работал, остатки были правильные, себестоимость считалась.
Сейчас осталась только плоская таблица с отсканированными и расшифрованными штрихкодами. Ну и конский механизм формирования и печати этих штрихкодов из планов производства. Данные о выпуске просто не поступали в те части системы, где были нужны — ни в управленческий, ни в бухгалтерский товарооборот. Плоская таблица стояла рядом и просто накапливала данные сканирования штрихкодов.
Сначала программист, под давлением бухгалтерии, на коленке сваял печать этой самой плоской таблицы — примерно в том виде, как раньше выглядели рукописные бумажки из цеха. Печатал им раз в день эту таблицу, бухи вбивали в систему.
Потом, с горем пополам, написал код, который переносил данные из плоской таблицы в нормальные учетные данные системы. И вроде можно было успокоиться, но не тут-то было. Руководитель опять съездил на какое-то предприятие и узнал, что из системы можно получать красивые отчеты.
Раньше, как и на большинстве заводов, отчеты для руководителя готовили специальные люди — бухгалтера, экономисты, финансисты и т.д. Брали данные из системы и приводили в краткую, понятную, красивую форму. Теперь руководитель хотел получать отчеты напрямую из системы.
Начался второй круг ада. Сроки, естественно, были предельно сжатыми — программист уже считался утырком, саботирующим прогресс, и расслабляться ему никто не дал бы. Так появились килотонны копипастного кода, написанного в спешке и на коленке. И десятки красивых отчётов.
Третий круг ада пришёл, откуда не ждали — из плоской таблицы со штрихкодами. В качестве демонстрационного стенда она смотрелась неплохо, но в реальной работе очень быстро вылезли все ошибки проектирования, и в плане техники, и в процессе использования.
Для начала жутко снизилась производительность записи в таблицу. Затем упала скорость чтения. Начались блокировки. Обнаружились запросы, написанные подрядчиком, которые выполнялись при каждом пике сканера 1.5 тысячи (!) раз. Нашлись места с бесконечной рекурсией, которая прерывалась на десятитисячном шаге усилием воли, выраженным комментарием »//ограничим для демонстрации». Каким-то образом у многих пользователей вдруг обнаружились права на ручное редактирование данных, чем некоторые не преминули воспользоваться. Контроль последовательности выполнения операций работал по номеру строки в тех.карте, а не по номеру тех.операции (это тупо разные колонки таблицы, и они не обязаны совпадать), в результате чего люди получали информативное сообщение «Нарушена последовательность выполнения операций». Использование бумажных маршрутных листов, без фиксации факта выдачи в цех и контроля изменений, приводило к постоянным сбоям сканирования — изменение данных в системе тупо меняло состав штрихкода, и распечатанный ранее уже не распознавался. И т.д.
Естественно, программист ходил с этой информацией к руководителю, и не раз. Естественно, слушать его никто не стал. Поэтому программист вошёл в жесточайший цейтнот.
С одной стороны, необходимо было обеспечить текущую работу системы. Это выражалось в постоянном сидении на телефоне и ручном редактировании данных в плоской таблице — банально, чтобы цех не встал колом. С другой стороны, потихоньку, насколько хватало времени, пытался всё это починить. Завод работал круглосуточно, но вечером и ночью как-то меньше звонили, поэтому программист использовал это время для ремонта красивой автоматизации.
Однако, накопленный у руководителя негатив уже ничем нельзя было сдержать. Программиста хотели уволить. Собственно, это была одно из причин аудита, на который я припёрся.
Через пару дней, когда отчёт был готов, я часа два убеждал их не увольнять программиста. Рекомендовал повысить его в должности и начать, наконец, слушать, что он говорит. Дать время на рефакторинг и наведение порядка. Удалось убедить их в том, что не надо программиста выгонять хотя бы сегодня. Договорились провести еще несколько встреч, в т.ч. — с программистом. И это была моя ошибка.
На следующий день собрались все вместе. Руководители всех мастей начали перечислять проблемы, которые программист не может решить. Тот уверенно отвечал на все вопросы. Как правило, одной и той же фразой — «я это уже сделал, показывал вам», на что вопрошающий умолкал. Я, в большинстве случаев, подтверждал, что программист говорит правду.
Для более эффектной аргументации достали компьютер и стали на ходу показывать то, чего «программист никак сделать не может». Нашлось практически всё, «чего нам так не хватало для нормальной работы». И всё — достаточно красиво. Как минимум — работает.
Под конец встречи уже никто не понимал, в чем её цель. Программист, с надеждой в глазах, ушёл на свое рабочее место. Руководители тоже разошлись, остались пара главных. Я сидел и ждал вердикта — надеясь, разумеется, на второй шанс для программиста и следование моим рекомендациям («у вас есть всё, что нужно, просто пользоваться не умеете»).
Но вердикт вышел другой — «вот видите, его надо уволить». За что?! Разумеется, за то, что система красивая. Но не работает. И виноват в этом программист.
P.S. Программист был рад, что его уволили. Сам не уходил, потому что чувствовал ответственность, или даже гиперответственность за происходящее на заводе. Через неделю работал на новом месте, с большей зарплатой.