Но в отличие от технологий, о которых заговорили все заголовки, C и C ++ продолжают оставаться рабочими лошадками для многих важных систем, а также для таких областей, как встроенные технологии и игры. В результате по-прежнему на них существует большой спрос. Возникает вопрос: как проверить навыки
программистов C и C ++?
И C, и C ++ существуют уже давно, так что о них есть чему поучиться. Для этих стеков технологий созданы разные версии, технологии и ресурсы. Вам нужно использовать определенные вопросы для собеседований на C и C ++, поскольку те, которые вы используете для таких языков, как Java, просто не помогут. Есть концепции, которые вы просто не увидите вне 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 довольно близок к машинному уровню и иногда упоминается как «портативный ассемблер». C ++, с другой стороны, ближе к языкам более высокого уровня, таким как Java, C # и D (хотя по-прежнему сохраняет некоторые низкоуровневые функции C).
1.2. Чем похожи C и C ++?
Помимо этих различий, безусловно, есть некоторые сходства. Синтаксис, используемый обоими этими языками, часто называют «синтаксисом семейства C». Поскольку C был настолько популярен, вы фактически обнаружите, что грамматика и синтаксис C являются основой для ряда языков программирования, таких как Java, C #, C ++, D, Objective-C, JavaScript и многих других.
2. Для чего используются C и C ++?
2.1. Для чего используется C? Поскольку они настолько близки к машинному уровню, C и C ++ в основном используются для приложений, где скорость обработки и ручная настройка более важны, чем время разработки. К ним относятся низкоуровневое программирование (BIOS), встроенное программирование (устройства), системное программирование (операционные системы) и ориентированное на производительность программирование (например, игровые движки, GPU / научные вычисления, криптография).
Реальное преимущество C и C ++ заключается в том, что он дает программисту возможность сказать, что происходит с программой на самом низком уровне, ближайшем к машинному. С одной стороны, это дает C и C ++ невероятную производительность. Обратной стороной этого является то, что существует гораздо меньшая погрешность для правильного написания кода, поскольку в них отсутствует функция управления памятью языков более высокого уровня. Практически это означает, что для написания рабочего кода на C и C ++ может потребоваться гораздо больше времени, чем на языке программирования более высокого уровня, таком как Java или Python.
Поскольку C так близок к машинному уровню, это, по сути, лингва-франка мира программирования. Большинство других языков программирования построены с использованием C, и большая часть программного обеспечения предоставляет свои функции на C. Почти все другие языки могут вызывать функции C.
На базовом уровне Си довольно легко выучить. Его синтаксис и грамматика довольно просты для изучения основ, но их сложно освоить. В отличие от других языков, в C отсутствуют инструменты, которые снимают нагрузку с загруженной работы, которой разработчик обычно хотел бы избежать.
2.2. Для чего используется C++? 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++, с другой стороны, начинает прогрессировать после того, как за последнее десятилетие мало что сделал. Теперь каждые три года с момента выхода C ++ 11 выпускается ревизия, причем ожидается, что C ++ 20 выйдет вовремя.
Почти все доступные библиотеки предоставляют C API или привязку, даже если они написаны на другом языке. C ++ можно использовать для всех этих библиотек. Есть также некоторые библиотеки только для C ++, такие как Boost, Qt и POCO.
3.1. С какими инструментами и методами должен быть знаком разработчик на C или C ++? Вероятно, наиболее важным для разработчика C является понимание арифметики указателей и того, что составляет неопределенное поведение. Кроме того, разработчик на C должен уметь использовать инструменты отладки, такие как Address / Memory / UndefinedBehavior Sanitizer, Valgrind, отладчики (например, GDB) и инструменты статического анализа кода.
Разработчик C ++ должен быть в состоянии понимать все инструменты C, а также библиотеки Boost и Qt, достаточно хорошо, чтобы иметь возможность их использовать.
Кроме того, если посмотреть на опыт разработчиков, коммерческие проекты и проекты с открытым исходным кодом больше всего говорят о том, на что они способны.
4. Оценка разработчика C или программиста C++ по их резюме. Резюме - это первое место, где вы можете найти подсказки о том, на что способен ваш кандидат. Для нетехнического рекрутера это часто может быть трудным местом для начала, поскольку информация часто носит технический характер. Чтобы помочь вам, мы составили список вещей, которые нужно искать в резюме разработчика C и C ++.
4.1. Глоссарий C и C ++ для технических рекрутеров
C библиотеки: Стандартная библиотека C: Библиотека, описанная в стандартном документе C, поставляется с каждым компилятором
Другие, менее широко используемые, но все же популярные библиотеки:
GTK: Библиотека для создания графических пользовательских интерфейсов
Cairo: Библиотека 2d графики
ALSA: Библиотека для взаимодействия с Advanced Linux Sound Architecture
BLAS: Основные подпрограммы линейной алгебры. Эта библиотека используется для эффективных векторных и матричных операций
GMP: GNU Multi Precision. Библиотека, обеспечивающая арифметические операции над числами произвольной точности
cURL: Библиотека многопротокольной передачи файлов. Чаще всего используется для HTTP-коммуникаций
OpenSSL: Коммерческая и очень популярная библиотека, используемая для поддержки криптографии.
Библиотеки C ++
Стандартная библиотека C ++: Библиотека, описанная в стандартном документе C ++, поставляется с каждым компилятором.
Boost: Одна из самых популярных библиотек для C ++, набор из нескольких десятков отключенных библиотек, которые можно свободно использовать в программах на C ++.
Qt: Фреймворк GUI для C ++
STL: Спорный акроним, который обычно означает стандартную библиотеку C ++, но понимается как стандартная библиотека шаблонов , как если бы части, не являющиеся шаблонами, не были ее частью.
Eigen: Библиотека шаблонов C ++ для линейной алгебры (матрицы, векторы, числовые решатели и связанные алгоритмы)
GSL: Рекомендации Поддержка реализации библиотеки, рекомендованная Бьярном Страуструпом, Хербом Саттером и компанией в C ++ Core Guidelines
Loki: шаблоны проектирования
Folly: Набор компонентов C ++ 11, расширяющих стандартную библиотеку. Создан с учетом эффективности и практичности. Разработано Facebook
Abseil: Коллекция библиотек C ++, расширяющая стандартную библиотеку. Создано Google
POCO: Набор библиотек, поддерживающих HTTP, сеть, шифрование и поддержку zip-файлов.
WxWidgets: Библиотека, позволяющая создавать независимые от системы приложения с графическим интерфейсом.
OpenCV: Библиотека компьютерного зрения, разработанная для повышения вычислительной эффективности с акцентом на приложениях реального времени.
OpenMP: Меньше библиотеки и больше спецификации для компиляторов, как расширить C ++, чтобы обеспечить простой и хорошо продуманный параллелизм
IntelTBB: Библиотека шаблонов для параллелизма задач. Разработано Intel
Компилятор: Самый популярный инструмент, используемый для создания исполняемого файла ( приложения ) из исходного кода C / C ++:
- GCC - Сборник компиляторов GNU
- MinGW GCC - версия GCC для Windows
- Clang - компилятор проекта LLVM
- MSVC (также называется, несколько неправильно, MSVS или Visual Studio) - компилятор Microsoft
- ICC - компилятор Intel
Отладчик: Инструмент для поиска ошибок в запущенных программах
Инструментарий кода: Это расширение компилятора для создания версии приложения, нацеленной на поиск ошибок, а не на производительность: Address/Memory/UndefinedBehavior Sanitizer
Статический анализ: Анализ исходного кода на наличие ошибок. Существует коммерческое программное обеспечение, которое может таким образом находить некоторые классы ошибок.
- CppCheck
- Clang
- Klocwork Static Code Analysis
- PC-Lint
- Coverity
- PVS-Studio
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
- С ++ 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 ++) Какие ограничения были у ваших предыдущих проектов?
Кандидат должен иметь возможность поделиться своим опытом работы в данной отрасли. Например, во встроенном программировании сложно использовать динамическую память, а для игр очень важно обеспечить завершение всех вычислений к моменту рендеринга одного кадра.
В2: (C / C ++) Для каких систем вы программировали?
В некотором смысле программирование для Embedded / Desktop и Linux / Windows / OSX сильно отличается.
В3: (C / C ++) Придерживались ли вы при программировании каких-либо конкретных стандартов?
Кандидат может сказать вам, есть ли у него опыт работы с MISRA и т. Д.
5.2. Вопросы о знаниях и мнениях кандидата В1: (C ++) Каковы основные различия между C ++ и C?
Этот вопрос позволит кандидату продемонстрировать свое понимание языков, а также то, относятся ли они к C ++ как к небольшому дополнению к языку C или как к отдельному языку с различными шаблонами использования.
В2: (C) Что такое арифметика указателей?
Это в основном для C. Этот вопрос позволит кандидату выразить свое понимание фундаментального способа, которым C работает с памятью.
В3: (C ++) Что такое арифметика указателей?
Этот вопрос даст кандидату возможность выразить свое понимание фундаментального способа, которым C работает с памятью. Осторожно: для C ++ этот вопрос подразумевает использование небезопасных и устаревших шаблонов в вашей кодовой базе.
В4: (C ++, начальный уровень) В чем разница между классом и объектом?
Чтобы определить, понимает ли кандидат основы C ++.
В5: (C ++) Что такое лямбда выражение?
Чтобы определить, знает ли кандидат об улучшениях, достигнутых C ++ после C ++ 03 (лямбда-выражения были введены в C ++ 11), и понимает ли их.
В6: (C / C ++) Что такое блокировки, какие проблемы они решают и каковы потенциальные проблемы с ними?
Это покажет понимание кандидатом блокировок, условий гонки, взаимоблокировок и живых блокировок.
В7: (C / C ++, эксперт) Что такое volatile и как оно соотносится с вопросом о блокировках и синхронизации?
Кандидат должен уметь сказать, что энергозависимость должна использоваться только для доступа к оборудованию, а не для синхронизации.
В8: (C ++) Как создать динамический массив?
Это покажет, будет ли кандидат использовать хороший подход, такой как std :: vector , или устаревший и небезопасный новый .
В9: (C ++) Что такое RAII? Есть ли это на других языках?
Это покажет, знает ли кандидат эту фундаментальную идиому C ++ и понимает ли он, что это означает. Бонусные баллы за описание аналогичных дополнительных функций на других языках, например with () в Python или использование в C #.
В10: (C ++) Можно ли выбросить из деструктора?
Кандидат сможет уточнить детали здесь. Суть в том, что вы можете, но это плохая практика, и она отключена по умолчанию, начиная с C ++ 11, поскольку деструкторы в этом случае неявно не срабатывают .
В11: (C ++) Можете ли вы унаследовать конструктор?
Кандидат может ответить, что это возможно, начиная с C ++ 11, незначительное изменение способа его работы в C ++ 14 и последствия этого изменения.
В12: (C ++) У вас есть виртуальный конструктор?
Краткий ответ - нет, но кандидат может продемонстрировать свое быстрое мышление, упомянув фабричные и прототипные шаблоны.
В13: (C ++) Что такое интерфейс?
Это вопрос с подвохом, потому что C ++ не имеет интерфейсов. Однако в нем есть абстрактные классы, и кандидат должен говорить о них.
В14: (C ++, эксперт) Можно ли реализовать чисто виртуальную функцию?
Да, но удобство использования ограничено.
В15: (C ++, эксперт) Можно ли использовать функцию виртуального шаблона и почему?
Кандидат сможет продемонстрировать свое понимание разницы между временем компиляции и времени выполнения, а также детали реализации, такие как vtables .
В16: (C ++, эксперт) Как бы вы реализовали std :: is_same ?
Программист сможет продемонстрировать свои знания в области метапрограммирования, реализовав этот тривиальный пример.
В17: (C / C ++) Какое изменение (или ряд изменений) в C nn / C ++ nn вам больше всего нравится ?
Чтобы показать, успевает ли кандидат за изменениями в языке (ах), и знает ли он о немного разных идиомах кодирования в разных версиях языка.
В18: (C ++) В чем разница между C ++ 98 и C ++ 11?
C ++ 11 стал серьезным сдвигом в языке C ++, его парадигмах и шаблонах. Кандидат сможет продемонстрировать свои знания об этом важном изменении.
В19: (C / C ++) Как бы вы обнаружили и исправили ошибку повреждения памяти?
Показать мыслительный процесс, знания и инструменты, полезные в таких усилиях.
В20: (C / C ++) У вас есть опыт использования пользовательских распределителей?
Кандидат сможет поделиться своим опытом с пользовательскими распределителями.
В21: (C / C ++) В вашем резюме есть фреймворк / библиотека X, опишите свой опыт работы с ней. Было ли использование хорошим выбором? Есть ли альтернатива, которую вы предпочли или предпочли бы сейчас?
Это открытый вопрос, позволяющий рекрутеру узнать, имеет ли кандидат широкое представление о полях, знает ли альтернативы и понимает ли компромиссы, принимаемые при выборе того или иного решения.
В22: (C / C ++) Какая система сборки вам больше нравится и почему? Как это по сравнению с конкурентами?
Почему вам следует задать вопрос 22: это покажет знания кандидата о системах сборки.
5.3. Поведенческие вопросы, которые следует задать, чтобы понять, как кандидат действовал в прошлом.
В1: Какова ваша самая большая история успеха в программировании? Почему так случилось? Как это повторить?
Этот вопрос позволит кандидату рассказать историю успеха и покажет рекрутеру, заинтересован ли кандидат в решении проблемы или в получении похвалы.
В2: Какая была ваша самая большая ошибка в программировании? Почему так случилось? Как избежать повторения этого в будущем?
Этот вопрос позволит кандидату рассказать потенциально тревожную историю и покажет рекрутеру, открыто ли кандидат в этом вопросе. Это дополнительно покажет, заинтересованы ли они в решении проблемы или в перекладывании вины.
В3 (для более старших вам нравится -уровни заявителей) О, если бы наставник младшего разработчика? Почему? Как бы вы это сделали? Есть ли у вас опыт наставничества других людей?
Это позволит рекрутеру оценить интерес кандидата и необходимые мягкие навыки, необходимые для обмена знаниями.
6. Техническая проверка навыков разработчиков C или C ++ с помощью онлайн-теста кодирования. С разработчиками C и C ++ вы должны быть абсолютно уверены в том, что очень важно, чтобы они обладали безупречными навыками программирования. C не допускает никакой погрешности, а C ++ не допускает гораздо большего. Конечно, экран резюме и экран телефона могут помочь вам отсеять некоторых из ваших кандидатов. Тем не менее, последнее, что вы хотите сделать, - это пригласить кандидата на техническое собеседование только для того, чтобы обнаружить, что у него никогда не было необходимых вам навыков программирования.
6.1 Какой онлайн-тест на программирование на C или C ++ выбрать? При поиске подходящего онлайн-теста C или C ++ вы должны убедиться, что он соответствует следующим критериям.
- Они отражают реальную проделанную работу
- Они не отнимают у кандидатов слишком много времени, максимум 1-2 часа.
- Их можно отправлять автоматически и брать с собой куда угодно
- Они выходят за рамки проверки того, работает ли решение, а также проверяют качество кода и насколько хорошо он работает в крайних случаях.
- Они максимально приближены к естественной среде программирования и позволяют кандидату получать доступ к тем ресурсам, с которыми он обычно работает.
- Они позволяют кандидату использовать все библиотеки, фреймворки и другие инструменты, которые он обычно использовал бы.
- Они находятся на должном уровне, соответствующем способностям кандидата