作者:codegoose

https://segmentfault.com/a/1190000017864721

经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次出征。

鹅厂

面试职位:go后端开发工程师,接受从Java转语言

都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言.

之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以OS这块吃的亏比较大

一面:基础技术面

电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单。大概整理回忆了一下:

  • redis有没有用过,常用的数据结构以及在业务中使用的场景。

  • redis的hash怎么实现的?

  • rehash过程讲一下和JavaHashMap的rehash有什么区别?

  • redis cluster有没有了解过,怎么做到高可用的?

  • 说说redis的持久化机制,为啥不能用redis做专门的持久化数据库存储?

  • 了不了解tcp/udp,说下两者的定义,tcp为什么要三次握手和四次挥手?

  • tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制

  • 知不知道time_wait状态,这个状态出现在什么地方,有什么用?

  • udp是不可靠的传输,如果你来设计一个基于udp差不多可靠的算法,怎么设计?

  • http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。

  • 看你项目里面用了etcd,讲解下etcd干什么用的,怎么保证高可用和一致性?

  • 既然你提到了raft算法,讲下raft算法的基本流程?raft算法里面如果出现脑裂怎么处理?

  • 有没有了解过paxos和zookeeper的zab算法,他们之前有啥区别?

  • 你们后端用什么数据库做持久化的?有没有用到分库分表,怎么做的?

  • 索引的常见实现方式有哪些,有哪些区别?

  • MySQL的存储引擎有哪些,有哪些区别?

  • InnoDB使用的是什么方式实现索引,怎么实现的?说下聚簇索引和非聚簇索引的区别?

  • 有没有了解过协程?说下协程和线程的区别?

  • 算法题一个,剑指offer第51题,数组中的重复数字?

大概说下我自己的回答情况,redis这块没啥问题,具体rehash有印象是渐进式的,但是具体原理可能答的有点出入。

tcp的 time_wait 这块答的不是很好,之前没有了解过quic机制的实现,所以问可靠性udp的时候,基本上脑子里就照着tcp的实现在说。

https这块没啥说的,之前项目里面有用到类似的东西,研究的比较清楚了。

raft算法这个因为刚好在刷6.824(才刷到lab2。。。),答的也凑合,不过paxos和zab算法确实不熟悉,直接说不会。

MySQL这块很熟了,包括索引,锁,事务机制以及mvcc等等,没啥说的,都已经补齐了。

协程和线程,主要说了go程和Java线程的区别以及go程的调度模型。面试官提示没有提到线程的有内核态的切换,go程只在用户态调度。

最后一个算法题,首先说使用HashMap来做,说空间复杂度能不能降到O(1),后面想了大概5min才想出来原地置换的思路。

总得来说,答的还行,一面就这么过了。

二面:项目技术面

二面从基础技术考察转移到了项目,主要问了我下面一些问题:

  • 针对自己最熟悉的项目,画出项目的架构图,项目主要的数据表结构。

  • 说说项目中使用到的技术点,项目的总峰值qps,时延。

  • 有没有分析过时延出现的耗时分别出现在什么地方,项目有啥改进的地方没有?

  • 如果请求出现问题没有响应,如何定位问题,说下思路?

  • tcp 粘包问题怎么处理?

  • 然后还问了下缓存更新的模式,以及会出现的问题和应对思路?

  • 除了公司项目之外,业余时间有没有研究过知名项目或做出过贡献?

这一面答的也比较顺利,因为都是围绕项目,自己很熟悉,基本都没有啥问题,除了面试官说项目经验稍弱之外,其余还不错。

三面:综合技术面

这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不够,导致面试的节奏有点乱。举个例子:

其中有个题:go程和线程有什么区别?

:起一个go程大概只需要4kb的内存,起一个Java线程需要1.5MB的内存;go程的调度在用户态非常轻量,Java线程的切换成本比较高。

接着问为啥成本比较高?因为Java线程的调度需要在用户态和内核态切换所以成本高?为啥在用户态和内核态之间切换调度成本比较高?我简单说了下内核态和用户态的定义。

接着问,还是没有明白为啥成本高?心里瞬间崩溃,没完没了了呀,OS这块依旧是痛呀,支支吾吾半天放弃了。

后面所有的提问都是这种模式,结果回答的节奏全无,感觉被套路了。大多度都能回答个一二甚至是一二三,但是再往后或者再深入的OS层面就GG了。

后面问了下项目过程中遇到的最大的挑战,以及怎么解决的?

还问了一个问题定位的问题,服务器CPU 100%怎么定位?

可能是由于平时定位业务问题的思维定势,加之处于蒙蔽状态,随口就是:

  • 先查看监控面板看有无突发流量异常

  • 接着查看业务日志是否有异常,针对CPU100%那个时间段,取一个典型业务流程的日志查看

  • 最后才提到使用top命令来监控看是哪个进程占用到100%

果然阵脚大乱,张口就来,捂脸。。。

对这个问题,本来正确的思路应该是先用top定位出问题的进程,再用top定位到出问题的线程,再打印线程堆栈查看运行情况

这个流程换平时肯定能答出来,但是,但是没有但是。还是得好好总结。

最后问了一个系统设计题目(朋友圈的设计),白板上面画出系统的架构图,主要的表结构和讲解主要的业务流程,如果用户变多流量变大,架构将怎么扩展,怎样应对?

这个答的也有点乱,直接上来自顾自的用了一个通用的架构,感觉毫无亮点。

后面反思应该先定位业务的特点,这个业务明显是读多写少。然后和面试官沟通一期刚开始的方案的用户量,性能要求,单机目标qps是什么等等?

在明确系统的特点和约束之后再来设计,而不是一开始就是用典型互联网的那种通用架构自顾自己搞自己的方案。

面试结果:3天后收到短信,被拒

总结:
  1. tcp/udp,http和https还有网络这块(各种网络模型,已经select,poll和epoll)一定要非常熟悉

  2. 一定要有拿的出手的项目经验,而且要能够讲清楚,讲清楚项目中取舍,设计模型和数据表

  3. 分布式要非常熟悉

  4. 常见问题定位一定要有思路

  5. 操作系统,还是操作系统,重要的事情说三遍

  6. 系统设计,思路,思路,思路,一定要思路清晰,一定要总结下系统设计的流程

  7. 一点心得,平时blog和专栏看的再多,如果没有自己的思考不过是过眼云烟,根本不会成为自己的东西,就像内核态和用户态,平常也看过,但是没细想,突然要自己说,还真说不出来,这就很尴尬了。勿以浮沙筑高台,基础这种东西还是需要时间去慢慢打牢,多去思考和总结。

关注Java技术栈微信公众号,在后台回复关键字:面试,可以获取一份栈长整理的 Java 面试干货。

最近干货分享

Java 8 创建 Stream 的 10 种方式

不小心执行了 rm -f,先别急着跑路

Intellij IDEA 智能补全的 10 个姿势!

Spring Boot 面试,一个问题就干趴下了

分享一份Java架构师学习资料

点击「阅读原文」一起搞技术,爽~

3年Java,鏖战腾讯的更多相关文章

  1. JAVA 对接腾讯地图,经纬度转换

    package com.lvjing.util; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.spr ...

  2. Java加腾讯云实现短信验证码功能

    一.概要 现如今在日常工作和生活中短信验证码对于我们来说是非常熟悉的,比较常见的注册账号或者交易支付时候,手机会收到一个短信验证码,我们可以通过验证码来有效验证身份,避免一些信息被盗. 验证身份 目前 ...

  3. java 调用腾讯身份OCR接口文档实例(绝对可用)

      1.情景展示 通过读取身份证照片上的信息,实现自动填充功能. 2.原因分析 想要解析照片上所携带的相关信息,就需要识别照片的功能,腾讯提供了免费的身份证OCR接口,可供大家使用. 没有耐心的可以直 ...

  4. java连接腾讯云上的redis

    目录 腾讯云上的配置 redis连接单机和集群 依赖 pom.xml redis参数的配置文件 遗留问题 腾讯云上的配置 在安全组上打开相关的端口即可 "来源" 就是你的目标服务器 ...

  5. Java调用腾讯云短信接口,完成验证码的发送(不成功你来砍我!!)

    一.前言 我们在一些网站注册页面,经常会见到手机验证码的存在,这些验证码一般的小公司都是去买一些大的厂家的短信服务,自己开发对小公司的成本花费太大了!今天小编就带着大家来学习一下腾讯云的短信接口,体验 ...

  6. java 调用腾讯云短信api

    依赖: <!--腾讯短信依赖--> <dependency> <groupId>com.github.qcloudsms</groupId> <a ...

  7. Java通过腾讯邮箱发送邮件

    private static void sendEmaill() { Properties prop = new Properties(); //协议 prop.setProperty("m ...

  8. 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例

    做了个Android项目,需要接入新浪微博,实现时也顺带着研究了下腾讯微博和人人网的Android客户端接入,本文就跟大家分享下三者的Android客户端接入方法. 一.实例概述 说白了,接入微博就是 ...

  9. 云平台编程与开发(七)-使用X5Cloud云平台开发网络彩讯

    云平台编程与开发(七)-使用X5Cloud云平台开发网络彩讯 博客分类: 云平台 云计算 Java Android Android 云平台 Java 网络彩讯定义以及工作大概流程  下载试用地址:ap ...

随机推荐

  1. POJ 3764 The xor-longest Path (01字典树)

    <题目链接> 题目大意: 给定一颗$n$个节点$(n\leq10^5)$,有边权的树,其边权$(0\leq w < 2^{31})$.让你求出这棵树上任意两个节点之间的异或最大值. ...

  2. windows不重装系统和重建MBR分区表来扩展系统盘

    step1. 下载Acronis Disk Director Suite工具,随便一搜都能下载的到. step2. 这个软件使用非常easy,网上有非常多图文教程.扩充盘使用Increase the ...

  3. jxl读取excel浮点数据时,小数点后三位截取问题

    今天导入Excel数据时,发现很多浮点数据被自动四舍五入只保留了三位,原来是jxl里对getContents()进行了封装,对数值型数据作了该处理.一般我们会对读取excel的一整套流程作为工具类,那 ...

  4. idea 配置maven web项目

    文章转自:https://www.cnblogs.com/weiqingfeng/p/9494914.html 步骤一:首先先创建一个project,上次我说过了创建一个project就是一个工作空间 ...

  5. 使用网易云web 版外部链接

    右击打开控制台,找到音乐列表 ——> 点开详情 -------> 生成外部链接器 ,如: outchain/0/3073492173    ,这是每一个音乐的编号. 然后拼接上它的官网域名 ...

  6. 分页插件 Bootstrap Paginator

    Bootstrap Paginator是一款基于Bootstrap的js分页插件,功能很丰富,个人觉得这款插件已经无可挑剔了.它提供了一系列的参数用来支持用户的定制,提供了公共的方法可随时获得插件状态 ...

  7. rpc - rpc 程序号数据库

    SYNOPSIS /etc/rpc DESCRIPTION rpc 文件列出了rpc 程序的可读名, 可以此代替rpc 程序号. 每行包含如下信息: 运行rpc 程序的服务名 rpc 程序号 别名 各 ...

  8. 基于6U VPX的 SRIO 接口, 和PCIe 接口的msata 固态存储卡

    基于6U VPX 的mSATA高性能数据存储板     一.板卡概述 该产品系我司自主研发.基于标准6U VPX架构. 二.产品特性       最大存储容量8TB        读写方式RAID0 ...

  9. "=="、equals、hashCode之间的区别

    1. "=="分为两种情况: (1) 基本数据类型,比较的是其对应的值是否相等: (2) 引用类型,比较的是他们在内存中存放的地址(或者说,是否指向同意对象). 2. equals ...

  10. 在Linux服务器上运行jar包,并且使jar包一直处于后台执行

    1.我jar包在linux的目录为/a/bbb.jar         正常情况下,使用在/a目录下使用  java -jar bbb.jar 可以直接运行该jar包的项目,运行成功之后使用crtl+ ...