涨薪80%,从CV战士逆袭,坐上阿里P7技术专家(面经+心得)

前言

大多数情况下,程序员的个人技能成长速度,远远大于公司规模或业务的成长速度。所以,跳槽成为了这个行业里最常见的一个词汇。

实际上,跳槽的目的无非是为了涨薪或是职业发展,我也不例外。普通本科毕业后,进了一家外包公司,这几年里不断在积累经验,最终选择跳到阿里,涨薪了80%,下面分享一下我个人的面经和一些心得建议。

A:面试前的准备

1.目标企业

在跳槽之前,一定要思考清楚自己的目标企业是什么,到底是去大公司当一颗螺丝钉,还是在中小公司做万金油。

当然,去大公司也不一定是螺丝钉,关键还是要看自己的技术水平和能力。所以综合自己的实际情况考量来看,目标企业在阿里、字节和京东三家里选择。当然,3家都投了简历,最终在面试阿里时发了力拿下了Offer。

2.时间节点

跳槽的时间节点是非常重要的,不同的时间节点,岗位面试的难易程度可能都有不同,主要是根据缺人的程度以及岗位HC的数量来划定的。

一般来说,以下两种情况,是比较容易通过面试拿到offer的:

  1. 着急招人干活的时候
  2. 年底坑比较多的时候

3.简历准备

关于简历的准备,我不用多说,大家应该也都明白。简历至少要满足以下几个要点:

  • 以项目为主体,设计你的简历
  • 针对企业的需要,突出你的技能
  • 项目的三要素(项目 = 产品 + 技术 + 结果)
  • 量化你的项目,给出数字

关于简历的准备,很多人可能不知道从何下手,我这边可以提供一些简历模板作为参考,对我个人来说,帮助还是非常大的。

4.面试复习

关于面试前的复习,重要性我就不过多赘述了,相信只要面试过的人都知道,即使是临时抱佛脚,也比直接裸面要强得多。至于我的复习方法以及一些技巧,会在文章的第三部分详细说一说,希望能给你一些启发。

B:面试阿里全过程(面试题分享)

阿里一面:

  1. 线程池的工作原理,几个重要参数?
  2. 给了具体几个参数,分析线程池会怎么做?
  3. Java容器有哪些?
  4. 哪些是同步容器,哪些是并发容器?
  5. ArrayList和LinkedList的插入和访问的时间复杂度?
  6. java反射原理,注解原理?
  7. 新生代分为几个区?使用什么算法进行垃圾回收?为什么使用这个算法?
  8. HashMap在什么情况下会扩容,有哪些操作会导致扩容?
  9. HashMap push方法的执行过程?
  10. HashMap检测到hash冲突后,将元素插入在链表的末尾还是开头?
  11. 1.8还采用了红黑树,讲讲红黑树的特性,为什么人家一定要用红黑树而不是AVL、B树之类的?
  12. https和http区别,有没有用过其他安全传输手段?
  13. linux怎么查看系统负载情况?
  14. 讲一讲AtomicInteger,为什么要用CAS而不是synchronized?

阿里二面:

  1. 请详细描述springmvc处理请求全流程?
  2. spring 一个bean装配的过程?
  3. 项目用 Spring 比较多,有没有了解 Spring 的原理?
  4. AOP 和 IOC 的原理?查询中哪些情况不会使用索引?
  5. 数据库索引,底层是怎样实现的,为什么要用B树索引?
  6. Mysql主从同步的实现原理?
  7. MySQL是怎么用B+树?
  8. 谈谈数据库乐观锁与悲观锁?
  9. 有使用过哪些NoSQL数据库?MongoDB和Redis适用哪些场景?
  10. 描述分布式事务之TCC服务设计?
  11. Redis和memcache有什么区别?Redis为什么比memcache有优势?
  12. 考虑redis的时候,有没有考虑容量?大概数据量会有多少?

阿里三面:

  1. 各种聊项目,从项目的架构设计到部署流程。
  2. solr和mongodb的区别,存数据为什么不用solr?
  3. 谈谈分布式锁、以及分布式全局唯一ID的实现比较?
  4. 集群监控的时候,重点需要关注哪些技术指标?这些指标如何优化?
  5. 从千万的数据到亿级的数据,会面临哪些技术挑战?你的技术解决思路?
  6. 继续聊项目。
  7. 对分布式架构设计的哪些方面比较熟悉?
  8. 介绍你实践过的性能优化案例,以及优化思路
  9. 你参加过的项目中,哪个项目让你收获最多,这个项目使用了哪些技术,挑战在哪里?
  10. 工作中遇到的最大挫折是什么,说说得与失?
  11. 最近有没有学习过新技术?

阿里面试题答案:

C:如何实现质的飞跃?

1.技术沉淀(学习+积累)

对于技术新人来说,无论是在大厂小厂,还是在外包公司,基本上都是做得简单的CRUD工作。很多人认为,重复简单的工作对自己的技术是没有提升的,但实际上也有人能从中杀出一条血路,所以关键是你自己是否花了心思,付出了努力。

当然,我个人也有自己的一套学习方式和习惯,平时喜欢利用碎片时间来看点什么东西,比如一些技术性的书籍或文档,还有一些视频讲解等,经常会让我有一种恍然大悟的感觉,对我的工作也起到了很大的帮助。

  • 阅读书籍文档:

  • 看视频学习:

  • 面试刷题:

2.确立正确的技术方向

在我看来,有时候选择比能力更重要,俗话说:站在风口上,猪都能起飞。

对于程序员来说,尽早地做好自己的职业规划,确立发展路线,是很有必要的。我认为,同样的实力,善于发现和判断机会的人,永远占据先机。

程序员的发展方向,大致分为三类:

  • 架构师
  • 项目经理
  • 管理者

首先抛开管理者不谈,就前两个方向来说,对你的技术水平和工作能力都有一定的要求,首先我们要清楚,技术是根基,其次才是能力偏差。

比如,架构师需要你具备完善和扎实的技术体系,具有一定的修养,具备较好的系统分析和设计能力,具有丰富的开发项目经验;而项目经理,除了技术要过关以外,还应该了解软件开发的的各个环节、了解开发的各种技术和运用、了解开发队伍人员的水平和特点。

3.学习如何阅读别人的代码(笔记)

不知道为啥,很多开发人员总有一股“迷之自信”,抱着“除了我,其他每个人写的代码都是垃圾”这种想法,用杨笠的观念:为什么你明明很普通,却又那么自信?

实际上,能够在别人的代码之上继续工作是一项有多重好处的伟大技能。因为不论以前的代码是多么混乱或者考虑不周,你都需要去扩展它。

由此,它会对你两方面都带来益处:

  • 能够阅读他人的代码是一个了解什么是糟糕设计的好机会。
  • 能够阅读别人乱七八糟的代码的话,也使得在需要更新的时候变得容易。

我个人会阅读一些大佬的技术笔记,其中就包括了一些开发技巧和源码:

(篇幅有限,只展示部分了,笔记包括Spring全家桶、Redis、MySQL、JVM等各个知识点)

  • Spring源码笔记

  • SpringBoot技术笔记

  • 玩转Redis实用笔记

4.培养自己的场景化思维

在工作的前两年里,我一直都在培养自己的场景化思维,这种思维是很难在大学学习中复制到的。何为场景化思维?也就是会主动去思考最终用户可能会如何错误地使用你的软件。

由于大部分编程都是维护性的,因此它通常意味着更改与其他代码高度耦合的代码。即使是简单的更改也需要跟踪对象、方法和 API的每一个可能存在引用的地方。否则,很容易意外地打破你没有意识到的模块连接。即使您只是更改了数据库中的数据类型。它还包括在进入开发之前通过边缘案例和整体化的高级设计进行思考。

对于开发新模块或者微服务的场景就更加复杂,花时间去考虑所构建的操作场景非常重要。想想未来的用户可能需要如何使用您的新模块,他们可能会如何不正确地使用它,可能需要什么参数,以及未来的程序员是否会以不同的方式需要您的代码。

简单的编码和编程只是问题的一部分。创建一个在你的电脑上运行良好的软件是很容易的。但是部署代码可能出错的方式就会有很多。一旦进入生产环境,就很难说代码将如何使用,以及哪些其他代码将附加到原始代码中。五年后,未来的程序员可能会对你的代码局限性感到沮丧。

总结

Java程序员,最宝贵的时间是从你开始工作那一刻计算的“黄金五年”,这五年是你学习和成长的最好时期。

为自己奠定一个好的基础,才能够在未来的发展道路上少走些弯路,实现自己年薪五十万、一百万的梦想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值