C++ 开发者 软性技能 硬性技能 一开始,有些技能看似没有 办法习得或提升。然而,在 我们看来,这里所列的每一 项技能,都是可以通过练习 得以提升的。每个人的学习 目的不同,最终成效取决于 您个人的愿望和努力 :) 学习能力 管理错误 思考 责任 资源管理 交流沟通 团队协作 情绪智力(情商) 理解开发背景 以客户为中心 技术 发展趋势 共情 专注 思想开明 适应性 抗压能力 在不确定性中工作 理解团队内的角色分工 支持帮助团队成员 在分布式团队中工作 提供意见反馈 领导力 启导、指导他人 委派工作 向员工分配和明确任务 计划并制订目标 协商 英文能力 演讲演示 书面沟通技巧 社交 倾听 说服 团队内部交流创意和想法的能力 寻求妥协 解决争议 向团队以外的人员提供信息的能力 时间管理 管理优先级 作决定 盲打 多重任务同时进行 纪律 坚持 主动性 独立 解决问题 逻辑性 批判性 创意性 策略 系统性 接受批评 出现错误及时通知 承认您的错误 分析错误 提出正确的问题 实验实操 知识管理 信息处理 收集、分析、评估信息,并据此做出决 策的能力。 反思 冷静地回应他人的评论。很有 可能他人所说的话、试图证明 的事情,仅仅基于他们自己的 角度,这是可以理解的。请客 观地评估他人观点的有用性。 主动承担具有挑战性的任务,以发展您的技 能和能力,即便此刻您还不具备完全足够的 知识或经验(您的技能将会通过此类任务得 到快速发展)。关键是要能够区分出:哪些 是真正有助于您提升技能的复杂任务,而哪 些又是仅仅需要替罪羊的愚蠢的任务。 您应该对自己的职业发展负责。 不要等待团队领导来决定您要学习什么。请不要忘记,盲 目遵循他人安排的计划,只会让您提高某些适用于某特定 公司的技能。 最好商讨如何将您的个人利益和兴趣也纳入计划之中, 否则的话,就很有可能将时间花在不相关的技能上,从而 影响职业机会。不过切记不要太极端:别不加选择地什么 都学,也不要什么都拒绝直到有一个完美的量身定制的学 习计划出现。 自组织(Self- organization) 有能力根据各方人员不 同的背景,而提供适量 、适当的信息,以促进 有效的沟通交流。 解决冲突 如果您阅读本路线图,您大概率已经注 意到英文能力有多重要:) 通常,您至少需要具备英文阅读能力, 因为您要能够读懂技术文档。不过,随 着您在职业阶梯上的步步晋升,您将同 时需要更加自信地用英文说和写。 寻找志同道合的人,并 加入或创建相关社区, 以进行经验交流。 您应当研究和观察当代发展趋势,以保 持自己的竞争力, 并适应变化。 经验丰富的开发人员应该培养管理技能 和业务沟通技能,以高效地完成任务。 如果您有较好的情商,那这就相对更容 易做到。 对于初级开发人员来说,共情能力在与 同事互动中也是非常有用的。 步骤 1 Folder 1 基本运算 算术运算 循环: for/while 逻辑运算 位运算 函数 Lambda表达式 运算符 数据类型 动态类型 静态类型 RTTI(运行时类型识别) 指针&引用 代码库结构化 引用 内存模型 智能指针(smart pointer) 原始指针 代码拆分为 headers/cpp 文件 作用域(Scope) 内存泄漏 前向声明 unique_ptr shared_ptr 对象生命周期 new/delete 运算符 weak_ptr 命名空间(Namespace) 常规或自定义类型 (结构/类)的常规运 算符的重载。 为防止内存泄漏 问题,最好使用 智能指针而不是 原始指针。 步骤 2 Folder 2 结构体(Struct)和类(class) 异常处理 函数重载 虚函数表(Virtual table, vtbl) 面向对象编程 (OOP) 异常(Exceptions) 非法访问(Access violation) 动态多态(Dynamic polymorphism) 虚函数(Virtual methods) 三/五/零法则 静态多态(Static polymorphism) 多重继承(Multiple inheritance) 钻石继承(Diamond inheritance) 错误码(Error codes) 代码中最好避免 出现多重继承 (抽象类除外), 以防止运行时出 现问题 步骤 3 Folder 3 自动类型推导 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 标准,某些语言结构具有未定义行为。 如果出现任何错误,则无法预测程序进 一步的行为,因为程序此后的行为取决 于平台环境、运行时的上下文具体内容等。 步骤 4 Folder 4 模板(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) 步骤 1 Folder 5 使用源代码 文本编辑器 集成开发环境(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 等等。 步骤 3 Folder 6 编译器(Compilers) 对编译过程的基本了解 将源代码编译为目标文件(compilation) 目标文件链接过程 (linking) 编译器的编译过程 特定编译器的特性 每个编译器之间有细微的差别。 最好对这些差别有所了解,以避免 陷入一些陷阱: Clang++/LLVM,Intel C++, MSVS C++,GCC,MinGW 编译器执行代码编译过程的数个阶段。 对所有这些阶段进行基本的了解将有助 于更好地理解编译中可能出现的问题。 不过,只有编译器创建者才需要深入了 解编译器知识。 步骤 5 Folder 7 构建系统(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) 步骤 1 Folder 8 计算机科学 数据结构 算法 布尔代数(Boolean algebra) 有限状态机(Finite-state machines) 了解如何计算算法复 杂度,和如何计算内 存消耗也很有好处。 步骤 4 Folder 9 版本控制软件(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 步骤 2 Folder 10 设计模式 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 仔细阅读许可协议的条款。 您的项目必须遵守这些条款, 才能使用这些库。