挨踢程序员(不秃版) 2022-07-11 09:14 采纳率: 60%
浏览 55
已结题

C/C++系统学习路线

这是七月份的编程排行榜,我开始学习C++了,有走C/C++后台开发领域的可以给出学习路线吗?
目前有C语言基础,看了侯捷面向对象高级编程,吸收不了

img

  • 写回答

2条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2022-07-11 09:36
    关注

    一、语言基础
    无论是C++开发还是Java开发,对于一个码农而言,最重要的就是对于编程语言的熟悉。同样,无论从事哪种类型的岗位,首当其冲的就是要掌握好语言基础。 C++是一门博大精深的编程语言,不仅拥有继承于C语言的过程化程序设计思想,还包含有面对对象(OOP)的设计理念。强大而又复杂。相对来说,C++的学习成本较高,语言里面的坑较多。语言基础的学习路线如下:

    1 语法基础
    重点掌握:(务必熟悉底层机制原理)

    指针和引用的概念
    指针与内存关系
    程序编译过程
    static、const、#define的用法和区别
    C和C++区别
    内存模型
    内存中的栈和堆分配
    2 面对对象基础
    (务必熟悉底层机制原理)

    面向对象理解
    析构函数
    构造函数
    拷贝构造
    多态
    纯虚函数和虚函数
    虚函数实现机制
    虚函数表
    访问限定符 public、private、protected
    继承原理、虚继承、菱形继承
    静态绑定和动态绑定
    new/delete和malloc/free
    重载、重写和隐藏
    3 语法进阶
    (务必熟悉底层机制原理)

    智能指针
    左值、右值引用和move语义
    类型转换方式
    常用的设计模式
    线程安全的单例模式
    内存溢出和内存泄漏
    C++11新特性
    静态链接库和动态链接库
    4 STL标准模板库
    (务必能进行源码剖析)

    迭代器、空间配置器理解
    常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap
    5 推荐书籍

    C++Primer》可作为工具书,随手查阅
    《EffectiveC++》深入了解C++的程序设计规范
    《STL源码剖析》剖析STL的源码底层,非常具有学习价值
    有精力还可以看《深度探索C++对象模型》《more EffecticeC++》
    二、算法与数据结构
    对于普通人而言,算法的学习最重要的是能够形成基本的算法思维,懂得从程序设计的角度对高重复性的操作做优化。这其中基本算法思想的掌握和常用数据结构的理解是必不可少。这方面的学习更倾向于多看多想多练。

    1 常见算法类型
    (务必能够手撕代码)

    排序算法(冒泡、插入、选择、快排、希尔、堆排、归并、桶排、基数、计数)、字符串操作、数组操作、递归、回溯、分治、动态规划等
    如何准备算法可微信搜索业余码农查看
    2 常用数据结构
    (务必熟悉底层原理和实现)

    链表、栈、队列、树(二叉树、平衡二叉树、红黑树、B树、B+树、哈夫曼树、字典树)、跳表、图
    3 推荐书籍

    《大话数据结构》适合入门学习
    《剑指offer》必刷66题
    《算法导论》尽量看,能啃完就是大神

    三、计算机网络
    网络相关的东西不是很多,关键在于对常见网络协议簇的认识和理解,以及一些常规操作底层设计实现的剖析。比如:
    | 输入http://www.baidu.com会发生什么
    | 微信扫描登录会发生什么

    1 重点掌握知识点

    OSI七层模型
    TCP/IP五层模型
    TCP/IP协议总结
    TCP、UDP区别
    TCP三次握手、四次挥手
    TCP状态转换
    TCP状态中TIME_WAIT
    TCP连接建立需要为什么不是两次握手
    TCP第三次握手失败会出现什么
    TCP长连接和短链接及优缺点
    TCP拥塞控制-慢启动、拥塞避免、快重传、快启动
    TCP如何保证可靠性传输
    TCP如何解决粘包、拆包问题
    TCP为什么可靠
    UDP如何实现TCP可靠传输
    IP地址和子网掩码
    ARP解析过程
    DNS原理
    HTTP状态码
    HTTP1.0、HTTP1.1、HTTP2.0区别
    HTTP和HTTPS区别
    HTTPS加密过程
    非对称加密和对称加密算法
    Nagle算法
    2 推荐书籍

    《计算机网络自顶向下方法》教材书,可放手边查阅
    《TCP/IP详解》重点了解TCP、IP、UDP协议实现
    四、数据库
    数据库的一般使用其实不难,但是对于不同数据库的特性、实现机制、应用场景和性能优化方面却能够难倒一大批面试者。同样数据库本身也是非常好的项目实例,往往能够从中学习到许多程序设计的思想和模式。因此,对数据库要明白怎么用、为什么用、怎么用得好这几个方面的问题。

    1 重点掌握

    数据库类别
    关系型数据库和非关系型数据库区别 MySQL:
    SQL常见语句
    MySQL内链接,外链接(左链接、右链接、全链接)
    MySQL索引类型和原理
    MySQL事务实现原理ACID
    MySQL数据存储引擎
    MySQL主从复制原理、作用和实现
    MySQL日记系统redo log、binlog、undo log
    MVCC实现原理
    Sql优化思路
    范式理论
    数据库高并发解决方法 Redis:
    Redis支持的数据类型
    Redis持久化
    Redis 架构模式
    主从复制
    一致性哈希算法
    2 推荐书籍

    《高性能 Mysql》能够加深对Mysql的理解和使用
    《Redis设计与实现》比较全面的书,可以多看看
    五、操作系统
    操作系统的问题会集中在进程和线程,但是这一类的问题往往会以开放题的形式出现。主要考察的是对操作系统组件以及运行过程的理解。比如:
    | 开机登录系统发生了什么?
    | 复制粘贴是怎样操作的?

    1 重点掌握

    物理内存和虚拟内存
    缓存IO和直接IO
    作业调度算法
    线程和进程
    进程和线程的调度
    线程的创建和结束
    线程状态
    线程间通信与线程同步机制
    互斥锁和信号量
    线程池
    消费者和生产者
    死锁
    并发和并行
    2 推荐书籍

    《深入理解计算机系统》很全面的书,这一本就够用了
    六、Linux系统
    对Linux系统的熟练使用是后台开发/服务器开发的必备技能点。这年头,不会几个Linux指令都不好意思说自己是敲代码的。(客户端和前端的同学表示不服)不管怎样,对于Linux系统的掌握无论在哪个方向上,都会有用武之地的。

    1 Linux系统操作和命令

    top命令
    ps命令
    netstat命令
    awk命令
    find命令
    grep命令
    wc命令
    sed命令
    head和tail命令
    正则表达式
    如何查找出现频率最高的100个IP地址
    linux如何统计文件中某个字符串出现的频率
    linux启动的第一个进程
    linux查看端口占用
    linux查看CPU和内存使用
    Linux查看系统负载命令
    Linux调试程序
    Linux硬链接和软连接
    core dump
    cmake和makefile
    Shell脚本基本语法和使用
    2 推荐书籍

    《鸟哥私房菜》入门足够了,多敲多写才能更快掌握
    七、Linux网络编程
    后台开发是离不开网络编程的,甚至简单来说,后台开发就是用厉害点的电脑去处理大规模的网络请求。所以作为一名合格的后端开发人员,对Linux网络编程的熟悉是必不可少的。

    1 重点掌握

    孤儿进程、僵尸进程和守护进程
    进程间通信方式signal、file、pipe、shm、sem、msg、socket
    线程同步机制线程:互斥量、锁机制、条件变量、信号量、读写锁
    fork返回值
    五大IO模型:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O、异步I/O
    IO复用机制
    epoll与select/poll
    LT水平触发和ET边缘触发
    Reactor和Proactor模式
    反向代理、负载均衡
    2 推荐书籍

    《UNIX环境高级编程》APUE 比较难啃,可以挑着看
    《Unix网络编程》UNP 同样比较难啃,可以挑着看
    《Linux多线程服务器端编程》Muduo网络库,推荐看看源码实现
    《深入理解Nginx》深入了解基于C的web服务器实现
    八、项目准备
    如果以上的东西你都已经准备好了,那么相信你已经了具备C++后台开发能力。但是要记得,一个大型线上项目的开发,从来都不纯粹是单一语言的设计和实现。

    因此用C++或者用Java或者用Golang或者用Python的区别或许没那么大,它们都有擅长的地方,毕竟存在即真理。所以,如果你真的有精力的话,不妨还可以了解一下更深层次的技术:

    海量日志处理和并行计算开发
    分布式技术框架、中间件等 Dubbo、Spring Cloud 、Zookeeper 、Kfaka
    流媒体分发技术CDN
    ...
    当然,这些都不是非常必要的。但是绝对是亮点!此外,你可以准备一些基础向的相关项目:

    网络库,可参考Muduo或者Nginx实现
    web服务器/http服务器,可实现基本的http响应请求和处理
    简易版STL库,展现C++的综合代码能力
    局域网聊天室开发,涉及到网络编程实现在线群聊
    分布式日志系统
    简易版数据库设计
    可参考一些C++常用库,造一些轮子或者做些有趣的小工具。
    九、总结
    在校园招聘中,对后台开发的面试大多还是针对候选人的计算机基础。大多数学生在校内接触不到太多高并发高可用的服务场景,甚至能上线的项目都很少,因此也很难要求校招生能够真正具备后台开发的能力。

    所以对于C++后台开发岗而言,对C++/Linux的充分熟悉以及扎实的计算机基础和有相关的学习经历,就已经能够满足各大公司的要求了。当然如果有在基础架构分布式开发等方面的经验,就更是各大厂抢手的香饽饽。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 7月11日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)