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 About: C ++ is still one of the most popular development languages. There is quite a number of people that want to start learning it and become a C++ developer. They face questions like: "Where should I start? What and in what order should I study? What books should I read?" We tried to answer these questions in the presented roadmap. The map focuses on general competencies and skills that could be found in most projects. It is designed to help those who are just starting their education or have little experience. You can create a more productive learning plan without being distracted by side information if you study the set of listed materials. It will help you to master C++ at the level that is used in many commercial projects. How to use: Если у вас есть замечания, вопросы или предложения, будем рады получить любую помощь и поддержку. Мы открыты для общения :) Для этого используйте следующие механизмы Github: - Предложения/правки по репозиторию - создавайте и присылайте новый PR в Pull Requests Feedback: Optional Junior Middle Senior The middle developer has the skills to create a design for new functionality as a part of a component/application if even there're not enough requirements or information presented. The senior developer has the skills to create a design and make decisions for a solution/component taking into account business area context. The junior must acquire the following skill as soon as possible: to write easy-readable and well-structured code. The juniors should be aware of middle/senior skills. It's enough to have a basic understanding of them. The "steps" are presented on this map. They're intended to show an easy for newbies to be able to get confident base knowledge about the language at the beginning. Repository: https://github.com/salmer/CppDeveloperRoadmap