Привет, Хабр, несколько дней назад мы делились переводом крутого материала по рекрутингу, приуроченного к запуску курса «IT-Recruiter». Сегодня курс стартовал и, в связи с этим, хотим поделиться с вами переводом еще одной очень интересной статьи. Приятного прочтения.

Вокруг C/C++ разработчиков не так много шума, как вокруг разработчиков на других языках. Они не так распространены, как разработчики JavaScript. Они не так хорошо связаны с горячими темами, как наука о данных и разработчики Python. Они не используют такие многообещающие технологии, как разработчики Kotlin. Но в отличие от технологий, делающих все хедлайны, C и C++ по-прежнему являются рабочими лошадками многих важных систем, а также таких областей, как встроенные технологии и игры. В результате, все еще существует большой спрос на разработчиков C/C++. Таким образом, возникает вопрос: как оценивать навыки разработчика на C и C++?



C и C++ существуют уже давно, поэтому узнать о них можно многое. Существуют разные версии, технологии и ресурсы, созданные для этих технических стеков. Вам нужно использовать конкретные вопросы для интервью на C и C++, поскольку те, которые вы используете для таких языков, как Java, просто не подойдут. Существуют концепции, которые вы просто не увидите за пределами C в C++. Кроме того, вам нужен правильный технический скрин, чтобы увидеть, есть ли у кого-то навыки C или C++. Но не волнуйтесь, этот пост даст вам все, что вам нужно знать о проверке и найме разработчиков C и C++.



1. Что такое C и что такое C++?

Первое, что вы должны понять, это то, что C и C++ — это не одно и то же. Как вы можете себе представить, C существует чуть дольше, чем C++. Введенный в 1972 году, C стал стандартом де-факто к концу того десятилетия. Первая версия C++ не появилась до 1984 года. Но снова потребовалось 10 лет, чтобы утвердиться. К началу 90-х C++ приобрел большую популярность.

1.1 В чем разница между C и C++?

С одной стороны, C является процедурным языком. С++, с другой стороны, является языком множественной парадигмы. Он выделяется в процедурном и объектно-ориентированном программировании. Кроме того, новые функции делают его практичным выбором для функционального программирования. В большинстве реальных случаев программы на C++ в той или иной степени будут использовать все доступные программные парадигмы. В действительности, вы часто можете наблюдать, как все три парадигмы смешаны вместе.

Парадигмы программирования — не единственное различие между ними. C довольно близок к машинному уровню и иногда называется «портативным ассемблером». C++, с другой стороны, ближе к языкам более высокого уровня, таким как Java, C# и D (хотя все еще сохраняет некоторые из низкоуровневых функций С).

1.2 Чем C и C++ похожи?

Помимо этих различий, безусловно, есть некоторые сходства. Синтаксис, используемый обоими этими языками, часто называют «синтаксисом семейства C». Поскольку C очень популярен, вы фактически обнаружите, что грамматика и синтаксис C являются основой для ряда языков программирования, таких как Java, C#, C++, D, Objective-C, JavaScript и многих других.



2. Для чего используются C и C++?

2.1 Для чего используется С?

Поскольку C и C++ настолько близки к машинному уровню, они в основном используются для приложений, где скорость обработки и ручная настройка важнее, чем время разработки. К ним относятся низкоуровневое программирование (BIOS), встроенное программирование (устройства), системное программирование (операционные системы) и программирование, ориентированное на производительность (например, игровые движки, графические процессоры / научные вычисления, криптография).

C и C++ дают программисту возможность сказать, что происходит с программой на самом низком уровне, ближайшем к машинному уровню — это реальное преимущество. С одной стороны, это дает C и C++ невероятную производительность. Недостатком этого является то, что существует гораздо большая погрешность для получения правильного кода, поскольку им не хватает функции управления памятью как на языках более высокого уровня. На практике это означает, что для написания рабочего кода на C и C++ может потребоваться гораздо больше времени, чем для языка программирования более высокого уровня, такого как Java или Python.

Поскольку C настолько близок к машинному уровню, это, по сути, язык общения в мире программирования. Большинство других языков программирования построены с использованием языка Си, и большинство программного обеспечения предоставляет свои функции на языке Си. Почти все другие языки могут вызывать функции языка Си.

На базовом уровне, C довольно прост в освоении. Его синтаксис и грамматика довольно просты для изучения основ, но сложны в освоении. В отличие от других языков, в C отсутствуют инструменты, которые снимают бремя тяжелой работы, которую разработчик обычно хотел бы избежать.

2.2 What is C++ used for?

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

C++ раньше был расширением C, но на самом деле, это не соответствует действительности с 1998 года. Сейчас это в значительной степени обособленный язык. Большая часть C-кода будет компилироваться в C++ без изменения, но ни один из них не является строгим подмножеством другого. Тем не менее, разрыв между ними продолжает увеличиваться по мере выпуска новых стандартов.

2.3 В чем разница между C и C++?

C++ позволяет большинству конструкций и кода C быть скомпилированными в виде кода C++, а также позволяет использовать больше инструментов программирования, таких как шаблоны, RAII (Resource Acquisition Is Initialization — Получение ресурса есть инициализация), классы, лямбда-выражения, большая и более мощная стандартная библиотека и более сильная система типов.
В то же время в C есть некоторые инструменты, которых нет в C ++. К ним относятся назначенные инициализаторы и массивы переменной длины (VLA). Общее практическое правило заключается в том, что если присутствует среда C++, то вы можете быть на сто процентов уверены, что среда C также присутствует. Противоположность не обязательно верна.



3. Что должен знать ИТ-рекрутер о C и C++?

C не изменялся в течение долгого времени. Обе последние ревизии, C11 и C18, были довольно незначительными и не предлагали больших изменений. Будущая C21 тоже не кажется новаторской.

С++, с другой стороны, начинает наверстывать, не сделав многого за последнее десятилетие. Начиная с выпуска C++11 новая ревизия появляется на свет каждые три года вплоть до C++20, который, как ожидается, выйдет вовремя.

Почти все доступные библиотеки предоставляют C API или биндинг, даже если они написаны на другом языке. C++ может использоваться для всех этих библиотек. Есть также некоторые библиотеки только на C++, такие как Boost, Qt и POCO.

3.1 С какими инструментами и методами должен быть знаком разработчик на C или C++?

Вероятно, наиболее важной вещью для разработчика C является понимание арифметики указателей и того, что представляет собой неопределенное поведение. Кроме того, разработчик на С должен уметь использовать такие средства отладки, как Address/Memory/ UndefinedBehavior Sanitizer, Valgrind, отладчики (например, GDB) и инструменты статического анализа кода.

Разработчик C++ должен уметь понимать все инструменты C, а также библиотеки Boost и Qt, достаточно хорошо, чтобы использовать их.

Кроме того, если смотреть на опыт разработчиков, коммерческие и опенсорсные проекты говорят больше всего о том, на что они способны.



Как проверить навыки разработчика на C и C ++ на этапе скрининга

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

4. Отбор разработчиков на C или C++ с использованием их резюме

Резюме — это первое место, где вы можете найти подсказки о том, что может сделать ваш кандидат. Для нетехнических рекрутеров это часто может быть трудным местом для начала, поскольку информация часто носит чисто технический характер. Чтобы помочь вам, мы собрали список того, что нужно искать, в резюме разработчиков C и C++.



4.1 C/C++ глоссарий для технических рекрутеров











4.2 Наиболее распространенные имена технологий C и C++, которые используются взаимозаменяемо

  • Стандартная библиотека C++ и STL иногда используются взаимозаменяемо, но это не совсем правильно.


4.3 Различные версии C и C++

Версии C

Версии C помечены в тем годом, в котором они были выпущены (например, C89 — C от 1989 года). Не существует промежуточных версий (например, C06), но некоторые могут относиться к пре-C89.

Самые популярные ревизии:

  • C89
  • C95
  • C99
  • C11
  • C18
  • C21 (еще не опубликовано)
  • ANSI C


Версии C++

Версии C++ помечаются так же, как версии C — в тем годом, в котором они были опубликованы.

Самые популярные ревизии:

  • C++84 — не настоящая ревизия, но иногда используется для определения предстандартного C ++
  • C++98
  • C++03
  • C++11
  • C++14
  • C++17
  • C++20 (еще не опубликовано)


Кроме того, вы можете увидеть названия версий, которые были даны во время их разработки.

  • C++0x (рабочее имя для C++11, которое должно было быть выпущено до 2010 года)
  • C++1y (рабочее имя для C++14)
  • C++1z (рабочее имя для C++17)
  • C++2a (рабочее имя для C++20?)


4.4. Насколько близки соответствующие версии технологий C и C ++ друг к другу
C11/C18 — почти то же самое


  • C++98/C++03 — почти то же самое
  • C++11/C++14 — незначительные изменения
  • C++14/C++17 — незначительные изменения (но достаточные, чтобы сделать разницу между C++11/C++17 существенной)


4.5 Какие версии совершенно разные?

  • C++03/C++11 — самые большие изменения в истории C++
  • C++11/C++17 — постепенное изменение редакций
  • C89/C99 — основные изменения с точки зрения безопасности типов и проблемы поддержки устаревшего кода


4.6 Насколько важны сертификаты C и C++ для оценки навыков кандидата в области программирования?

Нет уважаемых сертификатов C/C ++. В результате лучше всего игнорировать их в резюме, так как они ничего не скажут об уровне квалификации кандидата.

4.7. Другие вещи, на которые стоит обратить внимание в резюме разработчика на C или C++

Проверьте, что кандидат:

  • Определяет версии языка, которые он использовал
  • Работал над типичным C++ проектом
  • Участвует в крупных проектах, связанных с уникальными и строгими требованиями.


Кроме того, если упомянуто следующее, технические собеседования могут оценить кандидата на основе его общедоступной истории:

  • Выступления на конференциях
  • Посещение конференций
  • Написание статей в технические журналы
  • Написание технического блога
  • Содействие OSS
  • Содействие в ответах на сайтах (например, Stack Overflow)




5. Вопросы для интервью на C и C++, которые нужно задать во время телефонного/видео технического интервью

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

5.1 Вопросы об опыте кандидата

Вопрос 1: (C/C++) Каковы были ограничения для ваших предыдущих проектов?
Почему вы должны задать Вопрос 1: Кандидат должен иметь возможность поделиться своим опытом с данной отраслью. Например, во встроенном программировании трудно использовать динамическую память, а для игр очень важно убедиться, что все вычисления завершены ко времени рендеринга одного кадра.

Вопрос 2: (C/C++) Для каких систем вы программировали?
Почему вы должны задать Вопрос 2: В некотором смысле, программирование для Embedded/Desktop и Linux/Windows/OSX сильно отличается.

Вопрос 3: (C/C++) Вы писали код, придерживаясь каких-то определенных стандартов?
Почему вы должны задать Вопрос 3: кандидат может рассказать вам, если у него есть опыт работы с MISRA и т.д.

5.2 Вопросы о знаниях и мнениях кандидата

Вопрос 1: (C++) Каковы основные различия между C++ и C?
Почему вы должны задать Вопрос 1: Этот вопрос позволит кандидату показать свое понимание языков, а также то, рассматривают ли он C++ как небольшое дополнение к языку C или отдельный язык с различными шаблонами использования.

Вопрос 2: © Что такое арифметика указателей?
Почему вы должны задать Вопрос 2: Это в основном для C. Этот вопрос позволит кандидату выразить свое понимание фундаментального подхода C к памяти. Осторожно: для C ++ этот вопрос подразумевает использование небезопасных и устаревших шаблонов в вашей кодовой базе.

Вопрос 3: (C++, начальный уровень) В чем разница между классом и объектом?
Почему вы должны задать Вопрос 3: Чтобы определить, понимает ли кандидат основы C++.

Вопрос 4: (C ++) Что такое лямбда-выражение?
Почему вы должны задать Вопрос 4: Чтобы определить, знает ли кандидат о достижениях, которые C++ сделал после C++03 (лямбда-выражения были введены в C++11), и понимает их.

Вопрос 5: (C/C++) Что такое блокировки, какие проблемы они решают и каковы потенциальные проблемы с ними?
Почему вы должны задать Вопрос 5: Это покажет кандидату понимание блокировок, условий гонки, взаимоблокировок и лайвлоков.

Вопрос 6: (C/C++, эксперт) Что такое volatile и как она связана с вопросом о блокировках и синхронизации?
Почему вы должны задать Вопрос 6: Кандидат должен быть в состоянии сказать, что volatile должно использоваться только для доступа к оборудованию, а не для синхронизации.

Вопрос 7: (C++) Как бы вы создали динамический массив?
Почему вы должны задать Вопрос 7: Это покажет, будет ли кандидат использовать хороший подход, такой как std::vector, или устаревший и небезопасный new.

Вопрос 8: (C++) Что такое RAII? Есть ли это у других языков?
Почему вы должны задать Вопрос 8: Это покажет, знает ли кандидат эту фундаментальную идиому C++ и понимает ли он, что это значит. Бонусные баллы за описание аналогичных дополнительных функций на других языках, например, с with() в Python или using в C #.

Вопрос 9: (C++) Можете ли вы реализовать throw из деструктора?
Почему вы должны задать Вопрос 9: Кандидат здесь может уточнить детали. Суть этого в том, что вы можете, но это плохая практика, и она отключена по умолчанию с C++11, поскольку деструкторы неявно не преобразуются.

Вопрос 10: (C++) Можете ли вы наследовать конструктор?
Почему вы должны задать Вопрос 10: Кандидат может ответить, что это возможно с C++11, о небольшом изменении в том, как это работало в C++14, и о последствиях этого изменения.

Вопрос 11: (C++) Можете ли вы иметь виртуальный конструктор?
Почему вы должны задать Вопрос 11: Короткий ответ — нет, но кандидат может показать свое быстрое мышление, упомянув фабричные и прототипные образцы.

Вопрос 12: (C++) Что такое интерфейс?
Почему вы должны задать Вопрос 12: Это вопрос с подвохом, потому что в C++ нет интерфейсов. Однако у него есть абстрактные классы, и кандидат должен рассказать о них.

Вопрос 13: (C++, эксперт) Можете ли вы иметь реализацию чисто виртуальной функции?
Почему вы должны задать Вопрос 13: ответ — да, но удобство использования ограничено.

Вопрос 14: (C++, эксперт) Можете ли вы использовать функцию виртуального шаблона и почему?
Почему вы должны задать Вопрос 14: Кандидат сможет показать свое понимание различия между временем компиляции и временем выполнения, а также подробности реализации, такие как vtables.

Вопрос 15: (C++, эксперт) Как бы вы реализовали std::is_same?
Почему вы должны задать Вопрос 15: Кандидат сможет показать свои знания метапрограммирования, реализовав этот тривиальный пример.

Вопрос 16: (C/ ++) Какое ваше любимое изменение (или ряд изменений) в Cnn/C++nn?
Почему вы должны задать Вопрос 16: чтобы проверить, поспевает ли кандидат изменениям в языке(ах) и знают ли он о разных идиомах кодирования в разных версиях языка.

Вопрос 17: (C ++) В чем различия между C++98 и C++11
Почему вы должны задать Вопрос 17: C++11 был значимым изменением в языке C++, его парадигмах и шаблонах. Кандидат сможет показать свои знания об этом серьезном изменении.

Вопрос 18: (C / C ++) Как бы вы обнаружили и исправили ошибку повреждения памяти?
Почему вы должны задать Вопрос 18: чтобы показать мыслительный процесс, а также знания и инструменты, полезные в таких случаях.

Вопрос 19: (C / C ++) Есть ли у вас опыт использования пользовательских аллокаторов?
Почему вы должны задать Вопрос 19: Кандидат сможет поделиться своим опытом с пользовательскими аллокаторами.

Вопрос 20: (C / C ++) В вашем резюме есть фреймворк/библиотека X, опишите свой опыт работы с ней. Было ли это хорошим выбором? Есть ли альтернатива, которую вы предпочли или предпочли бы сейчас?
Почему вы должны задать Вопрос 20: Это открытый вопрос, позволяющий рекрутеру понять, имеет ли кандидат общее представление о предметной области, знает ли он альтернативы и понимает ли компромиссы, выбранные тем или иным решением.

Вопрос 21: (C / C ++) Какова ваша сборочная система и почему? Какова она по сравнению с конкурентами?
Почему вы должны задать Вопрос 21: Это покажет знания кандидата о системах сборки.

5.3 Поведенческие вопросы, которые вы должны задать, чтобы понять, как кандидат действовал в прошлом

Вопрос 1: Какая ваша самая большая история успеха в программировании? Почему так случилось? Как вы можете это повторить?
Почему вы должны задать Вопрос 1: Этот вопрос позволит кандидату рассказать историю успеха и покажет рекрутеру, заинтересован ли кандидат в решении проблемы или получении похвалы.

Вопрос 2: Каким был ваш самый большой программный сбой? Почему так случилось? Как вы можете избежать повторения этого в будущем?
Почему вы должны задать Вопрос 2: Этот вопрос позволит кандидату представить потенциально тревожную историю и покажет рекрутеру, открыт ли кандидат на этот счет. Это дополнительно покажет, заинтересованы ли они в решении проблемы или перекладывании вины.

Вопрос 3: (для кандидатов более высокого уровня) Вы хотели бы наставить младшего разработчика? Зачем? Как бы вы это сделали? Есть ли у вас опыт наставничества других людей?

Почему вы должны задать Вопрос 3: Это позволит рекрутеру оценить интерес кандидата и навыки, необходимые для обмена знаниями.



6. Технический отбор навыков разработчика на C или C++ с использованием онлайн кодинг-теста

С разработчиками C/C++ вы должны быть абсолютно уверены, что им необходимо иметь безупречные навыки кодирования. C не допускает никаких погрешностей, а C ++ не допускает гораздо большего. Конечно, скрин резюме и по телефону могут помочь вам отсеять некоторых ваших кандидатов. Тем не менее, последнее, что вы хотите сделать, это пригласить кандидата на техническое собеседование только для того, чтобы убедиться, что у него никогда не было навыков кодирования, в которых вы нуждались все время.

6.1 Какой тест по программированию на C или C++ выбрать?

При поиске оценочного онлайн-теста C или C++ вы должны убедиться, что они соответствуют следующим критериям.
  • Они отражают реальную работу.
  • Они не занимают слишком много времени кандидатов, максимум один-два часа.
  • Они могут быть отправлены автоматически и могут быть приняты в любом месте.
  • Они выходят за рамки проверки того, работает ли решение, чтобы также проверить качество кода и насколько хорошо он работает в пограничных случаях.
  • Они максимально приближены к естественной среде программирования и позволяют кандидату получать доступ к тем ресурсам, с которыми они обычно работают.
  • Они позволяют кандидату использовать все библиотеки, фреймворки и другие инструменты, которые он обычно использует.
  • Они находятся на должном уровне, который соответствует возможностям кандидата.


7. Devskiller — готовые к использованию онлайн-тесты для оценки написания кода на C и C++

Тесты кодирования Devskiller используют нашу методологию RealLifeTestingTM, чтобы отразить реальную среду кодирования, в которой работает ваш кандидат. Вместо того, чтобы использовать неясные алгоритмы, тесты Devskiller требуют от кандидатов создания приложений или функций. Они классифицируются полностью автоматически и могут быть получены в любой точке мира. В то же время кандидат имеет доступ ко всем ресурсам, которые он обычно использует, включая библиотеки, фреймворки, StackOverflow и даже Google.

Компании используют Devskiller для тестирования кандидатов, используя свою собственную кодовую базу из любой точки мира. Чтобы упростить задачу, Devskiller также предлагает несколько готовых тестов на C и C ++, подобных приведенным здесь.

Поздравляем всех с наступающими праздниками и, по устоявшейся традиции, ждем ваши комментарии!

Комментарии (0)