经验总结:超详细的 Linux C/C++ 学习路线!已拿鹅厂offer

创做不易,点赞关注支持一下吧,个人更多原创技术分享,关注公众号「后端技术学堂」第一时间看!linux

最近在知乎常常被邀请回答相似如何学习C++和C++后台开发应该具体储备哪些基础技能的问题。ios

自己我从事的的C++后台开发的工做,目前在腾讯从事软件开发工做,因此写这篇文章,分享本身的C++后台开发学习路径和点过的技能树,但愿能给想从过后台开发的同窗一点参考,若能帮你少走些弯路就更好。程序员

工欲善其事必先利其器,好的书籍能让学习事半功倍,因此每一个技能点以后我会推荐一些书,都是我读过且口碑不错的书,供参考。web

文末能够获取学习路线资源,须要的同窗自取。

分享的是个人学习路径,若是你也能顺着这个学习路径认真学一遍,我想在后台开发技术上你已经有一个很不错的技术积累,加上项目练习经过大部分大厂面试是没有问题的。面试

计算机基础综合

考过CS或者软件工程研究生的同窗可能对这个标题不陌生,是的,我说的就是专业课代号408的计算机基础综合。这门专业课包含:数据结构、计算机组成原理、计算机网路、操做系统。redis

为何提起这门课程呢,由于基础知识过重要了!这是科班区别于培训班的最大不一样,理论知识不必定立刻能用于项目上,但当与人讨论起某个技术问题时你可以知道它深层次的缘由,看问题的角度会更加全面和系统。算法

打个比方,你可能听过堆栈的名词,但知道它的具体结构和不一样吗?学完数据结构就明白了;你知道计算机会算加减乘除,但具体是如何实现的呢?组成原理会告诉你;知道程序执行的时候怎么区分指令地址和数据地址的吗?操做系统会告诉你答案。shell

因此若是你大学不是计算机相关专业,或者是本专业可是没有彻底吃透基础的话,强烈建议你务必抽时间好好学习这几门课程。数据库

推荐书:

计算机基础综合推荐看大学的计算机专业教材就能够:数据结构、计算机组成原理、计算机网路、操做系统。编程

  • 数据结构

1.教材:《数据结构》严蔚敏 清华大学出版社

2.辅导书:《算法与数据结构考研试题精析(第二版)》机械工业出版社

  • 计算机组成原理

教材:《计算机组成原理》唐朔飞高等教育出版社

辅导书:

《计算机组成原理考研指导》徐爱萍 清华大学出版社

《计算机组成原理–学习指导与习题解答》唐朔飞高等教育出版社

  • 操做系统

教材:《计算机操做系统(修订版)》汤子瀛 西安电子科技大学出版社

辅导书:《操做系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社

《操做系统考研指导》清华大学出版社

  • 计算机网络

教材:《计算机网络(第五版)》谢希仁 电子工业出版社

辅导书:《计算机网络知识要点与习题解析》哈尔滨工程大学出版社

视频教材

看上面的课本教程估计很是枯燥,下面是我以为讲的不错的国内大学公开课我听过一部分,讲的都是计算机专业的基础内容,若是你没有系统的学过或者学的很差,都是很是建议刷一遍视频课的。

武汉大学-数据结构 MOOC网络课程

华中科技大学-计算机组成原理

电子科技大学-计算机组成原理

华中科技大学-操做系统原理

哈尔滨工业大学-计算机网络

这一小节写的有点多,由于基础实在是过重要了!科班和非科班的差距不是谁学的编程语言多,也不是谁框架用的溜,本质区别是理论知识储备差异和用CS思惟独立思考分析解决问题的能力。

C++和C语法基础

语法是一门语言的基础,C++的基础语句和语法和C是很像的,最大的不一样在class和异常处理机制,还有模板的应用,因此有C基础语法学起来是很快,没有C基础也不要紧,啃完下面推荐的书也差很少,光说不练假把式,看完以后趁热把课后习题敲一遍而且本身编译经过才算看完。

推荐书:

《C++ Primer 中文版(第 5 版)》 经典的入门书籍,不要拿大学教材XX强来对比,不是一个等级。

标准库STL学习

STL提供了丰富的算法库支持和各类容器,C++标准库提供了包括最基础的标准输入输出iostrem、各类容器vector、set、string ,熟练掌握标准库,不用重复造轮子(练手学习目的的造轮子除外)写出更C++的代码。

推荐书:

《C++ Primer 中文版(第 5 版)》

《STL源码剖析》

C++进阶

学完了上面的C++基础只是会用,要用好还须要不断学习进阶, 站在巨人的肩膀上写出更健壮高效的代码,你没踩过的坑前人已经踩过一遍,关于一些语言细节和更好的编码习惯,有不少优秀的书籍能够学习。

推荐书

《Effective C++》 改善程序与设计的55个具体作法,很是值得一看,老手和新手的差异由此产生!

《More Effective C++(中文版》

同一个做者,继Effective C++以后,Scott Meyers于1996推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。条款变得比较少,页数却是多了一些,缘由是此次选材比“一集”更高阶,尤为是第5章。Meyers将此章命名为技术。

《Inside the C++ Object Model》 这本书还有中文版本,翻译质量也很高《深度探索C++对象模型》

C++11新标准

新标准提供了解决现有问题更优雅、更C++的实现。现行的大部分C++软件仍是C++98的标准,C++98是C++的第一个标准,经历这么多年的发展,从前你须要从Boost库(一个在C++98年代的准C++标准)得到的对C++的扩充支持的大部分功能已经归入了C++11和甚至C++2X更新的标准当中,与时俱进拿起更先进的生产工具,工具就是效率。

推荐书:

《深刻理解C++11》

Linux系统基础和shell script

现在几乎全部的互联网服务都是跑在linux系统上面的。 对Linux系统一无所知那更加谈不上后台开发了,因此要先学习linux系统操做,不如文件管理,系统命令,文件系统,权限管理,系统服务等。

至于shell script 就相似win的批处理脚本,相信我,你在linux下干活迟早会须要它,因此趁早系统学起来。

推荐书:

《鸟哥的Linux私房菜基础学习篇》 这个系列还有一个服务器架设篇,前期学习我的感受不必看

《Linux Shell脚本攻略》

《Shell脚本学习指南》

Linux环境高级编程

普通用户只需懂系统操做,软件开发人员还要懂编程接口。上一阶段你已经可以完成熟练操做Linux系统,知道一些常规的系统命令和服务,而且可以利用shell script写一些小工具提升平常开发效率。

咱们的目标是星辰大海,做为软件工程师,还须要更加深刻的掌握linux系统编程技巧,学习系统编程接口、系统调用API、内存管理、进程间通讯(IPC),这是本阶段的学习目的。

推荐书:

《UNIX环境高级编程》 这本是linux编程必看的APUE,强烈推荐通读一遍,后续值得反复翻阅。

《Linux/UNIX系统编程手册》 这本书和APUE有点重复,我看完APUE这本就跳着看了,日常能够看目录查阅。

Linux网络编程套接字

在同一台机器上进程间的通讯(IPC)有多种方式,能够是经过消息队列、FIFO、共享内存等方式。网络编程套接字是指:分布在不一样机器上的程序经过系统提供的网络通讯接口,跨越网络将不一样机器上的进程链接起来,实现跨机器的网络通讯。通常有UDP套接字、TCP套接字、Unix Domain,固然,若是你是通讯从业者对SCTP套接字确定也不会陌生。

推荐书:

《UNIX网络编程 卷1:套接字联网API(第3版)》

《UNIX网络编程 卷2:进程间通讯(第2版)》

数据库和存储

程序运行数据都在易失性的内存中,须要持久化存储时就须要数据库。一个后台服务系统通常来讲都须要考虑数据落地和持久性存储的问题,这时就会涉及到数据库选型和应用,数据库分为关系型数据库和非关系型数据库。

关系型数据库指采用了关系模型来组织数据的数据库,表明是MySql。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

非关系型数据库以键值对存储,且结构不固定,每个元组能够有不同的字段,每一个元组能够根据须要增长一些本身的键值对,不局限于固定的结构,能够减小一些时间和空间的开销。表明有redis、memcached,腾讯内部组件ckv也是非关系型数据库。

推荐书:

《SQL必知必会》

《高性能MySQL》

redis官方文档 redis中文网

关于redis还有不少应用,好比基于redis的分布式锁的应用,高并发抢红包模型等,这个后面能够写一篇关于分布式锁的原理和应用文章。

算法基础

计算机算法就是利用编程语言编写出计算机能理解的解决问题的方法。

好的算法能更简洁高效的解决问题,现在不管是校招仍是社招,大厂笔试都会考察算法,即便不是为了笔试做为软件从业者也应该常常练习算法,保持手感。学习算法是学习解决问题的通用性方法有助于提升逻辑思惟能力。

学习方法

就我我的经验来讲,不推荐直接啃书的方式学习算法,建议看书的同时结合刷在线编程算法题的方式。

具体的:边看数据结构或算法导论,同时在牛客或者 leetcode上刷题,由于看书太枯燥很容易失去耐心,在线刷题的好处是你能够天天定目标,享受每一个题目经过的快感,有正向反馈更容易坚持下来。

架构能力

**架构能力是利用已有知识来设计整个后台服务系统的能力。**不只要求掌握技能的维度还要深度,须要能根据不一样需求和系统约束,制定不一样的设计方案。

这时候考虑的东西会更多,包括服务模型的设计:是多进程仍是多线程甚至协程微线程,分布式仍是集中式;

存储的选型:考虑数据库选型用哪一个?须要根据存储的数据特征和应用场景来区分,若是是社交应用的数据用非关系型数据库来存储可能更好,若是是电商订单类型的数据,那么用关系型数据库来存储可能更好;

固然,还有后台系统的其余方方面面须要考虑,不一一举例了。

更多的练习

**说了这么多,最最重要的仍是练习练习练习。**理论知识储备是必要条件,移动互联网时代你们接触到的碎片化信息太杂太乱,我我的经验,高浓度的知识精华仍是须要在大师的书本中汲取,因此看书是最正确和快速的学习路径,没有捷径可走。

不过光看书也是不行,编程能力和技术是也是一门现代手艺活,还须要平常不断的打磨手艺,正如一万小时定律

人们眼中的天才之因此卓越非凡,并不是天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。要成为某个领域的专家,须要10000小时,按比例计算就是:若是天天工做八个小时,一周工做五天,那么成为一个领域的专家至少须要五年。这就是一万小时定律。

怎么打磨提升编程技术能力呢?找项目,找感兴趣的东西用代码去实现它,兴趣是最好的老师,这点在编程和技术学习上也彻底适用。

人们总倾向于去作快速得到的愉悦感的事情,好比打一盘游戏30分钟就能得到快感。相反,技术碎片的提升是一个长期的过程,三分钟热度确定是难以成功的。

因此要用技术作本身感兴趣的东西和带趣味性的编程,好比写个爬虫小程序抓取网站数据或者写个小游戏,再或者本身造轮子给本身用,并乐此不疲的优化轮子。这样每走一步都能得到一点成就感,激励本身继续走下去,慢慢的必定会有质的飞跃。

一个网站

这个网站必定要告诉你们,网站就是个C++百科全书,相似Linux的man手册,日常开发查忘记了函数名或者容器用法直接搜索很是方便,我下载了离线版本。

网址:C++参考: cppreference

待续

一口气写下来确定还不够完善,文章会保持更新和修改,想到了再补充吧文章在公众号保持更新。

我整理了文中提到和推荐的电子书与视频教材,都是学习过程收集的,搜索 「后端技术课堂」 回复 「1024」 免费分享给你们。

精彩文章推荐:

我用大数据分析了一线城市1000多份岗位招聘需求,告诉你如何科学找工做
腾讯后台开发面试笔试C++知识点参考笔记
还能这么玩?我用VsCode画类图、流程图、时序图、状态图不要太爽!
面试官:你会几种redis分布式锁?我会三种!
最详细的我的博客教程搭建教程GithubPages+Jekyll 简约风格博客
面试官:你说对MySQL事务很熟?那我问你10个问题

创做不易,点赞关注支持一下吧

我会持续分享软件编程和程序员那些事,欢迎关注。若你对编程感兴趣,我整理了这些年学习编程大约3G的资源汇总,关注公众号「后端技术学堂」后发送「资料」免费获取。