Posts Tagged ‘разработка ПО’

Хороший менеджер в IT

Среда, Июнь 15th, 2011

Я попробовал поискать в гугле определение «Хороший менеджер» – но наткнулся на кучу ссылок о менеджерах по продажам («продавец» в народе). Я попробовал изменить запрос на: «Хороший менеджер в IT» – но снова не получил толковых ссылок на первой странице.

Я решил изложить свое видение, что такое хороший менеджер в IT. Я собираюсь поговорить о менеджерах низкого/среднего уровней – это тим-лиды, так называемые project-менеджеры, менеджеры по разработке, менеджеры по тестированию, etc. На самом деле все нижесказанное относится в равной мере и к другим (более высокого уровня) менеджерам в IT. Я основываюсь на своем (не очень большом) опыте работы, на опыте других людей и на классических книгах.

Итак, хороший менеджер должен:
1) Защищать свою команду от давления сверху. Менеджер должен помнить, что если что-то идет не так – это в первую очередь его вина. Если на команду давят, то он должен защищать команду, отстаивая ее точку зрения. Если требуется сократить срок сдачи проект под давлением сверху – он должен сделать все, чтобы не допустить этого. Если проект не сдан в срок и команду напрягают сверху – это проблема менеджера. Здесь несколько вариантов: неправильная оценка объема работы, неправильный просчет рисков, плохая команда, плохие процессы, etc.
a. Неправильная оценка объема работы – менеджер часто делает оценку самостоятельно. Здесь все очевидно: ошибся с оценкой – сам виноват. Если оценку делает команда, используя Scrum или другой подход, то см. пункт «с»
b. Менеджер неправильно просчитал риски – очевидно, что если менеджер согласился использовать необкатанную технологию, либо согласился использовать third-party компоненты, которые в итоге не подошли и неправильно оценил риски – это его личный просчет, а не команды.
c. Плохая команда – менеджер всегда принимает финальное решение – брать человека в команду или нет. Если менеджер набрал себе некомпетентных людей или просто идиотов – это его проблема, а не команды. Если менеджер пришел в существующую команду – он видел куда шел, по крайней мере, у него был выбор не соглашаться на эту работу. Если менеджера повысили из обычного работника – у него был выбор не становиться менеджером среди некомпетентных людей.
d. Плохие процессы – если в команде очень умные люди, но нет нормальных процессов разработки, то проект будет преподносить сюрпризы. Он может быть непредсказуемым. Одна из целей хорошего менеджера – настроить процессы в своей команде. Если он этого не сделал – это его вина, а не команды. Пример процесса – использование баг-трекинг системы. Если команда не использует (или неадекватно использует) баг-трекинг систему, то это означает некомпетентность менеджера, а не команды.
e. Etc. – любая причина по которой проект провалился (не был выпущен в срок) прямо либо косвенно связанна с менеджером. Если менеджер не владеет таким инструментом как risk-management – то я в очередной раз повторяю, что это его вина, а не вина команды.

2) Менеджер должен всеми силами расчищать путь команде. Он должен устранять все препятствия для того чтобы команда могла работать на полном ходу. Не хватает оперативной памяти в компьютерах разработчиков – менеджер должен найти деньги на память (выпросить у начальства сверху), а не оправдание почему это нельзя купить. У человека не загружается компьютер – менеджер должен найти того, кто разберется с проблемой – будь то человек из соседнего отдела или черт с Марса, вместо того чтобы как часто бывает сказать: «Попробуй перезагрузи, а если не получится иди найди какого-то Васю с 4-го этажа, пусть он посмотрит». Используется устаревший софт – менеджер должен доказать начальству необходимость в покупке и добиться того, что нужно команде. Команда говорит что этот релиз нельзя сдать в срок и нужно отложить его на 2 недели – менеджер должен использовать все свои коммуникативные навыки и доказать это своему боссу, вместо того чтобы доказывать команде что нужно работать по 12 часов в сутки без выходных.

3) Помнить что любой успех – это успех команды, а любой провал – это недоработка менеджера. Менеджер обязан помнить, что его основная цель это указание направления команде и помощь в решении проблем. Команда делает работу, а менеджер помогает. А не наоборот, как считается при раздаче бонусов. Про провал (несданный в срок проект, etc.) см. 1)

4) Менеджер должен публично хвалить людей из своей команды. Если ругать, то только 1 на 1. А не наоборот, как это часто бывает. Ничто так не мотивирует как хорошие слова за выполненную работу. Ничто так не демотивирует как публичное порицание (особенно если человек искренне старался сделать хорошо, а случайно сделал плохо). Лучше незаслуженно похвалить, чем незаслуженно поругать (тем более публично).

5) Хороший менеджер должен иметь уважение. Впрочем, этот пункт для меня следствие первых 4-х. Если команда получает от менеджера помощь, если она чувствует его щитом от менеджмента сверху, если она получает похвалу, если любой успех считается успехом общим, а любой провал принимается менеджером как личный – такой менеджер будет уважаем и далеко пойдет в своей карьере.

Если же менеджер является прокси между Jira/TFS/Whatever и командой, если он является усилителем давления сверху, если он во всех бедах ищет виноватых в команде, а все заслуги приписывает себе; если он вместо помощи мешает работать идиотскими отчетами и если от него кроме заданий и ругани ничего не слышно – мудак он, а не менеджер…

Об аутсорсинге

Вторник, Ноябрь 23rd, 2010

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

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

(далее…)

Точка восстановления для сайта

Суббота, Ноябрь 6th, 2010

Я пользуюсь WordPress. В целом мне этот движок нравится, но у меня есть существенно замечание к нему. Мне уже последних пару месяцев мозолит глаза кнопка “Обновить до версии 3.0.х”. Я бы с радостью обновился, если бы знал что обновление пройдет успешно. Я знаю что у меня установлено некоторое количество плагинов, а также есть изменения в коде некоторых страниц, которые делала Наташа. К сожалению, я не веб программист и в случае поломки я не смогу настроить WordPress самостоятельно за быстрое время.

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

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

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

Профессиональный дизайн UI в WinForms и для ОС Windows в общем

Воскресенье, Сентябрь 12th, 2010

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

Я начну описывать распространенные ошибки, которые делают приложение уродливым и делать свои рекомендации/комментарии.

(далее…)

Немного о разрыве зависимостей и TDD

Понедельник, Январь 25th, 2010

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

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

Michael Feathers в его книге Working Effectively with Legacy Code вводит понятие «Унаследованный код» (Legacy code). Унаследованный код – это код без тестов, изменение которого может быть сложным из-за отсутствия автоматических регрессионных тестов. Объективно, это существенная часть кода в тех компаниях, где мы работаем (см. опрос – более 70% имеет ограниченное покрытие тестами, либо не пишут тесты совсем). Не секрет, что многие проекты в начале представляют собой простые и понятные системы, над которыми работают 1-2 программиста. В таких проектах написание тестов часто считается тратой времени. Но по мере роста проекта и возрастания сложности все более ощущается отсутствие автоматического регрессионного тестирования. Дизайн все более усложняется, и становится все труднее поддерживать и развивать проект. Так появляется унаследованный код… (далее…)

Если в вашем проекте все плохо… [1]

Суббота, Апрель 25th, 2009

То я бы посоветовал:

1. Ввести стандарты/соглашения именования, форматирования и прочих. Когда все в команде пишут единообразный говнокод – его проще читать и понимать, а соответственно поддерживать. Стандарты должны быть сформированы командой и утверждены совместно, а не взяты с потолка. Старайтесь не иметь пунктов в стандартах/соглашениях, которые категорически кого-то не устраивают. Старайтесь найти компромис, если убедить оппонента невозможно, пожертвуйте своим мнением во благо конечного результата. Как правило, люди быстро забывают про соглашения и идут на поводу своих привычек, поэтому очень желательно иметь утилиту, которая бы отмечала отклонения от стандартов (к примеру, в .NET есть Агент Смит) и напоминала о необходимости следовать им =)

2. Внедрить обзор кода (code-review). Эфективность обзоров кода в отдельных случаях очень высока (особенно когда речь идет о джуниорах/новых людях в проекте). Обзоры кода позволяют сократить количество дефектов в приложении а также повысить качество кода (и как следствие поддерживаемость). Если вдруг, в вашей команде не получается ввести обзор кода, как минимум делайте его сами себе. Проверяйте все свои изменения перед коммитом. Конечно, это не настолько эффективно как ревью другого человека, но это также позволит отловить некоторые дефекты/забытые участки.

3. Используйте парное программирование. Конечно, чаще всего оно не требуется на 100% времени, потому как вбивать код способен и один программист =). Классическое парное программирования в большинстве мелких и средних проектов обходится слишком дорого. Я бы посоветовал использовать парное программирование только в критических участках: при проектировании классов/модулей/таблиц базы данных/etc, при обнаружении очень сложного дефекта(то есть дефекта, полное устранение которого потребует значительных изменений/рефакторинга), при реализации критических частей кода (например логика кеширования в 3-tier приложении). Иными словами, одна голова хорошо, а две лучше. При проектировании взгяд со стороны позволит избежать серьезных ошибок и просчетов. Необходимо помнить, что ошибки в проектировании обходятся значительно дороже, чем ошибки реализации. Сложные дефекты, требующий значительных изменений (либо изменений в архитектуре приложения) лучше всего исправлять вдвоем, т.к. существует большая вероятность исправить один дефект, а внести 5 =).

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

5. Помните, что ваш проект зависит от вас, если вы будете прикладывать усилия к тому, чтобы сделать из дерьма конфетку, то это даст свои плоды. Если вы не менеджер, то донесите эти советы (а также многие другие по улучшению проекта) до менеджмента. Если ваш менеджер ничего не хочет менять без корректного объяснения причины – смело увольняйтесь. Не стоит тратить свое время и нервы. И помните главное, кроме вас изменить проект/говнокод к лучшему некому…

ЗЫ. В будущем буду стараться фиксировать другие свои мысли/наблюдения/советы по улучшению говнокода

Почему я ненавижу гугл.

Вторник, Апрель 14th, 2009

Однажды я решил завести себе блог. Такой самый, на котором разные дяди и тети пишут умные (иногда не очень) вещи. Глянул я – есть лайвжорнал. Пошел я на лайвжорнал и попробовал зарегистрироваться. Ввел свое имя фамилию через точку – anton.martynenko… и ушел с этого сайта. Я никогда в жизни не зарегистрирую и никому не посоветую этот говносайт по одной причине – я не смог там зарегистрироваться. Во-первых: на жж логин должен состоять максимум из 15 символов, во-вторых: в логине могут быть только цифры, знак подчеркивания и буквы.
Ну черт с ним, с этим жж (жидовое жлобство), пошел я на гугл. У гугла есть отличный сервис [как мне казалось на тот момент, потому что гугл это априори клевый сервис], я на нем зарегистрировался, сделал какую-то предварительную настройку и начал создавать свой первый пост. Конечно, я писал от души, разливаясь мыслью по древу, писал много… В общем потратил 45 минут жизни и решил опубликовать свое творение. Как это бывает, нажал не ту кнопку [предположим вместо “save” нажал “submit”, я уже точно не помню]. Ну и естесственно мой пост ушел в никуда, то есть пропал. Причем пропал совсем. Я, конечно, сразу нажал в браузере «назад», но это не помогло. Я ненавижу гугл. Он у меня отобрал 45 минут жизни. И именно поетому я решил купить хостинг и домен и сделать блог сам [точнее с помощью моей Наталки].
Мораль: делать дерьмовые интерфейсы не надо. Тем более если вы гугл. Вас будут ненавидить люди.