极客时间已完结课程限时免费阅读

06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?

06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?-极客时间

06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?

讲述:唐扬

时长07:39大小7.02M

分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 34

提建议

上一篇
05 | 系统设计目标(三):如何让系统易于扩展?
下一篇
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
 写留言

精选留言(38)

  • 👽
    2019-10-14
    首先谈谈我对HashMap的理解。 首先,实现原理:基于数组和链表,JDK8以后也会在特定情况下转为红黑树。 以对象的Hash值确定数据所在下标,如果下标里已经有数据,则用链表存储。在链表超过8时转化为红黑树。 转红黑树的目的是:红黑树的查找时间复杂度是logn,而链表是n,红黑树保证了在同一个下标下数据元素过多时候的高性能。 为什么在8之后才转红黑树:因为转红黑树,以及维护红黑树的左旋右旋需要额外的性能开销。而在数据量较小的时候,优化时间复杂度意义不明显。(例如:二分查找在数据量小的时候,性能提升不大)自认为这一条回答也算是红黑树和链表的优劣势。 HashMap不是线程安全的,所以有ConcurrentHashMap。 ConcurrentHashMap的线程安全,是使用了加锁的方式。 1.8之后,对加锁的数据粒度更加细化。每次只锁一个node。所以1.8以后的ConcurrentHashMap在并发下性能大幅度提高。 关于redis的问题,说实话,我觉得跳表 和 红黑树,我觉得都是可以的。因为核心目的是高性能,这两个在查找的时候性能都不错。硬要说的话红黑树性能更高(看测评是更高,理论上讲实际差距不是特别大),但是同时也更耗费内存(因为跳表的内存消耗是可控的)。而现在2019年这个时间点,为了用户体验,更多的还是以空间换时间,所以,我个人认为,红黑树可能更合适。 然后是想请教的面试问题: 1,请问老师如何看待基础与技能广度的重要性对比?就是说,主流的分布式框架我掌握的并不全,但是我觉得我数据结构,算法,Java这些的基础比同期其他人都要好,我认为我可以很快掌握公司所需的技术。您会接受我这样的人嘛? 2,现在的公司,面试动不动就需要你有高并发经验。但是,没有高并发的经验就无法进入有高并发场景的公司。(一个先有鸡还是先有蛋的问题)关于这种现象,您怎么看?有没有什么建议?
    展开

    作者回复: 1. 其实我会看工作年限,如果您工作了五年之后,我觉得基础知识更重要,技能广度可以慢慢培养;如果工作了七八年了,还是需要有一些技术的视野的 2. 要多思考,多看出,了解高并发的基础知识,然后考虑如果自己的业务到了更高的量级要如何解决

    共 8 条评论
    36
  • 小喵喵
    2019-09-30
    好多面试官喜欢数据来说话,比如做高并发系统时,面试官问,你做的高并发系统TPS是多少,QPS又是多少,日活跃是多少?负载用什么来做?为什么要做负载,每一台机器的配置是如何?(核数?CPU?内存?硬盘等?)对于这些数据化问题,心里没有底,随便回答一个数据,面试官一下子就看出来了,知道你在忽悠,没有真正做过高并发系统。请老师举例一些量化(数据化)的面试问题,并且如何回答?

    作者回复: 这就要你在平时的时候多了解维护系统的数据了,数据对于性能优化很重要

    共 7 条评论
    24
  • 吃饭饭
    2019-10-08
    感觉自己有点笨了,老师举的案例我没有看明白是哪里的问题。问题是:存储用户认证信息的缓存命中率极低,只有 20% 发现,老师发现 slab class5 占用了 2G 内存中的 1.9G ,但是用户认证信息用的是 slab class6。既然单独的空间都是 2G ,class5 的占用跟 class6 有什么关系,class6 的空间很充足,为什么还是会自动剔除,难道这里自动过期吗,求解答?

    作者回复: 是说slab class 5 占用了绝大多数的空间,那么slab class 6最多只能分配到100M,可是我们的缓存的用户认证信息的数据量远大于100M,而认证信息的数据大小又大于class 5的大小,没法存储到slab class 5里面,所以就会产生剔除了

    共 4 条评论
    13
  • 邋遢的流浪剑客
    2019-09-30
    无论是为了面试还是个人成长,基础知识都很重要,其实开源组件会用是很简单的,真正涉及到开源组件的底层原理离不开数据结构、计算机网络、操作系统这些基础知识,这些知识可不是一朝一夕就能搞定的,现实情况是很多程序员往往忽略了这方面的学习

    作者回复: 是的,没错~

    共 2 条评论
    12
  • longslee
    2019-10-04
    老师咱还真遇见过“刁难”的哈哈,比如Java的那几个HashMap问题,我觉得我都答了,他还问我“你是不是背的啊?”(😫不知道是何用意)。 另,非常希望老师站在面试官的角度,对我这种只有传统项目经验,没有实际高并发实战但平时也略有学习(比如学习您的专栏😊)的人,提出怎样的问题;针对面试中要求的一个中间件,我确实没有用过,面试官优先觉得这人不行,还是能根据所答基础知识推导出以后学习这项技能没问题呢?

    作者回复: 如果是我的话,我会更关注基础知识,你可以没有用过,但是基本的原理要了解了~

    共 2 条评论
    7
  • 仙道
    2019-10-02
    咱们平时的工作大多数都是CRUD,如何在面试中介绍项目经验

    作者回复: 剧透一下,在面试现场的第二期会讲到哈~

    共 2 条评论
    7
  • 小喵喵
    2019-09-30
    请老师举几个案例分析一下,工程师和架构师是如何做自我介绍的?

    作者回复: 倒也不分工程师和架构师,只是在面试介绍项目经历的时候可以多突出你的贡献,比如你解决了什么问题,如何优化了性能,设计了那些方案,突出做的事情的难点,以及你的解决思路。我可以在后面面试现场里面讲讲这个:)

    共 2 条评论
    6
  • 平平无奇古哥哥
    2020-10-26
    我个人觉得是这样的哈。首先我们使用某个技术或者是某个框架,类库,是用来解决问题的。对于这些技术,我们的心态应该是把它们当做工具。作为一个工具,我们肯定是先知道用它是来干嘛的,然后知道大概的运行原理,这对使用就足够了。如果使用过程中,发现这个东西太好了,设计得太优秀了,那可以带着兴趣去了解一下它背后的设计,甚至是去读一读源码。我觉得这应该是个正确的流程,而不是一上来就听别人说这东西面试考,所以我去囫囵吞枣学源码,这样心态很容易崩。要知道,世界上那么多优秀框架和技术,你不可能所有的都去学源码吧。个人觉得我们的心思还是要放在解决问题上,这个框架再好,我只关注它为我解决哪些问题。
    展开
    5
  • 若尘2B
    2019-10-04
    老师,您上面说的Memcache案例直击到了痛点。但是引发出另一个问题,您那次的案例是基于出现问题之前去深挖了组建的设计、原理还是问题导向。那次案例时隔多长,您现在记忆犹新。我现在的矛盾深挖原理都爱是基于问题导向,在处理阶段可以掌握那些组建的使用和问题处理,但是时间一久就容易忘记,虽然也会写使用的经验,总结,爬坑日志,但问题不再出现之后,最多2月基本忘的干净。我们该怎么管理自己掌握的技能,在面对技术迭代更新都如此之快的时代我们要怎样才不会被淘汰?
    展开

    作者回复: 问题导向是应该的,遇到问题要深挖,找到根本原因,其中肯定会了解一些原理。但是问题毕竟不多,可以多关注一些你用到组件的基本原理

    共 2 条评论
    4
  • 次声波~~
    2019-10-15
    我最近刚开始当面试官,其实我觉得当面试官也很难...在有限的时间内真的很难看出来面试者是不是一个好的coder,能否高效写出逻辑清晰的代码。现在网上面试题那么多,多准备准备基本上java 和数据结构的题都能答得无懈可击。请问您一般是怎么招人的啊?

    作者回复: 1. 多问原理 2. 考察解决问题的能力,比如你遇到什么问题,问问解决的思路 3. 当场写代码

    共 3 条评论
    4
  • William Ning
    2019-09-30
    一下读完了,自认欠缺很多
    共 1 条评论
    3
  • 积极
    2021-05-01
    有些面试官问原理 问疯了 一上来就问websocket原理 我当时懵逼了 一个协议怎么有原理。我觉得问太过执着原理的面试官工作能力应该很差
    共 1 条评论
    2
  • 丁丁历险记
    2019-12-02
    redis 源码里面有个sort.c 不到600行,管他懂不懂,可以读一下试试。 zsl跳势 区间断差找更快。 实现简单,构建策略灵活(响应速度与开销上方便权衡) 再多说一句,sortedset 可不止是跳表, 这里可以继续挖坑。

    作者回复: 赞👍

    2
  • 堵车
    2019-10-09
    我知道面试官要问什么,我就是答不出来。

    作者回复: 额 加油💪

    共 2 条评论
    2
  • helloworld
    2019-10-07
    老师的观点深度赞同!面试时问的一些原理性的东西其实就是再考察对组件最本质的一些东西。会用组件通通常是说在低并发,少量数据下能让组件跑起来,当所有的量都上去后需要解决问题或者优化时,知道汽车的具体构造和运行原理要远比只会看仪表盘的故障灯要做的高效。打卡05。

    作者回复: 👍

    2
  • 大魔王汪汪
    2019-09-30
    sortedset使用红黑树好还是跳表好

    作者回复: 跳表……

    共 9 条评论
    3
  • 黄展志
    2019-12-11
    唐老师,想问一下,运维需要了解像redis,memcached,mysql,zk,ceph,hadoop,elk,zabbix,分布式一致性算法等等众多组件的实现原理吗?

    作者回复: 技多不压身~

    共 2 条评论
    1
  • woshicai
    2019-11-24
    这方面确实薄弱,平时工作时间一般不会花在组件实现的原理上,后面要在工作之外补上这个薄弱点。
    1
  • 约书亚
    2019-09-30
    由于不懂memcached所以案例没看懂。 从描述上看,slab class没有足够空间,会查找更大的,但没提什么时候会剔除缓存,剔除哪些,猜想是剔除相同slab class的? 前面说单节点2G用了300M,后面又说slab class 5占了2G中的1.9G,莫非此2G非彼2G? 看起来像是内存不够用导致频繁剔除缓存,只不过memcached的机制会剔除相同slab class造成了这种现象?
    展开

    作者回复: 是剔除相同slab class下的。例子里的的意思是一共分配了2g的空间,但是有1.9g给了slab class 5,剩余100m给了其他的slab class,那么300m的意思是slab class 5的1.9g只用了200m,其他的slab class的100m都占满了,这样加起来是300m

    共 6 条评论
    1
  • 高源
    2019-09-30
    了解原理是解决问题一方面,我想问老师如何提高利用算法解决问题能力,工作忙刷题又坚持不下去,都是靠自己来学习提高。老师有什么好的方法吗😊

    作者回复: 多用一些碎片的时间,比如上下班的时间~

    共 2 条评论
    1