Джеймс Гослинг как‑то сказал, что Java — это C++, из которого убрали все пистолеты, ножи и дубинки, однако практика показывает, что «ножи и дубинки» становятся классным инструментом в руках опытных разработчиков. В общем, немалая часть проклятий в адрес C++ объясняется элементарным «вы просто не умеете его готовить». Мы в «Лаборатории Касперского» умеем готовить «плюсы» и поэтому любим их. C++ — низкоуровневый язык, который позволяет работать с железом и писать быстрый код и при этом содержит массу возможностей. В экосистеме «плюсов» куча проработанных паттернов, best practices и готовых библиотек под разные задачи. Язык динамично развивается — но сохраняет обратную совместимость.

В этой статье мы с помощью карты покажем, какие навыки и знания нужны разработчику на C++. Естественно, разбирать путь развития «плюсистов» будем на собственном примере — тем более что у нас в «Лаборатории Касперского» много очень разных проектов с отличающимися задачами. Однако наша карта по большей части универсальна и будет полезна всем, кто хочет развиваться в разработке на C++.


В этой карте мы разбили по блокам навыки, которые считаем необходимыми для реальной коммерческой разработки на C++, и показали, для каких задач и продуктов подходят их разные сочетания. За точку отсчёта приняли отличное знание C++: когда разработчик знает нюансы и тонкости языка и понимает, как он работает. Этот опыт формируется за 3–4 года работы с C++ на реальном проекте.

Что будет в статье

Для начала расскажем, из каких блоков состоит карта, потом более подробно рассмотрим каждый блок и чем занимаются разработчики на разных проектах и в разных продуктах.

Что входит в эту схему

Общие знания и навыки

Какое бы направление работы ни выбрал разработчик на C++, всегда будет универсальный набор знаний и навыков, без которых не обойтись. Каждый «плюсист» должен знать основы языка и Computer Science, писать хороший код, грамотно работать с многопоточкой и иметь базовый набор софт‑скиллов для комфортного взаимодействия с командой.

Отличное знание C++ 

Это как раз об универсальной основе. По нашему опыту, многие разработчики пишут на C++ так, как будто это условный C#, — то есть совсем не погружаясь в тонкости языка и не зная, как он работает «под капотом». C++ — это язык для низкоуровневых задач, который выбирают за возможность быть ближе к железу и оптимизировать скорость выполнения кода. А значит, доскональное понимание того, как на самом деле работает язык, на чём он основан, как исполняется код, совершенно необходимо. 

Это подразумевает, что разработчик знает и понимает:

  • как устроены и чем отличаются структуры данных, какие проблемы они решают и какую из них стоит использовать в той или иной задаче; 

  • как внутри устроены стандартные контейнеры std::vector, std::string, std::list, std::map;

  • как работают исключения, какие у них есть преимущества и недостатки;

  • современные стандарты C++ — 17 и 20. Необходимо не только знать их, но и уметь обоснованно применять на практике нововведения языка. То есть там, где это действительно необходимо и помогает сделать код лучше; 

  • разницу между design-, compile- и runtime — а также не боится шаблонов.

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

Алексей Тотмаков

(@atotmakov) Head of Core Technologies and B2B Development, «Лаборатория Касперского»

Умение писать код

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

Вот какие моменты мы стараемся проверить на интервью:

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

  • Соответствие принципам KISS. Хороший код — простой код. Излишнее усложнение ведёт к проблемам поддержки кодовой базы. Да и на код-ревью разбирать такой код и отлавливать ошибки будет гораздо сложнее. Что опять же приведёт к необходимости скорого рефакторинга и багам в продукте. 

  • Умение упрощать и декомпозировать сложные задачи. Проще изготовить 500 стандартных кирпичей и сложить из них стену, чем произвести один большой пятисоткратный кирпич. То же и с программированием: сложные недекомпозированные задачи влекут за собой сложный некрасивый код и неудачные архитектурные решения.

  • Умение разбивать код на сущности. Собственно, стандартное требование ООП: функции и классы не должны решать посторонних задач (Single-responsibility principle), но и не должны быть слишком «специализированными». Обе ошибки усложняют чтение и понимание кода, делают его плохо поддерживаемым и потенциально забагованным.

  • Умение понятно именовать сущности. В идеале по названию функции должно быть понятно, что она делает (даже без комментариев), по названию класса — какое место в иерархии он занимает, какие свойства и методы объекта может описывать, по названию переменной — что в ней хранится и для чего она вообще нужна.

Работа с многопоточными приложениями

Самое важное в работе с многопоточкой — это внимательность и умение смотреть на задачу в целом, а не на отдельные её блоки. Необходимо чётко понимать, какие операции в коде стоит защищать, а какие — необязательно (область действия «лочки» должна быть минимально возможной). Пригодится и знание сложных примитивов синхронизации — однако применяя их, особенно важно помнить о принципе KISS.

Опыт коммерческой разработки

Увы, без этого никак не отработать важные для профессионального программиста навыки: отлавливание ошибок в коде, работа итерациями, понимание требований к продукту, умение поддерживать продукт после релиза.

С опытом коммерческой разработки всё может быть довольно гибко — тут многое зависит от кандидата. Да, в среднем понадобится опыт от двух лет. Однако бывает, что на собеседование приходят люди с двадцатилетним стажем и не подходят нам, а бывает, что приходит стажёр-студент старших курсов — и к окончанию института уже становится крепким мидлом.

Алексей Тотмаков

(@atotmakov), Head of Core Technologies and B2B Development, «Лаборатория Касперского»

Универсальные требования

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

  • знание базовых алгоритмов и структур;

  • хороший технический английский;

  • софт-скиллы. Тут достаточно просто «взрослого» подхода к работе: предупреждать заранее, если что-то не получается сделать в оговорённый срок, не замалчивать личные и рабочие проблемы и т. п. 

На этом заканчивается блок универсальных знаний и навыков, который необходим для работы в любом нашем продукте. Эти навыки — общие для всех, но их уже достаточно, чтобы попасть в направления:

Знания и навыки разработки под разные операционные системы

Разница между операционками на уровне прикладного программиста — не очень большая. А знания, полученные на одной платформе, легко конвертируются в другую: например, у нас есть опыт, когда разработчики, писавшие драйверы и низкоуровневые компоненты под Windows, безболезненно переходили на Mac-направление. 

С библиотеками примерно то же самое — например, знание специфических Win-библиотек типа MFC, ATL, WinSock вряд ли понадобится. Чаще всего мы используем универсальные библиотеки, подходящие для разных операционок (например, STL или Boost), а задачи у прикладных программистов универсальные: многопоточность, межпроцессное взаимодействие.

Windows

С WinAPI и пониманием Windows ситуация неоднозначная: в некоторых командах достаточно знаний на уровне продвинутого пользователя операционки, в других — понадобится глубокое знание WinAPI, а командах, которые разрабатывают драйверы и исследуют вредоносное ПО, надо понимать устройство Windows в мельчайших деталях. Но независимо от команды точно понадобится умение работать с WinDbg и PerfLog.

Чтобы лучше изучить подкапотное устройство Windows и то, как писать драйверы под Win-системы, я бы порекомендовал, классику жанра — «Внутреннее устройство Microsoft Windows. Основные подсистемы ОС» Алекса Ионеску и Дэвида Соломона. Что касается WinAPI, то тут я не могу посоветовать чего-то конкретного — нет какой-то книги, которая отвечает на все вопросы. Однако есть ряд ресурсов, которые очень пригодятся: например, специализированные форумы на msdn, онлайн «Книгу внутренних компонентов Windows» и поизучать раздел Sysinternals на сайте Microsoft.

Алексей Тотмаков

(@atotmakov), Head of Core Technologies and B2B Development, «Лаборатория Касперского»

В каких продуктах нужны эти знания и навыки:

Linux

Linux — стандарт для серверов, да и на десктопах он встречается часто. Поэтому у нас есть продукты и для этой операционки. Кстати, мы делаем его под разные аппаратные платформы, в том числе x86, ARM и «Эльбрус» (а разработка под разные аппаратные платформы — крутой опыт любого «плюсовика»).

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

В каких продуктах нужны эти знания и навыки:

macOS

Ситуация с разработкой под macOS похожа на разработку под Linux и Windows: хотя обычно программирование под macOS подразумевает использование нативных Objective-C и Swift, в реальности нам никуда не деться от от C++ — всё-таки это основной язык для наших продуктов и переписывать логику продукта на Swift просто потому, что это нативно, конечно же, никто не станет. 

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

Именно поэтому бизнес-логику, системные перехват и интеграцию выгодно писать на C++, а нативный стек Apple использовать только там, где без него не обойтись: пользовательский интерфейс, интеграция с системными интерфейсами. Есть и ещё одна особенность: у Swift отсутствует интероп с C++, а значит, не обойтись и без старичка Objective-C.

В каких продуктах нужны эти знания и навыки:

Работа с железом

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

Здесь можно поучаствовать в разработке ядра KasperskyOS. 


Какие продукты пилим

Общие компоненты защиты для всех пользовательских продуктов

Это ядро всей защиты продуктовой линейки «Лаборатории Касперского». За этим направлением стоит CoreTech — R&D-направление, которое выстраивает фундамент для всех продуктов компании. Внутри CoreTech — несколько команд, каждая со своими задачами. Объединяет их то, что они пишут кросс-платформенный код, который переиспользуется в продуктах под все операционные системы: 

  1. Traffic processing. Команда анализирует трафик на машине конечного пользователя, предоставляет удобные интерфейсы для работы с ним, и разрабатывает компоненты защиты на базе этих интерфейсов. Результат работы команды: анализаторы сетевых протоколов (SSL, HTTP/1.1, HTTP/2, HTTP/3, QUIC, WebSocket, IMAP, POP3 и т. п.), веб-антивирус, антиспам, почтовый антивирус, родительский контроль, защита от фишинга.

  2. Crypto. Команда пишет решения для криптографической защиты информации, которые работают в различных средах выполнения: пользовательский режим ОС, режим ядра, Preboot. Разработчики анализируют подписи файлов различных форматов, создают собственный стандарт подписи на основе ГОСТов, пишут крипто-подсистему для KasperskyOS, занимаются сертификацией и реализуют стандарты PKCS11, PKI, FIPS.

  3. Instrumental PDK. Команда разрабатывает библиотеки C++ общего характера, в том числе платформенно-зависимые. Например, внутреннюю библиотеку стандартных примитивов, собственные фреймворки, которые связывают компоненты во всех продуктах и универсальные компоненты для обновления антивирусных баз.

Откликнуться на вакансию можно по ссылке.

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

Консоль безопасности

Основной продукт — Kaspersky Security Center. Это консоль для удобного управления безопасностью на уровне предприятия, то есть такой аналог ЦУПа для сложных IT-систем. Security Center охватывает все платформы: облачные, физические, виртуальные машины и мобильные устройства. Основные задачи:

  • разработка транспортной подсистемы;

  • разработка подсистемы управления патчами и обновлениями.

Откликнуться на вакансию можно по ссылке.

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

Продукты и драйверы под Windows

Основное и самое большое направление. Это и общая для всех продуктов кодовая база, и драйверы под Windows, и виндовые продукты вроде Kaspersky Endpoint Security и Kaspersky Anti-Virus (кстати, это разные решения: первое предназначено для бизнеса, а второе — для личного использования). Windows по-прежнему остаётся платформой, на которую так или иначе равняются решения под остальные ОС: это основа всех приложений и идей, локомотив продуктовой линейки Kaspersky. Разработчикам приходится постоянно разбирать системные и продуктовые дампы, писать User-Mode-компоненты, драйверы, бизнес-логику, новые продуктовые фичи.

Откликнуться на вакансии можно по ссылкам:

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Windows

Продукты и драйверы для Linux

Под Linux у нас сразу несколько продуктов. Основной — это Kaspersky Endpoint Security (KES) для Linux, рассчитанный на рабочие станции и серверы в малом и среднем бизнесе. Внутри продукта есть несколько команд разработки, которые пишут как сам Linux-клиент, опираясь на наработки и кросс-платформенную кодовую базу основного продукта, так и драйверы под Linux. Причём приложение работает на разных архитектурах: x86, ARM и «Эльбрус».

Другой — Kaspersky Secure Mail Gateway для Linux. Он дистанционно управляет IT-инфраструктурой и защищает серверы электронной почты от угроз: спама, фишинга, вредоносных вложений. KSMG имеет кластерную архитектуру для удобства масштабирования и централизованного управления всеми серверами кластера через веб-интерфейс. А также значительно большее, чем у коллег, количество фичей в продукте. Из особенностей работы над KSMG — необходимость кодить на Python, обеспечение совместимости продукта с различными почтовыми серверами (Postfix, Exim, Sendmail), встраивание open-source-программ в комплексное решение на базе Linux, обеспечение совместимости продукта с различными дистрибутивами Linux.

Какие ещё задачи решают команды:

  • разработка новой логики приложения (да, у приложений под Linux есть свои уникальные фичи — а не только переиспользование общей кодовой базы);

  • написание автотестов и unit-тестов для нового функционала;

  • поддержка выпущенных версий продукта;

  • анализ дампов системы и самого KES, работа над стабильностью и производительностью продукта;

  • мониторинг и визуализация состояния сети.

Откликнуться на вакансии можно по ссылкам:

  • разработка системы автоматизированной защиты рабочих станций;

  • разработка комплексной системы защиты почтовых серверов;

  • разработка системы мониторинга и визуализации состояния сети.

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Linux

Продукты и драйверы для macOS

Основной продукт — Kaspersky Endpoint Security для Mac. Задачи — как и у команд клиента и драйверов под Linux, только работа идёт исключительно с платформой Mac. Хотя тут есть и разные архитектуры процессоров (и x86, и пару лет назад завезённый в десктопы и ноутбуки ARM). Как и в линуксовых командах, команда разработки под Mac добавляют в продукт свои уникальные фичи, разбирают и анализируют дампы системы и KES, пишут тесты и поддерживают уже выпущенные версии ПО.

Откликнуться на вакансию можно по ссылке

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, macOS

Ядро KasperskyOS

В этом проекте разработчики создают собственную защищённую микроядерную операционную систему KasperskyOS (не очередной форк Linux, а ОС с собственным ядром), да ещё и под разные платформы. Она используется в IoT, VDI, транспорте, корпоративных мобильных устройствах. Тут уже понадобится не только C++, но и Си с Ассемблером для следующих задач:

  • прототипирование решений;

  • написание отдельной, real-time-версии системы;

  • разработка и имплементация компонент для промышленной разработки ПО;

  • подготовка набора тестов для верификации разработанных решений;

  • разработка и ревью архитектуры;

  • подготовка набора тестов (юнит, фаззинг) для верификации разработанных решений;

  • анализ и улучшение эффективности, стабильности, безопасности и масштабируемости разрабатываемых решений.

Откликнуться на вакансии можно по ссылкам:

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

Драйверы для KasperskyOS

Разработка драйверов для KasperskyOS под разные устройства — самостоятельное направление в рамках разработки операционной системы. Это продуктовое направление делает так, чтобы KasperskyOS работала на самом разном железе, а также занимается системными сервисами и библиотеками. 

Здесь от программистов требуется умение разрабатывать ПО под разные аппаратные платформы, что тянет за собой знание не только C++, но и более низкоуровневых C и Ассемблера, деталей аппаратной реализации различных компонентов современных вычислительных систем (видеокарты, процессоры, оперативная память и т. п.). 

Откликнуться на вакансию можно по ссылке.

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

Продукты для KasperskyOS

ПО под KasperskyOS и SDK для партнёров, которое позволяет создавать новые собственные продукты под эту операционку или интегрировать уже существующие решения. Задача того же уровня сложности, которую в своё время решали Apple и Google, разрабатывая для своих мобильных платформ как ПО, так и SDK для сторонних разработчиков. Только у KasperskyOS больше платформ, версий и типов устройств.

Собственное ПО пишется для разных направлений: 

  • встроенная безопасность (in-chip security), 

  • мобильные устройства, 

  • тонкие клиенты, 

  • интернет вещей и промышленный интернет вещей (Connected Industry, умные города),

  • электроэнергетика.

Откликнуться на вакансии можно по ссылкам:

  • разработка безопасного шлюза для электронных блоков автомобиля;

  • разработка безопасной платформы для IoT и embedded-устройств с поддержкой облачных платформ;

  • разработка мобильной версии KasperskyOS для разных устройств.

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

Система контентной фильтрации

Это направление покрывает все задачи, связанные с безопасностью в текстах, — защита от спам-писем, переходов по фишинговым ссылкам, родительский контроль. Для этого приходится детектировать аномалии в поведении пользователя, искать shadow-it-сервисы, плотно заниматься защитой персональных данных пользователя. Всё это портируется на Win, Linux, BSD. 

Компоненты CFR в основном реализованы на современных стандартах языка C++. Сборка компонент происходит в распараллеленной среде под самые различные win*/*nix платформы и архитектуры процессоров. Они интегрируются в продукт в виде плагинов, которые можно обновлять «на горячую» без обновления самого продукта (кстати, эти плагины как раз основаны на тех самых «универсальных компонентах для обновления антивирусных баз», которые входят в блок «Общие компоненты защиты», универсальные для всех платформ). Бизнес-логика, ответственная за детектирования, реализована в виде набора скриптов и обновляется тоже отдельно и независимо от самих компонент. Задачи разнообразные:

  • работа над перформансом (скорость/потребление ram и т. д.);

  • применение эффективных алгоритмов поиска сигнатур;

  • поддержка скриптов бизнес-логики, интерфейсов между движком и скриптами;

  • интеграция в продукты на различных ОС (Win, Linux, BSD);

  • сетевое low-level-взаимодействие;

  • парсинг различных форматов (MIME, HTML, RichText, TNEF и т. д.).

Откликнуться на вакансию можно по ссылке.

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Windows, Linux

Модуль эвристического анализа

Главный продукт — System Watcher. Это компонент проактивной защиты, который на лету определяет трояны, эксплойты и шифровальщики по шаблонам поведения, а также умеет восстанавливать пользовательские файлы и реестр после заражения. У System Watcher есть версии для Windows, Linux и macOS. Помимо разработки новых версий модуля, разработчики занимаются и поддержкой уже выпущенных версий.

Откликнуться на вакансию можно по ссылке.

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Windows/Linux/macOS

Компонент безопасности для виртуальных сред

Легкий агент — это решение для защиты облаков и виртуальных сред под платформы VMware vSphere, Microsoft Hyper-V, Citrix XenServer и KVM и интерфейс для более удобного управления компонентами защиты. Разработчики создают продукт, пишут новые фичи и поддерживают существующий код на C++. Ещё одно большое направление — разработка базовых кроссплатформенных компонентов защиты под различные типы ОС.

Откликнуться на вакансию можно по ссылке

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Linux

Kaspersky Security Network

Kaspersky Security Network объединяет распределённую по всему миру инфраструктуру: несколько дата-центров и сотни серверов, включая виртуальные в публичных облаках. Через неё проходят аналитические данные об угрозах, которые затем преобразуются, актуализируются и используются в остальных наших продуктах. Команда KSN должна обеспечить обработку полутора миллионов запросов в секунду (медианное значение) и трафика в 5000 Тб данных в месяц, а также оперативно разбираться с запросами от продуктовых команд. Серверы работают на Linux, внутри используется несколько языков под разные задачи, но основной — C++ 17.

Основные задачи команды:

  • Оптимизация кода для того, чтобы ПО более рационально использовало ресурсы серверного оборудования.

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

Требуется понимание принципов работы интернета и основные протоколы, так как иногда приходится отлаживать крайне интересные и занятные вещи: все простые баги мы уже починили :) 

Откликнуться на вакансию можно по ссылке

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


Всем спасибо за внимание!

C++ несмотря на все шуточки про выстрелы в ноги, в том числе и от самого Бьерна Страуструпа, остаётся мощным и незаменимым инструментом для системного программирования. Разработка на нём идёт быстрее, чем на C и Ассемблере, при этом язык позволяет напрямую управлять памятью и работать с железом. К тому же при должной квалификации программистов код получается вполне безопасным и даже красивым. Именно поэтому он стал основной для системного программирования в KasperskyOS.

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

Конечно, наша карта в первую очередь отражает специфику задач «Лаборатории Касперского» и не включает некоторые направления разработки на C++ вроде компьютерного зрения. Однако она описывает основную часть задач «плюсовиков» и послужит полезным источником информации как для кандидатов, которые хотели бы у нас работать, так и для других компаний, которые задумываются о создании своей карты компетенций. А ещё это практически гимн в честь «плюсов» — языка, на котором уже почти 40 лет держится немалая часть системного ПО и у которого пока так и не смогли забрать корону Go, Rust или Carbon.

Джеймс Гослинг как‑то сказал, что Java — это C++, из которого убрали все пистолеты, ножи и дубинки, однако практика показывает, что «ножи и дубинки» становятся классным инструментом в руках опытных разработчиков. В общем, немалая часть проклятий в адрес C++ объясняется элементарным «вы просто не умеете его готовить». Мы в «Лаборатории Касперского» умеем готовить «плюсы» и поэтому любим их. C++ — низкоуровневый язык, который позволяет работать с железом и писать быстрый код и при этом содержит массу возможностей. В экосистеме «плюсов» куча проработанных паттернов, best practices и готовых библиотек под разные задачи. Язык динамично развивается — но сохраняет обратную совместимость.

В этой статье мы с помощью карты покажем, какие навыки и знания нужны разработчику на C++. Естественно, разбирать путь развития «плюсистов» будем на собственном примере — тем более что у нас в «Лаборатории Касперского» много очень разных проектов с отличающимися задачами. Однако наша карта по большей части универсальна и будет полезна всем, кто хочет развиваться в разработке на C++.


В этой карте мы разбили по блокам навыки, которые считаем необходимыми для реальной коммерческой разработки на C++, и показали, для каких задач и продуктов подходят их разные сочетания. За точку отсчёта приняли отличное знание C++: когда разработчик знает нюансы и тонкости языка и понимает, как он работает. Этот опыт формируется за 3–4 года работы с C++ на реальном проекте.

Что будет в статье

Для начала расскажем, из каких блоков состоит карта, потом более подробно рассмотрим каждый блок и чем занимаются разработчики на разных проектах и в разных продуктах.

Что входит в эту схему

Общие знания и навыки

Какое бы направление работы ни выбрал разработчик на C++, всегда будет универсальный набор знаний и навыков, без которых не обойтись. Каждый «плюсист» должен знать основы языка и Computer Science, писать хороший код, грамотно работать с многопоточкой и иметь базовый набор софт‑скиллов для комфортного взаимодействия с командой.

Отличное знание C++ 

Это как раз об универсальной основе. По нашему опыту, многие разработчики пишут на C++ так, как будто это условный C#, — то есть совсем не погружаясь в тонкости языка и не зная, как он работает «под капотом». C++ — это язык для низкоуровневых задач, который выбирают за возможность быть ближе к железу и оптимизировать скорость выполнения кода. А значит, доскональное понимание того, как на самом деле работает язык, на чём он основан, как исполняется код, совершенно необходимо. 

Это подразумевает, что разработчик знает и понимает:

  • как устроены и чем отличаются структуры данных, какие проблемы они решают и какую из них стоит использовать в той или иной задаче; 

  • как внутри устроены стандартные контейнеры std::vector, std::string, std::list, std::map;

  • как работают исключения, какие у них есть преимущества и недостатки;

  • современные стандарты C++ — 17 и 20. Необходимо не только знать их, но и уметь обоснованно применять на практике нововведения языка. То есть там, где это действительно необходимо и помогает сделать код лучше; 

  • разницу между design-, compile- и runtime — а также не боится шаблонов.

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

Алексей Тотмаков

(@atotmakov) Head of Core Technologies and B2B Development, «Лаборатория Касперского»

Умение писать код

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

Вот какие моменты мы стараемся проверить на интервью:

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

  • Соответствие принципам KISS. Хороший код — простой код. Излишнее усложнение ведёт к проблемам поддержки кодовой базы. Да и на код-ревью разбирать такой код и отлавливать ошибки будет гораздо сложнее. Что опять же приведёт к необходимости скорого рефакторинга и багам в продукте. 

  • Умение упрощать и декомпозировать сложные задачи. Проще изготовить 500 стандартных кирпичей и сложить из них стену, чем произвести один большой пятисоткратный кирпич. То же и с программированием: сложные недекомпозированные задачи влекут за собой сложный некрасивый код и неудачные архитектурные решения.

  • Умение разбивать код на сущности. Собственно, стандартное требование ООП: функции и классы не должны решать посторонних задач (Single-responsibility principle), но и не должны быть слишком «специализированными». Обе ошибки усложняют чтение и понимание кода, делают его плохо поддерживаемым и потенциально забагованным.

  • Умение понятно именовать сущности. В идеале по названию функции должно быть понятно, что она делает (даже без комментариев), по названию класса — какое место в иерархии он занимает, какие свойства и методы объекта может описывать, по названию переменной — что в ней хранится и для чего она вообще нужна.

Работа с многопоточными приложениями

Самое важное в работе с многопоточкой — это внимательность и умение смотреть на задачу в целом, а не на отдельные её блоки. Необходимо чётко понимать, какие операции в коде стоит защищать, а какие — необязательно (область действия «лочки» должна быть минимально возможной). Пригодится и знание сложных примитивов синхронизации — однако применяя их, особенно важно помнить о принципе KISS.

Опыт коммерческой разработки

Увы, без этого никак не отработать важные для профессионального программиста навыки: отлавливание ошибок в коде, работа итерациями, понимание требований к продукту, умение поддерживать продукт после релиза.

С опытом коммерческой разработки всё может быть довольно гибко — тут многое зависит от кандидата. Да, в среднем понадобится опыт от двух лет. Однако бывает, что на собеседование приходят люди с двадцатилетним стажем и не подходят нам, а бывает, что приходит стажёр-студент старших курсов — и к окончанию института уже становится крепким мидлом.

Алексей Тотмаков

(@atotmakov), Head of Core Technologies and B2B Development, «Лаборатория Касперского»

Универсальные требования

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

  • знание базовых алгоритмов и структур;

  • хороший технический английский;

  • софт-скиллы. Тут достаточно просто «взрослого» подхода к работе: предупреждать заранее, если что-то не получается сделать в оговорённый срок, не замалчивать личные и рабочие проблемы и т. п. 

На этом заканчивается блок универсальных знаний и навыков, который необходим для работы в любом нашем продукте. Эти навыки — общие для всех, но их уже достаточно, чтобы попасть в направления:

Знания и навыки разработки под разные операционные системы

Разница между операционками на уровне прикладного программиста — не очень большая. А знания, полученные на одной платформе, легко конвертируются в другую: например, у нас есть опыт, когда разработчики, писавшие драйверы и низкоуровневые компоненты под Windows, безболезненно переходили на Mac-направление. 

С библиотеками примерно то же самое — например, знание специфических Win-библиотек типа MFC, ATL, WinSock вряд ли понадобится. Чаще всего мы используем универсальные библиотеки, подходящие для разных операционок (например, STL или Boost), а задачи у прикладных программистов универсальные: многопоточность, межпроцессное взаимодействие.

Windows

С WinAPI и пониманием Windows ситуация неоднозначная: в некоторых командах достаточно знаний на уровне продвинутого пользователя операционки, в других — понадобится глубокое знание WinAPI, а командах, которые разрабатывают драйверы и исследуют вредоносное ПО, надо понимать устройство Windows в мельчайших деталях. Но независимо от команды точно понадобится умение работать с WinDbg и PerfLog.

Чтобы лучше изучить подкапотное устройство Windows и то, как писать драйверы под Win-системы, я бы порекомендовал, классику жанра — «Внутреннее устройство Microsoft Windows. Основные подсистемы ОС» Алекса Ионеску и Дэвида Соломона. Что касается WinAPI, то тут я не могу посоветовать чего-то конкретного — нет какой-то книги, которая отвечает на все вопросы. Однако есть ряд ресурсов, которые очень пригодятся: например, специализированные форумы на msdn, онлайн «Книгу внутренних компонентов Windows» и поизучать раздел Sysinternals на сайте Microsoft.

Алексей Тотмаков

(@atotmakov), Head of Core Technologies and B2B Development, «Лаборатория Касперского»

В каких продуктах нужны эти знания и навыки:

Linux

Linux — стандарт для серверов, да и на десктопах он встречается часто. Поэтому у нас есть продукты и для этой операционки. Кстати, мы делаем его под разные аппаратные платформы, в том числе x86, ARM и «Эльбрус» (а разработка под разные аппаратные платформы — крутой опыт любого «плюсовика»).

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

В каких продуктах нужны эти знания и навыки:

macOS

Ситуация с разработкой под macOS похожа на разработку под Linux и Windows: хотя обычно программирование под macOS подразумевает использование нативных Objective-C и Swift, в реальности нам никуда не деться от от C++ — всё-таки это основной язык для наших продуктов и переписывать логику продукта на Swift просто потому, что это нативно, конечно же, никто не станет. 

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

Именно поэтому бизнес-логику, системные перехват и интеграцию выгодно писать на C++, а нативный стек Apple использовать только там, где без него не обойтись: пользовательский интерфейс, интеграция с системными интерфейсами. Есть и ещё одна особенность: у Swift отсутствует интероп с C++, а значит, не обойтись и без старичка Objective-C.

В каких продуктах нужны эти знания и навыки:

Работа с железом

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

Здесь можно поучаствовать в разработке ядра KasperskyOS. 


Какие продукты пилим

Общие компоненты защиты для всех пользовательских продуктов

Это ядро всей защиты продуктовой линейки «Лаборатории Касперского». За этим направлением стоит CoreTech — R&D-направление, которое выстраивает фундамент для всех продуктов компании. Внутри CoreTech — несколько команд, каждая со своими задачами. Объединяет их то, что они пишут кросс-платформенный код, который переиспользуется в продуктах под все операционные системы: 

  1. Traffic processing. Команда анализирует трафик на машине конечного пользователя, предоставляет удобные интерфейсы для работы с ним, и разрабатывает компоненты защиты на базе этих интерфейсов. Результат работы команды: анализаторы сетевых протоколов (SSL, HTTP/1.1, HTTP/2, HTTP/3, QUIC, WebSocket, IMAP, POP3 и т. п.), веб-антивирус, антиспам, почтовый антивирус, родительский контроль, защита от фишинга.

  2. Crypto. Команда пишет решения для криптографической защиты информации, которые работают в различных средах выполнения: пользовательский режим ОС, режим ядра, Preboot. Разработчики анализируют подписи файлов различных форматов, создают собственный стандарт подписи на основе ГОСТов, пишут крипто-подсистему для KasperskyOS, занимаются сертификацией и реализуют стандарты PKCS11, PKI, FIPS.

  3. Instrumental PDK. Команда разрабатывает библиотеки C++ общего характера, в том числе платформенно-зависимые. Например, внутреннюю библиотеку стандартных примитивов, собственные фреймворки, которые связывают компоненты во всех продуктах и универсальные компоненты для обновления антивирусных баз.

Откликнуться на вакансию можно по ссылке.

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

Консоль безопасности

Основной продукт — Kaspersky Security Center. Это консоль для удобного управления безопасностью на уровне предприятия, то есть такой аналог ЦУПа для сложных IT-систем. Security Center охватывает все платформы: облачные, физические, виртуальные машины и мобильные устройства. Основные задачи:

  • разработка транспортной подсистемы;

  • разработка подсистемы управления патчами и обновлениями.

Откликнуться на вакансию можно по ссылке.

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

Продукты и драйверы под Windows

Основное и самое большое направление. Это и общая для всех продуктов кодовая база, и драйверы под Windows, и виндовые продукты вроде Kaspersky Endpoint Security и Kaspersky Anti-Virus (кстати, это разные решения: первое предназначено для бизнеса, а второе — для личного использования). Windows по-прежнему остаётся платформой, на которую так или иначе равняются решения под остальные ОС: это основа всех приложений и идей, локомотив продуктовой линейки Kaspersky. Разработчикам приходится постоянно разбирать системные и продуктовые дампы, писать User-Mode-компоненты, драйверы, бизнес-логику, новые продуктовые фичи.

Откликнуться на вакансии можно по ссылкам:

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Windows

Продукты и драйверы для Linux

Под Linux у нас сразу несколько продуктов. Основной — это Kaspersky Endpoint Security (KES) для Linux, рассчитанный на рабочие станции и серверы в малом и среднем бизнесе. Внутри продукта есть несколько команд разработки, которые пишут как сам Linux-клиент, опираясь на наработки и кросс-платформенную кодовую базу основного продукта, так и драйверы под Linux. Причём приложение работает на разных архитектурах: x86, ARM и «Эльбрус».

Другой — Kaspersky Secure Mail Gateway для Linux. Он дистанционно управляет IT-инфраструктурой и защищает серверы электронной почты от угроз: спама, фишинга, вредоносных вложений. KSMG имеет кластерную архитектуру для удобства масштабирования и централизованного управления всеми серверами кластера через веб-интерфейс. А также значительно большее, чем у коллег, количество фичей в продукте. Из особенностей работы над KSMG — необходимость кодить на Python, обеспечение совместимости продукта с различными почтовыми серверами (Postfix, Exim, Sendmail), встраивание open-source-программ в комплексное решение на базе Linux, обеспечение совместимости продукта с различными дистрибутивами Linux.

Какие ещё задачи решают команды:

  • разработка новой логики приложения (да, у приложений под Linux есть свои уникальные фичи — а не только переиспользование общей кодовой базы);

  • написание автотестов и unit-тестов для нового функционала;

  • поддержка выпущенных версий продукта;

  • анализ дампов системы и самого KES, работа над стабильностью и производительностью продукта;

  • мониторинг и визуализация состояния сети.

Откликнуться на вакансии можно по ссылкам:

  • разработка системы автоматизированной защиты рабочих станций;

  • разработка комплексной системы защиты почтовых серверов;

  • разработка системы мониторинга и визуализации состояния сети.

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Linux

Продукты и драйверы для macOS

Основной продукт — Kaspersky Endpoint Security для Mac. Задачи — как и у команд клиента и драйверов под Linux, только работа идёт исключительно с платформой Mac. Хотя тут есть и разные архитектуры процессоров (и x86, и пару лет назад завезённый в десктопы и ноутбуки ARM). Как и в линуксовых командах, команда разработки под Mac добавляют в продукт свои уникальные фичи, разбирают и анализируют дампы системы и KES, пишут тесты и поддерживают уже выпущенные версии ПО.

Откликнуться на вакансию можно по ссылке

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, macOS

Ядро KasperskyOS

В этом проекте разработчики создают собственную защищённую микроядерную операционную систему KasperskyOS (не очередной форк Linux, а ОС с собственным ядром), да ещё и под разные платформы. Она используется в IoT, VDI, транспорте, корпоративных мобильных устройствах. Тут уже понадобится не только C++, но и Си с Ассемблером для следующих задач:

  • прототипирование решений;

  • написание отдельной, real-time-версии системы;

  • разработка и имплементация компонент для промышленной разработки ПО;

  • подготовка набора тестов для верификации разработанных решений;

  • разработка и ревью архитектуры;

  • подготовка набора тестов (юнит, фаззинг) для верификации разработанных решений;

  • анализ и улучшение эффективности, стабильности, безопасности и масштабируемости разрабатываемых решений.

Откликнуться на вакансии можно по ссылкам:

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

Драйверы для KasperskyOS

Разработка драйверов для KasperskyOS под разные устройства — самостоятельное направление в рамках разработки операционной системы. Это продуктовое направление делает так, чтобы KasperskyOS работала на самом разном железе, а также занимается системными сервисами и библиотеками. 

Здесь от программистов требуется умение разрабатывать ПО под разные аппаратные платформы, что тянет за собой знание не только C++, но и более низкоуровневых C и Ассемблера, деталей аппаратной реализации различных компонентов современных вычислительных систем (видеокарты, процессоры, оперативная память и т. п.). 

Откликнуться на вакансию можно по ссылке.

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

Продукты для KasperskyOS

ПО под KasperskyOS и SDK для партнёров, которое позволяет создавать новые собственные продукты под эту операционку или интегрировать уже существующие решения. Задача того же уровня сложности, которую в своё время решали Apple и Google, разрабатывая для своих мобильных платформ как ПО, так и SDK для сторонних разработчиков. Только у KasperskyOS больше платформ, версий и типов устройств.

Собственное ПО пишется для разных направлений: 

  • встроенная безопасность (in-chip security), 

  • мобильные устройства, 

  • тонкие клиенты, 

  • интернет вещей и промышленный интернет вещей (Connected Industry, умные города),

  • электроэнергетика.

Откликнуться на вакансии можно по ссылкам:

  • разработка безопасного шлюза для электронных блоков автомобиля;

  • разработка безопасной платформы для IoT и embedded-устройств с поддержкой облачных платформ;

  • разработка мобильной версии KasperskyOS для разных устройств.

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

Система контентной фильтрации

Это направление покрывает все задачи, связанные с безопасностью в текстах, — защита от спам-писем, переходов по фишинговым ссылкам, родительский контроль. Для этого приходится детектировать аномалии в поведении пользователя, искать shadow-it-сервисы, плотно заниматься защитой персональных данных пользователя. Всё это портируется на Win, Linux, BSD. 

Компоненты CFR в основном реализованы на современных стандартах языка C++. Сборка компонент происходит в распараллеленной среде под самые различные win*/*nix платформы и архитектуры процессоров. Они интегрируются в продукт в виде плагинов, которые можно обновлять «на горячую» без обновления самого продукта (кстати, эти плагины как раз основаны на тех самых «универсальных компонентах для обновления антивирусных баз», которые входят в блок «Общие компоненты защиты», универсальные для всех платформ). Бизнес-логика, ответственная за детектирования, реализована в виде набора скриптов и обновляется тоже отдельно и независимо от самих компонент. Задачи разнообразные:

  • работа над перформансом (скорость/потребление ram и т. д.);

  • применение эффективных алгоритмов поиска сигнатур;

  • поддержка скриптов бизнес-логики, интерфейсов между движком и скриптами;

  • интеграция в продукты на различных ОС (Win, Linux, BSD);

  • сетевое low-level-взаимодействие;

  • парсинг различных форматов (MIME, HTML, RichText, TNEF и т. д.).

Откликнуться на вакансию можно по ссылке.

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Windows, Linux

Модуль эвристического анализа

Главный продукт — System Watcher. Это компонент проактивной защиты, который на лету определяет трояны, эксплойты и шифровальщики по шаблонам поведения, а также умеет восстанавливать пользовательские файлы и реестр после заражения. У System Watcher есть версии для Windows, Linux и macOS. Помимо разработки новых версий модуля, разработчики занимаются и поддержкой уже выпущенных версий.

Откликнуться на вакансию можно по ссылке.

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Windows/Linux/macOS

Компонент безопасности для виртуальных сред

Легкий агент — это решение для защиты облаков и виртуальных сред под платформы VMware vSphere, Microsoft Hyper-V, Citrix XenServer и KVM и интерфейс для более удобного управления компонентами защиты. Разработчики создают продукт, пишут новые фичи и поддерживают существующий код на C++. Ещё одно большое направление — разработка базовых кроссплатформенных компонентов защиты под различные типы ОС.

Откликнуться на вакансию можно по ссылке

Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки, Linux

Kaspersky Security Network

Kaspersky Security Network объединяет распределённую по всему миру инфраструктуру: несколько дата-центров и сотни серверов, включая виртуальные в публичных облаках. Через неё проходят аналитические данные об угрозах, которые затем преобразуются, актуализируются и используются в остальных наших продуктах. Команда KSN должна обеспечить обработку полутора миллионов запросов в секунду (медианное значение) и трафика в 5000 Тб данных в месяц, а также оперативно разбираться с запросами от продуктовых команд. Серверы работают на Linux, внутри используется несколько языков под разные задачи, но основной — C++ 17.

Основные задачи команды:

  • Оптимизация кода для того, чтобы ПО более рационально использовало ресурсы серверного оборудования.

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

Требуется понимание принципов работы интернета и основные протоколы, так как иногда приходится отлаживать крайне интересные и занятные вещи: все простые баги мы уже починили :) 

Откликнуться на вакансию можно по ссылке

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


Всем спасибо за внимание!

C++ несмотря на все шуточки про выстрелы в ноги, в том числе и от самого Бьерна Страуструпа, остаётся мощным и незаменимым инструментом для системного программирования. Разработка на нём идёт быстрее, чем на C и Ассемблере, при этом язык позволяет напрямую управлять памятью и работать с железом. К тому же при должной квалификации программистов код получается вполне безопасным и даже красивым. Именно поэтому он стал основной для системного программирования в KasperskyOS.

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

Конечно, наша карта в первую очередь отражает специфику задач «Лаборатории Касперского» и не включает некоторые направления разработки на C++ вроде компьютерного зрения. Однако она описывает основную часть задач «плюсовиков» и послужит полезным источником информации как для кандидатов, которые хотели бы у нас работать, так и для других компаний, которые задумываются о создании своей карты компетенций. А ещё это практически гимн в честь «плюсов» — языка, на котором уже почти 40 лет держится немалая часть системного ПО и у которого пока так и не смогли забрать корону Go, Rust или Carbon.

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


  1. mmMike
    11.04.2023 08:31
    -2

    Не указан самый главный навык С/С++. Умение работать с core dump полученный с боевой системы в условиях стресса и криков "все пропало! все стоит! когда же будет почиииняно!?".

    P.S. Как мне хорошо, что я перешел давно на Java и как мило разбирать стек ошибок Java в логе.


    1. vvromanov
      11.04.2023 08:31
      +1

      Нет проблем сделать свой обработчик исключений и генерить красиые коредампы. И это будет опциональной фичей, что повышает скрытость года.


      1. AnthonyMikh
        11.04.2023 08:31

        скрытость года

        Отличная опечатка


      1. mmMike
        11.04.2023 08:31

        Я 15 лет писал на С++ для разных "железных" устройств (типа Verifone терминалов/PINPAD), unix систем (демоны и пр.) и сервисы/прикладные программы Windows.
        Так что, не теоретически знаком с этим.

        90% проблем (core dump) это последствие порчи стека/памяти иногда за несколько минут до фактического возникновения exception. И не надо мне говорить про безопасные vector и прочее. В не учебных и сложных программах всегда найдется место где что то будет не учтено не смотря на все авто ptr, вектора, обработчики исключений и прочие обкладки.

        А когда в стрессовых условиях начинаешь разбираться почему упало и как это исправить - это запоминается надолго.
        Работает на одной платформе (sparc, например) и нерегулярно (пару раз в неделю) падает на другой (x86) - типичный пример таких разборок.

        Так что, у меня есть с чем сравнивать. На Java (последние лет 7 на Java и С++ с плавным смещение в строну кроссплатформенных программ на Java) мне гораздо комфортнее. И время поиска проблем гораздо меньше.

        А спорить с фанатиками С++, которые ничего другое и не пробовали (да и на С++ максимум год) - дурное дело. Их лучше обходить большим кругом.


        1. vvromanov
          11.04.2023 08:31

          Я работаю программистом 33 года. За это время поработал на куче платформ. И как ты понимаешь, начал программировать ещё до появления плюсов. Сейчас пишу для PowerPC. Java особенно мила, когда начинает собирать мусор под нагрузкой и перестает реагировать на запросы. Если руки не из жопы, то и на С/С++ не проблем с памятью.


          1. mmMike
            11.04.2023 08:31

            Какой "тонкий" и "закамуфлированный" наезд. Про руки из жопы.
            Не делает вам чести.
            Скорее говорит о вашей склонности к склочности и пр.


            1. vvromanov
              11.04.2023 08:31

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


              1. mmMike
                11.04.2023 08:31
                -1

                Коллеги из отдела разработки ПО для платежных терминалов постепенно переходят на Java (android). Все современные терминалы идут в основном уже "не голый C++/C" без OS, а под Android.

                Я помню, сколько стоило перетащить ПО с одной платформы (POS терминалы) на другую (другой проц) с особенностями адресации и сегментации.

                Конечно для какого ни будь контроллера c ядром Cortex-M3 иногда даже на C/C++ места впритык.

                Но я все равно не хотел бы для пром. комплексов (unix/linux) где нет жестких ограничений по ресурсам писать на С++. Просто могу сравнить сколько на разработку развитие и поддержку одних и тех же по функционалу программ уходит, если писать на С++ и на Java.

                Зачастую проще переписать старую программу сделанную на С++ под Java, чем продолжать развитие этой старой программы на С++.

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

                И зачастую это ПО я сам лет 10 назад писал. Т.е. проблема не в том, что бы вникнуть как это старое работает. А просто активно не хочется продолжать его развивать на С++.
                Займет больше времени и передать некому (найти С++ разработчика с опытом - проблема)

                Так что, для общих задач (перекладывания байтиков в протоколах типа json и работа с БД) пусть мазохисты используют С++. У меня есть возможность сравнить и для меня выбор очевиден.


                1. vvromanov
                  11.04.2023 08:31

                  Если уж пошли обиды, то тут уже я чувствую презрение к этим "перекладывателям байтов" на с++.


                  1. mmMike
                    11.04.2023 08:31

                    Я последние лет 5 пишу исключительно "перекладыватели байтов из одного протокола в другой и в БД". В общем то все задачи процессинга платежей и переводы денег к этому и сводятся.

                    Отдушина - хоббийные программки. Хотя.. то же укладывние видеопотока в TCP/IP - это то же перекладывание байтиков/битиков.

                    Но перекладывать байтики и битики, для типичных моих задач на работе, не изобретая велосипед проще на Java (+python +js)
                    Попробуй найди нормальную библиотеку реализации HTTP сервера, или обработки Json, которая "широко известна и используется в широких кругах", а не "широко известна в узких кругах С++". А Postgre/Oracle клиент (полный как jdbc, а не OCI драйвер) под C++? а клиент kafka под C++?


                    1. vvromanov
                      11.04.2023 08:31

                      Все это очень круто. Но есть одна проблема - все это ужасно медленное. Там где скорость не критична, можно писать хоть на визуал бейсике. Если гуй - С#, если json попарсить - питон, если посчитать носки на складе - Ява подойдёт. А вот если нужна скорость - с/с++.


                      1. mmMike
                        11.04.2023 08:31

                        Переписанный обработчик с C++ под java.
                        TCP/IP listener (не http), TCP/IP клиент и коннект к БД. XML поверх TCP/IP
                        Фактически навороченный маршрутизатор.

                        на бою работают обе версии (на разных комплексах, но на одной физически машинке).
                        Так вот.. в быстродействии разницы нет. Что там что там в районе 20..30 ms на обработку через БД и маршрутизацию.
                        Да. ресурсов C++ вариант потребляет меньше. но не принципиально. где то на 70-80% (процент большой большие, но от общей памяти сервера разница не значительная).
                        Но насколько удобнее и проще:

                        1. вносить изменения и новый функционал.

                        2. Не надо выпускать много дистрибутивов под каждые аппаратные платформы (и тестировать их)

                        3. Не надо ставить драйвер БД, поскольку Jdbc это thin драйвер. 4.логирование апачевским log4j2 в централизированое хранилище (не находил для C++ точного аналога)

                        Понадобился асихронный канал для маршрутизации - нет проблем. Вот клиент для kafka (java). А для С++ куда ни сунешься - попробуй найди библиотеку.


                      1. eao197
                        11.04.2023 08:31

                        Простите, не совсем понятно:

                        Да. ресурсов C++ вариант потребляет меньше. но не принципиально. где то на 70-80% (процент большой большие, но от общей памяти сервера разница не значительная).

                        С++ версия потребляет на 70-80% процентов меньше памяти? CPU?


                      1. mmMike
                        11.04.2023 08:31

                        памяти.
                        IO Операции (сетевые) что в Java что в С++ потребляют фактически одинаково CPU. Что С++, что Java это обертка над системными вызовами IO операций. Сравнивать производительность имеет смысл вообще только для каких то нагруженных вычислений. А когда 99% работы - это IO операции (вызовы OS), то выгоды в C++ нет.

                        А SAX парсер java или xerces C++ для 10Кб XML это неуловимая разница (даже если она есть).


                      1. eao197
                        11.04.2023 08:31

                        памяти

                        Понятно, спасибо.

                        Из того, что вы рассказываете возникает вопрос: а зачем версия на С++ вообще была нужна?


                      1. mmMike
                        11.04.2023 08:31

                        Потому что некоторые программы еще из 1997 года.
                        А большинство создавалось в начале 2000х.
                        И оно до сих пор работает и активно используется. постепенно переписываясь. Потому что не так тривиально все это переносить на новые платформы аппаратные и OS (мир не заканчивается на x86).


                      1. eao197
                        11.04.2023 08:31

                        Потому что некоторые программы еще из 1997 года.

                        Тогда все понятно, спасибо.


                      1. vvromanov
                        11.04.2023 08:31

                        10 лет назад на десктопном комьютере время отклика укладывалось в 2ms с обращениями к базе данных. И 20к запросов в секунду.


                      1. mmMike
                        11.04.2023 08:31

                        Ну наверное БД не содержала несколько десятков млн записей и довольно большой PL/SQL код прикладной логики на вызов.



                      1. 0xd34df00d
                        11.04.2023 08:31

                        А вот если нужна скорость — с/с++.

                        Или раст. Или, прости Бь-рне, хаскель.


          1. 0xd34df00d
            11.04.2023 08:31
            +1

            Личный опыт показывает, что если на «C/C++» нет проблем с памятью, то вы либо их ещё не нашли, либо у вас хелловорлды.


            1. vvromanov
              11.04.2023 08:31

              Система, которая управляет доступом пользователей к мобильной сети в Йота - это hello world? Другой пример - ReGet.


              1. 0xd34df00d
                11.04.2023 08:31

                Ну вот этот ваш другой пример у меня крашился, например, когда я им пользовался лет 15-20 назад (когда все эти качалки были ещё актуальны).


  1. simenoff
    11.04.2023 08:31
    -2

    Почему не Rust? 8)


    1. mbrav
      11.04.2023 08:31
      -2

      Потому что тут очень сильно обижаются, когда начинают говорить про Rust)


      1. odilovoybek
        11.04.2023 08:31
        -1

        Ого, кажись и вправду так) Не минусуйте!


      1. ZvaroG
        11.04.2023 08:31

        Нет, а действительно, как Лаборатория Касперского оценивает Rust с точки зрения практической безопасности ? Они где-нибудь высказывались по этому поводу ?


  1. Kano
    11.04.2023 08:31
    +2

    Базовые требования - Хороший технический английский. Для чего? Читать документацию?


    1. me21
      11.04.2023 08:31
      +3

      Да, и кроме того куча блогов, статей, полезных материалов - на английском.


      1. Kano
        11.04.2023 08:31
        +1

        Но это не "хороший технически английский", а умение читать технический текст на английском и это, на мой взгляд, большая разница.


  1. coodi
    11.04.2023 08:31
    +7

    Сколько у вас коллег соответвует всем этим требованиям? :)


  1. Laryx
    11.04.2023 08:31
    +4

    Почитал - расстроился. Единственный блок, в котором я вроде как чувствую себя "уверенно" - это "умение писать код". Всё остальное - чисто "по верхам", имею самое общее представление, сказать, что "знаю" не могу.

    Пичалька.


  1. SerJook
    11.04.2023 08:31
    +4


    1. kovserg
      11.04.2023 08:31
      +3

      image


      1. 0xd34df00d
        11.04.2023 08:31
        +6

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


        1. ReadOnlySadUser
          11.04.2023 08:31
          +3

          Это все внутри лотков. Снаружи возможности С++ прикидываются мягкими и няшными)


    1. zool_of_bears
      11.04.2023 08:31

      Просто книжка была не очень, раз NRVO написано с ошибкой :)


  1. vvromanov
    11.04.2023 08:31
    -5

    Какая в такая "дорожная карта"? Сверните ее трубочкой и засуньте ее себе в ухо! В русском языке есть слово "план". Если непонятно, то можно "план действий". А дорожным картам место в атласе автомобильных дорог.


    1. ReaderReader
      11.04.2023 08:31

      Какой еще план - когда это латинское слово? Чего это такой маститый языковед как вы поганите русский язык всякой латинщиной?

      "дорожным картам место в атласе автомобильных дорог."

      карта - заимствование из французского
      атлас - древнегреческий
      автомоби́ль - древнегреческий + латинский
      место - заимствование польского
      Да как вы только смеете поганить великий и могучий русский язык таким количеством инстранщины?! Общаться надо исключительно на языке образца "Не лѣпо ли ны бяшетъ, братіе, начяти старыми словесы трудныхъ повѣстій о пълку Игоревѣ" и никак иначе


      1. eao197
        11.04.2023 08:31

        Еще лет 20 назад термин "roadmap" перевели бы в данном контексте как "путь развития", "сценарий развития" или "план развития". И никого бы не интересовало откуда были позаимствованы слова "план" и "сценарий". Да и само слово "родмап" в профессиональном арго использовалось наряду с "битмапом" и особых проблем не вызывало (именно когда использовалось в профессиональном арго). Но почему-то стало модно применять "дорожная карта", видимо в переводах с английского в среде, где "родмап" употреблять было не принято. А то, что "дорожная карта" выглядит весьма дико на фоне десятилетиями употреблявшихся "план действий"/"план развития", употребителей этой самой "дорожной карты" не волнует. А зря.


        1. vvromanov
          11.04.2023 08:31

          Правильно!


        1. ReaderReader
          11.04.2023 08:31

          Любой язык, если только он не мертвый, развивается, меняется и т.д. При этом стандарты определения "дико" и т.п. - делаются исключительно через "я так считаю, потому что мне не нравится". Почему, например, для вас дико именно это, а не весь русский язык после реформы 1918 года? С чего вы решили, что именно ваша версия русского языка является эталоном?
          Дабы быть правильно понятым. Нет, я не сторонник старой орфографии и т.п. Это к тому, что определить, в какой момент именно язык должен быть "зафиксирован" в своем развитии, невозможно. Он всегда будет меняться, пока его используют.


          1. eao197
            11.04.2023 08:31

            С чего вы решили, что именно ваша версия русского языка является эталоном?

            Во-первых, я высказываю свое мнение и оценка "дико" -- это моя личная оценка. Какие лично мне делать оценки -- это, простите, мое дело. С чего захочу, с того и решу.

            Например, воспользуюсь "бритвой Оккама": не следует множить сущности без необходимости.

            Во-вторых, я не лингвист, мне сложно судить об объективных законах изменения естественных языков. Но предполагаю, что языки меняются под влиянием прогресса (технического, социального и т.д.) или глобальных изменений/потрясений (вроде стихийных бедствий, изменения климата, военных конфликтов мирового масштаба). Что и обуславливает появление в языке новых слов и понятий (вроде "автомобиль", "электронно-лучевая трубка", "компьютер", "сотовый телефон" и т.д.), а так же исчезновение старых (вроде "иноходь" или "зело").

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


            1. ReaderReader
              11.04.2023 08:31

              Во-первых, я высказываю свое мнение и оценка "дико" -- это моя личная оценка. Какие лично мне делать оценки -- это, простите, мое дело. С чего захочу, с того и решу.

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

              Но предполагаю, что языки меняются под влиянием прогресса (технического, социального и т.д.) или глобальных изменений/потрясений (вроде стихийных бедствий, изменения климата, военных конфликтов мирового масштаба)

              А еще они меняются путем заимствования и проникновения друг в друга, что мы и наблюдаем на примере дорожной карты.


              1. eao197
                11.04.2023 08:31

                судя по оценке стартового поста, такое мнение большинство считает, мягко говоря, не особо правильным

                Кто вам сказал, что текущая оценка отражает мнение большинства?

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

                т.к. аргументация "мне не нравится", рядом с логикой даже рядом не лежала

                Покажите аргументацию "мне не нравится" в моих комментариях, пожалуйста.

                А еще они меняются путем заимствования и проникновения друг в друга

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

                мы и наблюдаем на примере дорожной карты

                Я не знаю кто такие "мы" и что наблюдаете лично вы.

                Мои наблюдение за проникновением "дорожной карты" в обиход наводит меня на следующий сценарий развития событий:

                • где-то в дипломатических кругах происходило согласование документа, который в своем англоязычном названии включал слово "roadmap";

                • результаты этих согласований нужно было объявить на русскоязычную аудиторию;

                • использовать транслитерацию "родмап" не позволял уровень, т.к. здесь нельзя было употреблять термины из профессионального арго;

                • перевести как это было принято раньше, а именно "план действий", было нельзя, т.к. "roadmap" в подобных договоренностях означает не столько строгий план, сколько общий набор шагов в определенной последовательности. Тогда как в русском языке "план" -- это именно что четкий план, за невыполнение которого можно ответить по всей строгости (не отвлекаемся сейчас на другие смыслы слова "план", особенно связанные с запрещенными веществами). Так что переведешь как "план действий" и нарвешься на неприятности. Поэтому нужно было придумать что-то другое. Вероятно, "дорожная карта" оказалась наиболее нейтральным вариантом. Плюс и не очень четким и понятным большинству, что так же размывало зону ответственности;

                • ну а после того как выражением "дорожная карта" стали пользоваться высокопоставленные лица (которые были вынуждены так делать "по протоколу") эта гадость стала распространяться и в другие области.

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


                1. ReaderReader
                  11.04.2023 08:31

                  Покажите аргументацию "мне не нравится" в моих комментариях, пожалуйста.

                  Вот. Кому-то точно также может казаться, что весь послереформенный русский язык выглядит дико.

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


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

                  Все, действительно, прозаичнее. Языки проникают друг в друга обыкновенной калькой. Как вам, например, "Autobahn news"? И никакой технический прогресс (если только не считать возможность общаться с кем угодно откуда угодно, что ускоряет смешивание языков) для этого не требуется.


                  1. eao197
                    11.04.2023 08:31

                    Вот.

                    Вот что? Я вас попросил привести пример аргументации вида "мне не нравится" в моих комментариях. Приведите, пожалуйста. Не нужно растекаться мыслею о том что кому-то что-то. Цитату, пожалуйста.

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

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


  1. KeyMAD
    11.04.2023 08:31
    +1

    Судя по статье, знать надо больше чем всё, но всё же как наглядная схема развития - неплохо.


  1. beasty4ever
    11.04.2023 08:31

    • как внутри устроены стандартные контейнеры std::vector, std::string, std::list, std::map;

    • как работают исключения, какие у них есть преимущества и недостатки;

    • современные стандарты C++ — 17 и 20. Необходимо не только знать их, но и уметь обоснованно применять на практике нововведения языка. То есть там, где это действительно необходимо и помогает сделать код лучше; 

    • разницу между design-, compile- и runtime — а также не боится шаблонов.

    А вы классический си не используете, только си++? Используя си могли бы расширить окно поиска кандидатов на программистов встроенного программного обеспечения, там знания архитектуры и многопотосности у людей довольно приличное.


  1. nct123
    11.04.2023 08:31

    Почему не Rust - Касперский же! А на Rust - как анти/вирусы писать, если всё безопасно?!


    1. SerpentFly
      11.04.2023 08:31

      Для этого есть Небезопасный Rust ????


  1. Falstaff
    11.04.2023 08:31
    +3

    Мне стыдно что я не добавляю ничего по теме, я просто зашёл в комментарии почитать последние новости про Rust. Они обычно все в комментариях к статьям по C++. :)


    1. KanuTaH
      11.04.2023 08:31

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


  1. slinkinone
    11.04.2023 08:31
    +2

    На самом деле хорошо описано.

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

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


    1. medvedouxerectus
      11.04.2023 08:31

      Bazel, скорее уж и без пакетных менеджеров. Я не думаю что в ЛК вообще есть CMake, так как они должны быть на монорепо при их масштабе проектов.


  1. medvedouxerectus
    11.04.2023 08:31

    софт-скиллы. Тут достаточно просто «взрослого» подхода к работе: предупреждать заранее, если что-то не получается сделать в оговорённый срок, не замалчивать личные и рабочие проблемы и т. п

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


    1. webhamster
      11.04.2023 08:31

      Учитывая сверхзавышенные требования и невозможность устройства на работу в такие конторы специалистов со средними навыками, очень странно что постоянно просачивается информация о подобных ситуациях на рабочем месте. Профессионалы ведь не могут так себя вести? Или могут? А если так, то нет ни смысла ни мотивации стремиться устроиться в подобные шарашкины конторы типа Касперского и Яндекса. Тем более что по зарплатному фонду они предлагают очень средненькую оплату труда за "отличное знание C++".


      1. medvedouxerectus
        11.04.2023 08:31

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

        Стремится или нет выбор каждого, но в РФ на сегодня почти не осталось компаний в которых стоило бы работать, и ЛК да Я одни из немногих уцелевших.