小米运维开发一面面经

小米Logo

前言

寒假闲来无事,打算根据自己的秋招经历来写一个面经系列,后续我会陆续将自己秋招过程中的一些面试的面经以公众号的文章形式发表在我的个人微信公众号上。首先我的个人方向为:SRE/运维开发/后端开发,至于其他的诸如前端、算法等方向的面经我会邀请我的朋友们来编写。希望在这里能帮助到大家拿到自己满意的offer。

情况介绍

公司:小米

base:北京

岗位:运维开发工程师

时间:2020年10月22日星期四16点00分

背景:江苏某双非院校软件工程专业考研狗

结果:时间节点位于考研备考期间,准备不够充分,一面就被刷了,小米以及其他大厂都会有一个保护期, 也就是本次秋招被刷之后,只能在六个月之后才能再次投递这家公司。因此建议大家多去小公司面试,打怪升级,等到能力达到之后再去面自己真正想去的公司。

面试通知邮件

面试流程

首先进行自我介绍(3分钟),然后面试官让介绍了一下自己的项目经验。之后问了一下在校学过的一些课程,然后会根据你所熟悉的语言来进行语言基础考察。一面问了不少都是基础的东西,大家在准备的时候还是要重视基础,另外数据结构这块也非常的重要,和其他大厂一样,应该都会问到这些东西。

考察内容

一、计算机常识

二进制内容

给出一个十进制数字和二进制数字让你分别进行转换。

  • 十进制转二进制
  • 二进制转十进制
  • 左移和右移代表的含义

二、Linux

Linux中我常用的指令有哪些

吧啦吧啦,突然一时间还真想不出来多少,说出来大概20个,这种基础问题应该提前准备好的。。。

Linux指令

vim编辑器

  • vim的三种模式?
    • 命令模式
    • 末行模式
    • 编辑模式
  • 如何进入编辑模式?
    • i或者a或者o进入,Esc退出
  • 如何在vim中查找字符串?
    • shift + : 然后加上/后面跟你所有查找的内容
  • 如果查找的结果有多个如何切换上下结果?
    • n向下查找
    • N向上查找
  • 如何对列进行批量编辑
    • ctrl+v 然后用右或者向左方向键选中多行或多列

用sed命令将test.txt中所有的回车替换成下划线

(答案不唯一)

1
cat test.txt | sed "s/\n/_/g"

过滤掉文件中的注释(bash中的注释)和空行

(答案不唯一)

1
cat test.txt | grep ^[^#]

三、计算机网络

OSI七层都是什么

  • 物理层
  • 数据链路层
  • 网络层
  • 传输层
  • 会话层
  • 表示层
  • 应用层

应用层、网络层和传输层都有哪些协议?

协议
应用层 HTTP、HTTPS、POP3、Telnet、SMTP、ftp
传输层 TCP、UDP
网络层 OSPF、RIP、BGP、EGP

DNS

  • DNS你了解吗?

    • 域名解析系统
  • DNS的结构是?

http响应码有哪些?都是什么意思

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

细分的话可以说200(请求成功)、403(拒绝执行请求)、404(找不到资源)、500(服务器内部出错)等这些状态码

四、操作系统

进程和线程的关系和区别

刚好当时是在学习操作系统的,因此还是能说出一些内容来的。

什么时候要用到多线程?

多线程的使用主要是用来处理程序在一部分上会阻塞在另一部分上需要持续运行的场合。

你写过的程序里面用到过多线程吗?

实时聊天室,利用多线程来实现多个客户端之间相互发送消息。

五、语言和数据结构

这里面试官会根据你项目中所使用的语言来进行考察,我的项目中主要使用到的语言是Python,这里问了一些关于Python的基础知识。

python列表和元组的区别

列表元素可以改变,而元组是不可变的。

用列表生成式和列表生成器的区别

1
2
3
4
5
# 这是列表生成式,用中括号括起来
[x*x for x in range(0,10)]

# 这是列表生成器,
(x*x for x in range(0,10))

从这里可以看出他们的区别,一个返回是列表,另一个返回的是对象,该对象包含了对表达式结果的计算引用,通过循环可以直接输出。

1
2
3
items = (x*x for x in range(0,10))
for item in items:
print(item)

除此之外,如果说结果数量较少的时候,可以使用列表生成式,但当结果数量非常多的时候,列表生成式就会占用很大的内存,而列表生成器并不是把结果直接写入内存,而是保存一种计算方式,通过不断的获取,可以获取到相应的位置的值,所以占用的内存仅仅是计算对象的保存。

用列表生成器实现函数:返回指定位数的斐波那契数列

  • yield
1
2
3
4
5
6
7
8
9
10
def fibo(max): 
n, a, b = 0, 0, 1
while n < max:
yield b # 使用 yield
# print(b)
a, b = b, a + b
n = n + 1

for n in fab(5):
print(n)

python map reduce原理

map()是 python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的object并返回。

reduce()的使用方法形如reduce(function, iterable[, initializer]),它的形式和map()函数一样。不过参数f(x)必须有两个参数,initializer是可选的。(注意在Python3中reduce不再是内置函数,而是集成到了functools中,需要导入)它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值来实现。然后又用这个值和序列的下一个元素来获得又一个值,然后继续直到整个序列的内容都遍历完毕以及最后的值会被计算出来为止。

python中for else 语句是什么意思?什么时候用?

1
2
3
4
5
6
7
nums = [1, 2, 3, 4, 5]
for num in nums:
if num == 0:
print("列表中有0元素")
break
else:
print("列表中没有0元素")

如上述代码所示,如果for语句中的程序按照正常的流程执行结束之后,没有输出结果,则会触发else语句,如果for语句中因为break等条件提前结束,则不会出发else语句

将Python列表中指定元素移至末尾

只需要一条语句即可。

1
a.append(a.pop(a.index(3)))

简述装饰器原理,什么时候要用到装饰器

装饰器本只上是一个Python函数,它可以让函数在不进行任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象

装饰器一般可以用来测试函数的运行效率
装饰器常常用于有切面需求的场景,比如插入日志,性能测试,事务处理,缓存,权限的校验等场景,有了装饰器就可以抽出大量与

线性表和二叉树

前面的Python相关的内容回答的比较糟糕,数据结构方面仅问了一些概念,零零碎碎的一些知识点。

总结

小米的面试也算是我人生中第一次面试了,让我比较惊讶的是,我的简历能通过初筛,这点也从侧面说明了小米并不歧视双非的学生,只有你能力足够强,一样可以跟985/211的学生同台PK。小米的一面应该就是工程师面的,面试官人很好,你没回答出来的地方还会很耐心的跟你讲解清楚。很可惜没有做好充分的准备让我白白浪费掉了一次很好的机会,但是也是这次面试之后,让我开始意识到自己在技能上与招聘要求所缺乏的东西,在之后的准备工作中,可以做到有的放矢,精准制导。未来大家在准备面试的过程中,也需要在基础知识上多花点时间,毕竟对于一个较好的程序员来说,会用别人的框架没有什么用,掌握底层的基础知识才能使得你的个人竞争力变强。