乐趣区

关于后端:本科拿到BAT-SSP-offer我的Linux-CC后台服务器开发学习路线面经秋招

前言

小北去年经验春秋招,拿到了不少大厂 offer,其中包含 sp、ssp 等,感觉在温习筹备校招上还是有肯定办法的,因为我本人是 Linux C/C++ 路线。

所以这一篇的主题是「Linux C/C++ 服务器 / 后盾开发学习路线」。

这样的文章置信大家都见得不少了,写之前也十分忐忑,能不能和其它人写得不一样,
也定下了一个指标,这篇文章,不能是简略的堆砌学习资源和书单举荐,更要细化如何无效的去执行落地。

争取做到让看到的同学有一种相见恨晚的感觉哈哈哈。

所以大家能够试着看一下,帮我查看下有没有达到料想的成果哈哈,心愿不要被打脸????

那就正式开始吧。

这篇文章会有点长有点干,能够先去冲杯咖啡,缓缓看~

注释 | 干货 | 珍藏

一、后端 / 后盾 / 服务器开发?

常常在各大公司招聘上看到后端、后盾、服务器开发等等,有些同学常常被这些名词搞混。

其实这些名词都是相近的,然而也有点区别,这里说说我的了解:

  • 首先个别公司分为前端和后端,前端就是和用户打交道的,负责用良好的视觉效果将数据出现给用户,狭义的前端包含客户端(安卓、IOS)、Web 前端、小程序等。
  • 而与之对应的后端则是负责业务逻辑解决,比方下单、领取等,重在业务流程的解决。

后盾个别和后端是一个意思,而服务器开发则略微狭义一点,不仅蕴含了后盾开发,而且也包含撑持整个后盾利用的根底开发,比方搜索引擎、微服务、RPC 框架、KV、存储、MQ 等。

后盾 / 后端重在业务解决,是偏差应用层开发,而服务器开发不仅包含应用层开发,更是囊括了整个撑持后盾业务的相干组件的开发。

那 Linux C/C++ 服务器 / 后盾开发指的什么呢,其实就是基于 Linux 上 的 C++ 编程。

然而相比 Java 系更强调 Linux 零碎编程、网络编程能力,有的还会波及到服务端底层协定和网络框架开发。

传统的 Java、Go 后盾开发偏差 Web 开发,也就是接管前端申请,通过微服务相互调用,实现业务逻辑解决,而后返回给前端。

实际上在腾讯这边的 C++ 后盾开发,也是相似的,自身有十分成熟的基于 C++ 的微服务体系,大多数开发也只须要关注业务逻辑就好,不过还是会要求 Linux 零碎编程、网络编程等能力。

二、后盾开发都考查哪些?

一般来说 Linux C/C++ 后盾开发方向波及以下这些基础知识:

  • C/C++ 语言个性和实现原理
  • 计算机网络
  • 网络编程 和 Linux 零碎编程
  • 操作系统原理
  • 局部 Linux 内核原理,如内存治理、文件系统、虚拟内存等
  • Linux 常见命令应用
  • 算法与数据结构
  • 数据库应用及原理
  • 常见 NoSQL 组件,如 Redis、Memcached
  • 版本控制 Git

非必选加分项:

  • 分布式相干,如一致性协定比方 Raft 算法、分布式存储等
  • docker、k8s 等虚拟化和云计算相干的
  • 零碎设计能力,如短链服务、评论服务、Feed 流零碎、抢红包、秒杀等

因为篇幅限度,这篇文章次要介绍基础知识的学习路线和办法,其它加分项当前再独自写。

三、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 即可找到。

四、操作系统

操作系统这门课,我的感觉是易学难精,然而把握到日常编程和面试够用还是比拟容易的。

那么毕业生或者说你去筹备校招面试应该达到怎么的程度:

  • OS 四大模块的理论知识: 过程与线程治理、内存治理、IO 与文件系统、设施治理
  • 理解 Linux 内核局部实现原理,如内存治理、过程治理、虚构文件系统等

其中内存、过程、IO 是重点,这几块也是和编程关系最亲密的,这里举荐先挑本偏实践的书看看,理解操作系统的全貌:

  • 《古代操作系统》
  • 《操作系统—精华与设计原理》

不用全看,两者任选一本都不错,我本人是认真看了第二本,因为是咱们教材,同时挑着看了古代操作系统局部章节。

这部分看完你应该对上面这些话题有一个清晰认知了:

  • 操作系统由哪些形成
  • 过程的状态、切换、调度
  • 过程间通信形式(共享内存、管道、音讯)
  • 过程和线程的区别
  • 线程的实现形式(一对一、多对一等)
  • 互斥与同步(信号量、管程、锁)
  • 死锁检测与防止
  • 并发经典的问题:读者写者、哲学家就餐问题
  • 为什么须要虚拟内存,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、设施治理依据你本人趣味抉择看下就能够了。

基本上做到这里,操作系统就没什么大问题了。

五、计算机网络

须要把握的网络协议和常识:

  • 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 输出到页面展示到底产生什么

越细越好,五百字以上吧,哈哈哈

六、网络编程

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/…:这是我看完高性能服务器编程后写的

    https://github.com/linyacool/…:这是牛客 linya 大佬写的

    不过 HTTP 服务器看着挺简略的,然而能够扩大写的中央还是挺多的,比方能够退出代理性能,这部分我在留学生 lab 中写过,然而没有集成到这个外面来,能够退出日志库,能够增加 CGI 反对等等。

  • 网络库

    这个也算是造轮子了,能够就采纳 one loop per thread + thread pool 这种模式,先去看懂 Muduo 源码,而后本人再写一个相似的,这个过程就算是抄,你也能够学到不少货色的,学编程不就是这样先看,再模拟、批改,而后翻新吗?

  • RPC

    写一个 PRC 你须要思考到序列化、网络传输、服务发现等,比拟有名的有 grpc、brpc,这两个网上文档都比较完善,能够学习一下实现原理。

    这里还有一个简略版本的:https://github.com/guangqianp…

  • 相似 QQ 的网络聊天室

    简略版的就能够间接在局域网内实现群聊、单聊等。

    更进一步能够考虑一下如何不通过服务器直达音讯实现 P2P 聊天,相似 QQ,这里会波及到 UDP 打洞、NAT 转换等常识,还是很有意思的,我大二用 Java 搞过。

七、零碎级编程

作为 C/C++ 程序员,编写的程序不像 Java、Python 这些是在虚拟机上,间接就是在操作系统上运行,那么就必须理解操作系统底层机制和运行原理。

就和 Java 程序员要求理解 JVM 是一个情理,你得相熟代码运行的平台,能力在出问题的时候精确定位到。

这个也是在咱们学校在大三开设的一门课程《System Programing》,从 CMU 引进的,教材也是沿用 CSAPP,这也是我感觉大学上过最值的课了。

我从新认真读 CSAPP 就是在大三上这个课期间,包含做了每个章节附带的 lab,
这是我过后做 Bomblab 的题解:

https://www.jianshu.com/p/479…

这里举荐两本书:

  • 《深刻了解计算机系统》

不须要我多介绍了

  • 《程序员自我涵养》

别被名字坑骗了,这不是教你养生的,而是学了会掉头发的硬核常识

两本书侧重点各不相同,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)

在我大一的时候遇到这些问题几乎一脸懵逼,基本连报错都看不懂。

特地是波及到多文件编程的时候,常常傻乎乎的在头文件中定义变量,导致变量多重定义,这些问题没有学过链接常识的其实很难了解。

在理论编程也是常常会遇到的。

又比方 externstatic 这些关键字是如何在编译链接时起作用,变量的申明与定义又有什么区别?

这部分能够算是真正的内功了,晋升你对计算机系统的了解,也有助于解决理论编程过程中会呈现的问题,当然也会在面试中呈现。

八、数据库

数据库首先要学会 SQL 的应用,这里举荐《MySQL 必知必会》。

数据库原理方面能够看看《数据库系统概念》,这本书挺厚的,蕴含了从 SQL 到数据库设计再到数据库原理、分布式数据库都有,能够挑着看,比方关系模型、数据库设计(三大范式)、数据磁盘存储和组织形式、索引、并发管制等。

当然了整个数据库最重要的还是索引和并发管制(锁、MVCC 等),这部分也是面试常考的:

  • 索引存储构造:B 树、B+ 树索引、Hash 索引
  • 索引的应用:主键索引、笼罩索引、最左前缀准则、索引下推等
  • 锁:乐观锁、乐观锁、表锁,行锁,意向锁,读锁,写锁等等
  • MySQL InnoDB MVCC 实现机制
  • 存储引擎:InnoDB、MyISAM 等,各自的优缺点
  • 事务:ACID 实践

这部分举荐两本书:

  • 《高性能 MySQL》
  • 《MySQL 技术底细》

这两本次要对索引、innodb 存储引擎、锁、并发管制讲得比较清楚,倡议挑对应章节看。

九、算法和数据结构

首先须要把握常见的数据结构:

  • 线性表、数组、链表
  • 栈与队列
  • 树、二叉树、多叉树实现和遍历形式,AVL 树实现以及插入删除过程、红黑树(理解定义即可)
  • 图,以及图的实现形式、遍历
  • B 树、B+ 树
  • 散列函数和散列表

常见的算法:

  • 排序算法:冒泡、插入、疾速、希尔、堆排、基数、归并等
  • 字符串匹配算法:KMP
  • 常见算法思维:递归、枚举、递推、分治、贪婪、动静布局等

视频能够看看:

  • mooc 上浙大的《数据结构》
  • 学堂在线上清华邓俊辉老师的《数据结构与算法》

这两个是我看过感觉不错的才在这举荐,第一个是初学数据结构时跟着看,第二个是大三温习时刷的。

入门版书籍能够看看:

  • 《啊哈算法》
  • 《算法图解》

略微进阶点的:

  • 《算法第四版》

这本书强烈推荐,难度适中,然而全面。

终极版:

  • 《算法导论》

这个不自量力就好了。。。

举荐理由是:我不举荐显得没有逼格(:

有了根底的算法思维和数据结构储备,剩下的就是刷题了:

  • 《剑指 offer》

倡议必刷

  • leetcode

倡议分类刷,先易后难,比方数组、二分、二叉树、动静布局,一个一个系列搞定,总结经验,保障 150 道简略和中等以上吧

最重要的是,放弃手感,有空就刷一道。

十、网站和视频

有些同学喜爱看视频,那我也在这里对立举荐一下吧

  • B 站

你的一站式学习网站,用你想学的关键字在这搜就完了

  • 中国大学 mooc

根底课程学习

  • 网易云课程、学堂在线

一些技术课程、公开课学习

Linux C/C++ 能够去看看黑马的,我试看过几集 IO,讲得还是不错的,就是有点慢,集体感觉不如看书。

刷题能够看看牛客左神的视频

计算机网络能够看看 B 站韩立刚或者 mooc 哈工大的

操作系统能够看看学堂在线上清华的《操作系统》

举荐了这么多书,从哪看起?

一、浅谈学习办法

如果你认真看过我后面介绍每一部分的学习路线时,能够发现我特别强调学习抓 主线,并且将每一个基础知识的主线给大家列出来了。

这里再次强推,学习新货色的时候,重点是先对整体脉络、知识结构有一个大略的映像和理解,而后抓住这个畛域的主线,顺着骨干,突出重点去学习。

集中工夫,速战速决,不要将工夫线拉得太长,越长可能越保持不上来,成果越差。

对于细枝末节的内容,能够留到实际的时候,用到了再去查!

如果一头扎进系统的常识,去看手册、字典型的书,那必然是事倍功半的。

细节留给实际去补充,咱们的工夫要花在刀刃上,重视常识的体系性和框架的建设。

二、常见问题

说实话,其实这些书籍或多或少都被各路大神举荐过,的确经典。然而大神们却很少通知你他们是如何去看的,该怎么去看这些书,难道一本本一页页的挨着啃吗?

这部分才是我明天最想说的局部,「该如何去看大厚书」。

比方我后盾就常常有同学问:

  • 有些书看的找不到重点,看不下去了,怎么办,比方深刻了解计算机系统,UNIX 网络编程,APUE,求指教
  • 我不是科班 CSAPP 可能不是全副看得懂,该怎么办?
  • 大佬,这么多书看得完吗?
  • 刚开始看这些书很苦楚怎么办?

这些书该怎么看,可能过来人,筹备过秋招的都比较清楚,然而作为还在大二、大三的会比拟懵逼。

就拿我过后亲身经历来说,在网上搜网络编程如何学习,很多人都举荐 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 可能不是全副看得懂,该怎么办?”、“大佬,这么多书看得完吗”、“刚开始看这些书很苦楚怎么办”

三、要花多久工夫能力学完

这个不好说,依据你的根底和学习效率不同,比方我大一、大二对于一些根底的常识学得比拟认真,根底还算能够,依照这样一套走下来也就大半年。大略每天花四五个小时以上吧。

如果真的是连计网、操作系统实践这样的货色一点根底都没的话,那预计得一年以上,毕竟这些内容根本笼罩了科班的外围课程,人家上三年课,你一年解决,曾经算很快了好吧。

一年真的足够从小白学起吗?

感觉是差不太多的,然而预计得每天付出五六小时以上了,并且学习办法切当。

你去牛客就会发现,存在各路大三、研一自学转码的同学,最初还能成为 offer 收割机,所以,不要狐疑一年不够,最要害的是你要找到正确的路线,而后执行上来。

文中举荐的书真的全副要看吗?

当然不是,我本人都没看完,然而我的策略曾经说过了,基本上大部分书都看了重要的章节,这样看起来是很快的。

并且随着你看书越来越多,根底越来越好,你会发现每本书后面几章都是铺垫基础知识,大部分能够间接跳过,举个例子

《Linux 高性能服务器编程》这本书前几章是这样的:

  • 第 1 章 TCPIP 协定族
  • 第 2 章 IP 协定详解
  • 第 3 章 TCP 协定详解
  • 第四章 TCPIP 通信案例:拜访 Internet 上的 Web 服务器
  • 第五章 Linux 网络编程根底 API

你感觉这些章节在看过《自顶向下》、《TCP/IP 详解》之后还有必要看吗?我反正是半天扫过去就完了。

最初,不论说再多办法,再多的路线,最终都须要本人花工夫去啃、去执行。

四、语言纳闷

还有一个很多抉择 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 技术栈的公司,大厂根本不会限度语言的。

日常求三连环节

这篇文章我预感到会写成万字长文,然而没方法,想表白的货色太多了,大家记得珍藏~

还有,我把文章提到的这些书籍、材料、还有我面试时看过的一些面经、博客都汇总了,能够节俭你去找材料的工夫。

这是百度网盘链接:https://pan.baidu.com/s/1zm9gKtziiuxK1o7kU5PGng
提取码: efbu

链接生效的话,请加我微信支付:haveylin

(本文首发于集体公众号「编程指北」, 欢送关注, 第一工夫获取干货分享~

如果对大家有帮忙的话,记得点个赞,珍藏下噢,

我是小北,关注我,咱们下周期见!

退出移动版