前言
这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」。前端
这样的文章相信你们都见得很多了,写以前也很是忐忑,能不能和其它人写得不同, 也定下了一个目标,这篇文章,不能是简单的堆砌学习资源和书单推荐,更要细化如何有效的去执行落地。git
争取作到让看到的同窗有一种相见恨晚的感受哈哈哈。程序员
因此你们能够试着看一下,帮我检查下有没有达到预想的效果哈哈,但愿不要被打脸🤣github
那就正式开始吧。面试
这篇文章会有点长有点干,能够先去冲杯咖啡,慢慢看~算法
正文 | 干货 |收藏
1、后端/后台/服务器开发?
常常在各大公司招聘上看到后端、后台、服务器开发等等,有些同窗常常被这些名词搞混。docker
其实这些名词都是相近的,可是也有点区别,这里说说个人理解:数据库
-
首先通常公司分为前端和后端,前端就是和用户打交道的,负责用良好的视觉效果将数据呈现给用户,广义的前端包括客户端(安卓、IOS)、Web前端、小程序等。编程
-
而与之对应的后端则是负责业务逻辑处理,好比下单、支付等,重在业务流程的处理。小程序
后台通常和后端是一个意思,而服务器开发则稍微广义一点,不只包含了后台开发,并且也包括支撑整个后台应用的基础开发,好比搜索引擎、微服务、RPC 框架、KV、存储、MQ 等。
后台/后端重在业务处理,是偏向应用层开发,而服务器开发不只包括应用层开发,更是囊括了整个支撑后台业务的相关组件的开发。
那 Linux C/C++ 服务器/后台开发指的什么呢,其实就是基于 Linux 上 的 C++ 编程。
可是相比 Java 系更强调 Linux 系统编程、网络编程能力,有的还会涉及到服务端底层协议和网络框架开发。
传统的 Java 、Go后台开发偏向 Web 开发,也就是接收前端请求,经过微服务互相调用,完成业务逻辑处理,而后返回给前端。
实际上在腾讯这边的 C++ 后台开发,也是相似的,自己有很是成熟的基于 C++ 的微服务体系,大多数开发也只须要关注业务逻辑就好,不过仍是会要求 Linux 系统编程、网络编程等能力。
2、后台开发都考察哪些?
通常来讲 Linux C/C++ 后台开发方向涉及如下这些基础知识:
- C/C++ 语言特性和实现原理
- 计算机网络
- 网络编程 和 Linux 系统编程
- 操做系统原理
- 部分 Linux 内核原理,如内存管理、文件系统、虚拟内存等
- Linux 常见命令使用
- 算法与数据结构
- 数据库使用及原理
- 常见 NoSQL组件,如 Redis、Memcached
- 版本控制 Git
非必选加分项:
- 分布式相关,如一致性协议好比 Raft 算法、分布式存储等
- docker、k8s 等虚拟化和云计算相关的
- 系统设计能力,如短链服务、评论服务、Feed流系统、抢红包、秒杀等
因为篇幅限制,这篇文章主要介绍基础知识的学习路线和方法,其它加分项之后再单独写。
3、C/C++
首先是语言的基础知识,一些关键字和实现原理等:
- 指针、引用、数组、内存
- 引用与指针区别
- C 和 C++ 的一些区别,好比 new、delete 和 malloc、free 的区别
- 虚机制:虚函数、虚函数表、纯虚函数
- 继承、虚继承、菱形继承等
- 多态:动态绑定,静态多态
- 重写、重载
- 智能指针原理:引用计数、RAII(资源获取即初始化)思想
- 智能指针使用:shared_ptr、weak_ptr、unique_ptr等
- 一些关键字的做用:static、const、volatile、extern
- 四种类型转换:static_cast, dynamic_cast, const_cast, reinterpret_cast
- STL部分容器的实现原理,如 vector、deque、map、hashmap
- 模板特化、偏特化,萃取 traits 技巧
- 编译连接机制、内存布局(memory layout)、对象模型
- C++11 部分新特性,好比右值引用、完美转发等
这里列出来的只是一些比较重要的部分,实际上可能只算 C++ 的冰山一角, 你们且学且珍惜吧,这不 C++11 还没整透彻,C++ 20 又出来了,生命不息,学习不止。
怎么学?
1. 《C++ Primer》
这本书基本包括了 C++ 11 的所有特性,最好把前面三部分:C++基础、C++标准库、类设计者的工具都看一遍,我当时花了一个多月断断续续看到了第16章模板那里。
2. Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》
第一本是重点,光看《C++ Primer》缺乏实践的话,大几率还写不出合格的 C++ 代码,而《Effective C++》就是经过 55 条很是具体的作法告诉你什么样才是符合 C++ 编码规范的,能够缩短你写出合格 C++ 代码的时间,减小踩坑,强烈推荐必读,后面两本优先级稍低,能够有时间再读。
3. 《STL 源码剖析》和《深度探索 C++ 对象模型》
看完 Primer 和 Effective,你应该已经可以比较熟练的使用C++了,可是还缺乏对 C++ 底层实现机制的认识。好比虚函数表、成员变量布局等,同时对于 STL 库可能也仅仅停留在使用上。
推荐的这两本能够分别完善你在 C++ 底层实现和 STL 源码、原理上的认识。
以上书籍同时建议和侯捷老师的视频配合服用,效果更佳。
直接在 B 站搜索「候捷 C++」便可,主要有如下几个系列:
- 《C++内存管理》
- 《STL源码分析》
- 《C++ STL与泛型编程高级》
- 《C++11 新特性》
我基本都看了,收获挺大的,建议看下,能够开倍速。
看完以上资料,算是 C++ 入门了,应付面试也是足够的,基本到达了正确高效地使用 C++ 这一层面。
是否是听到这有点崩溃,特么的看了这么多,才入门???
若是你想在 C++ 语言上更进一步,那么有如下的书籍推荐:
- 《C++ 语言的设计与演化》
这本书是 C++ 之父 Bjarne Stroustrup 写的,关于 C++ 的前世此生,以及将来的演进方向,能够了解 C++ 的设计哲学。C++ 复杂的语言特性一直让人诟病,经过这本书,能够看到各类特性引入的目的,也更深刻了解到了 C 和 C++ 之间关系。好比 C++ 里有个原则就是全部的实现机制都不能带来额外的运行时开销。
我也正在看这本书。
-
《C++ 沉思录》
-
《C++ Templates》和《C++模版元编程》
C++模板元编程属于另一个世界了,通常公司里开发用得比较少,这个也是一个大坑,若是实在感兴趣能够去看看,感觉下 C++ 的博大精深,不过这玩意我也不太会,也不推荐你去花时间在上面。
- CppCon视频
这是 C++ 社区组织的相似开源峰会那种,每次都会讨论一些关于 C++ 的话题,没事去刷一个,仍是挺有意思的。Youtube 直接搜 CppCon 便可找到。
4、操做系统
操做系统这门课,个人感受是易学难精,可是掌握到平常编程和面试够用仍是比较容易的。
那么毕业生或者说你去准备校招面试应该达到怎样的水平:
- OS 四大模块的理论知识: 进程与线程管理、内存管理、IO与文件系统、设备管理
- 了解 Linux 内核部分实现原理,如内存管理、进程管理、虚拟文件系统等
其中内存、进程、IO 是重点,这几块也是和编程关系最密切的,这里推荐先挑本偏理论的书看看,了解操做系统的全貌:
- 《现代操做系统》
- 《操做系统—精髓与设计原理》
没必要全看,二者任选一本都不错,我本身是仔细看了第二本,由于是咱们教材,同时挑着看了现代操做系统部分章节。
这部分看完你应该对下面这些话题有一个清晰认知了:
- 操做系统由哪些构成
- 进程的状态、切换、调度
- 进程间通讯方式(共享内存、管道、消息)
- 进程和线程的区别
- 线程的实现方式(一对1、多对一等)
- 互斥与同步(信号量、管程、锁)
- 死锁检测与避免
- 并发经典的问题:读者写者、哲学家就餐问题
- 为何须要虚拟内存,MMU 具体如何作地址转换的
- 内存为何分段、分页
- 页面置换算法
- 文件系统是如何组织的
- 虚拟文件系统(VFS)是如何抽象的
- ...
可是这还不够,看完偏理论的书,当面试官问「进程和线程的区别」时。
大概只能回答出「进程是资源分配的最小单位,线程是CPU调度的最小单位,balabala...」这样正确却普通的答案。
可是若是你了解 Linux 内核的实现,就能够实际出发,讲讲 Linux 中进程和线程是如何建立的,区别在哪里。
好比在 Linux 中进程和线程实际上都是用一个结构体 task_struct
来表示一个执行任务的实体。进程建立调用fork
系统调用,而线程建立则是 pthread_create
方法,可是这两个方法最终都会调用到 do_fork
来作具体的建立操做 ,区别就在于传入的参数不一样。
深究下去,你会发现 Linux 实现线程的方式简直太巧妙了,实际上根本没有线程,它建立的就是进程,只不过经过参数指定多个进程之间共享某些资源(如虚拟内存、页表、文件描述符等),函数调用栈、寄存器等线程私有数据则独立。
这样是否是很是符合理论书上的定义:同一进程内的多个线程共享该进程的资源,但线程并不拥有资源,只是使用他们。
这也算符合 Unix 的哲学了— KISS(Keep It Simple, Stupid)。
可是在其它提供了专门线程支持的系统中,则会在进程控制块(PCB)中增长一个包含指向该进程全部线程的指针,而后再每一个线程中再去包含本身独占的资源。
这算是很是正统的实现方式了,好比 Windows 就是这样干的。
可是相比之下 Linux 就显得取巧不少,也很简洁。
对于进程、线程这块你还能够把 fork、vfork、clone 、pthread_create 这些模块关系完全搞清楚,对你理解 Linux 下的进程实现有很是大的帮助。
说了这么多,就是想强调一下理论联系实际的重要性。
特别是操做系统,最好的实践就是看下 Linux 内核是怎么实现的,固然不是叫你直接去啃 Linux 源码,那不是通常人能掌握的。
最好的方式是看书,书的脉络给你理得很清晰。
书籍推荐:
- 《Linux内核设计与实现》
这本书恰到好处,即讲清楚了内核实现的要点,又不会通篇源码。
这本书重点关注「第 3 章进程管理」、「第 5 章系统调用」、「第12章内存管理」、「第13章虚拟文件系统」、「第 15 章进程地址空间」
这些章节属于操做系统核心部分,其它如中断处理、块 IO、设备管理根据你本身兴趣选择看下就能够了。
基本上作到这里,操做系统就没什么大问题了。
5、计算机网络
须要掌握的网络协议和知识:
- HTTP、TCP、IP、ICMP、UDP、DNS、ARP
- IP地址、MAC地址、OSI七层模型(或者 TCP/IP 五层模型)
- HTTPS安全相关的:数字签名、数字证书、TLS
- 常见网络攻击:局域网ARP泛洪、DDoS、TCP SYN Flood、XSS等
计网知识比较繁杂,不少同窗都反映网络很难学,一大堆的网络协议,依次学完后,仍是不知道网络是怎么构成的。
这就是没有用对学习方法,致使只见树木,不见森林。
学习时,推荐你抓住一条主线 「一个数据包是如何发送出去的?」
带着这个问题依次去学应用层、传输层、网络层、链路层,思考这些层之间是如何串联起来的。
这就是自顶向下的思路,那天然要推荐:
- 《计算机网络:自顶向下方法》
这本书从咱们最常接触的 HTTP、FTP、SMTP 等应用层协议讲起,能够清晰看到引入各个层的做用。
好比为了区分同一个主机的不用应用,引入了传输层,并使用不用的端口号做为区别;
为了在不一样子网间传输数据引入了网络层,并使用 IP 地址寻址路由;
网络层解决了不一样子网间路由的问题,可是同一个局域网内肯定主机倒是经过 MAC 地址,因此引入了链路层来承载 IP 数据包;
同时为了将 IP 地址和 MAC 地址作转换映射又产生了 ARP 协议。
层层递进,逐层揭开网络,很是推荐!
还有一本书:
- 《网络是怎样链接的》
很是浅显易懂的描述了「一个数据包是如何发送出去的」,也不费时间,看惯了机工社的大黑书,看这种反而有种看小人书的感受,有基础的话,一天左右就过完了。
只有把握住了整个网络脉络主线才不至于被纷繁复杂的网络协议所搞晕,剩下的就是不断的细化,填充这些主干上的细枝末节。
那么有哪些细节能够去填充呢?
好比 ARP 工做过程、IP 地址、IP 分片、NAT(UDP 打洞)、链路层访问控制协议等等。
还有最重要的 TCP 协议,TCP 也是面试和计网中最重要的概念:
- 三次握手、四次挥手
- 状态转换
- TCP 状态中 TIME_WAIT
- 拥塞控制
- 快速重传、慢启动等
这么多东西确定须要背,但不要死记,最好带着问题去思考为何要这样作。
这里列几个问题:
-
TCP 如何实现可靠传输的(画外音:如何基于 UDP 实现可靠传输
-
TCP 链接创建为何不是两次握手(画外音:三次握手的充分必要性说明
-
TIME_WAIT 的存在解决了什么问题,等待时间为何是 2 MSL
整个 TCP 的核心就是围绕着 可靠传输 + 高效传输(流量控制和窗口管理)
因为 TCP 的细节实在太多,自顶向下那本书有点不太够,因此你须要去看看:
- 《TCP/IP详解卷1:协议》
这本书不要从头看,而是挑出其中涉及到 TCP 的章节
到这里,对于整个网络以及 TCP 都应该有了一个全面而细致的认识。
可是计网中仍是有一些有意思的问题,若是你没思考过,也许回答不出来。
好比:
- 为何有了 MAC 地址还要 IP 地址,IP 地址和 MAC 地址的区别是什么?
- 如何理解广播域和冲突域?
- 路由器和交换机有什么区别?
- TCP 链接的本质是什么,真的是“连接”吗?(曾经被问过:Java socket 建立的 TCP 链接,对于主机挂了和 JVM 挂了有什么区别?
这些问题只有当你真正理解了才能回答出,仅仅记住协议的话,估计很难应对灵活的面试题。
此外,网络部分还须要准备 HTTP、HTTPS,推荐:
- 《图解HTTP》
最后别忘了本身回答一遍那被问烂了、写烂了的问题:
- 从 URL 输入到页面展示到底发生什么
越细越好,五百字以上吧,哈哈哈
6、网络编程
C++ 后台开发基本是离不开网络编程的,其实甚至整个后台开发也能够看作是在作网络编程。
只不过别人的框架帮咱们作了协议解析、网络数据传输、解封包这些底层操做。
好比 SpringBoot 这种保姆级框架,基本上属于将一个框架能干的事都干完了,以致于咱们开发业务只须要定义接收和返回包的数据格式,而后作逻辑处理就完了。
像序列化、解封包、IO 处理这种网络编程必备的脏活业务开发根本不会接触到。
可是网络编程技能仍是很重要的,特别是对于 Linux C++ 开发来讲。
Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:
- 进程间通讯方式:信号量、管道、共享内存、socket 等
- 多线程编程:互斥锁、条件变量、读写锁、线程池等
- 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
- 高性能 IO 两种模式:Reactor 和 Proactor( 可是 Linux 下因为缺乏异步 IO 支持,基本没有 Proactor
- IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)
推荐的书:
- 《Unix网络编程》
- 《Unix环境高级编程》
这两本是砖头书,虽然是网络编程和 Unix 系统编程方面的无出其右的圣经,但主要用途仍是垫显示器(逃, 我的以为这种书不是面向读者的,具体缘由和如何阅读这种书在后文介绍。
- 《Linux高性能服务器编程》
我强烈推荐,这本书前半部分基本是在重复计网基础知识,可是后面几章关于高性能服务器程序框架、高性能IO、IO复用、定时器、多线程编程、线程池和进程池仍是讲得很是全面到位的,值得一看,看完基本上对于整个网络编程就有了框架。
- 《Linux多线程服务器端编程》
这本书一样强烈推荐,这是陈硕大佬写的书,说实话第一部分:C++ 多线程系统编程都直接把我看蒙了,没有想到 C++ 里要作到线程安全这么难,第一章我看了两三遍才看懂吧。。。这是可贵的讲解 C++ 多线程编程的书。
而且在书中,陈硕大佬用了一章讲解了 Muduo 网络库设计与实现,Muduo 比较适合学完基础的网络编程后继续进阶学习如何设计和写一个网络库,是一个高质量的 Reactor 网络库,采用 one loop per thread + thread pool 实现,代码比较简洁,书和源码搭配着看做为学习网络编程方面来讲是很是不错。
学完网络编程就能够写点小项目练手了,这里列举几个项目:
-
HTTP 服务器,这个彷佛成了 Linux C/C++ 人手一个的项目了?
这里推荐两个作为参考:
https://github.com/imarvinle/WebServer:这是我看完高性能服务器编程后写的
https://github.com/linyacool/WebServer :这是牛客 linya 大佬写的
不过 HTTP 服务器看着挺简单的,可是能够扩展写的地方仍是挺多的,好比能够加入代理功能,这部分我在留学生 lab 中写过,可是没有集成到这个里面来,能够加入日志库,能够添加 CGI 支持等等。
-
网络库
这个也算是造轮子了, 能够就采用 one loop per thread + thread pool 这种模式,先去看懂 Muduo 源码,而后本身再写一个相似的,这个过程就算是抄,你也能够学到很多东西的,学编程不就是这样先看,再模仿、修改,而后创新吗?
-
RPC
写一个 PRC 你须要考虑到序列化、网络传输、服务发现等,比较有名的有 grpc、brpc,这两个网上文档都比较完善,能够学习一下实现原理。
这里还有一个简单版本的:https://github.com/guangqianpeng/jrpc
-
相似QQ的网络聊天室
简单版的就能够直接在局域网内实现群聊、单聊等。
更进一步能够考虑一下如何不经过服务器中转消息实现 P2P 聊天,相似 QQ,这里会涉及到 UDP 打洞、NAT 转换等知识,仍是颇有意思的,我大二用 Java 搞过。
7、系统级编程
做为 C/C++ 程序员,编写的程序不像 Java、Python 这些是在虚拟机上,直接就是在操做系统上运行,那么就必须了解操做系统底层机制和运行原理。
就和 Java 程序员要求了解 JVM 是一个道理,你得熟悉代码运行的平台,才能在出问题的时候准肯定位到。
这个也是在咱们学校在大三开设的一门课程《System Programing》,从 CMU 引进的,教材也是沿用 CSAPP,这也是我以为大学上过最值的课了。
我从新认真读 CSAPP 就是在大三上这个课期间,包括作了每一个章节附带的 lab, 这是我当时作 Bomblab 的题解:
https://www.jianshu.com/p/479333cbccc4
这里推荐两本书:
- 《深刻理解计算机系统》
不须要我多介绍了
- 《程序员自我修养》
别被名字欺骗了,这不是教你养生的,而是学了会掉头发的硬核知识
两本书侧重点各不相同,CSAPP 很是巧妙的把数字电路基础、二进制与指令集体系、汇编语言、程序设计及优化、存储器体系结构、连接与装载、进程、虚拟内存这一堆来自各不一样的计算机学科的核心知识点串在一块儿,并以程序员的视角呈现,因此这本书的英文名字叫《Computer Systems A Programmer's perspective》。
而程序员自我修养则重在连接、目标文件、装载、库与运行时,看完这本书你会了解到一个 C/C++ 程序是如何被编译成目标文件的,以及 Linux 下目标文件的格式,不一样目标文件又是如何被连接成一个可执行程序,在连接时如何处理符号、重定位、地址解析等,以及静态连接、动态连接区别等等,最后可执行文件又是如何被加载进内存,如何和虚拟内存空间映射的。
你可能会以为这个又是只能用于面试,实际派不上用场的知识?
那简直大错特错,说真的,这两本书,我是反复看了三遍以上,固然后续看都是挑着重点看的。
举个例子吧,写 C/C++ 的同窗没少遇到这些编译错误吧:
undefined reference to xxx
Symbol key multiply defined (by xxx.o and yyy.o)
在我大一的时候遇到这些问题简直一脸懵逼,根本连报错都看不懂。
特别是涉及到多文件编程的时候,常常傻乎乎的在头文件中定义变量,致使变量多重定义,这些问题没有学过连接知识的其实很难理解。
在实际编程也是常常会遇到的。
又好比extern
、static
这些关键字是如何在编译连接时起做用,变量的申明与定义又有什么区别?
这部分能够算是真正的内功了,提高你对计算机系统的理解,也有助于解决实际编程过程当中会出现的问题,固然也会在面试中出现。
8、数据库
数据库首先要学会 SQL 的使用,这里推荐《MySQL必知必会》。
数据库原理方面能够看看《数据库系统概念》,这本书挺厚的,包含了从 SQL 到数据库设计再到数据库原理、分布式数据库都有,能够挑着看,好比关系模型、数据库设计(三大范式)、数据磁盘存储和组织方式、索引、并发控制等。
固然了整个数据库最重要的仍是索引和并发控制(锁、MVCC等),这部分也是面试常考的:
-
索引存储结构:B树、B+树索引、Hash索引
-
索引的使用:主键索引、覆盖索引、最左前缀原则、索引下推等
-
锁:乐观锁、悲观锁、表锁,行锁,意向锁,读锁,写锁等等
-
MySQL InnoDB MVCC 实现机制
-
存储引擎:InnoDB、MyISAM等,各自的优缺点
-
事务:ACID理论
这部分推荐两本书:
- 《高性能MySQL》
- 《MySQL技术内幕》
这两本主要对索引、innodb存储引擎、锁、并发控制讲得比较清楚,建议挑对应章节看。
9、算法和数据结构
首先须要掌握常见的数据结构:
- 线性表、数组、链表
- 栈与队列
- 树、二叉树、多叉树实现和遍历方式,AVL树实现以及插入删除过程、红黑树(了解定义便可)
- 图,以及图的实现方式、遍历
- B树、B+树
- 堆
- 散列函数和散列表
常见的算法:
- 排序算法:冒泡、插入、快速、希尔、堆排、基数、归并等
- 字符串匹配算法:KMP
- 常见算法思想:递归、枚举、递推、分治、贪心、动态规划等
视频能够看看 :
- mooc 上浙大的《数据结构》
- 学堂在线上清华邓俊辉老师的《数据结构与算法》
这两个是我看过以为不错的才在这推荐,第一个是初学数据结构时跟着看,第二个是大三复习时刷的。
入门版书籍能够看看:
- 《啊哈算法》
- 《算法图解》
稍微进阶点的:
- 《算法第四版》
这本书强烈推荐,难度适中,可是全面。
终极版:
- 《算法导论》
这个量力而行就行了。。。
推荐理由是:我不推荐显得没有逼格(:
有了基础的算法思想和数据结构储备,剩下的就是刷题了:
- 《剑指offer》
建议必刷
- leetcode
建议分类刷,先易后难,好比数组、二分、二叉树、动态规划,一个一个系列搞定,总结经验,保证 150 道简单和中等以上吧
最重要的是,保持手感,有空就刷一道。
10、网站和视频
有些同窗喜欢看视频,那我也在这里统一推荐一下吧
- B站
你的一站式学习网站,用你想学的关键字在这搜就完了
- 中国大学 mooc
基础课程学习
- 网易云课程、学堂在线
一些技术课程、公开课学习
Linux C/C++ 能够去看看黑马的,我试看过几集 IO,讲得仍是不错的,就是有点慢,我的以为不如看书。
刷题能够看看牛客左神的视频
计算机网络能够看看 B 站韩立刚或者 mooc 哈工大的
操做系统能够看看学堂在线上清华的《操做系统》
推荐了这么多书,从哪看起?
1、浅谈学习方法
若是你认真看过我前面介绍每一部分的学习路线时,能够发现我特别强调学习抓主线,而且将每个基础知识的主线给你们列出来了。
这里再次强推,学习新东西的时候,重点是先对总体脉络、知识结构有一个大概的映像和了解,而后抓住这个领域的主线,顺着主干,突出重点去学习。
集中时间,速战速决,不要将时间线拉得太长,越长可能越坚持不下去,效果越差。
对于细枝末节的内容,能够留到实践的时候,用到了再去查!
若是一头扎进零碎的知识,去看手册、字典型的书,那必然是事倍功半的。
细节留给实践去补充,咱们的时间要花在刀刃上,注重知识的体系性和框架的创建。
2、常见问题
说实话,其实这些书籍或多或少都被各路大神推荐过,确实经典。可是大神们却不多告诉你他们是如何去看的,该怎么去看这些书,难道一本本一页页的挨着啃吗?
这部分才是我今天最想说的部分,「该如何去看大厚书」。
好比我后台就常常有同窗问:
- 有些书看的找不到重点,看不下去了,怎么办,好比深刻理解计算机系统,UNIX 网络编程,APUE,求指教
- 我不是科班 CSAPP 可能不是所有看得懂,该怎么办?
- 大佬,这么多书看得完吗?
- 刚开始看这些书很痛苦怎么办?
这些书该怎么看,可能过来人,准备过秋招的都比较清楚,可是做为还在大2、大三的会比较懵逼。
就拿我当时亲身经从来说,在网上搜网络编程如何学习,不少人都推荐 UNP、APUE。
好嘛,买来看,从第一页挨着挨着看,并且书中的示例代码我大部分也照着敲了,最后看了七八章,发现始终是在学一些 socket api 和 系统 api 的用法,没摸到网络编程的框架思惟。
后面我又去搜,看到有人推荐《Linux高性能服务器编程》,去豆瓣看了下了目录,彷佛正是我想要的东西。
直接找来 PDF 开始看,果真这本书才真正让我理解了网络编程的整个套路和框架,学到了各类事件处理模式、计时器、信号处理、线程池这些网络编程中很重要的东西。
固然 UNP 和 APUE 也是不能丢的,这两本书我当作了字典查询,好比学到了 IO 部分,回去看 UNP 中关于五种 IO 模型的介绍。
用到 connect、listen、bind 这些函数,再回去看 UNP 第四章,不得不说,UNP 关于这些 socket API 的使用和各类异常状况的处理方式都介绍得很是详细和深刻,不愧是网络编程领域的圣经。
可是初学者看却容易在细节中迷失,抓不到纲领,这也是这类书的缺点。
相似 UNP、APUE 这种书自己是面向知识体系的,而不是面向读者,它们其实更像字典,把这个领域内的全部知识,很是细致的堆叠在一块儿,看上去就是平铺直叙,充斥着细节,对读者极其不友好。而且书里内容实在大而全,不少根本不用学。
好比 UNP 讲了 sctp 这种协议用法、多播、unix 域协议这些实际用得不多的东西,挨着看不只会看不下去,并且比较浪费时间。
可是它们又是经典的,确实是这些领域内在体系性和深刻性上都作得很是好的书。
什么书才是面向读者的呢?
那就是抓住该领域的核心主干,提纲挈领,带领读者由浅入深,同时又有必定的细节,看完让人茅塞顿开。
好比《自顶向下》、《Linux高性能服务器编程》、《Linux多线程服务端编程》、《STL源码剖析》、《Effective C++》、《CSAPP》、《程序员自我修养》等都有各自想要论述的主线在里面,看起来也是一环扣一环,很是按部就班。
个人看书方法就是对于面向知识体系那种堆砌细节的书,咱们先浏览目录,作到对整本书有映像,再大体看一些咱们关心的部分,好比 UNP 和 APUE 中 IO、文件、进程控制、信号、线程、线程控制、基本套接字编程 这些是比较重要的模块,其它边角知识,能够用到再去查。
还有一点,不少同窗反映看不懂相似 CSAPP 这样的书,那咱们都知道,任何一本书基本上都是有前置依赖的。
没有掌握要求的背景知识去看确定很吃力的。
就好比我大一下只有基础的 C 知识和一丁点计算机导论知识,而后屁颠屁颠的跑去看 CSAPP(学长毕业摆地摊卖书我瞎买的),那时候只知道这本书被誉为神书,可是看到前两三章就蒙了,真的有点难,对于当时的我来讲太底层了,根本不知道在说啥,看过也只是看过,就像天空飞过鸟儿,但没有痕迹。
直到后来大三再次拿起,我才意识到这本书的伟大之处就在于将计算机不一样学科知识有机的串在了一块儿。那时候看,更可能是一种补充、深刻学习以及完善了,由于不少知识分别在数字逻辑、汇编语言、操做系统这些课程中学过了。
因此要明白,你看不懂不是由于你笨没天赋,而是你有前置依赖的知识没有完成,还没学会走,就想跑了。
通常来讲,每本书的首页会介绍看这本书须要哪些前置知识,能够关注一下。
还有一种看书的方法,我在复习的时候采用过,那就是横向学习。
好比我复习操做系统,在《操做系统:精髓和设计原理》中看到了关于内存、虚拟内存的各类介绍,看完理论再去看《Linux内核设计与实现》12 章「虚拟内存」、15 章『进程地址空间』,最后再去看《CSAPP》第 9 章『虚拟内存』,这样看下来,基本上内存这块理解得比较透了,这些书关于这块的介绍是各有优缺点的,正好互补。
又好比在《精髓与设计原理》中介绍了进程加载和连接,其实讲得比较偏理论,看完仍是以为似懂非懂。
那我又会去《CSAPP》看第 7 章「连接」,这一章基本讲清了静态连接、目标文件、可重定位目标文件、引用解析、加载这些关于连接的核心概念,可是一个章节讲这么多,不免不够深刻。
我又会去看《程序员自我修养》这本书第 4 章「静态连接」、第 6 章 「可执行文件的装载与进程」、第 7 章 「动态连接」,这本书核心主题就是连接、加载,因此这一路看下来,对于连接、加载这块基本上搞得比较透彻了,也许没几个面试官有你清楚。
一样索引你也能从《数据库系统概念》、《高性能MySQL》、《MySQL技术内幕》中挑选对应的章节,串起来看,取每本书优势,这样学习真的很高效也很深刻。
这就是我在复习的时候采用的用知识点串联,跨多本书高效精准的复习方式,效果也很不错,春招十几回面试没有一次由于这些基础知识挂过。
啰嗦了一大堆,就是回答这些问题的:
“有些书看的找不到重点,看不下去了,怎么办,好比深刻理解计算机系统,UNIX 网络编程,APUE,求指教”、“我不是科班 CSAPP 可能不是所有看得懂,该怎么办?”、“大佬,这么多书看得完吗”、“刚开始看这些书很痛苦怎么办”
3、要花多久时间才能学完
这个很差说,根据你的基础和学习效率不一样,好比我大1、大二对于一些基础的知识学得比较认真,基础还算能够,按照这样一套走下来也就大半年。大概天天花四五个小时以上吧。
若是真的是连计网、操做系统理论这样的东西一点基础都没的话,那估计得一年以上,毕竟这些内容基本覆盖了科班的核心课程,人家上三年课,你一年解决,已经算很快了好吧。
一年真的足够从小白学起吗?
感受是差不太多的,可是估计得天天付出五六小时以上了,而且学习方法得当。
你去牛客就会发现,存在各路大3、研一自学转码的同窗,最后还能成为 offer 收割机,因此,不要怀疑一年不够,最关键的是你要找到正确的路线,而后执行下去。
文中推荐的书真的所有要看吗?
固然不是,我本身都没看完,可是个人策略已经说过了,基本上大部分书都看了重要的章节,这样看起来是很快的。
而且随着你看书愈来愈多,基础愈来愈好,你会发现每本书前面几章都是铺垫基础知识,大部分能够直接跳过,举个例子
《Linux高性能服务器编程》这本书前几章是这样的:
- 第1章 TCPIP协议族
- 第2章 IP协议详解
- 第3章 TCP协议详解
- 第四章 TCPIP通讯案例:访问Internet上的Web服务器
- 第五章 Linux网络编程基础API
你以为这些章节在看过《自顶向下》、《TCP/IP详解》以后还有必要看吗?我反正是半天扫过去就完了。
最后,无论说再多方法,再多的路线,最终都须要本身花时间去啃、去执行。
4、语言疑惑
还有一个不少选择 C++ 方向同窗都存在的疑惑,在这里我也想解释一下:
C++ 语言特性多,又难学,不少都是底层开发才会用到,C++ 就是个坑,是否应该转 Java、Go 呢?
固然不是的,的确在头条、美团、阿里这种业务部门使用 Go、Java 系更多,首先仍是那个观点,校招生对于企业来讲都是一张白纸,面试官考察的是你的基础知识和聪明度,来决定是否有培养潜力,语言确实不重要。
那你可能会说,明明各类面经上经常出现 ConcurrentHashMap、虚表、虚函数实现机制这样和语言强相关的问题。
在我看来啊,面试深刻问一些语言实现细节,其实不是在考你语言,而是看你是否有主动钻研的意识,是否是只停留在应用的层面,同时也借语言考察一些数据结构、操做系统方面的基础知识。
因此呢,我以为 C/C++、Java、Go 你深刻学习哪个均可以,关键仍是找对相应的学习路线,一直坚持学下去,不要天天都停留在我究竟是学 Java 好仍是 C++ 好这样无解的问题。
另外,想对学 C++ 的同窗说,可能你会发现身边同窗都在搞 Java、Go 之类的,找工做缺乏一些一块儿复习准备的朋友,有些甚至劝你别学 C++。那这个时候你必定要坚决本身的选择,多在牛客或者网上找找同方向的朋友一块儿交流、学习。
说实话,就找工做这块来讲,我的以为区别真的是不大的,无论从薪资、面试难度来讲都是差不太多,更多的仍是算法和基础知识。
并且也有很多同窗 Java 进腾讯须要转 C++,C++ 进阿里、美团须要转 Java 的,这都不是事儿。
那 C++ 目前应用场景有哪些呢?
一句话,对性能或者执行效率要求比较高的应用,好比游戏引擎、infra、推荐引擎、存储等,固然也能拿来写业务(没错说的就是鹅厂),也有作 C++ 客户端开发的,主要是 MFC、QT 等。
说实话,像游戏引擎、infra这类都是门槛比较高的,而且招聘的数量也有限,通常人很难进,并且目前互联网公司的业务部门大多使用的是 Java、Go这类语言。
因此 C++ 的需求量是相比 Java、Go 这类少不少的,可是同时学习 C++ 也没 Java 那么多,因此相对来讲竞争还没那么大,而且 C++ 学的不错,你一样能够去面阿里、美团这种 Java 技术栈的公司,大厂基本不会限制语言的。
平常求三连环节
这篇文章我预感到会写成万字长文,可是没办法,想表达的东西太多了,你们记得收藏~
还有,我把文章提到的这些书籍、资料、还有我面试时看过的一些面经、博客都汇总了,能够节省你去找资料的时间,若是须要的话,加我微信,我发给你。
固然了,要设置一点门槛哈,那就是你须要一键三连(转发朋友圈、点赞、在看)
相互成全,这样咱们都开心嘛嘻嘻
还有,你们收藏的时候记得把在看点一点哟,好让我知道有多少人在偷偷收藏哈~
我是小北,关注我,我们下周期见!
叮叮叮 !!!这里是留言区