В своей статье 18 ошибок, которые убивают стартапы, Пол Грэм пишет:
"… плохое программирование убило большинство стартапов в электронной коммерции в 1990х годах. Большинство из этих компаний были созданы бизнесменами, которые считали, что если у них есть хорошая идея, то достаточно нанять программистов, чтобы они ее воплотили и получить успешный стартап. На самом деле все гораздо сложнее, даже почти невозможно потому, что бизнесмены не могут определить какие программисты являются хорошими. Они даже редко встречают таких, хорошие программисты редко хотят работать, воплощая в жизнь идеи бизнесменов.
Как правило, бизнесмен нанимает человека, которого считает хорошим программистом (у него же написано в резюме, что он Сертифицированный Разработчик Микрософт), а на деле он оказывается плохим. В результате стартап оказывается в ситуации бомбардировщика времен второй мировой войны, в то время как остальные стартапы проносятся мимо, как современные истребители. Такие стартапы становятся похожими на большие компании, но без их преимуществ.
Так как же найти хорошего программиста, если вы не являетесь программистом? Я сомневаюсь, что на этот вопрос существует ответ. Сначала я хотел написать, что для того, чтобы нанимать работников, вам нужно найти программиста, но как сделать хотя бы это?”
Я не согласен с Грэмом в этом вопросе. Думаю, что существуют признаки, по которым можно определить хорошего программиста (и, соотвественно, не очень хорошего), такие, которыми может воспользоваться даже бизнесмен.
1. Страсть.
За время работы в больших компаниях я столкнулся с новым типом IT-специалиста, с которым раньше никогда не встречался: программист-карьерист. Такие люди работают в IT потому, что считают, что это хорошая карьера. Они не занимаются программированием в свободное время. Они удивляются, когда узнают, что у меня дома сетка из трех компьютеров. Они программируют только на работе. Они не изучают ничего нового, если только их не отправляют на дополнительное обучение (или не мотивируют новой работой, для которой нужно изучить новую технологию). Они нечасто разговаривают о компьютерах вне работы. А когда делают это, то не испытывают энтузиазма. Говоря кратко, они не одержимы компьютерами.
2. Самообучение и любовь к учебе.
Программирование — это постоянно развивающаяся область. Ни одного года не проходит без того, чтобы какая-нибудь новая технология не сменила старую, установив новые стандарты и изменив половину IT-индустрии. Не нужно говорить, что хорошие программисты стараются принять эти изменения и держаться на гребне волны. Однако существуют такие программисты, которые ни за что не будут изучать новые технологии, если только их не заставят, потому что они не любят изучать новое. Такие программисты вероятно изучали программирование в университете, и теперь думают, что им хватит того, чему они там научились и может быть того, чему они научатся на курсах, на которые их отправит их компания.
Если человек, которого вы хотите нанять, хоть раз произнесет что-нибудь вроде: "Я смогу с этим работать, только отправьте меня на курсы на неделю и я буду готов”, не нанимайте этого человека. Хорошему программисту не нужны курсы, чтобы изучить новую технологию. На самом деле, хороший программист прожужжит вам все уши, рассказывая о новой технологии, о которой вы никогда не слышали, объясняя вам почему нужно использовать именно ее, несмотря на то, что другие сотрудники не знают как ее использовать.
3. Интеллект.
Некоторые деловые люди считают, что отсутствие такта и отсутствие интеллекта это одно и то же. На самом деле, у интеллекта есть несколько признаков, и эмоциональность/социальность только один из них. Хорошие программисты не бывают тупыми. Никогда. В действительности, хорошие программисты являются одними из самых умных людей, которых вы знаете. Многие из них обладают также и социальными качествами. То, что программисты часто не могут нормально поддерживать разговор — это всего лишь заблуждение. Я был на нескольких собраниях London Ruby User Group и могу сказать, что за небольшим исключением, все они являются умными, общительными, интересными людьми.
Это, конечно, не значит, что они свободно чувствуют себя в любом обществе. Но это значит, что если общество достаточно комфортно, то вы сможете так же нормально общаться с ними, как вы бы общались и с другими "общительными” людьми.
Никогда не нанимайте глупых людей, которые считают себя хорошими разработчиками. Потому что они таковыми не являются. Если человек не может нормально общаться в расслабленной обстановке, скорее всего он не является хорошим программистом. С другой стороны, у умного человека высокий шанс оказаться хорошим программистом.
4. Скрытый опыт.
Я уже говорил об этом в разделе "Страсть”, но это такой важный признак, что я хочу поговорить о нем отдельно.
Я начал программировать когда мне было около 9 лет, на Commodore 64. Потом я перешел на PC и немного программировал на Паскале. Когда мне было 14, я написал свой raycasting движок и провел кучу времени развлекаясь с различными графическими эффектами, которые можно было выжать из видеокарты, обращаясь к ней напрямую. Я называю этот период стадией "куколки”. Когда я начинал входить в эту стадию, я был посредственным программистом, и у меня не хватало уверенности для того, чтобы заниматься действительно сложными вещами. Когда я закончил эту стадию, такая уверенность появилась. Я знал, что в принципе, я могу написать все что угодно, если действительно захочу.
Упоминал ли я когда-нибудь об этом в своем резюме? Нет.
Я уверен, что у большинства хороших программистов целая куча подобного опыта и они не пишут о нем в своем резюме. Часто они думают, что такой опыт не относится напрямую к предстоящей работе, и не является "подходящим опытом”, но на самом деле, это потрясающие достижения. Хорошим вопросом на интервью мог бы быть: "Есть ли у вас какой-нибудь собственный проект, необязательно относящийся к вашей будущей работе, которым вы занимались в свободное время, но не упомянули о нем в резюме?”. Если у вашего кандидата нет таких проектов (конечно, если их резюме не занимает 20 страниц), то вполне вероятно, что он не является хорошим программистом. Даже у программиста с огромным резюме есть проекты о которых он не упомянул.
5. Множество технологий.
Ну, это довольно просто. Если человек любит учиться и ему нравится возиться с новыми технологиями, что является признаками хорошего программиста, то он неизбежно (если ему больше 22 лет) будет разбираться в дюжине различных технологий. Изучение новых технологий это одно из самых любимых занятий, которым может заниматься человек, одержимый программированием. Таким образом его портфолио будет набито различными технологиями, с которыми он "немного возился”. Он необязательно будет экспертом во всех них, но если он приличный программист, то он будет разбираться в целой куче технологий, которые не относятся напрямую к его работе.
Эти "неотносящиеся напрямую к работе” технологии иногда сложно распознать, особенно непрораммисту. Любой Java-программист может написать целый список различных технологий, с которыми он работал: Java, J2EE, Ant, XML, SQL, Hibernate, Spring, Struts, EJB, Shell Scripting, и так далее. Но это все части одной и той же технологии, и все тесно связанны друг с другом. Сильная специализация в одной линейке технологий часто является признаком не очень хорошего программиста.
И наконец, если некоторые из этих технологий являются совсем новыми, это тоже признак хорошего программиста.
6. Формальные сертификаты.
Это скорее не анти-признак, а не-признак. Главное, что стоит здесь отметить, это то, что формальные сертификаты ничего не значат при поиске хорошего программиста. Многие хорошие программисты заканчивали какой-нибудь институт по компьютерной специальности. Многие нет. Сертификаты вроде MCSE или SCJP тоже ничего не значат. Они разработаны таким образом, чтобы быть доступными для всех. Единственное, что они показывают, это то, что их владелец обладает некоторыми знаниями в определенной технологии. Они являются дополнительными подтверждениями знаний, позволяющими людям в больших корпорациях до собеседования узнать, что "этот человек знает Java и у него есть сертификат, подтверждающий это”. Если вы нанимаете людей для маленького бизнеса, или вам нужны очень умные программисты, для команды хакеров, которой нужно быстро что-то написать, вам нужно игнорировать большинство из этих сертификатов. Они действительно не очень много говорят о качестве программиста. То же самое относится к возрасту. Есть отличные программисты, которым 18 лет. Есть отличные программисты, которым 40. Невозможно оценить качество программиста, основываясь на его возрасте (хотя, возможно, лучше нанимать людей примерно одного возраста; пожалуйста, обратите внимание, что дискриминация по возрасту является нелегальной во многих странах!).
Ну и напоследок скажу, что мой опыт показывает, что большинство плохих или средних программистов начали программировать в университете, когда им стали преподавать соответствующий курс. Большинство хороших программистов начали программировать гораздо раньше. Если ваш кандидат не занимался программированием до университета, и начал получать опыт в программировании только на своей первой работе, то он вполне вероятно не очень хороший программист.
Заключение
Разумеется, все эти признаки не являются абсолютными. Вы можете найти программиста, который не подходит под некоторые из них. Но мое мнение состоит в том, что навряд ли вы найдете хорошего программиста, который не попадает под все эти признаки. Тоже самое относится и к плохим программистам, которые могут соответствовать некоторым из этих критериев. Но чем большему количеству признаков соответствует ваш кандидат, тем больше вероятность, что он тот самый "хороший программист”, которого вы искали.