转载

难得的一次技术面——终得小米offer

从面试到现在已有一个多月了,面试的问题还记得八九成。端午节前刚从上家离职趁着假期有空把面试问题总结一下。主要是记录一下问题,答案三言两语写不完,网上有蛮多文章讲的挺好所以本文不再展开。

技术栈

java , golang , js , python 主要是前面两个。

面试总结

  1. 其他Java团队leader面
  2. 其他Golang团队leader面
  3. 本团队leader面
  4. 总监面

之所以把面试总结放前面是因为头一次写文章没经验下面排版太朴素了,怕大家看不下去所以先简单几句话概况。面试总共4小时,4轮。回忆了一下大概回答了90~95%左右,总体感觉还可以。给我的印象这几个面试官都很专业,问题质量也挺高,人也很nice。

这次面试像是照镜子知道了自身的不足,接下来还需扎实沉淀技术。加强算法能力。理解源码。 努力不负每次机会

2年前从sz回到wh 然后才感受到sz的好。属于后知后觉类型。看着以前用友的同事们一个个跳的都挺棒(阿里、腾讯、百度、京东、美团、网易等等)自己再看下自己感觉在 荒野求生

没啥爱好这几年除了玩玩游戏就是看看技术,也没考虑过人生追求,但是最近半年思考了一下人生突然知道了自己想要什么(都二十八九岁马上奔三了这也太后知后觉了)

统计下数据算个帐

19年wh 投了50+ 面了4个 拿到2个。。大部分是不回复。

17年wh 投了10多个 面了7个 拿到4个。(后来某种原因拒绝了讯飞的offer、选择了某公司)

12~16年sz 数据不记得了。虽然自己是个弱鸡但是感觉工作挺好找。(16年用友)

所以19年wh真是神奇,我一度怀疑是简历太水了,发给sz、hz朋友看他们说还好啊没问题。难道是特朗普贸易战搞的招聘困难?【微笑】

本文标题怎讲

讲个真实的笑话,前一阵子在wh面一家小公司架构师职位 场景:4个人同时面我,一个大桌子,总经理办公室

总经理:我要不要做销售啊你以前做过销售吗?

我:尴尬的说做销售太难了我没这个能力。(【黑人问号】难道我看起来这么没有技术含量?我投了几十个简历了兴奋的来这里你跟我说这?这对的起我认真的态度吗?)

总经理:哦!你公司做硬件产品的啊!(我简历里有写NLP机器人项目)

我:“这是个软件产品”(what the f**k,大哥哥你对我有严重的误解。)

总经理:那就让技术总监来面一下吧(估计是让他没面子了)

开始技术面

他: 介绍一下你做的项目

我: 介绍某个项目的背景,说了下项目是干啥用的,简单提了一下技术栈 大概5~6分钟 因为要互动所以不能一个人说太久

他:GRPC是干什么用的,你们为什么不用http restful来做呢

我:远程调用 基于http2 有4中调用方式 序列化协议采用protobuf(心里想这么多内容了你一个个的问吧)

他:好的,我技术面完了

总经理补了几句总结性的客套话 面试结束

【WTF 这就结束了?】这才15分钟不到?我就这样被淘汰了?嗯是的【微笑】

ok 综上所述 抱着 终于得到了一次技术面 的心情写下这个题目。

一面 Java

主要是Java基础 框架原理

  1. 详述 线程池 构造方法有哪些各有什么用、 ctlallowCoreThreadTimeOut 变量的作用,初始化阶段、大量提交任务阶段、执行完所有任务阶段这写过程。( addWorker 过程和其它部分回答得不错 runWorker getTask 的一些细节回答的不好。线程池是Java躲不开的问题 网上有很多答案不再细说。)
  2. HashMap 数据结构, resize 过程,如果多线程去操作会出现哪些问题,1.7和1.8有什么变化,既然提到了 红黑树 那么来聊聊它和 BSTAVL 各自有啥特点有啥区别,说一下平衡过程(ok。这个是基础内容网上一大把答案不再细说)
  3. 接下来聊聊 concurrenthashmap 怎样保证线程安全的1.7和1.8区别(ok)
  4. 线程有几种状态, sleep wait 区别(ok)
  5. synchronized Lock 区别,synchronized工作原理对象头、JVM中锁的优化,再聊聊并发包的AQS、公平锁非公平锁 读写锁、CAS和底层的unsafe(ok)
  6. JVM内存结构 ,堆的内存结构哪些是线程共享的呢,使用过javap命令吗结合这个命令你个谈谈对JVM内存各个区的理解。调优相关。(ok)
  7. 聊一下 GC可达性分析算法 、哪些对象可以作为 GC ROOT ,根据新生代老年代特点的不同来说一下他们适合使用哪些垃圾回收算法。对比一下 标记清除标记整理 。(ok)
  8. 类加载器双亲委派安全沙箱机制 (ok)
  9. 聊聊IO吧, BIONIOIO模型 ,jvm怎样实现NIO的呢(ok。还好之前略看了一下JVM这一块的c c++代码。多路复用 非阻塞之类的就不细说了。说几个关键点,IO模型参照《unix网络编程》。 selectpollepollfcntl
  10. 巴拉巴拉聊项目牵扯出一堆问题 一致性hash算法、分布式事物、Service Mesh实践、rabbitmq(基本ok)
  11. TCP滑动窗口 ACK机制。(ok)
  12. zuul、hystrix、feign工作原理,springmvc工作原理(ok)
  13. 举例说明spring中使用到的设计模式(ok,掘金有这个文章)
  14. git使用规范、gitflow(ok)
  15. dubbo 相关问题(ok)

二面 golang

  1. Golang 的并发模型(回答的一般 M、P、G)
  2. 聊聊gin源码 路由、group、middleware &设计模式(路由的实现用到了前缀树这个回答得不好 ,其它ok)
  3. grpc4种调用方式,你看过grpc golang版源码 client --> server这个过程你讲一下。protobuf协议 GRPC 性能优化,http2 (ok,这个印象深刻在上家公司时候还做过分享)
  4. cap原理,注册中心选型AP or CP。
  5. etcd是CAP的哪种?etcd数据一致性算法是?详述raft协议,发生分区隔离之后会怎样,隔离恢复之后怎样保证数据一致性?(ok,说raft之前先说了一下Paxos 后来引出了Raft 对比一下,然后开始讲raft各种情况 极力推荐去这里看看raft.github.io/)
  6. 你说看过源码那聊一下gomicro吧(说了一下各种组件每种适合做什么事,讲了一下我们的项目中微服务用到了哪些,上家公司gomicro技术栈是我推动的所以这里回答得还可以。)
  7. 聊一下你们没有采用gomicro的时候你们的微服务是怎样实践的(注册中心发现用的etcd,lease续期、服务降级、限流、熔断、缓存、一致性hash等负载均衡策略实现,GRPC,golang版rabbitmq客户端&断网重连。不像spring cloud或gomicro很多现成的可以用这些都是手撸 当然这是我的团队共同完成的,这过程中收获蛮多所以不要排斥学习另一门语言或者技术栈 往往会对自己打开一扇窗)
  8. golang压测pprof,火焰图,结合项目讲一下架构推演 性能提升点(OK)
  9. 你们项目结构和依赖管理(OK,这里不得不吐槽一下 godep、glide真的不如maven好用)
  10. 遇到过哪些坑(使用etcd过程中遇到的坑,使用不当造成的协程泄露以及如何避免的,watch、lease、空间压缩、等)
  11. 使用golang你印象深刻的是啥(协程,chan、select这是绝壁是巨好用的,defer,panic&reverse)
  12. golang编码规范、日志规范(这里要提一句规范很重要,架构演进的时候做重构深有体会,然而并没有很统一的规范像Java阿里规范那种,对于分包官方并没有给出一个推荐的目录划分方式 所以google然后根据自身体会制定了一个团队内部规范 后来发现掘金有一篇文章有所共鸣并严重赞同 draveness.me/golang-101 日志框架并没有Java直接采用slf4j 下面用 log4j2或logback那么果断,选之又选决定用logrus,团队的QL同学根据需求定制了)
原文  https://juejin.im/post/5cf9ddb0e51d4510774a8829
正文到此结束
Loading...