入行多年,终于如愿迈入大厂

入行之初,雁与诸君皆怀揣拳拳之心,欲投身大厂,施展抱负。然,资历尚浅,学疏才薄,未得赏识。无奈生计,只得暂居小厂,悬梁刺股,待厚积薄发,再做打算。转瞬数载,幸得高人指点,加自身累积,跻身高级开发。历半月之余,得大厂赏识3家,中小厂更甚,雁依自身情况而择厂,选大厂之一。一路而来,感慨颇多,故,与诸君分享。(PS:古人咬文嚼字可真费劲,还是白话文舒服)

先谈谈我的面试之路吧。

我是12月初提起离职并开始找工作的。Boss直聘上收到的面试邀请不计其数(被认可的感觉刺激着膨胀的虚荣心),我和一些知名的大厂都约好面试,从12.1号开始的两周,平均每天2~3场面试,赶上疫情的影响,这些面试都是线上以电话或视频的方式进行(终面要去现场)。

这里要和大家分享自己的一个心得,由于我自己的决策失误,在今年7月份,我以套面试题为目的去面试了一些大厂(阿里、字节、快手等),将这些面试题以及自身不足加以巩固,方便年底的冲击。但大厂不愧为大厂,有严格的人才选拔制度,面试存在冷却期。也就是说我7月份面试过这家大厂,那么冷却期将从次日计算向后一年!这也意味着我本次找工作注定无缘这些公司!惨!

言归正传。大厂的技术面试一般有3轮。

第一轮面试官大都是招聘岗位所在团队中技术上的佼佼者。这一环节往往是对自身基础知识和主流知识的考察。面试官往往会依照简历上陈列的技术栈由浅至深的询问。如果能在这轮面试中征服面试官,那么,几乎后面的面试不会有技术上的压力。十年磨一剑,能不能“戳死”他,就看各位手中的剑够不够锋利了。其实多面试几次,就会对每个知识领域中大概会问到的知识点有一个轮廓了。

第二轮面试官属于招聘岗位所在团队的leader,也就是可能的上级。这轮面试官喜欢问些实际工作中遇到的问题及解决思路,也会出一些算法或者实际的业务场景让我们去设计。面试中很难放平心态,对于熟悉的知识还能脱口而出,想要在内心慌乱的情形完成设计确实需要经验的积累。面对业务设计,我习惯画草图,这样对业务场景的模拟有轮廓,设计起来就会有条理(具体问题具体分析)。当业务设计或算法通过后,那这轮面试几乎没什么悬念了。千万不要轻言放弃,我素来信奉:就是没有满意的结果,弄个半成品也比不做强!

第三轮的技术终面属于CTO级别的面试官。他们的发际线往往望而生畏,不怒自威。CTO喜欢问我们经历的项目、对业务的理解、如何维护系统稳定性等问题,反对技术本身的深度和广度不特别关注(也许前两轮面试已经杀过来了吧)。这些问题要结合各位自身的环境去真实的回答,CTO很老练,千万别想着忽悠人家,画蛇添足会自食其果。

鄙人主java,以java为例(设计模式属于穿插的问题,建议大家多研究设计模式,对编程思想的扩展有很大帮助)。

Jdk方面大致会问线程池、并发包、集合源码、JVM、JMM。

Spring体系大致会问生命周期、AOP、IOC、事务、循环依赖、SpringMVC的执行流程、拦截器、springboot启动流程、自定义stater。

主流技术参照个人技术栈。

Redis:zset数据结构、分布式锁、集群方式、缓存击穿/穿透/雪崩

ZK:集群机制、选举机制、分布式锁、一致性原则

MQ:顺序消费、重复消费、事务消息、分布式事务

微服务:注册中心、配置中心、保护机制

Netty:NIO多路复用、HTTP长短连接。

数据库方面mysql的底层原理、索引的原理、sql优化(参考我之前的一篇博文《mysql定位和优化慢查询的方案》,以这种方式去回答sql优化,我还没失过手)。

半月之期,我拿到的选择有很多,也不枉自己的辛苦(由于担心侵权或警告,不列举大厂的offer)。大厂对比小厂,收入自然丰厚,成长也不同。而且身为互联网开发,不去大厂试试,总觉得遗憾。岸上说水暖,在这条路上不可能走长远。

附上个人技术栈:

Java 基础:

熟悉常用设计模式(策略、责任链、单例、装饰者、代理、观察者、适配器、外观/门面)。

研究过 SpringMVC5/Spring5/Mybatis3/Springboot2 源码,熟悉 sqlsession 执行流程、多级缓存、Springbean 生命周期、AOP、事务、循环依赖、Springboot 启动流程等原理。

研究过常用集合(ArrayList、LinkedList、HashMap1.7、HashMap1.8、ConcurrentHashMap1.7、

ConcurrentHashMap1.8)源码。

熟悉 JAVA 线程池及其参数配置原理、拒绝策略等,研究过定时线程池源码。

熟悉 volatile 底层实现原理,熟悉 Java 内存模型和 CPU 缓存一致性协议。

熟悉 Java 对象布局,熟悉 sync 底层原理,了解偏向、轻量、重量的升级过程。

熟悉 lock 锁底层原理,了解公平锁/非公平锁原理,了解 AQS、CAS、threadlocal 底层原理。

熟悉 Java 类加载机制、Java 内存结构,了解常用的垃圾回收算法、垃圾回收器以及内存溢出和内存泄漏等问题,生产环境定位过内存溢出问题。

主流框架:

熟悉 Nginx 负载均衡、动静分离、反向代理、静态文件压缩原理。

熟悉 Zookeeper 工作方式,分布式锁、分布式集群、选举策略、数据最终一致性等原理。

了解 Netty 框架、BIO、NIO、TCP/UDP、请求粘包、拆包原因和解决方案。

熟悉 SpringCloud 框架,了解服务治理、注册发现、降级、熔断、隔离等 Hystrix 服务保护机制的原理,熟悉 Ribbon 负载均衡、Config 配置中心、Zuul 网关、Swagger 接口调试。

熟悉 Redis 淘汰策略、事务、持久化机制、分布式锁、单线程高效、自动过期等原理。

熟悉 Redis 穿透、击穿、雪崩、集群、主从复制、哨兵选举、cluster 分片、动态扩容、缩容、布隆过滤器等原理。

熟悉 RabbitMQ/RocketMQ,了解分布式事务,消息幂等,顺序消费,事务消息等解决原理。

数据库:

了解 MySQL 半双工通讯、长连接、日志顺序 IO,数据随机 IO、内核态和用户态切换、

InnoDB/Myisam 存储引擎底层原理。

熟练 MySQL 的 hash 和 B+树的数据结构选型、聚簇索引/非聚簇索引、联合索引、主键索引。

熟悉 mysql 性能优化,explain 分析 sql 慢查询,有 sql 调优经验。

熟悉 MySQL 中的事务隔离级别和 MVCC 底层原理。

 

欢迎大家和帝都的雁积极互动,头脑交流会比个人埋头苦学更有效!共勉!

公众号:帝都的雁

 

你可能感兴趣的:(java人生路,笔记)