• 【转】Linux C/C++ 学习路线(已拿腾讯、百度 offer)


    分享

    一、秋招 Linux C/C++ offer 情况

    二、Linux C/C++ 方向的一些思考

    三、计算机基础知识的梳理

    四、C++ 方向的深入学习路线

    五、项目 + 亮点 + 面试的一些思考

    六、总结

    前言

    Linux C/C++ 从零基础到大神的学习路线,自己的真实学习路线,干货很多,建议收藏,认真阅读。

    在校期间,我一直走的都是 Linux C/C++ 学习路线,历经暑期实习、秋招决战、校招期间投的大部分岗位都是 Linux C/C++ 后台方向,对于这个方向,有着自己的理解。

    最后,如果大家如果在自学遇到困难,想找一个C++的学习环境,可以加入我们的C++学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到的难题。

    从接触 C++ 到我现在正式工作,大概有 2 年多的时间,对于这个方向的学习路线、以及学习编程的方法摸索出来了一些,看完本文,希望对于正在走 Linux C/C++ 路上的同学能有所帮助。

    一、秋招 Linux C/C++ offer 情况

    本人就读于双非院校、非科班本科学生,专业是偏硬件的(学校课程只有一门 C 语言与编程相关,其余的课程跟编程一点点的关系都没有),在校期间也没拿过什么大的奖项。

    计算机基础为零,大二上学期接触 C 语言,大二一年学了 C 语言和数据结构,大三在学校的实验室开始学习计算机基础和学习 C++ 方向,一路自学编程,始终相信自己,也是拿到了大厂 offer。

    秋招 offer 情况:

    • 腾讯 后台开发工程师(实习转正)
    • 百度 手百 feeds 流,软件研发工程师
    • 美团 后台开发 (C++ 方向面试)
    • 作业帮 后台开发工程师
    • 好未来 后台开发工程师
    • 迅雷 后台开发工程师
    • 盛大游戏 C++ 开发工程师

    。。。

    2017 年暑期实习腾讯,2018 年初实习百度,校招拿了十几个 Linux C/C++ 方向的 offer,最终的选择也很玄学,去了自己想去的公司,从事自己喜欢的岗位,现在在编程的路上越走越远。

    二、Linux C/C++ 方向的一些思考

    1、

    对于方向的抉择,很多人都选择了 Java 或者 Python 方向,Java 或者 Python 方向确实学的人多,岗位需求很多,入门能比 Linux C/C++ 方向容易一些,但是往深了学,各有各的难度,先敲定了方向,再深入学习。

    Linux C/C++ 方向,国内真正掌握的人,其实是极少数,这个方向的学习人数也是相对比较少的,入门一般首选 C 语言或者 Python,C、C++ 在编程排行榜也是经久不衰的,排名靠前,如果喜欢,有兴趣,走这个方向是可以的。

    Linux C/C++ 方向,国内很多大公司都有招聘这个方向的岗位,BAT 都有,尤其腾讯,底层架构都是 C++ 写的,百度核心搜索很多模块也是 C++ 写的,阿里云也在招聘 C++ 方向的工程师,这个方向,学的不错的,根本不用担心找工作的问题,如果学的一般的,其实哪种语言就都比较难找了,毕竟都知道it行业是技术竞争,优胜劣汰。

    Linux C/C++ 的效率是比 Java、Python 快一些的,更偏向于底层,能直接操作内存,对于编程思维、逻辑能力的提升是有帮助的;其实学习这个方向,是有一点枯燥的,不像 Python 爬虫、Java、前端能做出一些有趣的东西,小程序开发出一些产品,都能很快用于实战,获得编程的乐趣,进一步刺激自己学习。

    C++ 方向没有那么多有趣的东西可以做,在很长的一段时间内,要靠自己的兴趣去坚持学习。

    2、

    我在大三的时候,用 C++ 写过五子棋、内存监控工具、压缩工具、以及实现一些比较复杂的数据结构,实现网络编程的并发模型;当你学习 Linux C/C++ 方向到一定程度的时候,你会找到这个方向的乐趣,跟其他方向完全不一样的乐趣。

    不过,前期真的很难,有一段时间极其痛苦,是要经过很长一段时间的学习,才能有一定的效果,如果对这个方向,真的没有啥兴趣,最好选择走前端、Java、Python 等是最好的选择。但是如果你已经是从业Linux c/c++开发几年了,那就继续吧,技术提升没你想的那么难!

    Linux C/C++ 方向,入门稍微难一点,一旦选择了要走 C++ 方向的,在心态上面,要做好准备,一定不能有畏难心里,做好接触底层、复杂逻辑的分析、以及具备面向过程 + 面向对象的思想;就是退一步讲,我学习了 Linux C/C++ 方向,具备了编程思维和熟悉了 C++ 语言,以后去公司上班了,也能很快的上手 Java、Python 等方向(我说的上手指的是语言基础很快的学习,要想深入,还得花大把的时间),这也是c/c++的优势所在。

    按照目前身边人找工作的情况,普遍来说,Java、Python、前端、数据分析、测试方向都要比 C++ 好找一些,更容易找到工作,虽然我是走的 Linux C/C++ 方向,但是对于对底层没有兴趣,对 C 语言没有兴趣的人,不建议走这个方向。

    3、

    我一路走过来,真的很痛苦,在校期间都想过放弃这个方向,曾经想学个 Java 可能会好一些(身边学习 Java 的人还是挺多的),每当快放弃的时候,又想到都学了这么长时间了,再坚持坚持,就这样一路走过来了;我是觉得自己真的挺幸运的,有时候,真的不一定非要头铁 C++ 方向,要看整个市场行情,顺势而为,选择好方向,在深入!

    对于 Java 还是 C++ 方向的选择,没有哪个方向一定好找工作,没有哪个方向一定工资待遇高,互联网这行,尤其是靠技术说话的,这些都取决于你自身的技术能力。

    选择走 C++ 方向的,一定要走 Linux C/C++,面向网络编程,学会 Linux 至关重要!

    大厂特别喜欢考察计算机基础知识,对于基础掌握的如何,在很大程度上将决定你是否能进入大厂,一定要重视基础知识的学习;秋招准备:基础 + 算法 + 项目,加上自己的方向(C++、Java、Python、前端等),其中每个环节都得准备到位,才能最大程度上拿到大厂 offer,意识很重要,有了意识,再看具体的学习路线。

    三、计算机基础知识的梳理

    计算机基础:数据结构 + 算法、操作系统 + 计算机网络、数据库 + Linux、C 语言

    工作必备工具:Linux + Git + Sql

    不管你是学习什么方向的,Java、Python、前端、测试、运维等等,这些基础都不能忽视,有时间的话,一定要打扎实了,有了扎实的功底,在这行才能走的更远更快!

    1、常用数据结构与算法:

    • 平衡二叉树
    • 红黑树
    • B-树
    • KMP算法
    • 栈/队列
    • 布隆过滤器

    靠前的数据结构一定要非常的熟练,对于树、图复杂的数据结构,最起码的掌握定义、原理、部分实现,我就记得:我在面试的时候,手写过红黑树的旋转算法,对于图的一些最短路径算法也是当面手写过,头条的面试基本上就是全程算法,难度不低。

    • 冒泡
    • 插入
    • 选择
    • 快排
    • 希尔
    • 堆排
    • 归并
    • 桶排
    • 基数
    • 计数
    • 字符串常见算法
    • 数组常见算法
    • 递归算法


    一定要保证掌握基础算法 + 常见算法。

    在算法方面的要求上,C++ 方向对于算法的要求明显更高,算法功底一定要扎实!

    2、操作系统:很常问的一些技术点,堆和栈、内存分区、虚拟内存 + 物理内存、进程 + 线程 + 协程、死锁、分片机制、五大组件、中断和系统调用 、同步和异步等等问题。

    对于操作系统的理解,对于这些基础的计算机知识的掌握是必须深入学习,要花很大的功夫去理解清楚这些,工作中,对于真实线上系统的稳定性、对于底层技术的理解是有帮助的,操作系统是面试中常见问题之一。

    3、计算机网络:OSI 七层模型和 TCP/IP 四层体系结构,TCP 三次握手与四次挥手、常见的网络协议(网桥、ARP、IP、ICMP、TCP、UDP、DNS、DHCP)、TCP 粘包、流量控制 + 拥塞控制、数字签名原理、http + https,http 的状态码,https 的安全机制,网络安全、输入 baidu.com 背后发生了什么等等问题。

    其实工作中,有时就会出现,网络抖动、网络延迟,网络拥塞的情况,此时就需要具备一定的网络知识,及时的解决问题,计算机网络是面试中常见问题之一。

    4、数据库:数据库作为存储数据的地方,其不同的数据结构、与应用的场景不一样,采取不同的数据库,对于 mysql 基本操作、写 sql 的优化、表的设计、索引优化、如何更快的查询、底层数据结构的设计原理等等问题。

    常见的设计模式、主要是学习设计模式的思想、单例模式是必须写代码实现的,其他设计模式理解思想,作为了解内容,后台开发工程师与 mysql 打交道挺多的,也是面试常见问题之一。

    5、Linux系统

    Linux是所有学c/c++同学都绕不开的坎,我整理了Linux方面需要掌握的技术点,不知道怎么学习的同学可以借鉴一下。

    系统命令工具

    • 进程间通信设施状态 ipcs
    • 虚拟内存统计工具 vmstat
    • Linux系统运行时长 uptime
    • CPU平均负载和磁盘活动 iostat
    • 监控,收集和汇报系统活动 sar
    • 监控多处理器使用情况 mpstat
    • 监控进程的内存使用情况 pmap
    • 进程监控工具 atop
    • 控制台的流量监控工具 vnstat
    • 系统进程状态 ps
    • 详细网络流量分析 tcpdump
    • 内存使用状态 free
    • 系统管理员调优和基准测量工具 nmon
    • 密切关注Linux系统 glances
    • 查看系统调用 strace

    网络参数工具

    • Linux网络统计监控工具 netstat
    • 显示和修改网络接口控制器 ethtool
    • 网络数据包分析利刃 tcpdump
    • 监控并帮助你调试网络 bmon
    • 获取实时网络统计信息 iptraf
    • 显示主机上网络接口带宽使用情况 iftop
    • 网络流量和 ip 流量分布 ntopng


    日志监控工具

    实时网络日志分析器 GoAccess

    • 多窗口之下日志监控 MultiTail
    • 日志分析系统 LogWatch/Swatch

    参数监控工具

    • 监控apache网络服务器整体性能 apachetop
    • ftp 服务器基本信息 ftptop
    • IO监控 iotop
    • 电量消耗和电源管理 powertop
    • 监控 mysql 的线程和性能 mytop
    • 系统运行参数分析 htop/top/atop

    工作基本上离不开 Linux,也是面试常见问题之一。

    6、C 语言

    C 语言是我学习编程的第一门语言,是面向过程的语言,对于 C 语言中的数组、函数、指针、内存对其模式、大小端问题、野指针、内存泄露、static、register、define、typedef、struct、union 等一些关键字的考察。

    我一直把 C 语言当做基础,不是方向,在 C 语言这里学到了很多编程的思想,对于 Linux C/C++ 方向,C 语言是基本功,也是必定考察的地方,当初我也是因为特别喜欢 C,走上了 C++ 的道路。所以c语言其实对于所有语言的编程者来说都是值得学习和借鉴的。

    C 语言可以学,C 语言是基础,不是方向,但是选择走 C++ 就是要选择的方向了,要谨慎选择!

    对于上面的每一个模块,其实都能单拿出来,写的更为具体一些,但是个人比较懒,就写出大纲来给大家借鉴一些吧。

    四、C/C++ Linux方向的深入学习路线

    1、C++ 基础

    C++ 是面向对象的语言,一定要理解清楚面向对象的思想,先把 C++ 的基础知识点打牢,刚从面向过程中转变过来,一定一定要适应面向对象的写法。

    在学习面向对象的时候,也要考虑如何用面向过程去实现面向对象(其实也就是结构体中有一个成员是函数指针),对于 C++ 的基础知识,我简单罗列如下:

    1、const的用法

    2、引用的用法

    3、#define用法

    4、构造函数

    5、析构函数

    6、拷贝构造

    7、new、delete 和 malloc、free 的区别

    8、访问限定符 public、private、protected

    9、深拷贝和浅拷贝

    10、友元函数

    11、static

    12、内联函数

    13、继承、虚继承

    14、钻石继承问题

    15、同名覆盖问题

    16、虚函数表

    17、虚指针

    18、虚函数、纯虚函数

    19、接口

    20、多态

    21、重写

    22、重载

    23、函数重载

    24、运算符重载

    25、流类库和文件

    2、C++ 进阶

    函数模板、类模板,C++ 中对于异常的处理,对于继承和多态底层的理解,对于 virtual 底层的理解等。

    对于 C++ 中 boost 库八大智能指针的掌握与理解,其核心是理解并且剖析过相应的源码, <scoped_ptr/shared_ptr/weak_ptr> 这三个是最核心的智能指针,理解清楚智能指针的本质是,内存的申请与释放全部交给了对象管理,以避免人为疏忽,造成内存泄露。

    何为c/c++Linux方向的深入学习,就是在掌握上述前提技术基础之上的进阶学习。

    如果对上述技术觉得自己还有所不足的同学,推荐大家一个免费学习课程

    链接:ke.qq.com/course/417774?

    主要讲的就是c/cLinux方向的技术分享

    针对上面,从基础到 C++,我列出来的都是非常重要的知识点,当然了,也不可能全部列到,有很多技术问题,很多细节,我可能没有考虑到,没有写到,这个还需要在学习的时候,认真看看视频、看看书,把相应的知识都学到位,基础打扎实一些。

    五、项目 + 亮点 + 面试的一些思考

    1、

    项目:对于暑期找实习,或者秋招找工作,除了基础跟方向,接下来就是项目的准备了,对于 C++ 方向,很多人不知道要准备什么项目?其实项目不在于有多大、有多难,在于项目是否是自己真正做的,自己是否完全消化了,项目中是否有什么亮点?

    C++ 方面的实战项目,以数据结构 + 网络编程 + 实用工具为主;数据结构方面:可以实现红黑树、B+ 树,又或者用图解决什么实际问题,这些复杂的数据结构实现可以作为项目的。

    1.对于项目这块,面试的常见问题有:

    a、做这个项目的背景是什么?

    b、项目中具体有哪些模块,都是怎么实现的?

    c、项目中你的技术亮点有哪些?

    d、项目中有什么难点,你是怎么解决的?

    e、要是重新做这个项目,你这个项目有什么不足,你会进行哪些改进?

    2.亮点:找实习或者找工作,必须的有自己的亮点,我觉得在那么多基础知识中,数据结构 + C 语言就是我的亮点之一,只要问到关于这 2 个方面的问题,尽量回答全面清楚一些,还有就是自己对于 Linux 内核数据结构的剖析也是亮点之一,总之,一定要找到自己的亮点,与别人不一样的地方,这个就是面试的加分项。

    搜索引擎的底层原理、通讯的底层原理,对于这些底层的实现,有兴趣的可以了解看看,其实也没那么难,要是在面试的时候,能回答出对这些技术的了解,以及自己的一些思考,那就是加分项了。

    3、

    面试:春招实习、秋招决战,我不知道投了多少家公司,也不知道面试了多少场,基本上都是海投的,有了面试机会,就要抓住每一次,面试完多做总结、归纳、反思;其实面试很玄学,有自身实力的原因,也有运气的成分,相信自己,好好表现就好。

    对于面试,才开始我也是比较紧张的,但是当你面的多了,慢慢的就会调整过来,就会好很多,我现在把面试当做是,这是一次近距离和优秀的人交流的机会,是一次学习进步的机会,有了这种心态,其实就好的多了。

    对于面试我也自我总结了一些面试题及回答经验,分析出题人出题的思路在哪里,毕竟我们不是要去死记面试题,重要是面试官考题的技术点在哪里?把技术点吃透,之后再问到类似的问题就不会慌了。

    无欲则刚 关心则乱
  • 相关阅读:
    Oracle查询错误分析:ORA-01791:不是SELECTed表达式
    Java中DESKeySpec类
    linux发布项目
    mac下搭建cocos2d-x2.2.1版本android编译环境教程
    使用Eigen求解线性方程组
    视觉SLAM十四讲课后答案-ch1
    costmap_2d: obstacle_layer中关于激光雷达障碍物清除不干净的解决
    ch4 激光的前端配准算法一 —— ICP方法
    Project 'cv_bridge' specifies '/usr/include/opencv' as an include dir, which is not found.
    ch3 传感器数据处理II: 激光雷达运动畸变去除
  • 原文地址:https://www.cnblogs.com/xjyxp/p/11165313.html
Copyright © 2020-2023  润新知