提交 c4c383cc 编写于 作者: 沉默王二's avatar 沉默王二 💬

本科生如何才能进入腾讯、阿里等一流的互联网公司?

上级 b5eb4d1e
---
title: 本科生如何才能进入腾讯、阿里等一流的互联网公司?
shortTitle: 本科生如何才能进入腾讯、阿里等一流的互联网公司?
description: 研究生强答一波,阿里和腾讯都拿到了校招offer,除此之外也拿了百度头条网易滴滴亚马逊。我本科不是计算…
tags:
- 信息技术(IT)
- 软件工程师
- 就业
author: 黄小斜
category:
- 知乎
head:
- - meta
- name: description
content: 研究生强答一波,阿里和腾讯都拿到了校招offer,除此之外也拿了百度头条网易滴滴亚马逊。我本科不是计算…
- - meta
- name: keywords
content: 信息技术(IT),软件工程师,就业
---
研究生强答一波,阿里和腾讯都拿到了校招offer,除此之外也拿了百度头条网易滴滴亚马逊。我本科不是计算机专业的,所以主要也是在研究生两年多的时间里进行研发方向的学习,相信有很多经验和适用于本科生。
--------------------------------------------------------------------------------------------------
> **写在最前**
**我写过很多篇秋招总结,这篇文章应该是最后一篇总结,当然也是最完整,最详细的一篇总结。秋招是我人生中一段宝贵的经历,不仅是我研究生生涯交出的一份答卷,也是未来职业生涯的开端。仅以此文,献给自己,以及各位在求职路上的,或者是已经经历过校招的朋友们。不忘初心,方得始终。**
**前言**
------
**在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易,华为等。**
一路走来也遇到很多困难,也踩了很多坑,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且,我对校园招聘也做了一些研究和相应的准备。在今年的秋季招聘结束以后,我也决定把这些东西全部都写成文字,做成专题,以便分享给更多未来将要参加校招的同学。
**秋招前积累与沉淀**
------------
研究生期间我有一件事情一直在坚持,那就是做笔记和写博客。
做笔记,就是记录学习中大大小小的事情,可能是面试问题,可能是一周的学习计划,也可能知识一个知识点,总归都是值得记录的东西,对我来说,就是一种积累。而对于博客,我从一开始只用于记录项目,到后来做转载,再到后来写原创,整理系列文章,则更像是一种沉淀。
**但是在春招刚刚结束的这段时间,我发现一个问题,之前学过的东西忘记了很多,特别是那些理解的不够深的知识点,总是特别容易忘记。另外我发现,虽然我在笔记中记录了很多的知识点和面试题,但是往往我只看过一次,不会再去看第二次。**
**这也意味着,虽然记录的内容很多,但是真正消化吸收的内容很少,脑子里充斥着总是那些零碎的知识点和面试问题,对于完整的知识体系知之甚少。这些问题在春招期间也不断地暴露出来,让我思考了很久。**
面对如此窘境,我想做出改变,趁着现在时间充裕,我想要为这些内容做一次减法,并且借此机会,推翻自己原有的知识体系,重建新的知识框架。简单说来,就是重新开始学习Java后端,这次我要用一种更高效的方式,避免走之前走的弯路,要用最高效,最合理的方式去复习。由于我之前已经有基础,所以我对完成这一目标有信心,相应地我也为此做出了明确且详细的学习计划。
**形容这三个月的秋招复习。**
**“具体可靠的学习计划”**
在三个月的时间里,我首先按照Java后端路线图安排好复习计划,每个知识点都会对应安排一段时间,比如我可能花一天时间复习“Java反射”,两天时间复习“设计模式”,一周的时间用于复习"JVM虚拟机”。我一般会在月初做好整个月的计划,然后根据进度做一些微调,但是基本上我都可以跟上进度,并且是在复习到位的前提下。
**所以我觉得,对于秋招这一场苦战,指定计划尤为重要,一旦计划定下来,战略目标清晰,对应的战术制定也会变得清晰,执行力也会随之变强。**
**“写博客整合知识点”**
**至于复习方法,我主要通过看高质量博客,并且结合代码实践的方式巩固这部分知识点,比如今天学习“concurrenthashmap”,我会去找两三篇比较好的博客先看看,主要是源码解读方面的,然后我会把它们进行整合,如果有遗漏的知识点我会再进行补充,有时候我还会自己去看看JDK源码,以便更好地理解博客内容,完成知识整合之后,我就会对应地整理出一篇博客出来,发在我的个人博客上。**
除此之外,当我完成了一整个专题的复习之后,我会把这些文章整理成一个专题,比如上面说的“concurrenthashmap”,实际上属于Java并发包,所以我会专门做一个博客专栏,用来完成Java并发系列的文章专题。**对于每一个文章专题,我都会先理清这个专题一共有哪些内容,然后再开始整理。比如对于Java并发包,我会先写Java多线程基础的文章,再写JMM内存模型的文章,接着一步步着手写Java线程池,阻塞队列,工具类,原子类等等。这样一来这部分内容就复习完毕了,写系列文章的好处就在于,我可以从头到尾理清脉络,并且对于每一部分的知识点都做了比较好的总结。**
对于博客的选择,我吸取了之前的教训,宁愿花半小时看一篇高质量文章,也不花10分钟看5篇烂文章。深度阅读的好处,就是可以让这部分内容更好地融入你脑内的知识体系,而不是像其他快餐文章一样转瞬即逝。
**“做项目巩固实践能力”**
由于之前在实习期间参加的项目都比较大,我接触的模块也比较单一,没有对整体项目有一个很好的把握,所以我决定趁这段时间再巩固一下我的项目实践能力,这里的能力主要是指的是对项目架构的把握能力,以及对业务开发的熟练度,当然也包括对各种常用后端技术的熟悉程度。
**我花了大概一个月的时间完成了两个项目的开发,当然主要也是模仿两个开源项目做了,这两个项目都使用SpringBoot快速开发,并且用到一些常用的后端技术比如redis,云存储,以及一些常见Web框架,除此之外还涉及到了solr,爬虫等技术。虽然项目不算很难,但是我在这段时间里很快地熟悉了完整项目开发的流程,并且每天做迭代,通过Git来跟进版本,每个版本都会写清所做的内容,这也让我对项目的架构非常熟悉。**
在项目之余,我也找一些常用的后端组件来跑一跑demo,以便让我对这些技术有一个直观的了解,比如面试常问的dubbo,zookeeper,消息队列等组件。这些尝试也让我在理解它们的原理时更加得心应手了。
**“坚持刷题,注重方法”**
**算法题是秋招笔试面试中的重头戏,每个研发同学都免不了经历算法题的摧残,对我这么一个非科班同学来说,更是让人头大。正因为如此,我放弃了刷大量LeetCode题目的方法,选择了更加行之有效的刷题方式。**
**首先我重新刷了一遍剑指offer,并且对每道题目进行总结,尽量保证每一道题都可以记在脑子里,众所周知剑指offer中的题是面试时非常喜欢考的,所以先搞定这部分题目是最为关键的。**
搞定剑指offer之后,当然还要刷LeetCode了,LeetCode题目这么多,怎么选择呢,我没有按照tag刷,也没有按照顺序刷,而是参考当时一个大佬的LeetCode刷题指南来进行刷题的,他把每个类型的题目都做了归纳,每部分只放一些比较经典的题目。所以我前后大概刷了100多道LeetCode的题目,并且在第二遍刷题复习的时候,我也对这些题目做了一份总结。
**除了上面两个经典题库,我还着重刷了大厂的历年真题,这部分我主要是通过牛客网的历年真题题库来完成刷题的。说实话,真题是非常重要的,因为公司出的题目不像平时的那些算法题,可能会出得非常奇葩,所以你如果不提前适应的话会比较吃亏。完成这部分题目之后,我对算法题的复习也基本告一段落了。**
当我完成所有内容的复习时,提前批已经开始了。终于要上战场了,因为战前准备比较充分,所以我对秋招还是比较乐观的,但事实上,秋招不仅是攻坚战,而且是持久战,要笑到最后,确实也不是那么容易的事情。
**重建知识体系,对学过的东西做减法**
--------------------
前面提到我在秋招前完成了知识体系重建,那在这里我也想跟大家分享一下我当时大致的知识体系构成。就跟我前面说的一样,我选择重新再学一遍Java后端相关的技术内容,因为我知道大致的学习方向,并且有一定的基础,所以看很多文章变得更加得心应手,写文章和做总结也更加有底气了。
首先在Java基础方面,我写了20多篇原创博客,主要是对Java核心技术的解析,比如“Java反射”,“Java序列化和反序列化”,“Java异常体系”等等。
在Java集合类方面,我原创了部分文章,另外整合了一些比较好的技术文章,其中最主要的就是关于hashmap的文章,当时我整合的文章几乎没有遗漏任何一个知识点。
**在Java并发编程方面,我主要参考了并发编程网以及一些优质博客的文章,先搞懂了Java并发原理,再一步步学习JUC并发包的组件,其中重点看了chm,并发工具类以及阻塞队列等JDK源码的解析文章,除此之外,我还会在IDE中跑JUC相关的emo,毕竟这方面的内容非常需要实践。**
在Java网络编程方面,我先从最基础的socket入手,再讲到NIO,AIO,并且加入了几篇对Linux IO模型解析的文章,让整个知识体系更加完整(因为NIO是基于Linux Epoll实现的),接着我又加入了对Netty的探讨,以及Tomcat中对NIO的应用,可以说是把Java网络编程一些比较重要的部分都囊括进来了。**为了更好理解这部分内容,我也在网上参考了很多客户端和服务端通信的demo,最后我分别用Socket,NIO,AIO以及Netty把C/S 通信的demo都写了一遍。**
在JVM虚拟机方面,我则按照《深入理解JVM虚拟机》这本书的行文脉络进行文章的整理。**在搞定JVM基本原理以后,我着重了解了JVM调优和实践中常遇到的问题,并且整理了常用的JVM调优工具,场景问题以及调优实践的案例,这也是因为面试中对JVM调优实践越来越重视了。**
在JavaWeb方面,我从Java Web相关技术的发展入手,一步步了解了每种技术存在的意义,比如JSP,Servlet,JDBC,Spring等等,然后对每种技术进行了比较全面的了解,并且着重地看了Spring和SpringMVC的源码分析文章,另外一方面,我花了很多时间去研究Tomcat的工作原理。除此之外,JavaWeb项目中常用的maven,日志组件,甚至是单测试组件,也纳入了我的系列文章里。
**在数据库和缓存方面,我主要学习了MySQL和Redis这两种最常用的数据库。对于Mysql,我从简单的sql开始了解,然后开始了解sql优化,MySQL的存储引擎和索引,事务及锁,还有更复杂的主从复制,分库分表等内容。对于Redis,我也是从简单的api入手,然后去了解每一种数据结构的底层实现原理,接着尝试去学习Redis的持久化方式,以及作为缓存常需要考虑的技术点,当然,也包括Redis的分布式锁实现,以及它的分布式集群方案。**
最后一部分就是分布式相关的理论和技术了,这个也是困扰我很久的一块内容,我主要把这块内容分为两个部分,分别是分布式理论和分布式技术,理论方面,我先了解CAP,BASE等基本知识,然后开始学习一致性协议和算法,接着探讨分布式事务。**对于分布式技术,涉及的东西就更多了,例如分布式session,负载均衡,分布式锁等内容,这些知识点我都会用一到两篇文章去总结,对于分布式缓存,消息队列,以及分布式服务等内容,我会花比较多的时间去全面学习,然后总结出一个系列的文章出来。**当然,对于这些技术的学习主要还是停留在理论方面,在自己的项目中能用到的比较少。
至此,我的知识体系基本构建完成,这也是我在秋招中能够成功闯过那么多面试的原因。
**秋招之路,砥砺前行**
-------------
不管前期做了多少准备,到秋招的时候也不能掉以轻心,从七月底第一次面试到9月基本佛系,中间经历了大大小小的面试。
**在完成知识体系重建以后,我把重点转向了另外几件事,一是完善和熟悉我的简历,以便在面试中能够比较好地发挥,二是持续刷题,保持对算法题和笔试真题的手感和熟练度,三则是看面经查缺补漏,我一直认为看面经是很重要的一项复习内容。**
**就这样,我一边继续复习,以便开始了一场接一场的面试接力。**
起初,我面了几家小公司练手,接着阿里的提前批接踵而至,我战战兢兢地参加了阿里中间件部门的面试,面难难度还算适中,一共四轮面试,当时我的表现也还不错,问题基本都答上来了。面完不到一周以后我就收到了通过的消息,当时还有点懵。没想到第一个offer这么快就来了。
这段时间内,蚂蚁金服的两个部门也给了我面试机会,我都参加了它们的面试,并且顺利地拿到了其中一个部门的offer。由于我对蚂蚁这边的业务比较感兴趣,最终选择了蚂蚁金服的offer。
**阿里提前批的胜利确实是意外之喜,但也大大地鼓舞了我,于是我又参加了百度和腾讯的提前批面试,由于百度的提前批不走流程,一共有四个部门面试了我,每个部门都有2到3轮面试,总计约为12次面试,到后来我已经快晕了,看到百度的电话就害怕,由于面试次数太多,有时候发挥确实也不是很好,我也没有特别在意,只当是在锻炼自己了。**
百度的面试难度每个部门不一样,但是每次面试必写算法题,一写算法题,时间至少就是一个小时以上,每次面试完都有一种身体被掏空的感觉。
经历了百度面试的摧残以后,我手写算法的速度也变快了,很多坑也被我填上了。接下来面对腾讯的面试,我也是既激动又担心,腾讯的面试难度比较大,对于操作系统和网络的知识喜欢深挖,问的东西也很有深度,面完前三面以后,第四面拖了3周才进行。当时三面面试官对我的评价比较好,也让我信心爆棚了好久。
在等待腾讯终面的期间,我参加了今日头条的面试,当时有幸拿到了一个白金码,免去笔试,事实证明白金码作用真的很大。头条的面试难度和腾讯差不多,三轮面试,同样需要写各种算法,由于是视频面试,我可以清楚地看到,头条的面试官真的非常高冷啊。面完头条我的第一感觉就是应该挂了吧。没想到最后还是给了offer。
**结束这几家大厂的面试之后,我觉得我的秋招已经接近尾声了,不过由于之前投的比较多,所以我又面了几家大公司,如网易,华为,快手等。到9月上旬的时候,我接连收到了bat和头条,网易的意向书,阿里最早,腾讯最晚,每收到一封意向书我都很开心,没想到最后我真的可以集齐bat等大厂的offer。**
9月以后,除了偶尔和同学做几场大厂的笔试,我基本就佛系了。直到后来一些外企例如亚马逊,大摩开始笔试面试,我才又重新回到了状态。
截止目前,我基本上把该拒绝的offer都拒绝了,综合各方面因素的考虑,最后应该会签阿里,原因是部门是我自己喜欢的,同时给的评级也比较高。虽然腾讯也给了sp,但是最后还是忍痛割爱啦。至于百度和头条,给的offer并不是很令人满意,所以就没有考虑了。
至此,我的秋招之旅总算圆满结束。
希望各位在未来也可以拿到自己理想中的offer!
**若觉有用,请点赞支持下丫,给我提供更多干货的动力~**
**我的其它回答可能对你有很大帮助:**
[本科生如何才能进入腾讯,阿里等一流的互联网公司?](https://www.zhihu.com/question/26406260/answer/569976835)(9K 赞同,26K 收藏)
[一毕业就能进阿里的人有多厉害?](https://www.zhihu.com/question/344204972/answer/816698264)(7K 赞同,17K 收藏)
[搞 Java 的年薪 40W 是什么水平?](https://www.zhihu.com/question/31437847/answer/569985603)(8K赞同,30K收藏)
[Java学到什么程度才能叫精通?](https://www.zhihu.com/question/28903757/answer/504939550)(3K 赞同,10K 收藏)
[你考研到底是为了什么?](https://www.zhihu.com/question/306858011/answer/592044456)(3K 赞同,5K 收藏)
\-----------------------------------------我是分割线-------------------------------------
PS:私信很多,因知乎不常上,有事可以来公众号找我
1、点赞、关注、支持一下我的回答8,收藏数是点赞数3倍真的扎心哇
2、**欢迎关注我的微信公众号【黄小斜学Java】 目前专注分享Java领域干货,不限于BAT面试,算法、计算机基础、数据库、分布式、spring全家桶、微服务、高并发、JVM、Docker容器,ELK、大数据等相关知识,希望我们可以一起进步。**
转载链接:[https://www.zhihu.com/question/26406260/answer/569976835](https://www.zhihu.com/question/26406260/answer/569976835)
---
title: 如何获得高并发的经验?
shortTitle: 如何获得高并发的经验?
description: 现实中,哪怕是大公司,高并发系统也是可遇不可求的。不过,高并发其实是可以通过压测来模拟的。高并发的…
tags:
- 互联网
- 程序员
- 编程
- .NET
- Java 程序员
author: 阿里巴巴大淘宝技术
category:
- 知乎
head:
- - meta
- name: description
content: 现实中,哪怕是大公司,高并发系统也是可遇不可求的。不过,高并发其实是可以通过压测来模拟的。高并发的…
- - meta
- name: keywords
content: 互联网,程序员,编程,.NET,Java 程序员
---
**现实中,哪怕是大公司,高并发系统也是可遇不可求的。不过,高并发其实是可以通过压测来模拟的。**
高并发的背后,核心是高可用和低延迟。所以我们其实是想有能力设计一个系统,在高并发访问的时候,系统依然可用,而且响应速度不会变慢。
**(点击头像关注我们账号,别错过更多阿里工程师一线技术干货)**
————————————————————————————————————————
想提升高并发系统的设计和开发能力,有2个方面:
**一个是系统的学习相关理论;**
**一个是找一个目标系统,不断想办法去提升他的性能。**
前者是后者的理论基础。
如果想从事一个高并发系统开发的岗位,要学习的相关技术其实是很多的,这些技术核心就是解决高并发情况下如何保持系统的高可用和低延迟。
以Java工程师为例,互联网程序员面试中经常会考察的内容包括:
**(1) 架构设计:**
高可用与稳定性、事务一致性、多副本一致性、CAP理论。
**(2) 相关技术:**
多线程(JUC/AQS/线程池)、RPC调用及框架(如Thrift)、NIO及NIO框架(如Netty)、高并发框架(如Disruptor) 、微服务框架(SpringBoot)、微服务治理(Spring Cloud)、数据库相关技术(如:索引优化、分库分表、读写分离)、分布式缓存(如redis)、消息中间件系统(如RabbitMQ)、容器技术(如docker)。
**(3) 工具:**
系统性能查看(top、uptime、vmstat、iostat)、压测工具(如ab、locust、Jmeter、go)、线程分析(如jps、jstack)等。
当然,一开始,我们不可能逐一把这些技能全部掌握,我们可以从一个实际项目入手,不断的把这些技术用上去,发现哪些知识不足,再去补充相关的知识。
**“如何设计一个好的秒杀系统“,一定是互联网大厂面试中最常问的一个问题。所以从设计一个秒杀系统开始实践,是个不错的选择。**
秒杀系统的特点:
--------
**(1)瞬时并发量大**
秒杀时会有大量用户在同一时间进行抢购,瞬时并发访问量突增 10 倍,甚至 100 倍以上都有。
**(2)库存量少**
一般秒杀活动商品量很少,这就导致了只有极少量用户能成功购买到。
**(3)业务简单**
流程比较简单,一般都是下订单、扣库存、支付订单。
设计秒杀系统的关键点:
-----------
**(1)限流**
由于活动库存量一般都是很少,对应的只有少部分用户才能秒杀成功。所以我们需要限制大部分用户流量,只准少量用户流量进入后端服务器。
**(2)削峰**
秒杀开始的那一瞬间,会有大量用户冲击进来,所以在开始时候会有一个瞬间流量峰值。如何把瞬间的流量峰值变得更平缓,是能否成功设计好秒杀系统的关键因素。实现流量削峰填谷,一般的采用缓存和 MQ 中间件来解决。
**(3)异步**
秒杀其实可以当做高并发系统来处理,在这个时候,可以考虑从业务上做兼容,将同步的业务,设计成异步处理的任务,提高网站的整体可用性。
**(4)缓存**
秒杀系统的瓶颈主要体现在下订单、扣减库存流程中。在这些流程中主要用到 OLTP 的数据库,类似 MySQL、Oracle。由于数据库底层采用 B+ 树的储存结构,对应我们随机写入与读取的效率,相对较低。如果我们把部分业务逻辑迁移到内存的缓存或者 Redis 中,会极大的提高并发效率。
从0到1搭建一个秒杀系统,也并不容易,涉及到很多前端、后端、中间件的技术。这个跟其实是所有公司的工作常态,大部分时间也是在搭架子,真正做技术优化的时间并不多,经常是在业务量突增或者大促活动来临时,集中搞一波性能优化。
所以,如果没有实际的高并发项目可做,自己弄个秒杀系统自娱自乐也是不错的。
**搭建系统 -> 压测 -> 发现问题 -> 学习知识 -> 优化系统,通过这样的循环,相信你一定既能体验到学习的乐趣,同时实力也大幅提升。**
(淘系技术部-产品技术-昭明)
————————————————————————————————————————
阿里巴巴集团淘系技术部官方账号。淘系技术部是阿里巴巴新零售技术的王牌军,支撑淘宝、天猫核心电商以及淘宝直播、闲鱼、躺平、阿里汽车、阿里房产等创新业务,服务9亿用户,赋能各行业1000万商家。我们打造了全球领先的线上新零售技术平台,并作为核心技术团队保障了11次双十一购物狂欢节的成功。详情可查看我们官网:[阿里巴巴淘系技术部官方网站](https://link.zhihu.com/?target=http%3A//tech.taobao.org)
点击下方主页关注我们,你将收获更多来自阿里一线工程师的技术实战技巧&成长经历心得。另,不定期更新最新岗位招聘信息和简历内推通道,欢迎各位以最短路径加入我们。
[](https://www.zhihu.com/org/a-li-ba-ba-tao-xi-ji-zhu)
转载链接:[https://www.zhihu.com/question/40609661/answer/1883655079](https://www.zhihu.com/question/40609661/answer/1883655079)
---
title: 如何获得高并发的经验?
shortTitle: 如何获得高并发的经验?
description: 如何获得高并发的经验?先说结论。1 首先得在自己电脑上鼓捣出Redis,kafka,dubbo,mycat等高并发分布式组件的环境,通过这些环…
tags:
- 互联网
- 高并发
- 程序员
- 编程
- Java 程序员
author: hsmcomputer
category:
- 知乎
head:
- - meta
- name: description
content: 如何获得高并发的经验?先说结论。1 首先得在自己电脑上鼓捣出Redis,kafka,dubbo,mycat等高并发分布式组件的环境,通过这些环…
- - meta
- name: keywords
content: 互联网,程序员,编程,高并发,Java 程序员
---
**先说结论。**
1、首先得在自己电脑上鼓捣出 Redis,kafka,dubbo,mycat 等高并发分布式组件的环境,通过这些环境了解分布式组件的基本 api。
2、为这些分布式组件找个项目场景,证明自己用过,并且解决过实际问题。这里需要指出的是,单纯背高并发的面试题没用。
3、修改简历,找到高并发面试的机会,然后通过多场面试,不断调整自己讲述高并发项目经验的水平。这时,如果能直接用高并发的说辞进大厂,那是最好的,如果不能,找个过渡性的能提供高并发实践的岗位。
4 **如果有高并发项目的实践经验,那么后面就不用说了,只要多解决实际问题,高并发技能一定能很快掌握。**这时掌握的高并发技能,就不是单纯的理论说辞和简单的 API 技能了,而是正宗的高并发项目实践技能。
可以这样说,能否找到高并发项目的实践经验,决定着程序员能否升级到架构师,不过这不容易。下面讲一下我的一个朋友的经历,二哥经常和他聊天,互相在知乎上点赞,哈哈哈。
![](https://files.mdnice.com/user/3903/a3297344-f4cf-494c-9231-ae2f84cd8fcb.png)
1、17 年年初的时候,朋友在项目组里只用简单的 Spring + JDBC/ORM 做业务,开发是在 windows 上的,接触到的高并发组件,也就是 nginx 和 mysql 集群,加上一些 linux 上部署和调试组件的经验,并没有高并发组件的使用经验。
相信当下不少球友和我这位朋友一样,只会做 windows 系统上的增删改查,没有任何分布式组件和高并发经验。
那如果就这样下去,只会基本的增删改查,再干个几年,等年纪上来了,估计连跳槽的机会都没。
2、后来,这位朋友就去背题,什么 redis 数据结构,dubbo 协议,kafka 流程等等,高并发情况下防幂等,netty 堆外内存的使用要点,jvm 调优等。凡是和高并发有关的,他基本都背了一下。然后就开始修改简历,就写,在 xx 项目里,并发量是每秒 xx,用到了 Redis,kafka, dubbo(省略其它分布式组件)等等,然后投简历。
3、由于朋友当时的公司不错,所以投出去的简历很快得到回应,也得到了不少大厂的面试机会。刚开始面试时,Java、数据库等方面,朋友都是秒通过。但是如果问到分布式组件,朋友基本就说不上来。
因为朋友背的都是脱离项目的理论,比如 mysql 集群的搭建方法和 redis 数据结构等,面试官是结合项目问的,比如问,你项目里 Redis 如何确保高可用,用 nginx 部署 spring boot 项目时,配置文件中注意的要点是什么。**由于朋友是单纯背理论,所以就回答不上来。**
4、尝试了几次,朋友意识到单纯背题一定不行,**他就在他的电脑上,搭建了诸多高并发组件的开发环境。虽然组件在项目里都运行在 linux 上,但大多高并发组件都有 windows 版。**
当时朋友搭建了 mysql 主从集群,redis 主从集群,rabbitmq, dubbo+zookeeper,nginx,mycat 等开发环境,了解各组件的基本用法,然后为每个组件找了个项目背景。比如说 redis,朋友就说,我们项目需要缓存员工信息,所以用到了 Redis 里的 xxx API,对应的 Java 代码是什么,类似的,为每个组件都找个了应用背景。
5、这个时候朋友再去面试,在分布式组件方面,就能和面试官有来有去了,甚至还面试成功了几家小公司。但如果面试官问些实践要点,比如 redis 如何防穿透,redis cluster 的失效转移等,朋友就答不上来。**所以朋友当时给面试官的印象是,有分布式组件的使用经验,也会用分布式组件开发基本的高并发技能,但缺乏系统的用分布式组件实现高并发的能力。**
6、这个时候,朋友就回想起刚开始背题的一些内容,比如 netty 防堆外内存溢出,netty 如何解决半包粘包,redis 如何防穿透,mycat 如何实现读写分离,还有限流和熔断等机制等。**这时朋友才感到,原来这些题目是要等掌握一定高并发说辞后再用,不是一开始就用的。**
**明白这些以后就好办多了,这些技能和开发无关,只需要结合项目背景讲下实现要点。**
比如以限流为例,先准备一个限流场景,比如公司查询系统每秒只能放 1000 个请求,然后说下实践要点,无非是 redis+lua,再说下异常情况下怎么处理,无非就超量情况下抛异常。其它熔断防穿透都要点都按这样准备。
7、请注意,到了这个时间点,朋友的分布式高并发经验,也仅仅是停留在理论层面,但这个时候我去面试,就能通过用法+实践要点的说辞,成功把自己包装成有高并发项目经验的人了,后面的面试成功率就高很多了。
不过在这个阶段,为了挑战大厂的岗位,**朋友还准备了“项目中解决过的实际问题”。**
套路说辞基本一样,首先遇到什么问题,比如 redis 穿透,或 oom 异常,或 kafka 私信堆积过多,然后说表现,表现无非是系统宕机,卡死,或功能异常,再说如何排查,无非是通过看日志,日志中遇到什么异常,发现什么问题,最后再说怎么解决的。
网上这种问题一搜一大堆,但网上的说辞大多是纯理论的,**得为这些问题找个项目背景。**比如 xx 支付系统遇到 oom 异常,xx 优惠券分发系统遇到死信过多,xx 支付系统遇到 redis 穿透等等。
8、也就是说,通过不断面试,朋友整理了高并发方面的**基本用法+实践要点+解决过问题**等说辞。这样虽然还是没高并发项目经验,但已经能确保进大厂了。**事实上朋友就这样进大厂的。**
9、进大厂以后,其实朋友的日子很难过,**一方面项目组通过面试,认定他有高并发项目经验,其实他没有**,但朋友不这样说,他就只能在原来的公司做基本的增删改查。
这时,朋友除了自己到处查以外,只能一方面厚着脸皮到处问人,另一方面多加班。由于朋友的项目用到高并发,所以日常工作中有大量的开发,部署,调试机会,平时也经常解决高并发的问题。
所以朋友的苦日子也就过了 3 个月,后面他不仅能解决高并发的问题,还能参加压力测试**,通过压力测试提升高并发的性能,做到这个程度,朋友才算真正获得了高并发的项目经验。**
10、 **掌握高并发经验的红利是相当大的**。当朋友掌握高并发经验后,后面找工作,基本上大多数的技术面试都能过。
二哥就认识一个大佬,叫李智慧,由于有高并发架构的能力,目前在极客 xx 上出了一门高并发架构课,不知道有球友听说过吗?
![](https://files.mdnice.com/user/3903/1b95839f-68b6-48a8-8005-8e6502824e64.png)
如果你也有高并发的经验,也可以进个外企养老,或者是找个小公司做技术总监,不至于在 35 岁被淘汰。
**其实我发现,不少人掌握高并发技能的经历和二哥的朋友很相似。**
1、在公司项目没有提供高并发实践机会的前提下,通过背题等,哪怕根据一些所谓的思维导图,把相关全学了一遍。
2、然后进入到提供高并发实践机会的项目里,得到相关经验。
3、得到高并发的实践机会,通过项目真正掌握高并发的技能。
最后做个总结,**高并发能力包括哪些,如何该怎么掌握?这无法通过短短的文章来说明**
但是,你就照着我在上文里给出的步骤,先搭建环境,再掌握分布式组件的基本用法,再了解高并发的实践要点和解决问题的说辞,你至少能通过面试得到高并发项目的实践机会。
掌握高并发经验的难点在于得到实践机会,进了项目组,有了实践机会,高并发技巧就不用我说了,你自己就能知道如何掌握。
**前文已经说了,要得到高并发经验,一般得分两步走,第一通过面试得到实践机会,第二在项目中提升,其实难点在第一点,在零基础前提下,准备高并发方面的面试,确实难。而通过面试找到项目实践机会后,可能会被人鄙视,也会被领导认为很水,但好歹得到了能进一步提升的机会。**
这里特别提一句,大厂技术面试官一般眼睛都很毒,高并发项目经验,或者高并发方面只有理论经验的候选人,通过寥寥几个问题就能问出。这点大家不要有侥幸心理。
**那在零基础前提下,准备高并发方面的面试的难点在哪里呢?**
1、高并发的组件大多是运行在 linux 上,windows 很难搭建环境,没有环境其它就不用说了。
2、零基础的球友,不知道高并发场景下的分布式组件怎么用,**或者只知道如何用简单的 api**。由于缺乏项目经验,所以也不知道分布式组件在项目里是怎么用的。
3、在学分布式组件解决高并发问题方面,往往只会孤立地使用某个组件,比如孤立使用 redis 做缓存,孤立使用 rabbitmq 做消息中间件,但现实场景下,往往是综合使用多个分布式组件,协同解决高并发问题。
4、由于只会理论,没有在项目里接触过高并发开发,**所以普遍缺乏分析排查解决高并发方面问题的经验。**
在高并发场景下,往往会用到集群,熔断,限流等。在使用高并发组件的时候,往往也会踩到不少坑,比如 mycat 方言不对,netty 半包,消息中间件重发等。
**大厂面试官往往是会通过这些经常遇到的问题,来确认求职者的高并发方面的经验,**而一些没有高并发项目经验的求职者,在这方面往往是不堪一击的。
**下面就以我考核高并发技能的方式,让大家体验一下零项目经验高并发求职者的难度。**
1、不问概念,比如 redis 数据结构,netty 重要组件。因为零项目经验的高并发求职者一定背过。
2、第一层难度,这块问题不固定,我先问,你项目里用到哪些分布式组件,然后指着用过的分布式组件,问下 Java 环境下的基本 api 和配置。比如用过 Redis 我就问 Jedis 的语法,用过 Netty 就问 java 层面如何做通讯协议,用过 RabbitMQ 就问 Spring Boot 要做哪些配置。
我就问你用过的组件,java 里是怎么用的。我发现不少只会背理论的求职者,单纯讲组件(比如 Redis 或 netty 等)很熟悉,但不知道怎么和 Java 整合,这就说不过去了。
3、第二层难度,有些求职者自己搭建过环境,知道分布式组件的 api。对这些求职者,我进一步提问,和我说下你用(Redis,Kafka,Netty,nginx 等的)分布式组件的项目场景,比如你说你用 Redis,你们项目的数据量是多少?你们项目是用单机版 Redis 还是 Redis 集群,如果是单机版 Redis,你们怎么确保高可用?
这样当我结合项目背景问的时候,会发现不少高并发方面的求职者露馅。用他们的话说,nginx 都是部署在 windows 上的,redis 只用单机版,而且数据量不高。这也能说明不少求职者没有高并发分布式组件的使用经验。
4、其实如果求职者能结合项目背景说分布式组件的用法,至少能说明有高并发的经验,在一些高并发要求比较低的岗位,这样的表现,至少在分布式组件这块,就可以过关了。但如果要面试资深开发或架构,那么还需要问 第三层难度,**即在高并发分布式组件方面解决过哪些问题?**这样能证明求职者有一定的高并发项目实践经验。
这方面网上有现成的问题,比如 Dubbo 超时问题,多注册中心问题,Redis 内存溢出问题等。
不过话说回来,零高并发项目经验的求职者,如果准备方法得当,其实也能通过项目背景和实际解决过的问题,证明自己有高并发项目经验。
**也就是说,哪怕你高并发方面缺乏项目经验,只要好好准备,一样能通过面试得到实践机会,大家应当有信心。**
我在文章里经常用到小二这个角色,那么接下来就以小二为例。
1、小二具备 Spring Boot+JPA 开发经验,这其实也是高并发经验的基础。
2、小二掌握了如何在 windows 环境下搭建 Redis,MyCAT,RabbitMQ,nginx,dubbo+zookeeper,MongoDB 等组件运行环境的步骤,请注意是 windows 环境,而不是 linux 环境。虽然生产环境中,这些组件都在 linux 环境下,因为大家平时都用 windows,而且这些组件在 windows 和 linux 环境下的开发差异不大。
3、小二环境搭建好以后,首先运行一通 spring boot 整合诸多分布式组件的项目,这样他就知道怎么用,而不会仅仅知道怎么说。**然后我就让他为每个组件,找个业务背景。**
4、会用+结合业务背景使用高并发分布式组件以后,**我再让小二背些分布式组件方面的常用坑,以及常规的使用经验**,无非是 dubbo 调用超时,redis 超时,redis 内存溢出,dubbo 整合 zookeeper 的要点等。这方面不要太深,不用涉及到算法,也不用涉及到底层技能。而且这方面内容我书里大多也提到。**最后我让小二通过秒杀案例,串起来讲多个分布式组件的使用要点。**
**5、这个是要点,我让小二准备了不少解决高并发问题的说辞。**高并发问题其实也很普遍,无非是 redis 超时,kakfa 由于重发而导致的不幂等,dubbo 注册中西中心失效等。这些方面,我让我小弟准备哪些点呢?问题是如何发现(无非是通过日志告警或系统卡顿发现),如何排查(到 linux 看日志,日志中看到哪些具体的关键字),如何解决(改文件或改配置)
参考链接:[https://www.zhihu.com/question/40609661/answer/2245612049](https://www.zhihu.com/question/40609661/answer/2245612049)
高并发其实没有那么神秘,讲来讲去就是解决“有限资源与无限用户”的矛盾。你会发现目前主流的解决方案来来去去无非那几种,你如果有心,即使没做过,但是私底下练习过了,面试说出来也是可以过的。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册