前言
笔者面试的是网易测试开发-中台的一个岗位。虽然我做的是后端,但毕竟测试和开发是分不开的,索性试一试。但这个岗位了解后还是测试重一些,毕竟测试在前。网易的话四轮面试,前两轮技术面,三面HR,四面技术总监。
前两轮技术面都是视频面试,HR会让你下载一个网易内部的会议软件。到时间回给你会议号进入会议室就可以了。
说一句在前面的话,不得不说网易的面试官特别好,一般都只会问你简历上或者是你讲出来的东西,即使你当时想不起来,他也会引导你解决这个问题,所以放平心态就可以了。
一面的流程大概是这样子:
-
自我介绍
-
项目遇到过什么问题?怎么解决?
-
ORM 优劣势?
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
作用:
省去自己拼写SQL,保证 SQL 语法的正确性,一次编写可以适配多个数据库,防止 SQL 注入攻击等
优点:
1)提高开发效率,降低开发成本
2)使开发更加对象化
3)可移植
4)可以很方便地引入数据缓存之类的附加功能
缺点:
1)自动化进行关系数据库的映射需要消耗系统性能。其实这里的性能消耗还好啦,一般来说都可以忽略之。
2)在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。
- TCP/UDP 应用场景?
TCP 协议:
(在传输之前先建立连接)面向连接(的通信服务);可靠的数据传输,失序,无差错,无丢失,无重复
用途: 适用于传输内容比较大,网络情况比较好, 需要提供准确的情况,比如:聊天信息, 文字传输,邮件传输
UDP 协议: 面向无连接的服务,不可靠,发送时由发送端自主进行, 不考虑接收端
用途:适用于网络较差, 对传输准确性要求低, 广播组播,比如:视频会议,广播数据
- 有两个数据库表,两个表的主键都是 cid,现在需要查一下在 A表里面有的,在 B表里没有的数据
(我是这么写的,这样写应该好理解一些。)
select * from A left join B on a.id = b.id where b.id is null;
- 1
-
常用 linux 命令
-
linux 文件查找单词
grep -o 单词名 文件名
- 1
- 查找单词出现的次数
grep -o 单词名 文件名 | wc - l
- 1
-
docker 原理
-
ES 和日志的交互(日志怎么传给 ES)
filebeat 收集日志发送到 ES, 按指定格式解析日志
- 迭代器和生成器
(一面和二面都问了,这个是重点。)
迭代器
是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string,list,dict,tuple 等这类容器对象,使用 for循环遍历是很方便的.在后台 for 语句对容器对象调用 iter() 函数,iter()也是 python 的内置函数.iter()会返回一个定义了 next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是 python 的内置函数.在没有后续元素时,next()会抛出一个 StopIteration 异常.
生成器
是创建迭代器的简单而强大的工具.他们写起来就像是正规的函数,只是在需要返回数据的时候使用 yield 语句.每次 next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)
区别:
生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存.除了创建喝保存程序状态的自动方法,当生成器终结时,还会自动抛出 StopIteration 异常.
- 装饰器
(说一下自己对装饰器的理解就可以了。)
给已有函数增加额外功能的函数,它本质上是一个闭包函数,···
- 写一个装饰器打印出被装饰函数执行时间
import time
def run_time(func):
def wrapper(*args, **kwargs):
begin_time = time.time()
a = func(*args, **kwargs)
end_time = time.time()
t = end_time - begin_time
print(f'{t}')
return a
return wrapper
@run_time
def func():
print('----')
time.sleep(2)
func()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
-
单链表翻转
(实习的时候不怎么用到算法,我就直接和面试官说了不太会,最近在看。面试官后面也就没问有关算法的东西了,二面也没问,应该是这个面试官和后面的面试官说过了。算法的话,一线城市还都挺重视的,如果去一线城市面试的话,建议大家打好算法基础。) -
字典排序
{’’a”:1. “b”:3, “c”: 2}
# 输出结果按 value值 排序
a = sorted(d.items(), key=lambda x: x[1])
print(a)
# 排序后的结果只显示 key
b = dict(a).keys()
print(b)
- 1
- 2
- 3
- 4
- 5
- 6
可能因为是应届生,其实也没问什么太深的问题。再说说二面吧
二面流程:
我把主要的问题列出来了,二面问题没有整理的很好就不发出来了,很多都是对一些东西的理解,可能每个人的理解都不一样,这里就说个大概了。
-
自我介绍
-
介绍项目
-
Nginx 的作用
-
负载均衡策略
-
Wsgi 协议
-
redis 缓存
-
celery 的使用场景
这里不仅要说出应用场景,重点要突出异步的概念
-
Linux中用vim几个常用的命令(全局替换之类的)
vim的常用命令我有总结,详细见《Linux下Vim常用操作命令大全》
-
迭代器
-
GIL
线程全局锁(Global Interpreter Lock), 即 python 为了保证线程安全而采取的独立线程运行的限制, 就是一个核在同一时间运行一个线程, 对于 io 密集型任务, python 的多线程起到作用, 但对于 cpu 密集型任务, python的多线程几乎占不到任务优势, 还有可能因为争夺资源而变慢。
解决办法就是多进程和下面的协程(协程也只是单 cpu,但是能减小切换代价提升性能
-
线程安全
-
知道服务器网站和端口10000,服务器出问题时,怎么找到服务器的安装位置
-
input是输入,写代码实现第二行的输出
input: [1, 2, 3, 5, 6, 9, 10, 11, 12, 13, 20]
output: [[1, 3], [5, 6], [9, 13], [20]]
- 1
- 2
基本上是这些问题吧,后面我也问了面试官喜欢什么样的面试者,他说:对整个项目理解很透彻,积极向上的人吧。
其实这也是我们面试的重点,不能一味的去背面试题,而不注重项目的梳理,虽然我们可能只是做了项目中的一部分,但对贯穿整个项目的技术点一定要熟悉,能够讲出来,也有自己的见解,包括那些常见的面试题也一样,有自己的想法会很加分,这样在面试官心里对你的满意度会很高。