среда, мая 12, 2010

Зомби-программисты

Где-то когда-то давно читал псевдо-байку, что японские программисты работают в день по 14 часов! И народ на том форуме еще удивлялся и смеялся, мол, не бывает такого, ха-ха!..

Исходя из своего личного опыта знакомства с вышеозначнным пластом населения, могу смело утверждать: бывает, и даже не такое!

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

Для обычного человека.

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

Однако, коллегам такие мои переживания, судя по всему, не известны. Прямо с началом работы все бодренько так сели, как будто и не было полутора недель отдыха, открыли свои проекты и давай шпарить код, гонять тесты или думать на собраниях. Причем - сам бы смеялся, если бы не был тому свидетелем - на полном серьезе могут работать (т.е. заниматься работой: выполнять задания, придумывать алгоритмы, составлять документацию и т.д.) по 10-12 часов в день. 14-ть часов беспрерывной работы я свидетельствовал только во времена страшных авралов на проектах; сейчас у нас полегче, но подозреваю, что в других командах есть и такие индивидумы.

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

В бытность мою с Моторолой нас научили правильному, на мой взгляд, правилу: всего должно быть в меру. Если совещание - то не дольше 2-х часов, если инспеция кода - то обязательно с подготовкой, и тоже - не дольше определенного времени. В маленькой фирмочке Гугл есть "правило 20%": каждый сотрудник может тратить 20% своего рабочего времени на свои дела. 20% - это целый рабочий день в неделю или два часа в день!

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

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

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

Потом случайно попадается этот модуль на глаза - боже ж ты мой! В коде встречаются все возможные мемы из лурка. Кто-то ругает код функции в три экрана длиной? А в 4000+ (четыре тысячи, с вагоном) строк не хотели? Архитектура? Без технических требований - ее не то что создать, ее даже осмыслить малореально. Кривое использование переменных, обращение к внешнему файлу для чтения каждой строчки, хранение тучи ненужных данных, постоянны мемори-лики и зависания приложения, нецелевое использование классов фреймворка... Все ужасы из ночных кошмаров программиста - вот они, написаны! Причем, что интересно - все это действительно работает. С ошибками, медленнее в 100-200 раз, с подвисаниями и периодическими ошибками компиляции - но работает.

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

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

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

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

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

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

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

Базинга!