震惊!2022 年秋招 Java 后端开发岗竟然一片红海!算法岗都不香了吗?
操作系统、计算机网络、数据结构与算法,这些肯定是要学的,还有 Java 的核心知识点,以及一些框架原理,否则根本就进不了大厂。
重申一下我学习计算机的观点,我想这会对你快速建立起自己的知识体系很有帮助!并且,你应该按照我这个观点从大一就开始实践起来!
如果你要学习物理,我推荐你顺着物理的发展史学习,先学习牛顿的经典物理,再学习热力学、电磁学,然后学习相对论、量子力学这些彻底推翻经典物理的,最后学习电动力学这种硬核的。
整个学习过程,是自底向上的。但是学计算机,这样行不通。
先学习电路,然后学习冯诺依曼结构,造一台计算机?接着再学习如何用汇编写个 mini os?接着学习如何写一个简易版的编译器?最后再学习高级编程语言,比如说 Java、Python?
显然这样是行不通的!计算机的学习最好是自顶向下。
什么是顶?我想一门高级的编程语言就是,比如说 Java!
当你学习到 Java 并发编程中的“原子性”、“同步”、“异步”、“进程”、“内存分配”这些概念的时候,你自然而然会产生很多疑问,然后就会去学习计算机组成原理、操作系统,然后你的一系列问题就会逐渐被解决。
当你发现,用 Java 实现某个业务需求时,人家的算法实现比你快得多,你自然会好奇,为什么会这样?然后你发现人家用的数据结构和你的不同,然后你就会去学习数据结构,接着了解一些高效的算法,比如动态规划等。
可以先看看我整理的这份 GitHub 上星标 115k+ 的 Java 教程,里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点。
然后到 B 站上看看尚硅谷或者动力节点的视频课。
动力节点:https://www.bilibili.com/video/BV1Rx411876f
尚硅谷:https://www.bilibili.com/video/BV1Kb411W75N
操作系统是计算机系统中负责管理各种软硬件资源的核心系统软件,为应用软件运行提供良好的环境。清华大学操作系统课-学堂在线这门课程以主流操作系统为实例,以教学操作系统 ucore 为实验环境,讲授操作系统的概念、基本原理和实现技术,是一门非常值得推荐的视频课。
书籍的话,推荐《操作系统概念》 (“龙书”)和 《现代操作系统》 ,是操作系统领域的经典书籍。学完操作系统,你要能回答这些问题:
进程与线程简单介绍,区别,以及进程间通信方式,线程同步方式
用户态和内核态
内存管理:分页分段,虚拟内存,空闲地址管理方法
死锁:死锁的必要条件,死锁的检测与恢复,死锁的预防,死锁的避免
B 站上的这个计算机网络微课堂视频课非常不错,强烈推荐。
学完计算机网络,你要能回答以下这些问题:
七层结构,简单介绍一下每一层。
输入 URL 后,将发生什么?这个问题会涉及到很大一部分的计算机网络基础。
HTTP 和 HTTPS,DNS 解析
TCP、UDP、拥塞控制、三次握手、四次挥手、滑动窗口
IP 和 ARP 协议
有算法基础的同学,这部分是最不怕的。国内最看重算法题的公司当属字节了,想去字节的同学一定要记得刷算法题。
我这里有一份美团大佬的 LeetCode 刷题笔记,纯 Java 版的,给你瞧一下内容。
我花了不少时间整理成 PDF 了,对算法薄弱和需要提高算法的同学很有帮助:刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版
再说一下我的刷题心得:从易到难,一遍一遍地刷,尽量使用自己熟悉的编程语言,比如说 Java 程序员尽量用 Java 来解题,这样刷题的幸福感也会提升很大一截。
如果不是天赋异禀,不要怕,一开始就是抄题,先把别人的解题思路照着敲出来。刷的题多了,尽量控制一下刷题的时间,掐个点,不能让自己一直想、一直写下去,如果半个小时没有解出来,就果断放弃,去背别人的答案,不要觉得不好意思,等到真的熟了,再去想自己的解题思路。
可以按照下面这个类型来刷就可以了。
数组-> 链表-> 哈希表->字符串->栈->队列->树->回溯->贪心->动态规划->图
五、补充部分
瞧瞧我读过的这些书吧!
Java 后端开发需要掌握的知识并不算多,除了 Java 核心语法、Java 并发编程、Java 虚拟机,还有就是 Spring 系列框架,以及一些数据库知识,计算机必读经典书单(偏 Java 后端方向)
Java 并发编程和 Java 虚拟机是面试中的核心,我把一些题目列出来,你可以拿来自测。
并行和并发有什么区别?
线程和进程的区别?
守护线程是什么?
创建线程有哪几种方式?
说一下 runnable 和 callable 有什么区别?
线程有哪些状态?
sleep() 和 wait() 有什么区别?
notify()和 notifyAll()有什么区别?
线程的 run()和 start()有什么区别?
创建线程池有哪几种方式?
线程池都有哪些状态?
线程池中 submit()和 execute()方法有什么区别?
在 java 程序中怎么保证多线程的运行安全?
多线程中 synchronized 锁升级的原理是什么?
什么是死锁?
怎么防止死锁?
ThreadLocal 是什么?有哪些使用场景?
说一下 synchronized 底层实现原理?
synchronized 和 volatile 的区别是什么?
synchronized 和 Lock 有什么区别?
synchronized 和 ReentrantLock 区别是什么?
说一下 atomic 的原理?
Java 内存模型(JMM)、重排序与 happens-before 原则了解吗?
AQS 了解么?原理?AQS 常用组件:Semaphore (信号量)、CountDownLatch (倒计时器) CyclicBarrier(循环栅栏)
R
eentrantLock 、 ReentrantReadWriteLock
CAS 了解么?原理?
说一下 JVM 的主要组成部分?及其作用?
说一下 JVM 运行时数据区?
什么是双亲委派模型?
说一下类装载的执行过程?
怎么判断对象是否可以被回收?
说一下 JVM 有哪些垃圾回收算法?
说一下 JVM 有哪些垃圾回收器?
详细介绍一下 CMS 垃圾回收器?
新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
简述分代垃圾回收器是怎么工作的?
说一下 JVM 调优的工具?
常用的 JVM 调优的参数都有哪些?
Java 之所以流行,很重要的一部分原因就是拥有 Spring(春天)系列框架这个大杀器,包括 SSM(Spring+SpringMVC+MyBatis)、Spring Boot、Spring Cloud。
不过,说一千道一万,Spring 的核心就两个概念:AOP、IoC。
AOP(Aspect-Oriented Programming),也就是面向切面编程,能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
IoC(Inverse of Control),也就是控制反转,是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。DI(Dependency Injection),也就是依赖注入,原来叫 IoC,能让人更加直观和清晰地理解其背后所代表的含义。
Spring 怎么学?可以到 B 站上看一下江南一点雨的视频教程。
先学习 SSM,再学习 Spring Boot。Spring Boot 的出现,并不意味着 Spring 和 SpringMVC 已经过时了,从设计目的上来说,Spring Boot 只是实现了 Spring 的自动装配,降低了项目搭建的难度。
从技术角度来说,Spring Boot 的底层依然是 Spring 的核心机制,也就是 AOP 和 IoC,Spring Boot 只是一个承载者。在我看来,学习 Spring 的正确路径应该是 Spring -> Servlet -> Spring MVC -> Spring Boot。
会了 Spring,基本上就具备一个 CRUD 的基本素质了。剩下的,就是通过计算机基础知识来提升自己在工作中的不可替代性,很多时候,性能的提升,要求的就是你在计算机组成原理、操作系统、计算机网络、数据结构与算法方面的功底了!
关于数据库这块。SQL 语法需要准备一下,有的面试会让你根据场景写出 SQL。MySQL 和 Redis 是面试中常问的两个数据库,这里推荐看《MySQL 技术内幕 innodb 存储引擎》和 《Redis 设计与实现》。
索引:B+ tree 索引、哈希索引、全文索引、覆盖索引等
存储引擎简单介绍,如 InnoDB, MyISAM
主从复制
事务特性简单介绍
常用的几种设计模式必须得清楚,比如:
我认为设计模式是初中级程序员迈向高级程序员的必经之路。有不少程序员,前期冲劲十足,但后继乏力,都是吃了设计模式的亏。在工作的前几年,大部分程序员都处于熟悉编程语言的阶段,也就是处于“技”的阶段,随后就要进入“术”的阶段了。在编程领域,“术”的典型代表就是“设计模式”。
你可能听说过,学习设计模式非常的重要,那么为什么这么重要呢,设计模式到底是什么?打个比喻学编程就像学武功一样。武功要练得很牛逼,有两样东西不能丢。第一,是内功;第二,是武功秘籍。内功对应到编程就是我们编程基础能力,那编程的设计模式就可以想象成武术中的武功秘籍。
推荐小傅哥的重学 Java 设计模式,持续霸榜 GitHubTrending。
不得不说,算法岗确实卷,没有研究生以上的学历,很难入算法岗的门槛,Java 后端开发岗就不同了,不管你是不是 985、211 毕业的,只要你能具备基本的素质,就能胜任对应的工作。当然了,Java 现在也是非常卷了。好的一点是,Java 的岗位多,需求量大!
这个世界上只有两种语言,一种是经常被骂的,一种是从来没有人用的——来自 C++ 之父。
而 Java,显然是经常被骂的那一种。这里骂显然不是一个贬义词,而是一个褒义词。
根据 JetBrains 2020 年给出的数据分析显示, 全世界大约有 520 万名专业开发者使用 Java 作为主要语言。详情参照:JetBrains 2020 Java 调查报告
其中,中国和韩国使用 Java 的比例最高,分别为 51% 和 50%。
评论