尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

非科班半年拿下阿里Java岗:学习路线与面试复盘

非科班半年拿下阿里Java岗:学习路线与面试复盘 先交代下我的背景非科班到什么程度为什么敢冲阿里收到录用通知那天晚上我把邮件反复看了四遍才关掉页面。历时半年从连Java环境变量都要查教程到最终拿到阿里Java开发岗的意向书这个过程里踩过的坑、交过的智商税我觉得比最终结果更值得记录下来。先说下我的情况给正在纠结的兄弟们一个参考坐标。我本科是数学与应用数学专业纯正的科班数学不是计算机相关。毕业之后在一家传统行业公司做了两年数据分析日常工作主要是写SQL、用Python做报表偶尔处理一些Excel表格和Java开发没有半点关系。决定转行的原因其实很朴素项目组里隔壁的Java开发兄弟解决一个数据接口的性能问题折腾了一下午我看了一下午忽然意识到自己如果只会写SQL和Python脚本天花板太明显了。加上那段时间公司业务收缩我在数据分析这个岗位上能做的增量越来越少转行的念头就越来越强烈。真正开始准备是在今年三月底到九月底拿到意向书刚好半年。这半年里我做了几个比较关键的决定第一选定了Java作为主攻方向没有在Go、C之间反复横跳第二没有报那种几万块的线下培训班全程自学第三从第一天开始就把阿里系作为目标虽然中间有无数次觉得这是自不量力但目标感反而帮我省了很多纠结的时间。为什么选择Java而不是其他语言这个决定其实花了我整整一周去调研。我在招聘网站上看了一圈Java在互联网公司的需求量确实最大尤其是阿里、美团、京东这些老牌大厂的技术栈Java基本是绝对主力。另外Java的社区资料极度丰富非科班自学最怕的是遇到问题没人问Java这个方向几乎任何报错都能搜到解决方案这对一个没有同事可以请教的自学者来说太重要了。后来的实践也证明这个选择是对的——我学完之后去找内推可投的岗位数量明显比其他语言多。这篇文章我不会只贴面试题我更想讲清楚的是一个非科班的人如何在六个月内补上计算机基础、Java生态、算法和项目这四块硬骨头以及在这个过程中哪些策略是高效的哪些是浪费时间的。如果你是科班出身这篇文章里的学习路线部分可以跳着看但面试复盘和心态部分应该还有参考价值。如果你是和我一样的非科班转行者这篇文章就是为你写的。Java非科班补课路线我踩过的弯路和走通的正解3.1 第一个月到第二个月JavaSE基础这是最劝退也最关键的一步很多人非科班转Java第一个感觉就是Java基础怎么这么多。确实JavaSE这一块包含的知识点极其庞杂面向对象、集合框架、异常处理、泛型、反射、IO流、多线程、Lambda表达式、JDK新特性……我当时也差点被劝退。我的经验是第一遍不要试图理解所有细节而是快速建立整体框架。我用的是最经典的学习组合B站的JavaSE教学视频搭配《Java核心技术卷I》当工具书翻。视频倍速看每天的节奏是上午看三到四节视频下午把视频里的代码全部手敲一遍晚上整理笔记。注意是手敲不是复制粘贴这个习惯帮我建立了极好的代码手感后面笔试和手撕算法的时候受益明显。第一个月结束后我做了自测用Java实现一个简单的学生管理系统包含增删改查、文件读写、异常处理这些功能。这个项目没有任何花哨的框架纯粹用JavaSE做但能把集合、IO、异常这些基础全部串起来。这里有一个血泪教训不要急着学框架很多人刚接触Java就想着学Spring Boot去做网站基础不牢后面面试必挂。我认识的一个小伙伴Java基础一个月就草草过去了Spring Boot项目倒是做了三个面试的时候被问HashMap底层原理直接卡壳非常遗憾。第二个月的重点是多线程和JVM。这两个是Java面试的深水区也是区分普通程序员和合格程序员的分水岭。多线程我先看了《Java并发编程的艺术》的前六章配合B站上的并发编程专题视频把synchronized、volatile、Lock、线程池、CAS这些核心知识点吃透。JVM的话我看了周志明的《深入理解Java虚拟机》重点看运行时数据区、垃圾回收、类加载机制这三块。说实话第二遍看的时候还是很吃力但坚持下来之后后面面试被问到JVM相关问题基本没有卡壳。3.2 第三个月到第四个月数据库、Redis和Spring生态补齐后端开发的核心拼图Java开发面试绝对绕不开MySQL。MySQL的学习我分了两条线一条是使用层面包括SQL语法、索引优化、事务隔离级别、MVCC另一条是原理层面包括InnoDB存储引擎、B树索引结构、redo log和binlog的实现机制。使用层面我看的是《MySQL必知必会》加LeetCode的数据库题库原理层面我推荐《MySQL技术内幕InnoDB存储引擎》配合丁奇的《MySQL实战45讲》。Redis也是必考项。我一开始觉得Redis就是缓存后来发现远远不止。Redis的持久化机制、过期删除策略、内存淘汰策略、分布式锁、缓存穿透击穿雪崩这些都是高频考点。我学Redis的做法是直接在本地装了一个跟着教程把常用命令和数据结构的应用场景都敲了一遍。面试的时候如果只是背概念面试官追问两句就露馅了一实际操作过就能接上。Spring生态是Java开发的骨架。对于非科班来说我最开始看到Spring DI、AOP这些概念简直就是天书。我的学习方法是先不纠结底层原理先会用。跟着一个博客教程把一个Spring Boot的图书管理后端接口写完对Controller、Service、Mapper三层架构有了直观感受之后再回头去啃Spring的IoC容器和AOP原理。这样的顺序比一开始就啃原理要顺畅得多。3.3 第五个月计算机基础和算法非科班最需要补的隐形短板很多非科班转Java的人最容易被忽视的就是计算机基础。但恰恰是这部分在大厂面试中权重非常高。网络方面TCP三次握手四次挥手、HTTP与HTTPS的区别、TCP拥塞控制这些属于必背操作系统方面进程和线程的区别、进程间通信方式、死锁产生的条件也是高频考点。我用的资料是《图解HTTP》和《图解TCP/IP》这两本书都好读对非科班特别友好。算法是另一个大坑。我前三个月几乎没有碰算法导致第四个月第一次做LeetCode一道简单题想了整整一个小时还没写出来那种挫败感非常强烈。后来我调整了策略每天早上用两个小时刷题先按专题刷数组和链表、栈和队列、哈希表、二叉树、排序和搜索、动态规划每类都刷够一定量之后再开始做随机真题。这里要说一个很重要的经验非科班刷算法千万不要好高骛远。LeetCode的Hard题我基本直接跳过阿里校招的算法难度大部分集中在Medium题偶尔会有一道Hard但不影响整体评价。我的目标是简单题必须十到十五分钟ACMedium题在三十分钟内有思路并能写出来。最终我刷了大概两百多道题数量不算多但因为每道题都认真复盘了面试时手撕算法基本都稳住了。3.4 学习路线避坑总结什么该省什么绝对不能省六个月走过来我发现非科班学习最容易出现两种极端一种是只追求广度今天学完SSM框架明天去学Spring Cloud什么都懂一点但什么都经不起追问另一种是钻进原理出不来看JVM源码看了半个月结果连Spring Boot项目都没写过。正确的方式应该是螺旋上升先会用再深入先整体再细节。具体来说可以省钱省时间的是不需要报培训班B站和各类学习社区足够了、不需要买一堆纸质书电子版笔记工具很高效、不需要每个框架都学完重点学透Spring Boot其他用到再学。绝对不能省的是手敲代码的练习量、每天的数据结构和算法训练、以及计算机网络和操作系统的基础知识。这三点说白了就是内功内功不够后面面试高P的追问一两次就崩了。面试准备中最耗时间的部分算法、八股、项目的真实配比如果让我重新安排这六个月我会把面试准备分成三个模块算法题、面试八股、项目复盘。这三个模块的配比我觉得最理想的是244。但在实际执行中很多人包括我自己初期会陷入只看八股文不写代码或者只刷题不做项目的极端。先说说算法这个模块。很多人一想到大厂面试第一反应就是刷题。但说实话阿里Java岗的算法考核和纯粹算法岗的算法考核差别很大。阿里Java面试更看重的是你能否用规范的代码风格解决一个明确的问题而不是考你某个冷门算法技巧。所以我的训练重点放在了高频题型上链表操作、二叉树遍历、DFS/BFS、双指针、滑动窗口、简单的动态规划。这些类型在面试中出现频率极高练熟之后即使遇到新题也有基本思路。八股文这个模块很多人又爱又恨。爱的是靠它突击能快速提高面试表现恨的是背了忘忘了背而且面试官特别会追着细节问。我的方法是不背标准答案用面试官会怎么追问的方式去理解每个知识点。比如HashMap这条线我要求自己必须能回答出底层数组和链表的结构、红黑树化的条件链表长度达到8数组长度达到64、头插法和尾插法的区别、线程安全问题JDK7扩容死循环和JDK8的覆盖问题。把每一个知识点都拆解到三层追问的深度面试的时候就不会出现我记得但是说不清楚的情况。项目这个模块是很多非科班转行者最容易吃亏的地方。因为非科班的项目往往是从教程里抄的简历上写十个项目面试官一听到第一个就知道是培训班出来的。我的建议是项目在精不在多一个铺开深挖的项目比五个浅尝辄止的项目要值钱得多。我准备了一个自己的比赛项目和一个学习项目都是Java后端。比赛项目是一个校园二手交易平台学习项目是一个仿Redis的缓存中间件。重点在于项目的每一个设计决策我都要能说出为什么。比如缓存中间件为什么选择单线程Reactor模型为什么使用LRU淘汰算法为什么用跳表实现有序集合。这些问题的答案才是在面试中真正能加分的部分。阿里的面试流程一次完整的Alibaba面试复盘5.1 简历筛选和在线笔试第一关就有大学问我的阿里之路从八月开始。当时我在官网投递了简历同时又通过一个在阿里工作的学长走了内推。这里要说明一下内推和官网投递并不矛盾内推可以走团队定向招聘简历被捞起来的速度更快。如果你有认识的人在大厂一定不要不好意思开口内推对双方都有好处。投递之后大概一周收到了在线笔试的链接。阿里的笔试时间一般是90分钟两道算法题。我那次碰到的题第一道是实现一个LRU缓存属于高频题恰好我刚刷过做起来很顺畅。第二道是一道拓扑排序的应用题难度中等偏上我磕了三十分钟完成了主要思路并AC了。笔试的经验是代码题一定要保证编译通过哪怕思路不是最优也要先把简单的解法跑通空着是肯定过不了的。5.2 技术一面从自我介绍开始就进入高压状态笔试通过后大概过了四五天我收到了电话面试的邀约。阿里的技术一面通常是团队里的资深开发来面时间大约一个小时。这一面主要考察基础是否扎实以及有没有实际编码的能力。面试的第一个问题就是先做个简单的自我介绍吧。我知道很多人不太把自我介绍当回事但我在准备工作时把自己的经历按照教育背景-转行动机-项目经验-技术栈-个人优势的结构重新组织了一遍并且刻意把和Java开发相关的关键词比如半年时间系统学习了Java后端、完成了两个独立项目放在了前半段。电话面试的前几分钟面试官对你的印象基本就定型了自我介绍的质量会直接影响后续面试的氛围。技术问题的第一个就是那款经典中的经典聊聊HashMap的原理。听到这个问题我心里反而踏实了因为这是最熟悉的问题之一。我从底层数组加链表的结构讲起讲了hash函数和索引计算的过程又讲了链表转红黑树的条件最后补充了线程不安全的两种体现。面试官在我讲完之后追问了一句JDK8中HashMap为什么用尾插法替代了头插法这个问题我在准备时看到过解释完扩容时链表环的问题后明显感觉面试官的语气比刚才认可了一些。一面还问了JVM的内存区域划分、垃圾回收算法、MySQL的索引为什么用B树而不是B树、Redis的持久化机制以及一道经典场景题有一个热点商品的详情接口你的服务发现响应速度变慢你会从哪些维度排查。这道题其实考察的是知识面和实际工程经验我从CPU使用率、内存使用率、网络IO、SQL慢查询、Redis命中率这几个维度做了回答面试官听完之后追加了一个关于线程池参数调整的问题。这一面结束后我心里其实没底但隔了大概五天就收到了二面通知。5.3 技术二面项目深度拷打和系统设计思维二面的面试官是团队的技术专家这一面的风格明显和一面不同更关注问题的深度、思维方式和系统设计能力。上来没有让我自我介绍直接说我看你项目里做了一个缓存中间件跟我讲讲它承担了什么角色为什么你要做这样一个东西。这个问题我准备了很久。这个仿Redis的缓存中间件项目是我在学完Redis原理之后决定做的。学习基础知识的时候我对单线程Reactor模型、跳表这些概念理解得模棱两可但自己动手实现了一遍之后对IO多路复用、命令协议解析、LRU淘汰这些概念的理解就非常扎实了。所以被问到的时候我可以从为什么Redis能抗住高并发讲起再讲到我自己实现Reactor模型时的具体步骤包括主线程如何用epoll监听事件、如何把命令分发给工作线程、节点如何维护有序集合。面试官全程没有打断等我说完之后他问了一个很细的问题这个项目里你提到了跳表为什么有序集合要用跳表而不是直接用红黑树这个问题如果只是背概念面试官一追问就会卡壳。但因为我确实是自己动手实现过跳表能从概率平衡、区间查找、范围和排名操作这几个角度给出解释了。面试官看起来还比较满意。这一面结束时面试官说了一句希望有机会能在杭州见面我当时心跳都快停了因为这意味着这一面应该是过了。5.4 技术三面交叉面的不确定性三面是交叉面面试官是另一个部门的业务负责人。这一面更像是一个技术管理者和你的交流过程问题不算特别深但覆盖面很广。问了分布式相关的概念分布式事务为什么难以实现、CAP理论怎么理解、微服务里服务雪崩怎么处理、消息队列在系统里承担了什么角色。这些内容我在学习Spring Cloud和消息队列时系统看过回答起来还算从容。三面还有一个环节是让我的手写算法题。题目是二叉树的层序遍历需要按层输出每一行的节点集合。这个题属于二叉树遍历的经典题型核心是用队列做BFS并在每一层循环时记录当前队列长度。我大概用了十分钟写完了代码面试官看了一眼说没问题。三面之后我心理压力稍微小了一些因为我知道到了这一步技术面试基本接近尾声了。5.5 HR面技术面之后的重头戏HR面是整个流程里非常容易被轻视的一个环节。阿里HR有一票否决权这一点很多面试者不清楚。HR面问的问题看起来都很温和比如为什么选择我们团队、你对这个岗位的期待是什么、你未来三年的职业规划、你觉得自己有哪些优势和短板。我的建议是HR面的问题一定要提前准备但不能用八股的方式去回答。比如为什么选择我们团队你绝对不能只说因为阿里技术强这种回答太廉价了。我在回答时先说了我了解到的这个团队在做的事情以及思考自己的职业方向与团队业务匹配的点在哪里再说我对技术成长的期待。这样既显得真诚也表达了稳定性。最大的短板这个问题我也没有装模作样地说我最大的缺点就是太追求完美而是坦诚说了自己非科班出身在计算机原理的系统性上可能不如科班同学同时补充了自己正在通过阅读相关书籍弥补这一点。这样既没有暴露致命弱点又让人觉得真实。HR面结束后又是两周的等待。我一度以为已经凉了因为按网上的经验很多候选人会在这一步被默拒。最终在九月底我收到了意向书邮件那一刻我反而没有想象中那么兴奋更多的是一种终于对得起这半年的踏实感。这半年里比刷题更重要的事心态、节奏与信息差六个月说长不长说短不短。如果让我总结一下这半年里最容易被忽视的因素我认为有三点心态管理、学习节奏、以及信息差。心态管理方面非科班转行最怕的是今天觉得自己行了明天又觉得自己是个废物。这种心态波动在第四到第五个月最明显因为基础知识学得差不多了开始做真题和模拟面试时会发现自己很多东西好像学过但一开口就说不出个所以然来。我给自己的解决方案是允许自己不会但给自己定一个时间点比如这周不会的问题下周必须能闭卷回答。把焦虑转化为具体的学习任务是打败焦虑最有效的方式。学习节奏方面我给自己定的硬性要求是每天学习不少于六个小时上午算法下午技术原理晚上做项目。周末复习本周的所有笔记并做一次完整的模拟面试。这个节奏坚持了半年中间几乎没有断档。很多人会问要不要辞职备考我的建议是结合自己的情况如果想速战速决全职冲刺三个月比在职拖一年要有效得多但如果经济压力大在职备考则要做好战线拉长到八到十个月的心理准备。信息差这个东西真的非常决定效率。我这里的信息差不是指什么小道消息而是指对面试风格和节奏的把握。我自己在准备过程中前三个月完全是自己闷头学等学到了第五个月才开始看牛客上的面经分享才发现自己准备的方向有一些偏差比如花了很多时间在冷门算法上实际上大厂的算法题更偏向高频题型。所以我特别建议大家从第三个月开始就要去牛客、GitHub上搜目标公司的面经不需要每一道题都会但能帮你校准学习的方向。另外关于投递时间也很重要。阿里的校招提前批通常在三月份启动正式批在七到九月份越早投递招聘名额越充裕面试排队的时间也越短。我九月底拿到意向书如果拖到十月份再投竞争难度大概率会更大。所以我的建议是如果准备好了就不要犹豫早点投简历用面试来驱动学习效果反而是最高效的。最后再分享一个非常实用的小技巧因为我是非科班转行Java这块的自学过程中真的很依赖从网上搜教程和资料。偶尔会遇到Maven拉不下来包、镜像源配置不对导致反复踩坑的尴尬局面。这种情况我也遇到过很多次所以如果你也刚开始用Maven一定要第一时间把国内仓库镜像源配好能帮你省下大量报错排查的时间。如果你用的是IDEA或Eclipse在Maven的settings.xml里配置好镜像源再开始写项目整个体验会顺畅非常多。踩过几次坑之后你会发现环境配置这种破事提前规避永远比事后排查来得高效。
返回列表