понедельник, 13 февраля 2012 г.

Кто ищет - тот всегда найдет или о собеседованиях в IT

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

Не секрет, что IT рынок Украины растет: проектов становится больше, а количество людей свободных людей становится меньше и нанимать людей с рынка становиться тяжелей. Помню, как многие посмеивались с Серва и его тренинг-центра ("Кузница кадров", "Они учат - мы выбираем"), но прошло пару лет и уже в куче компаний открылись курсы подготовки, тренинг-центры, интернатура и прочие способы отбора талантливых новичков.

Данные и цифры ниже - это мои субъективные выводы, которые не претендуют на объективность.

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

Основная масса новых людей, которые приходят на рынок - это студенты 3-5х курсов, в основном технические специальности.  Чему их учили в универах? Да там целый список из 20+ технологий, языков и прочего добра, но в лучшем случае человек имеет необходимый общий уровень знаний и немного стыкался с 1-2 языками программирования. Если видим человека, у которого в резюме список умений длиной со простыню, то он явно выписал все, что делал на лабораторных работах. Вывод первый:
Нет опыта - короткое резюме. Знаю алгоритмы, чуток работал с С++ и/или Java, слышал про потоки и процессы.
Краткость - сестра таланта, от людей без опыта не ждут и тем более не требуют внушительного списка прикладных знаний. Есть что-то реальное - пишите, нет - тогда пусть лучше будет два абзаца.

Отбор людей идет в несколько этапов. Этап первый - базовый отсев. Задача - отсеять людей, которые не дотягивают до определенного "приемлемого" уровня. Способ - как правило, тестирование, реже - телефонные интервью. По статистике, процентов 80-85 потока отсеивается на этом этапе и именно этот факт сподвиг меня на написание сего опуса.

Прежде всего, в чем же причина такого провала? Как правило, студенты не имеют понятия чего от них, собственно, требуется. Кто-то прочел одну книжку по С и успокоился, кто-то сайт на HTML написал, но в целом со стороны университетов нет пинка в нужном направлении, а большинство студентов инертны и спохватываются уже тогда, когда все вокруг уже бегают со своими резюме по конторам и конторкам. Как и в любом другом деле, тут главное - начать. Я не фанат какого-либо языка, но всегда советую в начале своего пути программиста делать ставку на С/С++ и поясню почему: с них просто перепрыгнуть практически куда угодно. Будь то С# или Java, голый С или PHP - с С/С++ процесс переезда всегда проще, потому что:
  1. Вы знаете низкоуровневые основы (робота с памятью, указатели, биты/байты)
  2. Столкнулись с OOP
  3. С/C++ дает возможность выстрелить себе в ногу при неосторожном обращении с ним - нет песочниц, а взамен memory overrun, race conditions и еще куча приятных вещей.
Поэтому, вывод два:
Для обучения и набивания первых шишек я - за С/С++.
Не хотите С++, ибо Java кросс-платформенная и там все намного круче? Нет проблем, но базовые вещи по работе с памятью, стеком и прочими вещами прочитать все-равно будет нужно.

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

Хорошо, тесты пройдены, впереди -техническое интервью по С/С++. Теория + задачи - вот обычный план собеседования с молодым специалистом. Нужно быть готовым писать код на бумажке - главное тут не то, как вы напишете (хотя и это будет учитываться), но что написано и какие идеи двигали человеком. Мыслить вслух очень полезно - это показывает ход ваших размышлений и помогает составить о вас представление.

Типичный набор тем, к которым нужно быть готовым:

  1. Биты/байты, работа с памятью, указатели.
  2. Основы ООП (больше - лучше).
  3. Базовые особенности языка (к примеру, незнание понятия "конструктор по-умолчанию" - это плохо).
  4. Базовые алгоритмы и структуры данных. Понятие вычислительной сложности алгоритма, сравнение вектор-список, пара базовых алгоритмов поиска/сортировки.
  5. Большой плюс - процессы/потоки, синхронизация, межпроцессорное взаимодействие. Иметь полное понимание без опыта тяжело, но основы знать крайне желательно.
  6. Логика. Я не сторонник олимпиадных задач на собеседованиях, но умение на основе фактов делать логические выводы и искать нестандартные подходы для програамиста обязательно.
Кандидат справляется с базовыми вопросами - получает вопросы посложней, не для того чтобы загнать его в угол, а чтоб понять объем знаний.


Книги, которые я обычно рекоммендую людям:


C++ direction:
  • Must-read:
    • Stanley B. Lippman “Essential C++”
    • Jeffrey Richter "Windows via C/C++"
  • Optional (recommended for further reading)
    • Steve McConnell "Code Complete"
    • Scott Meyers "Effective С++", "More Effective C++
    • Donald E. Knuth "The Art of Computer Programming" - по конкретному типу алгоритмов
Главное, что нужно - это видеть цель, верить в себя и работать над собой, чтоб не было как в типичной ситуации:
- А почему решил стать программистом?
- Да нравится мне программки писать.
- А что написал для себя, кроме лабораторных работ?
- Да ничего...

Надеюсь кому-нибудь из тех, у кого желание есть, поможет сей сумбурный опус.

Stay tuned!

2 комментария:

  1. Интересная статья. Хотелось бы получить список рекомендуемой литературы по Java а не только C++.

    ОтветитьУдалить