背景
去年十一月份的某一天,之前实习的时候隔壁组的一个老大跟我聊到近况,有没有想要尝试一些其他的机会。他现在在某大厂,比较缺人,说实习的时候觉得我比较靠谱。
自己的一些规划也是在今年春季尝试着找一找其他的机会,因此就答应下来,决定尝试一下。
面试准备
- 简历准备
由于工作中,经常间歇性的进行述职,晋升答辩。因此对于自己工作的总结以及数据等都有一些准备。时间比较紧张,没有大篇幅的修改简历,只是增加了一些简练的总结。
例如,提出并实施某个业务的技术方案调整,将某个接口的性能提升至200%,接口日均访问量降低近500W次。 - 算法准备
在正式工作两年时间中,经常间歇性的去刷题,两年时间下来,也勉勉强强的写了200+道leetcode。
面试之前,将自己校招时的程序员面试金典拿出来,将其中的算法题整体刷了一遍,都是十分经典的题目,总共花了大概半天的时间。 - 业务准备
业务上,两年的工作时间,参与负责部门几乎最核心的业务,并且实际参与优化三个大版本。因此业务上,是最有东西说的,没有做详细的准备。
不过还是将业务改版的几个关键技术又重新了解了一下,例如原有方案和改版方案差别在哪?利用了哪些技术,然后该技术的相关问题追问。
面试流程
面试的公司在业界是出了名的流程慢,从开始内推到现在(收到口头offer)已经一个半月了。
- 11.29 提供简历
- 12.12 第一次面试 两个小时 一共两面(技术面)
- 12.17 第二次面试 三个小时 一共三面(一面技术 - 1.5h 技术总监 - 40min 技术副总监 - 30min)
- 01.02 第三次面试 半个小时 一面GM面
- 01.14 电话HR面 二十分钟
面试详情
技术一面
-
算法题 - 进制转换
该题目算法难度很低,但是有很多的坑需要注意。个人觉得这道题是考察基础能力+细心程度。
思考一分钟左右,跟面试官沟通。
我:待转换进制K 是否有大小限制 200如何展示 2000如何展示?
面试官:你觉得呢?
我:如果K有限制 比如10以下/26以下,使用字母可以表示。比如128以下,ascii编码,单字符可以表示,如果再高,例如200/2000,则需要考虑使用多字符表示。如果为负数,需要提供负数的进制规则。
面试官:我们只考虑正整数,16以下,超过十用abc表示。
我:转换数N 是否有大小限制,比如是int?
面试官:N是int开始写代码,大概五到十分钟左右完成。讲解代码思路后...
我:字符串拼接使用的JAVA的StringBuilder,拼接不会重新生成字符串,节省内存... (没有鸟我)
面试官:如果N为负数怎么办?
我:没有考虑到,如果N为负数,我们需要规定负数K进制表示方式,然后首先判断N正负,然后按照正数处理。
面试官:字符串拼接是不是拼接反了...
我:没有,我自己还测试过的。结果自己又一测试,果然自己写反了,GG.
面试官:OK,其他的没问题了,下一道题目。 -
算法题- 只出现一次的数字
思考大概两分钟后
我:其实,我遇到过这道题目。
面试官:那你把思路说一下把。
我:使用异或
面试官:OK,下一道题
面试官:如果一个数组,其他数字都出现两次,哦,好吧,这个应该也遇到过...(其实这个我不会)
面试官:如果一个数组,其他数字都出现三次,只有一个数字出现一次,找到这个数字。
我:思考了两分钟左右,说其实我也遇到过,有印象。
面试官:简单说下思路
我:按照位循环计算,对于某一位来说,肯定是 0 个数与1 个数某一个为3倍数,另一个不是,而不是的那个就是出现一次的数字该位的值。
简单写伪码,然后用例子演示。 -
linux命令相关
平时有没有用过Linux命令,都有哪些?除了ls cd 这种。
答:grep awk sed sort uniq du dh top 等等
面试官:使用过 awk,那写一个统计接口平均耗时的命令
# 日志格式
# 域名 api ip 耗时
# www.test.com /hello 127.0.0.1 50
cat access.log | grep '/hello' | awk '{totalTimes=totalTimes+$4} END{print totalTimes/NR}'
当时没有写出来,写了80%左右,主要是对于END START 使用忘记了,说自己平时常用计算频率啥的。
面试官:那计算频率比这个还要复杂啊,那就写一下吧。
# 访问时间 域名 api ip 耗时
# 2019.12.01.12:00:00 www.test.com /hello 127.0.0.1 50
# 计算 hello qps
cat access.log | grep '/hello' | awk '{print $1}' | uniq -c | sort -rn | head
- 业务相关
签到分组相关逻辑 - 三次大的技术改版
使用redis list 防止签到组并发,性能问题
redis pipeline 使用在集群模式下 顺序问题 如何解决的
为什么要改成异步方式?为什么使用redis做队列?mq有使用吗?
mq都使用了哪些?
技术二面
- 自我介绍
实习经历/工作经历 巴拉巴拉 - 业务相关
做的项目 - 签到分组逻辑
介绍业务背景,自己负责的项目以及所起到的作用。(又聊了一次一面的东西)
方案更改成异步,对业务有什么影响,如何解决延时问题?
如何解决异步线程挂掉,集群机器挂掉导致线程死掉问题? - 线程保活方案 - 工程问题 - 抢购问题
你们的业务跟抢购很类似,如果挣脱了课程人数的限制,这个问题如何解决?
首先说明 签到分组 业务逻辑相比于抢购业务 要复杂的多,巴拉巴拉~
然后,在这样'不复杂'但并发会很高的情况下,方案是不一样的。
使用MQ,不使用redis,使用消息异步通知。使用端去限流+后台限流 去限制流量进入。
你们业务也用到了websocket,对他了解吗?
使用框架pomelo,了解不多,http升级协议
如何解决websocket重连问题?
业务上有很多,心跳检测,触发时检测(纯猜测)
http三次握手 四次挥手 谈一下?
巴拉巴拉
PHP 项目有没有使用过守护进程?
使用过,负责聚合消息,业务场景,选型,限制,如何启动?
对守护进程,服务器进程级别 了解吗?
简单了解,进程级别啥的,答的不太行~ - 工作现状
对你们现有的团队,感觉如何?
你期望来这里得到什么?
你目前级别,薪资如何?
现在自己的工作状态 工作氛围 技术氛围如何?
现在的整体技术架构如何?
这些后面几面也都聊到了,详细说。
技术三面
- 自我介绍
- 业务介绍 - 不赘述
- 算法题 - 雪花算法实现
雪花算法 32位 前12位 机器码 后10位 秒级时间戳 中间10位 自增码
这个题目需要使用多线程编程,这方便了解的比较少
说了自己的简单思路,然后,尽量将自己的想法拆解,封装。后来在说唯一的难题,生成下一个序号。需要同步生成,需要加锁,但是会造成性能损耗。
面试官说,这个必须加锁,因此使用 synchronized 同步执行。
public synchronized long nextId() {
long timestamp = this.timeGen();
if (timestamp < this.lastTimestamp) {
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", this.lastTimestamp - timestamp));
} else {
if (this.lastTimestamp == timestamp) {
this.sequence = this.sequence + 1L & 4095L;
if (this.sequence == 0L) {
timestamp = this.tilNextMillis(this.lastTimestamp);
}
} else {
this.sequence = 0L;
}
this.lastTimestamp = timestamp;
return timestamp - 1514736000000L << 22 | this.dataCenterId << 17 | this.workerId << 12 | this.sequence;
}
}
- 工程问题 - 实现发帖回贴功能
讨论具体功能需求,是否评论,子贴是否还可以有子贴。确认只实现最简单功能。
设计数据库,使用mysql,表结构设计,索引设计,缓存设计。
面试官: 如果有某些帖子特别热,一个帖子有千万子贴,如何设计缓存?
我:使用缓存,分页,offset扫表问题 - 可以带上贴id
面试官:为什么不使用 redis?
我: redis 使用zset, 保存顺序,获取贴id展示 但是数据量很大的时候,会对redis有性能影响。
面试官:这是之前贴吧的实现方案。那大key会对redis有什么影响呢?
我:影响读的性能,redis单线程
面试官: 我们不会全量读,读一部分不会有问题
我:会影响redis持久化,持久化时会生成子进程
面试官: 嗯,这是一个点,还有吗?
我:我忘记说啥了,就这个问题又聊了一会~
(忘记具体场景了,比如查询某个帖子下 男性用户回帖的30条记录)
面试官:那比如还是这个问题,一个sql执行起来就是很慢,如何解决。
我:使用explain 看执行计划,看是否使用正确索引。
面试官:用到了索引,但是还是很慢,执行计划,扫描了几十万条记录。查看表里记录,发现这几十万都是女性用户,查询时全扫到了。
我:(当时很懵,感觉掉进坑里了) 画了B+树结构,也不能对性别建索引啊,说了一个不太行的建议,倒序查找。
面试官:倒序也有可能后几十万条也都是女性。
我:... 想不太出来了
面试官:使用复合索引啊
我:哦哦哦,对(...)
面试官:看来你对mysql不太熟悉啊
我:业务场景用的比较少,还是纸上谈兵。redis用的比较多。
总监面(四面) 副总监面(五面) GM面(六面)
- 对自己的规划
三年内,主要提升自己的技术能力。
第一年了解了redis,阅读了30%源码。对mysql/nginx/linux了解加深。
未来两到三年,首先做好业务工作的同时,加强对于以上三种技能的学习理解深入。
语言不是问题,数据结构才是。语言只是数据结构+语言独有的特性。
比如php:fpm java:JVM Go:协程模型 - 有没有遇到什么问题?如何解决的
业务上签到分组需要优化,而线上却还OK,是否需要优化,和产品端沟通,一步一步定下来。
有没有延期?做的优化是不是业务所需要的?
如期完成,优化完更灵活,而且还可以支撑更大量级。 - 我看你之前在 微软 百度都实习过,当时为什么离开呢?
巴拉巴拉~ - 介绍一下你现在的业务(GM)
对整个部门的业务都做了介绍,用户的感受,产品设计的思路等等。
直播如何预约,老师如何上课。老师成本很高,你觉得如何解决?
你们的业务和你们公司其他部门业务有重合,你怎么看?
互动延迟问题,有没有出现?
延迟问题如果在5G时代,会不会有所缓解? - 有没有了解过我们这里,业务比较类似有可借鉴之处吗?
有,忠实粉丝。
业务场景不同,现在我们公司业务主要面向中小学生,目的是吸引用户注意力,因此需要更多更吸引的互动。
而贵公司业务则体量更大,用户需求是视频内容,而不是附加的东西。因此可以适当的做一些轻量级互动,比如竞猜,购物巴拉巴拉。我觉得做的已经很不错了。不需要再额外多了。
如果要做的话,我觉得可以在直播前后,做一些文章,更好一点。
当然,这只是我个人的一些看法。 - 现在教育各个场景都搬到了线上,编程 语文等等,你觉得体育可以吗?
首先我觉得,体育的目的就是在于动,无论是编程还是基础学科都只需要接收屏幕内容,两者是有本质区别的。
其次,我个人认为这个是有可能的,比如现在随着虚拟现实的到来,是不是可以和体育相结合呢?另外任天堂的switch最近风靡的健身环大冒险,就很不错,我觉得这也是一个方向。
HR面
- 考虑换工作原因
有两点,第一在现有公司两年,学到了很多东西,也做了一些事情,很不错。但是能做的东西也都很熟悉了,想要换个环境。第二,贵公司平台很大,有更多的机会和挑战。我想要去试试,做的更多,更快提高。 - 沟通薪资 级别
巴拉巴拉
网友评论