【面试】互联网软件研发岗位,面试内容准备方向(技术面试考察点)
HR部门捞简历的流程
简历的细选
细选简历的关键要点有:
简历的精读
应聘者既往经历的主要职责和工作内容;应聘者既往取得的成就和成功经验;应聘者既往的管理幅度和管理经验;简历中存在的疑问和瑕疵。
辨别和确认应聘者解决问题能力和经验、领导风格和经验、文化适应性、书面沟通能力、团队精神和团队建设、效率改善能力和经验等等。
一个在外企工作多年的应聘者转到民营企业,可能存在“水土不服”问题。再者,在日韩台企工作多年的候选人工作风格多偏于严格、服从、执行;在民企出来的应聘者抗压能力和实操能力明显强于其它,但可能缺乏高度和深度;而外企工作多年的候选人专业度、职业精神更出色。
既往的角色和职责:不仅仅要看应聘者做了哪些事,还要特别关注他在其中担任的角色是什么,承担的责任有哪些。“主持”项目和“参与”项目的责任不同,获得经验也不同。 对角色和职责的判断有两个关键词:“相关性”和“最近”。相关性是指应聘者在既往的工作经历中与所应聘职位的角色、职责的吻合度
一个既有国企、外企又有民企工作经历的应聘者,对文化的适应性肯定高于只有单一性质的企业工作经历的应聘者。在国企工作多年的应聘者可能对处理复杂人际关系得心应手;而外企应聘者自我意识会更强烈;有民营企业工作经历的应聘者抗压、抗击打能力则明显高于在其他企业的应聘者。
工作期间和职业发展
应聘者每一段工作经历少于三年,通常意味着应聘者的稳定性较弱。
两段工作经历之间存在 “工作间隔” 需要引起重视。
另外,应聘者的职业发展线路是上行、下行或波浪式,对判断应聘者的能力和整体素质有积极意义。
当然,如果高职位是在小公司,而后来的较低的职位是在大公司,是符合职业发展逻辑的。
用人部门捞简历的流程
灵魂三连问
考察目标
面试内容:
问题设计与面试过程
高效考察
考察思路
考察方法:
是什么-为什么
是什么考察对概念的基本理解,为什么考察对概念的实现原理。
比如 索引是什么? 索引是如何实现的?
引导-横向发问-深入发问
引导性,比如 “你对 java 同步工具熟悉吗?” 作个试探,得到肯定答复后,可以进一步问: “你熟悉哪些同步工具类?” 了解候选者的广度;
获取候选者的回答后,可以进一步问:“ 谈谈 ConcurrentHashMap 或 AQS 的实现原理?”
一个人在多大程度上把技术原理能讲得清晰,包括思路和细节,说明他对技术的掌握能力有多强。
深度有梯度和层次的发问
设置三个深度层次的发问。每个深度层次可以对应到某个技术深度。
第一个发问是基本概念层次,考察候选人对概念的理解能力和深度;
第二个发问是原理机制层次,考察候选人对概念的内涵和外延的理解深度;
第三个发问是应用层次,考察候选人的应用能力和思维敏捷程度。
跳跃式/交叉式发问
比如,讲到哈希高效查找,可以谈谈哈希一致性算法 。 两者既有关联又有很多不同点。也是一种技术广度的考察方法。
总结性发问
比如,你在做 XXX 中,获得了哪些可以分享的经验? 考察候选人的归纳总结能力。
实战与理论结合
比如,候选人叙述 JVM 内存模型布局之后,可以接着问:有哪些原因可能会导致 OOM , 有哪些预防措施? 你是否遇到过内存泄露的问题? 如何排查和解决这类问题?
比如,候选人有谈到 SQL 优化和索引优化,那就正好谈谈索引的实现原理,如何建立最佳索引?
比如,候选人有谈到事务,那就正好谈谈事务实现原理,隔离级别,快照实现等;
熟悉与不熟悉结合
针对候选人简历上写的熟悉的部分,和没有写出的都问下。比如候选人简历上写着:熟悉 JVM 内存模型, 那我就考察下内存管理相关(熟悉部分),再考察下 Java 并发工具类(不确定是否熟悉部分)。
死知识与活知识结合
比如,查找算法有哪些?顺序查找、二分查找、哈希查找。这些大家通常能说出来,也是“死知识”。
这些查找算法各适用于什么场景?在你工作中,有哪些场景用到了哪些查找算法?为什么? 这些是“活知识”。
学习或工作中遇到的
有时,在学习和工作中遇到的问题,也可以作为面试题。
比如,最近在学习《操作系统导论》并发部分,有一章节是如何使数据结构成为线程安全的。这里就有一些可以提问的地方:如何实现一个锁?如何实现一个线程安全的计数器?如何实现一个线程安全的链表?如何实现一个线程安全的 Map ?如何提升并发的性能?
工作中遇到的问题,也可以抽象提炼出来,作为技术基础面试题。
考察中的注意点:
技术栈适配度发问
如果候选人(简历上所写的)使用的某些技术与本公司的技术栈比较契合,则可以针对这些技术点进行深入提问,考察候选人在这些技术点的掌握程度。如果掌握程度比较好,则技术适配度相对更高一些。
当然,这一点并不能作为筛掉那些没有使用该技术栈的候选人的依据。比如本公司使用 Mongodb 和 MySQL, 而一个候选人没有用过 Mongodb, 但使用过 MySQL, Redis, ES, HBase 等多种存储系统,那么适配度并不比仅使用过 MySQL 和 Mongodb 的候选人逊色,因为他所涉及的技术广度更大,可以推断出他有足够能力掌握 Mongodb。
应对背题式面试
首先,背题式面试,说明候选人至少是有做准备的。当然,对于招聘的一方来说,更希望找到有能力而不是仅记忆了知识的候选人。
应对背题式面试,可以通过 “引导-横向发问-深入发问” 的方式,先对候选人关于某个知识点的深度和广度做一个了解,然后出一道实际应用题来考察他是否能灵活使用知识。
比如 Java 线程同步机制,可以出一道题:线程 A 执行了一段代码,然后创建了一个异步任务在线程 B 中执行,线程 A 需要等待线程 B 执行完成后才能继续执行,请问怎么实现?
”理论 + 应用题“的模式。敌知我之变,而不知我变之形。变之形,不计其数。
实用不生僻
考察工作中频繁用到的知识、技能和能力,不考察冷僻的知识。
比如我偏向考察数据结构与算法、并发、设计 这三类。因为这三类非常基础非常核心。
综合串联式发问
知识之间总是相互联系着的,不要单独考察一个知识点。
设计一个初始问题,比如说查找算法,然后从这个初始问题出发,串联起各个知识点。比如:在每一个技术点上,都可以应用以上发问技巧,导向不同的问题分支。同时考察面试者的深度、广度和应用能力。
一般面试的开头,都是让候选人自我介绍,还是介绍最近所做的项目。
考察方向:
考察目标:
实习与项目经历描述(简历)
解决问题能力考察
仅仅只是技术基础还不够,通常最好结合实际业务,针对他项目里的业务,抽象出技术问题进行考察。
解决思路重在层层递进。这一点对于面试官的要求也比较高,兼具良好的倾听能力、技术深度和业务经验。首先要仔细倾听候选人的阐述,找到适当的技术切入点,然后进行发问。如果进不去,那就容易考察失败。
常见问题:
性能方面,qps, tps 多少?采用了什么优化措施,达成了什么效果?
如果有大数据量,如何处理?如何保证稳定性?
你觉得这个功能/模块/系统的关键点在哪里?有什么解决方案?
为什么使用 XXX 而不是 YYY ?
长字段如何做索引?
还有哪些方案或思路?各自的利弊?
第三方对接,如何应对外部接口的不稳定性?
第三方对接,对接大量外部系统,代码可维护性?
资损场景?严重故障场景?
线上出现了 CPU 飙高,如何处理? OOM 如何处理? IO 读写尖刺,如何排查?
线上运行过程中,出现过哪些问题?如何解决的?
多个子系统之间的数据一致性问题?
如果需要新增一个 XXX 需求,如何扩展?
重来一遍,你觉得可以在哪些方面改进?
系统可问的关联问题:
绝大多数系统都有性能相关问题。如果没有性能问题,则说明是小系统,小系统就不值得考察了;
中大型系统通常有技术选型问题;
绝大多数系统都有改进空间;
大多数业务系统都涉及可扩展性问题和可维护性问题;
大多数重要业务系统都经历过比较惨重的线上教训;
大数据量系统必定有稳定性问题;
消费系统必定有时延和堆积问题;
第三方系统对接必定涉及可靠性问题;
分布式系统必定涉及可用性问题;
多个子系统协同必定涉及数据一致性问题;
交易系统有资损和故障场景;
设计问题
21届
先笔试:考察能不能做出来,编码习惯,调试技巧,异常处理意识等
再面试:
引入环节:
项目考察
工程能力考察:
redis及其应用
消息队列及其应用
缓存更新策略
SOLID设计原则
web安全漏洞攻防
系统的性能优化思路: 索引,缓存
哈希冲突解决, 一致性哈希算法等
IO多路复用
数据库容灾,主从同步等
专业基础:
操作系统
计算机网络: https TCP状态
数据结构基础: 红黑树,B+树,
数据库基础
编码语言基础
其它:
平常看的非课本的书籍
总结的习惯
对最新的一些技术热点的了解,是否有好奇心
是否有阅读一些组件或常见的开源项目的源码
是否有问题要问面试官(不能评价面试表现,统一答复需要综合简历,笔试,面试情况再看或有规定不能回答)
网络
数据库:
mysql 默认事务隔离级别 可重复读
乐观锁,悲观锁的区别: 排他性, ABA
主从同步怎么实现,MVCC
索引: 回表,非主键存储, B+树, 叶子节点
哪些字段上建索引,频繁,组合索引,性别不合适,过滤性,匹配东西很多,建立索引比较核心的考量点
数据结构:
java:
AOP: 干嘛的,java的做面向切面的操作, 执行特定的业务做一些切面,比如说某一个任务,完成之后设定定时任务,切面,加注解,操作完后执行完某一个行为
双亲委派,加载类的时候,从上往下查,类的重复加载,核心的API不会被篡改
GC:需要解决哪些问题
不同的代上去做,对于哪个代去完成任务,标记复制
内存的使用情况: 管理内存,了解到新建的对象是否释放, 哪些空间是空余的; 查,有的话,分配给他,没有则, GCRooter去查,不可达的要清理掉,让对象所在空间释放回收
stop 的worker,暂停其它线程去做内存的检索和清理,释放内存需要查到用的是哪块内存空间
jvm内存结构, java会有,线程私有会有程序计数器,
一个java文件编译出多少个class文件,一一对应,内部类
面向对象: 单一职责,开闭原则,里氏替换原则,在用面向对象时,子类只有能替换基类时才能使用这么一个基类
redis:
解决什么问题, 第三方服务,缓存,存信息,分布式锁
缓存: 惰性删除,定期删除,取一些key进行删除的操作,定期删除加惰性删除,内存淘汰机制
缓存穿透,恶意请求, 怎么防: 布隆过滤器,判断是否在这里面,没有则不请求,查明确定没有的,生成键值
redis: 为什么那么快,处理速度快,数据结构,内存,单线程的处理
常用数据结构: string , hash, set, zset, list, zset的底层实现 跳跃表, 压缩链表,跳跃表,查某一个正常查询时,挨个遍历或通过索引进行搜索,索引的方式
消息队列: 生产者,消费者模型,去做一个操作,比如说,
分布式事务, 解耦,限流,削峰,流量控制
异步处理:rabbitmq, kafka< rocketmq
常见的web安全漏洞,中间人攻击,https会有这样的 SQL注入,xss
SQL注入怎么防, mybatis,只要用到了敏感信息不能让,输入一些字段替换,而是应该通过字段,只处理数据,不让sql逻辑的一部分就可以避免
经典一些的计算机书籍:
linux操作系统, 并发编程,重构,讲代码的规范,设计模式,介绍灭一种设计模式的应用场景,实现的场景
github上overflow, 书
写文章的习惯, 常见的错误会记录,会记录不用的, word文档
docker 封装, GPU, docker, java 等开源项目
开源组件的源码, spring 的源码, MVC, spring booter, 大概的调用情况, bin的生命周期, 网上,还是和google搜的会多一点
python后台
有一个查询指定用户的订单ID的http服务接口 http://a.b.c/querytrade
接受Post json格式数据 {"username": "abc"}
返回格式为json: {"success": true, "message": "error message if failures.", "data": [11111, 22223, 33333,]}
请实现一个分装实现一个函数,通过该接口查询返回对应的的订单列表,要注意函数的可靠性与健壮性。
考察点: PEP-8风格,异常处理,http请求处理,json
import requests
URL = "http://a.b.c/querytrade"
def get_user_trades(username, timeout=3):
data = {"username": username}
resp = requests.post(URL, json=data, timeout=timeout)
resp.raise_for_status()
try:
result = resp.json()
if result["success"]:
return result["data"]
else:
raise Exception(result["message"])
except ValueError as e: # if result not json format.
raise Exception("...")
写一个程序,该程序接受控制台输入两个数组,合并两个数组,并进行去重、排序
需考虑异常情况,例如输入不是数字等
工程能力考察:
专业基础:
js常见操作、es6新知识
异步编程的基础概念
事件循环概念
操作系统
计算机网络: https TCP状态
数据结构基础: 红黑树,B+树,
数据库基础
编码语言基础
数据库:
mysql 默认事务隔离级别 可重复读
乐观锁,悲观锁的区别: 排他性, ABA
主从同步怎么实现,MVCC
索引: 回表,非主键存储, B+树, 叶子节点
哪些字段上建索引,频繁,组合索引,性别不合适,过滤性,匹配东西很多,建立索引比较核心的考量点
常见的web安全漏洞,中间人攻击,https会有这样的 SQL注入,xss
笔试题
请将数组[1, 2,1,…] 进行去重,不少于两种方法。
请写出以下代码的输出;并说明为什么(常见题)
有一个学生id数组:[1,2,3,4], 请写一个函数function getStudentInfo(studentIdArr),返回4个学生的额外信息。(1. 使用async await; 2.不允许出现Promise)
请分别提供两个函数,将下面的数组和树形结构相互转换,
有个页面url: 请分别使用原生js代码获取以下值
实现cookie的工具CookieTool,有三个方法
1)set(name, value, hours): 设置cookie的值, hours为多少小时后过期
2)get(name): 获取cookie的值
3)remove(name): 删除cookie的值
编写一个函数, 使得其被以下任一方式调用都可得到预期结果
1)sum(1, 2, 3) = sum(1)(2)(3);
2)sum(2, 3) = sum(2)(3)();
假设一个非空数组,找出出现次数最多的数字
写一个3列的布局,第一列和第三列都是固定宽度200px,第二列自适应铺满宽度
面试题:
Vue2.x 生命周期
系统自带: beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroyed
一旦进入到页面或者组件,会执行哪些生命周期,顺序。 beforeCreate created beforeMount mounted
父子组件的created和mounted的执行顺序。
执行顺序如下:父组件 created → 子组件 created → 子组件 mounted → 父组件 mounted
如果有多个子组件:
谈谈你对keep-alive的了解
v-if和v-show区别
v-if和v-for优先级:v-for的优先级要比v-if高
ref是什么?来获取dom的
nextTick是什么?获取更新后的dom内容
scoped原理:
Vue中如何做样式穿透
Vue组件传值
computed、methods、watch有什么区别?
props和data优先级谁高?
props ===> methods ===> data ===> computed ===>watch
面试题:Vuex有哪些属性?
state、getters、mutations、actions、modules state 类似于组件中data,存放数据 getters 类型于组件中computed mutations 类似于组件中methods actions 提交mutations的 modules 把以上4个属性再细分,让仓库更好管理
Vuex是单向数据流还是双向数据流?
Vuex是单向数据流
Vuex中的mutaitons和actions区别
mutaitons : 都是同步事物 actions : 可以包含任意异步操作 ***在调试中就看出来
Vuex如何做持久化存储
Vuex本身不是持久化存储 1. 使用localStorage自己写 2. 使用vuex-persist插件
Vue设置代理
module.exports = { publicPath:'./', devServer: { proxy: 'http://localhost:3000' } }
Vue项目打包上线
Vue路由模式
路由模式有俩种:history、hash
区别: 1. 表现形态不同 history:/about hash:/#/about 2. 跳转请求 history : /id ===>发送请求 hash : 不会发送请求 3. 打包后前端自测要使用hash,如果使用history会出现空白页
介绍一下SPA以及SPA有什么缺点
SPA是什么?单页面应用 缺点: 1. SEO优化不好 2. 性能不是特别好
Vue路径传值
http://localhost:8080/about?a=1 1.1 传:this.$router.push({ path:'/about', query:{ a:1 } }) 1.2 接:this.$route.query.a
http://localhost:8080/about 2.1 传:this.$router.push({ name:'About', params:{ a:1 } }) 2.2 接:this.$route.params.a
路由导航守卫有哪些
全局、路由独享、组件内 1. 全局 beforeEach、beforeResolve、afterEach 2. 路由独享 beforeEnter 3. 组件内 beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave 使用场景:判断是否登录,如果登录就next否则就跳转到登录
更多面试题:
1.js语言:
问题 | 答案 | 考察点 |
---|---|---|
构造函数和原型链 | 1 | 考察原型到原型链 |
es6相对es5, 有哪些变化,你工作中常用的有哪些? | 考察js的基础掌握情况 | |
generator是什么? 为什么它可以实现同步写代码的能力? | 考察js的深度 | |
Promise是用来解决什么问题?前端浏览器api中,有哪些返回的是Promise实例? | 考察Promise的原理和掌握程度; | |
你喜欢用ts吗?为什么 | 对新东西的拥抱度 | |
前端页面加载优化 | 1.接口个数设计 2.并发 |
2.页面前端:
问题 | 答案 | 考察点 |
---|---|---|
跨域请求解决方案有哪几个?现在最常用的是什么? | 考察对浏览器同源策略的掌握 | |
前端发起ajax请求,常用的有**“浏览器原生api fetch"和"业界封装的axios”,**优劣点是什么 | 考察ajax的掌握水平 | |
前端单页面路由实现有hash和history?各自是怎么实现的,各有什么优缺点 | 考察是否只是依赖框架,是否能独立解决路由带来的个性化难题 | |
两个按钮,点击后,请求图片并展示,如何解决网络请求延迟不确定性,导致第一个请求晚于第二个请求时,展示图片错误 | 综合设计、编码 | |
cookie、localStorage和sessionStorage 三者之间的区别以及存储、获取、删除等使用方式 | 1 | 前端本地存储方式知识点的掌握 |
3.后端nodejs
问题 | 答案 | 考察点 |
---|---|---|
nodejs是i/o密集型的,还是cpu密集型的?nodejs如何处理高并发? | 对nodejs使用的姿势 | |
nodejs是单进程还是多进程?是单线程还是多线程? | 属于nodejs经典干扰问题,答什么都是错的。nodejs即是单进程,也是多进程;即是单线程,也是多线程;关键看面试者从什么角度去看待并解答这个问题。 | |
async和await的原理 | ||
nodejs有哪些经典的“反面样例”,会导致服务性能变差? | 考察实际编码能力,以及对服务的调优能力 |
4.vue和框架等
问题 | 答案 | 考察点 |
---|---|---|
vue和react的区别?以及二者通传统前端框架/库的区别 | 是否只是无脑使用框架 | |
vuex中,actions, mutations, modules的作用分别是什么 | 对vue框架的掌握和大型项目的操控 | |
双向绑定和单向数据流的区别,以及现有哪些框架采用了哪种方式?vue里面有双向绑定的例子吗? | ||
父created,父mounted,子created,子mounted 执行顺序是怎么样的 | 生命周期了解程度 | |
webpack是怎么工作的 | ||
koa框架相对express,有什么优势 | ||
项目要重构,你是怎么选择技术方案的? | 做项目的套路 |
参考资料:1+,2,3,4,5, 6,7,8