各种学习路线汇总
Websites
Code
宫水三叶的刷题日记 on WeChat - SharingSource
Full
Single
Google 开源项目风格指南 - zh-google-styleguide
OneSizeFitsQuorum/MIT6.824-2021
C语言教程 & C++教程 & MySQL教程 on NowCoder
MordernC++ Tutorial - changkun
pingcap/awesome-database-learning
Courses
- CS61A——学会编程抽象和python
- Web开发——React,通过Web开发(前端工程)能够比较好的上手开发流程,一个node就能简单全栈一手,不要太在意UI就好
- CSAPP——对计算机工程整体有简单的把握
- CS61C——数逻部分我认为不用太在意,稍微了解一下就好了,主要了解程序是如何被CPU执行的。take-away差不多是简单了解硬件,熟悉程序如何被硬件执行。
- CS144——网络就是概念多,这课的实验是实现一个网络协议栈,能够帮助自己深入了解TCP/IP的具体通信细节和数据报的路由过程。我觉得重要的take-away是以后自己知道如何魔改协议。
- 6.1810——xv6应该是比较简单的操作系统了,通过在完善一些关键功能的过程中也同步了解操作系统运行的本质流程,比如mmap到底是什么,是怎么实现的。take-away就是操作系统也只是一个程序,我们需要了解这个程序。
- 15-445——我个人对数据库没什么兴趣,我学这课主要是为了一个比较好的C++工程实践。
- 6.5840——分布式系统。
- 其他,如CS106L了解Modern C++,Data100数据分析、吴恩达机器学习等等。
Bilibili大学
- 【MIT公开课】 6.046 算法设计与分析 (完结·中英字幕·机翻)
- [中英字幕] C++
- 2020 MIT 6.824 分布式系统
- MIT 6.S081 2020 操作系统 [中英文字幕]
- 【MIT6.042J中英文字幕】离散数学 Mathematics for Computer Science, Fall 2010
- [中字]麻省理工学院公开课:计算机科学的数学 MIT 6.042J&18.062J(更新至第二十讲,共二十五讲)
非技术因素在面试中的重要性
本文大纲
- 前言
- 面试前-个人介绍
- 面试前-项目梳理
- 面试前-好记性不如烂笔头
- 面试中-换位思考很重要
- 面试中-反问阶段
- HR面试应对技巧
面试前-个人介绍
在面试前应该准备好自己的个人介绍,除了老生常态的基本信息外,我觉得需要做到既要突出自己的亮点,但是别太过,同时也要根据不同的面试去修改。
先给大家看一个例子:
前辈您好,我叫xxx,是xx大学计算机学院xx级硕士研究生。我的导师是xx老师,实验室是xxx。在实验室学习过程中,我发表了xxx。其中主要做了xxx。在xxx地方实习期间做了xxx工作。在实验室工作之余,我做了xxxxx(主要讲自己的开源社区贡献、技术博客撰写、竞赛等)
第一就是要尽量介绍地比较“多面”,不但要说自己在学校和实习中做了什么,还要说一些个人影响力的东西,比如开源社区贡献这一块。其实就是突出一些自己相对于其他候选人的亮点,相比于其他大部分人来说,你的特别在哪。
第二就是要“看人下菜碟”,在面试前,搜集到这场面试的部门和小组是做什么,甚至面试官是谁。如果难度太大的话,就记得把自己的导师和实验室都写上,特别是实验室的有名的大导师。举个例子,我在xx厂面试的时候,我介绍了我自己来自xx实验室,大导师是xxx。一个很senior的面试官直接说:喔,原来是xxx老师的学生,我也是来自于xxx。xxx老师下面学生的能力肯定都很好,我就不面什么技术问题了。所以我想强调的关键就是在自我介绍中,突出自己和这个部门,这个组的connection,寻找尽可能多的共同点和缘分点。
面试前-项目梳理
在面试前,还应该准备好自己的项目梳理笔记。实际上,在面试过程中,如果没有提前梳理好自己的项目的逻辑的话,很难在面试现场讲清楚以及让面试官及时get到你想表达的点。
一般而言,对于在校期间做的一些项目或者开源项目自己都能比较好地梳理清楚,但是比较难的是在实习过程中,特别是一份复杂的业务实习中梳理自己的产出。我个人认为面试官比较关注以下几个方面:一就是业务背景,也就是咱们的业务是什么,大概的架构,发展到哪种阶段,目前的瓶颈等。二就是本人负责的模块是什么,创新点是什么,以及特别重要的是:”我为什么要做这件事!“,三就是这个模块最后的上线收益是多少,怎么去评判收益。大家可以参考这种逻辑去梳理。
面试前-好记性不如烂笔头
上文主要讲了个人介绍和项目梳理,我建议大家把个人介绍和项目梳理都放在一个note里面,每次面试前半个小时到一个小时回顾下自己的note,以及根据面试岗位和小组来修改下。这样的好处在于每次都回顾下自己的项目和介绍,面试过程中有参考,不会慌。等面试次数多了,你就会发现,其实每场面试都是在重复介绍你note里面的内容。
面试中-换位思考很重要
面试过程中的一大禁忌就是不考虑面试官的感受,一股脑介绍自己的项目。一方面,面试官无法在短时间内吸收到你想表达的内容,另一方面,你一直噼里啪啦输出面试官听不懂的东西,面试官也会特别烦躁。
一个比较好的方式是:每次介绍完一段时,就停下来,反问面试官:您看您对这个项目的xx有什么疑问吗?比如说你介绍完项目背景后,就记得停下来,反问下,您看你对这个项目背景有什么疑问吗。
除了每次介绍完一段就停顿时,还有一个需要注意的点在于,不要梳理完项目以后,就完全按照项目梳理的内容去念,要注意观察面试官的反应,如果感觉他其实并不怎么感兴趣,就想办法赶紧结束。
面试中-反问阶段
反问阶段是一个及时获取信息的好机会。不同面试阶段有不同的提问。一面基本是你的同事或者你的mentor,这个时候可以专注问一些工作内容,工作氛围等比较实际的话题。对于三面来说,一般是大老板,这个时候你要抓住机会和他交流下一些比较high-level的东西,因为以后很少有机会去和这样senior的人交流。话题诸如:职业发展路径、发展前景、绩效考核、我会被分配到什么具体组。
如果在每场面试的时候,你想知道自己大概的表现,你可以反问阶段,非常非常非常委婉地提问:您看我这次面试还有什么可以提升的地方吗?
HR面试应对技巧
HR面试很多回答都有技巧,这些问题需要提前准备好不同版本的答案。
(一)关于地点:求职地点和当前地点不一致的情况:我在xx地方学习了xx年,感觉想换个新环境;求职地点和当前地点一致的情况:我在xx地方学习生活了xx年,我还是比较喜欢和熟悉现在的环境,因此我申请了贵公司的xx岗位。
(二)关于为什么报这个职位:还是那句话,想办法寻求和这个公司这个岗位的所有connection,制造缘分。
(三)关于你的offer情况:即使你是个offer收割机,你也千万别报太多,直接说薪资最高的那家就行,话术是:因为行情不好,所以我很忐忑,报了很多家公司,最后收获了一些offer,其中最高的是xxx。
(四)关于为什么来这儿,不去B公司:除了讲自己和这家公司的connection以外,对于B公司,不要说太多坏话,尽量从自己的人生规划,家庭方面,以及生活考虑上讲。做人留一线。
(五)关于自己的缺点:缺点可以是自己不够自信,因为周围有很多厉害的朋友,一直在努力向他们看齐,希望自己也能成为那样优秀的人。
Learning route
经验分享-就业准备
- C++
语言肯定是必备的,就不谈重要性了,选这门语言主要是因为自己喜欢,准备的话我个人的路线是:《C++ Primer》➡️《Effective C++》➡️侯捷《C++面向对象高级编程》➡️侯捷《C++STL》,然后还是要多写,像《C++ Primer》后面的题目就是挺好的练习内容,尤其是虚函数那块,还是挺锻炼代码能力的。
- 计算机网络
我觉得第二重要的就是计算机网络了,所有面试不一定问数据库、不一定问操作系统但一定有网络。面试的话主要问的还是TCP/IP和HTTP那一块,但第一遍最好全面系统走一下,这样子对于网络的认知会好很多。我个人的线路是:《网络是怎样连接的》➡️《计算机网络》➡️b站湖科大《计算机网络》(这个真的强推,学完一遍去二倍速看他的ppt会有很好的巩固作用)➡️小林的《图解网络》(这个主要是TCP/IP和HTTP的部分,讲的很透彻)
- 数据库
数据库操作很重要,我当时先去看了《MySql45讲》,确实给我绕晕了,果断放弃,重新买了本《MySql必知必会》,看完然后去牛客网上刷题,刷过一定的题目后其实对于数据库在做什么就有很清晰的认识了,这个时候再去看《MySql45讲》感觉就完全不一样了,还是要踏踏实实学,一开始就想着应付一下面试去看看45讲,然后才发现还是要一步一步来从浅入深的学才是效率最高的。
- 操作系统
操作系统主要是看的小林的《图解操作系统》,然后部分不清楚的地方会去看《CSAPP》以及相关博客,这里推荐一个up主:九曲阑干,是做《CSAPP》教学视频的up主,视频很棒,可以结合着看。
我觉得我操作系统这一块准备的并不好,有一点面向面试准备的感觉,在面试的时候卡壳最多的也是操作系统,说到底是地基不牢,后面自己也是打算精读一下《CSAPP》然后做做实验,尽快补齐短板。
- 项目
这里建议准备两个项目,一主一辅,可以跟面试官聊起来,同时知识面也更加全面,我在面试过程中就经常会跟面试官说虽然这个项目没有用xx技术,但另外一个项目用了这个技术。
我自己主要准备的是cpper的标准项目WebServer,推荐的人很多了,我简单说说我为什么选择这个,因为我不是大佬,资料越多对于我推进完成项目就会越快,这样子我的重心就可以放到项目的技术难点、优化上面去而不是要不停的debug;另外刷算法题的好处也会在这里体现出来,比如定时器的双向升序链表我当时很容易就写了出来,然后就很自然地考虑是不是可以用小根堆对其优化,没有算法的经验很多思考不会自然而然的想到,而这个思考的过程其实才是面试的时候面试官最想知道的。
对于项目,我是建议自己动手去写一写的,只是看了一遍源代码并不能把项目完全内化的,只有自己去独立思考完成,才会知道坑在哪里然后怎么解决的。
然后在面试前要对自己的项目进行复盘:
1
2
3
4
5
为什么做这个项目
这个项目整体架构是什么样子的
这个项目由哪几个模块组成
这些模块是怎么协同工作的
所有模块可能涉及到的操作系统、数据结构的知识
C++ & Linux后端进BAT的学习路线
公司招聘C++需求
- 腾讯,百度主流开发语言是C++
- 字节主流开发语言是C++和Go
C++ 岗位分类
C++
按顺序看这几本书《C++ Primer 第5版》/ 基础不好的话建议看 《C++ primer plus》-> 《Effective C++》 ->《Effective stl》 -> 《STL源码剖析》-> 《深度探索C++对象模型》(选看)
- 《深入理解C++11:C++11新特性解析与应用》
- 《Effective Modern C++》
- 《modern C++ tutorials》
OS
对于C/C++程序员,更加推荐 《深入理解计算机系统》 和 《程序员的自我修养-链接、装载》这两本书,站在编译器的角度看待C/C++语言规则,校招问的比较多,比如new
是在底层是怎么一个过程?如果校招准备时间不够,就不看 《程序员的自我修养-链接、装载》。
- 《深入理解计算机系统》:重点章节:2,3,5,7,9
- 《程序员的自我修养-链接、装载》
如果时间有余,则可以进一步看《操作系统精髓与设计原理 第8版》,如果是非科班可以和王道考研-操作系统一起食用更佳。
- 《操作系统精髓与设计原理 第8版》:时间不足章节选看
Linux
好嘞,到这里真正开始进入到Linux后端开发了。先学习Linux知识,毫无疑问两本书UNP
和APUE
:
APUE
- 《UNIX环境高级编程》 重点章节:3,4,5,7,8,10,11,12。UNP
–《UNIX网络编程》前面8章及11,14,16,26。整个书只看TCP/UDP
但有个难题,这两本书太厚了,对于初学者不友好,自己的方法是:
- 先看上面列举出的重点章节,其余章节用到了再看
- 配合视频:我自己看的是黑马Linux全套视频 及 Linux网络编程视频,我也是跳着看的。后者音质可能不太好,看自己能不能接受。
至于搭建linux环境,有两个方法:
- windows里下载wsl2,然后 vscode下载个
Remote-WSL
插件,vscode直接登录到wsl里,好用到爆炸!!! - 但是
wsl2
有几个缺陷,和调试网络有关的功能用不了,比如tcpdump
等。那么此时可以开启一个虚拟机,vscode下载Remote SSH
插件远程登录即可。
如果只是日常开发,建议选择wsl,比较方便,调试网络之类的选择虚拟机。
后端
如果上面都已经看完,则表示后端开发已经具备基础,下面可以开始学习服务器开发了:
- 《Linux高性能服务器编程》
- 开源项目-《Muduo》及Muduo讲解视频
游双老师的《Linux高性能服务器编程》,这本书剖析了设计一个服务器的各个要点,其中的点面试也经常考,比如epoll
的ET模式能使用阻塞IO吗?这本书强势推荐。
而陈硕老师的muduo
项目,其设计上也符合《Linux高性能服务器编程》上的设计,b站有老师逐行代码讲解了muduo
,不过这个视频噪音大了一点,我坚持看完了收获颇大。
补充:有人可能觉得,muduo项目烂大街,但是你真的把里面的设计原理搞懂了吗?比如著名的libuv
和Redis
的服务器相关的设计和muduo
的设计完全一致,如果你搞懂了以后看Redis源码也很轻松。其次有时间可以看看libuv
,代码量不多,里面的多线程设计也具有参考价值。
后端进阶 - RPC
如果到此,你还使时间充足,想要冲刺核心部门,那么可以学习RPC的相关知识。你可以从jsonrpc
开始学习json是怎么实现的,进阶一点你可以看看brpc
的设计方式,比如它的协程是怎么设计的。
RPC就避免不了序列化协议部分,关于这个常用的有:protobuff
,json
,xml
protobuf
:可以看看protobuff
怎么使用。json
:可以自己写个解析器,json-tutorials详细分解了json的设计流程,看完基本就懂了。
对于协议部分,要明白各个之间的区别、优劣势。
后端进阶 - Redis
如果有时间,真的充足!!!可以看看Redis的源码,Redis源码,个人觉得可以分为三个部分来看:
-
服务器设计:这部分的主要内容就是:1)Redis怎么接受客户端的输入、解析成指令;2)执行指令;3)怎么将指令结果返回给客户端。
aeEventLoop
的设计和《Linux高性能服务器编程》讲解的总体类似,输入输出缓冲区的设计和muduo讲解的基本一致,也有应用层的流量控制。 - 数据结构设计:各个数据结构的设计,怎么融合到
aeEventLoop
中,成为服务器的一部分,实现了各个指令功能。 - 分布式设计:1)
replication
:主从同步;2)sentinel
模式:用于解决主从同步中的主服务宕机怎么办,故障转移等;3)集群。
Redis整个设计大致如上,如果想在秋招之前学习下,建议看下第一部分。第二部分时间仍然有剩余可以看下。推荐的书籍:
- 《Redis 设计与实现》
- 《Redis 5设计与源码分析》
两本侧重点不同,前者侧重讲解原理,分析的比较清楚,只是代码是python的伪代码。后者结合redis的源码。结合看比较好。
最后,学习redis不能光看书和代码,要先学会使用!!!再去看,有几个网址可以看看
- Redis中文指令参考:这是中文的,对于初学很友好
- Redis指令官网:官网,实时更新,如果上面中文网页没有的知识,可以来这看。
自己也将会整理自己的Redis6.0
源码学习笔记并发布,带你熟悉Redis的底层实现。比如Redis6.0
中的多线程到底是个什么性质的多线程。
数据结构与算法
算法
如果你的时间充足:
- 《算法》
- 清华大学邓俊辉老师的《数据结构与算法》,在b站有视频。
- 左神老师的针对性视频
leetcode 刷题 :
- Leetcode,时间充足刷前300道,至少200道,建议把《Leetcode精选TOP面试题》刷完
- 剑指offer 至少2遍,要非常熟悉里面的题目,因为这真能让你获得offer
是否要购买Leetcode会员,能把前面的300道题目写完足够。如果300道写完,可以到牛客网继续刷真题,因为面试时的面试题是要处理输入输出的,秋招时很多人因为不能熟练处理输入输出导致无法ac。如果还想买,建议和同学一起买,更加便宜。
计算机网络
如果你时间充足,可以看看《TCP/IP 卷一》,时间不充足就不要看了。因为上面的书籍上、代码里都包含了常用的TCP/IP知识。
工具
学会使用,cmake、gdb。
cmake
:如果你看了muduo的讲解视频,里面在讲解muduo的同时了怎么使用cmakegdb
:建议学学,不仅有利于秋招,也能帮助自己学习源代码、调试