写点什么

看我如何在面试官前吹牛 P

用户头像
yes
关注
发布于: 2021 年 04 月 07 日
看我如何在面试官前吹牛P

你好,我是 yes。


这篇文章我想谈谈如何在面试官前面吹牛 P。


我给了六个案例,教你如何把 B 格提上去。


这篇文章的灵感来自于一个读者,他在群里 @了我。




我一看,确实啊!


首先 “几个 offer” 说明关于 Synchronized 的面试题很常见。


然后从 “面试官和我争” 可以看出,确实很多人的理解是错的。


然后你再从 JVM 源码层面和他说说,这面试不就妥了?


如果我是面试官,这候选人透露出来他看过 JVM 代码,并且还发现了书上的错误,说的有理有据的,这 level 不就上来了?


这面试不就稳了?


就是这篇关于Synchronized的一个点


提升 B 格的时候到了。


想想看,当面试官问你看过什么源码呀


你答:我看过 JVM 关于 Synchronized 的源码,我发现网上有好多理解都是错误的...阿巴阿巴。


安逸得惨咯!



这么一想,我发现我写过的文章还有好多可以装 23 的地方!


比如这篇:从Dubbo源码到CPU分支预测之旅


面试官问:看过 Dubbo 源码嘛?


你答:看过,我之前看源码的时候还发现了一个很奇怪的地方,有个地方 if 和 switch 结合着用。



我就很奇怪,所以我就用 benchmark 跑了跑,试了试 if 和 switch 的执行效率。


我发现全 if 的效率是最高的。



于是我又反编译了代码。


我发现 switch 是通过查表直接拿索引去访问的,而 if 是每次都会取出变量和条件进行比较。


那不是应该 switch 的效率最佳吗?


带着疑问的我继续查阅资料,后来我发现原来是 CPU 分支预测(详细看上面文章)搞得鬼,所以 Dubbo 的源码才会这样写。


你看,这一波下来,你这表现满分啊


会主动看源码!


会用示例跑(动手)。


会反编译比较,钻研(动手)。


最后到底层 CPU(6666)。



这一套下来?面试官不要你要谁?


再比如这篇:炸了!一口气问了我18个JVM问题!


面试官:你平时看什么书呀


你答:我看过《深入理解 Java 虚拟机》,我还发现了一个错误呢。


面试官:什么错误呀?


你答:不是因为“Con-current Mode Failure”而导致 Full GC ,而是因为发生了 Full GC 所以抛这个错。



我当时好奇看了看 CMS 的源码,我发现.....


后续不贴了,之前的文章写的很清楚了,也是从源码上找证据


面试官一听,这小伙子看书就算了,因为想钻研还去看源码,源码不仅看进去了还看出错误?



不仅热爱学习还有钻研精神,我要给他发 offer!!!!


再比如这篇:Kafka索引设计与二分查询与底层缓存


面试官:你看过 Kafka 源码嘛


你答:看过。


当时看到了 Kafka 索引的设计,采用了稀疏索引,利用二分查找来加快搜索速度。


但是我从源码发现这个二分查找是变型的,因为就消息队列的特性而言,索引数据都是在文件末尾追加的写入的,并且写入的数据基本上会立马被读取。


也就是说数据热点集中在尾部,而操作系统又是根据 LRU 来管理内存页的,所以标准的二分会导致缺页中断的情况发生,所以 Kafka 巧妙的采用了冷热分区来实现变型的二分查找。


你看看,这一波下来,面试官大拇指不给你给谁?


看过源码, 懂得基本算法,理解消息队列尾部热点特性,晓得操作系统 LRU 来淘汰内存页,啧啧!


面试官对你说:



再比如这篇:ConcurrentBag 听过没?好家伙高并发知识点十分密集!


面试官:让你设计一个连接池你怎么设计


你答:我之前看过 HikariCP 的源码。


重点就是无锁设计,因为连接池是读多写少的场景,所以可以利用 CopyOnWriteArrayList 来存储连接,然后再利用本地化存储的思想来减少竞争。


获取连接的流程:


  1. 先去 ThreadLocal 找之前用过的连接,找到则直接返回。

  2. 如果找不到就去 CopyOnWriteArrayList 实现的 sharedList 里面找连接(这里还有个窃取的概念),如果找到则返回。

  3. 如果找不到则用 SynchronousQueue 等待连接,超时则返回 null。



再详细就看上面文章吧。


怎么说?


一般的回答,估计也就会说个加锁保证线程安全。


好点的,说个读多写少场景,用个写时复制。


你这波无锁+写时复制+本地资源加速缓存+SynchronousQueue 无缓存等待队列。



如果你觉得还不够细,那就再说说 HikariCP 的 FastList,它优化了 ArrayList。


ArrayList 每次 get 都会有范围检查,并且 remove 是从前往后遍历的。


而在连接池这个场景每次 get 范围检查没有必要,并且 remove 的时候从后往前遍历更好。


够不够细?


我细到 ArrayList 的 get 的范围检查我都要计较!(HikariCP 不愧是最快的)


面试官可能在角落里瑟瑟发抖。


再比如这个:RPC 核心,万变不离其宗


面试官:让你设计一个 RPC 框架你怎么设计


你答:容我想想(假装思考,其实小宇宙就快忍不住爆发了)。


RPC 框架基础的核心其实就这么几点:


  • 动态代理(屏蔽底层调用细节)

  • 序列化(网络数据传输需要扁平的数据)

  • 协议(规定协议,才能识别数据)

  • 网络传输(I/O 模型 BB 一下,一般用 Netty 作为底层通信框架即可)



注意,上面加粗的其实二字,一定要说,要注意语气,要显得你游刃有余,低调奢华。


当然上面只是基础核心,生产级别需要注册中心作为服务的发现、路由分组、负载均衡、异常重试、限流熔断等。


更详细的就看上面的文章吧~


面试官已经躲在角落里瑟瑟发抖了。



再比如.....


比如不了了,太多了!


我写这篇文章的时候,我发现电脑屏幕竟然越来越高。


原来,是我慢慢地从椅子上滑了下去....


我怕我再举几个例子,我要给自己跪下了。


我时常会看看自己写的文章。


然后,默默在心里念叨这家伙真滴牛 P。


再这样下去,我怕和半佛老师一样,成为一个每天在镜子面前给自己磕头的硬核男人。


欢迎关注我的公众号【yes 的练级攻略】,每周保证至少分享一篇原创技术文。





我是 yes,从一点点到亿点点,我们下篇见

发布于: 2021 年 04 月 07 日阅读数: 30
用户头像

yes

关注

分享后端技术干货,驰骋技术的江湖。 2019.01.17 加入

公众号「yes的练级攻略」

评论

发布
暂无评论
看我如何在面试官前吹牛P