Предположим, у нас есть 1 нормальный программист и 1 хороший программист (в 2 раза опытнее и с зарплатой в 2 раза больше). Значит ли это, что хороший программист напишет туже самую программу в 2 раза быстрее? Или что имея бюджет в 1000 долларов, не важно какому программисту мы отдадим работу, мы получим такую же программу? А может быть, если мы наймем 2 нормальных программистов, то они будут работать так же качественно и быстро, как 1 хороший программист? Нет — к сожалению, линейная алгебра не применима к программистам. В этой статье я попытаюсь рассказать почему нельзя складывать и вычитать линейно опыт программистов.
Ведь если бы программистов можно было складывать и вычитать, как яблоки на уроках начальной математики, то все было бы слишком просто и даже неинтересно. Есть определенные факторы, которые вносят различия между яблоками из уроков математики и программистами.
Различия между хорошим и нормальным программистом
Если программист берет в 2 раза больше денег, то логично предположить, что он в 2 раза лучше. Что же на самом деле стоит за этим абстрактным «лучше», и чем отличается хороший программист от нормального?
- Хороший программист пишет код где-то с такой же скоростью, как и нормальный (мы все тыкаем пальцами по клавиатуре с похожей скоростью). Иногда даже медленнее (часто хорошему программисту скучно писать что-то тривиальное, и он легко может отвлечься на раздражители).
- Зато хороший программист имеет куда больше способностей к абстрактному проектированию. Если посадить 2 неучей доказывать теорему Пифагора, то они ее не докажут. 100 неучей и за 2 недели ее не докажут, а вот 1 образованный математик сможет ее доказать за час. Также и хороший программист сможет правильно спроектировать программу тогда, когда 2 нормальных программиста покажут худший результат (и этот результат не зависит от количества программистов, он зависит от их качества).
- Хороший программист пишет более надежные программы. Частично из-за того, что он умеет правильно их проектировать, частично из-за того, что он просто умеет писать код без ошибок (ведь он лучше, чем остальные, в конце-то концов). Очень часто этот фактор выходит на поверхность лишь несколько месяцев или лет спустя – программа оказывается запутанной и сложной в поддержке. У хорошего программиста есть куда больше шансов не допустить этой запутанности, чем у нормального программиста.
- 1 хороший программист производительнее, чем 2 нормальных программиста. Помимо вопросов проектирования и надежности программ, есть еще один фактор: межличностная коммуникация. Чем меньше людей формируют команду, тем меньше времени будет тратиться на внутреннюю коммуникацию.
- Качество программиста прямо пропорционально тому, как он умеет работать с заказчиком/проджект менеджером/любым субъектом, который стоит выше его и который сообщает ему, что нужно программировать. Мы все видели эту картинку, где проектировали детские качели на дереве, а в конце получилось что-то страшное. Хороший программист изначально закладывает необходимую гибкость в свою программу, чтобы если на полпути кто-то наверху передумает, то ему можно будет перевести программу в новое русло не потратив на это много костылей. Также хороший программист умеет устранять недопонимание. Он не пишет так, как ему или заказчику показалось, а добивается от клиента четкого представления об ожидаемом результате.
Профит из всего этого
Ну допустим, а как из всего этого можно извлечь выгоду? Я бы лично извлекал ее следующим путем:
- В команде программистов должен быть разброс в профессионализме. Для успеха предприятия нужны умные программисты и нормальные программисты. Они оба хорошие и умеют хорошо работать вместе.
- Умные программисты будут решать самые сложные задачи и брать на себя вопросы проектирования и общего виденья.
- Нормальные программисты будут выполнять более рутинные задачи, но для них это будет интересно, и они будут более продуктивны и эффективны в финансовом плане (зачем платить 1000уе хорошему программисту за решение этой задачи, если ее может решить нормальный программист за 500уе практически в теже самые сроки?)
- Как бонус, умные программисты будут развивать и подымать квалификацию нормальных программистов.
- И еще один бонус: все будут счастливы. Хорошие программисты будут довольны своей работой, т.к. им не нужно заниматься рутиной, а нормальные программисты будут довольны, т.к. у них есть возможность учиться и развиваться, смотря на своих старших братьев.
- Лучше брать качеством, чем количеством. Если мне нужно увеличить скорость разработки или еще как-то нарастить «ресурс» программистов, то я бы первым делом попытался увеличить квалификацию программистов, а не их количество. Таким образом я экономлю на расходах межличностной коммуникации.
- Возможно, этот пункт не пересекается плотно с вышесказанным, но я бы еще уделил внимание эффективности каждого из членов команды. Эффективность и профессионализм – это разные вещи. Профессионализм – это потенциал, а эффективность – это то, на сколько этот потенциал раскрывается. Эффективность зависит от разных факторов:
- Эмоциональные взаимоотношения между членами команды.
- Внешние раздражители (шум, голод, программист-сосед, который отвлекает каждые полчаса, и многое другое)
- Интерес к поставленой задаче (любой человек работает менее эффективно, если внутренне он не согласен с тем, что от него требуют)
Автор: bucefal91