跨专业转CS拿下百度java后台开发的干货分享

2018-12-04  本文已影响177人  6b440373157d

人们总以为时间是一个小偷,偷走了我们所爱的一切。但,时间是先给予再拿走,每天都是一份礼物,每小时,每一分,每一秒。——《爱丽丝梦游仙境2》

自我介绍

本人是某985硕士,专业是控制理论与控制工程,有幸拿到了百度的offer,以后也打算入职狼厂了,岗位是JAVA开发。从7月底一直到9月底一直忙的不可开交,也拿到了一些offer,7月底到8月底基本上是提前批面试,冷不丁就从某地的一个面试电话就来了,怪吓人的。9月一整个月基本上就是秋招,笔试面试不断。拿到了一些offer吧,下面就和大家分享一下我的一些算的上经验的东西吧。

一.基础知识学习心得

1.1 java基础

对于java基础来说,说先要选对教材吧,首先是java基础,我看的是《JAVA从入门到精通》,这本书基本上涵盖了java的所有基础知识点,从基本面向对象的概念,到java的语法和一些小的练习,再到java的核心技术,接口、抽象类、多线程、反射、异常处理、IO编程和一些窗体应用程序的开发等,最后是一些高级应用,包括数据库的应用等。这些都是JAVA的基础。

谈到JAVA,每本书都会写到它是平台移植性,为什么呢?就是存在JVM这么一个神奇的东西,关于JVM,书籍我看了两本,一本叫做《深入理解JAVA虚拟机》和《深入理解JVM&G1 GC》。前一本比较基础,关键是要了解JVM的内存模型,一些关键的名词和加载机制要理解,比如什么是双亲委派模型,类加载的流程是什么样的等等;另外一个就是JAVA的内存回收机制,一些常用的回收算法要熟悉,还有包括GC的种类。那么第二本书就是讲到了G1这个回收器,这也是经常会问到东西。不过JAVA 11之后出来了一个ZGC最好也了解一下,网上有很多软文的,这是我面试知乎的时候面试官提到的,也是去了解了一下。

在大多数的应用软件中,其实我们更多的还是会关心程序运行的效率问题,那就不得不说一说并发编程,这也是面试经常问道的。我推荐的两本书就是《JAVA并发编程的艺术》和《JAVA并发编程实践》,里面介绍的很全面,从线程、线程池、线程安全,相关java线程安全集合类和一些并发应用开发的技巧。其中诸如比较常见锁、死锁问题还有JAVA相关的关键字的描述都很清晰,也是作为JAVA开发人员的基础知识。

因为JAVA是纯面向对象的语言,很多时候我们在去面试的时候,我们通常会去面试一种叫做后端开发工程师或者是服务器端工程师,如果你是JAVA方向,那么J2EE这方面的就一定要了解。我看的有两本书,一本叫做《Spring3.X 企业级实践》和《聊聊架构》两本书,前一本主要讲述了框架的一些东西,那么里面有一些名词必须要明白,尤其是什么是IOC和DI,什么是AOP,什么是SSH,什么是SSM,什么是MVC模式,什么是ORM等等,这些都是大方向的问题,里面还会牵扯到很多技术问题,这就需要平时的读书和积累了,比如拦截器和过滤器是什么之类的问题。另外一本书,就是架构,里面主要是一些微服务架构之类的,微服务这个东西虽然比较火,但是面试的时候谨慎,容易把自己拉进坑里,千万别再面试官面前秀操作,到时候反而会打乱自己的节奏。除非是真的亲自做过项目,否则只需知道一些名词就好,例如Spring Cloud,Spring Boot之类的了解即可。

那么说到了架构开发和软件开发,那么基本的软件开发的知识要知道,首先是数据库及其DBMS的使用。我主要看三本书,分别是《数据库原理》,《必知必会MySQL》和《MySQL技术内幕》。数据库理论的话,包括了常用的关系型运算,数据库的设计范式,基本SQL语句,数据库的表,视图,事务,索引,触发器和存储过程,索引和事务着重看。关于MySQL,其实最主要的无非三个,第一数据引擎,MyiSAM和InnoDB经常被问到,第二MySQL中索引的使用,除了常见的聚簇索引、联合索引,还要知道什么时候倒排索引之类的比较冷门的第三就是MySQL事务的一些操作,锁机制等等。

1.2 软件工程及其相关的知识

第二是软件工程及其相关的知识,尤其是BAT大厂很多时候也会问到其中的一些问题。这里推荐系统的看《软件工程——实践者的研究方法》和《UML面向对象建模与设计》这两本书,前者主要讲述了软件工程的系统知识,诸如软件工程的基本概念,软件开发方法,软件开发原则,质量管理,软件测试方法,文档的撰写,这其实也是我们开发人员的基本功吧。第二本书主要是在进行软件设计,尤其是在设计数据库之前,需要进行建模分析,UML是经常用到的方法,其中UML中的基本符号,还有用例图、序列图、通信图、类图等,因为UML在设计模式的一些教材中也会用到,所以了解一下是很有必要的。

1.3 设计模式

说到设计模式,这也是基本功,其中最常用的教材就是《Head First》了吧,23种设计模式,分为三大类,7大软件设计原则,这些都是必须要了解的。其中,单例模式、工厂模式、装饰模式、享元模式、建造者模式、适配器模式、代理模式、模板方法模式要重点掌握,因为这几个在J2EE和基本的JAVA开发中经常用到。

1.4 数据结构与算法

第三就是数据结构与算法,作为笔试和面试的重头戏之一吧,那么基础就是最好结合视频看看,单纯看书有点枯燥,视频和书籍的话就比较多了,这个仁者见仁的,所以大家只要认真学习,肯定会有效果的。这里链表、栈、队列、树这几种数据结构要熟练掌握,图了解一下,但是关于图引出的BFS、DFS这两种策略要会,因为回溯法和分支界定法会用到,另外排序算法要了解,几种常见的排序算法及其变种一定要熟练。

1.5 计算机网络和操作系统

第四就是计算机网络和操作系统相关的知识点,这也是我们会忽略的一部分,尤其是基础,因为互联网公司这些东西必须要知道啊,碰到最多的就是TCP、UDP、http、https之类的关键词了吧,至于这几个之间的区别要是说不上来就真的说不过去啦。至于操作系统,通常会结合主流的操作系统比如Linux或者windows系统来学习,我记着有面试官问我Ubuntu系统开机都做了些什么操作,所以除了LINUX系统命令之外,关于整个操作系统的进程、文件、设备管理之类的也要了解。

1.6 大数据

最后就是一些大数据方面的知识,从数据分析平台和服务来说,Hadoop,Spark,Kafka,Hive,Hbase等可以做适当了解;数据存储来说,除了RDBS之外,Nosql也要知道,比如Redis,MonoDB等;数据分析和挖掘算法来说,我们虽然不是算法开发,但是这一部分我把它就做课外知识,但是也是要有所了解,要不然以后和技术大牛聊天儿也比较尴尬。这里面就牵扯到机器学习的分类、聚类、降维和回归四个方面,从此衍生的诸如深度学习、自然语言处理之类的算法,有些名词咱们至少要听说过嘛。

以上就是我学习的一个大概的知识体系,总之语言其实的是次要,开发的框架和思路才是最重要的,还有就是编码能力!

二. 面试常见问题

我在这里总结一些面试经常会问到的问题,其中分为四大类,第一类是JAVA基础相关,第二类是计算机知识类,第三类是场景题,第四类就是智力题。总结的肯定不全面,而且是我经常会被问道的问题,拿出来供大家分享。(详细的一些问题可以看我牛客的帖子,https://www.nowcoder.com/discuss/123094)

2.1 JAVA基础类

JVM的内存模型,什么时候双亲委派模型?

JAVA的垃圾回收,标记算法和复制算法的区别,用在什么场合?

GC、G1和ZGC的区别

为什么老年代堆不想年轻代一样分成两个区?

JAVA多线程实现机制有哪些?

JAVA中的锁

设计模式相关问题

JAVA线程池有哪些参数,如果自己设计一个线程池要考虑哪些问题?

常见集合类的区别与联系

Spring框架的实现用到了哪些关键技术

SSH中每个职能部件都是什么,实现什么功能?

JAVA API中线程安全的类有哪些?

JAVA网络编程中,BIO、NIO、AIO的区别和联系

重载、重写和重构分别是什么含义?

jsp的内置对象有哪些,servlet的工作流程。

2.2 计算机基础类

TCP和UDP的区别,TCP三次握手和四次挥手,为什么要这样?

http和https的区别,http1.x和http2.0的区别,SSL和TSL之间的区别

数据库中索引的数据结构

B+树和B树的区别,和红黑树的区别。

联合索引的特点,倒排索引的特点

简述1NF到BCNF

数据库的无限极分类问题

redis的缓存处理算法

redis集群相关

mysql数据引擎相关

这里还有很多,以上应该是在面试中出现频率很高的了。

2.3 场景设计题

用10亿个URL,如何找出我们所希望得到的100个URL

新浪微博好友关注的后台表的设计

设计一个抽奖系统

。。。

这里其实考察的就是知识使用的灵活性,遇到的时候冷静分析,注重积累,一般面试官也不会为难的。

智力题其实智力题也是面试的一些重头戏,通常会考察咱们分析问题能力,一般题。

其实智力题也是面试的一些重头戏,通常会考察咱们分析问题的能力,一般仔细分析分析也应该没什么问题。

三. 手写代码问题

手写代码是面试的时候95%会出现的状况,其实主要还是平时的积累,多刷题,没有别的方法,常用的书就是《剑指offer》了吧,我是把剑指offer刷了1遍,leetcode的题目做了100多道,重点关注leetcode的中等题,如果一个题目你能在10分钟就能有完整思路,30分钟内能够AC,那考到的概率一般不大(除了ACM大神,哈哈!),当然如果一个题目思考了1天,看了解答也是毫无头绪,那就放弃吧,因为秋招时间紧,而且很容易出现厌学情绪。在手写代码方面呢,链表数组类问题属于简单难度的,二叉树和树相关的问题属于中等问题,动态规划类问题一定注意状态方程执行条件,回溯一定注意递归停止的条件要完整。下面列咱们必须要烂熟于心的一些手写代码的题目

归并排序、快速排序、堆排序,有的时候会考到多路归并和鸡尾酒排序。

链表翻转,判断链表是否有环并找到环的入口,单链表的第一个公共节点,链表的部分翻转

二叉树的前序遍历、中序遍历和后序遍历递归版本,前序和中序遍历的迭代版本,二叉树的层序遍历,二叉树的深度、高度、叶子节点的个数,很多二叉树的问题都可以用递归的方式求解。

最大子数组的和,最大子数组的乘积,字符串的公共前缀,上升子序列之类的动规的基本问题,还有约瑟夫环、荷兰旗等等这些基础的实际问题也要多用手写一写。

记住一点,用IDE调试和实际用手写真的有区别,所以常规的题目还是用手写一写。

四. 面试技巧

关于面试的一些经验技巧,我想谈谈自己的心得。我在秋招季参加了20多加公司的面试,有一天参加了5个公司的面试,那天差点没晕过去。一共收到了10个公司的offer,3个sp,相信很多大神和大佬也收到了很多offer,下面就来讲讲。

着装。咱们虽然不像产品、运营那些岗位会注重外形,但是穿着整洁大方是很有必要的,我之前又看到过穿拖鞋和短裤去面试的,面试官确实没什么好印象,我面试不管公司有没有名气,规模大小,都穿正装,这样自己也会有自信,也是对对方的尊重。

面试的时候心态很重要,不要被任何因素影响。不要因为自己的老铁或者闺蜜面试失败就产生畏缩心心理,也不要因为没通过某个大厂的面试就心灰意冷,面试没通过不是你不优秀,这是你不适合这个公司的这个岗位,而且,失败是成功的母亲,面试中不会的问题在网上及时看看帖子或者软文之类的,及时弥补,会对自己有很大帮助。你会发现面试时候能学到只是不必自己平时学到的少。

面试的时候在手写代码时候,尤其是DP问题,很多时候转换方程不会写,那么我们就先写一种方案,因为通常面试官没说让你写最优代码,那么你写出来一种,也是一种解答。通常面试官会慢慢引导你写出最优代码,不要慌张。当然了如果基础代码没写出来,那是会有点问题的。

关于项目。其实项目是好处也是坑,如果项目聊得不好的话,哪怕是自己做的,面试官有可能也会怀疑这个项目的真实性。另外,其实咱们干开发也应该有一些机器学习和算法的知识储备,如果项目中有的话。我不止一次的遇到了让手推算法公式的面试官了,哈哈。

如果你挺到了hr面,那么一定要真诚并且谦虚的介绍自己,如果问道现在手头上拿到了几个offer,那么我通常是肯定回答(如果有的话),并且把现目前手上拿到的最好的说,因为这样显示出你很优秀,如果对方真的很想要你,那么肯定会在薪水和待遇方面和现目前这个offer持平或者给你个sp之类的。毕竟hr小姐姐小哥哥还是很温柔的一般情况。

关于提前批,我有血的教训,一定要慎重,不要着急赶着提前批,我阿里提前批四面挂了之后,再没机会了就。所以要结合实际,当然提前批确实可以积累很多经验,但是提前加入面试的压力中,战线拉长,那么很容易崩掉的,所以一定要找到一个很好的解压方式。像我压力大了就去跑个10km,哈哈。

五.结束语

以上就是我的一些面试心得,希望能给正在准备明年春招和秋招的你们一点点帮助,以上都是我的个人观点,如果有错误的地方,及时批评指正。当然有喜欢跑步或者跳舞的朋友,也可以一起交流交流,哈哈。给大家分享一下我的座右铭:一切都会有的,一切都是时间问题。

祝各位好运,加油!

END

结束语

码字不易,这个打个小广告~感谢牛客的平台~会继续分享经验

作者乔戈里亲历2019秋招,哈工大计算机本硕,百度准入职java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(准入职百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。

点击作者姓名与作者大佬交流~

作者:程序员乔戈里

来源:牛客网(www.nowcoder.com)

- 互联网名企笔试真题

- 校招求职笔经&面经

- 程序员/产品/运营求职实习信息

- 程序员/产品/运营学习交流社区

上一篇 下一篇

猜你喜欢

热点阅读