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步骤 2C++ 开发者软性技能硬性技能一开始,有些技能看似没有办法习得或提升。然而,在我们看来,这里所列的每一项技能,都是可以通过练习得以提升的。每个人的学习目的不同,最终成效取决于您个人的愿望和努力 :)学习能力管理错误思考责任资源管理交流沟通团队协作情绪智力(情商)理解开发背景以客户为中心技术发展趋势共情专注思想开明适应性抗压能力在不确定性中工作理解团队内的角色分工支持帮助团队成员在分布式团队中工作提供意见反馈领导力启导、指导他人委派工作向员工分配和明确任务计划并制订目标协商英文能力演讲演示书面沟通技巧社交倾听说服团队内部交流创意和想法的能力寻求妥协解决争议向团队以外的人员提供信息的能力时间管理管理优先级作决定盲打多重任务同时进行纪律坚持主动性独立解决问题逻辑性批判性创意性策略系统性接受批评出现错误及时通知承认您的错误分析错误提出正确的问题实验实操知识管理信息处理收集、分析、评估信息,并据此做出决策的能力。反思冷静地回应他人的评论。很有可能他人所说的话、试图证明的事情,仅仅基于他们自己的角度,这是可以理解的。请客观地评估他人观点的有用性。主动承担具有挑战性的任务,以发展您的技能和能力,即便此刻您还不具备完全足够的知识或经验(您的技能将会通过此类任务得到快速发展)。关键是要能够区分出:哪些是真正有助于您提升技能的复杂任务,而哪些又是仅仅需要替罪羊的愚蠢的任务。您应该对自己的职业发展负责。 不要等待团队领导来决定您要学习什么。请不要忘记,盲目遵循他人安排的计划,只会让您提高某些适用于某特定公司的技能。最好商讨如何将您的个人利益和兴趣也纳入计划之中, 否则的话,就很有可能将时间花在不相关的技能上,从而影响职业机会。不过切记不要太极端:别不加选择地什么都学,也不要什么都拒绝直到有一个完美的量身定制的学习计划出现。自组织(Self-organization)有能力根据各方人员不同的背景,而提供适量、适当的信息,以促进有效的沟通交流。解决冲突如果您阅读本路线图,您大概率已经注意到英文能力有多重要:)通常,您至少需要具备英文阅读能力,因为您要能够读懂技术文档。不过,随着您在职业阶梯上的步步晋升,您将同时需要更加自信地用英文说和写。寻找志同道合的人,并加入或创建相关社区,以进行经验交流。您应当研究和观察当代发展趋势,以保持自己的竞争力, 并适应变化。经验丰富的开发人员应该培养管理技能和业务沟通技能,以高效地完成任务。 如果您有较好的情商,那这就相对更容易做到。 对于初级开发人员来说,共情能力在与同事互动中也是非常有用的。基本运算算术运算循环: for/while逻辑运算位运算函数Lambda表达式运算符数据类型动态类型静态类型RTTI(运行时类型识别)指针&引用代码库结构化引用内存模型智能指针(smart pointer)原始指针代码拆分为 headers/cpp 文件作用域(Scope)内存泄漏前向声明unique_ptrshared_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/14C++17C++20最新版本C++0x惯常用法/设计习语(Idioms)使用源代码文本编辑器集成开发环境(IDE)代码编辑器调试器(Debugger)Linters熟悉编辑器的特性和功能范畴(快捷键、工具、插件)理解调试器所反馈出的信息调试符号(Debugging symbols)WinDbgGDB选择一款广受欢迎的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)CMakeMakefileninja包管理器(Package managers)vcpkgspackConannuget库(Library)boostopencvpoco引用库(Libraries inclusion)protobufgRPCfmtpybindllspdlogranges_v3tensorflowopencl框架(Frameworks)gtest/gmockQtcatch2google profilerpytorch c++使用程序库软件授权许可(Licensing)计算机科学数据结构算法布尔代数(Boolean algebra)有限状态机(Finite-state machines)了解如何计算算法复杂度,和如何计算内存消耗也很有好处。版本控制软件(Version Control)分布式集中式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) 前期大型设计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)ProfilersC++ 核心指南行业标准MISRAAutosar命令行batchPowershellbashCI/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-insREST面向服务的架构 Service-oriented architecture设计模式 Design Patters (GoF)行为模式(Behavioral)结构模式(Structural)创建模式(Creational)面向对象编程 (OOP)SOLIDUML架构模式MVC 模型-视图-控制器模式MVVMThree-tier 三层架构OnionHexagon开发方法论测试驱动开发(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)jsonXML网络(Network)TCP/IPOSISocketsHTTPTCPUDP文件系统(File system)任务调度(Task scheduler)虚拟化(Virtualization)VirtualBoxVMware Workstation容器(Containers)Hyper-VDocker云服务(Cloud Services)Kubernetes程序安全加密MultiCPU systemsMulticore CPUNUMA输入/输出(Input/output)驱动程序(Drivers)音频(Audio)显卡(Graphics)打印机/打印 Printers (printing)DirectSoundOpenALDirectXVulkanOpenGLCUDA通用技能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步骤 2C++ 开发者软性技能硬性技能一开始,有些技能看似没有办法习得或提升。然而,在我们看来,这里所列的每一项技能,都是可以通过练习得以提升的。每个人的学习目的不同,最终成效取决于您个人的愿望和努力 :)学习能力管理错误思考责任资源管理交流沟通团队协作情绪智力(情商)理解开发背景以客户为中心技术发展趋势共情专注思想开明适应性抗压能力在不确定性中工作理解团队内的角色分工支持帮助团队成员在分布式团队中工作提供意见反馈领导力启导、指导他人委派工作向员工分配和明确任务计划并制订目标协商英文能力演讲演示书面沟通技巧社交倾听说服团队内部交流创意和想法的能力寻求妥协解决争议向团队以外的人员提供信息的能力时间管理管理优先级作决定盲打多重任务同时进行纪律坚持主动性独立解决问题逻辑性批判性创意性策略系统性接受批评出现错误及时通知承认您的错误分析错误提出正确的问题实验实操知识管理信息处理收集、分析、评估信息,并据此做出决策的能力。反思冷静地回应他人的评论。很有可能他人所说的话、试图证明的事情,仅仅基于他们自己的角度,这是可以理解的。请客观地评估他人观点的有用性。主动承担具有挑战性的任务,以发展您的技能和能力,即便此刻您还不具备完全足够的知识或经验(您的技能将会通过此类任务得到快速发展)。关键是要能够区分出:哪些是真正有助于您提升技能的复杂任务,而哪些又是仅仅需要替罪羊的愚蠢的任务。您应该对自己的职业发展负责。 不要等待团队领导来决定您要学习什么。请不要忘记,盲目遵循他人安排的计划,只会让您提高某些适用于某特定公司的技能。最好商讨如何将您的个人利益和兴趣也纳入计划之中, 否则的话,就很有可能将时间花在不相关的技能上,从而影响职业机会。不过切记不要太极端:别不加选择地什么都学,也不要什么都拒绝直到有一个完美的量身定制的学习计划出现。自组织(Self-organization)有能力根据各方人员不同的背景,而提供适量、适当的信息,以促进有效的沟通交流。解决冲突如果您阅读本路线图,您大概率已经注意到英文能力有多重要:)通常,您至少需要具备英文阅读能力,因为您要能够读懂技术文档。不过,随着您在职业阶梯上的步步晋升,您将同时需要更加自信地用英文说和写。寻找志同道合的人,并加入或创建相关社区,以进行经验交流。您应当研究和观察当代发展趋势,以保持自己的竞争力, 并适应变化。经验丰富的开发人员应该培养管理技能和业务沟通技能,以高效地完成任务。 如果您有较好的情商,那这就相对更容易做到。 对于初级开发人员来说,共情能力在与同事互动中也是非常有用的。基本运算算术运算循环: for/while逻辑运算位运算函数Lambda表达式运算符数据类型动态类型静态类型RTTI(运行时类型识别)指针&引用代码库结构化引用内存模型智能指针(smart pointer)原始指针代码拆分为 headers/cpp 文件作用域(Scope)内存泄漏前向声明unique_ptrshared_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/14C++17C++20最新版本C++0x惯常用法/设计习语(Idioms)使用源代码文本编辑器集成开发环境(IDE)代码编辑器调试器(Debugger)Linters熟悉编辑器的特性和功能范畴(快捷键、工具、插件)理解调试器所反馈出的信息调试符号(Debugging symbols)WinDbgGDB选择一款广受欢迎的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)CMakeMakefileninja包管理器(Package managers)vcpkgspackConannuget库(Library)boostopencvpoco引用库(Libraries inclusion)protobufgRPCfmtpybindllspdlogranges_v3tensorflowopencl框架(Frameworks)gtest/gmockQtcatch2google profilerpytorch c++使用程序库软件授权许可(Licensing)计算机科学数据结构算法布尔代数(Boolean algebra)有限状态机(Finite-state machines)了解如何计算算法复杂度,和如何计算内存消耗也很有好处。版本控制软件(Version Control)分布式集中式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) 前期大型设计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)ProfilersC++ 核心指南行业标准MISRAAutosar命令行batchPowershellbashCI/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-insREST面向服务的架构 Service-oriented architecture设计模式 Design Patters (GoF)行为模式(Behavioral)结构模式(Structural)创建模式(Creational)面向对象编程 (OOP)SOLIDUML架构模式MVC 模型-视图-控制器模式MVVMThree-tier 三层架构OnionHexagon开发方法论测试驱动开发(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)jsonXML网络(Network)TCP/IPOSISocketsHTTPTCPUDP文件系统(File system)任务调度(Task scheduler)虚拟化(Virtualization)VirtualBoxVMware Workstation容器(Containers)Hyper-VDocker云服务(Cloud Services)Kubernetes程序安全加密MultiCPU systemsMulticore CPUNUMA输入/输出(Input/output)驱动程序(Drivers)音频(Audio)显卡(Graphics)打印机/打印 Printers (printing)DirectSoundOpenALDirectXVulkanOpenGLCUDA通用技能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 step2 step3 step4 step1 step3 step5 step1 step4 step2 stepC++ developerSoft skillsHard skillsAt 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 learnManage mistakesThinkingResponsibilityManage resourcesCommunicationTeam workEmotional intelligenceUnderstanding the development contextCustomer focusTechnologyTrendsEmpathyConcentrationOpen-mindednessAdaptabilityStress resistanceWorking in uncertaintyUnderstanding the distribution of roles in a teamSupport team membersWork in a distributed teamProviding feedbackLeadershipMentoringDelegationAssigning and clarifying tasks to employeesPlanning and goal settingNegotiationEnglishPresentationWritten communication skillNetworkingAbility to listenPersuasionAbility to communicate ideas and thoughts within the teamFinding compromisesDispute resolutionProviding information to people outside the teamTime managementPrioritizationTaking decisionsBlind typingMultitaskingDisciplinePersistenceInitiativeIndependenceProblem solvingLogicalCriticalCreativeStrategicSystemsAccept criticismNotify about mistakes in timeAdmitting your mistakesAnalyze mistakesAsk the right questionsExperimentingManage knowledgeProcess informationAbility to gather, analyze, evaluate information and make decisions based on it.ReflectionCalmly 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-organizationThe ability to provide the amount of information that is necessary to communicate to people with different backgrounds.Conflict solvingIf 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 operationsArithmetic operationsLoops: for/whileLogical operationsBitwise operationsFunctionslambdaOperatorsData typesDynamic typingStatic typingRTTIPointers & ReferencesCodebase structuringReferencesMemory modelSmart pointerRaw pointersCode splitting into headers/cpp filesScopeMemory leakageForward declarationunique_ptrshared_ptrLifetime of objectsnew/delete operatorsweak_ptrNamespacesThe 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 classesException handlingOverloading of functionsVirtual table (vtbl)Object Oriented programming (OOP)ExceptionsAccess violationDynamic polymorphismVirtual methodsThe rule of zero/three/fiveStatic polymorphismMultiple inheritanceDiamond inheritanceError codesIt's preferred to avoid multiple inheritance (excepting abstract classes) to prevent runtime issuesauto (automatic type deduction)Language conceptstype castingstatic_castconst_castdynamic_castreinterpret_castUndefined Behavior (UB)Argument-dependent lookup (ADL)MacrosName manglingStandard library + STLiostreamAlgorithmsIteratorsContainersDate/timeMultithreadingSome 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.TemplatesVariadic templatesThe template specializationtype traitsSFINAEThe full template specializationThe partial template specializationRAIIpimplErase-RemoveNon-Copyable/Non-MoveableCopy and swapCopy on writeCRTPStandardsC++11/14C++17C++20newestC++0xIdiomsWorking with source codeText editorsIDECode editorsDebuggerLintersKnowledge of features and abilities (shortcuts, tools, plugins)Understanding of debugger messagesDebugging symbolsWinDbgGDBChoose 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 featuresChoose 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.CompilersBasic understanding of compilers stagesCompilation of sources to object files (compilation)The object files linkage (linking)Working stages of compilersFeatures of a particular compilerEach compiler has its nuances. It's good to know about them to prevent getting any trap: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGWThe 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 systemsCMakeMakefileninjaPackage managersvcpkgspackConannugetLibrariesboostopencvpocoLibraries inclusionprotobufgRPCfmtpybindllspdlogranges_v3tensorflowopenclFrameworksgtest/gmockQtcatch2google profilerpytorch c++Working with librariesLicensingComputers ScienceData structuresAlgorithmsBoolean algebraFinite-state machinesIt's also good to know how to calculate algorithm complexity and memory consumption.Version control softwareDistributedCentralizedSVNgitMercurialBest practicesCode qualityCode guidelinesPrinciples of developmentKISS (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 inheritanceOccam's razorDivide and ConquerLogging and telemetryCode reviewSkill to read existing code sourcesSkill to review codeLifecycle stages of a softwareImplementationTestingMaintananceVersioningUnit testsIntegration testsFunctional testsPerformance testsSoftware architecture and components designComponents integrationDeploymentCollecting requirementsEnd of a software lifecycleCode analyzersStatic analyzersDynamic analyzersProfilersC++ core guidelinesIndustrial standardsMISRAAutosarCommand linebatchPowershellbashCI/CDTrunk Based DevelopmentZero downtime deploymentCreation of a software deployment packageDocumentationInstaller packageUsage of other programming languagesLanguage interoperabilityNaming 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- NoSQLSometimes 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 compatibilityDo not ignore warnings from compiler and static analyzer. They are your friends, not enemiesMicrosoft GSLSoftware designArchitecture stylesComponent-basedMonolithic applicationLayeredClient-serverMicroservices architectureEvent-drivenPlug-insRESTService-oriented architectureDesign Patters (GoF)BehavioralStructuralCreationalOOPSOLIDUMLArchitecture patternsMVCMVVMThree-tierOnionHexagonMethodologies of developmentTest Driven DevelopmentBehavior Driven DevelopmentDomain Driven DesignMemoryMemory abstractionsMemory alignmentMemory managementBinary unitsExecutable fileStatic libraryDynamic libraryStackGlobal memoryHeapApplication memoryVirtual memoryOperating systemsMultithreadingErrorsDead lockRace conditionLive lockStarvationThreadsConcurrencyMutexesSemaphoreslock-freeEvent handlingSyncAsyncProcessInterprocess communicationShared memoryPipesSerializationjsonXMLNetworkTCP/IPOSISocketsHTTPTCPUDPFile systemTask schedulerVirtualizationVirtualBoxVMware WorkstationContainersHyper-VDockerCloud ServicesKubernetesSecurityEncryptionMultiCPU systemsMulticore CPUNUMAInput/outputDriversAudioGraphicsPrinters (printing)DirectSoundOpenALDirectXVulkanOpenGLCUDACommon skillsLanguage toolsLanguage syntaxC++ Developer RoadmapAbout: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 oneFeedback:OptionalJuniorMiddleSeniorThe 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/CppDeveloperRoadmapCarefully read the terms of the license agreement.Your project must comply with them. \ No newline at end of file +1 step2 step3 step4 step1 step3 step5 step1 step4 step2 stepC++ developerSoft skillsHard skillsAt 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 learnManage mistakesThinkingResponsibilityManage resourcesCommunicationTeam workEmotional intelligenceUnderstanding the development contextCustomer focusTechnologyTrendsEmpathyConcentrationOpen-mindednessAdaptabilityStress resistanceWorking in uncertaintyUnderstanding the distribution of roles in a teamSupport team membersWork in a distributed teamProviding feedbackLeadershipMentoringDelegationAssigning and clarifying tasks to employeesPlanning and goal settingNegotiationEnglishPresentationWritten communication skillNetworkingAbility to listenPersuasionAbility to communicate ideas and thoughts within the teamFinding compromisesDispute resolutionProviding information to people outside the teamTime managementPrioritizationTaking decisionsBlind typingMultitaskingDisciplinePersistenceInitiativeIndependenceProblem solvingLogicalCriticalCreativeStrategicSystemsAccept criticismNotify about mistakes in timeAdmitting your mistakesAnalyze mistakesAsk the right questionsExperimentingManage knowledgeProcess informationAbility to gather, analyze, evaluate information and make decisions based on it.ReflectionCalmly 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-organizationThe ability to provide the amount of information that is necessary to communicate to people with different backgrounds.Conflict solvingIf 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 operationsArithmetic operationsLoops: for/whileLogical operationsBitwise operationsFunctionslambdaOperatorsData typesDynamic typingStatic typingRTTIPointers & ReferencesCodebase structuringReferencesMemory modelSmart pointerRaw pointersCode splitting into headers/cpp filesScopeMemory leakageForward declarationunique_ptrshared_ptrLifetime of objectsnew/delete operatorsweak_ptrNamespacesThe 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 classesException handlingOverloading of functionsVirtual table (vtbl)Object Oriented programming (OOP)ExceptionsAccess violationDynamic polymorphismVirtual methodsThe rule of zero/three/fiveStatic polymorphismMultiple inheritanceDiamond inheritanceError codesIt's preferred to avoid multiple inheritance (excepting abstract classes) to prevent runtime issuesauto (automatic type deduction)Language conceptstype castingstatic_castconst_castdynamic_castreinterpret_castUndefined Behavior (UB)Argument-dependent lookup (ADL)MacrosName manglingStandard library + STLiostreamAlgorithmsIteratorsContainersDate/timeMultithreadingSome 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.TemplatesVariadic templatesThe template specializationtype traitsSFINAEThe full template specializationThe partial template specializationRAIIpimplErase-RemoveNon-Copyable/Non-MoveableCopy and swapCopy on writeCRTPStandardsC++11/14C++17C++20newestC++0xIdiomsWorking with source codeText editorsIDECode editorsDebuggerLintersKnowledge of features and abilities (shortcuts, tools, plugins)Understanding of debugger messagesDebugging symbolsWinDbgGDBChoose 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 featuresChoose 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.CompilersBasic understanding of compilers stagesCompilation of sources to object files (compilation)The object files linkage (linking)Working stages of compilersFeatures of a particular compilerEach compiler has its nuances. It's good to know about them to prevent getting any trap: Clang++/LLVM, Intel C++, MSVS C++, GCC, MinGWThe 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 systemsCMakeMakefileninjaPackage managersvcpkgspackConannugetLibrariesboostopencvpocoLibraries inclusionprotobufgRPCfmtpybindllspdlogranges_v3tensorflowopenclFrameworksgtest/gmockQtcatch2google profilerpytorch c++Working with librariesLicensingComputers ScienceData structuresAlgorithmsBoolean algebraFinite-state machinesIt's also good to know how to calculate algorithm complexity and memory consumption.Version control softwareDistributedCentralizedSVNgitMercurialBest practicesCode qualityCode guidelinesPrinciples of developmentKISS (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 inheritanceOccam's razorDivide and ConquerLogging and telemetryCode reviewSkill to read existing code sourcesSkill to review codeLifecycle stages of a softwareImplementationTestingMaintananceVersioningUnit testsIntegration testsFunctional testsPerformance testsSoftware architecture and components designComponents integrationDeploymentCollecting requirementsEnd of a software lifecycleCode analyzersStatic analyzersDynamic analyzersProfilersC++ core guidelinesIndustrial standardsMISRAAutosarCommand linebatchPowershellbashCI/CDTrunk Based DevelopmentZero downtime deploymentCreation of a software deployment packageDocumentationInstaller packageUsage of other programming languagesLanguage interoperabilityNaming 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- NoSQLSometimes 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 compatibilityDo not ignore warnings from compiler and static analyzer. They are your friends, not enemiesMicrosoft GSLSoftware designArchitecture stylesComponent-basedMonolithic applicationLayeredClient-serverMicroservices architectureEvent-drivenPlug-insRESTService-oriented architectureDesign Patters (GoF)BehavioralStructuralCreationalOOPSOLIDUMLArchitecture patternsMVCMVVMThree-tierOnionHexagonMethodologies of developmentTest Driven DevelopmentBehavior Driven DevelopmentDomain Driven DesignMemoryMemory abstractionsMemory alignmentMemory managementBinary unitsExecutable fileStatic libraryDynamic libraryStackGlobal memoryHeapApplication memoryVirtual memoryOperating systemsMultithreadingErrorsDead lockRace conditionLive lockStarvationThreadsConcurrencyMutexesSemaphoreslock-freeEvent handlingSyncAsyncProcessInterprocess communicationShared memoryPipesSerializationjsonXMLNetworkTCP/IPOSISocketsHTTPTCPUDPFile systemTask schedulerVirtualizationVirtualBoxVMware WorkstationContainersHyper-VDockerCloud ServicesKubernetesSecurityEncryptionMultiCPU systemsMulticore CPUNUMAInput/outputDriversAudioGraphicsPrinters (printing)DirectSoundOpenALDirectXVulkanOpenGLCUDACommon skillsLanguage toolsLanguage syntaxC++ Developer RoadmapAbout: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 oneFeedback:OptionalJuniorMiddleSeniorThe 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/CppDeveloperRoadmapCarefully 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++ 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Сначала может показаться, что некоторые из навыков развивать невозможно. Однако мы считаем иначе. Над каждым из пунктов возможно работать. Всё упирается в желание и внутренние блоки. Всё индивидуально, и зависит от вас. :)Умение учитьсяРабота с ошибкамиМышлениеОтветственностьУправление ресурсамиКоммуникацияКомандная работаЭмоциональный интелектПонимание контекста разработкиКлиентоориентированностьТехнологииТрендыЭмпатияКонцентрацияОткрытость новомуАдаптируемостьСтрессоустойчивостьРабота в неопределённостиПонимание распределения ролей в командеПомощьРабота в распределённой командеПредоставление обратной связиЛидерствоНаставничествоДелегированиеПостановка задач сотрудникамПланирование и целеполаганиеПереговорческие навыкиАнглийский языкПрезентацияНавык перепискиНетворкингУмение слушатьУбеждениеУмение доносить мысль/идеи внутри командыПоиск компромиссовРегулирование споровПодача информации людям вне командыТайм-менеджментПриоритизацияПринятие решенийСлепая печатьМногозадачностьДисциплинаУпорствоИнициативностьСамостоятельностьРешение проблемЛогическоеКритическоеКреативноеСтратегическоеСистемноеВосприятие критикиСвоевременное сигнализирование об ошибкахПризнание своих ошибокАнализ ошибокУмение задавать правильные вопросыЭкспериментированиеУправление знаниямиРабота с информациейУмение собирать информацию, анализировать её и выдавать взвешенное  решение.Рефлексия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