C++ developer Soft skills Hard skills Сначала может показаться, что некоторые из навыков развивать невозможно. Однако мы считаем иначе. Над каждым из пунктов возможно работать. Всё упирается в желание и внутренние блоки. Всё индивидуально, и зависит от вас. :) Умение учиться Работа с ошибками Мышление Ответственность Управление ресурсами Коммуникация Командная работа Эмоциональный интелект Понимание контекста разработки Клиентоориентированность Технологии Тренды Эмпатия Концентрация Открытость новому Адаптируемость Стрессоустойчивость Работа в неопределённости Понимание распределения ролей в команде Помощь Работа в распределённой команде Предоставление обратной связи Лидерство Наставничество Делегирование Постановка задач сотрудникам Планирование и целеполагание Переговорческие навыки Английский язык Презентация Навык переписки Нетворкинг Умение слушать Убеждение Умение доносить мысль/идеи внутри команды Поиск компромиссов Регулирование споров Подача информации людям вне команды Тайм-менеджмент Приоритезация Принятие решений Слепая печать Многозадачность Дисциплина Упорство Инициативность Самостоятельность Решение проблем Логическое Критическое Креативное Стратегическое Системное Восприятие критики Своевременное сигнализирование об ошибках Признание своих ошибок Анализ ошибок Умение задавать правильные вопросы Экспериментирование Управление знаниями Работа с информацией Умение собирать информацию, анализировать её и выдавать взвешенное  решение. Рефлексия Cпокойно реагировать на то, что люди говорят. Скорее всего, они учитывают только собственный контекст, когда что-то пытаются доказать. Это нормально. Оценивайте полезность их точки зрения. Брать сложные задачи, чтобы развивать свои навыки и компетенции, даже когда недостаточно знаний/опыта (через такие задачи гораздо быстрее развиваются навыки). Главное отличить реально полезную сложную задачу, которая прокачает, от задачи, на которую ищут крайнего. Быть ответственным за профессиональное развитие. Не ждать пока тимлид решит, что изучать. Не стоит забывать, что слепое следование чужому плану заточит под задачи конкретной компании. Стоит обсуждать и встраивать свои интересы в план. Если этого не сделать - высокий риск получить "непереносимые" компетенции, что ударит по карьерным возможностям. Но и не стоит ударятся в крайности: изучать абсолютно всё подряд или пассивно ждать, пока выдадут план развития. Самоорганизация Способность предоставлять тот объем информации, который необходим для общения с людьми разного бекграунда. Решение конфликтов Достаточно уверенного чтения документации и статей, но для более перспективных вакансий разговорный/письменный навык становится обязательным. Искать единомышленников и присоединяться/создавать комьюнити для общения и передачи опыта. Чтобы быть конкурентоспособным, стоит изучать и наблюдать за новыми веяниями, а также уметь адаптироваться под них. Опытному разработчику стоит развивать навыки управления и общения с бизнесом для эффективного выполнения задач. Это легче делать, если развит эмоциональный интеллект. Для джуниора навык также полезен, чтобы лучше взаимодействовать с коллегами. 1 этап Folder 1 Базовые операции Арфиметические операции Циклы for/while Логические операции Битовые операции Функции lambda Операторы Типы данных Динамическая типизация Статическая типизация RTTI Указатели и ссылки Организация кодовой базы Ссылки Модель памяти Умные указатели Сырые Указатели Разделение кода на headers/cpp юниты Область видимости Утечки памяти Forward declaration unique_ptr shared_ptr Время жизни Операторы new/delete weak_ptr Пространство имён Перегрузка стандартных операторов для различных типов/структур/классов. Чтобы избежать проблем с управлением памятью, старайтесь писать код используя ссылки и умные указатели. 2 этап Folder 2 Структуры и классы Обработка ошибок Перегрузка методов Таблица вирутальных методов ООП Исключения Access violation Динамический полиморфизм Виртуальные методы Правило нуля/трех/пяти Статический полиморфизм Множественное наследование Ромбовидное наследование Коды возврата Не используйте множественное наследование 3 этап Folder 3 auto (автоматическое выведение типов) Концепции языка type casting static_cast const_cast dynamic_cast reinterpret_cast Неопределённое поведение (Undefined Behavior) Поиск, зависящий от аргумента (ADL) Макросы Name mangling Стандартная библиотека Поток ввода/вывода Алгоритмы стандартной библиотеки Итераторы Контейнеры Дата/время Многопоточность Языковые конструкции для которых отсутствуют прописанные требования в стандартах. В случае ошибки дальнейшее поведение будет предсказать невозможно, и всецело будет зависеть от контекста выполнения или платформы, где запущено приложение. Этап 4 Folder 4 Шаблоны Variadic templates Специализация шаблона type traits SFINAE Полная специализация Частичная специализация RAII pimpl Erase-Remove Non-Copyable/Non-Moveable Copy and swap Copy on write CRTP Стандарты C++11/14 C++17 C++20 newest C++0x Идиомы 1 этап Folder 5 Работа с исходным кодом Текстовый редактор IDE Редакторы исходного кода Отладчик Линтеры Знание о базовых возможностях (shortcuts, tools, plugins) Умение читать сообщения отладчика Отладочные символы WinDbg GDB Выберите один из понравившихся популярных IDE и хорошо освойте его: Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode и т.д. Научитесь пользоваться отладчиком. Изучите его возможности. Выберите один из популярных редакторов и хорошо освойте его. К примеру: Notepad++, Atom, и т.д. Навык работы с отладчиком в через командную строку - узконаправленный навык. В регулярной работе достаточно уметь работать с отладчиком в рамках IDE. Ознакомьтесь с самыми распространёнными ошибками (segfault, out of memory, access violation) и концепцией  неопределённого поведения (undefined behavior) Выберите один из популярных редакторов и и хорошо освойте его: Visual Code, Atom, Sublime Text и т.д. 3 этап Folder 6 Компиляторы Базовые знания работы компиляторов Компиляция кода в объектные файлы Компоновка объектных файлов в приложение (линковка) Этапы работы компилятора Платформозависимые компиляторы У компиляторов есть свои особенности, о которых хорошо бы знать: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGW Есть несколько этапов работы компилятора, которые хорошо бы знать. Это помогает ошибки решать проблемы сборки на разных этапах. Достаточно базово понимать, что происходит. Детали работы нужны разработчикам компиляторов 5 этап Folder 7 Системы сборки CMake Makefile ninja Пакетные менеджеры vcpkg spack Conan nuget Библиотеки boost opencv poco Подключение библиотек protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl Фреймворки gtest/gmock Qt catch2 google profiler pytorch c++ 1 этап Folder 8 Информатика Информатика Алгоритмы Булева алгебра Конечные автоматы Также необходимо понимать, как вычислить сложность и потребление памяти у алгоритмов. 4 этап Folder 9 Системы контроля версий Распределенные Централизованные SVN git Mercurial Практики разработки Качество кода Правило оформления кода Принципы разработки KISS (Keep It Simple, Stupid) DRY (Don't Repeat Yourself) YAGNI (You Aren't Gonna Need It) APO (Avoid Premature Optimization) BDUF (Big Design Up Front) Композиция предпочтительнее наследования Бритва Оккама Разделяй и властвуй Логирование и телеметрия Ревью кода Умение читать чужой код Ревью чужого кода Понимание жизненного цикла производства ПО Реализация Тестирование Поддержка Версионирование ПО Юнит тесты Интеграционное Функциональное Производительность Формирование архитектуры и дизайн компонентов Интеграция компонентов Выпуск Сбор требований Окончание жизненного цикла Анализаторы кода Статические Динамические Профайлеры C++ core guidelines Промышленные стандарты MISRA Autosar Работа с командной строкой batch Powershell bash CI/CD Trunk Based Development Zero downtime deployment Создание пакета поставки ПО Документация Инсталлятор Использование других языков программирования Межязыковое взаимодействие Правила именования переменных, пробелы vs табы, положение фигурных скобок и т.д. Настроить форматирование и автоматически проверять в одной из утилит: clang-format, Resharper - стиль кода, MSVS - стиль кода. - Скриптовые - Функциональные - SQL like - NoSQL - Брагилевский :) Иногда требуется предоставить обертку к библиотеке, написанной на C++ для другого ЯП, например Python или C#. Для этого применяют специальные библиотеки/фреймворки. Обратная совместимость Проектирование ПО Архитектурные стили Component-based Monolithic application Layered Client-server Microservices architecture Event-driven Plug-ins REST Service-oriented architecture этап 2 Folder 10 Паттерны проектирования (GoF) Поведенческие Структурные Порождающие ООП SOLID UML Архитектурные паттерны MVC MVVM Three-tier Onion Hexagon Методологии Test Driven Development Behavior Driven Development Domain Driven Design Память Абстракции памяти Выравнивание памяти Управление памятью Бинарные единицы Исполняемый файл Статическая библиотека Динамическая библиотека Стек Глобальная память Куча Память приложения Виртуальная память Операционные системы Многопоточность Ошибки Dead lock Race condition Live lock Starvation Потоки Конкуренция Мьютексы Семафоры Алгоритмы без блокировок (lock-free) Обработка событий Синхронные Асинхронные Процессы Межпроцессное взаимодействие Shared memory Pipes Сериализация json XML Сетевой стек TCP/IP OSI Сокеты HTTP TCP UDP Файловая система Планировщик Виртуализация VirtualBox VMware Workstation Контейнеризация Hyper-V Docker Облачные сервисы Kubernetes Безопасность Шифрование Многопроцессорные системы Multicore CPU NUMA Ввод и вывод информации Драйверы Аудио Графическое вычисление/отображение Печать DirectSound OpenAL DirectX Vulkan OpenGL CUDA Общие навыки Языковые инструменты Синтаксис языка C++ Developer Roadmap О карте: С++ всё ещё является одним из самых популярных языков разработки. Есть немало желающих начать его изучать и стать C++ разработчиками. Перед такими людьми встают вопросы: "С чего мне начать? Что и в каком порядке мне изучать? Какие книги стоить почитать?" Мы попытались ответить на эти вопросы в представленной дорожной карте. Карта акцентируется на общих компетенциях и навыках, которые встречаются в большинстве проектов. Она призвана помочь тем, кто только начинает свое обучение или имеет небольшой опыт. Изучив набор перечисленных материалов, вы сможете составить более продуктивный план обучения, не отвлекаясь на побочную информацию. Это поможет вам освоить C++ на том уровне, который встречается во многих коммерческих проектах. Больше информации: https://github.com/salmer/CppDeveloperRoadmap Кто создал: Создатели: - https://github.com/salmer - https://github.com/DmitrievDmitriyA Рецензенты: - https://github.com/marleeeeeey - https://github.com/MolinRE - https://github.com/SD57 - https://github.com/SergeiSkliar - Сообщество :) Как ориентироваться: Если у вас есть замечания, вопросы или предложения, будем рады получить любую помощь и поддержку. Мы открыты для общения :) Для этого используйте следующие механизмы Github: - Предложения/правки по репозиторию - создавайте и присылайте новый PR в Pull Requests Предложения и замечания: Optional Junior Middle Senior Мидл способен создать дизайн и решения для функционала внутри компонента/приложения даже в случае неполноты требований. Синиор способен создать дизайн и решение для компонента/приложения с учётом бизнес-контекста. Джуниору важно научиться писать структурированный код и не усложнять его без надобности. Код должен быть легко читаемым и поддерживаемым. От джуниора ожидается осведомленность про категории, которые относятся к Middle/Senior. Будет достаточным поверхностное понимание темы. На карте представлены компетенции, которые выделены в "этапы". Мы считаем, что джуниору стоит начинать изучение в данном порядке, чтобы выстроить прочный фундамент.