Archive for the ‘Персонал’ Category

О тупых программистах.

Пятница, Январь 30th, 2009

Осторожно, очень много букв 🙂

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

Кстати,  именно он подкинул мне идею (был ее автором) самой моей любимой серии статей про программистский синхрофазатрон.

И вот, собственно, смирившись с невозможность победить в online споре, я решил перейти в offline режим, где смогу детализировано рассмотреть проблему.

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

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

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

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

Итак начнемс…

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

С точки зрения хорошего программиста Пети. Работа выглядит так
— Васе дали задачу, которую Петя мог сделать за 5 часа
— Вася поморочил Пети голову 2.5 часа, чтобы понять как ее сделать
— Вася проработал над задачей 20 часов пока не сделал
— Пете еще 2.5 потом пытается привести в порядок, то что натворил Вася

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

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

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

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

Менеджер мыслит примерно так (естественно не с такими детальными выкладками)

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

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

Кстати, входные деньги — это не только деньги на зарплату программисту, но и на например покупку книг, или оплату другому программисту время консультаций и т.п.

Как результат, если мы возьмем очень эффективного программиста и начнем относительно него измерять других программистов, мы обнаружим, что другие программисты могут быть скажем от 2 до 50 раз менее эффективны.

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

Ну и просто, для того, чтобы показать, что значит в 50 раз менее эффективны. Это значит, что хороший программист задачу сделает за 1 неделю, плохой программист за 1 год.

Небольшое замечание по измерению оценки. Программист оценивает других программистах в терминах «на» — Вася сделает туже задачу _на_ X долларов дороже чем я, поэтому Вася не нужен. Менеджер измеряет в терминах «в». Вася сделает туже задачу _в_ Y раза дороже.

Теперь следующий шаг в оценках менеджера. Пусть мы знаем, что задача которая подается программистам на вход должна принести скажем $10k. Самый эффективный программист на ее решение тратит $1k. Из этого следует, что все кто эффективны менее чем в 10 раз, будут тратить больше $10k и значит, что они приносят фирме уже только убыль. И чем больше они работают, тем большую убыль приносят. Так, что их таки можно увольнять.

Возвращаясь к Васе. Пусть Вася по этой формуле оказался в 4 раза менее эффективным. Тем не менее, с решенной задачи мы все еще имеем $10k — $4k = $6k прибыли.
Хотя безусловно, если Васю уволить, то получится $9k прибыли.

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

То есть, если у него эффективность жуткая (в 7 раз хуже, чем у Пети), но работает он автономно и Петю не трогает вообще, то тогда, получается, что они вдвоем могут приносить $10k-$1k (Петя) + $10k-$7k (Вася) = $12k. А если Васю уволить, то прибыль падает до $9k.

Ну и теперь с точки зрения предпринимателя.

Базируем ее на точки зрения точке зрения менеджера. Только введем некоторые дополнительные параметры.

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

Итого, когда у нас диапазон качества, в абсолютно условных цифрах от 3 до 5. То вполне возможно, Вася сделал бы задачу с качеством 3 с той же эффективность, которое Петя делает задачу с качеством 8 (с одной стороны такое качество просто и не нужно, с другой стороны Петю ругать за дополнительное качество тоже было бы странно, да и плюс именно из-за Пети в целом программа не выпадает из диапазона).

Заметьте, как мыслит программист

а) Берется факт о случившейся ситуации где эффективность другого программиста была низкая

б) Из факта делается индукция, что у программиста всегда эффективность низкая (индукция тут не совсем правильна, но в целом, конечно вывод получается правильный, что у программиста низкая эффективность)

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

На самом же деле расход и доход динамичен. Он происходит в разные моменты времени.

Вернемся к примеру, который привел программист. Если плохой программист тратит в одной точки времени 5 часов хорошего, 20 часов своих и после этого в какой-то момент получается прибыль $10k, то действительно второй программист паразитирует в прямом смысле слова.

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

Для того, чтобы все стало на свои места, возьмем фирму из 30 плохих и 3 хороших программистов. Если мы слушаем 3 хороших, то мы увольняем всех плохих и ждем пока хорошие сделают всю работу которые делали бы плохие. Проблема заключается в том, что плохие хоть и были менее эффективны, но делали ее параллельно. Хорошие более эффективны, но делают ее последовательно. Итого, вместо выпуска через месяц и получения дохода, выпуск происходит через два месяца.

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

Естественно, наиболее хороший и логичный ответ, что в фирму из 3 хороших программистов нужно нанять еще 3 и они по быстродействию (даже последовательному)  станут быстрее, чем 30 плохих программистов.

Тут кроется одна проблема, это хорошо масштабируется от 1 до 5 хороших программистов, плохо от 5 до 50 и не масштабируется фактически вообще от 50 до 500 программистов. Поэтому для увеличения прибыли и сокращения сроков, компании проще нанимать 50 хороших программистов и 500 плохих, чем 100 хороших.

И последняя особенность.  В формуле прибыль = доход — расход, и доход и расход на самом деле являются не константами, а функциями.

Во первых, если фирма имеет большие продажи, то тогда доход от одной и той же функциональности может быть разный. И вот возникает интересный эффект. Если доход $10k, при расходах $1k и $7k — то отличие хороших и плохих программистов очень чувствительно (так как это изменяет прибыли от 90% дохода до 30% дохода). А вот если доход составит $100k, то разница между хороших и плохим программистов фактически не чувствуется (99% или 93%).

Важное замечание, которые мне написали: Это естественно более актуально для продуктов, где прибыль зависит от объема продаж. Для попроектной работы, прибыль заранее фиксирован. Более того, чаще всего они сильно прижат конкуренцией за исполнение проекта.

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

Фух… Подводя к итогам всю эту фигню, которую я написал.

а) Идеальная ситуация — много хороших программистов, нету плохих. Ситуация идеальная, но недостижима из-за плохого масштабирования найма хороших программистов.

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

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

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

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

Категоризация программистов.

Среда, Сентябрь 17th, 2008

Не программист — тот кто вообще не может решить проблему (написанием кода).

Плохой программист — тот, кто может ее решить. Но решает так, что пользоваться этим не возможно, и проблем от его решения становится только больше.

Средний программист — это тот, кто уже может решить проблему. Но, со временем, его решение обрастает соплями и ведет к большей проблеме (но уже на длительном промежутке времени).

Хороший программист — тот кто решает проблему и заодно предвидит/предотвращает будущие возможные проблемы.

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

Ракета с помощью молотка и зубила.

Воскресенье, Август 24th, 2008

Что вы скажете человеку, который сам будет строить космическую ракету только с помощью молотка и зубила?

Что вы скажете человеку, который будет хранить 10 гигабайт текстовой информации (по которой надо постоянно искать) в текстовом файле без индексации?

Что вы скажете человеку, который будет вскапывать огород размером в 500 гектар с помощью лопаты?

Давайте угадаю с трех раз… Вы скажете, что это…м…. не лучшая идея.

И что нужно:

а) Добавить новые и более мощные инструменты

б) Добавить новые и более мощные знания как управляться с инструментами

в) Добавить людей на тех задачах с которыми тяжко справиться самому

Итак, теперь возвращаемся к IT. Я начинал эту тему уже в статье Менеджер с линейкой в голове и она снова всплыла в прошлой статье в комментариях.

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

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

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

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

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

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

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

P.S. Кстати, небольшая рекламная пауза, про которую я забыл. Эти два сайта публикуют мои статьи, за что им большое человеческое спасибо.

Загляните на сайт KakRabota.com.ua. Он посвящен в первую очередь отзывам сотрудников и соискателей о различных компаниях Украины и России, сбору статистики зарплат в разрезе отделов. В разделе форума есть опубликованные вакансии и резюме с возможностью комментировать их или задавать вопросы а так же просто обсудить темы связанные с работой. А также на сайте есть блог разработчиков, на котором вы можете регулярно читать интересные статьи опять же на околорабочую тематику.

А второй сайт — это, сайт www.webdiktor.ru. Это забавный бесплатный сервис по озвучиванию статей. Они меня тоже посчитали и озвучили уже несколько статей вот тут. Так, что если есть люди, которые любят слушать статьи в стиле podcast’ов — заглядывайте туда почаще. Хотя, стиль начитывания статей слегка своеобразен. 😉

Мифология (Наемный рабочий vs Консультант).

Вторник, Август 19th, 2008

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

Итак, капнемся откуда растут ноги (как будто у них есть шанс расти из другого места).

Миф N1: «Наемный рабочий лояльнее».

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

Как по мне, второй тип ухода более лоялен, чем первый. А в остальном, лояльность — это просто  броское слово.

Миф N2: «Наемный рабочий дешевле чем консультант».

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

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

Миф N3: Консультант украдет все ваши знания и продаст их конкурентом.

Кхм… Если вы в правовом государстве — вы за это можете отсудить у него все (включая его жопу). Если вы не в правовом государстве — то можно сделать тоже самое, только без суда.

А если смотреть на это чуть с другой стороны. Что мешает сделать это же наемного рабочему? У него что чип в мозг встроен, который запрещает работать с вашими конкурентами?

Миф N4: Консультант всегда ищет дополнительные заказы и работает еще с кем-то.

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

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

Миф N5: Консультанта нужно постоянно тщательно менеджирить, чтобы он делал, то что надо.

Опять же — это не миф. А вот, то что наемного сотрудника можно  оставлять на самотек — это миф. Управлять надо и теме и другими. Если ими не управлять, то вероятнее всего результат будет совсем не то, что ожидался.

Миф N6:  Консультант никогда ни будет что-то улучшать просто так.

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

Хе-хе… Мощно вышло. Чувствую, завтра все кто на найме, придут меня бить 😉

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

Ну, и если говорить честно, то 90% всей описанной фигни зависит не от типа сотрудничества, а от личных качеств работника/консультанта. И тех и других можно найти как потрясающих, так и абсолютно дерьмовых.

С удовольствием приму (и допишу) предложенные вами Мифы на эту тему.

P.S. Ссылочка на блог Константина Галайко. Блоггер, программист, да еще и ронин (не смог я обойти последний пункт, не дав ссылку 🙂

P.P.S Миф N7 от Артура Ракицкого. Консультанты не фига не хотят делиться знаниями, в то время как наемный рабочие с удовольствием делятся информацией.

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

Проблема тут не в деньгах, а в головах. Если человеку хочется кого-то обучать, то он это будет делать, если не хочется — не будет.

Да, консультанты, вероятнее всего не станут делать это в свое время (как впрочем и наемные работники). Все что вам нужно, сказать консультанту — разрешаю тратить до 5% времени на обучение кого-то. Если консультант будет хотеть учить — то он это будет делать, если нет — то отличия нет от наемной работы.

Миф N8 (от technoman): Консультант это бизнесмен и человек который хочет заниматься бизнесом. поэтому он редко рассматривает возможность долгосрочной работы на одном месте

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

То есть получается, что для наемных работников мы говорим: «да мы им можем даже на головы нагадить, а они останутся», а для консультанта почему-то так делать боимся.

Как я писал уже в мифе N4. И те и другие ищут. Одни просто ищут более активно. Ну блин, так на то работодатель должен быть с головой, чтобы расчитывать, что средняя длина сотрудничества с наемным — 2-3 года, с консультантом 1-1.5 года.

Миф N9 (от Анонима 🙂 Наёмный работник более лоялен к смене проекта, в котором учавствует. Например, если работодатель считает что один проект у него важнее остальных, то начинается перемещение людей. И аргумент, что КПД упадёт в разы его (работодателя) не вдохновляет :(((.

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