少点代码,多点头发
上篇给大家写了 [应届生工作一年不到,从被裁到上岸,我们该如何自渡?如何保证自己的核心竞争力?]反响很好。但是吧,我犯了一个错误,敖丙提醒我的。
太难了,失业这几天没发原创,连个原创都忘记标了,真是傻?。 所以我今天又放了一次次条,这次可标了原创。没看的赶紧看看,稳稳的有帮助。
大大小小也面试了快十家公司了,有些非常重要的面试题和面试经验必须给大家整出来。
首先声明,我投的岗位是搜索方向、后端开发(偏底层、高性能)、java后台(这个岗位是阿里面试官看我简历让我试试的)。
面试的问题主要分为几块去说,C&C++&STL、数据结构与算法(含编程)、操作系统、多线程问题、场景题目、项目。
项目在社招面试中占据的分数很高,所以面试讲项目的时间会多。项目细节就不给大家透漏了,会把项目中的知识点穿插到对应的知识模块。
项目这块
这一块一定是面试最重要的地方。在整个社招面试的时候,自我介绍从来都是从项目说起,不会像校招那样会介绍来自哪里,叫什么名字,会什么技术。
每次自我介绍都是这样说的:
-
做了什么项目
-
如果项目是独立设计和开发,要描述为什么做这个项目,设计思路
-
我在项目中扮演什么角色(如果是团队项目,一定描述清楚自己做了什么功能,起到什么作用)
-
项目包括哪几个模块,每个模块实现什么功能
-
项目用了哪些技术,为什么选择用这些
-
项目中那些点是非常有意义的,为什么
基本就是这些,在讲项目的时候注意要埋伏一些重要的伏笔,比如项目亮点,直说这些亮点非常好,至于原因可以铺垫下,引起面试官的好奇。
阿里面试官给过我一些建议,非常中肯的,也给大家说说。
不得不说大佬的建议非常有力量的。看完大佬给的建议赶紧重新梳理了一遍项目、看看项目有哪些亮点技术和设计、那些难点、产生什么价值。
这是说项目的方式和准备项目方面。面试过程中,面试官问项目是真的问到你很多都是想不到的。
你可能觉得是个很简单的问题,平时不会在意那种,但面试官深深的挖,总感觉下面有矿一样。
可能面试官总是能通过这种细节撂倒你,你也觉得就是你的问题,没掌握好。
举个例子,高效的网络IO底层大多都是epoll实现的。
面试官先是问我epoll的原理,底层用什么实现?为什么高效?红黑树结构中epoll结构体怎么样的?回调使用什么触发的?epoll的边缘触发和水平触发?操作系统怎么管理信号的?为什么这里用红黑树不用哈希表?等等。
就这样一层一层的往下挖,一直挖穿为止。有时候你都说道操作系统,硬件中断层面了。
但是面试官还是如饥似渴,难道还需要说说高低电平,载波脉冲么?
所以项目真的要细节掌握透彻,就连有时候用的一些依赖库什么的,你都的知道为啥用这个,有没有更好的?
项目问的细是一方面,还有一方面就是问的深。
举个例子,当时说项目中用了一种高效的内存分配器,没有用原生的ptmalloc(也就是malloc)。
不要说new了,new的底层还是mallloc。是因为减少多线程情况下的锁开销,每次malloc都会进行加锁和解锁的过程。
面试官紧接着就问,那你用了tcmalloc的确减少了在多线程情况下的锁性能问题。如果我让你继续优化你有什么方法?也是在多线程情况下,内存分配问题。
紧接着又问,你刚刚说减少锁的性能开销,那你知道操作系统层面,锁的代价是多大么?你知道操作系统是怎么加锁的么(锁的原理是什么)?
我是真的服,面试官什么都懂。?,遇到不会的只能说这块我没掌握,说下我的理解吧。
社招,项目这块说的好可以占据很高的分,具体多大比例看面试项目契合度了。如果你的项目刚好对方公司也用到了,那就是基本聊项目聊完。
说的不好,那就有点难了。
总结一下,项目到底该如何准备?如何说?
准备方面,几个核心点。
-
为什么要做这个项目?
-
怎么做的?
-
项目中那些亮点、难点、价值?
-
项目完成,有没有解决当初的问题?收益怎么样?
如何说,其实简单。只要你准备好了,说清楚,说精彩。最好还能说得跌宕起伏,在穿插几个故事。
其实项目再怎么准备都不为过,不管是从项目的深度,项目的细节。
C&C++&STL问题
程序编译问题
-
程序编译整个过程?每个步骤都干了什么?
-
词法分析,分析什么?语法分析,分析什么?语义分析,分析什么?
这个问题我很清楚,是阿里问的。这就是说编译原理了,虽说不是科班出身,但是书还是略微看过。
不用惊讶,都是为了修行。
-
每个过程怎么用GCC编译的?
-
如何进行反汇编?
对象模型问题
-
C++有哪几种对象模型,C++现在使用的那一种?
-
普通继承的对象模型是怎么样的?存在虚函数的继承对象模型是怎样?
-
虚继承的对象模型是怎样的?为什么需要虚继承?解决什么问题?
-
多重继承对下模型?
-
成员变量会内存对齐么?为什么需要内存对齐?底层怎么实现的?
-
为什么对象模型需要这样存放?
智能指针问题
-
智能指针有哪几种?
-
循环引用怎么解决,为什么用weak_ptr就能解决?
-
智能指针每一种的使用场景?
-
智能指针底层怎么支持的,怎么做到的?
STL问题
-
STL有哪几部分组成?
-
为什么需要迭代器?
-
vector非尾结点删除,和插入会有什么问题?迭代器失效问题?
-
优先级队列怎么实现的?
-
自己实现序列式容器需要实现哪些成员函数?关联式容器呢?
-
配置器是干嘛用的?
-
仿函数使用在什么场景?
-
boost库使用过么?使用过哪些函数?
多态问题
-
为什么需要多态?
-
多态有哪几种?静态多态是什么?动态多态呢?
-
多态如何实现的?
-
虚表指针是什么?虚表里面怎么存的?顺序是什么?为什么需要按照声明的顺序?
-
虚表第一个位置存放的type_info是干什么用的?RTTI机制是干什么的?为什么需要RTTI机制?
-
使用多态中遇到哪些问题?
其他还有一些简单问题,比如问你sizeof是编译期还是运行期决议的?函数调用约定是什么?等等
数据结构与算法
直接问你数据结构的不多,一般会搭配着项目问。
-
问你设计时为什么选用这种数据结构?
-
常见数据结构以及底层实现?
-
树形结构和哈希结构的各自优缺点?
-
有些会问你图结构一些问题
算法也不是直接让你写一个快排什么的,都是给你场景题,让你自己选择用什么算法。
不排除直接让你写快排,比如我这次在面试某家公司的时候,让我写一个单链表快排,不能交换数值,必须交换数据节点的地址。
查找算法和排序算法考的多。
查找算法的话就那几种。
-
遍历查找
-
树形查找
-
二分查找
-
插值查找
-
哈希查找
-
图的遍历查找
排序算法也就那么几种(从之前的博客中拷贝的图)
链表类的问题考的特别多,写算法题目也经常让写链表类的题目。我这次面试写算法基本都是在写链表类的题目。
操作系统&计算机网络
这块也会根据项目中的问,我的项目是搜索引擎,问操作系统的问题自然多。
-
mmap如何映射?mmap在那些场景中使用?有哪些优点?
-
物理地址和虚拟地址如何映射?swap区是干嘛的?4g的内存可以运行8g的程序么?
-
32位系统和64位系统区别是啥?为什么32位系统地址是4字节,64位是8字节?
-
信号槽机制是怎么实现的?
-
信号和信号量的区别?
-
锁的性能开销,锁的实现原理?
-
进程和线程管理?
-
多线程资源竞争问题?死锁经典问题(哲学家就餐问题)?
-
io这块问的很多,包括文件IO/网络IO/映射IO,都是要讲原理和细节?
-
三次握手和四次挥手必问的?
-
三次握手和四次挥手的状态转移?
-
socket编程每个函数对应握手那个过程?有家面试官竟然问函数参数代表的意思。
-
网络io的全过程,发生多少次数据拷贝?
场景题目
这块题目是真的难以准备,都是随机应变的。大多数场景题目都是看思维,有些是看你思维完了,再让你对某个模块撸个代码。
说说我这次遇到的几个深刻得场景问题。
题目:
- 有一个单机高性能的服务,最大只能抗qps 3k,现在因为活动qps涨到了5k。
问题:
面试官:你怎么解决性能问题,从那些方面去考虑?
我:先看服务内部是否需要优化,看看具体哪些地方消耗rt,针对该模块优化,在看资源是否可以扩容等等
面试官:紧接着说,资源是固定的不能扩容?怎样保证服务正常?
我:思考了一会,表示惊讶。
其实这道题,我思路错了,一直在纠结服务性能优化上。面试官说的很清楚,要保证服务正常。
所以一定是限流,优先保证服务稳定性。
说实话,工作中的服务不算严格意义上的限流,采用的是TCP连接队列限流的。
TCP队列大小固定,当队列满了,接下来所有新链接都会被reset,当队列有空余时才可以接受新连接。
题目:
- 有一个IO场景,100work线程处理完计算服务,把计算结果进行IO操作,IO等待时间长。
问题:
面试官:100个同时IO耗费时间很长,大多数线程都在等待,你怎么优化?
我:可以采用批量IO,用一个单独的线程专门负责IO工作
面试官:IO线程何时去进行批处理?
我:io线程使用阻塞等待,满一批就进行IO;或者work线程每次写数据时检测下队列满了就去唤醒IO线程
面试官:那IO线程完了怎么通知那一批work线程?
我:信号通知
面试官:信号通知不能携带数据结构,假设IO完了之后必须给每个对应的work线程返回一个数据结构,怎么办?
我:用一个全局队列保存IO返回的数据结构,work线程去阻塞等待返回的数据结果。
入门之前我觉得写代码应该挺难的,属于技术活。现在我发现,面试是个技术活,比写代码难度大多了。不光要有实力,也必须要有运气。
反正你如何准备,面试官都会问到你怀疑人生。大多数时候我们都是顺着面试官的反问去思考,结合自己的经历回答。
三个小点提示下:
-
不一定顺着面试官的思路想,要更多的有自己的思路,适当的时候记得反问面试官?
-
不一定所有问题都答出来,但是一定你答的问题很精彩。
-
遇到不会的或者比较难的问题,先说自己的思路,再去询问下面试官的思路,探讨的方式面试。
差不多了,今天分享就到这里了。不是所有面试题,挑选了一些重要的问题说说。
题外话
今天开始在陆陆续续拒绝一些公司了,对于那些很还不错的公司,对你满满诚意,拒绝起来还是有些伤心的。
同时我在想,不管怎么样最终都只能选择一家公司工作。但是在面试的时候又不得不多尝试。
尝试的越多,意味着做出选择的越多。但是,在职业选择上,是真的不是很好选。
每个人对于工作回报的预期不同,有的人把工作当做全部,是实现理想价值的地方,是实现梦想的地方;有的人把工作知识当做能力锻炼的地方,为了以后更大的梦想;也有人是为了赚钱。
总结一下就是三点
-
积累个人能力
-
积累经济财富
-
实现个人价值或者梦想
在选择职业时大家可以根据这三方面仔细思考。要是三个条件都能满足,那就太好了。
更多时候都是有取舍的,大家自行取舍。
下一篇文章给大家总结下本次招工做中的一些总结和需要注意哪些问题。当然我的所有总结都是基于自己的经历,如果有什么异议,欢迎大家探讨。
俊男靓女们的点赞就是龙叔创作的最大动力,奥利给!!!