一.我的秋招历程还有自己的一些感受 以及部分面经
二.我的研究生生活以及非科班做好科研(项目也罢跑腿打杂写文档也罢)和找工作的平衡
三.之前读过的一些书的推荐
四.一些常见知识点的总结
五.给下一届秋招的小伙伴的一些建议
一、我的秋招历程
我会把之前面试的过程回忆一下,然后介绍下我一个211渣硕菜鸡学习Cpp 的过程,希望能给明年准备秋招的小伙伴一些帮助。一次可能没法写完,我会一直更新的。
先说下个人状况,211本硕,本科电子信息工程,研究生信号与信息处理,也算说半个科班吧,但是本科时候没有好好学习,基础知识几乎是零了。研一时还没用过cpp,本科只上过c语言、软件技术基础和计算机网络,也都忘得差不多了。自学一年,cpp 服务端开发。半路出家的菜鸡一枚,现在都马上秋招完了还有很多窟窿没补上。比如到现在我的数据库就只会增删查改,不知道啥是b+树甚至不知道索引啥的...不懂redis,内核一知半解,算法能力差,等等等等,总之有很多东西是真的来不及看了,后面有时间一定要继续补上。
其实我一开始的目标就是去华为,但4月份时候参加华为的实习面试,挂了,那段时间心态比较崩,真的彻底没信心了,觉得自己能去中兴就ok。最终能超过预期,还是要感谢杨超越,感谢头像,感谢自己的坚持。
1.对于投简历和面试我的一点看法
首先,可以海投,从大厂到中厂都都可以投,但面试可以有选择的去面。因为很多人一开始并不知道自己到底在什么段位,所以早期多投,机会就多。但当你通过一些面试大致了解到自己的水平后,就可以有选择的去面试,举个例子,一开始面了几家中小厂,反馈都比较好,拿到了一些口头offer,那么接下来就充满信心的去冲击大厂吧,大厂的面试并没有想象的那么难,更多的还是对基础的考察。但是中小厂的难度并不是一定比大厂简单,这里我想说明的时要通过客观的一些考量清楚自己的位置,面试表现就是一个很好的考量标准。如果磕磕绊绊,就说明还需要加把劲,如果游刃有余,就说明可以去冲击更高的目标。
其次,不要在没有准备好时就出击。不要轻易相信某些公司说的提前批正式批有两次机会这种话,大多数公司只会捞一次(腾讯鞭尸 pdd分批次除外,还有一些部门直招除外,这里只是我了解的),所以投大厂之前请做好一定的准备,重中之重就是代码能力,基础知识 算法 项目都请提前熟悉好。大厂的话至少掌握剑指offer和leetcode Top100,虽然可能手撕代码不会出到一些hard题,但还是准备充分一些以防万一。我的腾讯、美团、搜狗都是挂在z了手撕代码上,那时候准备还是不充分(其实就是太菜了)。基础知识方面,一般就是分为CPP基础、操作系统、计算机网络、linux相关(命令行 API函数 linux内核)、算法与数据结构、数据库这些,这个我后面再说。然后还有项目,如果实在没有项目可用,可以先去github上找现成的,拿来一句一句先读过去,再分析不同的场景,分析服务器的状态转换,开启时是怎样的过程,关闭时是怎样的过程,对事件的响应和处理方式等等这些,吃的越透越好。如果有时间,可以了解下一些开源库的源码,比如libevent nginx等,去一句一句比较耗费时间和精力,了解进程/线程模型,事件的处理逻辑这些大方向就可以,读源码当然更好,这个视学习能力而定。不要忘了再回到“你的项目”中去,再回去继续看,一遍遍的去顺项目,要去考虑为什么这么做,好处是什么,有哪些问题,怎么去改进,这些只能在被面试官怼的过程中慢慢积累慢慢反思。
最后,每次面试完后的工作。不要因为一次小小的失败而精神低落,公司多了去了,比这家好的肯定有,最重要的是每次面试完都要有收获,面完可以把面经写下来,可以只写给自己看。去思考这些问题:哪些问题回答的好,哪些问题回答的不好,没回答好的原因是什么,当然一般就是掌握的不够牢固不够深刻。对于之前没有涉及到的知识,第一时间去查缺补漏,赶快把窟窿补上,有哪道代码没写出来,赶紧罚自己上leetcode上刷10道同类型的,对自己狠点,总会有收获的。
2.我自己的秋招情况
说一下秋招的情况,投了有四五十家左右,作笔试的三十多家,真正面试过的公司14家,中兴 诺瓦 百度 华为 快手 oppo 美团 腾讯 阿里 京东 pdd 小红书 搜狗还有宁波银行,成功率只有7/14。
最终拿到offer的:
百度白菜 base北京 基础架构部 计算与存储系统开发工程师
快手大白菜 base北京 商业化 C++开发
小红书sp base上海 后台开发,具体部门未知 ,可能要转java
中兴 基带软件开发 西安
oppo白菜 成都
华为 cloudBU
宁波银行
挂了的:
诺瓦综面完 玄学挂
腾讯一面手撕代码 挂
搜狗一面手撕代码 挂
美团二面后没消息 挂
阿里二面后没消息 挂
京东hr面hr问薪资我说要30w直接给我挂了...
pdd寻梦二面鸽了 11116接受不了
滴滴和新浪要现场面,劝退了
还是有些不甘心,一些大厂因为投的太早 直接前两面就没了😥,我觉得放到后面还是有信心能拿到的
还有一个我很想吐槽:
网易游戏9-7笔试为什么ak了没有进面试???发邮件让我再做笔试?我做个锤子!!!
3.部分面经
之前的面经不太全,我再回忆回忆补一补
(1)中兴基带开发 7-5日面试
中兴是我面的最早的一家公司,六月底投简历,我当时连简历都不敢投,后来硬着头皮投了简历,笔试一道题都没做出来,但还是给了面试机会,面试流程比较快,我一度以为自己挂了,结果到八月中旬收到oc,后面还去了open day参观。
面试说实话没什么内容,一面的时候讲了下我的科研项目,问我会不会冒泡排序和快排,我说会,也没让我写
二面也只是简单聊了聊,没什么参考价值
(2)百度系统部 从七月中旬到八月中旬,三面
其实一开始就想着感受一下大厂,也很怕,面试的前一天就开始紧张,怕被问倒,怕被怼,这真的是每个人都会经历的过程,所以还是多面,面多了心态就会好很多。
一面都是一些基础的知识,讲项目,问基础,也问了一些hr会问的问题;
二面面也是项目,基础,我有发面经,感觉比较剑走偏锋哈哈。
三面类似于hr面
主要就是我先说了项目,然后问了我对百度的看法,问了我对linux的理解这些
8月22日打电话要走了身份证号,8月28日收到短信,9月10日测评,9月19日晚上收到oc
(3)诺瓦 一家小公司,我的第一次被挂 8月4日
一面基础,当时我还没开始复习知识,有几个点被问住了,比如什么时候不使用虚析构函数会导致内存泄漏,项目里面当请求量太大是怎么处理
二面类似于综合面,面了一个半小时,聊专利 聊项目 聊人生,第二天 挂
当时心情比较低落,觉得连小公司也会挂我,真的一点信心都没有了
(4)腾讯 8月12日简历面 8月17日初面挂 整体来说面试也不是很难 但是面的比较早准备不够充分,挂了,还是太菜
简历面:都是基础问题,40min
有分C++基础 计算机网络 数据结构 网络编程 linux 操作系统来问,也都没有深究,答的还行
初面:两道代码,其中一道是字符串扩展,也都不难,但是那天状态奇差,就此失去了去腾讯的可能
(5)美团小象 二面挂 8月22日 一面 8月26日 二面
我不知道其他人有没有一样的感受,一个做C 后端的人很容易被java面试官面到心态爆炸。。。
一面面试官非常好,加了微信,给了我很多建议,比如我的代码风格,我就是从那时候起,改过来了自己之前不好的习惯,谢谢。
二面面试官就显得比较业余...当然我挂的原因还是自己,因为代码没有写出来,一道字符串相加(考虑小数点 考虑正负号),一道非递归归并排序,我挂了也心服口服,自己太菜了
(6)阿里钉钉 8月30日一面 9月初二面 应该是挂了虽然官网状态没变
一面手撕三道剑指原题 基础考察
二面 全程项目,被问崩了,真的没有这个能力...但是面试官给了我很多建议,虽然是以批评的口吻,谢谢。
有问到对缓冲区的设计 一开始一直在想方法避免缓冲区溢出,面试官后来再次强调就是设计溢出时的处理方法,后来说是缓冲区扩容,类似于vector,再联想到内存池
问到对定时器的设计 前面有说用最小堆 红黑树 后面在面试官引导下说了时间轮
被面试官批评说基础掌握的不够扎实,不要用非科班当借口,确实是对这些知识掌握的不够深入
(7)快手 9月1日一二面 9月8日三面 三面的面经被我误删了...实在不好意思 第一个拿到的大厂的意向书 9月16日拿到意向书 谢谢对我的肯定
三面总监面,比较偏系统设计。快手的面试体验真的很棒,有些问题我其实并没有接触过,比如java的消息队列实现,一致性哈希的好处这些,也会耐心引导,面试的感受真的很好
(8)华为cloudbu 9月8日 三面 后来有打过两次电话,第一次让调部门我拒了,第二次说可以不用调部门我也拒了,估计大白菜一棵,也没啥必要
(9)pdd 9月1日的笔试 9月16日面试
面试官很好,但是可能是因为面试官是做java的沟通起来比较难受,和java面试官交流像stl和epoll源码 linux内核的时候真的有代沟...。代码题很简单都写出来了,那天面试时候比较吵网也不好,说声不好意思。
后续收到二面的通知,因为考虑到有女朋友,我怕pdd的作息时间下没有个人生活,所以拒掉了二面
(10)搜狗一面挂 还是自己太菜了 手撕代码 写的不好 挂了
(11)oppo 9月17日一面 18日二面hr面 当时有说不能泄漏面试内容 遵守承诺
(12)小红书 9月19日 体验还不错,面试难度真的不低...感谢能让我这个菜鸡走到最后
(13)京东广告部 9月19日 一面 20日 二面 21日 hr面 面试体验也挺不错的 尤其一面面试官,很耐心,很多问题我都没考虑过,在他的启发下最终也能解决 最后没有通过hr面 略遗憾 自己作死
二面 讲项目 问基础 手写string类 正常的问题吧 有个争议的地方就是我讲vector扩容的时候说是扩为原来两倍 和面试官意见不一致,后来查到gcc下扩2倍,vs下扩1.5倍,还是自己的问题,只读过gcc stl的老版本源码,后来面试官还加了微信,交代我hr面注意下,正常走。
挂了觉得有点可惜,因为我hr面聊薪资狮子大开口了...反手就是一个挂以后长个记性......
(14)宁波银行 8月底面试 两面加起来也没有10分钟,最后让体检没去
二、一个普通非科班菜鸡的研究生生活以及在学习过程中的权衡
接着唠吧,说下自己的研究生生活,和很多非科班一样,都是研一过来就面临问题,到底是好好跟导师做项目毕业去科研院所,还是自学计算机知识去互联网公司。大家都把研究生生活想的很美好,但现实会给我们当头一棒,有跑不完的腿,干不完的活,熬不完的夜,还有天天掉的头发。研一第一学期晃晃悠悠过去了,从第二学期开始决定自学cpp ,去互联网公司。后悔没有听师兄师姐的话早点准备...
我唯一的基础就是本科学过一点c,还有数据结构,除此之外什么都没有。
18年3月和4月开始看cpp primer,看传智播客的cpp视频,边看边写,这样一些细枝末节才能兼顾到。cpp语言一定要好好去学,这是基础。
5月和6月看了《大话数据结构》,这本书其实十多天就看完了,很多的时间都拿来啃weiss的那本《数据结构与算法描述C++语言描述》了,这本书偏难,很全面,一页一页的啃下来,花了不少时间,但收获很多,常见的不常见的数据结构都了解了一些,书中也都是用模板类实现了一份,我自己也跟着写了一遍。这本书让我知道了还有左式堆、杜鹃散列等等这些在当时看来稀奇古怪的数据结构。后来自己也造了个图的数据结构,实现了一些简单的功能。
7月要考试,因为之前的课几乎全翘了,这个月前半段都用来复习了,后半段写了一篇专利。8月份用了15天读完了《深入理解计算机系统》,但当时第一次读也只是一知半解,后面看了一些linux相关的视频,算是简单的了解,讲命令行 对应的api函数,linux操作系统 还有网络编程 shell编程等。
研二了,从9月份开始到12月中旬,基本没有闲过,总有这样那样的事,期间断断续续看完了《effective c++ 》,第一次看也是看了跟没看一样,后来重看才有点感觉了。研二的第一学期是过的最艰难最苦逼的一学期,出差、项目申请书、改PPT,总有各种各样的事情,实在没有时间去静下心来学自己的东西,经常要熬夜加班到半夜,没有太多自己的时间,也不知道老板什么时候会找,每天都在压抑中度过,还好有女朋友的开导,谢谢...
12月下旬终于闲下来了,到1月份放假前刷了三四遍剑指offer,这里插一嘴,剑指offer某些题的代码写的真是一言难尽,后面有时间我把改良过的也汇总一下发出来。
寒假在家颓废,3月份开学,边帮导师写项目申请边出差边刷题,一个月时间刷了leetcode前300道,然后每道题写了自己的思路,去看大神的解法,去找自己的问题。
无休止的打杂,贯穿了整个4 5月份,春夏之交不再像以往一样惬意。又是无聊的出差 无聊的ppt 无聊的项目申请还有无聊的空气。在挣扎中读了《stl源码剖析》,看了浙大操作系统的视频课,开始读apue和unp,直到夏至,apue前17章和unp前8章算是过了一遍,所有代码也都自己手打过一遍加了注释。
6月份我鼓起勇气去向导师争取自由,并获得了胜利。还是要感谢老板的理解,虽然有时候会发牢骚,但对比下来真的觉得我们老板很好很好了。谢谢老板...
后面我有了更多的时间去学习,读epoll的源码 读muduo库的源码 了解nginx 二刷 三刷leetcode前300题还有高频题,学数据库,学计算机网络,去看一些简单的linux内核知识。一边投简历一边复习,枯燥的8 12 7开始了。
到了八月底九月份,主要就是复习了,之前积累了成百上千页的笔记,现在也终于派上用场了,可以不用再去从厚厚的书中去找重点方便了不少。每天看博客,看笔记,刷题,笔试,面试,循环往复。过去的一个月,几十场笔试做到吐,四处奔波参加面试,忙忙碌碌到最后,幸好没有一场空。
在求职过程中,因为利益不同而导致的问题是不可避免的,希望有这些困扰的小伙伴能及时调整心态,时间不够可以挤,工作做不完可以好好和老板商量,有什么问题也及时去反馈,千万不要起正面冲突,也不要把自己搞抑郁了,虽然我也一度非常消极...
没有过不去的坎,只有过不去的坎特,不好意思走错片场了,坚持下去,就能迎来成长。
我在整个6 7 8月几乎都是实验室最早来最晚走的,勤能补拙,希望明年 后年求职的你也能坚持下去,找到满意的工作。希望每个奋斗者的汗水都不被辜负,每个起早贪黑的背影都收获成功的满足。
三、书籍推荐
1.我理解的读书
首先,一定要深入,一定要动手。对于一些源码分析类的书籍,一定要深入到源码中去,但看是一方面,写是另一方面,一定要动手自己去实现,我就遇到过让手写string类 手写智能指针 手写红黑树伪代码,这些如果之前只是看过没有动手写过,想很好的复现是很难的。
其次,做好规划,记好笔记。有些书是比较费时间的,有些书则相对快一些。每本书可以给一定的时间,比如7天 比如两周 在规定时间内读完它,边读边作笔记,因为翻一本很厚的书是比较麻烦的,如果把重难点摘出来加上自己的理解,再读的时候只要不是很细节的问题,都可以直接去查笔记,会方便很多,最近几个月记笔记和打草稿我用了两包A4纸。
2.我读过的书籍
那些传说中的经典书籍都是值得一读的,但是时间原因,可能并不能全部都很仔细的过一遍,我大致列举一下,我觉得必须读的我会标注。
数据结构:
我只看了《大话数据结构》和《数据结构与算法描述Cpp版》,大话数据结构比较基础,后者可能更全面也稍微难一些。除此之外还有一些推荐的数据结构课程比如浙大的清华的等等也可以看看。算法部分更多的就是靠刷题了
Cpp基础:
《C++ Primer》必读 绝大多数C++开发人员的入坑书籍,一定要仔仔细细过一遍,虽然看完很多不怎么用得上会忘掉...
《effective C++》我觉得讲继承和RAII的部分讲的挺不错的,这个放到稍微靠后看,一开始看可能理解不会很深
《深度探索C++对象模型》必读 我只看了讲虚函数的部分,有时间的尽量都过一遍
《STL源码剖析》必读 多读几遍,空间分配器 vector list deque rbtree hashtable这些容器都是会经常问的,一定要深入去看,源码一行一行的过,相比之下 迭代器的设计思想还有TRAIT技法好像不怎么被问,算法部分也很少去问,但还是要过一遍
操作系统:
《深入理解计算机系统》 必读 可以很快的过一遍,但我建议在读书之前先去找一些高校的操作系统课视频看一看,否则看完一边也是比较浅的,认真看的话,视频看一周,书大概两周就能仔仔细细的过一遍。后面隔几个月可以再翻一次,收获多多。
浙大操作系统课 我是因为时间来不及了没有去读《现代操作系统》,所以只看了视频记了笔记。好像清华的东南的课都不错。
《unix环境高级编程》(apue) 必读 这个是做C后端开发绕不过的坎,我是只读了前17章,之后就再没读了,建议把所有的代码都自己写一遍 加注释 跑一遍
Linux:
《鸟哥的linux私房菜》 必读 主要是看命令行(基础书籍,必读)
如果有兴趣看linux内核的话,可以看看
《深入理解linux内核》 这本书比较难也很厚,我是没看下去...有时间有精力的可以深入去了解一下
《Linux内核设计与实现》(LKD) 推荐下这本,讲的比较浅,可以读一读,做一个简单了解,可以结合一些博客去读,否则书上的内容确实比较少
网络编程:
《计算机网络》必读 当然如果有时间最好是去看《TCP/IP详解》 会讲的更深入更具体一些 不过计算机网络结合一些博客的内容 足够应付一般的面试了
《UNIX网络编程》必读 这也是做C网络编程绕不开的坎,我只读了前8章,时间允许可以多读一读
我的网络这块掌握的不太好,因为没有看过太多书,七月份才开始看的,掌握的不是很牢靠。我建议有时间的朋友可以看看epoll的源码,只有几百行,但被问到的几率很高,如果能从源码的角度结合内核去讲epoll,面试官一定会给加分
数据库:我只粗略翻过《数据库系统概论》,看过讲mysql语句的视频,以及一些博客,这块基本上没什么了解就不推荐了...
算法:
《剑指offer》 必读必刷 神书,面试撕代码很多都能从书上找到,但是有些题的代码写的很烂,可以看看leetcode类似的题,找一些好看又简单的解法
leetcode前300题+Top100 这些差不多就可以了,有些hard题出现概率很低的可以放弃 先自己写,写不出来看评论,还不懂就去看别人的代码讲解,也是要多刷多写 一遍两遍可能不太够
其他:
《linux多线程服务端编程》结合这本书可以读一读muduo库的源码,我之前花了大半个月时间把源码整个过了一遍,收获很多,后面有机会我把自己注释过的源码发上来。
《后台开发 核心技术与应用实践》 感觉像是博客集合。。。看着还凑活,就跟汇总复习一样
四、知识点总结
因为我总结的知识点都在纸上没有电子版......这里先放一个其他大佬总结的,如果有问题请告知我我删掉,我直接放链接
为了方便起见,我把知识点全列出来
C++基础
• 指针和引用的区别
• 堆和栈的区别
• new和delete是如何实现的,new 与 malloc的异同处
• C和C++的区别
• C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
• Struct和class的区别
• define 和const的区别(编译阶段、安全性、内存占用等)
• 在C++中const和static的用法(定义,用途)
• const和static在类中使用的注意事项(定义、初始化和使用)
• C++中的const类成员函数(用法和意义),以及和非const成员函数的区别
• C++的顶层const和底层const
• final和override关键字
• 拷贝初始化和直接初始化,初始化和赋值的区别
• extern "C"的用法
• 模板函数和模板类的特例化
• C++的STL源码(这个系列也很重要,建议侯捷老师的STL源码剖析书籍与视频),其中包括内存池机制,各种容器的底层实现机制,算法的实现原理等)
• STL源码中的hashtable的实现
• STL中unordered_map和map的区别和应用场景
• STL中vector的实现
• STL容器的几种迭代器以及对应的容器(输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器)
• STL中的traits技法
• vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
• C++中的重载和重写的区别
• C++内存管理,内存池技术(热门问题),与csapp中几种内存分配方式对比学习加深理解
• 介绍面向对象的三大特性,并且举例说明每一个
• C++多态的实现
• C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(包括单一继承,多重继承等)(拓展问题:为什么基类指针指向派生类对象时可以调用派生类成员函数,基类的虚函数存放在内存的什么区,虚函数表指针vptr的初始化时间)
• C++中类的数据成员和成员函数内存分布情况
• this指针
• 析构函数一般写成虚函数的原因
• 构造函数、拷贝构造函数和赋值操作符的区别
• 构造函数声明为explicit
• 构造函数为什么一般不定义为虚函数
• 构造函数的几种关键字(default delete 0)
• 构造函数或者析构函数中调用虚函数会怎样
• 纯虚函数
• 静态类型和动态类型,静态绑定和动态绑定的介绍
• 引用是否能实现动态绑定,为什么引用可以实现
• 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)
• 对象复用的了解,零拷贝的了解
• 介绍C++所有的构造函数
• 什么情况下会调用拷贝构造函数(三种情况)
• 结构体内存对齐方式和为什么要进行内存对齐?
• 内存泄露的定义,如何检测与避免?
• 手写智能指针的实现(shared_ptr和weak_ptr实现的区别)
• 智能指针的循环引用
• 遇到coredump要怎么调试
• 内存检查工具的了解
• 模板的用法与适用场景
• 成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
• 用过C++ 11吗,知道C++ 11哪些新特性?
• C++的调用惯例(简单一点C++函数调用的压栈过程)
• C++的四种强制转换
• C++中将临时变量作为返回值的时候的处理过程(栈上的内存分配、拷贝过程)
• C++的异常处理
• volatile关键字
• 优化程序的几种方法
• public,protected和private访问权限和继承
• class和struct的区别
• decltype()和auto
• inline和宏定义的区别
• C++和C的类型安全
操作系统基础
• 进程与线程的区别和联系
• 一个进程可以创建多少线程,和什么有关
• 一个程序从开始运行到结束的完整过程(四个过程)
• 进程通信方法(Linux和windows下),线程通信方法(Linux和windows下)
• 文件读写使用的系统调用
• 怎么回收线程
• 守护进程、僵尸进程和孤儿进程
• 处理僵尸进程的两种经典方法
• 进程终止的几种方式
• linux中异常和中断的区别
• 一般情况下在Linux/windows平台下栈空间的大小
• 五种IO模型
• 守护进程
• 程序从堆中动态分配内存时,虚拟内存上怎么操作的
• 交换空间与虚拟内存的关系
• 堆和栈的区别;从堆和栈上建立对象哪个快?(考察堆和栈的分配效率比较)
• 内存泄漏和内存溢出
• 常见内存分配方式和错误
• 堆内存和栈内存的区别
• 可重入函数和可重入内核
• 操作系统动态内存分配的几种策略
• 内部碎片和外部碎片
• 系统调用进入内核态的过程
• 内核态和用户态的区别
• 常见的进程调度算法以及linux的进程调度
• 中断、陷阱、故障和终止
• 进程通信方法
• 线程互斥和同步的方法
• 内存对齐的规则和作用
• 页面置换算法
• 实现一个LRU页置换算法(或者FIFO置换算法)
• 死锁的必要条件(怎么检测死锁,解决死锁问题),银行家算法(死锁避免)
• 哲学家就餐,读者写者,生产者消费者(怎么加锁解锁,伪代码)
• 海量数据的bitmap使用原理
• 布隆过滤器原理与优点
• 布隆过滤器处理大规模问题时的持久化,包括内存大小受限、磁盘换入换出问题
网络基础
• 网络的几种分层体系结构
• 建立TCP服务器的各个系统调用
• socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
• MTU和MSS
• 对路由协议的了解与介绍
• 路由协议所使用的算法
• 路由表的项目包括哪些
• 地址解析协议ARP的过程
• 网际控制报文协议ICMP的过程
• 动态主机配置协议DHCP的过程
• WAN LAN WLAN VLAN VPN的区别
• 介绍一下VPN(虚拟专用网)
• TCP和UDP的区别
• TCP如何保证数据的正确性
• TCP和UDP相关的协议与端口号
• TCP(UDP,IP)等首部的认识(http请求报文构成)
• 网络层分片的原因与具体实现
• TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
• TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
• 为什么使用三次握手,两次握手可不可以?
• TIME_WAIT的意义(为什么要等于2MSL)
• 超时重传机制(不太高频)
• TCP怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等)?
• 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
• TCP滑动窗口协议
• 拥塞控制和流量控制的区别
• TCP拥塞控制,算法名字?(极其重要)
• 网页解析的过程与实现方法
• 应用层协议常用的端口号
• http协议与TCP联系
• http/1.0和http/1.1的区别
• http的请求方法有哪些?get和post的区别。
• http的状态码
• http和https的区别,由http升级为https需要做哪些操作
• https的具体实现,怎么确保安全性
• 在浏览器输入一个URL的流程,这个过程中浏览器做了什么(如www.baidu.com)
• URL包括哪三个部分?
• 长连接与短连接的区别以及使用场景
• 一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
• 介绍一下ping的过程,分别用到了哪些协议
• 对称密码和非对称密码体系
• 数字证书的了解(高频)
• 客户端为什么信任第三方证书
• RSA加密算法(非对称加密,用公匙和私匙实现);
• MD5原理(MD5是密码散列函数)=> SHA安全散列算法替代
• 单条记录高并发访问的优化
• 数据流和粘包问题
• 一台机器最多可以建立多少tcp连接?
• 五种IO模型的过程和比较
• IO多路复用(select,poll,epoll的区别)
• 有没有抓过TCP包,描述一下
• 一个ip配置多个域名,靠什么识别?
• 服务器攻击(DDos攻击)
• 重放攻击,IP欺骗
Linux相关
• Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要)
• 文件系统的理解(EXT4,XFS,BTRFS)
• 文件处理grep,awk,sed这三个命令必知必会
• IO复用的三种方法(select,poll,epoll)深入理解,包括三者区别,内部原理实现?
• Epoll的ET模式和LT模式(ET的非阻塞)
• 查询进程占用CPU的命令(注意要了解到used,buf,***代表意义)
• linux的其他常见命令(kill,find,cp等等)
• shell脚本用法
• 硬连接和软连接的区别
• 文件权限怎么看(rwx)
• 文件的三种时间(mtime, atime,ctime),分别在什么时候会改变
• Linux监控网络带宽的命令,查看特定进程的占用网络资源情况命令
数据库基础
• 关系型和非关系型数据库的区别(各自优点)
• 常用SQL语句(DDL,DML,DCL,TCL)
• 数据库中join的类型与区别(inner join, outer join, cross join, natural join, self join),注意适用场景和sql语句的编写
• 数据库的索引类型
• 聚集索引和非聚集索引的区别(叶节点存储内容)
• 唯一性索引和主码索引的区别
• 索引的优缺点,什么时候使用索引,什么时候不能使用索引(重点)
• 索引的底层实现(B+树,为何不采用红黑树,B树)
• B树和B+树具体实现
• 索引最左前缀问题
• Mysql的优化(高频,索引优化,性能优化)
• 数据库引擎介绍,Innodb和Myisam的特点与区别
• 数据库中事务的ACID(四大特性都要能够举例说明,理解透彻,比如原子性和一致性的关联,隔离性不好会出现的问题)
• 数据库隔离性设置不同会出现的问题(脏读、不可重复读、丢失修改、幻读)
• 数据库的隔离级别,Mysql和Oracle的隔离级别分别是什么
• 数据库连接池的作用
• Mysql的表空间方式,各自特点
• 分布式事务
• 数据库的范式
• 数据的锁的种类,加锁的方式
• 视图的作用与使用方法(如何删除等)
• 分库分表,主从复制,读写分离。(我不会,也没碰到过)
• 项目中哪里用到了数据库,怎么用的
• Mem***和Redis了解
大数据和分布式
• Hadoop框架下,各个组件的构成及作用
• BASE原则,CAP原则
• 一致性算法Raft的过程
• TIDB原理
• HBase的存储原理
• HDFS运行原理
• Hive的了解
• Spark的了解
• 介绍熟悉的设计模式(单例,简单工厂,观察者模式等等)
• 写单例模式(饿汉模式和懒汉模式),线程安全版本
• MVC设计模式
我后面复习的时候就是对照这个来复习的,比较扎实,覆盖面也很广,因为后期重点补的linux和操作系统的知识,所以下面的列举的大多是这方面的
1.惊群相关知识点 惊群概念,accept惊群 epoll惊群 ,解决方案 加锁 REUSEPORT 快手面试时候问过
2.TCP的7个定时器 建立连接定时器 超时重传定时器 延迟应答定时器 坚持定时器 保活定时器 FIN_WAIT_2定时器 TIME_WAIT定时器 pdd面试时候问过
3.main函数前做了什么:初始化堆栈指针;全局变量对象及静态变量对象的空间分配和初始化;c/c++库初始化;参数压栈,获取环境变量;打开标准输入 输出 错误流;注册析构函数 京东和美团问到过
4.main函数后做了什么:全局变量析构 对象析构 堆销毁 关闭I/O 关闭标准输入 输出 错误流 调用析构函数
5.exit和_exit的区别:exit会执行清理处理,会使用fclose函数冲洗缓冲区
6.可重入与线程安全:可重入一定线程安全,可重入条件:可中断,除栈上元素外不依赖环境对全局变量访问要互斥
7.不可重入标志3点:静态数据结构 malloc或free 标准IO函数
8.signal和sigaction的区别(signal的缺点):一次性;不能设置阻塞信号集;不改变信号处理方式就不能确定当前处理方式
9.kill函数和raise函数:kill不是杀死而是发信号,参数可以为正数 0 -1 数
10.对信号的理解:用户态软件层面对内核中断机制的模拟
11.信号与中断的相似点:1.异步通信 2.处理后回到断点 3 都可以进行屏蔽 4 暂停当前程序去处理
12.信号与中断的区别:1.中断有优先级信号没有 2.信号在用户态而中断在内核态 3.中断响应比较及时
13.线程私有数据api: pthread_key_create(key,析构函数) 创建键,pthread_setspecific为key绑定私有数据,pthread_getspecific获取key的私有数据
进程维护Key数组,长度128,每个位置有对应的标志和析构函数
相应的每个线程都有一个对应的结构体来保存各自的pkey数组,长度也为128,每次调用创建键时先在key数组找第一个空的下标,为线程pkey对应位置创建一块内存,pkey对应位置指向该内存
14.fork和exit的大致过程
15.fork和vfork的不同 华为问过
16.epoll源码解析的一些博客
算法没什么好说的,leetcode前300+top100足够了,但是要来回的刷,至少三五遍,先按顺序刷,再分门别类,按照类型刷,最好刷到看到这个题五分钟写完的程度
回头我把我的代码上传github再上链接
#百度##快手##华为##OPPO##秋招##面经##C++工程师#