通过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次出征。面试
面试职位:go后端开发工程师,接受从Java转语言redis
都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言.算法
以前面试Java的公司侧重仍是在数据结构、网络、框架、数据库和分布式。因此OS这块吃的亏比较大数据库
电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单。大概整理回忆了一下:后端
大概说下我本身的回答状况,redis这块没啥问题,具体rehash有印象是渐进式的,可是具体原理可能答的有点出入。 tcp的 time_wait 这块答的不是很好,以前没有了解过quic机制的实现,因此问可靠性udp的时候,基本上脑子里就照着tcp的实如今说。 https这块没啥说的,以前项目里面有用到相似的东西,研究的比较清楚了。 raft算法这个由于恰好在刷,答的也凑合,不过paxos和zab算法确实不熟悉,直接说不会。 MySQL这块很熟了,包括索引,锁,事务机制以及mvcc等等,没啥说的,都已经补齐了。 协程和线程,主要说了go程和Java线程的区别以及go程的调度模型。面试官提示没有提到线程的有内核态的切换,go程只在用户态调度。 最后一个算法题,首先说使用HashMap来作,说空间复杂度能不能降到O(1),后面想了大概5min才想出来原地置换的思路。数组
总得来讲,答的还行,一面就这么过了。缓存
二面从基础技术考察转移到了项目,主要问了我下面一些问题:服务器
这一面答的也比较顺利,由于都是围绕项目,本身很熟悉,基本都没有啥问题,除了面试官说项目经验稍弱以外,其他还不错。网络
这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不够,致使面试的节奏有点乱。举个例子:数据结构
其中有个题:go程和线程有什么区别? 答:起一个go程大概只须要4kb的内存,起一个Java线程须要1.5MB的内存;go程的调度在用户态很是轻量,Java线程的切换成本比较高。 接着问为啥成本比较高?由于Java线程的调度须要在用户态和内核态切换因此成本高?为啥在用户态和内核态之间切换调度成本比较高?我简单说了下内核态和用户态的定义。 接着问,仍是没有明白为啥成本高?内心瞬间崩溃,没完没了了呀,OS这块依旧是痛呀,支支吾吾半天放弃了。
后面全部的提问都是这种模式,结果回答的节奏全无,感受被套路了。大多度都能回答个一二甚至是一二三,可是再日后或者再深刻的OS层面就GG了。
后面问了下项目过程当中遇到的最大的挑战,以及怎么解决的?
还问了一个问题定位的问题,服务器CPU 100%怎么定位?
多是因为平时定位业务问题的思惟定势,加之处于蒙蔽状态,随口就是:
果真阵脚大乱,张口就来,捂脸。。。 原本正确的思路应该是先用top定位出问题的进程,再用top定位到出问题的线程,再打印线程堆栈查看运行状况,这个流程换平时确定能答出来,可是,可是没有可是。仍是得好好总结。
最后问了一个系统设计题目(朋友圈的设计),白板上面画出系统的架构图,主要的表结构和讲解主要的业务流程,若是用户变多流量变大,架构将怎么扩展,怎样应对? 这个答的也有点乱,直接上来自顾自的用了一个通用的架构,感受毫无亮点。后面反思应该先定位业务的特色,这个业务明显是读多写少,而后和面试官沟通一期刚开始的方案的用户量,性能要求,单机目标qps是什么等等?在明确系统的特色和约束以后再来设计,而不是一开始就是用典型互联网的那种通用架构自顾本身搞本身的方案。