你们后端,到底要学啥?
最近有小伙伴问我,一名后端工程师的学习路线是什么?其实现在很多程序员都不是科班出生的,包括我自己,大学压根没学过什么计算机相关的课程。非科班出生的程序员的劣势在于基础会稍差,比如计算机基础、计算机网络等都了解的不多,不过没关系,只要你利用业余时间系统的来学习,照样可以做到后来居上。但是问题是,我们的学习路径是什么?该如何学,网上课程那么多,我到底该看哪一个?打开自己的收藏夹,数不清的资料全部在吃灰,到头来一个也没学。
其实同类型的资料我们保存1-2个就足够了,然后一段时间内专心学习一门知识,猥琐发育,最后惊艳所有人。
ok,废话不多说,我今天要分享的就是后端工程师的学习路径和相关的书籍、视频,由于后端语言居多,所以本文不会分享语言相关的内容。
计算机组成原理
首先要讲的自然就是计算机组成原理相关的知识了,当然这并不是和你单单的介绍计算机是什么组成的,不是教你如何组装电脑,而是告诉你比如计算机是如何运算我们的数据的、CPU这个大脑是如何高效处理我们的逻辑的、CPU又是如何与内存之间通信的,加快执行我们的程序在CPU维度有哪些优化以及我们运行程序的时候如何解决CPU和内存、内存和磁盘之间的速度鸿沟等等...
这里我和大家推荐 《计算机组成与设计 硬件/软件接口》 这本书
学习这本书你可以获取以下知识:
计算机是怎么从大型设备逐渐发展到今天的个人PC机,以及计算机系统结构中的8个伟大的思想:面向摩尔定律的设计、抽象的简化设计、加速大概率事件、通过并行提高性能、通过流水线提供性能、通过预测提供性能、存储器层次、通过冗余提高可靠性。 如何判断一个CPU的性能?最直白的反应就是CPU够不够快,也就是我们的程序要跑多久,这个响应时间我们一般称之为CPU执行时间,这里需要注意的是CPU执行时间并不包含程序执行期间涉及的IO,再细分的话,又可以分为用户CPU时间和系统CPU时间 有无符号数和无符号数是如何表示的?CPU如何进行比较运算、分支判断、循环执行的?我们的代码其实是要经过编译、汇编、链接这样几个流程的,加法、减法、乘法、除法以及浮点数相关的运算在计算机层面是如何被实现的。 CPU是如何进行数据冒险,控制冒险的?流水线技术是如何提供吞吐的,处理器的数据通路和控制同路是如何设计的。 再接下来就是存储器相关的知识了,比如虚拟内存技术、程序分段技术、分页技术,当发生缺页后如何找到磁盘页的,以及为了提升地址的查询速度,做了哪些优化,页表的好处与坏处是什么?TLB的好处与坏处是什么?
总之,学习了计算机组成之后,内功绝对可以大增。如果觉得书本知识枯燥难以阅读的话,我这里再给你推荐个视频:计算机科学速成课(https://www.bilibili.com/video/BV1EW411u7th)
非常生动形象的课,一共40集,每集大概10分钟,全部看完7个小时足矣,非常适合入门,这个视频配上书籍,简直完美。
操作系统
学习计算机组成原理之后,我们会了解计算机各个硬件之间是如何协调工作的,那么接下来就是肝操作系统了,操作系统是处于计算机硬件与软件资源之间的程序。从程序员的角度来看,学习操作系统可以帮助我们更好的了解程序是如何被调度的等等。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务,操作系统也提供一个让用户与系统交互的操作界面。这里和大家推荐 《现代操作系统》 这本书
通过学习这本书你可以获得以下知识:
进程是什么、进程的模型、进程的创建、进程的终止、进程的层次结构、进程的实现、多道程序的设计模型 线程是什么、线程模型、用户空间的线程、内核空间的线程、单线程与多线程的优缺点 进程间可以通过哪些方式来通信,什么是进程间的竞争条件、临界区 调度过程涉及到的算法,比如先来先服务、短作业优先算法、最短剩余时间优先以及比较公平的时间片轮转调度 常见的页面置换算法有哪些,比如最优页面置换算法、最近未使用页面置换算法以及最近最少使用页面置换算法等等 文件系统的了解,比如有关文件的构造、命名、访问、使用、保护、实现和管理是怎么设计的 IO设备的了解,比如如何读写IO设备的内容,常见的有内存映射IO、直接存储器存取 了解什么是死锁,造成死锁的条件以及解决死锁的经典方法,如何预防死锁等等
如果觉的书本知识难以阅读的话,这里也推荐个视频操作系统-清华大学(https://www.bilibili.com/video/BV1wq4y1M7qf)
这是由清华大学的老师讲的操作系统视频课,简单、通俗易懂,每段视频的时长也不长,大概就10来分钟。
TCP/IP
当具备了计算机组成、操作系统的基础知识后,接下来就可以看看网络相关的内容了,计算机网络中面试官最喜欢问的就是TCP/IP相关的知识了,关于这方面的知识,我推荐一本书 《图解》TCP/IP
这本书全文基本都是图文结合的,阅读起来非常轻松,不得不说这个日本作者很牛逼,可以把很复杂的网络协议解释的这么简单,关键图文的方式更加容易记忆。
我这里还推荐一本掘金小册 《深入理解 TCP 协议:从原理到实战》
这本小册,我记得当时花了2-3天就看完了,整个阅读体验非常丝滑,也是非常通俗易懂的书籍,如果想要应付面试,这本小册绝对是个不错的选择。总之通过以上两本书,你可以获得以下知识:
网络的分层模型 TCP协议为什么是可靠的协议 什么叫面向连接、基于字节流、全双工的协议 数据包是如何被拆分的,MTU和MSS分别是什么,位于哪一层 为什么TCP、IP的握手需要三次,挥手要四次,挥手三次行不行 三次握手太慢,有没有更快的方式 TIME_WAIT是什么状态?TIME_WAIT是哪一方的状态,为什么TIME_WAIT那一方需要持续2个MSL的时间 不知道你有没有遇到过"Connection Reset" 或者"Connection refused" ,它们代表什么意思 发送方没收到接收方的ACK怎么办,发送方重传的机制是怎么样的,多久重传才合适 如果接收方没有能力接受大量的数据怎么办,这就引入了滑动窗口的概念,滑动窗口是如何控制数据窗口大小的 一开始发送方并不知道接收方能接收多少数据,那如何发送数据呢,每次发一点太慢,每次发很多对方又接收不了
总之,如果你的工作不是搞网络的,又不想花费大量时间来阅读TCP相关的知识,那么上面两本书个人觉得足够了。
数据结构与算法
这方面我看的书比较少,所以不打算推荐书籍,数据结构与算法可能大家更加注重的算法,BAT等大厂的面试离不开算法,以前听到小道消息,据说字节跳动的面试官一般算法题都会从leetcode上挑选原题,并且也不会太难,所以这方面的知识,我还是直接建议大家动手练写,直接去leetcode上刷题,比如每日2道,一个月下来就是60道
如图所示,具体的算法分类大概这么多,大家刷题的时候,注意不要把精力全部都放在一种类型上,尽量广一点,当然有很多冷门的类型,个人觉得也不必花费太多时间,像热门的算法如数组、字符串、动态规划、图、链表等可以多花点心思。
这里再推荐一个学习数据结构的有趣网站 visualgo(https://visualgo.net/zh)
这个网站通过动图的方式帮助你了解各种数据结构是怎么样的形式。
比如对于这个二叉搜索树来说,每次走到哪个节点,对应的代码还给你展示出来,确实很生动。
MySQL
MySQL应该是每个后端工程师必备的技能,当然这里说的不是简单的CURD,而是稍微高级点的,比如索引知识、架构模式、高可用等等,由于现在MySQL基本都是使用InnoDB存储引擎,因此我推荐 《MySQL技术内幕 InnoDB存储引擎》
通过这本书,你可以了解到以下知识:
MySQL几种存储引擎的介绍与比较 InnoDB的架构模式 插入缓冲、两次写、自适应哈希、异步IO、刷新邻接页分别是为了解决什么问题 日志类型,比如错误日志、慢查询日志、二进制日志等 索引相关知识,为什么用b+树索引,聚集索引和辅助索引的区别,b+树索引的分裂与管理,什么情况下用联合索引,覆盖索引为什么好 锁相关的知识,InndoDB会涉及哪些锁,行锁有哪些算法,死锁怎么避免 什么是脏读、幻读,如何解决 事务相关的知识,这个是重中之重了,比如redo log、undo log是干什么的,事务的隔离级别有哪些,它们有什么区别?XA事务是在什么地方体现的,长事务会有什么问题
自古MySQL就是后端同学面试中的必考技能,并且随着互联网卷的程度越来越高了,MySQL问的姿势也多了,因此这方面是需要多花时间学习的。
当然如果条件允许的话,也推荐看林晓斌老师的《MySQL45讲》,但是这门课不适合新手小白,适合有一定MySQL基础的从业人员,看完绝对收获满满。
Redis
说了数据库,就得说缓存了,说到缓存,那就是当下最流行的NoSQL数据库Redis,Redis面试的重要程度不亚于MySQL,我这里和大家推荐 《redis的设计与实现》
通过这本书,你可以获得以下知识:
基本的底层数据结构以及优缺点,比如SDS、整数集合、跳跃表、压缩列表 哈希表是如何解决冲突的 持久化相关的,AOF和RDB的区别,它们的优缺点是什么,AOF和RDB的过程会阻塞主进程吗 redis的过期键是如何删除的 redis的事件模型,文件事件和时间事件分别是什么 serverCron函数是干嘛的 主从复制模式下,旧版和新版的复制模式有什么区别 哨兵、分片 lua脚本解决原子性的问题
这本书侧重原理与实现,阅读起来也是通俗易懂,适合新手小白和需要进阶的工程师。
最后
创作不易,各位的「三连」就是对作者最大的支持,也是作者最大的创作动力,我们下期见。
往期推荐