Posts Tagged ‘IT’

Хороший менеджер в 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 отрасли пророки разных мастей говорят о скорой кончине аутсорсинга. Очень смешно об этом слышать, особенно на фоне быстрого роста лидеров индустрии.

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

(далее…)

Программисты и налоги

Четверг, Октябрь 28th, 2010

В связи с обсуждением нового налогового кодекса, на сайте developers.org.ua некоторые люди подняли тему о том, чтобы начать уклоняться от налогов. Суть примерно такова: программисты сегодня в большинстве своем работаю через ЧП и платят аж целых 200 гривен налогов при зарплатах от 8000 гривен (зарплата справедлива для мест повышенной концентрации программистов – Киева, Львова, Харькова, Днепропетровска).
Некоторые люди стали предлагать уклоняться от налогов, а особо упоротые стали предлагать варианты вроде:

“1. Ликвидируете СПД
2. Регистрируете офшор (650$ и поддержка 200$ в месяц) < адрес сайта>
3. Регистрируете карточку в укр. банке. Сбрасываете 3 раза в год определённую сумму (для предпринимательской нужно 4) на неё с офшорного счета как материальная помощь. Платите с этих денег 15% подоходного.
4. Регистрируете зарубежную карточку, втихую сбрасываете на неё по чуть-чуть “на пельмешки”. Нигде эту часть дохода не светите. < адрес сайта>
5. Регистрируетесь на бирже труда в качестве безработного.”

Меня сильно удивило нежелание платить целую 1000 гривен налога (пока еще в проекте! возможно будет меньше) при таких зарплатах. Основные отмазки: “при власти хунта – я им платить не буду”, “все равно все разворуют”, “мне государство ничего не дает, за что платить?” и все в таком духе.

Мне бы очень хотелось рассказать о такой интересной вещи, как “Дилемма заключенного”. Суть ее в следующем:

(далее…)

Собеседование в Microsoft [3]

Пятница, Июнь 11th, 2010

Первая часть, вторая часть

Прошел месяц после того, как я получил отказ. Я был в командировке в Швейцарии, неожиданно мне позвонила Наташа и сказала что меня ищет Megan Riley и не может до меня дозвониться по моим украинским номерам. На следующий день я увидил письмо от HR, в котором они интересовались жив-здоров ли я и спрашивали мой номер. Я написал им свой номер в Швейцарии и на следующее утро HR позвонила и сообщила, что меня взяли. Я сильно удивился, но это факт. Мне сказали, что они еще раз рассмотрели мою кандидатуру и решили сделать мне предложение.

Я уже получил офер, принял его и уже Microsoft начал заниматься рабочей визой. Надеюсь все будет впорядке с документами и через пару месяцев поедем с Наташей в Париж…

Вот так бывает!

Собеседование в Microsoft [1]

Воскресенье, Апрель 25th, 2010

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

Где-то два месяца назад, после очередных разговорах о возможном переезде забугор, плюсах и минусах этого самого переезда, я решил сделать что-нибудь. Этим «что-нибудь» стала отправка резюме на несколько открытых вакансий Майкрософта. Я зашел на сайт http://careers.microsoft.com/ и начал засылать свою резюме на штатовские/канадские вакансии более-менее подходящие по моему профилю. Никакого ответа я так и не получил… Но через пару недель в LinkedIn.com мне написал менеджер по рекрутменту, что в Париже есть вакансия SDET (Software Development Engineer in Test) на проект под названием Microsoft Zune. Я точно не знаю, связанно ли это с тем, что я отправлял резюме, либо они меня нашли через LinkedIn.com, либо меня кто-то порекомендовал.

Я ответил на предложение, меня это интересует. Мне немного рассказали о вакансии, в общем по обязанностям это что-то среднее между тестировщиком и программистом в понимании среднестатистического украинского айтишника. Потом мне предложили сделать скрининг по телефону – это такое предварительное интервью длительностью от 30 до 60 минут. Предложили дату и время – пятница вечер… не самое лучшее время для собеседования. Я постарался подготовиться к собеседованию, погуглил примерные вопросы, почитал как стоит себя вести, освежил в памяти некоторые алгоритмы и приготовил стандартные ответы на стандартные вопросы типа «Почему вы хотите работать в Майкрософт?». (далее…)

Проблемы с Wi-fi

Суббота, Февраль 20th, 2010

Пользуясь wi-fi я столкнулся с тем, что скорость иногда катастрофически падает. Если запустить пинг, то можно получить примерно следующую картину:

Ответ от 192.168.1.1: число байт=32 время=2мс TTL=64
Ответ от 192.168.1.1: число байт=32 время=12мс TTL=64
Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64
General Failure
General Failure
Ответ от 192.168.1.1: число байт=32 время=2мс TTL=64

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

Оказалось, что скорость на точке доступа может сильно падать из-за помех, а также некоторых настроек. В качестве помех, в первую очередь, выступают другие точки доступа (в момент написания мой ноутбук определяет 9 точек доступа), а также другое радиооборудование. Выяснилось, что решение моей проблемы очень простое – в настройках точки доступа можно выбрать канал (диапазон радиочастот), по которому передается сигнал, тем самым избежать помех от конкурирующих точек доступа. На моей WRT54G2 эта опция называется «Wireless Channel». Можно выбрать один из 11 каналов. По умолчанию у меня стоял канал номер 6. Я сменил на канал номер 2 – и у меня резко возросла скорость подключения, а также пропали обрывы (те самые «General Failure»). Скорость интернета выросла раз в 5 – я пару дней назад качал на суммарной скорости около 25 мегабит (провайдер – Воля), причем в час пик – вечернее время, не думал что у Воли такая неплохая скорость =).

Также на форуме было предложено изменить некоторые «продвинутые» настройки, но наибольший эффект дало изменение Wireless Channel.

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

Немного о разрыве зависимостей и 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 минут жизни. И именно поетому я решил купить хостинг и домен и сделать блог сам [точнее с помощью моей Наталки].
Мораль: делать дерьмовые интерфейсы не надо. Тем более если вы гугл. Вас будут ненавидить люди.