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.
Будет достаточным
поверхностное понимание
темы.
На карте представлены
компетенции, которые
выделены в "этапы". Мы
считаем, что джуниору
стоит начинать изучение
в данном порядке, чтобы
выстроить прочный
фундамент.