综述
本人非科班生,本科普通二本院校、硕士西安某末流985,本硕专业都是电子与通信工程,基本做的东西离不开单片机、DSP、FPGA、STM32,先前完全没有接触过网络、数据结构算法等。研二上学期想往互联网转,所以自学了一年计算机专业的知识,也面了一些互联网大厂,积累了一些经验。本人仅仅参加了提前批获得offer也都一般般,因为学校三方发得比较早,并且华为给的薪资还不错,就提前结束了秋招。就面试一个月期间,认真总结了各个大厂面试要点,并做了相关的总结。如果对于一个非科班自学计算机的人想去BAT,应该具备以下能力:
- 1、语言能力:对于C++后台开发
起码对于C++以及C语言要比较熟悉,这里推荐的书籍包括以下:C程序设计语言(第2版_新版)、C和指针、C陷阱与缺陷、C专家编程、C Primer Plus第6版 中文版、C++Primer、Effective C++中文版(第三版)、More Effective C++中文版、深度探索C++对象模型、STL源码剖析。前面基本C语言吃透了,看C++对象模型以及STL源码应该比较清晰,必须深入STL内部,分析其内存模型、对象模型以及模板编程一些要点。 - 2、Linux基本操作能力
最好的方法就是按照虚拟机,然后在Linux上面写代码,熟悉Linux常用的指令。推荐书籍:Linux命令行大全、快乐的 Linux 命令行、鸟哥私房菜 - 3、熟悉网络的能力
起码清楚的连接TCP三次握手、四次挥手等内部细节过程,了解TCP和UDP的区别,了解HTTP协议。推荐书籍:TCP-IP详解卷一:协议、图解HTTP - 4、熟悉操作系统的能力
现代操作系统(第三版)中文版(选取重点的章节看)、程序员的自我修养—链接、装载与库、深入理解计算机系统(原书第2版)_CSAPP(没学过嵌入式的,得好好看看这本书,从最底层理解程序如何运行) - 5、
- 6、
- 7、
- 8、自己总结过一篇超过10万字的面试总结,包含上述提到的各部分面试考点,希望对各位有所帮助。面试总结
1、腾讯校招实习生内推面试(4.24)
一面:人生第一次面试献给了腾讯。超级紧张。
- 1、STL内存分配原理?是如何组织的?
- 2、你知道sbrk和brk的区别吗?calloc、malloc、realloc的区别?
- 3、TCP/IP为什么是三次握手?TIME_WAIT状态有啥作用?一般哪一端处于这个状态?服务器端可以吗?如果可以,那么一个IP重复,产生很多TIME_WAIT状态会如何?
- 4、Linux5个IO模型,阻塞与非阻塞的区别,非阻塞调用,数据没来函数返回错误码是什么?用什么函数将非阻塞修改成阻塞?,文件描述符是什么东西,有什么作用?
- 5、说说nginx的重定向与反向代理
- 6、智力题目:有一栋100层高的大楼,给你两个完全相同的玻璃球。假设从某一层开始,丢下玻璃球会摔碎。那么怎么利用手中的两个球,用什么最优策略知道这个临界的层是第几层?
这是第一次面试,并且是第一次提前批电话面试,连TIME_WAIT的作用都回答不全,当然失败告终。后面腾讯实习生招聘也来了西安现场面试,自己也过去了,人超级多,当然面试全程问项目,问智力题,问数据库,无赖没对应项目,没学过数据库,数据结构也很水,当然失败告终。后续加紧时间自己学了一些东西。
OPPO提前批面试(7月18号):
一面:
- 1、自我介绍
- 2、挑个你最拿手的项目介绍
介绍了自己写的简单网络库,顺便说了下Redis和Libevent,中途问了具体写了哪些模块,如何调试,定位Bug(我的回答是valgrind+gdb+strace),什么是单元测试,花费了较长的时间。(中间扯了挺长时间的项目) - 4、单例模式需要注意什么?
- 5、做了一个卷子,10到选择题,2道编程题,任选一道,题目都不难,但是需要很快做完。
- 6、问了一道智力题目,小白鼠试毒药问题。这时候面试官去改卷子。改完问你思路。
- 7、算法题目,如何快速求第K大的数,不考虑空间复杂度,类似于TOP K的问题。但是提示下,才想到利用快排。
二面:
全程聊项目,就问项目,然后问得比较宽泛,感觉面试官也不懂细节之处,自己一个人在那里说,他就好好好的,很像华为的面试,然后聊完出来就挂了。不知道为何。全程我一个人给他讲,画,感觉不错吧,可是出来就挂了。
CVTE提前批面试(7月18号33分钟):
一面
- 1、介绍你的项目(自学过程及其经历)
- 2、shared_ptr、unique_ptr、weak_ptr的应用场景
- 3、多态
- 4、重载(怎么重载,传参一样函数返回不一样可以重载吗)和重写区别
- 5、C++要引用C函数如何做?不用extren可以不?
- 6、struct和class的区别,struct可以被继承吗?
- 7、中途又问了一个项目
- 8、有什么问题要问?
产品线是啥,中途面试管说了,C++语音基础比较薄弱,但是对技术比较热情。面试极差,先前看了,但是没有总结。然后下定决定好好总结属于自己的一份面试题库。
阿里内推面试(8月17号):
一面:
- 1、malloc和new的区别,分配一个int *a数组,delete a和delete a[]区别?
- 2、多态的实现原理?
- 3、智能指针的应用场景?
- 4、内存泄漏,通常怎么做?
- 5、vector和list的区别,map迭代器是否失效的问题?
- 6、虚继承的实现原理?
- 7、右值引用左值引用和std::move的作用?
- 8、了解c++11的std::forward吗?
- 9、std::lock怎么实现?讲了RALL手法实现锁。
- 10、了解数据库吗?
- 11、今天时间有限,就到这里了吧,要是有电脑怎么可以做几个题目。
(33分钟,果然4天之后约了继续面试,同一个面试官继续面试58分钟)
四天后…………
二面:
(8月21号)你好,前几天面试,感觉你C++基础知识还可以,电脑准备好没,我们接着面试吧(55分钟)。
- 1、C++11中move有啥用?内部是如何实现的?
move是用来实现对象内部快速转移的,move返回的是右值引用,只有对象重载了右值引用也就是转移运算符和转移赋值运算符,那么就可以在不必拷贝对象而转移对象内部的变量,实现高效的移动。
可以对C++内部类型进行move不?
内部类型没有重载转移运算符,使用move应该就是直接赋值了。这个问题不清楚,没见过。 - 2、HTTP协议头部有哪些字段说说其中的含义是什么?
头部有对方浏览器、操作系统类型、报文时间,主体报文长度字段,连接类型是短连接还是长连接字段也就是keepalive。
那了解HTTPS吗?
不了解。 - 3、例如我有一个HTTP请求,没有到达对方服务器,返回的是报文不可达,那你怎么可以解决这个问题,有什么思路?
可以使用tracerout跟踪HTTP请求,然后查看其到达的路由器有哪些,然后看报文最后到达哪个路由器就失败了。
直接tracerout域名吗?
哦, 不对,不对。得先知道IP地址。
那说说tracerout的原理是什么吗?
通过设定报文的生命周期,从1、2、3等等,设为1,那么经过一个路由器就会返回ICMP信息,然后设为返回经过的第二个路由器信息,这样可以跟踪到报文经过的路由器信息。 - 4、TCP是如何确保早发但是延迟到的报文是有序的?
采用滑动窗口,应答机制。(回答不好) - 5、C++内存泄漏很容易,你一般通过什么工具检测,有没有尝试自己写个东西去检测?
没有尝试写过,一般使用vargrind检测,一般都可以检测出来。
那你了解vargrind原理吗?
不了解。 - 6、因为不是科班,然后让我简单介绍了自己从什么时候开始学习这些知识,以及学习了哪些,怎么学习的?
- 7、Linux为什么要弄个虚拟内存?
为了让每个进程看似有独立的大的内存空间,并且都不互相干扰,可以很方便的编写程序。 - 8、对数据库了解多少,有没有一些具体项目中用过数据库?
学习了MySQL必知必会,看了InnoDB内部一些原理,具体还没有用到项目中,打算最后将数据库结合到自己的简单Web服务器上面。 - 9、如果一条SQL查询很慢,你觉得可以怎么优化?
可以看慢查询日志,或者通过expalian获取SQL语句内部查询表的过程以及是否用过索引等一些信息
那怎么样可能导致查询变慢呢?
例如联合了许多表,但是又没有建立好的索引,或者索引使用不正确。
你刚刚说到慢查询日志,那多慢才会生成慢查询日志了?
具体时间不记得了,但是可以设置。 - 10、那你觉得建立索引应该满足什么条件?
某列数据区分度不够大,例如男女这种建立索引也没用;并且建立索引应该在已有的索引上面建立联合索引,这样之前的索引也可以用,联合索引也可以用。
那使用索引应该注意什么?
最左前缀原则(举了个例子)以及索引不能运算、like首部不能使用通配符等。 - 11、TopK问题?
最小堆或者快排切分解决。 - 12、二叉树的翻转,知道自己算法很差。
说得比较乱,还让我捋捋思路。阿里面试官真的好。 - 13、讲将自己在学校里觉得做的还可以的项目以及中间的难点?
- 14、你实习在那边主要做了什么?
- 15、打开钉钉,给你发个题目吧,我远程监控你的电脑,你可以随便打开个IDE,写个unique_ptr类,实现一些基本功能就可以。
- 16、写完了没有,写完了发给我钉钉上。
- 17、有什么问题想问的?
唉,这场相比于第一场,问的问题更加灵活了,感觉面试官就是想起什么问什么,很专业,应该没有什么题库之类的,阿里的面试就是这么牛。 唉,肯定凉了,秋招再投吧。
三面(8月29 26分钟):主要围绕项目以及一些开放性的话题聊聊
- 1、你的Web服务器架构是什么?
多进程,主从模式。 - 2、在用之前参考了哪些架构,多进程模型有什么优点?
说了下Nginx、Redis、Memcached。然后说了下多进程和多线程的区别以及优缺点吧。 - 3、看过Nignx没有?
看过淘宝写的Tenginx书籍,然后说了下架构。 - 4、现在都流行分布式,了解一些分布式的技术吗?
说了下一致性hash的实现以及其原理。 - 5、我们这边主要做消息中间件,了解消息中间件吗?RPC
不是很了解,但是知道有些消息队列使用Redis来做的。 - 6、为什么选择学习服务器端编程,以后非要从事服务器开发吗?
找个方向学习,具体以后做什么还是工作决定,因为反正过去也是学习。学校培养的就是学习能力。 - 7、大概你的情况了解了,有什么问题想问的?
请问您可以评价下嘛?
你对服务器开发的多进程和多线程有自己的理解,但是可能不是科班生,然后自己做东西,时间不足可能实践也没有那么多。
这如果过了下一轮属于什么面试?
下一轮应该就是HR面试了,HR最近有点忙估计得到下周给你电话了。
网易游戏内推面试
一面(8月21号56分钟):
网易游戏笔试4道编程题目,就做对了一道半。第二题就是杭州网易游戏电话过了,但是没有接过,意味就没有机会了,结果一周之后,广州的HR打电话,约了8月21号中午11点半准时面试。
到了8月21号11点20,广州的网易游戏打电话来了,说了下,自己呆的地方信号不好,可以5分钟后再打过来吗?5分钟跑下楼,找个个桌子,迅速拿出纸和笔准备面试。几分钟后打开了。
你好,请问是某某同学吗?我们是网易游戏的工程师,今天的面试官有两个人(两个人…唉,好吧)。
- 1、好吧,那我们开始来个数学题目,7点55分时针和分针的夹角是多少?
天啦,思考了几分钟,竟然没想出来,妈呀。估计当时听到两个人就震惊了。暖场题目结束。好吧,你这道题目时间已经过来,今天面试不问项目,就问基础时候,来电C++语法吧。 - 2、程序的内存布局?
从低地址到高地址依次是代码段、数据段、BSS段、堆、栈、环境变量部分、保留给内核的部分。
那静态变量存储在哪个段?
初始化的在数据段,未初始化的在BSS段。
还有哪些在数据段?
初始化的全局变量。
那他和静态变量有啥区别?
静态变量作为局部的时候,仅仅初始化一次,并且只能在其作用域内访问。全局的可以在当前文件中其定义的开始以后,全部可以访问。
非静态的局部变量为什么要存储在栈中?
因为对于函数的调用,都会生成栈帧,而这个栈的创建的编译器自动帮助我们的,并且栈的内存空间是可以重复利用的,在函数调用开始创建栈帧,函数退出栈帧就销毁了,局部变量也就销毁了。 - 3、C++有那几种全(传)参数(广东话真难懂,几个地方,另外一个人说是几种传参数)
传值、传引用、传指针。
那么这都有什么区别?
传值,栈上拷贝对象;引用不会拷贝,指针也不会拷贝;引用和指针区别babalalabl。
那什么情况下要传引用呢?
当被调用函数需要修改调用函数某个对象的时候,而又不想拷贝对象,那么就可以传引用。 - 4、struct和class有什么区别?
一个默认是全局,一个默认是私有。其他都一样。(后面查了看了,好像struct不知道模板,这道题目还得看看)。
类的三个特性是什么? struct也可以class的三大特性吗?
继承、多态、重载。可以
那多态的原理说下?
虚函数、虚表、重写。 - 5、m个数组求前k大,TopK可以有几种做法?
最小堆。
好 ,那这个时间复杂度是多少?
说得不好最后在面试官友好的提醒下说了是mlogk。
还有啥方法?
快排切分的思路。
那快排和堆排序稳定吗?
不稳定。 - 6、私有IP地址的范围是什么?
直接说,这个真的不记得了,但是我调试自己服务器的时候通常用的是127.0.0.1 - 7、TCP如何确保报文发送过来是正确的?
三次握手、超时重传、慢启动、拥塞控制等。
不是这个,我问的是如何确保报文内部的数据是正确的?(大写的尴尬)
哦,那使用CRC校验实现,发送直接校验,收到校验,然后比较校验值是不是一样的。 - 8、说说TCP四次断开,服务器和客户端的每个状态迁移?
balalalal。
说说timewait作用?
两个作用,1和2.
假如我服务器发送了FIN,客户端响应了ACK,这是我服务器端还在写这个sockt,会怎么办?
应该是写返回错误,然后再errno里面会设置对应的错误码。
那错误码是什么?
这个不记得,错误码的英文含义应该是提示连接已经断开,你就不要往里面写了。 - 9、TCP协议内部有几种定时器?
超时重传定时器,还有三个,唉不记得了,不好意思哈。
那你的Web服务器里面肯定需要用到定时器,说说你是怎么处理的?
通过最小堆维护定时器事件,在epoll_wait之前,取出堆中最近的时间作为其第4个参数,等返回之后,比较最小堆与当前的时间,确定定时器事件是否到达了。 - 9、你的web服务器是多进程还是多线程模型?
多线程的,主负责accept,然后将收到的fd轮询发给work线程,最后由work线程处理这条连接。
那你了解多进程的模型吗,这种模型也很多啊,例如Nignx?
Nignx了解一点,很牛逼的Web服务器,后面向学习。
那Nignx模型,怎么做到主和从的,例如主进程accpet,怎么把这个fd传递给子进程。(这个问题比较难)
可以利用管道,把接收到的fd传过去。
那两个独立的进程相同的fd是不是难道代表一样的含义吗?你觉得这样可以吗?
这个确实有点蒙蔽,回答不太清楚。后来查看Nignx是在listen之后,才fork子进程的,这样每个子进程都继承了Listenfd,然后每个子进程都可以竞争的accpet。
可以说说管道吗?
管道分为匿名和有名。区别在于是否仅仅支持在具有亲属关系的进程之间通信。
那你说说匿名管道具体应该如何使用?
主进程初始化管道,产生两个读写fd,fork子进程,继承这两个fd。管道是半双工的,例如1给2写,就关闭1的读,2的写,然后就可以单向1写到2了。 - 10、标准输出、输入、错误的fd是什么,同时多个进程写会发生什么?
0、1、2,同时多个多可以写,但是输出可能会竞争,顺序混乱了。 - 11、哪些指令可以查看文件内容?
more、less、cat
要查询末尾几行怎么办?
tail - 12、如何查找处于进程状态的套接字?
netstat –atl | grep …. - 13、怎么杀死进程?
ps –elf kill -9 pid - 14、如何查看当前目录占用的大小?
df和du一个是查找总内存,一个是查询当前目录,具体其中哪个查询当前目录,暂时不记得了。 - 15、服务器不停写一个日志,例如已经写了1G了,那我在外部删除这个日志文件会发生什么?
文件系统会重新生成一个同名的日志文件,然后从头开始写。(这个真的不知道。)
你确定可以重头开始写吗?那加入重头开始写,那先前的1G内存是释放了,还是没有释放?
真是不好意思,这个真的没有看过,不清楚。
你看过文件系统没?(这才是重点,想问我看过文件系统没有)
没有,真不好意思。
好吧,今天面试就到这里了,你有什么问题想问我们?
您可以说说对我的评价吗?因为这些都是自学的,以后学习可以朝哪些方向继续下去。
第一个问题:面试结果3到5天内给通知,我们现在不方便告诉,毕竟后面还有一些人,我们需要比较斟酌。
第二个问题:我觉得你自己这样学习还可以。
好,今天那就这样吧。
总结:网易游戏,面试多而细。凉凉送给了自己。
二面(8月29号下午三点56分钟):
我靠,记不清楚了,明天回忆回忆。
腾讯SNG内推面试
一面视频面试(8月21号10.30 40分钟):
- 1、自我介绍
- 2、写个strcpy函数
写了个库函数内部的实现,然后说了一些内存重叠的两种情况,如果发生了内存重叠需要从后开始拷贝等。 - 3、写一个“abcd,efgh,hijk …”反转为“dcba,hgfe,kjih”函数
很快写完了,然后简单的解释了下。 - 4、写一个epoll边沿出发读取socket套接字的函数
写的比较快,主要在于一次性读完,然后处理ewouldblock和返回0的情况,写完之后,简单的解释了下。 - 5、讲讲top输出的含义
说了下top就想windows的任务管理器,将进程按照占用ram排序,并给用户看,具体内部的一些参数暂时还不清楚,就知道可以显示进程占用CPU的程度等信息,非常全面。 - 6、awk使用过了没?
使用过了,例如我输出过netstat中的某一列等。 - 7、讲讲TCP三次握手
讲了三次握手,顺带讲了为什么2次和4次不行的情况。 - 8、有什么问题想问的?
是不是看着不是科班生,然后一些C++的基础知识都没有问,然后啥时候可以出结果?
结果我们还得商量下等等吧。(反正这个面试官面试的时候心不在焉感觉不负责的样子,让我很不爽,面试的时候我在说,他还在和别人讨论问题。)
二面电话面试(1个小时):
刚刚抱怨完,就电话来了,约了下午3点复试。这次复试就完全问项目细节了,还挑剔了许多其他的地方。
- 1、自我介绍
- 2、你的Web服务器为什么并发只能到1000?测试环境是什么样的?
说了下机器的配置,然后说了下是如何测试的。等等一些细节,最后说了下,可能内存不足的情况,说了好久。
你如何优化或者通过什么工具优化?
说了下strace看系统api调用时间。top命令查看服务器占用内存等。唉这里感觉应该说看日志等信息的。
你知道一个socket连接占用多少内存吗?
这个问题真的不清楚,说了下socket一个连接是通过四元组维持的,每个socket占用内存具体多少不清楚,但是TCP肯定会为连接分配缓冲区等。 - 3、说说一致性hash?
A:原理和实现讲了半天,我觉得应该已经讲明白了,他还是始终问为什么一致性Q:hash可以实现负载均衡?
A:通过hash函数hash到hash环上,hash函数越好,那么负载均衡的能力也就越好,非常依赖于hash函数的选择。然后说如果可以画图那就好了。
Q:那你也要表达清楚啊,别紧张了,说得紧紧巴巴的
A:第一次面试腾讯,超级紧张啊。 - 4、给我讲讲智能指针吧
讲了三大智能指针的引用场景,以及可能出现的问题。中间又被提及不要紧张,唉唉唉。
Q:使用share_ptr就一定可以避免内存泄露嘛?
A:不一定,如果一个对象被两个智能指针管理,那么会产生两个引用计数区域,因此一个智能对象析构,将是否对象内存,而另外一个还指向释放的内存,当其析构,则会释放已经释放的内存,产生不可预期的问题。
Q:为什么会产生两个引用计数区域?
A:解释了下shared_ptr内部的具体实现。 - 5、我看你做的都是基础平台开发,你讲讲你的职业规划
技术专家或管理层次。
Q:你现在做的这些可能以后工作了都不会用到,你以后想从事业务开发,还是基础平台开发?就算从事基础平台开发,也不会涉及socket套接字的基本使用。
A:现在处于学生阶段只是找一个点去学习,因为没有业务开发的环境,所以只有学习这些基础知识,并且基础知识好了以后业务开发遇到问题就会比别人看得更透明。
Q:我只是现在纠正下你的思想,以后工作了可能技术对于业务而已就显得不那么重要了,更重要的时候对业务的理解以及整体架构的理解。
A:这个因为没有做较多的业务,理解没那么透,但是一个时期一个理解嘛,随着时间的推移,理解也在动态的变化,估计到了那个时候就可以理解,谢谢您的提醒。
Q:说说你的缺点吧
A:1、2 - 6、给我讲讲同步和异步?
同步:调用阻塞指导数据到来等。
异步:如IO复用是异步,信号驱动式IO是异步,调用完后立即返回,然后数据到来,内核通过信号通知。
Q:你说说操作系统异步是如何实现的?
A:(这个有点蒙蔽),接着讲刚刚刚的信号驱动式IO,然后问了下,是不是异步实现的一种方式,面试官也没有回答,这个问题就跳过去了。 - 7、讲讲实习做了啥吧?
- 8、有什么想问的?
大概多久可以到下一轮面试?
A:起码得3到5个工作日吧。唉,估计凉凉了,等等等等………面试官一会说紧张,说说不流畅,唉唉唉唉,心烦。