月薪 8k 和月薪 38K 的程序员差距在哪里?学习 Linux C/C++ 这些你就知道了
前言:Linux C/C++ 从零基础到大神的学习路线,自己的真实学习路线,干货很多,建议收藏,认真阅读。
在校期间,我一直走的都是 Linux C/C++ 学习路线,历经暑期实习、秋招决战、校招期间投的大部分岗位都是 Linux C/C++ 后台方向,对于这个方向,有着自己的理解。
从接触 C++ 到我现在正式工作,大概有 2 年多的时间,对于这个方向的学习路线、以及学习编程的方法摸索出来了一些,看完本文,希望对于正在走 Linux C/C++ 路上的同学能有所帮助。
一、校招 Linux C/C++ offer 情况
本人就读于双非院校、非科班本科学生,专业是偏硬件的(学校课程只有一门 C 语言与编程相关,其余的课程跟编程一点点的关系都没有),在校期间也没拿过什么大的奖项。
计算机基础为零,大二上学期接触 C 语言,大二一年学了 C 语言和数据结构,大三在学校的实验室开始学习计算机基础和学习 C++ 方向,一路自学编程,始终相信自己,也是拿到了大厂 offer。
校招 offer 情况:
腾讯 后台开发工程师(实习转正)
百度 手百 feeds 流,软件研发工程师
美团 后台开发 (C++ 方向面试)
作业帮 后台开发工程师
好未来 后台开发工程师
迅雷 后台开发工程师
盛大游戏 C++ 开发工程师
2018 年暑期实习腾讯,2019 年初实习百度,校招拿了十几个 Linux C/C++ 方向的 offer,最终的选择也很玄学,去了自己想去的公司,从事自己喜欢的岗位,现在在编程的路上越走越远。
二、Linux C/C++ 方向的一些思考
对于方向的抉择,很多人都选择了 Java 或者 Python 方向,Java 或者 Python 方向确实学的人多,岗位需求很多,入门能比 Linux C/C++ 方向容易一些,但是往深了学,各有各的难度,先敲定了方向,再深入学习。
Linux C/C++ 方向,国内真正掌握的人,其实是极少数,这个方向的学习人数也是相对比较少的,入门一般首选 C 语言或者 Python,C、C++ 在编程排行榜也是经久不衰的,排名靠前,如果喜欢,有兴趣,走这个方向是可以的。
Linux C/C++ 方向,国内很多大公司都有招聘这个方向的岗位,BAT 都有,尤其腾讯,底层架构都是 C++ 写的,百度核心搜索很多模块也是 C++ 写的,阿里云也在招聘 C++ 方向的工程师,这个方向,学的不错的,根本不用担心找工作的问题,学的一般的,其实就比较难找了。
Linux C/C++ 的效率是比 Java、Python 快一些的,更偏向于底层,能直接操作内存,对于编程思维、逻辑能力的提升是有帮助的;其实学习这个方向,是有一点枯燥的,不像 Python 爬虫、Java、前端能做出一些有趣的东西,小程序开发出一些产品,都能很快用于实战,获得编程的乐趣,进一步刺激自己学习。
C++ 方向没有那么多有趣的东西可以做,在很长的一段时间内,要靠自己的兴趣去坚持学习。
一路走过来,真的很痛苦,在校期间都想过放弃这个方向,曾经想学个 Java 可能会好一些(身边学习 Java 的人还是挺多的),每当快放弃的时候,又想到都学了这么长时间了,再坚持坚持,就这样一路走过来了;我是觉得自己真的挺幸运的,有时候,真的不一定非要头铁 C++ 方向,要看整个市场行情,顺势而为,选择好方向,在深入!
对于 Java 还是 C++ 方向的选择,没有哪个方向一定好找工作,没有哪个方向一定工资待遇高,互联网这行,尤其是靠技术说话的,这些都取决于你自身的技术能力。
选择走 C++ 方向的,一定要走 Linux C/C++,面向网络编程,学会 Linux 至关重要!
大厂特别喜欢考察计算机基础知识,对于基础掌握的如何,在很大程度上将决定你是否能进入大厂,一定要重视基础知识的学习;秋招准备:基础 + 算法 + 项目,加上自己的方向(C++、Java、Python、前端等),其中每个环节都得准备到位,才能最大程度上拿到大厂 offer,意识很重要,有了意识,再看具体的学习路线。
【文章福利】小编推荐自己的 linuxC/C++语言交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~
三、计算机基础知识的梳理
计算机基础:数据结构 + 算法、操作系统 + 计算机网络、数据库 + Linux、C 语言
工作必备工具:Linux + Git + Sql
不管你是学习什么方向的,这些基础都不能忽视,有时间的话,一定要打扎实了,有了扎实的功底,在这行才能走的更远更快!
在算法方面的要求上,C++ 方向对于算法的要求明显更高,算法功底一定要扎实!
四、C++ 方向的深入学习路线
C++ 基础:C++ 是面向对象的语言,一定要理解清楚面向对象的思想,先把 C++ 的基础知识点打牢,刚从面向过程中转变过来,一定一定要适应面向对象的写法。
在学习面向对象的时候,也要考虑如何用面向过程去实现面向对象(其实也就是结构体中有一个成员是函数指针),对于 C++ 的基础知识,我简单罗列如下:
const 的用法
引用的用法
define 用法
构造函数
析构函数
拷贝构造
new、delete 和 malloc、free 的区别
访问限定符 public、private、protected
深拷贝和浅拷贝
友元函数
static
内联函数
继承、虚继承
钻石继承问题
同名覆盖问题
虚函数表
虚指针
虚函数、纯虚函数
接口
多态
重写
重载
函数重载
运算符重载
流类库和文件
C++ 进阶:函数模板、类模板,C++ 中对于异常的处理,对于继承和多态底层的理解,对于 virtual 底层的理解等。
对于 C++ 中 boost 库八大智能指针的掌握与理解,其核心是理解并且剖析过相应的源码, <scoped_ptr/shared_ptr/weak_ptr> 这三个是最核心的智能指针,理解清楚智能指针的本质是,内存的申请与释放全部交给了对象管理,以避免人为疏忽,造成内存泄露。
STL 源码:对于 STL 中的容器剖析,常见容器有 list、vector、stack、queue、map 等,考察自动扩容的原理、map 的底层实现(RBtree),源码是必须手动至少剖析一遍的。
对于迭代器、空间配置器的理解,比如:一级空间配置器、二级空间配置器的运用场合分别是什么?一二级空间配置器的本质是什么,如何用内存池去管理?所存在的问题又有哪些,源码又是如何实现的等等,这些问题都需要去思考。
Linux 网络编程:
1、Linux 进程环境:僵尸进程、孤儿进程、守护进程、进程组、会话、前台进程组、后台进程组
2、Linux 进程七大通信方式:signal、file、pipe、shm、sem、msg、socket
3、Linux 线程:互斥量、锁机制、条件变量、信号量、读写锁
4、Linux 下并发模型:多进程、多线程、线程池
5、Linux 下 I/O 复用:select、poll、epoll 高并发
6、Linux 网络编程
7、静态库和动态库
五、总结
最后,如果觉得学习资料难找的话,可以添加小编的 C 语言/C++交流群 Q:【1106675687】学习资料已经共享在群里了,期待你的加入~
日积月累,终有所成!!
版权声明: 本文为 InfoQ 作者【ShenDu_Linux】的原创文章。
原文链接:【http://xie.infoq.cn/article/f53a37aab0239b6ffe57686ec】。文章转载请联系作者。
评论