Как нанимателю распознать насколько хорошим и талантливым окажется программист?
Это не такое простое дело, как кажется. Описание опыта работы в резюме далеко не всегда может раскрывать полностью правду о программисте – с одной стороны опыт может быть обманчивым и существовать скорее только на бумаге, а не в реальности. С другой стороны далеко не всегда прекрасный программист в "официальном" резюме может указать толком и подробно, в чём, как и почему он действительно так хорош. Хотя и есть ряд тонкостей, благодаря которым можно почерпнуть даже из резюме полезную информацию, раскрывающую "качественность" программиста.
Я считаю себя достаточно неплохим программистом. Кроме этого, мне довелось провести немало времени и с другой стороны – отбирая и интервьюируя кодеров при найме на работу. Поэтому я считаю, что я накопил неплохой опыт в "распознании" программиста и хочу поделиться им в этой статье, которая может оказать полезной для людей, которым доводится отбирать специалистов на работу. Хотя, кто знает, вполне вероятно эта статья поможет и хорошему программисту, который, несмотря на свои прекрасные профессиональные навыки, не умеет толком преподнести себя работодателю.
Пол Грэм в своей популярной статье "18 ошибок, которые убивают стартапы " отмечает следующее:
"Причиной смерти большинства e-commerce стартапов в девяностых стали плохие программисты. Большинство тех компании создавались бизнесмена, которые думали, что для успеха IT проекта нужно придумать хорошую идею, а потом просто нанять программистов, чтобы они её реализовали. Однако в реальности всё оказывается гораздо сложнее. Сложнее просто потому, что такие наниматели не могли определить хороший программист перед ними или нет. Кроме того, они толком и не видели хороших программистов, поскольку профессиональный и качественный кодер редко когда жаждал в качестве работы выбрать "реализацию видения проекта заказчиком", не разбирающимся в IT и программировании.
В результате, такие бизнесмены нанимают тех программистов, которые им кажутся хорошими (написано у него в резюме Microsoft Certified Developer, значит, хороший кодер, по-любому). А потом удивляются, почему их проект пыхтит как бомбардировщик второй мировой, а конкуренты проносятся мимо на реактивных самолётах. Такое может и проходит в случае большой компании, но для стартапа смерти подобно.
Так как нанять хорошего программиста, если вы сами не программист? Ответа на это нет, и вряд ли будет. Можно для начала нанять одного хорошего, чтобы потом с его помощью отсеивать остальных, но этого одного хорошего тоже надо как-то найти сначала…"
Я совершенно не согласен с автором данного отрывка. Я считаю, что есть набор чётких индикаторов, по которым можно распознать хорошего программиста или же наоборот посредственного. Вот я и постарался изложить эти индикаторы качественности и некачественности в данной статье.
1. Увлечённость.
Во время работы мне довелось встретить доселе небывалый тип программистов: программист-карьерист. Представители данного типа кодеров пошли в программирования только потому, что считается, что именно в IT можно сделать хорошую карьеру. Они и пальцем не притронутся к кодированию в своё свободное время, они не понимают, зачем у одного человека дома может быть несколько компьютеров и зачем они объединены в сеть. Это только работа и заниматься всем этим стоит только на работе. Они не учат ничего нового по своей воле, программирование для них – это рутинная работа с девяти до шести. Они не обсуждают за пределами офиса какие-то технические вопросы, да и на работе обсуждают их без всякого энтузиазма. Я считаю, что хорошие программисты всегда увлечены программированием. Хороший программист будет программировать даже бесплатно – просто для себя. Хороший программист может проесть вам всю плешь разговорами о какой-то технической проблеме, с которой он столкнулся во время разработки, и как он её разрешил, полагая, что это действительно важно и интересно. Некоторые видят в этом определённую социальную закомплексованность – мол, нет у человека других тем для разговора, кроме как о каких-то там багах или функциях. Однако если вы хотите распознать хорошего кодера, подобная страсть к обсуждению программирования пусть даже и в ущерб каким-то другим навыкам общения, будет хорошим показателем качественности кодера. Если вы наняли человека, который способен на одном дыхании полчаса обсуждать технологию, которую он использует – вам определённо повезло.
2. Самообразование и интерес к обучению новому.
Программирование ни секунду ни стоит на месте, и чтобы попасть по этой мишени, необходимо всегда быть в движении. Не проходит ни одного года, чтобы не выходили новые технологии, которые меняли бы старые стандарты, вводили новые и вообще переворачивали половину вселенной разработки. Это конечно не значит, что все хорошие программисты обязательно хватаются за всё новое и всегда на самом острие прогресса. Просто существует класс программистов, которые принципиально отказываются изучать что-либо новое, если их не заставлять. Они просто не любят учиться чему-нибудь новому, они считают, что приобрели набор навыков на университетской скамье раз и навсегда, и им его должно быть вполне достаточно для работы, ну разве что посетить курсы ещё, но только если компания посылает, а не по своей воле. Если вы думаете нанять программиста, который говорит: "пошлите меня на курсы обучения этой новой технологии тогда я в этом смогу разобраться" – не нанимайте его. Хорошему программисту не нужны курсы обучения новой технологии. Он сам прожужжит вам все уши, о какой-то очередной новой технологи, о которой вы даже не слышали, и что вы обязательно должны использовать её в своём проекте, даже если никто из других сотрудников её не знает, и даже если он сам её толком не знает и не пробовал.
3. Интеллект
Некоторые люди из бизнеса и менеджмента считают, что недостаток тактичности в общении – это прямо свидетельство о необразованности и невысокой интеллектуальной развитости человека. Однако умственные способности человека имеют много проявлений и эмоционально-вербальное только одно из них. Хорошие программисты не тупые. В принципе. В реальности – они одни из умнейших людей из всех, кого я знаю. Причём у многих из них при этом ещё и прекрасные навыки общения с людьми. Клише о том, что настоящий программист в разговоре в компании не может толком и предложения вставить, это всего лишь клише. По моему опыту общения с лондонской Ruby юзергруппой, за небольшим исключением в ней собрались исключительно умные, общительные и разговорчивые люди. Глядя на них, вы не подумаете никогда "ну что за стадо гиков" по крайней мере до тех пор, пока вы не подойдёте поближе и услышите, что они с жаром обсуждают RESTful приложение со сложным пользовательским интерфейсом клиентской части. Это не значит, что они будут чувствовать себя как рыба в воде в любой обстановке. Но это значит, что если окружающие условия и социальный контекст комфортабелен вы сможете прекрасно побеседовать с ними как с самыми общительными людьми (а может даже и ещё лучше, поскольку по моему опыту программисты, если говорят о какой-то вещи, то это действительно интересно и полезно, а не просто изысканный, но пустой стёб). Даже не думайте нанимать "немого" программиста, который вроде как должен быть хорошим. Он им не будет. Если человек не может в обычной расслабленной обстановке подержать беседу, толку и на работе от него будет немного. С другой стороны, далеко не все те, кто умён и сообразителен имеет потенциал стать действительно хорошим программистом.
4. Скрытый опыт
Данный пункт можно было бы включить в пункт "увлёченность", но он является таким важным индикатором качества программиста, что лучше его было лишний раз подчеркнуть и раскрыть. Я начал программировать, когда мне было девять лет, на компьютере Commodore 64. Затем я перешёл на PC, где возился с Pascal. В четырнадцать лет я, потратив уйму времени, написал на C и Assembler небольшой движок для графических эффектов с обращением напрямую к видеокарте. Это было то, что я называю "стадией кокона". Когда я делал первые шаги на этой стадии, я был посредственным программистом, мне не хватало уверенности взяться за что-нибудь действительно сложное. По её окончанию, я как-раз-таки приобрёл эту уверенность и знал, что могу кодировать вполне себе хорошо практически всё что угодно. Отражено это всё каким-либо образом в моём резюме? Нет, конечно. Я искренне верю, что у любого хорошего программиста резюме представляет собой лишь только верхушку айсберга, а большая часть всего скрыто. Что-то кажется не совсем уместным, что-то не соответствует профилю вакансии, однако является при этом замечательным достижением и подтверждением профессионализма и увлечённости человека как программиста. Хороший вопрос который стоит задать на собеседовании – "Не могли бы вы рассказать что-нибудь о своём личном проекте, даже и наоборот, особенно, если он не связан с вашим рабочим профилем – что-нибудь, на что вы тратили своё свободное время и это не нашло отображения в резюме?". Если человек не может на этого ничего ответить (при том, что резюме у него на двадцать страниц), то он, скорее всего не самый хороший программист. Даже программист с наиболее исчерпывающим резюме, должен иметь пару-тройку проектов, которые остались за кадром.
5. Разнообразие технологий.
Здесь всё очень просто. Так как хороший программист всегда любит обучить и узнать и попробовать новую технологию, а также образно выражаясь "поиграться" с ней даже если он не имеет отношения к его профессиональной деятельности, любой хороший программист старше 22 лет должен разбираться в доброй дюжине различных технологий. Они могут быть и в каком-то смысле бесполезными, но для хорошего программиста изучение новой технологии – один из самых интересных способов провождения свободного времени. Чем они, собственно, со свойственной им увлечённостью и регулярно занимаются. Конечно, они не должны быть гуру во всём, но любой хороший специалист будет разбираться в целом перечне различных технологий. Но здесь необходимо учитывать одну тонкость. Любой Java программист средней руки перечислит вам в своем списке известным ему технологий, что-нибудь типа Java, J2EE, Ant, XML, SQL, Hibernate, Spring, Struts, EJB, Shell scripting и т.д. На самом деле это всё по сути ветви и части одной технологии. Непрограммисту это, наверное, понять сложно, но если спросить у программиста как все его перечисленные навыки коррелируют между собой, то всё станет ясным. Переспециализированность кодера на одной и той же технологии – это индикатор не самого лучшего программиста. Наконец, хороший знак, если технологии известные программисту представляют собой самые новые и продвинутые языки или там фреймворки. На момент написания статьи (Ноябрь 2007) это Merb, Flex, RSpec, HAML, UJS и многие другие. Они кстати, тоже связаны между собой и через несколько лет их перечисление будет таким же перечислением "одной и той же" технологии, как и в примере с Java. Правда, здесь надо упомянуть, что стоит разделять понятия разнообразности и прогрессивности. Знание разнообразных технологий за определённый промежуток времени это положительный индикатор, в независимости от того насколько они прогрессивны. Одновременно является положительным фактором и знание новых технологий программирования, в независимости от того, насколько впоследствии исчезнет их вариативность и разнообразность.6. Формальность квалификации
Это как раз тот момент, когда "официальная" квалификация программиста не является индикатором его качественности. Хороший программист может иметь специализированное образование, а может и не иметь. Различные сертификаты типа MCSE или SCJP могут означать высокий уровень кодера, а могут и нет. Они призваны быть доступными и желательными для всех программистов, но не более того. Всё что они означают - это наличие у человека определённого набора знаний. Это, по сути, гарантия для нанимателей из больших компаний, что "вот этот вот парень знает Java, и у него есть официальное доказательство этому" без проведения всяких там интервью и собеседований. Если вы нанимаете программиста для стартапа или создаёте штурмовую команду для решения важнейших задач на уровне предприятия, вы должны игнорировать формальную "официальную" квалификацию программиста. Она ничего вам толком не расскажет о том, насколько хорош тот или иной специалист. Точно также нужно игнорировать и возрастной показатель – программист может быть хорош и прогрессивен и в 18 лет и в 40 лет. (Кроме разве что случая, когда вы подбираете команду одного возраста, для того чтобы создать лучшую кооперацию в коллективе, впрочем, возрастная дискриминация официально итак запрещена в большинстве стран). В завершение темы, по моим наблюдениям большинство посредственных программистов начинают кодировать только в университете, изучая соответствующие предметы. Большинство хороших программистов начинают программировать задолго до ВУЗа, и обучение в университете является лишь развитием их хобби, зародившимся ещё до него. Если ваш программист не занимался каким-либо кодированием до университета, а на практическом уровне начал участвовать в разработке только по его завершению на своей первой работе, то своре всего он вряд ли будет хорошим программистом.
Примечание:
Данные индикаторы не являются категоричными и единственно правильными. Вы можете найти хорошего программиста, который не будет отвечать каким-либо из вышеназванных показателей, но вряд ли он будет опровергать их все. Вы можете также найти и плохого программиста, который, наоборот, будет отвечать всем показателям. Но, так или иначе, я уверен, что если программист соответствует в хорошем смысле всем индикаторам, которые я перечислил, тем больше вероятность того, что он будет качественным специалистом, с которым стоит иметь дело. Итак, подведём итоги и тезисно по пунктам перечислим положительные и отрицательные индикаторы высокого уровня программиста. Положительные индикаторы:- Увлечённость технологиями
- Программирование – не только работа, но и хобби
- Способность прожужжать все уши о какой-то технической проблеме и методах её решения, если потребуется
- Наличие достаточно серьёзных (а часто и не одного) своих персональных проектов
- Изучает технологии по своему собственному желанию
- Подтверждённое упорство о том, какую технологию лучше использовать в данном случае
- Ощущает некомфортность, когда приходится работать с технологией, которую он не считает правильной
- Очевидно умён и сообразителен, способен поддержать разговор на различные темы
- Начал программировать задолго до поступления в университет
- Располагает скрытыми знаниями и личными проектами неуказанными в резюме
- Знание широкого набора технологий
- Программирование для него – повседневная рутина, работа с 9 до 6
- Нет стремления обсуждать технические проблемы, даже при их наличии
- Изучает новые технологии только по принуждению
- Готовность работать с любой технологией, с которой скажут, ему нет разницы и дела до этого.
- Не выглядит особо быстросоображающим
- Начал программировать только в университете
- Весь опыт программирования укладывается в резюме
- Сфокусирован исключительно на одной или двух технологиях и не знает ничего кроме них.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.