经过半年的沉淀,加上对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算法这个因为刚好在刷,答的也凑合,不过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天后收到短信,被拒

总结:

  • tcp/udp,http和https还有网络这块(各种网络模型,已经select,poll和epoll)一定要非常熟悉
  • 一定要有拿的出手的项目经验,而且要能够讲清楚,讲清楚项目中取舍,设计模型和数据表
  • 分布式要非常熟悉
  • 常见问题定位一定要有思路
  • 操作系统,还是操作系统,重要的事情说三遍
  • 系统设计,思路,思路,思路,一定要思路清晰,一定要总结下系统设计的流程
  • 一点心得,平时blog和专栏看的再多,如果没有自己的思考不过是过眼云烟,根本不会成为自己的东西,就像内核态和用户态,平常也看过,但是没细想,突然要自己说,还真说不出来,这就很尴尬了。勿以浮沙筑高台,基础这种东西还是需要时间去慢慢打牢,多去思考和总结。

群内提供免费的Java架构学习资料,QQ群:643459718
(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,
MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

鹅厂三面让我体无完肤!5年经验Java程序员记一次失败的面试分享相关推荐

  1. 在鹅厂,我作为一个Java 程序员每天都在摸鱼!!!

    作为一名 在大.中.小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获.包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源. 先从我的第一份 Jav ...

  2. Java程序员面试时应注意的三个经典问题!

    近年来我国信息化发展越来越快,使得国内各地的信息化建设如火如荼,出现了大量的信息化人才,尤其是Java软件人才的缺口.而我国信息化人才培养还处于发展阶段,导致社会实际需求人才基数远远大于信息化人才的培 ...

  3. 【同行说技术】Java程序员小白变大神必读资料汇总(三)

    在之前的Java技术汇总文章里,向大家介绍了Java入门学习的基础资料,今天小编汇总了5篇Java技术进阶实操的干货,赶紧来看看吧!另外,喜欢写博客的工程师博主可以加工程师博主交流群:39151912 ...

  4. Java程序员月薪三万,需要技术达到什么水平?

    最近跟朋友在一起聚会的时候,提了一个问题,说Java程序员如何能月薪达到二万,技术水平需要达到什么程度?人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿二万的不太 ...

  5. 决定Java程序员工资高低的三个因素

    因为工资高,吸引了一大批人纷纷加入IT行业.的确,就目前的形势来看,IT行业的平均工资确实高于一般行业,但这并以为只要进入这一行就是高工资,想要获得高工资还是看个人技术和其他因素的. 本篇文章总结了影 ...

  6. Java程序员月薪达到三万,需要技术水平达到什么程度?(转)

    Java程序员如何能月薪达到三万,技术水平需要达到什么程度?人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿二万的不太可能是码农了,应该已经转管理.还有区域问题, ...

  7. Java程序员月薪达到三万,需要技术水平达到什么程度?(文末送书)

    最近跟朋友在一起聚会的时候,提了一个问题,说Java程序员如何能月薪达到三万,技术水平需要达到什么程度?人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿二万的不太 ...

  8. 年薪二十、三十、四十万的Java程序员的生活现状

    点击上方"程序员大咖",选择"置顶公众号" 关键时刻,第一时间送达! 深圳程序员 把年终奖金这种虚无的算上,刚好过了20的线,此外又是从始至终从事软件行业.符合 ...

  9. 金三银四过后整理出的阿里最新Java程序员面试题目(2018.4月)

    目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术一面 Java IO流的 ...

  10. Java程序员日常积累-向大神学习(三)

    前言 <Java程序员日常积累-向大神学习>系列是本人根据日常工作中碰到的问题写的一个问题记录,比较琐碎零散. 主要用于记录和忘记时可以有个地方查询.现分享给大家,这是这个系列的第三篇. ...

最新文章

  1. php 安全上传图片,php 图片上传安全探讨
  2. golang中的可见性
  3. 云栖大会发布全球调度算法大赛,阿里又要搞什么黑科技?
  4. jmeter正则表达式提取器多模块相互调用
  5. 自定义View 进度条
  6. Spring 3.0 发布候选版 3 已经可用!
  7. 软件设计之UML的几种关系
  8. [转载] python中的MySQLdb模块
  9. 【九度OJ1522】|【剑指offer21】包含min函数的栈
  10. grid设置时间格式
  11. 对WORD文档的关键字搜索
  12. C语言程序与程序设计语言
  13. matlab平滑处理例题,(完整word版)matlab中smooth函数平滑处理数据实例
  14. 关于springboot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案...
  15. iOS之悬浮视图:按钮/图片/轮播图/gif图/视频/音频/自定义view
  16. 解决Eth0网卡不存在的情况_wuli大世界_新浪博客
  17. 如何删除计算机中常用列表,清除右键多余菜单,鼠标右键菜单清理的方法(一) -电脑资料...
  18. 制作7Z格式可安装程序包
  19. Matlab填充多边形
  20. VS2010 调用的目标发生了异常

热门文章

  1. QML中的Imports声明
  2. docker的安装和阿里云加速
  3. Python面向对象编程、类
  4. ECRS软件解析:标准工时是怎么计算的?如何计算标准工时?
  5. 阿里巴巴 Java 开发手册 1.4.0
  6. HVM(硬件辅助虚拟化)技术
  7. 电壁挂炉在别墅中的应用优势
  8. KNX智能家居工程设计
  9. 江苏省计算机二级c 上机试题,2010~2012年江苏省计算机二级C上级考试试题及答案上机.doc...
  10. SEA 参数解释 和 SEA failover 测试