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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 作者:以大橘为重链接:https://www.nowcoder.com/discuss/156087 楼主是19届应届生,去年在牛客学到了很多东西,在实习和秋招也收获了一些offer(Java后端开发工程师)。


楼主是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七层,三次握手四次挥手等

    • 设计模式

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

    • 关注公众号「黄小斜」后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。


    相关实践学习
    基于Redis实现在线游戏积分排行榜
    本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
    云数据库 Redis 版使用教程
    云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
    相关文章
    |
    2月前
    |
    架构师 前端开发 Java
    Java开发工程师的职业规划应该是什么样的?
    Java开发工程师的职业规划涵盖多个阶段,包括初入行业(0-1年)、技能提升(1-3年)、技术专家(3-5年)及管理或专家路线选择(5年以上)。各阶段设定了明确的技能要求与职业目标,从掌握Java基础、常用框架到深入研究高级技术、微服务架构乃至担任管理职务或成为技术专家。通过持续学习与实践,结合个人兴趣,Java工程师可在技术或管理领域找到合适的发展方向,最终实现职业成功。
    418 83
    |
    1月前
    |
    JSON 前端开发 Java
    震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
    文章介绍了Java后端如何使用Spring Boot框架响应不同格式的数据给前端,包括返回静态页面、数据、HTML代码片段、JSON对象、设置状态码和响应的Header。
    136 1
    震惊!图文并茂——Java后端如何响应不同格式的数据给前端(带源码)
    |
    2月前
    |
    设计模式 架构师 Java
    Java开发工程师转架构师需要学习什么
    Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
    68 18
    |
    2月前
    |
    人工智能 前端开发 Java
    Java开发工程师转哪个行业比较好?
    Java开发工程师转哪个行业比较好?
    294 2
    |
    3月前
    |
    人工智能 自然语言处理 Java
    Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
    文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
    Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
    |
    3月前
    |
    Java 数据库
    震惊!Guava Throwables 类如魔法棒般神奇,让 Java 异常处理华丽变身!
    【8月更文挑战第29天】在 Java 开发中,异常处理至关重要,而 Guava 库中的 `Throwables` 类则提供了强大的异常处理工具。它包含了一系列静态方法,如 `propagateIfInstanceOf` 和 `propagateIfPossible`,可以帮助我们有条件地传播异常。此外,`getRootCause` 方法可以深入分析异常的根本原因,有助于快速定位问题所在。无论是构建大型分布式系统还是电商平台,`Throwables` 类都能显著提升异常处理的效率和准确性,使我们的程序更加稳定和可靠。
    40 1
    |
    2月前
    |
    小程序 前端开发 JavaScript
    Java开发工程师转小程序开发的前景如何?
    Java开发工程师转小程序开发的前景如何?
    48 0
    |
    5月前
    |
    Java 开发者
    震惊!Java命名规范背后的惊天秘密,你真的了解吗?
    【6月更文挑战第15天】Java命名规范提升代码可读性。标识符须以字母、下划线或$开头,避免数字开头。变量用camelCase,如`myVariable`;类与方法用PascalCase,如`MyClass`和`myMethod`。常量全大写加下划线,如`MAX_VALUE`。避免关键字冲突,确保可维护性。
    45 10
    |
    5月前
    |
    Java
    震惊!Java子类竟能“继承”父类财富,还能“自立门户”添新招!
    【6月更文挑战第16天】Java的继承支持类的层次结构,子类(如`SportsCar`)继承父类(如`Car`)的属性和方法。`SportsCar`不仅拥有`Car`的基本功能,还能添加独特属性(如最高时速、加速时间)和方法(如氮气加速),并能重写父类方法以扩展功能。此机制促进代码复用,提高效率。例如,`SportsCar`调用`super.accelerate()`执行基本加速,并添加跑车特有的加速效果。
    42 8
    |
    5月前
    |
    Java 开发者
    震惊!Java多线程的惊天秘密:你真的会创建线程吗?
    【6月更文挑战第19天】Java多线程创建有两种主要方式:继承Thread类和实现Runnable接口。继承Thread限制了多重继承,适合简单场景;实现Runnable接口更灵活,可与其它继承结合,是更常见选择。了解其差异对于高效、健壮的多线程编程至关重要。
    35 2
    下一篇
    无影云桌面