当前位置: 首页 > 面试经验 >

北京-快手 一面面经

优质
小牛编辑
87浏览
2023-08-17

北京-快手  一面面经

不合适的地方欢迎批评指正

1.自我介绍

面试官:“你先做一下自我介绍吧。”

:“面试官您好,我叫XX ,是XX大学网络工程24届应届生,本次应聘的是贵公司的运维开发工程师,我现在是在XX公司当运维开发实习生,主要负责的内容是Shell脚本维护,数据库集群搭建,LVS的配置;大二的时候是在XX做Java开发实习生,工作内容是参与XXWeb平台的开发,和数据爬取处理的工作。现在呢我对运维方案也有了自己的一些理解,后续职业规划也是朝着SRE,和运维这方面发展,希望能够成为快手运维的一份子。”

面试官:“讲下你在实习中遇到的某个问题,解决办法,以及对自己的提升,在其中学到了什么?”

我:“我现在的主要实习工作是写Shell脚本,在上上周的时候有个需求是产品版本升级,需要写了一个seaweedFS ——分布式文件存储的安装脚本,并导入一些系统配置,我在之前是没有用过这个文件存储系统,然后按照网上的系统安装步骤,转成Shell 脚本进行安装,在我写好这个脚本之后自己测试是可以正常安装的,但是当我把这个脚本添加到原来的产品一键部署脚步后,发现这个脚本异常终止,遇到这个情况第一反应就是换一个虚拟机重新试一下,发现还是不行,依旧异常终止;确定不是电脑环境问题,这个时候就需要看启动日志了,我cd 到seaweedFS 的安装目录,然后用less命令查看日志,发现是ElasticSearch 报错,当前集群状态为“red”,seaweedFS 配置错误;询问了开发人员了解到,初始化安装的时候默认往seaweedFS 存储了一些文件,然后需要保存到ElasticSearch 方便检索,但是现在ES状态为Red不允许插入数据,所以报错;后面更改了脚本逻辑在安装seaweedFS之前先判断ES集群状态,等待集群健康值为yellow或为green时再进行,seaweedFS的安装。其中提升了排错的能力,然后也了解到学技术,做SRE不是埋头苦干,需要和同事多交流,才能够提示自己的效率

面试官:“有了解ES状态为什么会是red吗?或者说什么情况下才是green,yellow?

我:“有了解,只要是ES有一个主分片未分配完成就是red状态,主分片分配完成,但是副本分片没有分配完成就是yellow,可以把yellow当成是一个warning其实是不影响我们的正常使用的(毕竟我搭建ES的状态全是yellow 哈哈哈),副本分片和主分片均分配完毕,集群状态就是green

2.计算机网络

面试官:“我问点计算机基础,TCP四次挥手过程讲一下

我:“四次指的是,客户端A发出一次断开请求,服务端先返回一次我收到了你的断开请求,然后再返回一次我已经断开了,之后客户端向服务端发送一次,我知道你已经断开了,总共四次;具体的细节就是三次握手后Client端和Server端都进入ESTABLISHED状态,Client 发送SYN=1,和序列号seq=u 给服务端,自身进入FIN_WAIT_1 状态,服务器收到请求后发送ack=u+1,seq=v,ACK=1,Server端进入close_wait状态,Client端接收到后进入FIN_WAIT_2状态,之后Server端再次向Client端发送报文,FIN=1(表示关闭),seq=w,ack=u+1,进入LAST_ACK状态,Client收到后进入TIME_WAIT状态,像Server端发送ACK=1,seq=uu+1,ack=w+1等待2MLS后进入Closed转态,Server端收到后也进入Closed状态

大概是下面这个样子

面试官:“TCP拥塞控制是怎么做的?

:“TCP进行拥塞控制有四个部分,慢开始,拥塞避免,快重传,快恢复;慢开始从小到大加倍增加拥塞窗口的数值,拥塞避免:每经过一个往返时间RTT就把发送发的拥塞窗口加1,而不是像慢开始阶段那样加倍增长;快重传:接收方快速重传丢失的报文;快恢复:与慢开始类似,慢开始在TCP连接建立时或者是网络拥塞后才使用,快恢复是在遇到3-ACK时触发,常常伴随着快重传”

3.操作系统

面试官:“操作系统内存寻址过程

我:“忘了

面试官:“操作系统中死锁的处理策略?”

我:“构成死锁有几个必要条件,资源独占,不可剥夺,保持申请,循环等待;死锁预防可以通过破坏这几个条件来实现,死锁避免银行家算法”

面试官:“Linxu 防火墙配置 禁用一个ip,禁用某个TCP 端口,聊天框打出来”

禁用一个端口

firewalled-cmd --zone=public --remove-port = 8080/tcp --permant

禁用一个ip

firewalled-cmd --permant --remove-rich-role="rule family="ipv4" source address = "xxx.xxx.xx.xx" port protocol="tcp" port="8080" accept"

面试官:“iptables 会吗?

我:“不会,我都是用的firewalld-cmd”

4.Java

  • Java 忘的有点多,大佬们帮忙补充吧

面试官:“Java String,StringBuilder,StringBuffer 的区别联系”

HashMap底层怎么实现的

HashMap 怎么解决哈希冲突

SpringBoot Bean的生命周期

面试官:“SpringBoot, IOC是什么,设计的好处?”

我:“IOC 控制反转,是一种软件开发的思想,将对象创建交给了IOC容器进行管理,然后我们通过依赖注入@ Autowired @ Resource 的方式来调用;好处是降低了程序的耦合性,让程序员更加专注于业务,比如操作数据库,xml到mapper再到service,再到Controller,每一层我们不太需要关注他的下层是怎么操作的,只管用就行,这也是我理解的Java面向接口编程;对于测试来说,也只需要依赖注入对应的层进行测试,同样是减少耦合”

面试官:“MySQL索引采用什么数据结构,说下自己的理解?”

我:“MySQL采用的是B+树的存储结构,查询数据其实都是和磁盘IO次数有关,越少的话查的也就相对越快,而B+树的特点就是树的高度其实不会很高,他的数据存储在最下面一层也就是叶子结点当中,查找从根节点开始,每一个子节点都有关键字和一些记录项,顺着树的分支进行查找,就能找到目标节点”

5.算法

算法题:数组第k大个数(自己写样例输入输出,尽量不要用库)

(一个 快排+分治 敲了20多分钟,提交19次,我tm真是个菜b)

c++ 版


#include<iostream>
#include<vector>
using namespace std;
int quickSortGetK(vector<int> v, int left, int right, int k) {
    if (left >= right) return v[left];
    int key = v[left];
    int i = left;
    int j = right;
    while (i < j) {
        while (key <= v[j] && i < j) j--;
        while (key >= v[i] && i < j)i++;
        cout << i << " " << j << endl;
        swap(v[i], v[j]);
    }
    swap(v[i], v[left]);
    if (i == k) return v[i];
    if (k < i) return quickSortGetK(v, left, i - 1, k);
    else return  quickSortGetK(v, i + 1, right,k);
}
int main() {
    vector<int> v;
    for (int i = 0; i < 10; i++) {
        int data;
        cin >> data;
        v.push_back(data);
    }
    int k = 3;
    cout << "到这" << endl;
    cout<<quickSortGetK(v, 0, v.size() - 1, v.size()-k);
}
/*
* 10 2 5 3 6 3 6  3 6 3
*/

go 版

package main
import "fmt"
func sortArray(nums []int, k int) int {
	var quick func(nums []int, left, right int, k int) int
	quick = func(nums []int, left, right int, k int) int {
		// 递归终止条件
		if left >= right {
			return nums[left]
		}
		// 左右指针及主元
		i, j, pivot := left, right, nums[left]
		for i < j {
			// 寻找小于主元的右边元素
			for i < j && nums[j] >= pivot {
				j--
			}
			// 寻找大于主元的左边元素
			for i < j && nums[i] <= pivot {
				i++
			}
			// 交换i/j下标元素
			nums[i], nums[j] = nums[j], nums[i]
		}
		// 交换元素
		nums[i], nums[left] = nums[left], nums[i]
		if k < i {
			return quick(nums, left, i-1, k)
		}
		if k > i {
			return quick(nums, i+1, right, k)
		}

		return nums[i]
	}
	return quick(nums, 0, len(nums)-1, k)
}

func main() {
	var number = []int{8, 9, 20, 12, 23, 32, 10, 10, 9, 12} /* n 是一个长度为 10 的数组 */
	k := 1
	answer := sortArray(number, len(number)-k)
	fmt.Print(answer)
}

网页没代码提示,字母打错了报错我也找不到位置 ,size打成zize ,排编译错误浪费很多时间,没看懂网页的那个报错提示,早知道粘IDE上,脑袋抽了,我当时为什么不在IDE上写)

反问:贵公司是哪个部门,部门业务

#快手信息集散地##快手24秋招##面经##如何判断面试是否凉了#
 类似资料: