非科班半年转Java开发经验贴

 

为期一个多月的春招旅程终于告一段落了,春招过程中牛客也带给了我很大的帮助,今天写一个经验贴讲下自己从去年10月放弃考研,转Java开发备战春招,到如今如愿拿到offer的学习历程。

后来又很多人又私聊我问了一些问题,我尽可能的补上

个人背景

  • 某末流985国贸专业本科
  • 大学前三年除了计算机二级考了Python外,没接触过编程(随便吐槽下Python是我们专业选修,而且不选很难修够分,不知道是哪个神仙老师安排的)
  • 去年从6月起复习考研,到10月中旬下定决定转程序员(一入此门深似海)
  • 春招从3月起,主要使用Java的公司面过的都收到offer了

面试经历

  • 华为一面挂(只问了两个算法,一个中等秒做,一个是困难变种,遇到过的最难算法,目前还是不会)
  • 腾讯二面挂(也只被问了两个问题,以前的面经中有,这两次面试沉重打击了我的信心)
  • 字节二面挂(总共面过5次,10个算法做了9个还是最多二面,可能就是无缘吧)
  • 跟谁学offer
  • 美团offer
  • 招银offer
  • 小米offer
  • 网易offer

简历篇

我第一次用的简历是淘宝上找人做的,很花哨,但后来经过在牛客网上找的大佬指点,才知道其实程序员的简历越简洁越好。我强烈推荐《超级简历》这个网站,里面制作程序员简历很方便

因为是非科班,能写的东西很少,没有相关奖项,没有比赛,甚至可能像我实习经历也非常水,那么只能在项目上多做文章了。

我是用了两个项目

  • 一个是分布式的秒杀系统,自己部署在了租的阿里云服务器上,这个项目把传统CRUD的一套技术栈都覆盖了,而且因为可以实际上线,可以学到很多东西。
  • 另一个是基于BIO、NIO、AIO实现的多人聊天室,很简洁,用命令行运行的,主要是为了学习IO,尤其是IO多路复用的知识,redis和ngnix中都用到了NIO,能把这些搞清楚面试会很加分。

这些项目都是在某课网上找的,大家应该可以自己查得到,非科班 不像科班渠道很多,要找靠谱的项目真的很难,这也是我花了很多时间找到了两个对于面试很有帮助的项目。我觉得项目不只是要在简历上看起来比较厉害,能过HR法眼,还最好能尽可能多的涉及平常面试的考点,在项目中学的知识一般比较好讲,因为自己亲身经历过,所以最好找一些实用的项目。非科班选手真的要多利用网上的资源来学习,不然真的很难有实际经验。还有就是项目最好要把使用的原理写清楚,比如如果项目中用到了缓存,那么最好能写清楚为什么用缓存,用了之后性能有多大提升之类的。

计算机基础

  • 《数据结构与算法》这本书算是数据结构的入门,非科班第一遍看可能有些晦涩难懂,可以先看一遍中国大学慕课网上的课再看书会好很多
  • 《操作系统》除了课本外也推荐看网课,网课讲解的比较清楚
  • 《计算机网络》除了书和网课外可以看看极客时间的《趣谈网络协议》,这个课程把很多基础的网络知识讲解的很形象
  • linux基本的命令可以看《鸟叔的linux私房菜》,还有极客时间的《Linux实战技能100讲》

以上内容虽然是计算机基础,但建议放在学习过程的最后看,因为我觉得非科班在0基础的情况下,一般既没有兴趣,也很难看懂基础知识,而且在学习过程中也不怎么用得上,不如在对编程有所了解,产生兴趣后再来学基础知识。

Java相关书籍

  • 《Java核心技术-卷一》Java入门书籍,刚开始看可能很多概念看不懂,我觉得没必要深究,接着看下去,以后再来查漏补缺最好。
  • 《深入理解Java虚拟机》JVM几乎是必考内容,所以这本书一定要看仔细,尤其是JVM内存结构和垃圾回收的部分,最后还有一部分并发编程的讲解也非常清晰易懂。中间字节码文件结构和参数调优的部分我觉得不用细看,因为没有实际使用经验很难看懂,而且面试过程中也几乎不会被问到。不过常用的参数比如Xms、Xmx这些还是最好有所了解。
  • 《Java并发编程实战》并发编程也是Java常考点,最好能用一本书系统的学习,这本书就把Java并发编程知识讲解的很透彻。不过我建议反着看这本书,比如Java内存模型这种对于volatile关键字以及CAS等为基础的内容居然被这本书放在最后一章,我第一次看书正着看,被前面章节中诸如发布泄露、委托失效等概念搞得头很晕。但第二次反着看这本书就觉得顺序对多了。某课网上也有讲java并发编程的课程,我觉得还是比较有帮助。
  • 《Java EE互联网轻量级框架整合开发》这本书结合了springMVC、MyBatis、Redis的内容,非常适合用于进阶知识的学习,很多框架方面的书通篇贴代码,也没有细致讲解很多原理。这本书算是我看过的框架类书中最好的一本了。不过建议框架类的书也是放在最后再看。
  • 《高性能MySQL》前六章,这本书的前六章基本涵盖了一般面试中会问到的数据库知识,尤其是索引那部分。

常见面试考点

以下是我在面试过程中常被问到的知识点以及部分答案,有错的地方希望各位大佬指正

  • String在new和直接赋值时的区别:new是在堆上新建一个对象,直接赋值时指向堆的字符串常量池中(JDK1.7之前这个常量池在方法区中,1.7后被移到堆里,因为JDK正逐渐减少方法区的内存)
  • hashmap是否线程安全,有什么安全的hashmap?:不安全,因为在多线程同时put时或者在扩容时Put都会有线程安全问题。安全可以使用hashtable、Collections.synchronizedMap、ConcurrentHashMap这三类。但前两类都是直接在方法标签上加了synchronized,所以效率很低。而ConcurrentHashMap效率很好,在1.7中,ConcurrentHashMap是用segment数组为每个格子加锁来保证安全性。在1.8中ConcurrentHashMap和hashmap的结构完全一样,但更改了put方法。在计算了哈希值和索引后,先判断索引位置是否正在扩容,如果正在扩容就调用一个协助扩容的函数,如果没扩容再判断是否为空,为空则用CAS的方式放入,不为空则用synchronized锁住格子,判断为链表还是红黑树,分别调用对应方式放入。最后再判断一次冲突长度,大于8则转化为红黑树。
  • volatile作用:保证可见性和顺序性。Java把处理器的多级缓存抽象为JMM,即线程私有的工作内存和线程公有的主内存,每个线程从主内存拷贝所需数据到自己的工作内存。volatile的作用就是当线程修改被volatile修饰的变量时,要立即写入到主内存,当线程读取被volatile修饰的变量时,要立即到主内存中去读取,保证了可见性。禁止指令重排来保证顺序性。
  • ArrayList和LinkedList的区别:一个是基于动态数组实现的,一个是基于链表实现的。动态数组随机索引的特点,读和改快,增删慢,链表增删快,读慢。
  • 手写单例模式:双重锁写法、静态内部类写法、枚举类写法最好都会,至少要双重锁,最常考。
  • 类加载的过程:加载-验证-准备-解析-初始化,这几个步骤每个都做了什么最好要知道
  • 双亲委派机制:启动类加载器-扩展类加载器-应用类加载器-自定义类加载器的顺序,自己写一个java.lang.String会不会被加载?什么时期报错。
  • 三次握手为什么不是两次?
  • time_wait过多怎么办?
  • 进程通讯的方式
  • IOC和AOP的概念和使用场景
  • synchronize和lock的区别,lock接口比synchronize多的3个特性:公平锁、多条件、限时等待的作用和场合,都是可重入锁,可重入锁的原理,为什么默认是非公平锁。
  • AQS和CAS的原理最好能会
  • 流量控制和拥塞控制的原理和作用
  • 两种垃圾判断方式,引用计数法和可达性分析算法的原理和优缺点
  • 两种垃圾回收算法各自的优缺点和6种垃圾回收器的各自特点,G1的特点
  • 线程池的几个参数作用,3种工作队列各自的特点
  • b+树特点和优点
  • 聚集索引和非聚集索引的区别
  • innodb和myisam的区别
  • mysql的一二级缓存
  • redis5种数据结构各自特点和实现原理、适用场合

面试考点很多,随便举了一些,与其撞知识点,不如系统的看书来增长知识,一劳永逸,不过面试前看相关面经还是挺有用的 。

算法

        我觉得这就是我自学的路上最难的部分了,其他都是记忆性的知识点,算法要求就要高多了,我是通过刷题的方式学习的。力扣300多题,剑指两遍。剑指考的频率很高,建议熟练。力扣我觉得其实大概刷200题然后把刷过的再熟练几遍比一直往前刷要有意义一些。

        其实算法要是已经入门的话只是刷题就能有很大提升,但非科班入门就比较困难,尤其是像我这种经济学专业的,课程中没有数据结构相关的课程,自学算法犹如看天书,但算法很多时候决定了面试成败。某课网上有个bobo老师,他有很多很经典而且简单易懂的算法课程,对我算法入门的提升很大,里面详细讲了常用数据结构与常考算法类型,很适合入门。还是那句话,非科班选手真的要善用网上的资源,不然比起科班而言差距太大了。

面试技巧

整个春招面试了无数次,一开始时的面一个挂一个,到后面面一个过一个。我觉得面试很重要的一环就是心态,一定要自信,如果自己都不相信自己,面试官怎么会信任你呢。而且没有自信很容易把会的没讲清楚,不会的不敢尝试,紧张和拘束都会让自己不能发挥到应有的水平。面试是一个展示自己的时间,有机会就要展示自己,尽可能把面试官往自己熟悉的方向引,比如介绍项目时,有什么自己特别熟悉的原理就可以着重讲一下,面试官要是后来问到就可以侃侃而谈,自我介绍时也可以多讲下自己看过的书,让面试官有问的方向。

碎碎念

        5月中旬了,虽然比不上很多大佬,但一路走来,没想到自己还是拿了几个offer,遗憾的是今年春招有些大厂不招20届了,都怪自己一直没能下定决心,错过了秋招吧 。去年三月,大家都在复习考研,我在自学前端,试图找一份实习,但周围完全没人学计算机,自己一个人像无头苍蝇一样不知所措,错过了很多机会,没能找到实习,最后心灰意冷的在大家都在秋招时复习考研。我现在都还记得第一次面试的经历,面试官问我JS有哪些数据结构,我说我不知道什么是数据结构,就这样面试官还耐心问了我半个小时,最后告诉我最好看下《JS高级程序与设计》,我那时才知道自己差的有多远。也是那时知道的牛客网,开始渐渐接触到了这个行业。接着一个月的疯狂复习后,最后一个面试是腾讯,面试官问了我半个小时JS基础和网络协议,我因为面试次数多,都已经背下来了,接着最后问我了不了解nodejs多线程,我反问面试官一个经典的面试问题:什么是线程,春招就此落幕。

        到了10月份,本身对经济学就没兴趣,混了四年碌碌无为的我,最后还是不想考研,跟我爸说了后,没想到他居然出乎意料的平静,而且告诉我去做我想做的,他可以理解。真的很感谢父母对我的支持,我爸就是国企的HR,他告诉我像我这样错过了秋招,而且还是非科班的人想就业非常困难,至少国企是肯定不会招的,但我既然这么喜欢,又有信心,那还是做自己想做的好,好好准备春招。

        我就此开始了我的春招准备,没有继续学前端,因为想多补下算法,能更贴近科班学生的水平,于是学了一般而言要求更高的后端,java。10月、11月、12月接下来的这三个月对我来说真的是难忘的煎熬。周围人都在专心复习考研,早上早起去图书馆,很晚才回来,而我一个人坐在寝室里,不知道该学什么,也不知道自己到底是个什么水平,同龄的科班生是什么水平,每天学习的东西也没法和周围人分享或者讨论,因为周围人都在本专业考研。我一度很怀疑自己是不是脑瘫,考研第一轮都要复习完了又来准备跨专业就业,秋招那么好的就业机会又在复习考研。但我知道自己已经没退路了,自己放弃考研了,就只剩春招这一个机会了。总归运气还算好,找到了一个实习,虽然很水,招的是java开发,我基本全在写前端,还要自学angular,后台一个返回写10分钟,前端逻辑写半天。不过这个实习给了我很大自信,让我第一次真的参与到了实际开发中来,我也很珍惜机会,领导第一次的任务让我一周写完,我一天就写完了,然后就被领导无情压榨。。。。我第一周后任务量就跟正式员工一样了,而且第二周就让我带一个新来的实习生,我自己也在实习啊。。。这也让我后来学会了划水,毕竟还要准备春招,而且领导给的任务实在是太重了,我写完了都不敢给领导说,不然又是一个新任务,根本停不下来。期间我还在投简历,几次面试经历也让我知道了自己缺什么,然后一边实习划水(没办法,领导真的给的任务太多了,不划水被压榨到死),一边准备春招,当时我一周就要看完一本书,实习的工位上摆满了书。

       后来就是放假回家了,每天在家做项目,刷算法,为春招做准备。到2,3月份,开始大量投简历,一开始面的都是小公司。当时很没有自信,因为是闭门造车,不知道正常应届生应该有什么水平,每次面试都非常紧张,面了一个月,一个都没过。不过每次面试被考到的问题我都会记录下来,然后查清楚,这为后来的面试提供了很大帮助。到了2月底,春招终于全面启动,基本每天都有HR约面试或者收到笔试邮件,一开始的笔试除了华为都没过。。。不过也让我算法提升了不少,知道笔试这么难后,我一个月刷了100多道的力扣还有剑指,后来面试基本上没被算法考到过了。然后腾讯和华为的接连失利让我本来就没有的信心更加崩溃,一度怀疑自己春招是不是找不到工作了。

        但到了3月中旬,可能终于是水到渠成吧,美团三面时突然收到跟谁学的OC,然后下午就收到美团HR面了,紧接着面一个过一个(除了字节,面试真的玄学)。有了自信后,整个人的面试状态就不一样了,没那么紧张和拘束了,会的问题能和面试官讲清楚,不再是磕磕巴巴的了,不会的也能稍微讲下自己会的部分。这也让我意识到了面试时自信的重要性,面试时真的要有自信,不然很有可能会因为紧张或者拘束而把会的没表示清楚,不会的直接放弃,那就真的没机会了。

        说了这么多,回想起自己第一次看到代码的兴奋,第一次读完一本技术方面书的成就感,第一次收到OC的喜悦,再回想起自己在去年一个人踽踽独行时的落寞和孤独,只觉得这半年来如梦如幻,突然一切就结束了,我从一名经济学的本科生,就成为一名程序员了。这是自己喜欢的行业,自己奋斗的结果,祝愿大家能拿到心仪的Offer。


如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!答案获取方式:已赞 已评 已关~

学习更多知识与技巧,关注与私信博主(03)

你可能感兴趣的:(java,后端,面试,java,面试,开发语言,算法,数据结构)