diff --git a/.gitignore b/.gitignore index 2df2fe7..aed6c97 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ Gemfile.lock .idea/ *.swp *~ +*.dtmp # OS files .DS_Store diff --git a/.lycheeignore b/.lycheeignore index f4dd7ae..5403a44 100644 --- a/.lycheeignore +++ b/.lycheeignore @@ -16,7 +16,28 @@ https://(en|ru|zh)\.cppreference\.com/.* https://isocpp\.org/.* # Intel blocks automated clients (bots) https://www\.intel\.com/.* +# cppcon.org and misra.org.uk answer 200 from browsers and residential IPs +# (any User-Agent) but 403 to GitHub-hosted runner (datacenter) IPs — same +# situation as cppreference/isocpp above. Surfaced once the lychee cache was +# discarded as too old. +https://cppcon\.org/.* +https://misra\.org\.uk/.* +# ko2.co.uk answers 200 from browsers and residential IPs (any headers) but +# 415 to GitHub-hosted runner IPs — a WAF quirk on their end, same class of +# datacenter-IP false positive as the entries above. +https://www\.ko2\.co\.uk/.* # Our own /goto/ redirect pages: a PR that adds a new one always 404s until # it is merged and GitHub Pages redeploys, so checking them pre-merge is a # guaranteed false positive (chicken-and-egg). https://salmer\.github\.io/CppDeveloperRoadmap/goto/.* +# sfml-dev.org is fast from normal networks (~0.1s) but repeatedly times out +# from GitHub's datacenter runners, and lychee counts timeouts as failures. +# Referenced from PetProjects.md in all three languages. Remove once it stops +# flaking from CI. +https://www\.sfml-dev\.org.* +# autosar.org serves only the leaf certificate without the intermediate one +# ("unable to verify the first certificate"). Browsers paper over this by +# fetching the missing intermediate via AIA, strict TLS clients do not, so CI +# reports an untrusted certificate. Server-side misconfiguration on their end, +# nothing we can fix; drop this line once they fix their chain. +https://www\.autosar\.org.* diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..eb273d0 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,250 @@ +# Заметки для ИИ-агентов: работа над дорожной картой + +Этот файл — журнал работ и инструкция для ИИ-агентов (и людей), продолжающих улучшение дорожной карты. Обновляйте его при каждом значимом изменении. + +> Человекочитаемый перечень всех правок (для ручного переноса в другие языки) — в [ROADMAP-CHANGES-RU.md](ROADMAP-CHANGES-RU.md). + +> **ВАЖНО: карту редактирует и сам владелец репозитория, вручную в draw.io.** +> Перед любой правкой заново извлекайте XML из `Russian/Graph/roadmap.drawio.svg` — +> нельзя переиспользовать XML, извлечённый в прошлой сессии, иначе чужие правки будут затёрты. +> Перед записью файла сверяйте `LastWriteTime`: если он новее вашей копии — перечитывайте. + +## Соглашения репозитория + +- **Сообщения коммитов — только на английском.** Содержимое статей и карты ведётся + на русском/английском/китайском, но история git — англоязычная. +- Ветка `main` — основная; работать через отдельные ветки и pull request'ы. +- Имена файлов статей и URL менять нельзя: на них ссылаются извне (TODO, п. про совместимость). + +## Устройство карты (важно понимать перед правками) + +- Карта каждого языка — один файл `<Язык>/Graph/roadmap.drawio.svg`: SVG-изображение со **встроенным исходником draw.io** в атрибуте `content` корневого тега `` (несжатый mxfile XML). +- **Нельзя редактировать SVG-часть руками** — только через draw.io (десктоп/веб/VS Code-расширение) или через цикл «извлечь XML → править XML → пересобрать через draw.io CLI». +- Легенда цветов (fillColor): Optional `#CCEEFF`, Junior `#96BB7C`, Middle `#FAD586`, Senior `#BBCCEE`, розовые подсказки `#FFD5E4`, серые боксы этапов `#F5F5F5`. +- Внешние ссылки на карту идут через редиректы `goto/*.html` (drawio/miro/svg) со счётчиком GoatCounter — имена файлов и URL менять нельзя (TODO.md, п.6). + +### Проверенный конвейер правок через CLI (Windows) + +1. Извлечь XML: атрибут `content` из `` (PowerShell: `([xml](Get-Content $svg -Raw)).svg.content`). +2. Править XML (текстовые правки, новые узлы `mxCell` + рёбра). Новым узлам давать строковые id с префиксом (использован `n900`–`n914`), чтобы не конфликтовать с числовыми. +3. Экспорт: `draw.io.exe -x -f svg -e -u --svg-theme auto -o out.drawio.svg in.drawio` (draw.io 30.2.6, `%LOCALAPPDATA%\Programs\draw.io\`). +4. **Обязательно**: CLI ставит прозрачный фон — вернуть в SVG-теге `style="background: #ffffff; background-color: light-dark(#ffffff, #121212); color-scheme: light dark;"`. +5. Верификация: рендерить SVG в **headless Edge** (`msedge --headless=new --screenshot=... --window-size=...` + HTML-обёртка с окнами-панелями в нужные области). Интерактивные скриншоты браузера на этом SVG (5500×15200 px) виснут. + +### Известные грабли + +- **PNG-экспорт draw.io CLI на этом файле глючит**: контент неравномерно смещается по вертикали. Для проверки рендера PNG-экспорту доверять нельзя — только браузерный рендер SVG. +- Рёбра в карте имеют явные waypoint-массивы (``), вертикальные «шины» (например, x=3635.25 у библиотек, x=3970.6 у «Работы с исходным кодом», x=4240.6 у отладчика). Новые рёбра строить по тому же паттерну; горизонтальные сегменты вести в «пустых полосах» между рядами боксов (шаг рядов 60 px, высота бокса 30 px). +- В тексте узлов переносы строк — это ` ` в атрибуте `value`. + +## Сделано 2026-07-11 — ТОЛЬКО в русской карте (`Russian/Graph/roadmap.drawio.svg`) + +Пакеты правок «4–6» (безопасные, без изменения структуры знаний): + +### Опечатки и язык +- «Таблица вирутальных методов» → «виртуальных» (id 122) +- «Эмоциональный интелект» → «интеллект» (id 23) +- «Переговорческие навыки» → «Переговорные навыки» (id 43) +- «не стоит ударятся» → «ударяться» (id 81) +- «Какие книги стоить почитать?» → «стоит» (id 400, вводный текст карты) +- Латинская «C» в «Cпокойно реагировать…» → кириллическая «С» (id 79) +- Убрано задвоенное «и и» в подсказке про редакторы (id 190) + +### Устаревшие инструменты +- Atom (мёртв с 2022) убран из подсказок id 187 и id 190 → Notepad++/Sublime Text и VS Code/Sublime Text/Zed +- Eclipse убран из подсказки про IDE (id 185); «Clion» → «CLion»; добавлен VS Code +- SVN/Mercurial/tensorflow уже были помечены Optional — правка не потребовалась + +### Исправлены названия библиотек +- `pybindll` → `pybind11` (id 216), `ranges_v3` → `range-v3` (id 218) + +### Новые узлы (все Optional `#CCEEFF`, id n900–n914 с рёбрами) +- **LLDB** (n900) — под GDB/WinDbg у «Отладчика» + стрелка от розовой подсказки про CLI-отладчики +- **Compiler Explorer (godbolt.org)** (n903) — потомок «Работы с исходным кодом», под «Линтерами» +- **Valgrind** (n905), **perf / VTune** (n906) — потомки «Профайлеров» +- **Asio** (n909), **nlohmann/json** (n911) — в «Популярных библиотеках» +- **google benchmark** (n913) — во «Фреймворках» + +Верифицировано: пиксельный diff старого/нового рендера + визуальный осмотр всех изменённых областей; тёмная тема (light-dark) работает. + +## Сделано 2026-07-12 — структурные пакеты, ТОЛЬКО в русской карте + +### Пакет «Современный C++» (id n920–n943) +- **Стандарты**: узел «C++0x» переименован в **«C++26 (newest)»** (Optional), «newest» → **«C++23»** (Senior). Порядок на карте: 11/14, 17, 20, 23, 26 ✓ +- **Move-семантика** (Middle) — новая ветка в «Концепциях языка»: «Категории значений (lvalue/rvalue)», «std::move / std::forward», «Perfect forwarding» (Senior) +- **Concepts (C++20)** (Middle) — в «Шаблонах», под SFINAE +- Стандартная библиотека — добавлены как дети соответствующих узлов: «std::format / std::print» → у «Потока ввода/вывода», «std::span / std::string_view» → у «Контейнеров», «std::ranges» (Senior) → у «Алгоритмов» +- Обработка ошибок: «std::optional / std::expected» (Middle), «noexcept» (Middle), «std::error_code» (Optional, ребёнок «Кодов возврата») +- Многопоточность (раздел ОС): «std::atomic, модель памяти C++» (Senior), «condition_variable», «future / promise / async» (Middle), «jthread (C++20)» (Optional) +- НЕ добавлены (решение отложено, чтобы не перегружать «Концепции языка»): `constexpr`/`consteval`, Coroutines, Modules — см. «Осталось» + +### Пакет «AI-секция» (id n944–n955, TODO.md п.3) +Блок «AI-инструменты» (Junior) — ребёнок «Практик разработки»: «AI-ассистенты (Copilot, Claude Code, Cursor)», «Верификация сгенерированного кода», «Политика компании и конфиденциальность» (все Junior), «Лицензионные риски генерируемого кода» (Middle), «Локальные модели» (Optional) + розовая подсказка «AI может генерировать правдоподобный, но неверный код — проверяйте и тестируйте всё. Знание C++ обязательно». + +### Пакет «Регуляторика и безопасность» (id n956–n965, TODO.md п.4) +- «Промышленные стандарты»: «MISRA» → «MISRA C++:2023»; добавлены (все Optional): «EU Cyber Resilience Act (CRA)», «SBOM», «IEC 62304 (медицина)», «ISO 26262 (автомобили)», «DO-178C (авиация)» +- «Безопасность» (раздел ОС): «Уязвимости: buffer overflow, use-after-free» (Middle), «Санитайзеры (ASan / TSan / UBSan)» (Middle), «Fuzzing» (Optional), «CERT C++ / CWE» (Optional) + подсказка про тренд memory safety (регуляторы США/ЕС) + +Верифицировано: headless-Edge-рендер всех 9 изменённых областей — узлы, рёбра и подсказки без наложений. + +## Сделано 2026-07-20 — по запросам из GitHub issues, ТОЛЬКО в русской карте + +- **«constexpr / consteval»** (Middle, id n1000) — в «Концепциях языка», между ADL и веткой move-семантики. Закрывает issue **#106** (после переноса в en/zh можно закрывать со ссылкой на коммит). +- **«OpenMP / TBB»** (Optional, id n1002) — в «Многопоточности» раздела ОС, под «jthread (C++20)». Закрывает issue **#53** (просили именно optional-узел про OpenMP; TBB добавлен как родственный task-based фреймворк). + +## Сделано 2026-07-20 (позже) — компоновка + +Узел «Compiler Explorer (godbolt.org)» не влезал: оказался в зазоре между рамками «1 этап» и «3 этап». +Рамка «1 этап» (id 6) увеличена по высоте на 60 px (514.92 → 574.92), всё ниже неё в правой половине +карты сдвинуто вниз на 60 px: условие сдвига `x >= 2900 && y >= 5231` (238 узлов, 403 точки рёбер). +**Исключение:** точки `(2945.25, 6375.17)` — «локти» магистрали на уровне узла «Hard skills» (id 14), +который не двигается; без исключения рвётся центральная линия карты (4 ребра: 679, 690, 703, 737). +Скрипт: `scratchpad/shift.ps1`. Левая (soft skills) половина не двигалась. Высота карты 15182 → 15242 px. + +Затем разгружена область «Практики разработки» (после вставки AI-блока там всё слиплось): +подсказка n955 перевёрстана в 3 строки и сужена 560 → 430 (правым краем заходила на магистраль +ветки «жизненный цикл» на x=4557); ветка «Анализаторы кода» и всё ниже сдвинуты на 150 px +(`x >= 2900 && y >= 9280`, 138 узлов, 225 точек). Подсказка 297 «Не игнорируйте предупреждения…» +лежит выше порога, но относится к «Анализаторам кода» — сдвинута отдельно. +Порог 9280 выбран так, чтобы не задеть ветку «Понимание жизненного цикла» (её низ — 9233). +Высота карты 15242 → 15392 px. + +**Грабли при таких сдвигах:** если двигаешь узел явно, а потом прогоняешь общее правило — +узел сдвинется **дважды**. Так и вышло с 297 (уехал на 300 px и наехал на «Анализаторы кода»). +Либо исключай такие узлы из общего прохода, либо сдвигай их после него. + +**Вторые грабли — рамки этапов.** Рамки «N этап» (id 2–11) — это обычные vertex'ы, а не +контейнеры (`container=0`, дети не вложены). Если порог сдвига проходит *внутри* рамки, +её содержимое уедет, а рамка останется прежнего размера, и узлы вылезут наружу. +Так и вышло с рамкой «4 этап» (id 10). После любого сдвига проверяй: для каждой рамки +низ рамки >= низа самого нижнего элемента внутри неё. + +## Сделано 2026-07-20 (ещё позже) — перенос AI-блока под CI/CD + +По просьбе владельца AI-блок переехал из промежутка «жизненный цикл / анализаторы» +(там было тесно и не по смыслу) вниз, сразу после ветки CI/CD. Скрипт `scratchpad/move_ai.ps1`: +1. откат сдвига −150 (`y >= 9430`) + отдельно узел 297 — старое место вернулось к исходному виду; +2. `+420` для `y >= 10240` — освобождено место под CI/CD; +3. высота рамки «4 этап» +420 (иначе содержимое вылезает, см. грабли выше); +4. перенос 7 узлов блока (n944–n949, n955) на +1433.05 вместе с точками рёбер n978–n982; + у ребра n977 (242 → n944) сдвинут **только** локоть со стороны AI (y≈8865), локоть + со стороны «Практик разработки» (y≈8674) остался на месте. + +Высота карты 15392 → 15662 px. + +## Сделано 2026-07-20 (последнее) — точки крепления связей + +Наследие импорта из Miro: у связей стояли произвольные `exitX/exitY` и `entryX/entryY` +(0.19, 0.3, 0.38, 0.62, 0.92…), из-за чего несколько связей выходили из разных точек одной +грани и сходились веером. Скрипт `scratchpad/fix_edges.ps1` (`-Apply` для записи) пересчитывает +крепление на середину грани, обращённой к линии: + +- сторона определяется по первой точке излома (для выхода) / последней (для входа); + если опорная точка внутри bbox узла — крепление не трогается (так сохранены осознанные + выходы «вниз», например у ветки «Безопасность»); +- первый/последний сегмент выравнивается по горизонтали: y «локтя» подтягивается + к центру узла (в исходнике был сдвиг на 2–5 px); +- связи со стилем `curved=1` (выноски-подсказки) пропускаются целиком. + +Итог: 159 точек выхода, 111 точек входа, 285 изломов. Состав карты не менялся. +Скрипт идемпотентен — повторный прогон даёт 0 изменений. + +## Сделано 2026-07-20 (финал) — Coroutines и Modules + +Закрыт остаток пакета «Современный C++». Скрипт `scratchpad/add_coro.ps1`: +1. `+130` для `y >= 3140` (291 узел, 486 точек, 4 локтя магистрали сохранены) — освобождено + место в колонке «Концепции языка» под два новых узла; +2. высота рамки «3 этап» (id 4) +130; +3. добавлены **«Coroutines (C++20)»** (Senior, `#BBCCEE`) и **«Modules (C++20)»** + (Optional, `#CCEEFF`) как дети «Концепций языка», ниже «Move-семантики». + +Разделение уровней: корутины реально применяются (asio, генераторы) — Senior; +модули пока сырые в тулчейнах — Optional. Высота карты 15662 → 15792 px. + +После сдвига прогнана проверка всех рамок «N этап» (id 2–11) на вылезание содержимого — +все 10 в порядке. + +## Сделано 2026-07-21 — приведение статей в соответствие карте (TODO п. 2.1) + +Разбор показал: статьи и карта расходились ровно в одном месте — **Tooling.md**. Остальные +файлы (Grades/*, Books/*, Mythbusters, HowToStudy) описывают ожидания и литературу в общих +терминах и карте не противоречат — их не трогали. + +Правки в `Russian/Tooling.md`: +- **удалён раздел про Eclipse IDE** — карта его больше не рекомендует (мёртв для C++); + на его место добавлен **Xcode**, который в подсказке на карте есть, а в статье не был; +- `JetBrains Clion` → `JetBrains CLion`, `Visual Code` → `Visual Studio Code`; +- добавлен **WinDbg** (на карте есть в ветке «Отладчик», в статье не было); из описания LLDB + убрана фраза про отладчик Visual Studio под Windows — она дублировала новый пункт; +- добавлен **фаззинг** (libFuzzer, AFL++) — на карте есть в ветке «Безопасность»; +- добавлен раздел **«Тестирование и бенчмарки»** (GoogleTest, Catch2, Google Benchmark) — + на карте ветка «Фреймворки» есть, а статьи не отвечали, чем писать тесты, хотя грейд + Junior их требует; +- добавлен раздел **«AI-инструменты»** (Copilot, Claude Code, Cursor, локальные модели) + плюс блок предупреждений — зеркалит ветку «AI-инструменты» на карте, включая пункты + про верификацию, политику компании и лицензионные риски. + +Все 12 новых URL проверены curl'ом — отвечают 200 (в репозитории есть workflow lychee). + +## Сделано 2026-07-21 (продолжение) — две новые статьи + +Закрыты три пробела, оставленные на решение владельца. + +**Новый файл `Russian/Libraries.md`** — «Популярные библиотеки и фреймворки». Зеркалит ветки +«Популярные библиотеки» и «Фреймворки» с карты, сгруппировано по назначению: общего назначения +(Boost, {fmt}, spdlog, range-v3), сеть и обмен данными (Asio, nlohmann/json, protobuf, gRPC, +POCO), GUI (Qt — с отдельным предупреждением про лицензирование), вычисления и ML (OpenCV, +Eigen, CUDA/OpenCL, LibTorch/TensorFlow), связка с другими языками (pybind11). Инструменты +разработки намеренно не дублируются — есть перекрёстная ссылка на `Tooling.md`. + +**Новый файл `Russian/Compliance.md`** — «Стандарты кодирования и регуляторные требования». +Закрывает и TODO п. 4 (MDR и приближающиеся требования). Разделы: стандарты кодирования +(MISRA C++:2023 с пояснением, что в него влился AUTOSAR C++14; SEI CERT C++; Core Guidelines), +функциональная безопасность (IEC 61508 как базовый, ISO 26262 / IEC 62304 + MDR / DO-178C), +кибербезопасность (EU CRA, SBOM — SPDX и CycloneDX), что меняется в работе на практике +и раздел «кому это действительно нужно» (важно: **не всем**, чтобы джуниоры не пугались). +Проставлена пометка, что сроки и требования меняются и сверяться нужно с актуальными редакциями. + +**`Books/Middle.md`** — добавлена книга Джосаттиса «C++ Move Semantics: The Complete Guide» +(leanpub.com/cppmove): ветка move-семантики на карте новая, а в книгах тема не была закрыта. + +**`Russian/README.md`** — обе новые статьи добавлены в список статей после «Инструментария». + +**Новый файл `Russian/AI.md`** — «C++ разработчик и искусственный интеллект». Закрывает TODO п. 3 +(«отдельная заметка про ИИ»). Тезис владельца — «ИИ никого не уберёт, хорошие инженеры нужны, +модель генерирует только то, чему обучена» — взят за основу, но подан с калибровкой: есть +отдельный раздел «что действительно меняется» (рутина обесценивается, планка входа выросла) +и раздел «чего никто не знает» — чтобы статья не читалась как самоуспокоение. Ключевые +C++-специфичные аргументы: перекос обучающих данных в сторону старого C++ (`new`/`delete` +вместо умных указателей), UB не ловится тестами, время жизни объектов — самое частое место +ошибок модели. Отдельный раздел про ловушку для новичков: главный риск не «отнимет работу», +а «помешает научиться». + +> При правке этой статьи держите в голове: её писала языковая модель — то есть заинтересованная +> сторона. Формулировки намеренно сдержанные, без обещаний в обе стороны. Если будете +> дополнять, лучше сохранить этот тон. + +Ссылки: все внешние URL проверены curl'ом (200), внутренние — существованием файлов. +Якорные ссылки на разделы (`Tooling.md#...`) намеренно не используются — в репозитории нет +ни одного прецедента, и lychee их не проверяет, так что опечатка осталась бы незамеченной. + +## Осталось сделать + +### 1. Перенести ВСЕ правки в английскую и китайскую карты +`English/Graph/roadmap.drawio.svg` и `Chinese/Graph/roadmap.drawio.svg` **не тронуты** — там всё ещё Atom, Eclipse, pybindll, ranges_v3, C++0x; нет LLDB/godbolt/Valgrind/perf/Asio/nlohmann/benchmark, нет move-семантики/Concepts/std::ranges и т.д., нет AI-секции и регуляторики. Полный перечень правок — в [ROADMAP-CHANGES-RU.md](ROADMAP-CHANGES-RU.md). Структура и id узлов в этих файлах могут отличаться — сверять по текстам узлов, не по id. Русские тексты новых узлов переводить, названия библиотек/стандартов оставлять как есть. Артефакт кривых точек крепления (см. «точки крепления связей») там тоже есть — `fix_edges.ps1` применим как есть. + +### 2. Судьба Miro (решение отложено) +Miro-доски (3 шт., внешние) не синхронизируются с drawio и уже отстают. План: посмотреть статистику GoatCounter `/goto/miro-*` vs `/goto/svg-*`; при малом трафике — баннер «карта переехала» на досках и перенаправить `goto/miro` на SVG-просмотрщик (ссылки не ломаются). Пока — ничего не делать. + +### 3. Английские и китайские статьи +Все правки статей (2026-07-21) сделаны **только в русской версии**: +- `English/Tooling.md` и `Chinese/Tooling.md` не тронуты — там всё ещё Eclipse, `Clion`, + нет WinDbg, фаззинга, разделов про тестирование и AI; +- статей `Libraries.md`, `Compliance.md` и `AI.md` в English/ и Chinese/ нет вообще, + в их `README.md` соответственно нет и ссылок на них; +- в `English/Books/Middle.md` и `Chinese/Books/Middle.md` нет книги по move-семантике. + +### 4. Задачи владельца — в TODO.md +Актуальный список ведёт владелец репозитория в [TODO.md](TODO.md); дублировать его здесь не нужно — сверяйтесь с ним напрямую. На момент этой записи там среди прочего: рефакторинг диаграммы и приведение остальных файлов в соответствие ей, отдельная заметка про ИИ, испанская версия, совместимость ссылок на существующие документы и идея конвейера Mermaid.js → файлы перевода → draw.io. + +Из пунктов TODO уже закрыто картой: AI-секция (п. 3 — кроме отдельной заметки) и MDR/регуляторика (п. 4). diff --git a/ROADMAP-CHANGES-RU.md b/ROADMAP-CHANGES-RU.md new file mode 100644 index 0000000..9b1d0b8 --- /dev/null +++ b/ROADMAP-CHANGES-RU.md @@ -0,0 +1,321 @@ +# Изменения русской дорожной карты (июль 2026) + +Полный перечень того, что было изменено и добавлено в `Russian/Graph/roadmap.drawio.svg`. +Список составлен сравнением текущего файла с версией из git (`git show HEAD:Russian/Graph/roadmap.drawio.svg`), а не по памяти. + +**Статус:** все перечисленное ниже уже внесено в файл карты. Английская и китайская карты **не тронуты**. +Если нужно применить всё заново вручную с чистого листа — откатить карту можно через +`git checkout -- Russian/Graph/roadmap.drawio.svg`. + +**Про координаты:** в таблицах их нет намеренно — ориентироваться удобнее по родительскому узлу +и соседям. Колонка «от какого узла» — это узел, от которого тянется связь. + +## Легенда уровней (цвет заливки в draw.io) + +| Уровень | Цвет заливки | +|---|---| +| Junior | `#96BB7C` (зелёный) | +| Middle | `#FAD586` (жёлтый) | +| Senior | `#BBCCEE` (серо-синий) | +| Optional | `#CCEEFF` (голубой) | +| Подсказка | `#FFD5E4` (розовый) | + +--- + +# Часть 1. Правки в существующих узлах (14) + +## 1.1. Опечатки (6) + +| Где | Было | Стало | +|---|---|---| +| Soft skills → Коммуникация | Эмоциональный интел**е**кт | Эмоциональный интел**ле**кт | +| Soft skills → Коммуникация | Переговор**ческие** навыки | Переговор**ные** навыки | +| Синтаксис → Структуры и классы | Таблица ви**ру**тальных методов | Таблица ви**рту**альных методов | +| Подсказка у «Восприятие критики» | **C**покойно реагировать… (латинская `C`) | **С**покойно реагировать… (кириллическая) | +| Подсказка у «Ответственность» | не стоит удар**ятся** в крайности | не стоит удар**яться** в крайности | +| Текстовый блок «О карте» (шапка) | Какие книги сто**ить** почитать? | Какие книги сто**ит** почитать? | + +## 1.2. Устаревшие инструменты — три розовые подсказки (3) + +Atom заархивирован в 2022, Eclipse для C++ фактически мёртв. + +**Подсказка про IDE** (у ветки «IDE»): +- было: `Выберите один из понравившихся популярных IDE и хорошо освойте его: Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode и т.д.` +- стало: `Выберите один из понравившихся популярных IDE и хорошо освойте его: MS Visual Studio, VS Code, Qt Creator, JetBrains CLion, XCode и т.д.` +- (убран Eclipse, добавлен VS Code, исправлено `Clion` → `CLion`) + +**Подсказка про текстовые редакторы** (у ветки «Текстовый редактор»): +- было: `…К примеру: Notepad++, Atom, и т.д.` +- стало: `…К примеру: Notepad++, Sublime Text и т.д.` + +**Подсказка про редакторы исходного кода** (правая, у «Знание о базовых возможностях»): +- было: `Выберите один из популярных редакторов и и хорошо освойте его: Visual Code, Atom, Sublime Text и т.д.` +- стало: `Выберите один из популярных редакторов и хорошо освойте его: VS Code, Sublime Text, Zed и т.д.` +- (убрано задвоенное «и и», `Visual Code` → `VS Code`, Atom → Zed) + +## 1.3. Названия библиотек (2) + +| Где | Было | Стало | +|---|---|---| +| Популярные библиотеки | `pybindll` (опечатка: L вместо единиц) | `pybind11` | +| Популярные библиотеки | `ranges_v3` | `range-v3` | + +## 1.4. Стандарты (3) + +| Где | Было | Стало | Уровень | +|---|---|---|---| +| Стандарты | `newest` | `C++23` | Senior (без изменений) | +| Стандарты | `C++0x` (черновое имя C++11!) | `C++26 (newest)` | Optional (без изменений) | +| Промышленные стандарты | `MISRA` | `MISRA C++:2023` | Optional (без изменений) | + +Итоговый порядок в ветке «Стандарты»: C++11/14 → C++17 → C++20 → C++23 → C++26 (newest). + +--- + +# Часть 2. Новые узлы (43) + +## 2.1. Синтаксис языка → Обработка ошибок (3) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `std::optional / std::expected` | Middle | Обработка ошибок | +| `noexcept` | Middle | Обработка ошибок | +| `std::error_code` | Optional | Коды возврата | + +## 2.2. Синтаксис языка → Концепции языка (7) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `constexpr / consteval` | Middle | Концепции языка | +| `Move-семантика` | Middle | Концепции языка | +| `Категории значений (lvalue/rvalue)` | Middle | Move-семантика | +| `std::move / std::forward` | Middle | Move-семантика | +| `Perfect forwarding` | Senior | Move-семантика | +| `Coroutines (C++20)` | Senior | Концепции языка | +| `Modules (C++20)` | Optional | Концепции языка | + +> Move-семантики на карте не было вообще — это заметный пробел для собеседований уровня Middle. +> `constexpr` закрывает issue **#106**. +> +> Про уровни у двух последних: корутины реально применяются (asio, генераторы) — поэтому +> Senior; модули пока сырые в тулчейнах — поэтому Optional. Если считаете иначе, менять +> нужно только цвет заливки. + +## 2.3. Синтаксис языка → Стандартная библиотека + STL (3) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `std::format / std::print` | Middle | Поток ввода/вывода | +| `std::span / std::string_view` | Middle | Контейнеры | +| `std::ranges` | Senior | Алгоритмы стандартной библиотеки | + +## 2.4. Синтаксис языка → Шаблоны (1) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `Concepts (C++20)` | Middle | Шаблоны | + +> Ставить рядом со SFINAE — это его современная замена. + +## 2.5. Языковые инструменты → Работа с исходным кодом (2) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `LLDB` | Optional | Отладчик (в ряд к WinDbg / GDB) | +| `Compiler Explorer (godbolt.org)` | Optional | Работа с исходным кодом (в колонку под «Линтеры») | + +> На `LLDB` дополнительно заведена стрелка от розовой подсказки «Навык работы с отладчиком +> через командную строку…» — там же, где стрелки на WinDbg и GDB. + +## 2.6. Языковые инструменты → библиотеки и фреймворки (3) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `Asio` | Optional | Популярные библиотеки | +| `nlohmann/json` | Optional | Популярные библиотеки | +| `google benchmark` | Optional | Фреймворки | + +> Asio — фактический стандарт для сетей в C++, а раздел «Сетевой стек» на карте есть, а библиотеки не было. + +## 2.7. Общие навыки → Практики разработки → Профайлеры (2) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `Valgrind` | Optional | Профайлеры | +| `perf / VTune` | Optional | Профайлеры | + +## 2.8. Общие навыки → Практики разработки → новый блок «AI-инструменты» (7) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `AI-инструменты` | Junior | Практики разработки | +| `AI-ассистенты (Copilot, Claude Code, Cursor)` | Junior | AI-инструменты | +| `Верификация сгенерированного кода` | Junior | AI-инструменты | +| `Политика компании и конфиденциальность` | Junior | AI-инструменты | +| `Лицензионные риски генерируемого кода` | Middle | AI-инструменты | +| `Локальные модели` | Optional | AI-инструменты | +| розовая подсказка (текст ниже) | — | стрелка → на «AI-инструменты» | + +Текст подсказки (две строки): + +``` +AI может генерировать правдоподобный, но неверный код — +проверяйте и тестируйте всё. Знание C++ обязательно. +``` + +## 2.9. Общие навыки → Промышленные стандарты (5) + +Все — Optional, все от узла «Промышленные стандарты»: + +- `EU Cyber Resilience Act (CRA)` +- `SBOM` +- `IEC 62304 (медицина)` +- `ISO 26262 (автомобили)` +- `DO-178C (авиация)` + +> CRA уже вступает в силу и напрямую касается тех, кто поставляет ПО в ЕС; IEC 62304 — это +> та самая медицинская тема (MDR) из TODO.md. + +## 2.10. Операционные системы → Многопоточность (5) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `std::atomic, модель памяти C++` | Senior | Многопоточность | +| `condition_variable` | Middle | Многопоточность | +| `future / promise / async` | Middle | Многопоточность | +| `jthread (C++20)` | Optional | Многопоточность | +| `OpenMP / TBB` | Optional | Многопоточность | + +> `OpenMP / TBB` закрывает issue **#53** (просили именно optional-поле про OpenMP; +> TBB добавлен как родственный task-based фреймворк). + +## 2.11. Операционные системы → Безопасность (5) + +| Новый узел | Уровень | От какого узла | +|---|---|---| +| `Уязвимости: buffer overflow, use-after-free` | Middle | Безопасность | +| `Санитайзеры (ASan / TSan / UBSan)` | Middle | Безопасность | +| `Fuzzing` | Optional | Безопасность | +| `CERT C++ / CWE` | Optional | Безопасность | +| розовая подсказка (текст ниже) | — | стрелка → на «Уязвимости…» | + +Текст подсказки (три строки): + +``` +Требования к memory safety растут +(регуляторы США и ЕС). Изучайте безопасные +практики и инструменты анализа. +``` + +> До этого во всей ветке «Безопасность» был один узел «Шифрование», а санитайзеров +> на карте не было вообще — при том, что это базовый инструмент C++ разработчика. + +--- + +# Часть 3. Изменение компоновки + +Узел «Compiler Explorer (godbolt.org)» не помещался: он оказался в зазоре между рамкой +«1 этап» и рамкой «3 этап» и налезал на последнюю. + +## 3.1. Рамка «1 этап» — место для «Compiler Explorer» + +Узел «Compiler Explorer (godbolt.org)» не помещался: он оказался в зазоре между рамкой +«1 этап» и рамкой «3 этап» и налезал на последнюю. + +Что сделано: +- рамка **«1 этап»** (та, что содержит «Работа с исходным кодом») стала выше на **60 px**; +- всё, что лежит ниже неё в правой (hard skills) половине карты, сдвинуто вниз на **60 px** — + это 238 узлов и 403 точки изгиба связей; +- «локти» магистральной линии на уровне узла «Hard skills» намеренно оставлены на месте + (иначе центральная линия карты порвалась бы); +- левая (soft skills) половина карты не двигалась. + +## 3.2. AI-блок перенесён под CI/CD + +Изначально AI-блок был вставлен между «Понимание жизненного цикла производства ПО» +и «Анализаторы кода» — место оказалось неудачным (тесно и не по смыслу). + +Что сделано: +- AI-блок целиком (узел «AI-инструменты», 5 его детей и розовая подсказка) перенесён вниз + и стоит теперь **сразу после ветки CI/CD**, перед «Использование других языков программирования»; +- под него освобождено **420 px**: всё, что ниже CI/CD, сдвинуто вниз; +- сдвиг из п. 3.3 (150 px), который делался ради места на старой позиции, **откачен** — + область «жизненный цикл / анализаторы» вернулась к исходной компоновке; +- рамка **«4 этап»** увеличена по высоте на 420 px. + +Порядок веток у «Практики разработки» стал: Качество кода → Понимание жизненного цикла → +Анализаторы кода → C++ core guidelines → Промышленные стандарты → Работа с командной строкой → +CI/CD → **AI-инструменты** → Использование других языков → Межязыковое взаимодействие. + +## 3.3. «Практики разработки» — разгрузка после вставки AI-блока (частично откачено) + +После добавления AI-блока область стала нечитаемой: +- между подсказкой про AI и подсказкой «Не игнорируйте предупреждения компилятора…» + оставалось **8 px** — два розовых блока фактически слипались; +- подсказка про AI (ширина 560) правым краем заходила на **x=4557** — вертикальную + магистраль ветки «Понимание жизненного цикла производства ПО». + +Что сделано: +- текст подсказки про AI перевёрстан в **3 строки**, ширина **560 → 430** (правый край 4450, + магистраль на 4557 больше не задевается), высота 66 → 90; +- ветка «Анализаторы кода» и всё, что ниже, сдвинуты вниз на **150 px** (138 узлов, + 225 точек изгиба); подсказка «Не игнорируйте предупреждения…» сдвинута вместе с ней, + так как относится именно к «Анализаторам кода»; +- ветка «Понимание жизненного цикла производства ПО» намеренно осталась на месте — + порог сдвига выбран так (`y >= 9280`), чтобы её не задеть. + +Из этого в силе осталась только **перевёрстка подсказки** (3 строки, ширина 430) — она +переехала вместе с AI-блоком под CI/CD. Сдвиг на 150 px откачен, см. п. 3.2. + +Общая высота карты: 15182 → 15242 → 15392 → **15662 px**. + +## 3.4. Рамка «4 этап» не росла вместе с содержимым + +При сдвиге из п. 3.3 содержимое рамки «4 этап» уехало вниз, а сама рамка осталась прежней — +«Использование других языков программирования», «Межязыковое взаимодействие» и две подсказки +вылезли за её нижнюю границу. Исправлено: высота рамки теперь увеличивается вместе +со сдвигом содержимого (низ рамки — 10898, самый нижний элемент внутри — 10879). + +> **Правило на будущее:** если сдвигаешь содержимое, лежащее внутри рамки этапа, +> а верх рамки остаётся выше порога сдвига — рамке нужно вручную увеличить высоту +> на ту же величину. Проверять для всех рамок «N этап» (id 2–11). + +## 3.5. Точки крепления связей (наследие импорта из Miro) + +По всей карте у связей были проставлены произвольные точки крепления к узлам +(`exitX=0.3`, `0.62`, `0.92`, `exitY=0.19`, `0.38`…). Из-за этого несколько связей выходили +из **разных мест** одной грани и сходились веером в одну точку — выглядело как пучок +почти параллельных линий, упирающихся мимо края. + +Что сделано (правка чисто визуальная, состав карты не менялся): +- точка выхода/входа каждой связи пересчитана на **середину той грани**, которая смотрит + в сторону линии: 159 точек выхода и 111 точек входа; +- первый и последний сегменты выровнены строго по горизонтали — 285 изломов + (координаты «локтей» были смещены на 2–5 px относительно центров узлов); +- **выноски-подсказки** (связи со стилем `curved=1`) намеренно не трогались, + у них крепление к узлу выбрано осознанно. + +## 3.6. Место под Coroutines и Modules + +Колонка «Концепции языка» была занята до самого низа (последний узел — «Move-семантика», +ниже сразу начиналась ветка «Стандартная библиотека + STL»). + +Что сделано: +- всё, что ниже колонки, сдвинуто вниз на **130 px** (291 узел, 486 точек изгиба); +- высота рамки **«3 этап»** увеличена на 130 px; +- «локти» магистрали у «Hard skills» снова оставлены на месте (4 связи). + +После сдвига прогнана проверка всех рамок «N этап» на вылезание содержимого — все 10 в порядке. + +Общая высота карты: 15182 → 15242 → 15392 → 15662 → **15792 px**. + +--- + +# Часть 4. Что ещё не сделано + +1. **Английская и китайская карты не тронуты** — там всё ещё Atom, Eclipse, `pybindll`, + `ranges_v3`, `C++0x`, нет ни одного из 43 новых узлов. ID узлов там другие — сверяться + нужно по текстам, а не по ID. +2. **Miro-доски** — не синхронизированы и отстают от карты; решение отложено + (подробности в `AGENTS.md`). +3. **Задачи владельца** — в [TODO.md](TODO.md), здесь не дублируются. diff --git a/Russian/AI.md b/Russian/AI.md new file mode 100644 index 0000000..b0fff0b --- /dev/null +++ b/Russian/AI.md @@ -0,0 +1,80 @@ +# :robot: C++ разработчик и искусственный интеллект + +С появлением моделей, уверенно пишущих код, у многих начинающих разработчиков возник закономерный вопрос: а стоит ли вообще заходить в профессию? Вопрос честный, и отмахиваться от него «да ерунда, всё будет как раньше» неправильно. Давайте разберёмся, что происходит на самом деле. + +Короткий ответ: инженеры нужны, но планка сместилась. Ниже - почему. + +## :dna: ИИ воспроизводит то, чему его учили + +Модель обучена на огромном объёме уже написанного кода и по своей природе выдаёт то, что чаще всего встречалось в этих данных. Она отлично справляется с задачами, которые человечество уже решало тысячи раз: разобрать JSON, поднять HTTP-сервер, написать тесты к понятной функции. + +Ровно отсюда растут и её ограничения: + +- **Нетипичное решается плохо.** Ваша предметная область, ваши ограничения по железу, компромисс между памятью и задержкой именно в вашем случае - этого в обучающих данных не было. А инженерная работа во многом состоит из таких вот «а у нас всё не так». +- **Перекос в сторону старого кода.** Открытого C++ кода накоплено за десятилетия, и написан он преимущественно в старом стиле. Поэтому модели охотно выдают `new`/`delete` вместо умных указателей, сырые циклы вместо алгоритмов, C-строки вместо `std::string_view`. Код будет рабочим, но не тем, который вы бы хотели видеть у себя в проекте. +- **Уверенность не равна правоте.** Модель может сослаться на несуществующую функцию стандартной библиотеки или перепутать поведение перегрузки - и изложить это ровно тем же тоном, что и правильный ответ. + +## :warning: Почему в C++ цена ошибки выше + +В языках с управляемой памятью неверный код обычно падает громко и сразу. В C++ это не так. + +- **Неопределённое поведение может не проявиться на тестах.** Гонка данных, обращение к освобождённой памяти, выход за границу массива - всё это способно годами работать «нормально» на вашей машине и выстрелить у пользователя или после смены версии компилятора. Ни один тест не гарантирует, что сгенерированный код от этого свободен. +- **Время жизни объектов - самое тонкое место.** Именно здесь модели ошибаются чаще всего: возвращают ссылку на локальный объект, захватывают переменную в лямбду по ссылке, не задумываются, кто владеет объектом. +- **Многопоточность.** Код, выглядящий корректным, может содержать гонку, которая воспроизводится раз в неделю под нагрузкой. + +Вывод простой: **принимать можно только тот код, который вы способны проверить**. А чтобы проверить код на C++, нужно знать C++ не хуже, чем при написании вручную. Инструменты в помощь - санитайзеры, статические анализаторы, фаззинг - описаны в статье [Инструментарий для С++](Tooling.md). + +## :bulb: Узкое место разработки - не скорость набора кода + +Это самое важное. Работа инженера никогда не сводилась к печатанию символов. Она состоит из: + +- выяснения, что на самом деле нужно заказчику (обычно он и сам формулирует это не с первого раза); +- решения, каких ошибок в системе быть **не должно**, и что делать, когда они всё-таки случатся; +- компромиссов: скорость против читаемости, сроки против технического долга, надёжность против стоимости; +- ответственности за результат. + +Ни одну из этих задач нельзя делегировать модели - не потому, что она «недостаточно умная», а потому, что это вопросы про людей, деньги и ответственность. Если приложение навредит пользователю, отвечать будет компания и конкретные инженеры, а не инструмент. В областях, где ПО сертифицируется - медицина, авионика, автомобили (см. [Стандарты и регуляторные требования](Compliance.md)) - это уже не философия, а буквальное требование: под результатом стоит подпись человека. + +Ещё одно наблюдение, известное задолго до нейросетей: **читать чужой код труднее, чем писать свой**. Когда кода становится больше, а пишется он быстрее, узким местом становится не написание, а понимание и ревью. Это работа для инженера, и её объём скорее растёт. + +## :chart_with_upwards_trend: Что действительно меняется + +Было бы нечестно сказать, что ничего не происходит. Происходит, и вот что видно уже сейчас: + +- **Рутина обесценивается.** Умение быстро написать очередной шаблонный класс само по себе больше не является преимуществом. +- **Растёт ценность проверки и системного мышления.** Способность заметить, что предложенное решение красивое, но не выдержит нагрузки или не ляжет в существующую архитектуру, становится ключевым навыком. +- **Планка входа поднялась.** От джуниора и раньше ждали, что он умеет писать код. Теперь всё чаще ждут, что он умеет ещё и оценивать чужой - в том числе машинный. + +Отсюда практический вывод: вкладываться стоит в фундамент - модель памяти, время жизни объектов, многопоточность, архитектура, отладка. Всё то, что позволяет судить о правильности решения. Это ровно то, чему посвящена [дорожная карта](README.md). + +## :hourglass: Ловушка для тех, кто только учится + +Самый серьёзный риск ИИ для начинающего разработчика - не «отнимет работу», а **помешает научиться**. + +Навык вырастает из борьбы с задачей: вы пробуете, ошибаетесь, разбираетесь почему, и в голове остаётся модель происходящего. Если на каждом затруднении сразу спрашивать у ассистента, задача решится, а модель в голове - нет. Через год такой практики окажется, что проверить ответ ассистента нечем. + +Что с этим делать: + +- На учебных задачах **сначала решайте сами**, а к ассистенту идите за разбором готового решения - «что здесь можно было сделать лучше и почему». +- Просите не код, а объяснение: почему именно так, какие есть альтернативы, что сломается при изменении условий. +- Не вставляйте код, который не можете объяснить построчно. Это правило одинаково хорошо работает и для кода со Stack Overflow, и для кода от модели. +- Периодически пишите что-нибудь вообще без ассистента - чтобы честно видеть свой реальный уровень. + +## :handshake: Как пользоваться с пользой + +- **Как ускоритель рутины:** шаблонный код, заготовки тестов, разбор незнакомого API, черновики документации. +- **Как объясняющий собеседник:** «почему компилятор ругается вот так?» - ошибки в шаблонах C++ модели расшифровывают заметно понятнее, чем компилятор. +- **Как навигатор по чужой кодовой базе:** быстро понять, где что лежит и как связано. +- **Как рецензент:** попросить найти проблемы в вашем коде. Не как истина в последней инстанции, а как ещё одна пара глаз. + +И три правила, о которых лучше помнить всегда: проверяйте сгенерированное, соблюдайте политику компании по передаче кода во внешние сервисы, помните про лицензионные риски. Подробнее - в разделе про [AI-инструменты](Tooling.md). + +## :telescope: Чего никто не знает + +Честно: как будет выглядеть профессия через десять лет, не знает никто - ни авторы этой карты, ни авторы самих моделей. Любой, кто уверенно предсказывает и «всех заменят», и «ничего не изменится», выдаёт желаемое за факт. + +Что можно сказать с уверенностью: спрос на людей, которые понимают, как работают системы, и способны отвечать за результат, пока никуда не делся. Инструменты в разработке менялись всегда - ассемблер, компиляторы, IDE, автодополнение, поиск в интернете. Каждый раз звучало «теперь программировать сможет кто угодно», и каждый раз работы становилось больше, а не меньше, потому что дешевеющая разработка открывала новые задачи. Нынешний виток может оказаться и другим - но ставить на то, что глубокие знания вдруг обесценятся, пока оснований нет. + +--- + +[**На главную страницу**](README.md) diff --git a/Russian/Books/Middle.md b/Russian/Books/Middle.md index 29846d0..708702b 100644 --- a/Russian/Books/Middle.md +++ b/Russian/Books/Middle.md @@ -12,6 +12,10 @@ Книга Мейерса останавливается на C++14, а эти два тома продолжают с того места, где она заканчивается. Каждый из них системно разбирает всё, что добавил соответствующий стандарт — как возможности языка, так и библиотеки — с практическими примерами и советами, когда стоит (и когда не стоит) применять новые инструменты. +- [Николай Джосаттис - C++ Move Semantics: The Complete Guide (ENG)](https://leanpub.com/cppmove) + + Move-семантика — одна из тех тем, которые «вроде понятны», пока не начнёшь разбираться в деталях: когда компилятор сам применяет перемещение, чем `std::move` отличается от `std::forward`, почему перемещение иногда молча превращается в копирование и как правило пяти связано с `noexcept`. Книга разбирает это последовательно и с примерами. Одна из самых частых тем на собеседованиях уровня Middle. + - [Клаус Иглбергер - C++ Software Design: Design Principles and Patterns for High-Quality Software (ENG)](https://www.amazon.com/Software-Design-Principles-Patterns-High-Quality/dp/1098113160) Современный взгляд на паттерны проектирования, написанный специально для C++. Книга показывает, как классические паттерны выглядят на базе современных идиом — семантика значений, type erasure, `std::variant` — вместо глубоких иерархий наследования. Отличный мост между знанием языка и умением проектировать на нём. diff --git a/Russian/Compliance.md b/Russian/Compliance.md new file mode 100644 index 0000000..f9e5184 --- /dev/null +++ b/Russian/Compliance.md @@ -0,0 +1,75 @@ +# :scales: Стандарты кодирования и регуляторные требования + +C++ традиционно занимает те области, где цена ошибки измеряется не потерянными деньгами, а человеческими жизнями: автомобильная электроника, медицинская техника, авионика, промышленная автоматика, железнодорожный транспорт. В таких проектах свобода языка становится проблемой, поэтому её ограничивают - сводом правил кодирования, обязательными проверками и документированным процессом разработки. + +Эта статья - обзорная карта местности, а не руководство по сертификации. Её задача - чтобы вы понимали, о чём идёт речь, когда в вакансии написано «опыт работы по MISRA» или «проекты по ISO 26262», и знали, где искать подробности. + +> :warning: Требования и сроки меняются. Перед принятием решений сверяйтесь с актуальными редакциями стандартов и с юристами вашей компании - эта статья для ориентирования, а не для юридических выводов. + +## :straight_ruler: Стандарты кодирования + +Ограничивают язык до подмножества, в котором меньше способов выстрелить себе в ногу: запрет на динамическое выделение памяти после инициализации, на исключения, на неявные приведения типов и так далее. Соблюдение проверяется статическими анализаторами - вручную такие своды правил не контролируют. + +* :arrow_forward: **MISRA C++:2023** - [misra.org.uk](https://misra.org.uk) + + Наиболее известный свод правил для C++ в безопасно-критичных системах. Пришёл на смену MISRA C++:2008 и охватывает C++17. Важное изменение: в него влились рекомендации **AUTOSAR C++14**, поэтому вместо двух конкурирующих сводов правил, как было раньше, теперь развивается один. Если встретите проект на AUTOSAR C++14 - это предыдущее поколение того же подхода ([autosar.org](https://www.autosar.org)). + +* :arrow_forward: **SEI CERT C++** - [wiki.sei.cmu.edu](https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=88046682) + + Свод правил с акцентом на безопасность: как не допустить конструкций, приводящих к уязвимостям. В отличие от MISRA, доступен бесплатно и открыто - хороший способ познакомиться с самим жанром, даже если ваш проект не сертифицируется. + +* :arrow_forward: **C++ Core Guidelines** - [isocpp.github.io](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines) + + Рекомендации от Бьярне Страуструпа и Херба Саттера. В отличие от MISRA, не ограничивают язык, а наоборот - подталкивают к современному стилю. Формально не регуляторный документ, но полезны любому C++ разработчику; частично проверяются через `clang-tidy` и [Microsoft GSL](https://github.com/microsoft/GSL). + +## :shield: Функциональная безопасность + +Отвечают на вопрос «что должно произойти, чтобы система не навредила при отказе». Регламентируют не столько код, сколько процесс: требования, трассируемость, тестирование, документирование и квалификацию используемых инструментов. + +Базовый стандарт в этой области - **IEC 61508**, вводящий уровни полноты безопасности SIL 1-4. Отраслевые стандарты ниже - это его адаптации: + +* :arrow_forward: **ISO 26262** - автомобилестроение - [iso.org](https://www.iso.org/standard/68383.html) + + Функциональная безопасность дорожных транспортных средств. Вводит уровни ASIL от A до D, где D - самый строгий (например, управление тормозами или рулевым управлением). Именно здесь чаще всего встречается связка «ISO 26262 + MISRA C++». + +* :arrow_forward: **IEC 62304** - медицинское ПО - [iso.org](https://www.iso.org/standard/38421.html) + + Жизненный цикл программного обеспечения медицинских изделий. Определяет классы безопасности A, B и C в зависимости от того, может ли отказ привести к вреду здоровью и насколько тяжёлому. Соблюдение этого стандарта - основной способ показать соответствие европейскому регламенту о медицинских изделиях **MDR** ([Regulation (EU) 2017/745](https://eur-lex.europa.eu/eli/reg/2017/745/oj)), а также требованиям FDA в США. + +* :arrow_forward: **DO-178C** - авионика - [rtca.org](https://www.rtca.org) + + Требования к бортовому ПО. Уровни критичности DAL от A до E; для уровня A требуется, в частности, покрытие тестами на уровне отдельных условий в логических выражениях (MC/DC). Считается одним из самых требовательных и дорогих в соблюдении стандартов отрасли. + +## :lock: Кибербезопасность и цепочка поставок + +Относительно новая для C++ мира тема: регуляторы переносят ответственность за уязвимости на производителя ПО. + +* :arrow_forward: **EU Cyber Resilience Act (CRA)** - [digital-strategy.ec.europa.eu](https://digital-strategy.ec.europa.eu/en/policies/cyber-resilience-act) + + Регламент ЕС, распространяющийся на продукты с цифровыми элементами, поставляемые на европейский рынок - от промышленных контроллеров до потребительской электроники. Требует безопасной разработки, выпуска обновлений безопасности в течение срока поддержки и уведомления об активно эксплуатируемых уязвимостях. Вступил в силу в декабре 2024 года, основные обязанности применяются с конца 2027 года, обязанности по уведомлению - раньше. Важно, что затрагивает не только «безопасно-критичные» отрасли, а практически любое ПО в составе продаваемого продукта. + +* :arrow_forward: **SBOM (Software Bill of Materials)** - [spdx.dev](https://spdx.dev), [cyclonedx.org](https://cyclonedx.org) + + Машиночитаемая опись всех компонентов и зависимостей, входящих в поставляемое ПО, - «состав продукта» по аналогии с составом на упаковке. Нужна, чтобы при обнаружении уязвимости в популярной библиотеке можно было быстро ответить на вопрос «а есть ли она у нас». Два основных формата - SPDX и CycloneDX; оба стандартизованы. Для C++ тема ощутимая: зависимости часто подключаются исходниками или собираются вручную, и что именно попало в сборку, без SBOM бывает неочевидно. + +## :computer: Что это значит на практике + +Если вы попадёте на такой проект, изменится не столько язык, сколько окружение вокруг кода: + +- **Подмножество языка.** Часть привычных возможностей будет запрещена - обычно динамическая память после инициализации, исключения, RTTI, иногда шаблоны и стандартная библиотека целиком. +- **Обязательный статический анализ.** Сборка падает не только от ошибок компилятора, но и от нарушений правил. Отклонения от правил оформляются письменно и согласуются, а не просто подавляются в коде. +- **Трассируемость.** Для каждой строки кода можно проследить, из какого требования она возникла и каким тестом покрыта. Отсюда высокие требования к оформлению задач и коммитов. +- **Квалификация инструментов.** Компилятор, анализатор и фреймворк тестирования тоже нужно обосновать - поэтому версии обновляются редко, а «взять последний GCC» не всегда возможно. +- **Тяжёлое ревью и документация.** Объём сопроводительных документов может превышать объём кода, а сроки - заметно превосходить привычные по обычной разработке. + +## :question: Кому это действительно нужно + +**Не всем.** Если вы пишете игры, десктопные приложения, backend или трейдинг - на практике вы, скорее всего, не столкнётесь с этими стандартами, и специально изучать их незачем. + +Тема становится обязательной, если вы идёте в автомобильную электронику, медицинскую технику, авиацию, космос, железнодорожный транспорт или промышленную автоматику. Для остальных достаточно знать, что эти стандарты существуют и о чём они, - на собеседовании этого хватит. + +Исключение - **CRA и SBOM**. Они касаются гораздо более широкого круга продуктов, чем классическая функциональная безопасность, так что познакомиться с ними стоит и «обычным» разработчикам, чьи продукты продаются в Европе. + +--- + +[**На главную страницу**](README.md) diff --git a/Russian/Graph/roadmap.drawio.svg b/Russian/Graph/roadmap.drawio.svg index 162cb94..4216f32 100644 --- a/Russian/Graph/roadmap.drawio.svg +++ b/Russian/Graph/roadmap.drawio.svg @@ -1,4 +1,4 @@ -1 этап2 этап3 этап4 этап1 этап3 этап5 этап1 этап4 этап2 этапC++ developerSoft skillsHard skillsСначала может показаться, что некоторые из навыков развивать невозможно. Однако мы считаем иначе. Над каждым из пунктов возможно работать. Всё упирается в желание и внутренние блоки. Всё индивидуально, и зависит от вас. :)Умение учитьсяРабота с ошибкамиМышлениеОтветственностьУправление ресурсамиКоммуникацияКомандная работаЭмоциональный интелектПонимание контекста разработкиКлиентоориентированностьТехнологииТрендыЭмпатияКонцентрацияОткрытость новомуАдаптируемостьСтрессоустойчивостьРабота в неопределённостиПонимание распределения ролей в командеПомощьРабота в распределённой командеПредоставление обратной связиЛидерствоНаставничествоДелегированиеПостановка задач сотрудникамПланирование и целеполаганиеПереговорческие навыкиАнглийский языкПрезентацияНавык перепискиНетворкингУмение слушатьУбеждениеУмение доносить мысль/идеи внутри командыПоиск компромиссовРегулирование споровПодача информации людям вне командыТайм-менеджментПриоритизацияПринятие решенийСлепая печатьМногозадачностьДисциплинаУпорствоИнициативностьСамостоятельностьРешение проблемЛогическоеКритическоеКреативноеСтратегическоеСистемноеВосприятие критикиСвоевременное сигнализирование об ошибкахПризнание своих ошибокАнализ ошибокУмение задавать правильные вопросыЭкспериментированиеУправление знаниямиРабота с информациейУмение собирать информацию, анализировать её и выдавать взвешенное  решение.РефлексияCпокойно реагировать на то, что люди говорят. Скорее всего, они учитывают только собственный контекст, когда что-то пытаются доказать. Это нормально. Оценивайте полезность их точки зрения.Брать сложные задачи, чтобы развивать свои навыки и компетенции, даже когда недостаточно знаний/опыта (через такие задачи гораздо быстрее развиваются навыки). Главное отличить реально полезную сложную задачу, которая прокачает, от задачи, на которую ищут крайнего.Быть ответственным за профессиональное развитие. Не ждать пока тимлид решит, что изучать. Не стоит забывать, что слепое следование чужому плану заточит под задачи конкретной компании. Стоит обсуждать и встраивать свои интересы в план. Если этого не сделать - высокий риск получить "непереносимые" компетенции, что ударит по карьерным возможностям. Но и не стоит ударятся в крайности: изучать абсолютно всё подряд или пассивно ждать, пока выдадут план развития.СамоорганизацияСпособность предоставлять тот объем информации, который необходим для общения с людьми разного бекграунда.Решение конфликтовДостаточно уверенного чтения документации и статей, но для более перспективных вакансий разговорный/письменный навык становится обязательным.Искать единомышленников и присоединяться/создавать комьюнити для общения и передачи опыта.Чтобы быть конкурентоспособным, стоит изучать и наблюдать за новыми веяниями, а также уметь адаптироваться под них.Опытному разработчику стоит развивать навыки управления и общения с бизнесом для эффективного выполнения задач. Это легче делать, если развит эмоциональный интеллект. Для джуниора навык также полезен, чтобы лучше взаимодействовать с коллегами.Базовые операцииАрифметические операцииЦиклы for/whileЛогические операцииБитовые операцииФункцииlambdaОператорыТипы данныхДинамическая типизацияСтатическая типизацияRTTIУказатели и ссылкиОрганизация кодовой базыСсылкиМодель памятиУмные указателиСырые УказателиРазделение кода на headers/cpp юнитыОбласть видимостиУтечки памятиForward declarationunique_ptrshared_ptrВремя жизниОператоры new/deleteweak_ptrПространство имёнПерегрузка стандартных операторов для различных типов/структур/классов.Чтобы избежать проблем с управлением памятью, старайтесь писать код используя ссылки и умные указатели.Структуры и классыОбработка ошибокПерегрузка методовТаблица вирутальных методовООПИсключенияAccess violationДинамический полиморфизмВиртуальные методыПравило нуля/трех/пятиСтатический полиморфизмМножественное наследованиеРомбовидное наследованиеКоды возвратаНе используйте множественное наследованиеauto (автоматическое выведение типов)Концепции языкаtype castingstatic_castconst_castdynamic_castreinterpret_castНеопределённое поведение (Undefined Behavior)Поиск, зависящий от аргумента (ADL)МакросыName manglingСтандартная библиотека + STLПоток ввода/выводаАлгоритмы стандартной библиотекиИтераторыКонтейнерыДата/времяМногопоточностьЯзыковые конструкции для которых отсутствуют прописанные требования в стандартах. В случае ошибки дальнейшее поведение будет предсказать невозможно, и всецело будет зависеть от контекста выполнения или платформы, где запущено приложение.ШаблоныVariadic templatesСпециализация шаблонаtype traitsSFINAEПолная специализацияЧастичная специализацияRAIIpimplErase-RemoveNon-Copyable/Non-MoveableCopy and swapCopy on writeCRTPСтандартыC++11/14C++17C++20newestC++0xИдиомыРабота с исходным кодомТекстовый редакторIDEРедакторы исходного кодаОтладчикЛинтерыЗнание о базовых возможностях (shortcuts, tools, plugins)Умение читать сообщения отладчикаОтладочные символыWinDbgGDBВыберите один из понравившихся популярных 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 и т.д.КомпиляторыБазовые знания работы компиляторовКомпиляция кода в объектные файлыКомпоновка объектных файлов в приложение (линковка)Этапы работы компилятораОсобенности работы конкретного компилятораУ компиляторов есть свои особенности, о которых хорошо бы знать: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGWЕсть несколько этапов работы компилятора, о которых следует знать. Это помогает решать проблемы при сборке приложения. Достаточно иметь базовое понимание, чтобы решать большую часть проблем. Детали работы важны разработчикам компиляторов.Системы сборкиCMakeMakefileninjaПакетные менеджерыvcpkgspackConannugetПопулярныебиблиотекиboostopencvpocoПодключение библиотекprotobufgRPCfmtpybindllspdlogranges_v3tensorflowopenclФреймворкиgtest/gmockQtcatch2google profilerpytorch c++ЛицензированиеВзаимодействие с библиотекамиВнимательно читайте условия лицензионного соглашения. Ваш проект должен их соблюдать.ИнформатикаСтруктуры данныхАлгоритмыБулева алгебраКонечные автоматыТакже необходимо понимать, как вычислить сложность и потребление памяти у алгоритмов.Системы контроля версийРаспределенныеЦентрализованныеSVNgitMercurialПрактики разработкиКачество кодаПравила оформления кодаПринципы разработки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Промышленные стандартыMISRAAutosarРабота с командной строкойbatchPowershellbashCI/CDTrunk Based DevelopmentZero downtime deploymentСоздание пакета поставки ПОДокументацияИнсталляторИспользование других языков программированияМежязыковое взаимодействиеПравила именования переменных, пробелы vs табы, положение фигурных скобок и т.д.Настроить форматирование и автоматически проверять в одной из утилит: clang-format, Resharper - стиль кода, MSVS - стиль кода.- Скриптовые - Функциональные - SQL like- NoSQLИногда требуется предоставить обертку к библиотеке, написанной на C++ для другого ЯП, например Python или C#. Для этого применяют специальные библиотеки/фреймворки.Обратная совместимостьНе игнорируйте предупреждения компилятора и статического анализатора. Они вам друзья, а не врагиMicrosoft GSLПроектирование ПОАрхитектурные стилиComponent-basedMonolithic applicationLayeredClient-serverMicroservices architectureEvent-drivenPlug-insRESTService-oriented architectureПаттерны проектирования (GoF)ПоведенческиеСтруктурныеПорождающиеООПSOLIDUMLАрхитектурные паттерныMVCMVVMThree-tierOnionHexagonМетодологииTest Driven DevelopmentBehavior Driven DevelopmentDomain Driven DesignПамятьАбстракции памятиВыравнивание памятиУправление памятьюБинарные единицыИсполняемый файлСтатическая библиотекаДинамическая библиотекаСтекГлобальная памятьКучаПамять приложенияВиртуальная памятьОперационные системыМногопоточностьОшибкиDead lockRace conditionLive lockStarvationПотокиКонкуренцияМьютексыСемафорыАлгоритмы без блокировок (lock-free)Обработка событийСинхронныеАсинхронныеПроцессыМежпроцессное взаимодействиеShared memoryPipesСериализацияjsonXMLСетевой стекTCP/IPOSIСокетыHTTPTCPUDPФайловая системаПланировщикВиртуализацияVirtualBoxVMware WorkstationКонтейнеризацияHyper-VDockerОблачные сервисыKubernetesБезопасностьШифрованиеМногопроцессорные системыMulticore CPUNUMAВвод и вывод информацииДрайверыАудиоГрафическое вычисление/отображениеПечатьDirectSoundOpenALDirectXVulkanOpenGLCUDAОбщие навыкиЯзыковые инструментыСинтаксис языкаC++ Developer RoadmapО карте:С++ всё ещё является одним из самых популярных языков разработки. Есть немало желающих начать его изучать и стать C++ разработчиками. Перед такими людьми встают вопросы: "С чего мне начать? Что и в каком порядке мне изучать? Какие книги стоить почитать?" Мы попытались ответить на эти вопросы в представленной дорожной карте. Карта акцентируется на общих компетенциях и навыках, которые встречаются в большинстве проектов. Она призвана помочь тем, кто только начинает свое обучение или имеет небольшой опыт. Изучив набор перечисленных материалов, вы сможете составить более продуктивный план обучения, не отвлекаясь на побочную информацию. Это поможет вам освоить C++ на том уровне, который встречается во многих коммерческих проектах.Как ориентироваться:Если у вас есть замечания, вопросы или предложения, будем рады получить любую помощь и поддержку. Мы открыты для общения :)Для этого используйте следующие механизмы Github:- Предложения/правки по репозиторию - создавайте и присылайте новый PR в Pull RequestsПредложения и замечания:OptionalJuniorMiddleSeniorМидл способен создать дизайн и решения для функционала внутри компонента/приложения даже в случае неполноты требований.Синиор способен создать дизайн и решение для компонента/приложения с учётом бизнес-контекста.Джуниору важно научиться писать структурированный код и не усложнять его без надобности. Код должен быть легко читаемым и поддерживаемым.От джуниора ожидается осведомленность про категории, которые относятся к Middle/Senior. Будет достаточным поверхностное понимание темы.На карте представлены компетенции, которые выделены в "этапы". Мы считаем, что джуниору стоит начинать изучение в данном порядке, чтобы выстроить прочный фундамент.Репозиторий:https://github.com/salmer/CppDeveloperRoadmap \ No newline at end of file +1 этап2 этап3 этап4 этап1 этап3 этап5 этап1 этап4 этап2 этапC++ developerSoft skillsHard skillsСначала может показаться, что некоторые из навыков развивать невозможно. Однако мы считаем иначе. Над каждым из пунктов возможно работать. Всё упирается в желание и внутренние блоки. Всё индивидуально, и зависит от вас. :)Умение учитьсяРабота с ошибкамиМышлениеОтветственностьУправление ресурсамиКоммуникацияКомандная работаЭмоциональный интеллектПонимание контекста разработкиКлиентоориентированностьТехнологииТрендыЭмпатияКонцентрацияОткрытость новомуАдаптируемостьСтрессоустойчивостьРабота в неопределённостиПонимание распределения ролей в командеПомощьРабота в распределённой командеПредоставление обратной связиЛидерствоНаставничествоДелегированиеПостановка задач сотрудникамПланирование и целеполаганиеПереговорные навыкиАнглийский языкПрезентацияНавык перепискиНетворкингУмение слушатьУбеждениеУмение доносить мысль/идеи внутри командыПоиск компромиссовРегулирование споровПодача информации людям вне командыТайм-менеджментПриоритизацияПринятие решенийСлепая печатьМногозадачностьДисциплинаУпорствоИнициативностьСамостоятельностьРешение проблемЛогическоеКритическоеКреативноеСтратегическоеСистемноеВосприятие критикиСвоевременное сигнализирование об ошибкахПризнание своих ошибокАнализ ошибокУмение задавать правильные вопросыЭкспериментированиеУправление знаниямиРабота с информациейУмение собирать информацию, анализировать её и выдавать взвешенное  решение.РефлексияСпокойно реагировать на то, что люди говорят. Скорее всего, они учитывают только собственный контекст, когда что-то пытаются доказать. Это нормально. Оценивайте полезность их точки зрения.Брать сложные задачи, чтобы развивать свои навыки и компетенции, даже когда недостаточно знаний/опыта (через такие задачи гораздо быстрее развиваются навыки). Главное отличить реально полезную сложную задачу, которая прокачает, от задачи, на которую ищут крайнего.Быть ответственным за профессиональное развитие. Не ждать пока тимлид решит, что изучать. Не стоит забывать, что слепое следование чужому плану заточит под задачи конкретной компании. Стоит обсуждать и встраивать свои интересы в план. Если этого не сделать - высокий риск получить "непереносимые" компетенции, что ударит по карьерным возможностям. Но и не стоит ударяться в крайности: изучать абсолютно всё подряд или пассивно ждать, пока выдадут план развития.СамоорганизацияСпособность предоставлять тот объем информации, который необходим для общения с людьми разного бекграунда.Решение конфликтовДостаточно уверенного чтения документации и статей, но для более перспективных вакансий разговорный/письменный навык становится обязательным.Искать единомышленников и присоединяться/создавать комьюнити для общения и передачи опыта.Чтобы быть конкурентоспособным, стоит изучать и наблюдать за новыми веяниями, а также уметь адаптироваться под них.Опытному разработчику стоит развивать навыки управления и общения с бизнесом для эффективного выполнения задач. Это легче делать, если развит эмоциональный интеллект. Для джуниора навык также полезен, чтобы лучше взаимодействовать с коллегами.Базовые операцииАрифметические операцииЦиклы for/whileЛогические операцииБитовые операцииФункцииlambdaОператорыТипы данныхДинамическая типизацияСтатическая типизацияRTTIУказатели и ссылкиОрганизация кодовой базыСсылкиМодель памятиУмные указателиСырые УказателиРазделение кода на headers/cpp юнитыОбласть видимостиУтечки памятиForward declarationunique_ptrshared_ptrВремя жизниОператоры new/deleteweak_ptrПространство имёнПерегрузка стандартных операторов для различных типов/структур/классов.Чтобы избежать проблем с управлением памятью, старайтесь писать код используя ссылки и умные указатели.Структуры и классыОбработка ошибокПерегрузка методовТаблица виртуальных методовООПИсключенияAccess violationДинамический полиморфизмВиртуальные методыПравило нуля/трех/пятиСтатический полиморфизмМножественное наследованиеРомбовидное наследованиеКоды возвратаНе используйте множественное наследованиеauto (автоматическое выведение типов)Концепции языкаtype castingstatic_castconst_castdynamic_castreinterpret_castНеопределённое поведение (Undefined Behavior)Поиск, зависящий от аргумента (ADL)МакросыName manglingСтандартная библиотека + STLПоток ввода/выводаАлгоритмы стандартной библиотекиИтераторыКонтейнерыДата/времяМногопоточностьЯзыковые конструкции для которых отсутствуют прописанные требования в стандартах. В случае ошибки дальнейшее поведение будет предсказать невозможно, и всецело будет зависеть от контекста выполнения или платформы, где запущено приложение.ШаблоныVariadic templatesСпециализация шаблонаtype traitsSFINAEПолная специализацияЧастичная специализацияRAIIpimplErase-RemoveNon-Copyable/Non-MoveableCopy and swapCopy on writeCRTPСтандартыC++11/14C++17C++20C++23C++26 (newest)ИдиомыРабота с исходным кодомТекстовый редакторIDEРедакторы исходного кодаОтладчикЛинтерыЗнание о базовых возможностях (shortcuts, tools, plugins)Умение читать сообщения отладчикаОтладочные символыWinDbgGDBВыберите один из понравившихся популярных IDE и хорошо освойте его: MS Visual Studio, VS Code, Qt Creator, JetBrains CLion, XCode и т.д.Научитесь пользоваться отладчиком. Изучите его возможности.Выберите один из популярных редакторов и хорошо освойте его. К примеру: Notepad++, Sublime Text и т.д.Навык работы с отладчиком через командную строку - узконаправленный навык. В регулярной работе достаточно уметь работать с отладчиком в рамках IDE.Ознакомьтесь с самыми распространёнными ошибками (segfault, out of memory, access violation) и концепцией неопределённого поведения (undefined behavior)Выберите один из популярных редакторов и хорошо освойте его: VS Code, Sublime Text, Zed и т.д.КомпиляторыБазовые знания работы компиляторовКомпиляция кода в объектные файлыКомпоновка объектных файлов в приложение (линковка)Этапы работы компилятораОсобенности работы конкретного компилятораУ компиляторов есть свои особенности, о которых хорошо бы знать: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGWЕсть несколько этапов работы компилятора, о которых следует знать. Это помогает решать проблемы при сборке приложения. Достаточно иметь базовое понимание, чтобы решать большую часть проблем. Детали работы важны разработчикам компиляторов.Системы сборкиCMakeMakefileninjaПакетные менеджерыvcpkgspackConannugetПопулярныебиблиотекиboostopencvpocoПодключение библиотекprotobufgRPCfmtpybind11spdlogrange-v3tensorflowopenclФреймворкиgtest/gmockQtcatch2google profilerpytorch c++ЛицензированиеВзаимодействие с библиотекамиВнимательно читайте условия лицензионного соглашения. Ваш проект должен их соблюдать.ИнформатикаСтруктуры данныхАлгоритмыБулева алгебраКонечные автоматыТакже необходимо понимать, как вычислить сложность и потребление памяти у алгоритмов.Системы контроля версийРаспределенныеЦентрализованныеSVNgitMercurialПрактики разработкиКачество кодаПравила оформления кодаПринципы разработки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 C++:2023AutosarРабота с командной строкойbatchPowershellbashCI/CDTrunk Based DevelopmentZero downtime deploymentСоздание пакета поставки ПОДокументацияИнсталляторИспользование других языков программированияМежязыковое взаимодействиеПравила именования переменных, пробелы vs табы, положение фигурных скобок и т.д.Настроить форматирование и автоматически проверять в одной из утилит: clang-format, Resharper - стиль кода, MSVS - стиль кода.- Скриптовые - Функциональные - SQL like- NoSQLИногда требуется предоставить обертку к библиотеке, написанной на C++ для другого ЯП, например Python или C#. Для этого применяют специальные библиотеки/фреймворки.Обратная совместимостьНе игнорируйте предупреждения компилятора и статического анализатора. Они вам друзья, а не врагиMicrosoft GSLПроектирование ПОАрхитектурные стилиComponent-basedMonolithic applicationLayeredClient-serverMicroservices architectureEvent-drivenPlug-insRESTService-oriented architectureПаттерны проектирования (GoF)ПоведенческиеСтруктурныеПорождающиеООПSOLIDUMLАрхитектурные паттерныMVCMVVMThree-tierOnionHexagonМетодологииTest Driven DevelopmentBehavior Driven DevelopmentDomain Driven DesignПамятьАбстракции памятиВыравнивание памятиУправление памятьюБинарные единицыИсполняемый файлСтатическая библиотекаДинамическая библиотекаСтекГлобальная памятьКучаПамять приложенияВиртуальная памятьОперационные системыМногопоточностьОшибкиDead lockRace conditionLive lockStarvationПотокиКонкуренцияМьютексыСемафорыАлгоритмы без блокировок (lock-free)Обработка событийСинхронныеАсинхронныеПроцессыМежпроцессное взаимодействиеShared memoryPipesСериализацияjsonXMLСетевой стекTCP/IPOSIСокетыHTTPTCPUDPФайловая системаПланировщикВиртуализацияVirtualBoxVMware WorkstationКонтейнеризацияHyper-VDockerОблачные сервисыKubernetesБезопасностьШифрованиеМногопроцессорные системыMulticore CPUNUMAВвод и вывод информацииДрайверыАудиоГрафическое вычисление/отображениеПечатьDirectSoundOpenALDirectXVulkanOpenGLCUDAОбщие навыкиЯзыковые инструментыСинтаксис языкаC++ Developer RoadmapО карте:С++ всё ещё является одним из самых популярных языков разработки. Есть немало желающих начать его изучать и стать C++ разработчиками. Перед такими людьми встают вопросы: "С чего мне начать? Что и в каком порядке мне изучать? Какие книги стоит почитать?" Мы попытались ответить на эти вопросы в представленной дорожной карте. Карта акцентируется на общих компетенциях и навыках, которые встречаются в большинстве проектов. Она призвана помочь тем, кто только начинает свое обучение или имеет небольшой опыт. Изучив набор перечисленных материалов, вы сможете составить более продуктивный план обучения, не отвлекаясь на побочную информацию. Это поможет вам освоить C++ на том уровне, который встречается во многих коммерческих проектах.Как ориентироваться:Если у вас есть замечания, вопросы или предложения, будем рады получить любую помощь и поддержку. Мы открыты для общения :)Для этого используйте следующие механизмы Github:- Предложения/правки по репозиторию - создавайте и присылайте новый PR в Pull RequestsПредложения и замечания:OptionalJuniorMiddleSeniorМидл способен создать дизайн и решения для функционала внутри компонента/приложения даже в случае неполноты требований.Синиор способен создать дизайн и решение для компонента/приложения с учётом бизнес-контекста.Джуниору важно научиться писать структурированный код и не усложнять его без надобности. Код должен быть легко читаемым и поддерживаемым.От джуниора ожидается осведомленность про категории, которые относятся к Middle/Senior. Будет достаточным поверхностное понимание темы.На карте представлены компетенции, которые выделены в "этапы". Мы считаем, что джуниору стоит начинать изучение в данном порядке, чтобы выстроить прочный фундамент.Репозиторий:https://github.com/salmer/CppDeveloperRoadmapLLDBCompiler Explorer (godbolt.org)Valgrindperf / VTuneAsionlohmann/jsongoogle benchmarkMove-семантикаКатегории значений (lvalue/rvalue)std::move / std::forwardPerfect forwardingConcepts (C++20)std::format / std::printstd::span / std::string_viewstd::rangesstd::optional / std::expectednoexceptstd::error_codestd::atomic, модель памяти C++condition_variablefuture / promise / asyncjthread (C++20)AI-инструментыAI-ассистенты (Copilot, Claude Code, Cursor)Верификация сгенерированного кодаПолитика компании и конфиденциальностьЛицензионные риски генерируемого кодаЛокальные моделиAI может генерировать правдоподобный,но неверный код — проверяйте итестируйте всё. Знание C++ необходимо.EU Cyber Resilience Act (CRA)SBOMIEC 62304 (медицина)ISO 26262 (автомобили)DO-178C (авиация)Уязвимости: buffer overflow, use-after-freeСанитайзеры (ASan / TSan / UBSan)FuzzingCERT C++ / CWEТребования к memory safety растут(регуляторы США и ЕС). Изучайте безопасныепрактики и инструменты анализа.constexpr / constevalOpenMP / TBBCoroutines (C++20)Modules (C++20) \ No newline at end of file diff --git a/Russian/Libraries.md b/Russian/Libraries.md new file mode 100644 index 0000000..8a36134 --- /dev/null +++ b/Russian/Libraries.md @@ -0,0 +1,81 @@ +# :package: Популярные библиотеки и фреймворки + +В C++ нет единой «стандартной» экосистемы, как npm в JavaScript или crates.io в Rust, поэтому набор используемых библиотек сильно зависит от области. Тем не менее есть несколько имён, которые встречаются в вакансиях и на проектах чаще остальных - именно они собраны ниже. + +Не пытайтесь выучить всё сразу. Гораздо полезнее хорошо освоить одну-две библиотеки из своей области, чем поверхностно знать десяток. Подключать их проще всего через пакетные менеджеры Conan или vcpkg - см. [Инструментарий для С++](Tooling.md). + +> :bulb: Инструменты разработки (компиляторы, отладчики, анализаторы, фреймворки тестирования) вынесены в отдельную статью - [Инструментарий для С++](Tooling.md). + +## :hammer_and_wrench: Общего назначения + +* :arrow_forward: **Boost** - [boost.org](https://www.boost.org) + + Огромный набор библиотек, который исторически служит «полигоном» для стандартной библиотеки: многое из того, что сегодня входит в стандарт (умные указатели, `filesystem`, `optional`, `variant`), сначала обкатывалось в Boost. Полезен и сейчас - там есть то, чего в стандарте до сих пор нет. Обратная сторона - размер: подключать Boost целиком ради одной функции не стоит, большинство его библиотек можно брать по отдельности. + +* :arrow_forward: **{fmt}** - [github.com/fmtlib/fmt](https://github.com/fmtlib/fmt) + + Библиотека форматирования строк, ставшая основой для `std::format` из C++20. Быстрее и безопаснее `printf`, читабельнее потоков `iostream`. Имеет смысл, если ваш компилятор ещё не поддерживает `std::format` или нужны возможности сверх стандарта. + +* :arrow_forward: **spdlog** - [github.com/gabime/spdlog](https://github.com/gabime/spdlog) + + Быстрая библиотека логирования, построенная поверх {fmt}. Поддерживает вывод в файлы с ротацией, в консоль с подсветкой, асинхронный режим. Логирование - один из основных инструментов диагностики в бою, когда отладчик подключить невозможно. + +* :arrow_forward: **range-v3** - [github.com/ericniebler/range-v3](https://github.com/ericniebler/range-v3) + + Референсная реализация, на основе которой в C++20 появились `std::ranges`. Позволяет писать преобразования последовательностей цепочкой, без явных итераторов и временных контейнеров. Актуальна, если нужны возможности, которые ещё не вошли в стандарт, или поддержка старых компиляторов. + +## :globe_with_meridians: Сеть и обмен данными + +* :arrow_forward: **Asio** - [think-async.com/Asio](https://think-async.com/Asio/) + + Фактический стандарт асинхронного ввода-вывода в C++ и основа для многих сетевых проектов. Существует в двух вариантах: как самостоятельная библиотека и как часть Boost. Хорошо сочетается с корутинами из C++20. Именно на её базе неоднократно предлагалась сетевая библиотека для стандарта. + +* :arrow_forward: **nlohmann/json** - [github.com/nlohmann/json](https://github.com/nlohmann/json) + + Самая популярная библиотека для работы с JSON в C++. Ценится за то, что код с ней выглядит почти как на языке с встроенной поддержкой JSON. Подключается одним заголовочным файлом. Если критична скорость разбора больших объёмов, стоит посмотреть на более быстрые альтернативы вроде simdjson или RapidJSON. + +* :arrow_forward: **Protocol Buffers** - [protobuf.dev](https://protobuf.dev) + + Бинарный формат сериализации от Google со схемой: структура данных описывается в отдельном файле, из которого генерируется код. Компактнее и быстрее JSON, а схема даёт контроль совместимости версий - важное свойство, когда клиент и сервер обновляются не одновременно. + +* :arrow_forward: **gRPC** - [grpc.io](https://grpc.io) + + Фреймворк удалённого вызова процедур поверх Protocol Buffers и HTTP/2. Распространён в микросервисной архитектуре, в том числе в связках, где сервисы написаны на разных языках. + +* :arrow_forward: **POCO** - [pocoproject.org](https://pocoproject.org) + + Набор кроссплатформенных библиотек для сетевых и серверных приложений: HTTP-клиент и сервер, работа с базами данных, разбор XML и JSON, логирование. По духу ближе к «батарейки в комплекте», чем набор точечных библиотек. + +## :framed_picture: Графический интерфейс + +* :arrow_forward: **Qt** - [qt.io](https://www.qt.io) + + Самый распространённый фреймворк для десктопных приложений на C++, давно переросший рамки GUI: в нём есть работа с сетью, базами данных, потоками, разбор форматов. Кроссплатформенный, с собственной IDE (Qt Creator). Важный нюанс - лицензирование: открытая версия распространяется под LGPL/GPL, для закрытого коммерческого продукта может потребоваться платная лицензия. Условия стоит изучить **до** начала разработки. + +## :bar_chart: Вычисления, графика и машинное обучение + +* :arrow_forward: **OpenCV** - [opencv.org](https://opencv.org) + + Стандарт де-факто в компьютерном зрении: обработка изображений и видео, детектирование объектов, калибровка камер. Используется в робототехнике, промышленном контроле качества, медицинской визуализации. + +* :arrow_forward: **Eigen** - [libeigen.gitlab.io](https://libeigen.gitlab.io/) + + Библиотека линейной алгебры: матрицы, векторы, решение систем уравнений. Состоит только из заголовочных файлов и агрессивно оптимизирована. Часто встречается в робототехнике, симуляциях и компьютерном зрении. + +* :arrow_forward: **CUDA** - [developer.nvidia.com/cuda-toolkit](https://developer.nvidia.com/cuda-toolkit) и **OpenCL** - [khronos.org/opencl](https://www.khronos.org/opencl/) + + Два подхода к вычислениям на видеокартах. CUDA работает только на оборудовании NVIDIA, но зрелее и удобнее; OpenCL - открытый стандарт, работающий на оборудовании разных производителей. Востребованы там, где задача хорошо распараллеливается: научные расчёты, обработка изображений, машинное обучение. + +* :arrow_forward: **LibTorch (PyTorch C++)** - [pytorch.org/cppdocs](https://pytorch.org/cppdocs/) и **TensorFlow** - [tensorflow.org](https://www.tensorflow.org) + + C++ API двух основных фреймворков машинного обучения. Обучение моделей обычно ведётся на Python, а C++ применяется на этапе внедрения: когда готовую модель нужно запустить внутри приложения с жёсткими требованиями к скорости или без зависимости от Python. + +## :link: Взаимодействие с другими языками + +* :arrow_forward: **pybind11** - [github.com/pybind/pybind11](https://github.com/pybind/pybind11) + + Позволяет сделать из C++ кода модуль, импортируемый в Python. Типичный сценарий: тяжёлые вычисления пишутся на C++, а логика верхнего уровня и эксперименты остаются на Python. На pybind11 построены обёртки многих известных проектов. + +--- + +[**На главную страницу**](README.md) diff --git a/Russian/README.md b/Russian/README.md index 59c147f..4541091 100644 --- a/Russian/README.md +++ b/Russian/README.md @@ -16,11 +16,14 @@ 1. :space_invader: [C++ - это просто](FunCpp.md) 1. :clipboard: [Области применения языка](AreasOfApplication.md) 1. :ghost: [Легенды и мифы про C++](Mythbusters.md) +1. :robot: [C++ разработчик и искусственный интеллект](AI.md) 1. :chart_with_upwards_trend: [Грейды разработчиков](Grades/Overview.md) 1. :mortar_board: [Как учиться](HowToStudy.md) 1. :books: [Книги и прочие материалы по С++](Books/Overview.md) 1. :telescope: [Идеи для пет-проектов](PetProjects.md) 1. :triangular_ruler: [Инструментарий для С++](Tooling.md) +1. :package: [Популярные библиотеки и фреймворки](Libraries.md) +1. :scales: [Стандарты кодирования и регуляторные требования](Compliance.md) 1. :gem: [Ресурсы по C++: документация, каналы конференций и т.д.](CommunitySources.md) diff --git a/Russian/Tooling.md b/Russian/Tooling.md index 0343ae9..e86a6bc 100644 --- a/Russian/Tooling.md +++ b/Russian/Tooling.md @@ -70,16 +70,16 @@ Изначально Qt Creator позиционировался как IDE для разработки графических интерфейсов приложений, разрабатываемых на языке C++. Со временем фреймворк оброс огромными возможностями. Все переросло в полноценную экосистему для разработки кроссплатформенных приложений. Фреймворк предоставляет большую библиотеку примитивов для различных потребностей: работа с сетью, графический интерфейс, работа с базами данных, работа с популярными форматами: изображения, текстовые файлы и т.д. Современный Qt Creator выступает в роли конкурента для Visual Studio, но в основном он снискал славу в среде разработчиков, которые разрабатывают приложения под различные дистрибутивы Linux. -* :arrow_forward: **Eclipse IDE** +* :arrow_forward: **Xcode** - Сайт: [https://www.eclipse.org/downloads/packages](https://www.eclipse.org/downloads/packages) + Сайт: [https://developer.apple.com/xcode/](https://developer.apple.com/xcode/) Стоимость: бесплатно - - Довольно мощная мультиплатформенная среда разработки, но при этом тяжеловесная. Ключевая особенность Eclipse - модульность. Философия Eclipse состоит в том, что любой разработчик может доработать среду разработки под себя посредством подключения дополнительных расширений. Взята за основу некоторыми разработчиками компиляторов под специализированные ОС или микроконтроллеры (например: ОС реального времени - QNX). + + Штатная среда разработки Apple и единственный способ собирать приложения под macOS и iOS. Поставляется вместе с Clang и LLDB. Если вы работаете под macOS, Xcode понадобится как минимум ради инструментов командной строки, даже если писать код вы предпочитаете в другом редакторе. -* :arrow_forward: **JetBrains Clion IDE** +* :arrow_forward: **JetBrains CLion IDE** Сайт: [https://www.jetbrains.com/clion](https://www.jetbrains.com/clion) @@ -183,6 +183,14 @@ Инструменты динамического анализа, встроенные непосредственно в GCC, Clang и MSVC и включаемые флагами компилятора (например, `-fsanitize=address`). AddressSanitizer ловит ошибки работы с памятью (выход за границы, use-after-free), UndefinedBehaviorSanitizer - неопределенное поведение, ThreadSanitizer - гонки данных. Запуск тестов с включенными санитайзерами считается базовой практикой современной разработки на C++. +* :arrow_forward: **Фаззинг (libFuzzer, AFL++)** + + Сайт: [https://llvm.org/docs/LibFuzzer.html](https://llvm.org/docs/LibFuzzer.html), [https://github.com/AFLplusplus/AFLplusplus](https://github.com/AFLplusplus/AFLplusplus) + + Стоимость: бесплатно + + Фаззинг - это автоматическая подача в код потока случайных и намеренно некорректных данных в поисках падений и зависаний. Особенно полезен для всего, что разбирает внешний ввод: парсеров форматов, сетевых протоколов, декодеров. Обычно запускается вместе с санитайзерами - так фаззер находит ввод, приводящий к ошибке, а санитайзер показывает, где именно она произошла. libFuzzer встроен в Clang, AFL++ работает как самостоятельный инструмент. + * :arrow_forward: **PVS Studio** Сайт: [https://pvs-studio.com](https://pvs-studio.com) @@ -225,7 +233,15 @@ Стоимость: бесплатно - Отладчик из проекта LLVM и отладчик по умолчанию в macOS (используется в Xcode). По возможностям близок к GDB, но имеет более современную архитектуру. Под Windows эту же роль выполняет отладчик Visual Studio, поставляемый вместе с IDE. + Отладчик из проекта LLVM и отладчик по умолчанию в macOS (используется в Xcode). По возможностям близок к GDB, но имеет более современную архитектуру. + +* :arrow_forward: **WinDbg** + + Сайт: [https://learn.microsoft.com/windows-hardware/drivers/debugger/](https://learn.microsoft.com/windows-hardware/drivers/debugger/) + + Стоимость: бесплатно + + Отладчик от Microsoft для Windows. В повседневной работе под Windows обычно достаточно отладчика, встроенного в Visual Studio, но WinDbg незаменим там, где его возможностей не хватает: разбор аварийных дампов с боевых машин, отладка драйверов и режима ядра, работа с приложением без исходников. Полезный навык для тех, кто занимается низкоуровневой разработкой или разбором падений у пользователей. ## :stopwatch: Профилировщики @@ -253,6 +269,75 @@ Мощный профилировщик для глубокого анализа производительности на архитектуре x86: узкие места, эффективность многопоточности, паттерны доступа к памяти и метрики уровня микроархитектуры. Инструмент первого выбора, когда вывода `perf` недостаточно. В Windows встроенный в Visual Studio IDE профилировщик процессора и памяти также предоставляет хорошие возможности. +## :white_check_mark: Тестирование и бенчмарки + +* :arrow_forward: **GoogleTest (gtest/gmock)** + + Сайт: [https://github.com/google/googletest](https://github.com/google/googletest) + + Стоимость: бесплатно + + Самый распространённый фреймворк юнит-тестирования в C++. В комплекте идёт GoogleMock для создания заглушек и моков, что позволяет тестировать код в отрыве от его зависимостей - базы данных, сети, файловой системы. Хорошо интегрируется с CMake и подключается через любой из популярных пакетных менеджеров. + +* :arrow_forward: **Catch2** + + Сайт: [https://github.com/catchorg/Catch2](https://github.com/catchorg/Catch2) + + Стоимость: бесплатно + + Более лёгкая альтернатива GoogleTest с лаконичным синтаксисом. Тест здесь - это обычная функция с макросом `REQUIRE` вместо набора специальных макросов сравнения. Хороший выбор для небольших проектов и для знакомства с юнит-тестированием: подключается буквально одним заголовочным файлом. + +* :arrow_forward: **Google Benchmark** + + Сайт: [https://github.com/google/benchmark](https://github.com/google/benchmark) + + Стоимость: бесплатно + + Библиотека для микробенчмарков. Сама подбирает число повторений, чтобы результат был статистически значимым, и умеет бороться с тем, что оптимизатор выбрасывает код, результат которого никуда не используется. Нужна там, где требуется сравнить две реализации по скорости: замер "вручную" через замер времени до и после почти всегда даёт недостоверный результат. + +## :robot: AI-инструменты + +AI-ассистенты стали частью повседневного инструментария разработчика: они ускоряют написание шаблонного кода, помогают разобраться в незнакомой кодовой базе и объясняют ошибки компилятора. При этом они не заменяют знание языка - ниже расписано, почему. + +* :arrow_forward: **GitHub Copilot** + + Сайт: [https://github.com/features/copilot](https://github.com/features/copilot) + + Стоимость: есть бесплатный тариф с ограничениями; полный доступ - платно, бесплатно для студентов, преподавателей и мейнтейнеров популярных open source проектов + + Дополнение кода прямо в редакторе: подсказывает следующие строки по контексту файла и проекта. Интегрируется с Visual Studio, VS Code, CLion и другими популярными IDE. + +* :arrow_forward: **Claude Code** + + Сайт: [https://claude.com/product/claude-code](https://claude.com/product/claude-code) + + Стоимость: платно, в рамках подписки + + Ассистент, работающий в терминале и в IDE: читает проект целиком, вносит правки в несколько файлов сразу, запускает сборку и тесты. Ориентирован на задачи крупнее одной строки - рефакторинг, разбор незнакомого кода, написание тестов. + +* :arrow_forward: **Cursor** + + Сайт: [https://cursor.com](https://cursor.com) + + Стоимость: есть бесплатный тариф, расширенные возможности - платно + + Редактор на базе VS Code со встроенным AI-ассистентом. Умеет отвечать на вопросы по кодовой базе и вносить правки сразу в нескольких файлах, сохраняя привычные расширения и настройки VS Code. + +* :arrow_forward: **Локальные модели (Ollama, llama.cpp)** + + Сайт: [https://ollama.com](https://ollama.com), [https://github.com/ggml-org/llama.cpp](https://github.com/ggml-org/llama.cpp) + + Стоимость: бесплатно + + Запуск моделей на своей машине. Уступают облачным по качеству и требуют заметных ресурсов, зато код не покидает вашего компьютера. Вариант для проектов, где отправка исходников во внешние сервисы запрещена. Кстати, `llama.cpp` - сам по себе показательный пример современного C++ проекта. + +### :warning: О чём стоит помнить + +- **Проверяйте всё, что сгенерировано.** Модель может выдать правдоподобный, но неверный код: несуществующие функции стандартной библиотеки, тонкие ошибки времени жизни объектов, состояния гонки. В C++ цена такой ошибки высока - неопределённое поведение может не проявиться ни на одном тесте, а выстрелить у пользователя. Именно поэтому знание языка остаётся обязательным: чтобы проверить ответ, нужно понимать предмет не хуже, чем при написании кода вручную. +- **Соблюдайте политику компании.** Во многих организациях отправка рабочего кода во внешние сервисы ограничена или запрещена. Уточните правила до того, как подключать ассистента, а не после. +- **Помните про лицензии.** Сгенерированный код может воспроизводить фрагменты чужих проектов вместе с их лицензионными обязательствами. Для коммерческих проектов это отдельный риск, который стоит обсудить с командой. +- **Не пропускайте этап обучения.** Ассистент избавляет от рутины, но если он решает за вас задачи, на которых вы учитесь, - вы не вырастете как инженер. На старте карьеры полезно сначала решить задачу самому, а потом сравнить с тем, что предложит модель. + ## :floppy_disk: Git клиенты * :arrow_forward: **SmartGit** @@ -269,7 +354,7 @@ Стоимость: бесплатно - Отличная бесплатная альтернатива для работы с git через графический интерфейс. Не уступает по функционалу SmartGit, за исключением отсутствия собственного редактора разрешения конфликтов. Это легко исправляется интеграцией с Visual Code или любого другого редактора, который умеет сравнивать файлы между собой. Обратите внимание: в отличие от SmartGit, доступен только под Windows и macOS. Поддерживает интеграцию с публичными репозиториями: GitHub, BitBucket, GitLab и т.д. + Отличная бесплатная альтернатива для работы с git через графический интерфейс. Не уступает по функционалу SmartGit, за исключением отсутствия собственного редактора разрешения конфликтов. Это легко исправляется интеграцией с Visual Studio Code или любым другим редактором, который умеет сравнивать файлы между собой. Обратите внимание: в отличие от SmartGit, доступен только под Windows и macOS. Поддерживает интеграцию с публичными репозиториями: GitHub, BitBucket, GitLab и т.д. * :arrow_forward: **Git Kraken** diff --git a/TODO.md b/TODO.md index 5c3ef62..1bd582c 100644 --- a/TODO.md +++ b/TODO.md @@ -1,8 +1,3 @@ -1. Избавиться от Miro и GraphQL -> переехать на свой движок -2. Отрефакторить то, что есть -3. Добавить AI секцию - - Соблюдать политику компании - - Ичуть язык, потому что AI может нагенерировать всякого... -4. Добавить MDR и другие требования приближающиеся +0. Делать всё так, чтобы не поломать всё тем, кто может ссылать на уже существующие документы 5. Добавить испанский -6. Делать всё так, чтобы не поломать всё тем, кто может ссылать на уже существующие документы \ No newline at end of file +7. Mermaid.js -> файлы перевода -> draw.io ? \ No newline at end of file