Files
kaka111222333-kaka111222333…/_posts/2020-1-4-learn_cpp.md
lemonchann b9eb57dc3a add blog
2020-01-09 23:26:55 +08:00

225 lines
16 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
layout: post
title: "Linux后台开发C++学习路线技能加点"
date: 2020-1-1
tags: [c++]
comments: true
author: lemonchann
---
最近经常被邀请回答类似如何学习C++和C++后台开发应该具体储备哪些基础技能的问题。本身我从事的的C++后台开发的工作目前在腾讯负责QQ相关后台开发所以写这篇文章分享自己的C++后台开发学习路径和点过的技能树,希望能给想从事后台开发的同学一点参考,若能帮你少走些弯路就更好。
工欲善其事必先利其器,好的书籍能让学习事半功倍,所以每个技能点之后我会推荐一些书,都是我读过且口碑不错的书,供参考。
**分享的是我的学习路径如果你也能顺着这个学习路径认真学一遍我想在后台开发技术上你已经有一个很不错的技术积累加上项目练习通过大部分大厂面试是没有问题的。后续还会继续分享关于C++编程和后台开发技术,感兴趣的同学可以关注我和专栏。**
## 计算机基础综合
考过CS或者软件工程研究生的同学可能对这个标题不陌生是的我说的就是专业课代号408的**计算机基础综合**。这门专业课包含:数据结构、计算机组成原理、计算机网路、操作系统。
为什么提起这门课程呢,因为基础知识太重要了!这是科班区别于培训班的最大不同,理论知识不一定马上能用于项目上,但当与人讨论起某个技术问题时你能够知道它深层次的原因,看问题的角度会更加全面和系统。
打个比方,你可能听过堆栈的名词,但知道它的具体结构和不同吗?学完数据结构就明白了;你知道计算机会算加减乘除,但具体是如何实现的呢?组成原理会告诉你;知道程序执行的时候怎么区分指令地址和数据地址的吗?操作系统会告诉你答案。
所以如果你大学不是计算机相关专业,或者是本专业但是没有完全吃透基础的话,强烈建议你务必抽时间好好学习这几门课程。
#### 推荐书:
**计算机基础综合**推荐看大学的计算机专业教材就可以:数据结构、计算机组成原理、计算机网路、操作系统。
- 数据结构 
> 1.教材:[《数据结构》](https://www.baidu.com/s?wd=《数据结构》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)[严蔚敏](https://www.baidu.com/s?wd=严蔚敏&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao) 清华大学出版社 
>
> 2.辅导书:《算法与数据结构考研试题精析(第二版)》[机械工业出版社](https://www.baidu.com/s?wd=机械工业出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
- 计算机组成原理  
> 教材:[《计算机组成原理》](https://www.baidu.com/s?wd=《计算机组成原理》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)[唐朔飞](https://www.baidu.com/s?wd=唐朔飞&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)[高等教育出版社](https://www.baidu.com/s?wd=高等教育出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
>
> 辅导书:
>
> [《计算机组成原理考研指导》](https://www.baidu.com/s?wd=《计算机组成原理考研指导》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)徐爱萍 清华大学出版社 
>
> 《计算机组成原理--学习指导与习题解答》[唐朔飞](https://www.baidu.com/s?wd=唐朔飞&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)[高等教育出版社](https://www.baidu.com/s?wd=高等教育出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
- 操作系统 
> 教材:[《计算机操作系统(修订版)》](https://www.baidu.com/s?wd=《计算机操作系统(修订版)》&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)汤子瀛 [西安电子科技大学出版社](https://www.baidu.com/s?wd=西安电子科技大学出版社&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)
>
> 辅导书:《操作系统考研辅导教程(计算机专业研究生入学考试全真题解) 》电子科技大学出版社 
>
> 《操作系统考研指导》清华大学出版社 
- 计算机网络 
> 教材:《计算机网络(第五版)》谢希仁 电子工业出版社  
>
> 辅导书:《计算机网络知识要点与习题解析》哈尔滨工程大学出版社 
#### 视频教材
看上面的课本教程估计非常枯燥,下面是我觉得讲的不错的国内大学公开课我听过一部分,讲的都是计算机专业的基础内容,如果你没有系统的学过或者学的不好,都是非常建议刷一遍视频课的。
[武汉大学-数据结构 MOOC网络课程 ](https://www.icourse163.org/course/WHU-1001539003)
[华中科技大学-计算机组成原理](https://www.icourse163.org/course/HUST-1003159001)
[电子科技大学-计算机组成原理](https://www.icourse163.org/course/UESTC-1001543002)
[华中科技大学-操作系统原理](https://www.icourse163.org/course/HUST-1003405007)
[哈尔滨工业大学-计算机网络](https://www.icourse163.org/course/HIT-154005)
**这一小节写的有点多因为基础实在是太重要了科班和非科班的差距不是谁学的编程语言多也不是谁框架用的溜本质区别是理论知识储备差别和用CS思维独立思考分析解决问题的能力。**
## C++和C语法基础
**语法是一门语言的基础。**C++的基础语句和语法和C是很像的最大的不同在class和异常处理机制还有模板的应用所以有C基础语法学起来是很快没有C基础也没关系啃完下面推荐的书也差不多光说不练假把式看完之后趁热把课后习题敲一遍并且自己编译通过才算看完。
#### 推荐书:
[《C++ Primer 中文版(第 5 版)》](https://book.douban.com/subject/25708312/) 经典的入门书籍不要拿大学教材XX强来对比不是一个等级。
## 标准库STL学习
**STL提供了丰富的算法库支持和各种容器。**C++标准库提供了包括最基础的标准输入输出`iostrem`、各种容器`vector、set、string` 熟练掌握标准库不用重复造轮子练手学习目的的造轮子除外写出更C++的代码。
#### 推荐书:
[《C++ Primer 中文版(第 5 版)》](https://book.douban.com/subject/25708312/)
[《STL源码剖析》]( https://book.douban.com/subject/1110934/ )
## C++进阶
**学完了上面的C++基础只是会用,要用好还需要不断学习进阶。**站在巨人的肩膀上写出更健壮高效的代码,你没踩过的坑前人已经踩过一遍,关于一些语言细节和更好的编码习惯,有很多优秀的书籍可以学习。
#### 推荐书
[《Effective C++》](https://book.douban.com/subject/1842426/) 改善程序与设计的55个具体做法非常值得一看老手和新手的差别由此产生
[《More Effective C++(中文版》](https://book.douban.com/subject/5908727/)
> 同一个作者继Effective C++之后Scott Meyers于1996推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。条款变得比较少页数倒是多了一些原因是这次选材比“一集”更高阶尤其是第5章。Meyers将此章命名为技术。
[《Inside the C++ Object Model》](https://book.douban.com/subject/1484262/) 这本书还有中文版本,翻译质量也很高[《深度探索C++对象模型》](https://book.douban.com/subject/1091086/)
## C++11新标准
**新标准提供了解决现有问题更优雅、更C++的实现**。现行的大部分C++软件还是C++98的标准C++98是C++的第一个标准经历这么多年的发展从前你需要从Boost库一个在C++98年代的准C++标准获得的对C++的扩充支持的大部分功能已经纳入了C++11和甚至C++2X更新的标准当中与时俱进拿起更先进的生产工具工具就是效率。
#### 推荐书:
[深入理解C++11](https://book.douban.com/subject/24738301/)
## Linux系统基础和shell script
**如今几乎所有的互联网服务都是跑在linux系统上面的。**对Linux系统一无所知那更加谈不上后台开发了所以要先学习linux系统操作不如文件管理系统命令文件系统权限管理系统服务等。
至于shell script 就类似win的批处理脚本相信我你在linux下干活早晚会需要它所以趁早系统学起来。
#### 推荐书:
[《鸟哥的Linux私房菜基础学习篇》](https://book.douban.com/subject/4889838/) 这个系列还有一个服务器架设篇,前期学习个人感觉没必要看
[《Linux Shell脚本攻略》](https://book.douban.com/subject/6889456/)
[《Shell脚本学习指南》](https://read.douban.com/ebook/124173616/?dcs=subject-rec&dcm=douban&dct=6889456)
## Linux环境高级编程
**普通用户只需懂系统操作,软件开发人员还要懂编程接口。**上一阶段你已经能够完成熟练操作Linux系统知道一些常规的系统命令和服务并且能够利用shell script写一些小工具提高日常开发效率。
我们的目标是星辰大海作为软件工程师还需要更加深入的掌握linux系统编程技巧**学习系统编程接口、系统调用API、内存管理、进程间通信IPC**,这是本阶段的学习目的。
#### 推荐书:
[《UNIX环境高级编程》](https://book.douban.com/subject/1788421/) 这本是linux编程必看的APUE强烈推荐通读一遍后续值得反复翻阅。
[《Linux/UNIX系统编程手册》](https://book.douban.com/subject/25809330/) 这本书和APUE有点重复我看完APUE这本就跳着看了平常可以看目录查阅。
## Linux网络编程套接字
在同一台机器上进程间的通信IPC有多种方式可以是通过**消息队列、FIFO、共享内存**等方式。网络编程套接字是指:分布在不同机器上的程序通过系统提供的网络通信接口,跨越网络将不同机器上的进程连接起来,实现跨机器的网络通信。一般有**UDP套接字、TCP套接字、Unix Domain当然如果你是通信从业者对SCTP套接字肯定也不会陌生。**
#### 推荐书:
[《UNIX网络编程 卷1套接字联网API第3版](https://book.douban.com/subject/4859464/)
[《UNIX网络编程 卷2进程间通信第2版](https://book.douban.com/subject/26434599/)
## 数据库和存储
**程序运行数据都在易失性的内存中,需要持久化存储时就需要数据库。**一个后台服务系统一般来说都需要考虑数据落地和持久性存储的问题,这时就会涉及到数据库选型和应用,数据库分为关系型数据库和非关系型数据库。
**关系型数据库:**指采用了关系模型来组织数据的数据库代表是MySql。
关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
**非关系型数据库:**以键值对存储且结构不固定每一个元组可以有不一样的字段每个元组可以根据需要增加一些自己的键值对不局限于固定的结构可以减少一些时间和空间的开销。代表有redis、memcached腾讯内部组件ckv也是非关系型数据库。
#### 推荐书:
[《SQL必知必会》](https://book.douban.com/subject/24250054/)
[《高性能MySQL》](https://book.douban.com/subject/23008813/)
[redis官方文档](https://redis.io/documentation) [redis中文网](http://redis.cn/)
> 关于redis还有很多应用比如基于redis的分布式锁的应用高并发抢红包模型等这个后面可以写一篇关于分布式锁的原理和应用文章。
## 算法基础
**计算机算法就是利用编程语言编写出计算机能理解的解决问题的方法。** 好的算法能更简洁高效的解决问题,如今不论是校招还是社招,大厂笔试都会考察算法,即使不是为了笔试作为软件从业者也应该经常练习算法,保持手感。学习算法是学习解决问题的通用性方法有助于提高逻辑思维能力。
#### 学习方法
**就我个人经验来说,不推荐直接啃书的方式学习算法,建议看书的同时结合刷在线编程算法题的方式。**具体的:边看数据结构或算法导论,同时在[牛客](https://www.nowcoder.com/activity/oj)或者 [leetcode](https://leetcode-cn.com/ )上刷题,因为看书太枯燥很容易失去耐心,在线刷题的好处是你可以每天定目标,享受每个题目通过的快感,有正向反馈更容易坚持下来。
## 架构能力
**架构能力是利用已有知识来设计整个后台服务系统的能力。**不仅要求掌握技能的维度还要深度,需要能根据不同需求和系统约束,制定不同的设计方案,这时候考虑的东西会更多,包括服务模型的设计:是多进程还是多线程甚至协程微线程,分布式还是集中式;存储的选型:考虑数据库选型用哪个?需要根据存储的数据特征和应用场景来区分,如果是社交应用的数据用菲关系型数据库来存储可能更好,如果是电商订单类型的数据,那么用关系型数据库来存储可能更好;后台系统的其他方方面面。
## 更多的练习
**说了这么多,最最重要的还是练习练习练习。**理论知识储备是必要条件,移动互联网时代大家接触到的碎片化信息太杂太乱,我个人经验,高浓度的知识精华还是需要在大师的书本中汲取,所以看书是最正确和快速的学习路径,没有捷径可走。
不过光看书也是不行,编程能力和技术是也是一门现代手艺活,还需要日常不断的打磨手艺,正如**一万小时定律**
> 人们眼中的天才之所以卓越非凡并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。要成为某个领域的专家需要10000小时按比例计算就是如果每天工作八个小时一周工作五天那么成为一个领域的专家至少需要五年。这就是一万小时定律。
怎么打磨提高编程技术能力呢?找项目,**找感兴趣的**东西用代码去实现它兴趣是最好的老师这点在编程和技术学习上也完全适用人们总倾向于去做快速获得的愉悦感的事情比如打一盘游戏30分钟就能获得快感。相反技术碎片的提高是一个长期的过程三分钟热度肯定是难以成功的所以要用技术做自己感兴趣的东西和带趣味性的编程比如写个爬虫小程序抓取网站数据或者写个小游戏再或者自己造轮子给自己用并乐此不疲的优化轮子。这样每走一步都能获得一点成就感激励自己继续走下去慢慢的一定会有质的飞跃。
## 一个网站
这个网站一定要告诉大家网站就是个C++百科全书类似Linux的man手册平常开发查忘记了函数名或者容器用法直接搜索非常方便我下载了离线版本如果嫌麻烦懒得找下载文件可以私信我留邮箱发给你。
网址C++参考: [cppreference](https://en.cppreference.com/w/cpp)
## 待续
一口气写下来肯定还不够完善,文章会保持更新和修改,想到了再补充吧。感兴趣可以关注我和专栏接收更新提醒。