Собеседования для айтишников — Станислав Протасов рассказывает о роли диплома, олимпиадном программировании и задачах для кандидатов

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

На какие качества вы обращаете внимание в первую очередь при наборе разработчиков, и влияет ли диплом о высшем образовании на ваше мнение?

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

Недавно я интервьюировал одного человека, без диплома, который 2—3 курса отучился в Бауманке или МИФИ, а потом исходя из некоторых внутренних соображений и необходимости зарабатывать деньги, плюс в силу характера, невозможности совмещать работу и учебу, бросил вуз. И вот мы с ним разговаривали, он вполне хороший разработчик, достаточно интересными вещами в жизни занимался, и как-то зашла речь о причинах, почему он бросил вуз. Он мне все объяснил и сказал, что жалеет,  что недоучился. Я спросил почему, и он объяснил, что несколько раз в своей карьере наталкивался на задачи, где ему не хватало образования, где разработка эффективного алгоритма требовала глубокого понимания теории графов, например. Он говорит: «понятно, что 90—95% моей работы требует образования на уровне «умею складывать, умею умножать», но иногда попадаются задачи, где я просто чувствую, что, если бы я потратил время и поучился, я бы смог создать что-то сильно лучшего качества». Это одно соображение, но это никак не отрицает того факта, что если человеку действительно необходимо, то он может потом засесть за учебники, прочитать нужные материалы, разобраться. Но, как часто бывает в жизни — «потом» найти время и разобраться тяжелее, чем в молодости.

«Просто без хорошего образования
тяжелее чего-либо добиться»

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

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

Правда ли, что успехи на олимпиадах по программированию (математике) негативно коррелируют с работой в компании? Много ли у вас в команде олимпиадников?

Напрямую олимпиады не помогут. Так же, как и знание матанализа не поможет человеку писать программы на Java или Python. Но олимпиадное программирование, если хотите, это как спортивное самбо. Оно не гарантирует успеха в уличных драках, мало того, есть много примеров, когда спортсмены-самбисты были жестоко покалечены именно в уличных драках, потому что там нет правил: там могут ударить ножом и втроем накинуться на одного. Но спортсмен-самбист намного быстрее становится именно бойцом, начав изучать боевое самбо (или другое рукопашное единоборство), чем человек, который с попкорном смотрит в экран монитора. Поэтому относиться к этому нужно ровно так: олимпиадное программирование – это хороший способ улучшить свой уровень. Человеку, который этим занимается, овладеть новой областью компьютерной науки или способу программирования будет легче.  Это полезная деятельность, ее не стоит избегать. Если человек профессионально работает в компании, делает продукты, продающиеся широко, это становится как хобби. Человек, который работает в компании, производящий продукты для резервного копирования, наверное, за несколько лет становится профессионалом мирового класса в этой области. И олимпиадное программирование, если он начнет в нём участвовать, вряд ли ему сильно поможет, чтобы он стал на голову выше своих коллег. Но это полезное хобби, которое развивает нужные навыки.

«Олимпиадное программирование — это как спортивное самбо. Оно не гарантирует успеха в уличных драках… Но спортсмен-самбист намного быстрее становится именно бойцом…, чем человек, который с попкорном смотрит в экран монитора.»

А вообще, удивительно, как люди отказываются учиться. Когда я был молодым, пропаганда была очень мощная: надо учиться, это полезно, знание — сила, невежество – тьма. Не понимаю, почему у ваших ребят могут возникать такие вопросы. Знания не бывают лишними. В конечном итоге жизнь устроена так, что если человек понимает что-то очень-очень глубоко, ему легче увидеть, как работает какая-то совершенно, казалось бы, несвязанная с ним область. Всё, что мы делаем, в конечном итоге похоже.  Так, я пребывал в иллюзии по поводу строителей, пока не стал делать свой первый ремонт. Первый и последний. Я обнаружил, что работа строителей в квартире очень похожа на работу коллектива программистов. И мало того, что все те проблемы, с которыми мы сталкиваемся, у строителей стоят в полный рост. И там еще хуже. Потому что средний уровень строителя ниже среднего уровня программиста, с точки зрения образования и общей толковости. Они так же ошибаются, у них есть баги, бывают как хорошие так и плохие проектные менеджеры. Если плохой – могут, образно, и унитаз на потолок прикрутить, а потом делать вид, что так и было. Поэтому знаний избегать не надо. Возможно, конкретно данное знание мне никогда не пригодится, но если я что-то понял, понял почему так, а не иначе, мне оно пригодится хотя бы в виде аналогии.

Не поделитесь вопросами и задачками, которые вы задаете кандидатам на работу?

Они очень разные. Мне нравится подход, который был популярен в различных компьютерных сообществах, используемый в Google, Microsoft и прочими крупными компаниями, когда человеку дают разные нетривиальные задачки и ему предстоит пофантазировать на эту тему, подумать. Сколько шариков помещается в школьный автобус? Сколько человек помоет окон? Один из архитекторов и разработчиков NTFS Microsoft любил такую задачку – он говорил «напиши мне memory allocator для ядра». У нас суть такая же – мы даем задачу, а дальше смотрим, что человек начинает спрашивать, потому что понятно, что решение задачи зависит от дополнительных условий, как именно мы хотим оптимизироваться. Мне кажется, что это правильный подход, когда человек начинает думать и мы смотрим, как он подходит к задаче. Потому что, если человек молодой и неопытный, он сразу начинает писать решение, сразу какие-то начальные условия сам себе расставляет и под них подгоняет задачу. Это даёт сразу большое количество информации и позволяет оценить, какого уровня человек: будет ли он требовать присмотра, обучения или он уже готовый специалист.

Мне нравятся простые задачки – весы и 8 монеток, одна из которых легче, потому что фальшивая. Как ее найти? Многие не знают, те кто знают – отвечают легко. Интересно посмотреть на реакцию людей. Какие-то задачи более сложные – два стакана и сто этажей – как найти этаж, с которого стакан начинает разбиваться за минимальное количество попыток. Иногда я вообще никаких задач не спрашиваю – все зависит от человека, как пошел разговор. Жестких правил здесь нет. При разговоре сначала спрашиваю о его жизни: где учился, какие проекты делал. Спрашиваю обычно на достаточно общем уровне, не въезжаю глубоко в детали, не спрашиваю, сколько какого кода написал. Нет. Просто слушаю, как человек рассказывает о своей работе – это тоже много информации дает. Когда человек делал малую часть и не понимает, что эта за система, или наоборот, когда человек все видит и, может быть, он отвечал за одну часть, но понимал все целиком и сделал свою часть так, что лучше уже нельзя.

«Когда [кандидат] начинает крыть своего бывшего работодателя, это производит крайне плохое впечатление»

Также слушаю, как объясняет, почему он откуда-то ушел. Когда начинает крыть своего бывшего работодателя, это производит крайне плохое впечатление. Даже если этот работодатель был очень плохим. Это все равно оказывает плохое впечатление. Вот если бы у нас был рабовладельческий строй, и мой прошлый хозяин был таким плохим – это было бы объяснимо, но если человек работал на негодяев, имея возможность в любой момент от них уйти, то это странно, что-то тут не так.

После этого начинаем уже профессиональные вопросы, чтобы понять, насколько глубоко разбирается в своей области. Пример: 2003—2004 год, ко мне пришел человек на интервью. Я стал читать его резюме, у меня начали руки дрожать – настолько хорош был человек, что просто не верится. Знает все, что нам надо, и еще намного больше. Когда я говорил с ним, у меня было чувство, что ко мне попал алмаз и его продают по цене стеклянного шарика и я, боясь спугнуть, не задавал много вопросов. Но потом всё же случайно задал такой вопрос, что человек поплыл. Когда я стал дальше «щупать» по ключевым словам в его резюме, то понял, что он ничего не знает. Я в конце ему говорю – как же так, с таким резюме и ничего не знать! Что происходит? Признался, что списал у брата. Это реальный случай, поэтому я всегда задаю пару вопросов, чтобы удостовериться, что человек не выучил наизусть компьютерный жаргон, а действительно понимает, о чем говорит.

«Наша жизнь устроена так, что даже если человек клинический идиот – он не ходит с табличкой  «я идиот». Нет, он приходит на интервью…»

Нахватавшихся терминологии сейчас довольно много – по различным причинам. Индустрия последние годы резко расширялась. 20 лет назад потребность в программистах в нашей стране была не очень высокая, и найти работу было нелегко. Большинство программистов тогда выполняли работу «эникейщика»: принтеры носили. А потом, когда стали появляться серьезные компании, появились программные продукты, требования рынка по количеству программистов резко увеличилось и зарплаты стали расти, туда потянулись люди. В том числе и те, у кого не было профильного образования, ни компьютерного, ни технического. Это не всегда мешает стать хорошим программистом, но была когорта людей, которые знали только по вершкам и научились программировать в Visual Basic. Написали себе резюме и стали хотеть много денег. Поэтому я всегда базовые вопросы спрашиваю. Если ответы странные — копаю глубже, смотрю, что он знает. Если человек отвечает нормально, видно, что понимает, то стараюсь понять его общечеловеческие качества. Я нейтрально отношусь к политике, хобби, беготне по лесам с хоббитами, сыроедению и т.п. Считаю, что это – личное дело человека. Но когда человек начинает говорить странные вещи, что надо, например, убивать всех велосипедистов, то это, конечно же, очень серьезный звонок. По опыту, если у человека есть странное увлечение или мировоззрение – оно мешает работе и приводит к тому, что человек может неожиданно подвести.

Молодежи вот такие задачки не всегда нравятся, они же высокого мнения о себе.

Я спокойно к этому отношусь. В молодости быть категоричным и безапелляционным совершенно нормально. Есть же известная история про французского математика Эвариста Галуа, которого убили в 20 лет на дуэли. Он был очень талантливым, поля Галуа до сих пор в математике изучаются. Когда он пришел устраиваться в Политехническую школу, профессора попытались устроить ему что-то вроде экзамена. Дали задачку. Он с ходу швырнул в них тряпкой, которой стирают мел с доски, и сказал, что он им не школьник на такие детские вопросы отвечать. Когда ты молод, горяч и очень высокого о себе мнения, задачка может тебе не нравиться, но надо понимать – ее задают не для того чтобы унизить, а чтобы посмотреть на то, как человек думает. Ведь наша жизнь устроена так, что даже если человек клинический идиот – он не ходит с табличкой  «я идиот». Нет, он приходит на интервью, и с первого взгляда сказать, что он идиот, бывает невозможно. И любой, кто кого-то нанимает, старается понять, кто к нему пришел: нормальный человек, гений или тот, кого надо сразу заворачивать. Эти задачки – способ посмотреть, как человек думает. Они могут быть про шарики, кубики, интересные или не интересные – неважно.

Ваш любимый язык программирования?

terminalЯ начинал с «ассемблера» для Intel 8085 и 8080. Первые свои программы я писал в тетрадке. Перфокарты были, но я как-то мимо них проскочил, случайно правда. БЭСМ-6 у нас в институте были, но я на них почти не работал. Потом были процедурные языки, объектно-ориентированные и функциональные… Я бы сказал, что у меня нет любимого языка. Язык под задачу – это верный подход. Если попросят написать драйвер под операционную систему – это будет С, без шансов.  Если что-то скриптовое, то это, скорее всего, будет Bash. Мне нравится Bash, я много на нем писал, в нем есть элементы и функционального программирования и любые другие. Если задача будет связана с бэкэндами, это может быть Java или Python. Скорее то, на чем уже написана часть кода. Но если нет жестко заданных ограничений, то, наверное, всё-таки Bash.