Джеймс Гослинг как‑то сказал, что 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 — несколько команд, каждая со своими задачами. Объединяет их то, что они пишут кросс-платформенный код, который переиспользуется в продуктах под все операционные системы:
- Traffic processing. Команда анализирует трафик на машине конечного пользователя, предоставляет удобные интерфейсы для работы с ним, и разрабатывает компоненты защиты на базе этих интерфейсов. Результат работы команды: анализаторы сетевых протоколов (SSL, HTTP/1.1, HTTP/2, HTTP/3, QUIC, WebSocket, IMAP, POP3 и т. п.), веб-антивирус, антиспам, почтовый антивирус, родительский контроль, защита от фишинга. 
- Crypto. Команда пишет решения для криптографической защиты информации, которые работают в различных средах выполнения: пользовательский режим ОС, режим ядра, Preboot. Разработчики анализируют подписи файлов различных форматов, создают собственный стандарт подписи на основе ГОСТов, пишут крипто-подсистему для KasperskyOS, занимаются сертификацией и реализуют стандарты PKCS11, PKI, FIPS. 
- Instrumental PDK. Команда разрабатывает библиотеки C++ общего характера, в том числе платформенно-зависимые. Например, внутреннюю библиотеку стандартных примитивов, собственные фреймворки, которые связывают компоненты во всех продуктах и универсальные компоненты для обновления антивирусных баз. 
Откликнуться на вакансию можно по ссылке.
Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки.
Консоль безопасности

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

Основное и самое большое направление. Это и общая для всех продуктов кодовая база, и драйверы под Windows, и виндовые продукты вроде Kaspersky Endpoint Security и Kaspersky Anti-Virus (кстати, это разные решения: первое предназначено для бизнеса, а второе — для личного использования). Windows по-прежнему остаётся платформой, на которую так или иначе равняются решения под остальные ОС: это основа всех приложений и идей, локомотив продуктовой линейки Kaspersky. Разработчикам приходится постоянно разбирать системные и продуктовые дампы, писать User-Mode-компоненты, драйверы, бизнес-логику, новые продуктовые фичи.
Откликнуться на вакансии можно по ссылкам:
- разработка драйверов под Windowsсистемы мониторинга; 
- разработка приложения Kaspersky Endpoint Security для Windows. 
Нужные навыки: Отличное знание 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-версии системы; 
- разработка и имплементация компонент для промышленной разработки ПО; 
- подготовка набора тестов для верификации разработанных решений; 
- разработка и ревью архитектуры; 
- подготовка набора тестов (юнит, фаззинг) для верификации разработанных решений; 
- анализ и улучшение эффективности, стабильности, безопасности и масштабируемости разрабатываемых решений. 
Откликнуться на вакансии можно по ссылкам:
- разработка real-time-версии KasperskyOS; 
- разработка микроядра для KasperskyOS. 
Нужные навыки: Отличное знание 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 — несколько команд, каждая со своими задачами. Объединяет их то, что они пишут кросс-платформенный код, который переиспользуется в продуктах под все операционные системы:
- Traffic processing. Команда анализирует трафик на машине конечного пользователя, предоставляет удобные интерфейсы для работы с ним, и разрабатывает компоненты защиты на базе этих интерфейсов. Результат работы команды: анализаторы сетевых протоколов (SSL, HTTP/1.1, HTTP/2, HTTP/3, QUIC, WebSocket, IMAP, POP3 и т. п.), веб-антивирус, антиспам, почтовый антивирус, родительский контроль, защита от фишинга. 
- Crypto. Команда пишет решения для криптографической защиты информации, которые работают в различных средах выполнения: пользовательский режим ОС, режим ядра, Preboot. Разработчики анализируют подписи файлов различных форматов, создают собственный стандарт подписи на основе ГОСТов, пишут крипто-подсистему для KasperskyOS, занимаются сертификацией и реализуют стандарты PKCS11, PKI, FIPS. 
- Instrumental PDK. Команда разрабатывает библиотеки C++ общего характера, в том числе платформенно-зависимые. Например, внутреннюю библиотеку стандартных примитивов, собственные фреймворки, которые связывают компоненты во всех продуктах и универсальные компоненты для обновления антивирусных баз. 
Откликнуться на вакансию можно по ссылке.
Нужные навыки: Отличное знание C++, Умение писать код, Работа с многопоточными приложениями, Опыт коммерческой разработки.
Консоль безопасности

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

Основное и самое большое направление. Это и общая для всех продуктов кодовая база, и драйверы под Windows, и виндовые продукты вроде Kaspersky Endpoint Security и Kaspersky Anti-Virus (кстати, это разные решения: первое предназначено для бизнеса, а второе — для личного использования). Windows по-прежнему остаётся платформой, на которую так или иначе равняются решения под остальные ОС: это основа всех приложений и идей, локомотив продуктовой линейки Kaspersky. Разработчикам приходится постоянно разбирать системные и продуктовые дампы, писать User-Mode-компоненты, драйверы, бизнес-логику, новые продуктовые фичи.
Откликнуться на вакансии можно по ссылкам:
- разработка драйверов под Windowsсистемы мониторинга; 
- разработка приложения Kaspersky Endpoint Security для Windows. 
Нужные навыки: Отличное знание 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-версии системы; 
- разработка и имплементация компонент для промышленной разработки ПО; 
- подготовка набора тестов для верификации разработанных решений; 
- разработка и ревью архитектуры; 
- подготовка набора тестов (юнит, фаззинг) для верификации разработанных решений; 
- анализ и улучшение эффективности, стабильности, безопасности и масштабируемости разрабатываемых решений. 
Откликнуться на вакансии можно по ссылкам:
- разработка real-time-версии KasperskyOS; 
- разработка микроядра для KasperskyOS. 
Нужные навыки: Отличное знание 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)
 - Kano11.04.2023 08:31+2- Базовые требования - Хороший технический английский. Для чего? Читать документацию? 
 - Laryx11.04.2023 08:31+4- Почитал - расстроился. Единственный блок, в котором я вроде как чувствую себя "уверенно" - это "умение писать код". Всё остальное - чисто "по верхам", имею самое общее представление, сказать, что "знаю" не могу. - Пичалька. 
 - SerJook11.04.2023 08:31+4  - kovserg11.04.2023 08:31+3  - 0xd34df00d11.04.2023 08:31+6- Слева недостаточно дыр, иголок, лезвий и прочего, да и слишком мягко.  - ReadOnlySadUser11.04.2023 08:31+3- Это все внутри лотков. Снаружи возможности С++ прикидываются мягкими и няшными) 
 
 
 
 - vvromanov11.04.2023 08:31-5- Какая в такая "дорожная карта"? Сверните ее трубочкой и засуньте ее себе в ухо! В русском языке есть слово "план". Если непонятно, то можно "план действий". А дорожным картам место в атласе автомобильных дорог.  - ReaderReader11.04.2023 08:31- Какой еще план - когда это латинское слово? Чего это такой маститый языковед как вы поганите русский язык всякой латинщиной? - "дорожным картам место в атласе автомобильных дорог." - карта - заимствование из французского 
 атлас - древнегреческий
 автомоби́ль - древнегреческий + латинский
 место - заимствование польского
 Да как вы только смеете поганить великий и могучий русский язык таким количеством инстранщины?! Общаться надо исключительно на языке образца "Не лѣпо ли ны бяшетъ, братіе, начяти старыми словесы трудныхъ повѣстій о пълку Игоревѣ" и никак иначе - eao19711.04.2023 08:31- Еще лет 20 назад термин "roadmap" перевели бы в данном контексте как "путь развития", "сценарий развития" или "план развития". И никого бы не интересовало откуда были позаимствованы слова "план" и "сценарий". Да и само слово "родмап" в профессиональном арго использовалось наряду с "битмапом" и особых проблем не вызывало (именно когда использовалось в профессиональном арго). Но почему-то стало модно применять "дорожная карта", видимо в переводах с английского в среде, где "родмап" употреблять было не принято. А то, что "дорожная карта" выглядит весьма дико на фоне десятилетиями употреблявшихся "план действий"/"план развития", употребителей этой самой "дорожной карты" не волнует. А зря.  - ReaderReader11.04.2023 08:31- Любой язык, если только он не мертвый, развивается, меняется и т.д. При этом стандарты определения "дико" и т.п. - делаются исключительно через "я так считаю, потому что мне не нравится". Почему, например, для вас дико именно это, а не весь русский язык после реформы 1918 года? С чего вы решили, что именно ваша версия русского языка является эталоном? 
 Дабы быть правильно понятым. Нет, я не сторонник старой орфографии и т.п. Это к тому, что определить, в какой момент именно язык должен быть "зафиксирован" в своем развитии, невозможно. Он всегда будет меняться, пока его используют. - eao19711.04.2023 08:31- С чего вы решили, что именно ваша версия русского языка является эталоном? - Во-первых, я высказываю свое мнение и оценка "дико" -- это моя личная оценка. Какие лично мне делать оценки -- это, простите, мое дело. С чего захочу, с того и решу. - Например, воспользуюсь "бритвой Оккама": не следует множить сущности без необходимости. - Во-вторых, я не лингвист, мне сложно судить об объективных законах изменения естественных языков. Но предполагаю, что языки меняются под влиянием прогресса (технического, социального и т.д.) или глобальных изменений/потрясений (вроде стихийных бедствий, изменения климата, военных конфликтов мирового масштаба). Что и обуславливает появление в языке новых слов и понятий (вроде "автомобиль", "электронно-лучевая трубка", "компьютер", "сотовый телефон" и т.д.), а так же исчезновение старых (вроде "иноходь" или "зело"). - В случае с "дорожной картой" не видно каким бы прогрессом или какими бы изменениями надобность в таком синониме для "план развития" была бы обусловлена. Ну, за исключением, постепенной дебилизации значительной части населения.  - ReaderReader11.04.2023 08:31- Во-первых, я высказываю свое мнение и оценка "дико" -- это моя личная оценка. Какие лично мне делать оценки -- это, простите, мое дело. С чего захочу, с того и решу. - Вот! О чем и речь. Высказывать и иметь, разумеется, можете, но, судя по оценке стартового поста, такое мнение большинство считает, мягко говоря, не особо правильным, т.к. аргументация "мне не нравится", рядом с логикой даже рядом не лежала. С таким же успехом можно говорить; что современная версия русского языка - дикая, а дореформенная - прекрасна. - Но предполагаю, что языки меняются под влиянием прогресса (технического, социального и т.д.) или глобальных изменений/потрясений (вроде стихийных бедствий, изменения климата, военных конфликтов мирового масштаба) - А еще они меняются путем заимствования и проникновения друг в друга, что мы и наблюдаем на примере дорожной карты.  - eao19711.04.2023 08:31- судя по оценке стартового поста, такое мнение большинство считает, мягко говоря, не особо правильным - Кто вам сказал, что текущая оценка отражает мнение большинства? - Кроме того, Habr для меня лично неприятно известен тем, что здесь запросто уводят в глубокие минуса более чем здравые комментарии. Вероятно, из-за этой особенности многие Habr-ом просто брезгуют. - т.к. аргументация "мне не нравится", рядом с логикой даже рядом не лежала - Покажите аргументацию "мне не нравится" в моих комментариях, пожалуйста. - А еще они меняются путем заимствования и проникновения друг в друга - Если вы дадите себе труд подумать, то увидите, что "заимствования и проникновение" являются прямым следствием прогресса и общемировых изменений. Так что это не "а еще", это все тоже самое. - мы и наблюдаем на примере дорожной карты - Я не знаю кто такие "мы" и что наблюдаете лично вы. - Мои наблюдение за проникновением "дорожной карты" в обиход наводит меня на следующий сценарий развития событий: - где-то в дипломатических кругах происходило согласование документа, который в своем англоязычном названии включал слово "roadmap"; 
- результаты этих согласований нужно было объявить на русскоязычную аудиторию; 
- использовать транслитерацию "родмап" не позволял уровень, т.к. здесь нельзя было употреблять термины из профессионального арго; 
- перевести как это было принято раньше, а именно "план действий", было нельзя, т.к. "roadmap" в подобных договоренностях означает не столько строгий план, сколько общий набор шагов в определенной последовательности. Тогда как в русском языке "план" -- это именно что четкий план, за невыполнение которого можно ответить по всей строгости (не отвлекаемся сейчас на другие смыслы слова "план", особенно связанные с запрещенными веществами). Так что переведешь как "план действий" и нарвешься на неприятности. Поэтому нужно было придумать что-то другое. Вероятно, "дорожная карта" оказалась наиболее нейтральным вариантом. Плюс и не очень четким и понятным большинству, что так же размывало зону ответственности; 
- ну а после того как выражением "дорожная карта" стали пользоваться высокопоставленные лица (которые были вынуждены так делать "по протоколу") эта гадость стала распространяться и в другие области. 
 - Возможно, все было еще прозаичнее: на каком-то этапе кто-то просто прогнал английский текст через автоматический переводчик и получил "дорожную карту" вместо "пути движения" (или "последовательность шагов") и понеслось.  - ReaderReader11.04.2023 08:31- Покажите аргументацию "мне не нравится" в моих комментариях, пожалуйста. - Вот. Кому-то точно также может казаться, что весь послереформенный русский язык выглядит дико. - А то, что "дорожная карта" выглядит весьма дико на фоне десятилетиями употреблявшихся "план действий"/"план развития", употребителей этой самой "дорожной карты" не волнует. 
 Кому-то точно также может казаться, что весь послереформенный русский язык выглядит дико. Не нравится человеку и все тут. Разница только в том, что требований употреблять дореформенную грамматику особо не встречается, а требования не употреблять современные изменения как у автора стартового комментария с его "Сверните ее трубочкой и засуньте ее себе в ухо!" встречаются.
 Все, действительно, прозаичнее. Языки проникают друг в друга обыкновенной калькой. Как вам, например, "Autobahn news"? И никакой технический прогресс (если только не считать возможность общаться с кем угодно откуда угодно, что ускоряет смешивание языков) для этого не требуется. - eao19711.04.2023 08:31- Вот. - Вот что? Я вас попросил привести пример аргументации вида "мне не нравится" в моих комментариях. Приведите, пожалуйста. Не нужно растекаться мыслею о том что кому-то что-то. Цитату, пожалуйста. - Кому-то точно также может казаться, что весь послереформенный русский язык выглядит дико. - У этого "казаться" могут быть вполне себе логичные объяснения. Когда я написал ""дорожная карта" выглядит весьма дико на фоне десятилетиями употреблявшихся "план действий"/"план развития"", то озвучил лишь вывод, опустив мотивацию. 
 
 
 
 
 
 
 
 
 - KeyMAD11.04.2023 08:31+1- Судя по статье, знать надо больше чем всё, но всё же как наглядная схема развития - неплохо. 
 - beasty4ever11.04.2023 08:31- как внутри устроены стандартные контейнеры std::vector, std::string, std::list, std::map; 
- как работают исключения, какие у них есть преимущества и недостатки; 
- современные стандарты C++ — 17 и 20. Необходимо не только знать их, но и уметь обоснованно применять на практике нововведения языка. То есть там, где это действительно необходимо и помогает сделать код лучше; 
- разницу между design-, compile- и runtime — а также не боится шаблонов. 
 - А вы классический си не используете, только си++? Используя си могли бы расширить окно поиска кандидатов на программистов встроенного программного обеспечения, там знания архитектуры и многопотосности у людей довольно приличное. 
 - nct12311.04.2023 08:31- Почему не Rust - Касперский же! А на Rust - как анти/вирусы писать, если всё безопасно?! 
 - Falstaff11.04.2023 08:31+3- Мне стыдно что я не добавляю ничего по теме, я просто зашёл в комментарии почитать последние новости про Rust. Они обычно все в комментариях к статьям по C++. :)  - KanuTaH11.04.2023 08:31- Тогда вам не повезло - кроме очередных набивших оскомину вопросов "а почему не раст", на которые уже даже никто не трудится отвечать, тут ничего про это нет :) 
 
 - slinkinone11.04.2023 08:31+2- На самом деле хорошо описано. - В умение писать код я бы добавил навык написания юнит тестов. Во-первых, этот навык позволяет писать "unitable" код, что делает его более масшатабируемым и надежным. А во-вторых, написанные тесты, являются отражением того, на сколько разработчик "осознаёт" написанный код - проверка базовых сценариев, сложных сценариев, сценариев с пограничными условиями, итд. - Также в статье ничего не указано о работе с CMake и пакетных менеджерах. Считаю что эти навыки необходимы для того, чтобы создавать библиотеки, которые могут быть легко интегрированы в другие проекты.  - medvedouxerectus11.04.2023 08:31- Bazel, скорее уж и без пакетных менеджеров. Я не думаю что в ЛК вообще есть CMake, так как они должны быть на монорепо при их масштабе проектов. 
 
 - medvedouxerectus11.04.2023 08:31- софт-скиллы. Тут достаточно просто «взрослого» подхода к работе: предупреждать заранее, если что-то не получается сделать в оговорённый срок, не замалчивать личные и рабочие проблемы и т. п - Вот конкретно этот пункт я бы крайне советовал пересмотреть в пользу полноценной проверки софт скилов. Так как лично наблюдал как у вас народ по телефону (да, да, тому самому что на каждом столе у всех стоит) друг друга буями кроют.  - webhamster11.04.2023 08:31- Учитывая сверхзавышенные требования и невозможность устройства на работу в такие конторы специалистов со средними навыками, очень странно что постоянно просачивается информация о подобных ситуациях на рабочем месте. Профессионалы ведь не могут так себя вести? Или могут? А если так, то нет ни смысла ни мотивации стремиться устроиться в подобные шарашкины конторы типа Касперского и Яндекса. Тем более что по зарплатному фонду они предлагают очень средненькую оплату труда за "отличное знание C++".  - medvedouxerectus11.04.2023 08:31- В ЛК никогда не было сверх завышенных требований и была весьма и весьма приличная оплата. В Я требования были в соответствии с количеством желающих у них работать, денег было по максимуму на рынке РФ, пока стоки не забанили. Не знаю как сейчас, давно из РФ уехал. - Стремится или нет выбор каждого, но в РФ на сегодня почти не осталось компаний в которых стоило бы работать, и ЛК да Я одни из немногих уцелевших. 
 
 
 
           
 








mmMike
Не указан самый главный навык С/С++. Умение работать с core dump полученный с боевой системы в условиях стресса и криков "все пропало! все стоит! когда же будет почиииняно!?".
P.S. Как мне хорошо, что я перешел давно на Java и как мило разбирать стек ошибок Java в логе.
vvromanov
Нет проблем сделать свой обработчик исключений и генерить красиые коредампы. И это будет опциональной фичей, что повышает скрытость года.
AnthonyMikh
Отличная опечатка
mmMike
Я 15 лет писал на С++ для разных "железных" устройств (типа Verifone терминалов/PINPAD), unix систем (демоны и пр.) и сервисы/прикладные программы Windows.
Так что, не теоретически знаком с этим.
90% проблем (core dump) это последствие порчи стека/памяти иногда за несколько минут до фактического возникновения exception. И не надо мне говорить про безопасные vector и прочее. В не учебных и сложных программах всегда найдется место где что то будет не учтено не смотря на все авто ptr, вектора, обработчики исключений и прочие обкладки.
А когда в стрессовых условиях начинаешь разбираться почему упало и как это исправить - это запоминается надолго.
Работает на одной платформе (sparc, например) и нерегулярно (пару раз в неделю) падает на другой (x86) - типичный пример таких разборок.
Так что, у меня есть с чем сравнивать. На Java (последние лет 7 на Java и С++ с плавным смещение в строну кроссплатформенных программ на Java) мне гораздо комфортнее. И время поиска проблем гораздо меньше.
А спорить с фанатиками С++, которые ничего другое и не пробовали (да и на С++ максимум год) - дурное дело. Их лучше обходить большим кругом.
vvromanov
Я работаю программистом 33 года. За это время поработал на куче платформ. И как ты понимаешь, начал программировать ещё до появления плюсов. Сейчас пишу для PowerPC. Java особенно мила, когда начинает собирать мусор под нагрузкой и перестает реагировать на запросы. Если руки не из жопы, то и на С/С++ не проблем с памятью.
mmMike
Какой "тонкий" и "закамуфлированный" наезд. Про руки из жопы.
Не делает вам чести.
Скорее говорит о вашей склонности к склочности и пр.
vvromanov
Не надо это воспринимать лично. Писать можно на всем, все может вызвать проблемы. Но есть подходы к организации разработки, тестировании, архитектуры которые позволяют эти проблемы уменьшить. Для того же С есть MISRA. А на многих платформах кроссплатформенная Java не работает и/или использовать нельзя. Типичный пример - микроконтроллеры или настоящий хайлоад в телекоме.
mmMike
Коллеги из отдела разработки ПО для платежных терминалов постепенно переходят на Java (android). Все современные терминалы идут в основном уже "не голый C++/C" без OS, а под Android.
Я помню, сколько стоило перетащить ПО с одной платформы (POS терминалы) на другую (другой проц) с особенностями адресации и сегментации.
Конечно для какого ни будь контроллера c ядром Cortex-M3 иногда даже на C/C++ места впритык.
Но я все равно не хотел бы для пром. комплексов (unix/linux) где нет жестких ограничений по ресурсам писать на С++. Просто могу сравнить сколько на разработку развитие и поддержку одних и тех же по функционалу программ уходит, если писать на С++ и на Java.
Зачастую проще переписать старую программу сделанную на С++ под Java, чем продолжать развитие этой старой программы на С++.
Собственно, это часто приходится делать в последние годы. Дешевле переписать и внести новый функционал уже в переписанное, чем развивать старое.
И зачастую это ПО я сам лет 10 назад писал. Т.е. проблема не в том, что бы вникнуть как это старое работает. А просто активно не хочется продолжать его развивать на С++.
Займет больше времени и передать некому (найти С++ разработчика с опытом - проблема)
Так что, для общих задач (перекладывания байтиков в протоколах типа json и работа с БД) пусть мазохисты используют С++. У меня есть возможность сравнить и для меня выбор очевиден.
vvromanov
Если уж пошли обиды, то тут уже я чувствую презрение к этим "перекладывателям байтов" на с++.
mmMike
Я последние лет 5 пишу исключительно "перекладыватели байтов из одного протокола в другой и в БД". В общем то все задачи процессинга платежей и переводы денег к этому и сводятся.
Отдушина - хоббийные программки. Хотя.. то же укладывние видеопотока в TCP/IP - это то же перекладывание байтиков/битиков.
Но перекладывать байтики и битики, для типичных моих задач на работе, не изобретая велосипед проще на Java (+python +js)
Попробуй найди нормальную библиотеку реализации HTTP сервера, или обработки Json, которая "широко известна и используется в широких кругах", а не "широко известна в узких кругах С++". А Postgre/Oracle клиент (полный как jdbc, а не OCI драйвер) под C++? а клиент kafka под C++?
vvromanov
Все это очень круто. Но есть одна проблема - все это ужасно медленное. Там где скорость не критична, можно писать хоть на визуал бейсике. Если гуй - С#, если json попарсить - питон, если посчитать носки на складе - Ява подойдёт. А вот если нужна скорость - с/с++.
mmMike
Переписанный обработчик с C++ под java.
TCP/IP listener (не http), TCP/IP клиент и коннект к БД. XML поверх TCP/IP
Фактически навороченный маршрутизатор.
на бою работают обе версии (на разных комплексах, но на одной физически машинке).
Так вот.. в быстродействии разницы нет. Что там что там в районе 20..30 ms на обработку через БД и маршрутизацию.
Да. ресурсов C++ вариант потребляет меньше. но не принципиально. где то на 70-80% (процент большой большие, но от общей памяти сервера разница не значительная).
Но насколько удобнее и проще:
вносить изменения и новый функционал.
Не надо выпускать много дистрибутивов под каждые аппаратные платформы (и тестировать их)
Не надо ставить драйвер БД, поскольку Jdbc это thin драйвер. 4.логирование апачевским log4j2 в централизированое хранилище (не находил для C++ точного аналога)
Понадобился асихронный канал для маршрутизации - нет проблем. Вот клиент для kafka (java). А для С++ куда ни сунешься - попробуй найди библиотеку.
eao197
Простите, не совсем понятно:
С++ версия потребляет на 70-80% процентов меньше памяти? CPU?
mmMike
памяти.
IO Операции (сетевые) что в Java что в С++ потребляют фактически одинаково CPU. Что С++, что Java это обертка над системными вызовами IO операций. Сравнивать производительность имеет смысл вообще только для каких то нагруженных вычислений. А когда 99% работы - это IO операции (вызовы OS), то выгоды в C++ нет.
А SAX парсер java или xerces C++ для 10Кб XML это неуловимая разница (даже если она есть).
eao197
Понятно, спасибо.
Из того, что вы рассказываете возникает вопрос: а зачем версия на С++ вообще была нужна?
mmMike
Потому что некоторые программы еще из 1997 года.
А большинство создавалось в начале 2000х.
И оно до сих пор работает и активно используется. постепенно переписываясь. Потому что не так тривиально все это переносить на новые платформы аппаратные и OS (мир не заканчивается на x86).
eao197
Тогда все понятно, спасибо.
vvromanov
10 лет назад на десктопном комьютере время отклика укладывалось в 2ms с обращениями к базе данных. И 20к запросов в секунду.
mmMike
Ну наверное БД не содержала несколько десятков млн записей и довольно большой PL/SQL код прикладной логики на вызов.
kovserg
"staright c++ позволяет использовать 0.25% вычислительной мощности..."
0xd34df00d
Или раст. Или, прости Бь-рне, хаскель.
0xd34df00d
Личный опыт показывает, что если на «C/C++» нет проблем с памятью, то вы либо их ещё не нашли, либо у вас хелловорлды.
vvromanov
Система, которая управляет доступом пользователей к мобильной сети в Йота - это hello world? Другой пример - ReGet.
0xd34df00d
Ну вот этот ваш другой пример у меня крашился, например, когда я им пользовался лет 15-20 назад (когда все эти качалки были ещё актуальны).