3年Java,鏖战腾讯

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 3年Java,鏖战腾讯

image.png作者:codegoose https://segmentfault.com/a/1190000017864721


经过半年的沉淀,加上对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算法这个因为刚好在刷6.824(才刷到lab2。。。),答的也凑合,不过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技术栈微信公众号,在后台回复关键字:面试,可以获取一份栈长整理的 Java 面试干货。


推荐去我的博客阅读更多:


1.Java JVM、集合、多线程、新特性系列教程


2.Spring MVC、Spring Boot、Spring Cloud 系列教程


3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程


4.Java、后端、架构、阿里巴巴等大厂最新面试题


生活很美好,明天见~


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
存储 Java
「Java面试」工作3年竟然回答不出如何理解Reentrantlock实现原理
一个3 年工作经验的小伙伴,在面试的时候被这样一个问题。”谈谈你对ReentrantLock实现原理的理解“,他当时零零散散的说了一些。但好像没有说关键点。希望我分享一下我的理解。
93 0
|
6月前
|
SQL 算法 安全
面试美团、头条、百度、京东,一名3年Java开发经验的面试总结
毕业转行做开发3年以来, 学到了很多, 加上自己的兴趣爱好, 个人认为已经成为了一个合格的程序员. 与刚开始找工作面试相同的是都会问一些相同的问题, 不同的是现在面试官会更注重为什么, 也就是说注重深度而非广度. 3年, 5年, 10年分别是个人从事技术方面职业规划中的一个坎, 3年大部分时间应对了业务逻辑, 培养良好的规范和思想, 基础知识还是欠缺.
|
数据采集 SQL 消息中间件
3年Java开发转型大数据开发,如何跳出CRUD舒适区?
3年Java开发转型大数据开发,如何跳出CRUD舒适区?
3年Java开发转型大数据开发,如何跳出CRUD舒适区?
|
消息中间件 JSON 前端开发
面试一个 3 年 Java 程序员,一个问题都不会!
面试一个 3 年 Java 程序员,一个问题都不会!
139 0
面试一个 3 年 Java 程序员,一个问题都不会!
|
人工智能 算法 Java
3年大合辑:算法、研发、Java开发、Android开发、机器学习免费电子书一键下载
12本阿里技术官方出版电子书开放下载啦!还在一个个地搜吗?不如来收藏本合辑吧!
71619 0
|
设计模式 SQL 算法
3年工作经验的java程序员应该具备的技能
  1、基本语法   这包括static、final、transient等关键字的作用,foreach循环的原理等等。今天面试我问你static关键字有哪些作 用,如果你答出static修饰变量、修饰方法我会认为你合格,答出静态块,我会认为你不错,答出静态内部类我会认为你很好,答出静态导包我会对你很满 意,因为能看出你非常热衷研究技术。   最深入的一次,我记得面试官直接问到了我Volatile关 键字的底层实现原理(顺便插一句,面试和被面试本身就是相对的,面试官能问这个问题同时也让面试者感觉到面试官也是一个喜爱研究技术的人,增加了面试者对 公司的好感,我最终选择的就是问了这个问题的公司)
156 0
|
Java 程序员 微服务
Java程序员涨薪必备技能(1-3年必看!)
工作1-3年,当我们向老板提出加薪的时候,或者跳槽去“捡”offer的时候,我们底气够吗? 敢不敢不给涨薪就“挥一挥衣袖,不带走一个bug”?是不是提出要求后你的主管、经理立刻同意,为了把你留住。 然而,现实往往是... 互联网公司面试道路又长且阻,技术面少的两轮,多的五六轮 技术不过硬,其他的都免谈。
3310 0
|
缓存 Java 关系型数据库
3年Java开发6个点搞定高并发系统面试疑惑
6个点搞定高并发系统面试疑惑
3年java开发竟然还不知道Lambda的这个坑
3年java开发竟然还不知道Lambda的这个坑