程序员需要准备什么,才能拿到大厂offer?

公司的面试流程一般为:

1.自我介绍

2.介绍你做的项目

3.专业知识的问答

4.场景题

5.算法题

面试时长半个小时~1个小时

接下来看一下自我介绍:

面试公司愿意给你面试机会,说明你的简历已经符合公司的要求。 面试开始前,简单的介绍一下自己即可。这个介绍包括学历,工作履历,并简单介绍一下你之前做的业务,会的技术栈。

如果你是应届生介绍一下你的学校,做过的项目,会的技术栈。

比如面试官问:你先简单的介绍一下你自己?

以我自己的简历回答一下:我叫某某某,15年电子科技大学本科毕业,18电子科技大学硕士毕业,毕业之后再**公司工作,做**业务,在第一家公司待了2年半后,感觉自己的技术提升比较慢,就去了流量更高业务更核心的**公司,做**业务,在这家公司待了2年后,有些厌倦了北漂生活,就回到了成都,去了**公司,做**业务,这是我的教育和工作履历。

我会的技术栈主要是Java和Go,里面的技术和框架我也比较熟悉,我认为我的技术还是比较好的,公司交给我的需求,我也都能按时高效的完成。我是一个对技术有追求并且靠谱踏实的人。

自我介绍完成后,接下来需要和面试官沟通你做过的项目:

你和面试官沟通的项目需要具备如下几个特点:

1.短时间内要说明白你做的项目。 一般公司招人的时候,HR会刷选出来很多简历,面试官一周内可能要面试10-20个人,假设一周面试10个人,其中9个人都不符合公司要求,面试官不太可能在你这里花这么多精力,你要短时间让面试官知道你做的事情,和这件事情的难点和你是怎么做的。

打个比方,你准备和面试官聊你做的排行榜需求。 你就可以这么回答,我做的排行榜需求,是对商家的卖货数据进行统计,面向的人群是用户和商家,用户和商家可以查看排行榜数据。 我需要做的事情就是如何应对高流量的请求和数仓统计的排行榜数据如何和Redis进行同步以及解决数据一致性问题。

也就是简洁的说出你做的业务,服务的人群,以及你这个项目需要解决什么问题,也就是难点是什么。这样面试官才能根据你的介绍问你问题,要学会引导面试官问你问题。

2.你要准备几个点和面试官聊。 也就是你项目的难点和精巧设计点。

这个难点不要是业务难点或者表结构抽象的难点(因为短时间讲不清楚)。 而且这个难点要在短时间和面试官达成共识,让他知道你写代码的时候遇到了什么问题,你是怎么解决的。

打个比方:还是已前面商家排行榜需求为例。你说这个项目的一个难点是如何应对高流量的请求。需要说清楚为什么难,因为有大量商家和用户查询排行榜数据,你是怎么解决的?将排行榜数据放到Redis中,并将分类的排行榜数据打散到多个key中等等逻辑。 这个过程面试官会问你一些实现细节。如果你做的业务,几分钟都介绍不清楚,并且项目没有难点,那么这个项目你最好不要和面试官沟通

能和面试官聊的项目需要准备1-2个。尤其是应届生需要注意的是:

(1)你从网上找的某某管理平台、某某外卖平台、12306仿真等类似的项目不要在简历上写。

1.因为这类项目几乎没有任何难点;里面的难点也只是你认为的难点;

什么接口幂等,多线程并行查询数据减小接口耗时,线程池异步处理任务等等难点,到底难在哪里呢?

2.一眼假;已外卖平台为例,什么用户模块、订单模块、商品模块、商家模块等等模块,都是你做的。 大的外卖公司比如美团10多万员工,饿了吗1万多员工共同维护的项目,你一个人完成了,好像不太合理吧。 而且当面试官问你这个项目有哪些难点时,你连异步查询优化这个难点都说,你不是做了整个外卖平台吗? 订单、商品模块都是比较复杂的业务,里面怎么可能没有难点呢? 这些项目练手可以,但是不能成为你面试的项目。

(2)项目可以优化,但是不要过度优化。

比如你们就是一个简单的后台管理需求,每天也没多少人使用。 但是你们这个需求使用的技术有Redis,MQ,动态配置中心,熔断限流等。 这么简单和流量这么低的业务引入这些中间件的意义在哪里呢?这些分布式系统中间件的引入,必然是为了解决问题的,没有合适的场景引入这些中间件很不合理。优化项目也要优化的有水平。

接下来看一下专业知识的问答:

专业知识主要包含2部分:

1.八股文,有些知识是需要背的,比如JVM,网络知识等。背了就能回答的比较好。

2.需要系统学习的知识。

小建议:知识就那么多,比如:Java基础知识,Java核心类的源码,数据库(比如MySQL),多线程,设计模式,分布式缓存(比如Redis),JVM,消息队列(比如kafka),RPC(比如Dubbo,GRPC),动态配置中心,熔断限流等。系统的学习一下,面试题是背不完的,你只有懂其中的原理,才能回答好。

比如基础知识:

很多人认为Java基础知识就是八股文,背就行了(大家都会背,那你怎么样在面试过程建立自己的优势)。比如什么是JVM?什么是自动装箱与自动拆箱?因为这些知识扩展与不扩展根本不影响你写业务代码。而有一些知识,比如Exception,仅仅是try{} catch{},在catch处打印一行错误日志这么简单吗?有一些知识能体现出来你的技术深度和对业务理解的地方,要尽可能的扩展。

比如面试官问你:Exception和Error的区别有哪些?

你可以这么回答:

他们2个都是Throwable的子类。

Error是程序没有办法处理的异常,常见的有OutOfMemoryError,StackOverflowError,内存溢出了,你代码怎么处理这些异常? 打印一行错误日志吗,或者JDK给你提供了方法让你能把内存释放掉? 就算给你提供了,那你知道要释放哪些内存吗?显然都不是合理的解决方案。那代码还不如不处理这种异常。当内存溢出了,我们通过监控等手段发现内存占用量高,然后在去定位问题。

Exception是程序能够处理的异常。 但是需要注意的是catch里面的处理逻辑。实际很多场景并不是简单的打印一行错误日志这么简单的操作。

回答到这里就可以了

你们面试过程,回答面试官的问题时,如果你觉得这个问题还可以再扩展,先抛出问题,如果面试官感兴趣他会问的。要学会引导面试官问问题。

比如上面的回答,面试官感兴趣会问你们实际场景是怎么样处理异常的?

你可以这么回答:

比如写接口,程序在运行完主流程后,往数据库写入一条操作日志,这个操作日志又不影响主流程,我们就可以把这个insert try catch住,insert出现问题了,我们可以发送一条MQ消息,MQ消息有重试机制,确保insert操作成功。或者我们可以把失败的数据保存到异常处理表中,然后运行定时任务,将运行失败的数据同步到数据库中。

读接口,比如c端的一些交互接口,我们不仅要catch住,还要返回一些兜底数据

比如查询商品列表,当调取商品信息接口查询商品详情异常的时候,我们可以返回一些兜底的商品数据,这些商品数据可以写死或者将这部分商品信息维护到动态配置中心里面;

接下来看一下场景题:

场景题是面试者综合实力的体现,也是面试过程最难准备的。 主要考察的点是当你接到一个需求时,你是如何设计的。 以及面对高复杂,高流量,海量数据的解决方案是什么。

当面试官问你一个场景题时,你首先需要知道面试官让你实现什么样的功能,以及这个功能的复杂点在哪里(最尴尬的是你都不知道这个需求难在哪里)? 然后根据自己的过往工作经验和自己的技术体系给出一个合理的解决方案。

一些常见的场景题:微信红包,朋友圈,微博消息,评论等。可以看看这些业务的难点是什么,解决方案是什么。总结这些问题的解决方案,然后看看是否可以应用到其他的场景题中

接下来看一下算法题:

算法题真的就是练习,刷算法题。 会就是会,不会真写不出来。

全部评论
讲的真好
点赞 回复 分享
发布于 昨天 11:05 北京

相关推荐

评论
9
21
分享

创作者周榜

更多
牛客网
牛客企业服务