1年6 个月13天,从外包到拿下阿里offer,没想到屌丝也能有今天

464 阅读8分钟

开篇介绍

个人背景:

不说太多废话,但起码要让你先对我有一个基本的了解。本人毕业于浙江某二本院校,算是科班出身,毕业后就进了一家外包公司做开发,当然不是阿里的外包,具体什么公司就不透露了,在外包一呆就呆了整整2年多,直到现在才从外包离开,如今拿到阿里的offer准备入职了。

阐述原因:

在外包公司的两年里,作为一名菜鸡,确实非常合格,技术没什么长进,眼见也没有提升,没规划没未来,让人实在焦虑,之所以开始改变自己也是家庭发生了变故,才让自己开始思考人生。身边很多人感叹过,能从外包逆袭,算是传奇,所以今天想要分享一下个人的经历,希望能够鼓励到一些与我有相似经历的同行。

注意:这次面试过程比较长,内容繁多,在文章中我基本上简述了,文章里的面试题完整版和我个人的总结方法经验(面试学习和刷题笔记),都整理有PDF完整版,有需要的可以看文末获取。

阿里巴巴Java岗面试题分享

——一顾阿里一面被怼(未知部门)

阿里巴巴未知部门一面(问的问题让我感觉是偏金融的部门,面试官很严肃,现在想想都有些后怕)

  • 自我介绍
  • 开源项目贡献过代码么?(回答没有,很尴尬)
  • 之前在部门做什么?简单介绍一下业务吧,内部有哪些系统,作何交互过程说一下
  • Dubbo踩过哪些坑?分别是怎么解决的?(我答了异常处理时业务异常捕获的问题,自定义了一个异常拦截器)
  • 说下你对线程安全的理解
  • 事务有哪些特性?
  • 怎么理解原子性?
  • 讲一下乐观锁和悲观锁的区别,这两种锁在Java和MySQL分别是怎么实现的?
  • HashMap为什么不是线程安全的?怎么让HashMap变得线程安全?两者的区别是什么?
  • jdk1.8对ConcurrentHashMap做了哪些优化?为什么这样优化?
  • redis主从机制了解么?怎么实现的?
  • 有过GC调优的经历么?(有点虚,答得不是很好)
  • List,Map,Set三个接口存取元素时,各有什么特点?
  • TreeMap和TreeSet在排序时如何比较元素?Collection工具类中的sort()方法如何比较元素?
  • Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行 它们有什么区别?
  • 线程的sleep()方法和yield()方法有什么区别?
  • 当一个线程进入一个对象的synchronized方法A之后 其他线程是否可进入此对象的synchronized方法b?
  • 请说出与线程同步以及线程调度相关的方法
  • synchroized关键字的用法?
  • 启动一个线程是调用run()还是start()方法?
  • 有什么想问的么?

——二顾阿里二面惨败(菜鸟网络)

阿里巴巴菜鸟网络一面:

  • 先来了个自我介绍
  • 然后介绍了自己简历里写到的一个比较熟悉的项目(询问了项目的细节及具体的实现)
  • 接着面试官开始针对项目进行提问:(1)高并发的情况下,Kafka消费到第一条记录,在下沉服务处理好,但由于网络抖动没有正确返回给上层,上层服务再次调用服务,怎么样保证只处理一次请求?(我答了分布式锁,介绍实现)(2)有自己用Redis实现过吗?说说看
  • 介绍一下Redis的zset实现(回答的根据skiplist+hashtable和多级索引的方式实现)
  • 介绍一下B树。(自己拓展开来回答,讲到了B+树的区别,聚簇索引和非聚簇索引,为什么B+树更矮胖,如何确定B树的阶等。)
  • 如果是普通索引,如何查找到对应的数据?
  • hashmap如何扩容的?讲transfer方法和resize方法。为什么容量是2的指数次幂?
  • 介绍一下悲观锁和乐观锁。
  • 介绍一下线程池(介绍几个参数以及几种常见的线程池,各自的阻塞队列)
  • 几个参数之间的关系?
  • 介绍一下jvm内存分区和垃圾回收机制?
  • 如何确定eden区的对象何时进入老年代?当线上监控中心的新生代和老年代哪个区域发生垃圾回收,表示此时比较危险?
  • Spring的两大特性?Springboot如何实现自动装配的?aop在项目中用过吗?怎么用的?底层是如何实现的?介绍一下动态代理。jdk原生的动态代理和cglib的动态代理有什么区别?
  • spark和flink的区别?(简历没写flink,但之前有spark任务,就勉强回答了一下)。
  • 有没有发生数据倾斜的情况?如何解决的?怎么观察spark任务的执行情况?
  • 有了解过apollo吗?
  • 了解CAP原则吗,介绍一下?
  • 你有什么要问我的吗?

阿里巴巴菜鸟网络二面:

  • 自我介绍,这次着重介绍自己的项目经历和项目总结。
  • 介绍项目,我刚说第一个就被面试官打断了,感觉要开始怼我,直接问有没有更亮点的项目。然后我介绍了另一个比较难的项目,讲了一些业务背景以及使用到的技术栈,不知道为什么面试官没有拓展开继续问下去了。
  • 网络协议有哪些?
  • 讲讲ThreadLocal的作用,是否线程安全?
  • 进程间的通信
  • TreeMap讲解,里面有什么属性,entry里有什么属性?
  • Java里有哪些是不需要加锁的同步方法?
  • 行锁和表锁的区别、场景
  • 组合索引的使用,eg. (a, b, c)索引,where a=x;where b=x;where a=x and b=x;哪个能使用索引?
  • ArrayList和linkedlist的区别?
  • 有哪些集合类是线程安全的?
  • 算法:(1)排好序的数组,找2个数的和为M的所有组合;(2)大数据下,找出出现频率topK的ip
  • 上家公司的研发部门有哪些组?大致的工作内容是什么?一个组多少人?你在什么组?负责什么?
  • 离开上家公司后,在看什么书?学习什么技术?(回答在研究Dubbo和MySQL,还看了一些底层实现的东西)
  • 截止目前,你自己感觉面试表现怎么样?
  • 你有没有要问我的?

面试总结及建议

每一次Java面试,其实都是一次学习机会,是对自己技术知识栈的梳理、考核、复盘。我们应该抱着学习的态度,认真对待,找到自己比较薄弱的环节,尽快去查漏补缺学习巩固。对于面试来说,其实也没有太多的技巧可言,面试官主要看重的就是个人能力,无非就是两个方面:

  • 技术广度
  • 技术深度

外包CRUD屌丝,是怎样逆袭的?

外包出身的我,究竟有多么菜,多么屌丝呢?还在外包的我,面试时被问到什么是成员变量,我是什么都不知道,相信这种程度大家应该有所感受了。

那作为一个外包CRUD屌丝,我是怎么做到逆袭的呢?

注意:下文主要是我个人的总结方法经验(面试学习和刷题笔记),都整理有PDF完整版,有需要的可以私信我「成长」免费分享给你。

01 梳理知识体系,学会查漏补缺

关于知识体系的梳理,我个人主要分为以下5个部分,有针对性的,将这5个部分逐步击破,那么搞定面试是基本没什么问题了。

  • 并发编程:多线程,高并发,CAS,锁,容器,线程池底层
  • 性能调优:Mysql,IO及网络调优,算法调优,JVM
  • Spring全家桶:Spring,SpringMVC,MyBatis,IOC,AOP 缓存数据库:Redis,mongoDB,MySQL
  • 分布式&微服务:SpringBoot,SpringCloud,docker,maven

02 根据要点,逐个击破(根据大纲内容来进行复习)

1.并发编程(核心技术笔记)

  • Java多线程技能
  • 对象及变量的并发访问
  • 线程间通信
  • Lock的使用
  • 定时器Timer
  • 单例模式与多线程
  • 拾遇增补

K8s学习指南

k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,推动了微服务架构等热门技术的普及和落地,正在如火如荼的发展。

点击免费领取我的学习笔记:学习视频+大厂面试真题+微服务+MySQL+Java+Redis+算法+网络+Linux+Spring全家桶+JVM+学习笔记图

Spring Cloud微服务实战

SpringCloudAlbaba笔记

redis深度笔记:核心原理和应用实践.

珍藏版Mybatis:入门+配置信息+印射+缓存+整合Spring+面试

MySQL性能调优与架构设计解析文档

Nginx实战

ElasticSearch学习笔记

1000道互联网Java.工程师面试题

点击免费领取我的学习笔记:学习视频+大厂面试真题+微服务+MySQL+Java+Redis+算法+网络+Linux+Spring全家桶+JVM+学习笔记图