diff --git a/.gitignore b/.gitignore
index 8b5ae5c..2df2fe7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,6 @@ Gemfile.lock
# OS files
.DS_Store
Thumbs.db
+
+# draw.io
+*.bkp
\ No newline at end of file
diff --git a/Chinese/Graph/roadmap.drawio.svg b/Chinese/Graph/roadmap.drawio.svg
index 022b474..2d7c0ae 100644
--- a/Chinese/Graph/roadmap.drawio.svg
+++ b/Chinese/Graph/roadmap.drawio.svg
@@ -1,4 +1,4 @@
-步骤 1 步骤 2 步骤 3 步骤 4 步骤 1 步骤 3 步骤 5 步骤 1 步骤 4 步骤 2 C++ 开发者 软性技能 硬性技能 一开始,有些技能看似没有 办法习得或提升。然而,在 我们看来,这里所列的每一 项技能,都是可以通过练习 得以提升的。每个人的学习 目的不同,最终成效取决于 您个人的愿望和努力 :) 学习能力 管理错误 思考 责任 资源管理 交流沟通 团队协作 情绪智力(情商) 理解开发背景 以客户为中心 技术 发展趋势 共情 专注 思想开明 适应性 抗压能力 在不确定性中工作 理解团队内的角色分工 支持帮助团队成员 在分布式团队中工作 提供意见反馈 领导力 启导、指导他人 委派工作 向员工分配和明确任务 计划并制订目标 协商 英文能力 演讲演示 书面沟通技巧 社交 倾听 说服 团队内部交流创意和想法的能力 寻求妥协 解决争议 向团队以外的人员提供信息的能力 时间管理 管理优先级 作决定 盲打 多重任务同时进行 纪律 坚持 主动性 独立 解决问题 逻辑性 批判性 创意性 策略 系统性 接受批评 出现错误及时通知 承认您的错误 分析错误 提出正确的问题 实验实操 知识管理 信息处理 收集、分析、评估信息,并据此做出决 策的能力。 反思 冷静地回应他人的评论。很有 可能他人所说的话、试图证明 的事情,仅仅基于他们自己的 角度,这是可以理解的。请客 观地评估他人观点的有用性。 主动承担具有挑战性的任务,以发展您的技 能和能力,即便此刻您还不具备完全足够的 知识或经验(您的技能将会通过此类任务得 到快速发展)。关键是要能够区分出:哪些 是真正有助于您提升技能的复杂任务,而哪 些又是仅仅需要替罪羊的愚蠢的任务。 您应该对自己的职业发展负责。 不要等待团队领导来决定您要学习什么。请不要忘记,盲 目遵循他人安排的计划,只会让您提高某些适用于某特定 公司的技能。 最好商讨如何将您的个人利益和兴趣也纳入计划之中, 否则的话,就很有可能将时间花在不相关的技能上,从而 影响职业机会。不过切记不要太极端:别不加选择地什么 都学,也不要什么都拒绝直到有一个完美的量身定制的学 习计划出现。 自组织(Self- organization) 有能力根据各方人员不 同的背景,而提供适量 、适当的信息,以促进 有效的沟通交流。 解决冲突 如果您阅读本路线图,您大概率已经注 意到英文能力有多重要:) 通常,您至少需要具备英文阅读能力, 因为您要能够读懂技术文档。不过,随 着您在职业阶梯上的步步晋升,您将同 时需要更加自信地用英文说和写。 寻找志同道合的人,并 加入或创建相关社区, 以进行经验交流。 您应当研究和观察当代发展趋势,以保 持自己的竞争力, 并适应变化。 经验丰富的开发人员应该培养管理技能 和业务沟通技能,以高效地完成任务。 如果您有较好的情商,那这就相对更容 易做到。 对于初级开发人员来说,共情能力在与 同事互动中也是非常有用的。 基本运算 算术运算 循环: for/while 逻辑运算 位运算 函数 Lambda表达式 运算符 数据类型 动态类型 静态类型 RTTI(运行时类型识别) 指针&引用 代码库结构化 引用 内存模型 智能指针(smart pointer) 原始指针 代码拆分为 headers/cpp 文件 作用域(Scope) 内存泄漏 前向声明 unique_ptr shared_ptr 对象生命周期 new/delete 运算符 weak_ptr 命名空间(Namespace) 常规或自定义类型 (结构/类)的常规运 算符的重载。 为防止内存泄漏 问题,最好使用 智能指针而不是 原始指针。 结构体(Struct)和类(class) 异常处理 函数重载 虚函数表(Virtual table, vtbl) 面向对象编程 (OOP) 异常(Exceptions) 非法访问(Access violation) 动态多态(Dynamic polymorphism) 虚函数(Virtual methods) 三/五/零法则 静态多态(Static polymorphism) 多重继承(Multiple inheritance) 钻石继承(Diamond inheritance) 错误码(Error codes) 代码中最好避免 出现多重继承 (抽象类除外), 以防止运行时出 现问题 自动类型推导 auto (automatic type deduction) 语言概念(Language concepts) 类型转换(type casting) 静态类型转换(static_cast) const_cast 动态类型转换(dynamic_cast) reinterpret_cast 未定义行为 (Undefined Behavior,UB) 参数依赖查找(Argument-dependent lookup,ADL) 宏(Macros) 名字改写(Name mangling) 标准程序库+标准模板库(Standard library + STL) 输入输出流(iostream) 算法(Algorithms) 迭代器(Iterators) 容器(Containers) Date/time 多线程(Multithreading) 根据 ISO 标准,某些语言结构具有未定义行为。 如果出现任何错误,则无法预测程序进 一步的行为,因为程序此后的行为取决 于平台环境、运行时的上下文具体内容等。 模板(Template) 可变参数模板 (Variadic templates) 模板特化(Template specialization) 类型特征(type traits) SFINAE 模板全特化(Full template specialization) 模板偏特化(Partial template specialization) RAII(资源获取即初始化) pimpl(指向实现的指针) Erase-Remove(删除) Non-Copyable (不可复制)/Non-Moveable(不可移动) Copy and swap(复制并交换) Copy on write(写时复制) CRTP(奇异递归模板) 标准(Standards) C++11/14 C++17 C++20 最新版本 C++0x 惯常用法/设计习语(Idioms) 使用源代码 文本编辑器 集成开发环境(IDE) 代码编辑器 调试器(Debugger) Linters 熟悉编辑器的特性和功能范畴(快捷键、工具、插件) 理解调试器所反馈出的信息 调试符号(Debugging symbols) WinDbg GDB 选择一款广受欢迎的IDE, 并好好研究它、用好它。目前流行 的IDE有:Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode等等。 学习如何使用调试器,并深入了解 调试器所具有的所有功能。 选择一款广受欢迎的编 辑器,并好好研究它、 用好它。例如:Notepad++, Atom等。 通过命令行来使用调试器并非 一项常规技能。掌握通过IDE来 使用调试器的能力就足够了, 例如通过IDE设置断点,等等。 了解常见错误(段错误 segfault, 内存溢出 out of memory, 非法访问 access violation) 以及未定义行为(undefined behavior)的概念。 选择一款广受欢迎的编辑器, 并好好研究它、用好它。例如: Visual Code, Atom, Sublime Text 等等。 编译器(Compilers) 对编译过程的基本了解 将源代码编译为目标文件(compilation) 目标文件链接过程 (linking) 编译器的编译过程 特定编译器的特性 每个编译器之间有细微的差别。 最好对这些差别有所了解,以避免 陷入一些陷阱: Clang++/LLVM,Intel C++, MSVS C++,GCC,MinGW 编译器执行代码编译过程的数个阶段。 对所有这些阶段进行基本的了解将有助 于更好地理解编译中可能出现的问题。 不过,只有编译器创建者才需要深入了 解编译器知识。 构建系统(Build systems) CMake Makefile ninja 包管理器(Package managers) vcpkg spack Conan nuget 库(Library) boost opencv poco 引用库(Libraries inclusion) protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl 框架(Frameworks) gtest/gmock Qt catch2 google profiler pytorch c++ 使用程序库 软件授权许可(Licensing) 计算机科学 数据结构 算法 布尔代数(Boolean algebra) 有限状态机(Finite-state machines) 了解如何计算算法复 杂度,和如何计算内 存消耗也很有好处。 版本控制软件(Version Control) 分布式 集中式 SVN git Mercurial 最佳实践 代码质量 代码指南 开发原则 KISS (Keep It Simple, Stupid) 保持简约、简单 DRY (Don't Repeat Yourself) 不要重复你自己(不写重复代码) YAGNI (You Aren't Gonna Need It) 你不需要它 APO (Avoid Premature Optimization) 避免过早优化 BDUF (Big Design Up Front) 前期大型设计 Composition is preferably than the inheritance 组合优于继承 Occam's razor 奥卡姆剃刀原理(简约法则) Divide and Conquer 分治法 记录和遥测(Logging and telemetry) 代码评审(Code review) 阅读理解现有代码的能力 评审代码的能力 软件生命周期 实现(Implementation) 测试 维护 版本管理(Versioning) 单元测试(Unit tests) 集成测试(Integration tests) 功能测试(Functional tests) 性能测试(Performance tests) 软件架构和组件设计 组件集成 软件部署(Deployment) 征集要求 软件生命周期结束 代码分析器(Code analyzers) 静态分析器(Static analyzers) 动态分析器(Dynamic analyzers) Profilers C++ 核心指南 行业标准 MISRA Autosar 命令行 batch Powershell bash CI/CD(持续集成、持续部署) 主干开发(Trunk Based Development) 零停机时间部署(Zero downtime deployment) 创建软件部署包 文档 安装包 其他编程语言的使用 语言互操作性(Language interoperability) 命名规则(naming conventin), tab键 vs 空格键 space,等等。 用于结合以下任意一种工具来配置自动代码格式验证:clang- format 代码格式,Resharper - 代码风格,MSVS - 代码风格。 - Scripting - Functional - SQL like - NoSQL 有时需要具备能够重用由另 一种语言编写成的库的能力 。 例如:在C#中调用C++库。 向后兼容(Backward compatibility) 不要忽略来自编译器或任何代码 分析器的警告。 他们是你的朋友,而不是敌人。 Microsoft GSL 软件设计 软件架构风格 基于组件 Component-based 单体式应用程序 Monolithic application 分层模式 Layered 客户/服务器模式 Client-server 微服务架构 Microservices architecture 事件驱动架构 Event-driven 插件Plug-ins REST 面向服务的架构 Service-oriented architecture 设计模式 Design Patters (GoF) 行为模式(Behavioral) 结构模式(Structural) 创建模式(Creational) 面向对象编程 (OOP) SOLID UML 架构模式 MVC 模型-视图-控制器模式 MVVM Three-tier 三层架构 Onion Hexagon 开发方法论 测试驱动开发(Test Driven Development) 行为驱动开发(Behavior Driven Development) 领域驱动设计(Domain Driven Design) 内存 内存抽象(Memory abstractions) 内存对齐(Memory alignment) 内存管理(Memory management) 二进制单位 可执行文件(Executable file) 静态库(Static library) 动态库(Dynamic library) 栈(Stack) 全局内存(Global memory) 堆(Heap) 应用内存(Application memory) 虚拟内存(Virtual memory) 操作系统 多线程 错误 死锁(Dead lock) 竞态条件(Race condition) 活锁(Live lock) 饥饿(Starvation) 线程(Threads) 并发(Concurrency) 互斥锁 (Mutexes) 信号量(Semaphores) 无锁(lock-free) 事件处理(Event handling) 同步(Sync) 异步(Async) 过程(Process) 进程间通信(Interprocess communication) 共享内存(Shared memory) 管道(Pipes) 序列化(Serialization) json XML 网络(Network) TCP/IP OSI Sockets HTTP TCP UDP 文件系统(File system) 任务调度(Task scheduler) 虚拟化(Virtualization) VirtualBox VMware Workstation 容器(Containers) Hyper-V Docker 云服务(Cloud Services) Kubernetes 程序安全 加密 MultiCPU systems Multicore CPU NUMA 输入/输出(Input/output) 驱动程序(Drivers) 音频(Audio) 显卡(Graphics) 打印机/打印 Printers (printing) DirectSound OpenAL DirectX Vulkan OpenGL CUDA 通用技能 C++语言工具 C++语法 С++ 开发者路线图 简介 C++至今仍旧是最受欢迎的开发语言之一,有很多人想要开始学习C++并成为开发者。初学者通常会面临这样 的问题:“我应当从何开始?我需要学些什么?应当以什么样的顺序去学?我需要参考哪些书籍? 我们希望通过这份路线图来回答这些问题。本图旨在帮助初学者或经验有限的人士,所涵盖的内容侧重于可 用在大多数开发项目中的通用能力和技能。如果您参考本路线图所罗列的相关材料,您将可以为自己创建一 个高效的学习计划,而不被次要信息分心。本路线图将帮助您达到一个许多商业项目普遍要求的C++水平。 详细信息: https://github.com/salmer/CppDeveloperRoadmap 如何使用 如您有任何意见或建议,请随时与我们联系。我们将感激不尽 :) 您可通过以下任一Github链接联系我们 反馈与沟通 选修 初级 中级 高级 中级开发者具备以下能力: 可以为一款应用程序设计出 新的功能,即便是缺乏对于 该项新功能的完善的具体要 求或相关信息。 高级开发者具备以下能力: 结合业务领域的相关背景, 设计出解决方案/组件,并作 出相关决策。 初学者必须尽快掌握以下技能 : 编写易读且结构良好的代码。 初学者需注意,对于中级和高 级的技能,只需掌握基本概念 即可。 本路线图标示出了学习“步骤”。 这些“步骤”旨在规划出一套 易于操作的学习计划,以帮助 初学者在获取足够的C++基础 知识的同时,逐步提升深入学 习的信心。 创作者 https://github.com/salmer/CppDeveloperRoadmap 仔细阅读许可协议的条款。 您的项目必须遵守这些条款, 才能使用这些库。
\ No newline at end of file
+步骤 1 步骤 2 步骤 3 步骤 4 步骤 1 步骤 3 步骤 5 步骤 1 步骤 4 步骤 2 C++ 开发者 软性技能 硬性技能 一开始,有些技能看似没有 办法习得或提升。然而,在 我们看来,这里所列的每一 项技能,都是可以通过练习 得以提升的。每个人的学习 目的不同,最终成效取决于 您个人的愿望和努力 :) 学习能力 管理错误 思考 责任 资源管理 交流沟通 团队协作 情绪智力(情商) 理解开发背景 以客户为中心 技术 发展趋势 共情 专注 思想开明 适应性 抗压能力 在不确定性中工作 理解团队内的角色分工 支持帮助团队成员 在分布式团队中工作 提供意见反馈 领导力 启导、指导他人 委派工作 向员工分配和明确任务 计划并制订目标 协商 英文能力 演讲演示 书面沟通技巧 社交 倾听 说服 团队内部交流创意和想法的能力 寻求妥协 解决争议 向团队以外的人员提供信息的能力 时间管理 管理优先级 作决定 盲打 多重任务同时进行 纪律 坚持 主动性 独立 解决问题 逻辑性 批判性 创意性 策略 系统性 接受批评 出现错误及时通知 承认您的错误 分析错误 提出正确的问题 实验实操 知识管理 信息处理 收集、分析、评估信息,并据此做出决 策的能力。 反思 冷静地回应他人的评论。很有 可能他人所说的话、试图证明 的事情,仅仅基于他们自己的 角度,这是可以理解的。请客 观地评估他人观点的有用性。 主动承担具有挑战性的任务,以发展您的技 能和能力,即便此刻您还不具备完全足够的 知识或经验(您的技能将会通过此类任务得 到快速发展)。关键是要能够区分出:哪些 是真正有助于您提升技能的复杂任务,而哪 些又是仅仅需要替罪羊的愚蠢的任务。 您应该对自己的职业发展负责。 不要等待团队领导来决定您要学习什么。请不要忘记,盲 目遵循他人安排的计划,只会让您提高某些适用于某特定 公司的技能。 最好商讨如何将您的个人利益和兴趣也纳入计划之中, 否则的话,就很有可能将时间花在不相关的技能上,从而 影响职业机会。不过切记不要太极端:别不加选择地什么 都学,也不要什么都拒绝直到有一个完美的量身定制的学 习计划出现。 自组织(Self- organization) 有能力根据各方人员不 同的背景,而提供适量 、适当的信息,以促进 有效的沟通交流。 解决冲突 如果您阅读本路线图,您大概率已经注 意到英文能力有多重要:) 通常,您至少需要具备英文阅读能力, 因为您要能够读懂技术文档。不过,随 着您在职业阶梯上的步步晋升,您将同 时需要更加自信地用英文说和写。 寻找志同道合的人,并 加入或创建相关社区, 以进行经验交流。 您应当研究和观察当代发展趋势,以保 持自己的竞争力, 并适应变化。 经验丰富的开发人员应该培养管理技能 和业务沟通技能,以高效地完成任务。 如果您有较好的情商,那这就相对更容 易做到。 对于初级开发人员来说,共情能力在与 同事互动中也是非常有用的。 基本运算 算术运算 循环: for/while 逻辑运算 位运算 函数 Lambda表达式 运算符 数据类型 动态类型 静态类型 RTTI(运行时类型识别) 指针&引用 代码库结构化 引用 内存模型 智能指针(smart pointer) 原始指针 代码拆分为 headers/cpp 文件 作用域(Scope) 内存泄漏 前向声明 unique_ptr shared_ptr 对象生命周期 new/delete 运算符 weak_ptr 命名空间(Namespace) 常规或自定义类型 (结构/类)的常规运 算符的重载。 为防止内存泄漏 问题,最好使用 智能指针而不是 原始指针。 结构体(Struct)和类(class) 异常处理 函数重载 虚函数表(Virtual table, vtbl) 面向对象编程 (OOP) 异常(Exceptions) 非法访问(Access violation) 动态多态(Dynamic polymorphism) 虚函数(Virtual methods) 三/五/零法则 静态多态(Static polymorphism) 多重继承(Multiple inheritance) 钻石继承(Diamond inheritance) 错误码(Error codes) 代码中最好避免 出现多重继承 (抽象类除外), 以防止运行时出 现问题 自动类型推导 auto (automatic type deduction) 语言概念(Language concepts) 类型转换(type casting) 静态类型转换(static_cast) const_cast 动态类型转换(dynamic_cast) reinterpret_cast 未定义行为 (Undefined Behavior,UB) 参数依赖查找(Argument-dependent lookup,ADL) 宏(Macros) 名字改写(Name mangling) 标准程序库+标准模板库(Standard library + STL) 输入输出流(iostream) 算法(Algorithms) 迭代器(Iterators) 容器(Containers) Date/time 多线程(Multithreading) 根据 ISO 标准,某些语言结构具有未定义行为。 如果出现任何错误,则无法预测程序进 一步的行为,因为程序此后的行为取决 于平台环境、运行时的上下文具体内容等。 模板(Template) 可变参数模板 (Variadic templates) 模板特化(Template specialization) 类型特征(type traits) SFINAE 模板全特化(Full template specialization) 模板偏特化(Partial template specialization) RAII(资源获取即初始化) pimpl(指向实现的指针) Erase-Remove(删除) Non-Copyable (不可复制)/Non-Moveable(不可移动) Copy and swap(复制并交换) Copy on write(写时复制) CRTP(奇异递归模板) 标准(Standards) C++11/14 C++17 C++20 最新版本 C++0x 惯常用法/设计习语(Idioms) 使用源代码 文本编辑器 集成开发环境(IDE) 代码编辑器 调试器(Debugger) Linters 熟悉编辑器的特性和功能范畴(快捷键、工具、插件) 理解调试器所反馈出的信息 调试符号(Debugging symbols) WinDbg GDB 选择一款广受欢迎的IDE, 并好好研究它、用好它。目前流行 的IDE有:Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode等等。 学习如何使用调试器,并深入了解 调试器所具有的所有功能。 选择一款广受欢迎的编 辑器,并好好研究它、 用好它。例如:Notepad++, Atom等。 通过命令行来使用调试器并非 一项常规技能。掌握通过IDE来 使用调试器的能力就足够了, 例如通过IDE设置断点,等等。 了解常见错误(段错误 segfault, 内存溢出 out of memory, 非法访问 access violation) 以及未定义行为(undefined behavior)的概念。 选择一款广受欢迎的编辑器, 并好好研究它、用好它。例如: Visual Code, Atom, Sublime Text 等等。 编译器(Compilers) 对编译过程的基本了解 将源代码编译为目标文件(compilation) 目标文件链接过程 (linking) 编译器的编译过程 特定编译器的特性 每个编译器之间有细微的差别。 最好对这些差别有所了解,以避免 陷入一些陷阱: Clang++/LLVM,Intel C++, MSVS C++,GCC,MinGW 编译器执行代码编译过程的数个阶段。 对所有这些阶段进行基本的了解将有助 于更好地理解编译中可能出现的问题。 不过,只有编译器创建者才需要深入了 解编译器知识。 构建系统(Build systems) CMake Makefile ninja 包管理器(Package managers) vcpkg spack Conan nuget 库(Library) boost opencv poco 引用库(Libraries inclusion) protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl 框架(Frameworks) gtest/gmock Qt catch2 google profiler pytorch c++ 使用程序库 软件授权许可(Licensing) 计算机科学 数据结构 算法 布尔代数(Boolean algebra) 有限状态机(Finite-state machines) 了解如何计算算法复 杂度,和如何计算内 存消耗也很有好处。 版本控制软件(Version Control) 分布式 集中式 SVN git Mercurial 最佳实践 代码质量 代码指南 开发原则 KISS (Keep It Simple, Stupid) 保持简约、简单 DRY (Don't Repeat Yourself) 不要重复你自己(不写重复代码) YAGNI (You Aren't Gonna Need It) 你不需要它 APO (Avoid Premature Optimization) 避免过早优化 BDUF (Big Design Up Front) 前期大型设计 Composition is preferably than the inheritance 组合优于继承 Occam's razor 奥卡姆剃刀原理(简约法则) Divide and Conquer 分治法 记录和遥测(Logging and telemetry) 代码评审(Code review) 阅读理解现有代码的能力 评审代码的能力 软件生命周期 实现(Implementation) 测试 维护 版本管理(Versioning) 单元测试(Unit tests) 集成测试(Integration tests) 功能测试(Functional tests) 性能测试(Performance tests) 软件架构和组件设计 组件集成 软件部署(Deployment) 征集要求 软件生命周期结束 代码分析器(Code analyzers) 静态分析器(Static analyzers) 动态分析器(Dynamic analyzers) Profilers C++ 核心指南 行业标准 MISRA Autosar 命令行 batch Powershell bash CI/CD(持续集成、持续部署) 主干开发(Trunk Based Development) 零停机时间部署(Zero downtime deployment) 创建软件部署包 文档 安装包 其他编程语言的使用 语言互操作性(Language interoperability) 命名规则(naming conventin), tab键 vs 空格键 space,等等。 用于结合以下任意一种工具来配置自动代码格式验证:clang- format 代码格式,Resharper - 代码风格,MSVS - 代码风格。 - Scripting - Functional - SQL like - NoSQL 有时需要具备能够重用由另 一种语言编写成的库的能力 。 例如:在C#中调用C++库。 向后兼容(Backward compatibility) 不要忽略来自编译器或任何代码 分析器的警告。 他们是你的朋友,而不是敌人。 Microsoft GSL 软件设计 软件架构风格 基于组件 Component-based 单体式应用程序 Monolithic application 分层模式 Layered 客户/服务器模式 Client-server 微服务架构 Microservices architecture 事件驱动架构 Event-driven 插件Plug-ins REST 面向服务的架构 Service-oriented architecture 设计模式 Design Patters (GoF) 行为模式(Behavioral) 结构模式(Structural) 创建模式(Creational) 面向对象编程 (OOP) SOLID UML 架构模式 MVC 模型-视图-控制器模式 MVVM Three-tier 三层架构 Onion Hexagon 开发方法论 测试驱动开发(Test Driven Development) 行为驱动开发(Behavior Driven Development) 领域驱动设计(Domain Driven Design) 内存 内存抽象(Memory abstractions) 内存对齐(Memory alignment) 内存管理(Memory management) 二进制单位 可执行文件(Executable file) 静态库(Static library) 动态库(Dynamic library) 栈(Stack) 全局内存(Global memory) 堆(Heap) 应用内存(Application memory) 虚拟内存(Virtual memory) 操作系统 多线程 错误 死锁(Dead lock) 竞态条件(Race condition) 活锁(Live lock) 饥饿(Starvation) 线程(Threads) 并发(Concurrency) 互斥锁 (Mutexes) 信号量(Semaphores) 无锁(lock-free) 事件处理(Event handling) 同步(Sync) 异步(Async) 过程(Process) 进程间通信(Interprocess communication) 共享内存(Shared memory) 管道(Pipes) 序列化(Serialization) json XML 网络(Network) TCP/IP OSI Sockets HTTP TCP UDP 文件系统(File system) 任务调度(Task scheduler) 虚拟化(Virtualization) VirtualBox VMware Workstation 容器(Containers) Hyper-V Docker 云服务(Cloud Services) Kubernetes 程序安全 加密 MultiCPU systems Multicore CPU NUMA 输入/输出(Input/output) 驱动程序(Drivers) 音频(Audio) 显卡(Graphics) 打印机/打印 Printers (printing) DirectSound OpenAL DirectX Vulkan OpenGL CUDA 通用技能 C++语言工具 C++语法 С++ 开发者路线图 简介 C++至今仍旧是最受欢迎的开发语言之一,有很多人想要开始学习C++并成为开发者。初学者通常会面临这样 的问题:“我应当从何开始?我需要学些什么?应当以什么样的顺序去学?我需要参考哪些书籍? 我们希望通过这份路线图来回答这些问题。本图旨在帮助初学者或经验有限的人士,所涵盖的内容侧重于可 用在大多数开发项目中的通用能力和技能。如果您参考本路线图所罗列的相关材料,您将可以为自己创建一 个高效的学习计划,而不被次要信息分心。本路线图将帮助您达到一个许多商业项目普遍要求的C++水平。 详细信息: https://github.com/salmer/CppDeveloperRoadmap 如何使用 如您有任何意见或建议,请随时与我们联系。我们将感激不尽 :) 您可通过以下任一Github链接联系我们 反馈与沟通 选修 初级 中级 高级 中级开发者具备以下能力: 可以为一款应用程序设计出 新的功能,即便是缺乏对于 该项新功能的完善的具体要 求或相关信息。 高级开发者具备以下能力: 结合业务领域的相关背景, 设计出解决方案/组件,并作 出相关决策。 初学者必须尽快掌握以下技能 : 编写易读且结构良好的代码。 初学者需注意,对于中级和高 级的技能,只需掌握基本概念 即可。 本路线图标示出了学习“步骤”。 这些“步骤”旨在规划出一套 易于操作的学习计划,以帮助 初学者在获取足够的C++基础 知识的同时,逐步提升深入学 习的信心。 创作者 https://github.com/salmer/CppDeveloperRoadmap 仔细阅读许可协议的条款。 您的项目必须遵守这些条款, 才能使用这些库。
\ No newline at end of file
diff --git a/English/Graph/roadmap.drawio.svg b/English/Graph/roadmap.drawio.svg
index ccfa760..666c9ab 100644
--- a/English/Graph/roadmap.drawio.svg
+++ b/English/Graph/roadmap.drawio.svg
@@ -1,4 +1,4 @@
-1 step 2 step 3 step 4 step 1 step 3 step 5 step 1 step 4 step 2 step C++ developer Soft skills Hard skills At first, some of the skills may seem impossible to develop. However, we think differently. It is possible to work on each of the skills. Everything depends on your desire and internal blocks. Everything is individual, and it's up to you to decide. :) Ability to learn Manage mistakes Thinking Responsibility Manage resources Communication Team work Emotional intelligence Understanding the development context Customer focus Technology Trends Empathy Concentration Open-mindedness Adaptability Stress resistance Working in uncertainty Understanding the distribution of roles in a team Support team members Work in a distributed team Providing feedback Leadership Mentoring Delegation Assigning and clarifying tasks to employees Planning and goal setting Negotiation English Presentation Written communication skill Networking Ability to listen Persuasion Ability to communicate ideas and thoughts within the team Finding compromises Dispute resolution Providing information to people outside the team Time management Prioritization Taking decisions Blind typing Multitasking Discipline Persistence Initiative Independence Problem solving Logical Critical Creative Strategic Systems Accept criticism Notify about mistakes in time Admitting your mistakes Analyze mistakes Ask the right questions Experimenting Manage knowledge Process information Ability to gather, analyze, evaluate information and make decisions based on it. Reflection Calmly react to what people say. Most likely that they only consider their own context when they try to prove something. This is fine. Evaluate the usefulness of their point of view. Take challenging tasks in order to develop your skills and competencies, even when there is not enough knowledge/experience (skills will develop much faster through such tasks). The main thing is to distinguish a really useful complex task that will help you to boost your skills from a dumb task that requires a scapegoat. You should be responsible for your professional development. Don't wait for the team lead to decide for you what to study. Do not forget that blind adherence to someone else's plan will sharpen your skills according to requirements of a particular company. It is better to discuss and build in your interests into the plan. If this is not done, there is a high risk of getting irrelevant skills, which will hit career opportunities. But don't overdo it: don't study absolutely everything or don't passively wait until a development plan will be created for you. Self-organization The ability to provide the amount of information that is necessary to communicate to people with different backgrounds. Conflict solving If you read this it means you already understand why it is so important :) Usually, it is required at least to read because you would need to understand technical documentation. But as you move up the career ladder, you will need to speak and write more confidently in English. Look for like-minded people and join/create a community for experience exchange. You should study and observe contemporary trends to be competitive, as well as being able to adapt to them. Experienced developers should develop management skills and business communication skills to complete tasks efficiently. It is easier to do if you have developed emotional intelligence. For a junior developer, the skill is also useful to better interact with colleagues. Basic operations Arithmetic operations Loops: for/while Logical operations Bitwise operations Functions lambda Operators Data types Dynamic typing Static typing RTTI Pointers & References Codebase structuring References Memory model Smart pointer Raw pointers Code splitting into headers/cpp files Scope Memory leakage Forward declaration unique_ptr shared_ptr Lifetime of objects new/delete operators weak_ptr Namespaces The overloading of regular set of operators for regular or custom types (structures/classes). To prevent memory leakage problems it is better to use smart pointers rather than raw pointers. Structures and classes Exception handling Overloading of functions Virtual table (vtbl) Object Oriented programming (OOP) Exceptions Access violation Dynamic polymorphism Virtual methods The rule of zero/three/five Static polymorphism Multiple inheritance Diamond inheritance Error codes It's preferred to avoid multiple inheritance (excepting abstract classes) to prevent runtime issues auto (automatic type deduction) Language concepts type casting static_cast const_cast dynamic_cast reinterpret_cast Undefined Behavior (UB) Argument-dependent lookup (ADL) Macros Name mangling Standard library + STL iostream Algorithms Iterators Containers Date/time Multithreading Some of language constructions have non-declared behavior according to the ISO standard. In case of any error, it's not possible to predict further behavior. It depends on a platform environment, runtime context, etc. Templates Variadic templates The template specialization type traits SFINAE The full template specialization The partial template specialization RAII pimpl Erase-Remove Non-Copyable/Non-Moveable Copy and swap Copy on write CRTP Standards C++11/14 C++17 C++20 newest C++0x Idioms Working with source code Text editors IDE Code editors Debugger Linters Knowledge of features and abilities (shortcuts, tools, plugins) Understanding of debugger messages Debugging symbols WinDbg GDB Choose one of the popular IDEs and study it well: Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode, etc. Study how to use a debugger and all its features Choose one of the popular editors and study it well. For example: Notepad++, Atom, etc. The ability to work with a debugger via command line is a not common skill. It's sufficient to work with it via IDE. For example: set conditional breakpoints, etc. Learn about common errors (segfault, out of memory, access violation) and undefined behavior concept. Choose one of the popular editors and study it well. For example: Visual Code, Atom, Sublime Text, etc. Compilers Basic understanding of compilers stages Compilation of sources to object files (compilation) The object files linkage (linking) Working stages of compilers Features of a particular compiler Each compiler has its nuances. It's good to know about them to prevent getting any trap: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGW The compiler performs several stages of code compilation. It's good to know about all of them to better understand compilation issues. Deep knowledge is needed for compiler creators only. Build systems CMake Makefile ninja Package managers vcpkg spack Conan nuget Libraries boost opencv poco Libraries inclusion protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl Frameworks gtest/gmock Qt catch2 google profiler pytorch c++ Working with libraries Licensing Computers Science Data structures Algorithms Boolean algebra Finite-state machines It's also good to know how to calculate algorithm complexity and memory consumption. Version control software Distributed Centralized SVN git Mercurial Best practices Code quality Code guidelines Principles of development 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) Composition is preferably than the inheritance Occam's razor Divide and Conquer Logging and telemetry Code review Skill to read existing code sources Skill to review code Lifecycle stages of a software Implementation Testing Maintanance Versioning Unit tests Integration tests Functional tests Performance tests Software architecture and components design Components integration Deployment Collecting requirements End of a software lifecycle Code analyzers Static analyzers Dynamic analyzers Profilers C++ core guidelines Industrial standards MISRA Autosar Command line batch Powershell bash CI/CD Trunk Based Development Zero downtime deployment Creation of a software deployment package Documentation Installer package Usage of other programming languages Language interoperability Naming conventions, tabs vs spaces, etc. To configure automated code formatting verification with one of the suitable utilities: clang-format, Resharper - code style, MSVS - code style. - Scripting - Functional - SQL like - NoSQL Sometimes it's needed to provide an ability to reuse a library written in a different language from another one. For example: to call C++ libraries in C#. Backward compatibility Do not ignore warnings from compiler and static analyzer. They are your friends, not enemies Microsoft GSL Software design Architecture styles Component-based Monolithic application Layered Client-server Microservices architecture Event-driven Plug-ins REST Service-oriented architecture Design Patters (GoF) Behavioral Structural Creational OOP SOLID UML Architecture patterns MVC MVVM Three-tier Onion Hexagon Methodologies of development Test Driven Development Behavior Driven Development Domain Driven Design Memory Memory abstractions Memory alignment Memory management Binary units Executable file Static library Dynamic library Stack Global memory Heap Application memory Virtual memory Operating systems Multithreading Errors Dead lock Race condition Live lock Starvation Threads Concurrency Mutexes Semaphores lock-free Event handling Sync Async Process Interprocess communication Shared memory Pipes Serialization json XML Network TCP/IP OSI Sockets HTTP TCP UDP File system Task scheduler Virtualization VirtualBox VMware Workstation Containers Hyper-V Docker Cloud Services Kubernetes Security Encryption MultiCPU systems Multicore CPU NUMA Input/output Drivers Audio Graphics Printers (printing) DirectSound OpenAL DirectX Vulkan OpenGL CUDA Common skills Language tools Language syntax C++ Developer Roadmap About: C ++ is still one of the most popular development languages. There is quite a number of people that want to start learning it and become a C++ developer. They face questions like: "Where should I start? What and in what order should I study? What books should I read?" We tried to answer these questions in the presented roadmap. The map focuses on general competencies and skills that could be found in most projects. It is designed to help those who are just starting their education or have little experience. You can create a more productive learning plan without being distracted by side information if you study the set of listed materials. It will help you to master C++ at the level that is used in many commercial projects. How to use: If you have any feedback or remarks don't hesitate to contact us. We really appreciate it. :) To contact us choose one of the following Github approaches: - For any remarks related to repository content - go to Pull Requests and submit a new one Feedback: Optional Junior Middle Senior The middle developer has the skills to create a design for new functionality as a part of a component/application if even there're not enough requirements or information presented. The senior developer has the skills to create a design and make decisions for a solution/component taking into account business area context. The junior must acquire the following skill as soon as possible: to write easy-readable and well-structured code. The juniors should be aware of middle/senior skills. It's enough to have a basic understanding of them. The "steps" are presented on this map. They're intended to show an easy for newbies to be able to get confident base knowledge about the language at the beginning. Repository: https://github.com/salmer/CppDeveloperRoadmap Carefully read the terms of the license agreement. Your project must comply with them.
\ No newline at end of file
+1 step 2 step 3 step 4 step 1 step 3 step 5 step 1 step 4 step 2 step C++ developer Soft skills Hard skills At first, some of the skills may seem impossible to develop. However, we think differently. It is possible to work on each of the skills. Everything depends on your desire and internal blocks. Everything is individual, and it's up to you to decide. :) Ability to learn Manage mistakes Thinking Responsibility Manage resources Communication Team work Emotional intelligence Understanding the development context Customer focus Technology Trends Empathy Concentration Open-mindedness Adaptability Stress resistance Working in uncertainty Understanding the distribution of roles in a team Support team members Work in a distributed team Providing feedback Leadership Mentoring Delegation Assigning and clarifying tasks to employees Planning and goal setting Negotiation English Presentation Written communication skill Networking Ability to listen Persuasion Ability to communicate ideas and thoughts within the team Finding compromises Dispute resolution Providing information to people outside the team Time management Prioritization Taking decisions Blind typing Multitasking Discipline Persistence Initiative Independence Problem solving Logical Critical Creative Strategic Systems Accept criticism Notify about mistakes in time Admitting your mistakes Analyze mistakes Ask the right questions Experimenting Manage knowledge Process information Ability to gather, analyze, evaluate information and make decisions based on it. Reflection Calmly react to what people say. Most likely that they only consider their own context when they try to prove something. This is fine. Evaluate the usefulness of their point of view. Take challenging tasks in order to develop your skills and competencies, even when there is not enough knowledge/experience (skills will develop much faster through such tasks). The main thing is to distinguish a really useful complex task that will help you to boost your skills from a dumb task that requires a scapegoat. You should be responsible for your professional development. Don't wait for the team lead to decide for you what to study. Do not forget that blind adherence to someone else's plan will sharpen your skills according to requirements of a particular company. It is better to discuss and build in your interests into the plan. If this is not done, there is a high risk of getting irrelevant skills, which will hit career opportunities. But don't overdo it: don't study absolutely everything or don't passively wait until a development plan will be created for you. Self-organization The ability to provide the amount of information that is necessary to communicate to people with different backgrounds. Conflict solving If you read this it means you already understand why it is so important :) Usually, it is required at least to read because you would need to understand technical documentation. But as you move up the career ladder, you will need to speak and write more confidently in English. Look for like-minded people and join/create a community for experience exchange. You should study and observe contemporary trends to be competitive, as well as being able to adapt to them. Experienced developers should develop management skills and business communication skills to complete tasks efficiently. It is easier to do if you have developed emotional intelligence. For a junior developer, the skill is also useful to better interact with colleagues. Basic operations Arithmetic operations Loops: for/while Logical operations Bitwise operations Functions lambda Operators Data types Dynamic typing Static typing RTTI Pointers & References Codebase structuring References Memory model Smart pointer Raw pointers Code splitting into headers/cpp files Scope Memory leakage Forward declaration unique_ptr shared_ptr Lifetime of objects new/delete operators weak_ptr Namespaces The overloading of regular set of operators for regular or custom types (structures/classes). To prevent memory leakage problems it is better to use smart pointers rather than raw pointers. Structures and classes Exception handling Overloading of functions Virtual table (vtbl) Object Oriented programming (OOP) Exceptions Access violation Dynamic polymorphism Virtual methods The rule of zero/three/five Static polymorphism Multiple inheritance Diamond inheritance Error codes It's preferred to avoid multiple inheritance (excepting abstract classes) to prevent runtime issues auto (automatic type deduction) Language concepts type casting static_cast const_cast dynamic_cast reinterpret_cast Undefined Behavior (UB) Argument-dependent lookup (ADL) Macros Name mangling Standard library + STL iostream Algorithms Iterators Containers Date/time Multithreading Some of language constructions have non-declared behavior according to the ISO standard. In case of any error, it's not possible to predict further behavior. It depends on a platform environment, runtime context, etc. Templates Variadic templates The template specialization type traits SFINAE The full template specialization The partial template specialization RAII pimpl Erase-Remove Non-Copyable/Non-Moveable Copy and swap Copy on write CRTP Standards C++11/14 C++17 C++20 newest C++0x Idioms Working with source code Text editors IDE Code editors Debugger Linters Knowledge of features and abilities (shortcuts, tools, plugins) Understanding of debugger messages Debugging symbols WinDbg GDB Choose one of the popular IDEs and study it well: Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode, etc. Study how to use a debugger and all its features Choose one of the popular editors and study it well. For example: Notepad++, Atom, etc. The ability to work with a debugger via command line is a not common skill. It's sufficient to work with it via IDE. For example: set conditional breakpoints, etc. Learn about common errors (segfault, out of memory, access violation) and undefined behavior concept. Choose one of the popular editors and study it well. For example: Visual Code, Atom, Sublime Text, etc. Compilers Basic understanding of compilers stages Compilation of sources to object files (compilation) The object files linkage (linking) Working stages of compilers Features of a particular compiler Each compiler has its nuances. It's good to know about them to prevent getting any trap: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGW The compiler performs several stages of code compilation. It's good to know about all of them to better understand compilation issues. Deep knowledge is needed for compiler creators only. Build systems CMake Makefile ninja Package managers vcpkg spack Conan nuget Libraries boost opencv poco Libraries inclusion protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl Frameworks gtest/gmock Qt catch2 google profiler pytorch c++ Working with libraries Licensing Computers Science Data structures Algorithms Boolean algebra Finite-state machines It's also good to know how to calculate algorithm complexity and memory consumption. Version control software Distributed Centralized SVN git Mercurial Best practices Code quality Code guidelines Principles of development 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) Composition is preferably than the inheritance Occam's razor Divide and Conquer Logging and telemetry Code review Skill to read existing code sources Skill to review code Lifecycle stages of a software Implementation Testing Maintanance Versioning Unit tests Integration tests Functional tests Performance tests Software architecture and components design Components integration Deployment Collecting requirements End of a software lifecycle Code analyzers Static analyzers Dynamic analyzers Profilers C++ core guidelines Industrial standards MISRA Autosar Command line batch Powershell bash CI/CD Trunk Based Development Zero downtime deployment Creation of a software deployment package Documentation Installer package Usage of other programming languages Language interoperability Naming conventions, tabs vs spaces, etc. To configure automated code formatting verification with one of the suitable utilities: clang-format, Resharper - code style, MSVS - code style. - Scripting - Functional - SQL like - NoSQL Sometimes it's needed to provide an ability to reuse a library written in a different language from another one. For example: to call C++ libraries in C#. Backward compatibility Do not ignore warnings from compiler and static analyzer. They are your friends, not enemies Microsoft GSL Software design Architecture styles Component-based Monolithic application Layered Client-server Microservices architecture Event-driven Plug-ins REST Service-oriented architecture Design Patters (GoF) Behavioral Structural Creational OOP SOLID UML Architecture patterns MVC MVVM Three-tier Onion Hexagon Methodologies of development Test Driven Development Behavior Driven Development Domain Driven Design Memory Memory abstractions Memory alignment Memory management Binary units Executable file Static library Dynamic library Stack Global memory Heap Application memory Virtual memory Operating systems Multithreading Errors Dead lock Race condition Live lock Starvation Threads Concurrency Mutexes Semaphores lock-free Event handling Sync Async Process Interprocess communication Shared memory Pipes Serialization json XML Network TCP/IP OSI Sockets HTTP TCP UDP File system Task scheduler Virtualization VirtualBox VMware Workstation Containers Hyper-V Docker Cloud Services Kubernetes Security Encryption MultiCPU systems Multicore CPU NUMA Input/output Drivers Audio Graphics Printers (printing) DirectSound OpenAL DirectX Vulkan OpenGL CUDA Common skills Language tools Language syntax C++ Developer Roadmap About: C ++ is still one of the most popular development languages. There is quite a number of people that want to start learning it and become a C++ developer. They face questions like: "Where should I start? What and in what order should I study? What books should I read?" We tried to answer these questions in the presented roadmap. The map focuses on general competencies and skills that could be found in most projects. It is designed to help those who are just starting their education or have little experience. You can create a more productive learning plan without being distracted by side information if you study the set of listed materials. It will help you to master C++ at the level that is used in many commercial projects. How to use: If you have any feedback or remarks don't hesitate to contact us. We really appreciate it. :) To contact us choose one of the following Github approaches: - For any remarks related to repository content - go to Pull Requests and submit a new one Feedback: Optional Junior Middle Senior The middle developer has the skills to create a design for new functionality as a part of a component/application if even there're not enough requirements or information presented. The senior developer has the skills to create a design and make decisions for a solution/component taking into account business area context. The junior must acquire the following skill as soon as possible: to write easy-readable and well-structured code. The juniors should be aware of middle/senior skills. It's enough to have a basic understanding of them. The "steps" are presented on this map. They're intended to show an easy for newbies to be able to get confident base knowledge about the language at the beginning. Repository: https://github.com/salmer/CppDeveloperRoadmap Carefully read the terms of the license agreement. Your project must comply with them.
\ No newline at end of file
diff --git a/Russian/Graph/roadmap.drawio.svg b/Russian/Graph/roadmap.drawio.svg
index 0f33472..162cb94 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++ developer Soft skills Hard skills Сначала может показаться, что некоторые из навыков развивать невозможно. Однако мы считаем иначе. Над каждым из пунктов возможно работать. Всё упирается в желание и внутренние блоки. Всё индивидуально, и зависит от вас. :) Умение учиться Работа с ошибками Мышление Ответственность Управление ресурсами Коммуникация Командная работа Эмоциональный интелект Понимание контекста разработки Клиентоориентированность Технологии Тренды Эмпатия Концентрация Открытость новому Адаптируемость Стрессоустойчивость Работа в неопределённости Понимание распределения ролей в команде Помощь Работа в распределённой команде Предоставление обратной связи Лидерство Наставничество Делегирование Постановка задач сотрудникам Планирование и целеполагание Переговорческие навыки Английский язык Презентация Навык переписки Нетворкинг Умение слушать Убеждение Умение доносить мысль/идеи внутри команды Поиск компромиссов Регулирование споров Подача информации людям вне команды Тайм-менеджмент Приоритизация Принятие решений Слепая печать Многозадачность Дисциплина Упорство Инициативность Самостоятельность Решение проблем Логическое Критическое Креативное Стратегическое Системное Восприятие критики Своевременное сигнализирование об ошибках Признание своих ошибок Анализ ошибок Умение задавать правильные вопросы Экспериментирование Управление знаниями Работа с информацией Умение собирать информацию, анализировать её и выдавать взвешенное решение. Рефлексия Cпокойно реагировать на то, что люди говорят. Скорее всего, они учитывают только собственный контекст, когда что-то пытаются доказать. Это нормально. Оценивайте полезность их точки зрения. Брать сложные задачи, чтобы развивать свои навыки и компетенции, даже когда недостаточно знаний/опыта (через такие задачи гораздо быстрее развиваются навыки). Главное отличить реально полезную сложную задачу, которая прокачает, от задачи, на которую ищут крайнего. Быть ответственным за профессиональное развитие. Не ждать пока тимлид решит, что изучать. Не стоит забывать, что слепое следование чужому плану заточит под задачи конкретной компании. Стоит обсуждать и встраивать свои интересы в план. Если этого не сделать - высокий риск получить "непереносимые" компетенции, что ударит по карьерным возможностям. Но и не стоит ударятся в крайности: изучать абсолютно всё подряд или пассивно ждать, пока выдадут план развития. Самоорганизация Способность предоставлять тот объем информации, который необходим для общения с людьми разного бекграунда. Решение конфликтов Достаточно уверенного чтения документации и статей, но для более перспективных вакансий разговорный/письменный навык становится обязательным. Искать единомышленников и присоединяться/создавать комьюнити для общения и передачи опыта. Чтобы быть конкурентоспособным, стоит изучать и наблюдать за новыми веяниями, а также уметь адаптироваться под них. Опытному разработчику стоит развивать навыки управления и общения с бизнесом для эффективного выполнения задач. Это легче делать, если развит эмоциональный интеллект. Для джуниора навык также полезен, чтобы лучше взаимодействовать с коллегами. Базовые операции Арифметические операции Циклы for/while Логические операции Битовые операции Функции lambda Операторы Типы данных Динамическая типизация Статическая типизация RTTI Указатели и ссылки Организация кодовой базы Ссылки Модель памяти Умные указатели Сырые Указатели Разделение кода на headers/cpp юниты Область видимости Утечки памяти Forward declaration unique_ptr shared_ptr Время жизни Операторы new/delete weak_ptr Пространство имён Перегрузка стандартных операторов для различных типов/структур/классов. Чтобы избежать проблем с управлением памятью, старайтесь писать код используя ссылки и умные указатели. Структуры и классы Обработка ошибок Перегрузка методов Таблица вирутальных методов ООП Исключения Access violation Динамический полиморфизм Виртуальные методы Правило нуля/трех/пяти Статический полиморфизм Множественное наследование Ромбовидное наследование Коды возврата Не используйте множественное наследование auto (автоматическое выведение типов) Концепции языка type casting static_cast const_cast dynamic_cast reinterpret_cast Неопределённое поведение (Undefined Behavior) Поиск, зависящий от аргумента (ADL) Макросы Name mangling Стандартная библиотека + STL Поток ввода/вывода Алгоритмы стандартной библиотеки Итераторы Контейнеры Дата/время Многопоточность Языковые конструкции для которых отсутствуют прописанные требования в стандартах. В случае ошибки дальнейшее поведение будет предсказать невозможно, и всецело будет зависеть от контекста выполнения или платформы, где запущено приложение. Шаблоны Variadic templates Специализация шаблона type traits SFINAE Полная специализация Частичная специализация RAII pimpl Erase-Remove Non-Copyable/Non-Moveable Copy and swap Copy on write CRTP Стандарты C++11/14 C++17 C++20 newest C++0x Идиомы Работа с исходным кодом Текстовый редактор IDE Редакторы исходного кода Отладчик Линтеры Знание о базовых возможностях (shortcuts, tools, plugins) Умение читать сообщения отладчика Отладочные символы WinDbg GDB Выберите один из понравившихся популярных IDE и хорошо освойте его: Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode и т.д. Научитесь пользоваться отладчиком. Изучите его возможности. Выберите один из популярных редакторов и хорошо освойте его. К примеру: Notepad++, Atom, и т.д. Навык работы с отладчиком через командную строку - узконаправленный навык. В регулярной работе достаточно уметь работать с отладчиком в рамках IDE. Ознакомьтесь с самыми распространёнными ошибками (segfault, out of memory, access violation) и концепцией неопределённого поведения (undefined behavior) Выберите один из популярных редакторов и и хорошо освойте его: Visual Code, Atom, Sublime Text и т.д. Компиляторы Базовые знания работы компиляторов Компиляция кода в объектные файлы Компоновка объектных файлов в приложение (линковка) Этапы работы компилятора Особенности работы конкретного компилятора У компиляторов есть свои особенности, о которых хорошо бы знать: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGW Есть несколько этапов работы компилятора, о которых следует знать. Это помогает решать проблемы при сборке приложения. Достаточно иметь базовое понимание, чтобы решать большую часть проблем. Детали работы важны разработчикам компиляторов. Системы сборки CMake Makefile ninja Пакетные менеджеры vcpkg spack Conan nuget Популярные библиотеки boost opencv poco Подключение библиотек protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl Фреймворки gtest/gmock Qt catch2 google profiler pytorch c++ Лицензирование Взаимодействие с библиотеками Внимательно читайте условия лицензионного соглашения. Ваш проект должен их соблюдать. Информатика Структуры данных Алгоритмы Булева алгебра Конечные автоматы Также необходимо понимать, как вычислить сложность и потребление памяти у алгоритмов. Системы контроля версий Распределенные Централизованные SVN git Mercurial Практики разработки Качество кода Правила оформления кода Принципы разработки KISS (Keep It Simple, Stupid) DRY (Don't Repeat Yourself) YAGNI (You Aren't Gonna Need It) APO (Avoid Premature Optimization) BDUF (Big Design Up Front) Композиция предпочтительнее наследования Бритва Оккама Разделяй и властвуй Логирование и телеметрия Ревью кода Умение читать чужой код Ревью чужого кода Понимание жизненного цикла производства ПО Реализация Тестирование Поддержка Версионирование ПО Юнит тесты Интеграционное Функциональное Производительность Формирование архитектуры и дизайн компонентов Интеграция компонентов Выпуск Сбор требований Окончание жизненного цикла Анализаторы кода Статические Динамические Профайлеры C++ core guidelines Промышленные стандарты MISRA Autosar Работа с командной строкой batch Powershell bash CI/CD Trunk Based Development Zero downtime deployment Создание пакета поставки ПО Документация Инсталлятор Использование других языков программирования Межязыковое взаимодействие Правила именования переменных, пробелы vs табы, положение фигурных скобок и т.д. Настроить форматирование и автоматически проверять в одной из утилит: clang-format, Resharper - стиль кода, MSVS - стиль кода. - Скриптовые - Функциональные - SQL like - NoSQL Иногда требуется предоставить обертку к библиотеке, написанной на C++ для другого ЯП, например Python или C#. Для этого применяют специальные библиотеки/фреймворки. Обратная совместимость Не игнорируйте предупреждения компилятора и статического анализатора. Они вам друзья, а не враги Microsoft GSL Проектирование ПО Архитектурные стили Component-based Monolithic application Layered Client-server Microservices architecture Event-driven Plug-ins REST Service-oriented architecture Паттерны проектирования (GoF) Поведенческие Структурные Порождающие ООП SOLID UML Архитектурные паттерны MVC MVVM Three-tier Onion Hexagon Методологии Test Driven Development Behavior Driven Development Domain Driven Design Память Абстракции памяти Выравнивание памяти Управление памятью Бинарные единицы Исполняемый файл Статическая библиотека Динамическая библиотека Стек Глобальная память Куча Память приложения Виртуальная память Операционные системы Многопоточность Ошибки Dead lock Race condition Live lock Starvation Потоки Конкуренция Мьютексы Семафоры Алгоритмы без блокировок (lock-free) Обработка событий Синхронные Асинхронные Процессы Межпроцессное взаимодействие Shared memory Pipes Сериализация json XML Сетевой стек TCP/IP OSI Сокеты HTTP TCP UDP Файловая система Планировщик Виртуализация VirtualBox VMware Workstation Контейнеризация Hyper-V Docker Облачные сервисы Kubernetes Безопасность Шифрование Многопроцессорные системы Multicore CPU NUMA Ввод и вывод информации Драйверы Аудио Графическое вычисление/отображение Печать DirectSound OpenAL DirectX Vulkan OpenGL CUDA Общие навыки Языковые инструменты Синтаксис языка C++ Developer Roadmap О карте: С++ всё ещё является одним из самых популярных языков разработки. Есть немало желающих начать его изучать и стать C++ разработчиками. Перед такими людьми встают вопросы: "С чего мне начать? Что и в каком порядке мне изучать? Какие книги стоить почитать?" Мы попытались ответить на эти вопросы в представленной дорожной карте. Карта акцентируется на общих компетенциях и навыках, которые встречаются в большинстве проектов. Она призвана помочь тем, кто только начинает свое обучение или имеет небольшой опыт. Изучив набор перечисленных материалов, вы сможете составить более продуктивный план обучения, не отвлекаясь на побочную информацию. Это поможет вам освоить C++ на том уровне, который встречается во многих коммерческих проектах. Как ориентироваться: Если у вас есть замечания, вопросы или предложения, будем рады получить любую помощь и поддержку. Мы открыты для общения :) Для этого используйте следующие механизмы Github: - Предложения/правки по репозиторию - создавайте и присылайте новый PR в Pull Requests Предложения и замечания: Optional Junior Middle Senior Мидл способен создать дизайн и решения для функционала внутри компонента/приложения даже в случае неполноты требований. Синиор способен создать дизайн и решение для компонента/приложения с учётом бизнес-контекста. Джуниору важно научиться писать структурированный код и не усложнять его без надобности. Код должен быть легко читаемым и поддерживаемым. От джуниора ожидается осведомленность про категории, которые относятся к Middle/Senior. Будет достаточным поверхностное понимание темы. На карте представлены компетенции, которые выделены в "этапы". Мы считаем, что джуниору стоит начинать изучение в данном порядке, чтобы выстроить прочный фундамент. Репозиторий: https://github.com/salmer/CppDeveloperRoadmap
\ No newline at end of file
+1 этап 2 этап 3 этап 4 этап 1 этап 3 этап 5 этап 1 этап 4 этап 2 этап C++ developer Soft skills Hard skills Сначала может показаться, что некоторые из навыков развивать невозможно. Однако мы считаем иначе. Над каждым из пунктов возможно работать. Всё упирается в желание и внутренние блоки. Всё индивидуально, и зависит от вас. :) Умение учиться Работа с ошибками Мышление Ответственность Управление ресурсами Коммуникация Командная работа Эмоциональный интелект Понимание контекста разработки Клиентоориентированность Технологии Тренды Эмпатия Концентрация Открытость новому Адаптируемость Стрессоустойчивость Работа в неопределённости Понимание распределения ролей в команде Помощь Работа в распределённой команде Предоставление обратной связи Лидерство Наставничество Делегирование Постановка задач сотрудникам Планирование и целеполагание Переговорческие навыки Английский язык Презентация Навык переписки Нетворкинг Умение слушать Убеждение Умение доносить мысль/идеи внутри команды Поиск компромиссов Регулирование споров Подача информации людям вне команды Тайм-менеджмент Приоритизация Принятие решений Слепая печать Многозадачность Дисциплина Упорство Инициативность Самостоятельность Решение проблем Логическое Критическое Креативное Стратегическое Системное Восприятие критики Своевременное сигнализирование об ошибках Признание своих ошибок Анализ ошибок Умение задавать правильные вопросы Экспериментирование Управление знаниями Работа с информацией Умение собирать информацию, анализировать её и выдавать взвешенное решение. Рефлексия Cпокойно реагировать на то, что люди говорят. Скорее всего, они учитывают только собственный контекст, когда что-то пытаются доказать. Это нормально. Оценивайте полезность их точки зрения. Брать сложные задачи, чтобы развивать свои навыки и компетенции, даже когда недостаточно знаний/опыта (через такие задачи гораздо быстрее развиваются навыки). Главное отличить реально полезную сложную задачу, которая прокачает, от задачи, на которую ищут крайнего. Быть ответственным за профессиональное развитие. Не ждать пока тимлид решит, что изучать. Не стоит забывать, что слепое следование чужому плану заточит под задачи конкретной компании. Стоит обсуждать и встраивать свои интересы в план. Если этого не сделать - высокий риск получить "непереносимые" компетенции, что ударит по карьерным возможностям. Но и не стоит ударятся в крайности: изучать абсолютно всё подряд или пассивно ждать, пока выдадут план развития. Самоорганизация Способность предоставлять тот объем информации, который необходим для общения с людьми разного бекграунда. Решение конфликтов Достаточно уверенного чтения документации и статей, но для более перспективных вакансий разговорный/письменный навык становится обязательным. Искать единомышленников и присоединяться/создавать комьюнити для общения и передачи опыта. Чтобы быть конкурентоспособным, стоит изучать и наблюдать за новыми веяниями, а также уметь адаптироваться под них. Опытному разработчику стоит развивать навыки управления и общения с бизнесом для эффективного выполнения задач. Это легче делать, если развит эмоциональный интеллект. Для джуниора навык также полезен, чтобы лучше взаимодействовать с коллегами. Базовые операции Арифметические операции Циклы for/while Логические операции Битовые операции Функции lambda Операторы Типы данных Динамическая типизация Статическая типизация RTTI Указатели и ссылки Организация кодовой базы Ссылки Модель памяти Умные указатели Сырые Указатели Разделение кода на headers/cpp юниты Область видимости Утечки памяти Forward declaration unique_ptr shared_ptr Время жизни Операторы new/delete weak_ptr Пространство имён Перегрузка стандартных операторов для различных типов/структур/классов. Чтобы избежать проблем с управлением памятью, старайтесь писать код используя ссылки и умные указатели. Структуры и классы Обработка ошибок Перегрузка методов Таблица вирутальных методов ООП Исключения Access violation Динамический полиморфизм Виртуальные методы Правило нуля/трех/пяти Статический полиморфизм Множественное наследование Ромбовидное наследование Коды возврата Не используйте множественное наследование auto (автоматическое выведение типов) Концепции языка type casting static_cast const_cast dynamic_cast reinterpret_cast Неопределённое поведение (Undefined Behavior) Поиск, зависящий от аргумента (ADL) Макросы Name mangling Стандартная библиотека + STL Поток ввода/вывода Алгоритмы стандартной библиотеки Итераторы Контейнеры Дата/время Многопоточность Языковые конструкции для которых отсутствуют прописанные требования в стандартах. В случае ошибки дальнейшее поведение будет предсказать невозможно, и всецело будет зависеть от контекста выполнения или платформы, где запущено приложение. Шаблоны Variadic templates Специализация шаблона type traits SFINAE Полная специализация Частичная специализация RAII pimpl Erase-Remove Non-Copyable/Non-Moveable Copy and swap Copy on write CRTP Стандарты C++11/14 C++17 C++20 newest C++0x Идиомы Работа с исходным кодом Текстовый редактор IDE Редакторы исходного кода Отладчик Линтеры Знание о базовых возможностях (shortcuts, tools, plugins) Умение читать сообщения отладчика Отладочные символы WinDbg GDB Выберите один из понравившихся популярных IDE и хорошо освойте его: Eclipse, MS Visual Studio, Qt Creator, JetBrains Clion, XCode и т.д. Научитесь пользоваться отладчиком. Изучите его возможности. Выберите один из популярных редакторов и хорошо освойте его. К примеру: Notepad++, Atom, и т.д. Навык работы с отладчиком через командную строку - узконаправленный навык. В регулярной работе достаточно уметь работать с отладчиком в рамках IDE. Ознакомьтесь с самыми распространёнными ошибками (segfault, out of memory, access violation) и концепцией неопределённого поведения (undefined behavior) Выберите один из популярных редакторов и и хорошо освойте его: Visual Code, Atom, Sublime Text и т.д. Компиляторы Базовые знания работы компиляторов Компиляция кода в объектные файлы Компоновка объектных файлов в приложение (линковка) Этапы работы компилятора Особенности работы конкретного компилятора У компиляторов есть свои особенности, о которых хорошо бы знать: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGW Есть несколько этапов работы компилятора, о которых следует знать. Это помогает решать проблемы при сборке приложения. Достаточно иметь базовое понимание, чтобы решать большую часть проблем. Детали работы важны разработчикам компиляторов. Системы сборки CMake Makefile ninja Пакетные менеджеры vcpkg spack Conan nuget Популярные библиотеки boost opencv poco Подключение библиотек protobuf gRPC fmt pybindll spdlog ranges_v3 tensorflow opencl Фреймворки gtest/gmock Qt catch2 google profiler pytorch c++ Лицензирование Взаимодействие с библиотеками Внимательно читайте условия лицензионного соглашения. Ваш проект должен их соблюдать. Информатика Структуры данных Алгоритмы Булева алгебра Конечные автоматы Также необходимо понимать, как вычислить сложность и потребление памяти у алгоритмов. Системы контроля версий Распределенные Централизованные SVN git Mercurial Практики разработки Качество кода Правила оформления кода Принципы разработки KISS (Keep It Simple, Stupid) DRY (Don't Repeat Yourself) YAGNI (You Aren't Gonna Need It) APO (Avoid Premature Optimization) BDUF (Big Design Up Front) Композиция предпочтительнее наследования Бритва Оккама Разделяй и властвуй Логирование и телеметрия Ревью кода Умение читать чужой код Ревью чужого кода Понимание жизненного цикла производства ПО Реализация Тестирование Поддержка Версионирование ПО Юнит тесты Интеграционное Функциональное Производительность Формирование архитектуры и дизайн компонентов Интеграция компонентов Выпуск Сбор требований Окончание жизненного цикла Анализаторы кода Статические Динамические Профайлеры C++ core guidelines Промышленные стандарты MISRA Autosar Работа с командной строкой batch Powershell bash CI/CD Trunk Based Development Zero downtime deployment Создание пакета поставки ПО Документация Инсталлятор Использование других языков программирования Межязыковое взаимодействие Правила именования переменных, пробелы vs табы, положение фигурных скобок и т.д. Настроить форматирование и автоматически проверять в одной из утилит: clang-format, Resharper - стиль кода, MSVS - стиль кода. - Скриптовые - Функциональные - SQL like - NoSQL Иногда требуется предоставить обертку к библиотеке, написанной на C++ для другого ЯП, например Python или C#. Для этого применяют специальные библиотеки/фреймворки. Обратная совместимость Не игнорируйте предупреждения компилятора и статического анализатора. Они вам друзья, а не враги Microsoft GSL Проектирование ПО Архитектурные стили Component-based Monolithic application Layered Client-server Microservices architecture Event-driven Plug-ins REST Service-oriented architecture Паттерны проектирования (GoF) Поведенческие Структурные Порождающие ООП SOLID UML Архитектурные паттерны MVC MVVM Three-tier Onion Hexagon Методологии Test Driven Development Behavior Driven Development Domain Driven Design Память Абстракции памяти Выравнивание памяти Управление памятью Бинарные единицы Исполняемый файл Статическая библиотека Динамическая библиотека Стек Глобальная память Куча Память приложения Виртуальная память Операционные системы Многопоточность Ошибки Dead lock Race condition Live lock Starvation Потоки Конкуренция Мьютексы Семафоры Алгоритмы без блокировок (lock-free) Обработка событий Синхронные Асинхронные Процессы Межпроцессное взаимодействие Shared memory Pipes Сериализация json XML Сетевой стек TCP/IP OSI Сокеты HTTP TCP UDP Файловая система Планировщик Виртуализация VirtualBox VMware Workstation Контейнеризация Hyper-V Docker Облачные сервисы Kubernetes Безопасность Шифрование Многопроцессорные системы Multicore CPU NUMA Ввод и вывод информации Драйверы Аудио Графическое вычисление/отображение Печать DirectSound OpenAL DirectX Vulkan OpenGL CUDA Общие навыки Языковые инструменты Синтаксис языка C++ Developer Roadmap О карте: С++ всё ещё является одним из самых популярных языков разработки. Есть немало желающих начать его изучать и стать C++ разработчиками. Перед такими людьми встают вопросы: "С чего мне начать? Что и в каком порядке мне изучать? Какие книги стоить почитать?" Мы попытались ответить на эти вопросы в представленной дорожной карте. Карта акцентируется на общих компетенциях и навыках, которые встречаются в большинстве проектов. Она призвана помочь тем, кто только начинает свое обучение или имеет небольшой опыт. Изучив набор перечисленных материалов, вы сможете составить более продуктивный план обучения, не отвлекаясь на побочную информацию. Это поможет вам освоить C++ на том уровне, который встречается во многих коммерческих проектах. Как ориентироваться: Если у вас есть замечания, вопросы или предложения, будем рады получить любую помощь и поддержку. Мы открыты для общения :) Для этого используйте следующие механизмы Github: - Предложения/правки по репозиторию - создавайте и присылайте новый PR в Pull Requests Предложения и замечания: Optional Junior Middle Senior Мидл способен создать дизайн и решения для функционала внутри компонента/приложения даже в случае неполноты требований. Синиор способен создать дизайн и решение для компонента/приложения с учётом бизнес-контекста. Джуниору важно научиться писать структурированный код и не усложнять его без надобности. Код должен быть легко читаемым и поддерживаемым. От джуниора ожидается осведомленность про категории, которые относятся к Middle/Senior. Будет достаточным поверхностное понимание темы. На карте представлены компетенции, которые выделены в "этапы". Мы считаем, что джуниору стоит начинать изучение в данном порядке, чтобы выстроить прочный фундамент. Репозиторий: https://github.com/salmer/CppDeveloperRoadmap
\ No newline at end of file