震惊!文科生如何三个月转行成为Java工程师?

点击上方“程序员江湖”,选择“置顶或者星标”

你关注的就是我关心的!

 

作者:以大橘为重
链接:https://www.nowcoder.com/discuss/156087

 

楼主是19届应届生,去年在牛客学到了很多东西,在实习和秋招也收获了一些offer(Java后端开发工程师)。在20届春招即将开始之际,把整理了很多资料给大家分享一下,顺便打个广告233。

有点标题党,学习Java可能有两年时间,不过春秋招复习加起来大概就花了三个月(但是感觉比之前学的内容加起来都多...)。

 

复盘

首先要说的我自己肯定不是什么大神,也拿不到一堆ssp,只是想分享给大家,一个不是很聪明的人(我高中是文科生,数学什么的很差),如何能尽自己所能找到一份程序员的工作。

 

学习历程

  • 大一的时候因为自己学习的专业就业前景一般,并且没有做学术的志向,家境一般很想找份薪资高点的工作,然后知乎一股CS至上的风气让我下了转专业的决心。大一的时候也并不清楚自己适不适合、能不能做这一行,尤其是转专业很容易,一直以来心里都没什么底。大一的时候自学了JavaSE,当时看了一吨的各种培训机构的教学视频,然后读了几本《Java核心技术》、《Java编程思想》等语法书,然后自己照着培训结构的视频做了个XX管理系统,然后大一就结束了。

  • 大二一年过得很艰难,一年要上两年的课(补大一的课),但还是自己抽了一些时间去学JavaEE的技术(也是为了做课程设计),比如Spring、Hibernate、Spring MVC等框架,还有MySQL、Redis等存储技术,然后学了一点前端,勉强能自己写个网站的demo。这时候对Java的原理以及框架的原理都不懂,只能说会用。而且当时培养了一种错误的观念,就是框架学的越多,学的框架越牛逼,就好像自己也牛逼了,大把时间都跑去学各种框架了,写了一堆demo。

  • 大二下不知自己几斤几两地参加了菜鸟的春招,结果一面还不到10min就GG了。原因大概是一些专业课比如OS、网络等都没学过,记得当时问了一些比如Spring原理、Redis原理等问题,自然是啥都不会,还问了有没有正式的项目经历,写了一堆demo的我自然也是没有...

  • 大二下大概也是正常上课,因为有门课的课程设计跟数据分析有关,又跑去学Python、Numpy、Pandas啥的,半途而废了...

  • 春招失败,但还是想去找个实习。在大二暑假开始前,学长介绍有个公司招暑期实习,然后就屁颠屁颠去了。结果当时准大三的我,还有几个准大四的学长,面试好像就随便问了几个问题,就莫名其妙GG了...听说最后是要了准大四的学长...

  • 大二暑假意识到只学框架是不够的,最好是能有项目经验,但是项目经验也是要实习才能拿到的。此处可以祭出这张图。

 

没有正式上线的项目经验,就只能靠基础知识补了。

 

  • 暑假补了补Java的并发、NIO相关的基础,写了一个聊天室项目(不知道为啥后来就100+star了...);然后是读了一些并发的书《Java并发编程实战》。

  • 然后是想起学JavaSE时候有个教程教如何手写(只用JavaSE API)一个WebServer,然后就模仿着自己写了一个,最初的版本也就1000行,后来春招又完善了一下。

  • 当然又补了一些框架/中间件,比如SpringBoot、Dubbo、RocketMQ的学习,又写了一堆demo。有一个demo(自己)觉得还不错的,就是自己在本机上搞了一堆虚拟机模拟分布式,分库分表,还有用MQ来解分布式事务的问题(其实也没啥技术含量,只不过比单机的demo强一点...)

  • 学框架/中间件的教程(一些什么架构师教程233...)中看到了Netty,了解到Netty是一个网络编程框架,做分布式网络通信的(也就是做中间件的,不是搞应用开发的),读了《Netty权威指南》,又写了一些demo。

  • 再后来...一言难尽,自制力不足去打王者荣耀了emmmm。

  • 大三上的话课程也是有点多的,还有课程设计,为了课程设计学了Vue.js和PHP(这部分对找工作来说实践证明是没用的...),然后想要读一读框架源码的,就花了大概一两周读了Spring源码,读了《Spring源码深度解析》,还写了一些源码解析文章(当然和网上流传的大同小异),然后又自己模仿着《架构探险-从零开始写JavaWeb框架》,自己又写了一个简化版的Spring IOC+AOP(不过后面面试的时候讲这个项目讲着讲着就讲到了Spring源码)。

  • 大三上快结束的时候意识到马上要决定以后的去向了,顿时慌得一批,自己分析了一下去向。成绩应该能保研,但是最后是放弃了,给自己找了一些理由:

  • 只能保研本校本专业,不能去更好的学校

  • 读研最好是能搞机器学习之类的,做Java开发搬砖啥的好像也不用读研

  • 懒吧,觉得要读研就要在两年后再经历一场春招秋招...还不如现在把这个事解决掉,要不又要提心吊胆担心失业

  • 另外自己觉得前两年也算是为找工作做了一点准备,也不至于说从零开始

决定了之后就开始迷茫,不知道要学哪些东西,学到什么程度。然后就花了好几天的时间去牛客网上找面经,大概看了有100篇+的面经,把问题分类都记了下来,算是心里有了点底。

  • 之后就进入寒假,回家准备复习春招了。

 

春招

  • 大概是从1月中旬开始复习,然后3月上旬开始投简历,中旬开始面试,一直面试到4月中旬。

复习的内容大概是以下这些,我自己是文科生,在高中时时候就有个习惯是记笔记,因为自己记性很差,看过的书过几天就忘光了,所以自己记了很多笔记,之后在春找面试期间/秋招复习可以只看笔记快速复习。

 

  • 这些笔记我不太确定是否合适放到网上,因为在记笔记的时候是到处抄(当前自己也有总结),有抄书上的,有抄别人博客的,图省事都没记录下出处。所以在这想问一下大家这些资料是否合适上传到网上,被原作者发现有什么后果.....

  • 复习顺序大概是先去复习数据结构和算法,这部分因为自己不太聪明吧,学的很吃力。当时也买了牛客网的直通BAT面试算法精讲课。然后刷了《剑指Offer》,本来打算刷leetcode的,但是这里想讨点巧,自己确实不擅长,如果公司真的要求很高,干脆就放弃好了(对,说的就是你,头条)。

  • 然后是看操作系统、计算机网络、数据库理论之类的,这部分就看的当前上课时候整理的笔记

  • 之后是Java、分布式还有框架/中间件的复习。这部分是看了好多书,感觉这个寒假看的书比前两年加起来的都要多emmmm。

《Java并发编程实战》

《Java并发编程的艺术》

《深入理解Java虚拟机》

《Java编程思想》(这本不建议突击看,最好是平时看)

《分布式Java应用 基础与实践》

《大型网站技术架构 核心原理与架构分析》

《大型网站系统与Java中间件实践》

《Head First 设计模式》

《Spring 源码深度解析》

《架构探险 从零开始写JavaWeb框架》

《深入分析Java Web技术内幕》

《Redis实战》

《高性能MySQL》

《从Paxos到Zookeeper 分布式一致性原理与实践》

《深入剖析Tomcat》(这本看的比较粗略,看博客也行)

《深入分布式缓存 从原理到实践》

《剑指Offer》(神书!除了头条、腾讯或者外企或者其他国内比较重视算法的公司,这本书足够应付面试了,当然对算法比较感兴趣的建议刷leetcode,更稳一些,笔试也不容易被刷,另外左程云的《程序员代码面试宝典》也很好,有时间可以看)

《Netty实战》

此外还要看操作系统、计算机网络、数据结构和Linux相关的教材。

另外还有一些我还没来得及看,但感觉非常好的书:

《Redis设计与实现》

《MySQL技术内幕 InnoDB存储引擎》

《大规模分布式存储系统》

《亿级流量网站架构核心技术》

  • 因为学了Netty、Dubbo等技术,打算再深入一点,把Netty用在一个稍微正式一点的项目上,不要只停留在demo上。所以花了一些时间手写了一个RPC框架,最初版本也就1000+行。

  • 这个时候觉得写一些网站的(尤其是非正式上线的项目,自己写着玩的)之类的写不出什么花来,翻来覆去还是用别人的东西。但是面试,尤其是阿里巴巴,对原理要求挺高的,你在项目里用了啥,你最好是能说得出来它是怎么work的。如果自己去造个轮子之类的,你会对某个组件或框架变得很熟悉,比读一遍源码在理解上要深一些(而且没有SSM那么low...)。

  • 然后就开始春招了,总共投了18家公司,最后是收到了5家公司的offer(酷家乐、快手、菜鸟、携程、网易),最后是选择了菜鸟,主要是因为阿里巴巴对Javaer吸引力确实很大。说到菜鸟还是挺有意思的,一方面是去年就透过实习,另一方面内推名额不是找人要的,而是一位师兄在Github上爬虫爬到我的,然后就给我发了邮件说你的Github上的项目很让人印象深刻balabala,然后发了内推。后来实习入职以后问这位师兄,因为特别好奇是哪个项目被阿里大佬看上了,结果人家说是全发了...没有筛选(这可太尴尬了....)

  • 之后5月份中旬就跑去实习了,虽然学校规定是7月份期末考完才能出去,但是自己算了一下7月份实习到9月份转正答辩的话实习时间太短了,感觉做不了什么事情,所以提前就溜了。当然另一方面是课程也比较少,不过考试很多,要考好几次。实习了大概三个月就买了十几张南京——杭州的高铁票(感觉实习完全没赚到钱,全花在路费上了emmmm)

  • 4月中旬到5月中旬也是忽然颓废的一个月,明明后面还有秋招,但又去打游戏(那时候frostpunk刚出,玩了好几天),看小说。技术上就只是把WebServer这个项目又完善了一下,把原来的网络实现从BIO改成了BIO/NIO/AIO。

 

实习

然后就开始了实习,实习的时候大概做了几件事,比如给师兄研发的中间件开发一个Web控制台,做一个快递相关的业务系统,还有一个类似于ABTest的系统。

  • 第一件事其实业务很简单,只是熟悉了集团内部的一些中间件,但是后来觉得这样后面面试的时候实在没得聊,就把师兄自研的中间件的源码读了一遍,自己总结了一下。

  • 第二件事花的时间最多,但是代码快写完了突然收到通知说项目取消,业务没谈成...这件事对我来说打击挺大的,至此对业务开发就产生了很多负面情绪,这也是我后来离职重新秋招的主要原因。

  • 第三件事也是挺简单的,基本上没学到什么新东西。

  • 在实习后期觉得自己做的事情技术难度不大,学不到什么新的东西;而且觉得业务开发不好,很想去做中间件或者基础设施相关的研发。在一番纠结后(大概是7月下旬)决定重新秋招。但是自己情况很差劲,一方面实习任务还是挺重的,没有时间学新的技术;另一方面春招复习的内容也忘得七七八八了。

  • 之后打算先做点新的东西,总不能跟春招一个水平吧。然后就花了两个多周(主要是晚上和周末)把RPC项目重新写了一遍(模仿着Dubbo的分层结构),最后大概有4000行左右。

  • 另外抽时间把Dubbo、RocketMQ等中间件的源码也看了一遍。

  • 之后就决心要离职了,白天也开始复习春招时候的笔记,复习了大概一周,然后就离职了。

 

秋招

秋招时候一门心思想找偏技术的方向,先是联系了一些阿里的其他部门,包括集团的中间件、蚂蚁的中间件等,外面的面的比较少,只面了PDD和网易。比较遗憾的是集团的中间件没有面过,还是自己的水平不足。其他的拿到了offer,最后是选择了蚂蚁中间件。

 

建议

  • Java方向的话最好是写点有自己思考的项目,不仅限于CRUD的那种。比如我简历中写了4个项目,一个是Web项目,其他都是小轮子,大部分面试官明显都对小轮子感兴趣,对全是套路的JavaWeb项目感觉兴趣不大。

  • 简历中项目中的各个实现要尽量熟悉,如果做得时间久了,可以考虑画一个类图或者时序图来加深印象

  • 有真实的、在线上运行的、有一定用户量的项目会加分的

  • 笔试的话一定要给后面的编程题留足时间

  • 不够熟悉的技术干脆不要往简历上写,比如我会写Vue.js,但仅限于使用,而面试官一定是会问基础的,做Java的前端基础不够好的话就不要写熟悉前端了...

  • 多刷刷牛客的面经

面经

这里简单的总结了一下面试过程中经常被问到的,自己记性不太好,没有在每次面试完之后记一遍问到的问题(明明是懒...)

 

  • Java集合框架源码,几乎每个公司直接间接地都问过

  • Java并发相关的知识,源码问的较集合少一些

  • Linux常用命令,列举一些

  • 关系数据库的事务、索引、锁、范式

  • JVM, 基本都在《深入理解Java虚拟机》上

  • 基础数据结构(链表、二叉树、队列、栈)以及排序查找算法

  • TCP UDP等网络协议,OSI七层,三次握手四次挥手等

  • 设计模式

  • 项目,这部分看个人情况,你在项目上写过什么技术,面试的时候就更容易被问到,而且往往会侧重原理

 

软文时间

 

我们团队是蚂蚁中间件中做中间件产品化工作的,当然也负责比如监控Metrics等一些中间件,主要是做金融科技产品的对外输出,就是把支付宝积累的高并发、高可靠的中间件、PaaS等产品化,以公有云或私有云的方式对外输出。目前蚂蚁金服的一大战略就是金融科技,我们可以算得上是内部创业,未来发展前景非常好,也非常缺人。

现在我们团队需要20届的实习生,岗位有Java工程师、Go工程师等,三月份开始把简历录到系统里然后开始面试,现在就可以投起来了。

 

下面是师兄发的JD,大家可以把简历发到师兄的邮箱 xiangfeng.xzc@antfin.com。

大家如果有什么疑问或者想求助,也可以牛客私信我。

岗位描述:

• 加入我们,你将参与 SOFA 开源的研发,打造金融级分布式架构的体系。

• 加入我们,你将接受到每年双十一,双十二带来的高并发的,高性能的极致性能挑战。

• 加入我们,你将在实际生产环境中应用世界前沿的技术方向,引领未来。

岗位要求:

• 酷爱着计算机以及互联网技术,热衷于解决挑战性的问题,追求极致的用户体验;

• 痴迷于数据结构和算法,热衷于ACM,常常为看到“accept”而兴奋的手足舞蹈;

• 至少熟悉一门计算机语言(C,C++,Java,Python,Golang,Rust),有良好和快速的学习能力。

• 有良好的进取心和责任感,有良好的团队合作精神。

• 有大赛获奖经验,开源项目经验者优先。

邮箱:xiangfeng.xzc@antfin.com

 

 

 

推荐阅读:

百度面试两板斧:手写算法问基础

记一次面试腾讯的奇葩经历

 

  



你点的每个”在看”,我都认真当成了喜欢

posted @ 2019-05-04 11:48  程序员黄小斜  阅读(973)  评论(0编辑  收藏  举报