面试题专栏介绍
初衷
有朋友告知,网站内容较多,找不到重点。本网站更多的是本人体系化学习Java的笔记和资料集合,因此文章广而全,但确实如朋友所说,有可能会找不到重点,不知道从哪开始看。
因此我决定出一版 “面试题专栏”,以面试作为驱动力,再结合着网站内容高效地复习八股文!
要记住,技术面试不同于编程,编程厉害不代表技术面试就一定能过。现在整体的找工作氛围就是面试造火箭,工作拧螺丝,因此如果没有针对性的面经准备,很难在这个大环境下达到“基础水平”。
我们大部分都只是普通人,没有发过顶刊顶会,没有获得过顶级大赛奖项。在这样一个技术面试氛围下,我们需要花费很多精力来准备面试,来提高自己的技术能力,说得再直白点就是:需要做的就是提升面试能力。
本网站内容可能会有写错或理解不对的地方,还望联系我,将持续更正迭代中~
看面经的建议
以求职为导向来学习,更有针对性,并且可以大概率减少自己处在迷茫的时间,很大程度上还可以让自己少走很多弯路。
- 你需要搞清楚自己要找什么工作;
- 然后根据招聘岗位的要求梳理一份技能清单;
- 根据技能清单写好最终的简历;
- 最后再按照简历的要求去学习和提升,看对应的面经和技术详解。
本面试指南是帮助正在找工作以及准备找工作的同学,在面试之前去复习和突击的一种方式。适合已经在技术领域有一定积累,然后不确定面试切入点,所以可以通过这个面试指南来预热和巩固。
想直接通过刷面试文档找到工作的同学也要注意,面试文档的内容是静态的,但是面试过程是动态的,面试官对于某一个领域的考察,通常是通过连环问的方式去问,所以在面试之前,求职者要对Java 相关技术有一个体系化的了解,从而更好地突出自己的综合能力。
岗位匹配度
岗位匹配度很重要
校招通常项目经历的方向比较宽容,即使你的项目经历和对应公司的具体业务没有关系,影响其实也并不大。但是,假设你正好有与公司业务相匹配的项目,或者与你投递这个岗位相匹配的项目,那么简历的通过率将会大大提升,并且面试官将会对你更感兴趣。因此,如果你学有余力,可以根据不同的岗位来写不同的简历。
而社招通常就会重视你的过往工作经历以及项目经历,HR 在筛选简历的时候会根据这两方面信息来判断你是否满足他们的招聘要求。岗位匹配度越高,自然简历通过率也越高。
面试前准备
首先面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。
怎么写简历
着手准备的第一步聚焦于简历的打造。
简历是他人初步了解你的窗口,其重要性不言而喻,因此精心构思简历至关重要。理想的简历应当围绕你的亲身经历构建,正如某些杰出人士仅凭一句“Unix 的创造者”便足以令人印象深刻。
尽管并非所有人都拥有如此耀眼的成就,但这一例证强调了个人经历在简历中的核心地位。
因此,选择那些能丰富你简历含金量的职位,从事能让你简历熠熠生辉的项目,乃是简历撰写的黄金法则——让经历说话,而非仅仅堆砌文字。
然而,简历的文字表达同样不可小觑,尤其是当我们缺乏显赫背景时。简历应当精炼,避免冗余信息导致焦点模糊,着重突出你的优势与技能。一般而言,简历应涵盖以下核心部分:
- 个人简介:用不超过200 字简明扼要地概括自己,例如:“拥有超十年软件开发经验,带领团队逾四年,专长于构建高可用性、高性能的分布式系统,背景横跨互联网与金融业,目前担任XXX 公司XX 职位,负责XXX 平台。”
- 联系信息:推荐使用专业的电子邮件地址(如163邮箱),避免使用过于休闲的邮箱服务。若拥有个人网站、博客、GitHub 或Stack Overflow 账号,务必附上(但例如github里没有较为优秀的内容,不建议附上),尤其是个性化域名更能彰显主动性和审美品味,且确保页面内容组织得当,真诚无伪。
- 技术作品与展示:展示你的成果,尤其是对于前端开发者更为直接。后端开发者则可通过GitHub 展示项目。专业证书或奖项同样值得提及,如微软或Oracle 认证。
- 技能概览:
- 技术栈:明确列出掌握的编程语言、框架、技术工具及设计理念,如Java、SpringBoot、Redis、分布式系统架构等。
- 专业领域:涵盖前端、算法、机器学习、分布式系统、数据库管理等。
- 行业经验:涉及的行业如金融、电子商务,及特定业务如客户关系管理、支付系统等。
- 软实力与经验:团队管理规模、项目管理经验、个人特质等,简洁明了即可。
确保简历内容与目标职位的技能要求对齐,以便快速建立匹配印象。工作与教育背景需精挑细选,强调关键项目、挑战、责任及所获成就,同时,这些内容应紧密支撑你的技能陈述,避免离题。
简历长度以不超过两页A4 纸为宜,采用PDF 格式以保证格式一致性。可借鉴LinkedIn 或Microsoft Office 模板美化外观,力求内容精炼,重点突出。
记住,简历的目标是凸显你的独特之处,哪怕仅展示两三个亮点,也足以引起注意。最后,简历是打开机遇之门的第一步,尤其在竞争激烈的就业市场中,除了实质性的技能和经验,别出心裁的简历设计与正面积极的自我评价亦能增加脱颖而出的机会。即便初始条件有限,展现出积极的态度、持续的学习意愿和解决问题的能力,同样能传达出你是一个值得投资的潜力股。
技术知识储备
在准备简历时,切记实事求是,你所列出的每一项技能都可能成为面试对话的起点。"精通"、"熟悉"、"了解"需准确区分,以免自相矛盾。
对于提及的每项技术,务必把握其基础及核心概念,因为面试过程中,面试官往往会逐步深入探讨,以此评估你的实际水平。因此,系统性复习相关书籍和资料是不可或缺的步骤,以备不时之需。
例如:
- 如你标明熟练掌握Java,那么不仅限于基础语法,还应涵盖并发编程、NIO、JVM等进阶知识,同时对Spring、Netty 等流行框架的基本原理有所认识。
- 当列举Redis 时,对其数据结构、性能调优策略、高可用部署方式及分布式锁机制等,通过官方文档的研读应达到一定的理解深度。
- 如声称掌握面向对象设计,熟悉《设计模式》中的经典23 种模式将是基本要求。
- 对于分布式架构的宣称,则需对CAP 原则、微服务架构、弹性设计以及SpringCloud、Cloud Native 等相关技术框架有深刻理解。
- 关于网络编程的技能,理解TCP/IP 协议的三次握手、四次挥手过程,Socket 编程基础,以及select、poll、epoll 等I/O 多路复用技术,都是必不可少的知识点。
综上所述,你简历上的每一项技术标注,都应当基于你对该技术核心知识点的掌握之上。这好比备考期末考试,你需要全面回顾教材,确保掌握大多数关键知识点,即使不必面面俱到,但对于80%以上的重点内容,你都应做到心中有数。这样的准备不仅是为了应对面试,更是对自己技术深度和广度的负责态度体现。
项目准备(非常重要)
在面试过程中,分享个人项目经历或解决过的挑战几乎是每个面试官必问的环节,但令人诧异的是,许多候选人并未对此做好充分准备。以下四个经典问题频繁出现于面试之中:
- 分享一个你最为自豪或最近完成的项目。
- 讲述一次你攻克的最复杂或技术含量最高的难题。
- 描述一个你经历过的最具挑战性或最艰难的项目。
- 谈谈你曾犯下的最大技术失误或引发的技术故障。
这些问题背后,面试官的意图各异:
- 第一个问题旨在探查你的成就顶峰、兴趣所在;
- 第二、三题侧重于你的问题解决能力和面对逆境时的心态韧性;
- 而第四题则关注你对待错误的态度,以及是否具备反思与成长的能力。
值得注意的是,面试官会通过连续追问细节来验证信息的真实性,因为虚构的情节难以在严密的追问下自圆其说。
为有效应对这类问题,以下建议或许能帮助你更好地准备:
- 构建故事框架:运用STAR 法则(情境Situation、任务Task、行动Action、结果Result)来组织你的叙述,确保内容条理清晰,避免冗长繁杂。
- 添加细节:丰富的技术细节是说服力的关键,它能让故事显得更加真实可信。
- 注入情感:真挚的情感表达能传递你的热情、自豪与坚持,确保情感源自真实的体验。
- 融入反思:在叙述中穿插你的思考、教训总结及后续的改进措施,展现你的成长和成熟。
达到这样的叙述水平并非易事,需要持续的练习与积累。日常工作中,培养即时总结的习惯,对经历进行记录与反思,是避免临阵磨枪的有效方法。
此外,提升语言组织能力与逻辑思维同样重要。通过撰写工作文档和经营个人技术博客,不仅可以锻炼写作技巧,还能深化对技术的理解和反思。
实际上,这些平日里的功夫,正是在关键时刻展示你专业素养与个人魅力的基石。因此,成功的面试表现,源于平日里一点一滴的积累与修炼。
校招建议
校招Java后端开发学习路线
校招Java后端方向,面试题学习路线:
- Java基础,Java集合,Java并发,JVM原理;(必看必学)
- 数据库:MySQL、Redis数据库;(必看必学)
- 计算机网络:OSI七层,TCP/IP四层,TCP(三次握手四次挥手,为什么要)/UDP,HTTP,HTTPS;(必看必学)
- 数据结构:刷力扣和剑指offer,慢慢的就捡起来了;(大厂必刷)
- 操作系统:linux常见命令,进程线程;(必看必学)
- Java框架:Spirng、MVC、SpringBoot、Mybatis,需要了解常见问题(必看必学);SpringClooud会是加分项,不会也没事(小厂需要有了解)
- 中间件:消息中间件Kafka、RabbitMQ、RocketMQ(这三个会一个就行,Kafka常用)。netty(会是加分项,不会也没事)
前3个是重中之重;4需要贯穿整个学习周期,直到面试前;5略懂就行,能讲清楚进程线程的区别,有哪些通信方式就行(当然也不是说其它的一定都不会问,只是问的概率更小些,有时间操作系统还是建议系统性的学习下的);6 7 可以结合着项目学习。
可能在这里没有看到计算机四件套的计算机组成原理?原因是对于Java后端来说,无需深入的学习过于底层的知识,计算机组成原理大部分知识不重要,但在学有余力的情况下,还是可以去学一学。
注意:人的精力是有限的,不可能把所有知识都搞清楚搞明白,因此需要着重的学习,即使面试时遇到不会的,那只是小部分未涉及到的知识不会,问题不大的~
校招项目选择建议
如果你校招时无实习,或准备找实习:
简历中项目建议至少两个:其中一个业务类型项目(下面是项目要求) + 一个轮子项目(例如手撕spring,手撕RPC等)
无实习简历中应该找什么样的业务类型项目?
- 基础版(至少):springboot + mybaits + mysql + redis + 消息中间件
- 进阶版:SpringClooud(包含dubbo、mq、配置中心等各种中间件)
项目中的前端页面的编写不重要,能看就行,别花大量时间在前端上,记住你是后端开发!
项目中引入了mq、redis这些中间件,就必然带来了系统的复杂性,那么你就必须去考虑你为什么引入这些中间件,这个能一连套的深问下去!
在写简历中项目时,还需要考虑一些额外的问题:你为什么做这个项目?所以
- 如果你参加过软件设计类型比赛,如中国软件杯等,可多沉淀比赛项目,将其写到简历中。
- 如果你已经有实习,则多沉淀实习项目,将其写到简历中。
- 即使两者都没有,也需要去考虑这个问题
如果我是面试官,我会如何问问题?
如何问八股
虽然现在纯问八股的公司不多,但还是有一些公司上来就会先问八股,如果确实要问八股文一般会怎么问,那我一般会从技术广度开始考察,看看候选人对各种技术的了解程度。
比如,我会问有没有用过消息中间件,分布式缓存,分布式搜索,NoSQL,高并发,高可用,高性能这些技术。因为在工作中,我们需要具备一定的技术视野,不能只懂某一个技术点,而对其他技术一无所知。 就像高考一样,不能语文特别好,物理特别差,这样是不行的。尤其是有三到五年经验的候选人,已经过 了初期菜鸟阶段,应该避免技术短板,保证整体技术栈的广度。
接下来,会深入考察候选人的技术深度。比如,如果他在简历上写了熟悉消息中间件,我会从多个角度发问,看看他是不是真的熟悉。比如,我会问他公司线上生产环境用的是什么消息中间件,为什么要引入 消息中间件,为什么选择RabbitMQ而不是RocketMQ或者Kafka,怎么保证消息中间件的高可用性,怎么保证消息不丢失,怎么处理消息重复,如何保证消息顺序,遇到消息积压怎么处理,等等。
这些问题会一 步步深入,考察候选人对消息中间件的理解和实际应用能力。 然后,我会考察候选人的底层技术功底。比如,Java虚拟机的核心原理,内存模型,垃圾回收,FullGC卡顿性能优化,OOM内存溢出问题怎么处理,Java并发中的volatile,锁优化,AQS源码,Netty背后的IO和网络相关知识。这些底层技术是线上高负载大型系统的架构设计和开发必须具备的。
如果候选人在某个 技术上的深度超过我,我会通过不断加深的发问,考察他在自己最熟悉的技术领域的技术深度。 最后,我会从项目经验和系统设计的角度考察候选人。比如,我会问他有没有设计过高并发高可用的系统,遇到过哪些技术挑战,怎么解决的,是否对某个框架或者中间件有深入的理解,是否对这个技术有过线上的高可用部署,承载过高并发流量的访问,是否基于这个技术设计出复杂的系统架构,等等。通过这些问题,我可以全面了解候选人的技术能力和项目经验。
总的来说,我会从技术广度、技术深度、底层技术、项目经验和系统设计几个方面,全方位无死角地考察 候选人。这样才能真正了解候选人的技术水平,找到最合适的人才。
如何问项目?
一般会让面试者先说一下他们项目的整体架构,讲一下用了哪些技术和核心的业务思路。
比如,如果面试者说他们公司用了Dubbo作为 服务框架,那么就会进一步问Dubbo底层的通信框架是什么,是Netty还是Mina,然后再问底层的NIO是什 么,网络通信里的长连接和短连接是什么,是否看过Dubbo的源码,源码中对并发技术的运用有哪些印象 深刻的地方。通过这些问题,就可以深入了解面试者对技术的掌握程度,如果你只是单纯背八股的CRUD 工程师,被问到这些原理时基本都会懵圈。
接着,就会继续深入到项目的业务细节,好的面试官会掌握一个原则:死扣细节。比如,如果面试者说用了 Redis,我会进一步问哪个业务场景用了Redis,业务流程是什么,具体选用了哪种数据结构,存放什么数据,数据的过期时间是什么,如果缓存过期了,数据兜底方案是什么,如何设计的key,为什么要这么设 计,用Redis的过程中有没有碰到一些困难的问题,比如缓存与数据库不一致、缓存雪崩等问题,具体怎么解决的。通过这些问题,我可以看出面试者对技术的实践有多深,是否经历过复杂业务架构下的分布式系统设计和开发。
如果面试者面试的是中级岗位,则会看他们是否技术整体OK,独立负责过核心模块的开发,对各种技术有一定的实践经验。如果是高级或资深岗位,会看他们是否带领一个小团队独立负责过一个有一定复杂度和难度的完整系统的架构设计和开发。
如果是架构师岗位,则会要求他们在公司里主导过很多人协作完成的大型而且复杂的项目群,对大型系统架构有深度的思考和整体的把控,项目要有足够的技术挑战,比如大用户量、高并发、海量数据等。
然后,则继续会考察系统设计能力,尤其是高级工程师及以上的岗位。我会用一些业务场景来问面试者如何设计系统架构,比如如何设计一个电商秒杀系统架构,如何设计一个消息推送系统架构,双11大促时如何设计系统的动态扩容/缩容机制。这些问题可以考察面试者的架构设计思维,尤其是针对没接触过的业务场景。
最后,对于有项目管理经验的同学我会考察他是如何管理项目,把控项目进度以及团队协作的,还有沟通表达能力如何,性格是否踏实,是否有责任心等等。
通过以上问题可以全面考察面试者的技术面是否完整,是否有几个技术领域有足够的深度,做过什么样的项目,项目的实践经验如何,把控过多大的团队和项目,对全新业务场景的系统设计能力如何,基本功如何,综合素质如何等等。
写在最后
如果你很迷茫,看了学习路线还是不知道怎么学,那我建议你可以直接根据我梳理的面试题顺序看下去,这些都是常见的面试题,以面试作为驱动力来学习。
- 如果你不知道简历怎么写,简历项目不知道怎么包装;
- 如果简历中有些内容你不知道该不该写上去;
- 如果有些综合性问题你不知道怎么答;
那么你可以扫描下方二维码联系我,我会尽我所能帮助你。
事先声明:本人也在努力进步中,但我会根据自己的经历帮助你,你可以只听你认为对的。