目录
前言
java8
springboot,springboot
idea 和git是必须掌握的
中间件技术
数据库技术
rpc技术
缓存技术
高性能队列
微服务技术
大数据技术
数仓
service mesh技术
分布式事务
机器学习和ai技术
编译器优化
规则引擎
新语言
前端技术
操作系统
了解一下近期的技术
JSP
Struts
Hibernate
Servlet(要精通)
其他
我来说下当前市场实际需要的和即将的主要趋势;基本上都是以业务中台和数据中台逐渐分离为主。你要是大学生刚刚自学的话,建议你可以先阅读一下Java核心知识点笔记,里面有很大一部分的Java基础入门教学,还有一些Java的核心知识点,相信你了解后对入门Java有很大的帮助!
自学Java的过程中,如果想往后端发展,哪些东西是很必要的,哪些是不要花太多精力的,还有就是想了解一下,一个产品的开发流程大体是什么样的。
这也意味着:
1、特别是jdk1.8是现阶段的主流,jdk11没必要学,直接就是jdk14. 这个主要是掌握juc里面的用法特别是如lock,reentrantlock, skiplist, copyonwritearraylist, deque,之类用法;多线程虽然主流使用是以异步为主,但是面试基本上还是以executor的几个线程池为主,看是否了解,因为现在的基本上都是在executor上封装,譬如scala的akka机制。
2、你需要调用run方法了解里面的enviroment,resource,listener是究竟怎么润起来的,spring的bean加载机制搞清楚comman runner和postconstruct就行了。
3、eclipse 过时了,但是mat 还可以用,但是大部分不会问那么仔细,最多jvm问下cms ps等,类加载,双亲委托之类,更复杂可能问下jstat dump怎么看gc日志。
4、redis,kafka,netty,ElasticSearch是必须了解乃至掌握基本api调用,非常重要,基本上这几个里面kafka你需要了解avro序列化或者json序列化,特别是netty基本上websocket也罢,akka也罢,都是需要了解的。一般公司你如果把reidis,redisson分布式锁讲清楚,kafka 0拷贝讲清楚基本上就ok了,rabitmq,rocketmq了解他们场景。
5、分表分库sharding sphere和mycat二选一,当然阿里还有其他新鲜工具,譬如TDDL。
6、目前主流有finagle,dubbo,hsf,thrift**等,但是建议掌握dubbo/dubbox,无它,源代码其实还是有很多可取地方。
7、spring cache+reids缓存就够了,j2cache我看了下,觉得太繁琐了,简单就好。
8、disruptor** 你掌握了就可以出去吹很多水了,秒杀linkedblockqueue,linkedtansferque之类,秒杀git上有很多源码,了解下够了
9、基本上springcloud全家桶就行了,知道在service层配置ribbot,feign就可以了,至于zipkin,cat等其他技术了解下就知道了,http://spring.io多逛逛,有好处的。目前我生产主推的springboot2.2.2版本。
10、 这个其实对三万以下没什么要求,但是解决三万以上焦虑问题的,基本上flink,storm,spark这三个主流引擎都要了解原理,还有hbase,hadoop,至少掌握map reduce思想,当然如果没有map reduce机制,es做索引,mysql分表解决亿级以上数据的读写也要了解,特别是分表导致的分页查询全文搜索,mysql其实也需要了解innodb存储引擎,但是mysql8.0出来了后,分区表的一些查询用法也要掌握,反正主流现在是mysql8.0了。当然厂内的技术还是比较丰富。
11、其实主流都是四层或者三层 元数据层,明细层 集市 报表,阿里的那一套完全就是以后全家都得跟它混了,maxcompute 还是可以学习下、
12、这个是以后主流,现在主要是docker k8s, 三代的技术,我看了下非常有前景也是主要方向,istio可以多了解下,但是阿里我看到他们在搞sofa,git上有几个新项目,可以多提提代码pr,混个脸熟,如果leetcode的动态规划 线段树刷题刷了些后,掌握基本的八大排序算法和红黑树,跳跃表,快排,缺内网推荐非常简单的事情。
13、这个阿里有个fescar,已经升级到seata,可以了解下思想,但是除非电商类,大部分不会怎么问,不过也比较重要就是。
14、这个主流机器学习算法和神经网络,卷积神经网络,蒙特卡洛,遗传算法等都需要了解下算法,这块主要是掉包学习吧,pytorch虽然是主流,tensorflow学习下也没坏处,这个知乎大佬太多,我只是工业界,这辈子是没指望技术有建树的,混混日子罢了。
15、就是王垠大神的领域了,绝对的神域了,我是知道有人在华为ai编译器优化,阿里p9 200万package挖都不去(已经挖去了,在招小弟) ,有空实现下语法分析,掌握编译原理,jvm虚拟机指令。
16、这个主要是风控系统,优惠券设计需要用到,
现在主流的有drools,urule之类,核心是rete算法,这个个人感觉实现都有些繁琐,drools 还是特别占内存,改天我想个办法写个好点的简单点的,把那些决策,规则塞到数据库里面去感觉更合适,虽然还有groovy,scala脚本之类,但是个人还是觉得java大法好,java+数据库够用了
17、Rust,Scala,Haskell
这个是个人比较喜欢的,python 用用就好,玩java 默认都会,scala函数编程还有大数据处理的生产力工具,Rust我看到觉得这就是真正统一所有码农审美和认知的终极工具,实在是优雅的令人赞叹,Haskell主要是掌握思想。一般面试很少会问这些,了解下。
18、目前前后端分离是主流,国内主要是vue vuex,webpack,其他less elementui ,js掌握核心匿名函数,回调地狱,作用域链,对于后端来讲就够用了,反正虽然知乎不少前端大神,但是说句得罪所有前端大佬的话,前端都是玩具。
19、作为工业界,没事多看看linux内核源代码,特别是select epoll机制,这个基本上大厂都会问
当你掌握以上这些后,适量的就可以刷一刷题了,小编这里也总结了不少面试真题!
Java后端真题总结500+附答案整理分享
JSP在实际开发中,主要是作为MVC模型中的V(View)层出现的。当然,View层的渲染技术除了JSP,还有FreeMaker、Velocity等。
JSP作为页面模板,在后端通过MVC框架渲染成HMTL,然后再发送到客户端(例如浏览器)来呈现。这也就是我们常说的“前后端不分离”,“混合式”开发。
而当前,包括我所在的公司,以及大部分互联网公司。要么已经抛弃这种模式,要么正在抛弃的路上,而转向彻底的“前后端分离”。
在“前后端分离”模式下,后端只负责提供服务接口(例如REST),而前端(例如HTML5)通过接口发送/获取,呈现数据(例如JSON格式)。
这样,在后端,原来的MVC框架,某种意义上已经演变为MC框架。因此,与V(View)相关的一切模板技术都失去了学习的必要,其中当然也包括JSP。所以,后来的Java学习者,我的建议是:
“完全可以放弃对JSP的学习。”
在Java后端开发中,MVC模型还是主流。而Struts作为一个MVC框架,单从技术上来说,还是很优秀的。
但是,现在Spring实在是太强势了,越来越成为Java开发中的“一站式”工具包,其中的一个利器就是Spring MVC。
望名知意,Spring MVC也是一个MVC框架。而且因为它是Spring的亲儿子,自然和Spring契合的非常完美。
同时,在设计之初,Spring MVC就参照了其他MVC框架的优缺点(包括Struts),所以用起来非常爽。因此,在MVC框架领域,Spring MVC大有一统天下的趋势。
因此现在,很多公司,老的Struts项目还在维护。但新的项目开发,更多转向了Spring MVC。因此,如果你是Java新手,正在学习中,我的建议是:
“不要再学习Struts了,从Spring MVC开始吧!”
Hibernate作为老牌的OR映射框架,功能非常强大,涵盖面非常广。但这既是它的优点,同时也成为它的“负担”,是开发人员“不能承受之重”。
Hibernate的设计初衷,是为了最大程度的解放程序员,完全隔离数据库,实现彻底的OR映射。程序员甚至可以不写一行SQL语句,单通过配置就能实现对数据库的操作。
当然,为了实现这个目标,Hibernate也设计的非常复杂、非常精巧。就不可避免的带来以下副作用:
前两点不难理解,单说“调优困难”。
因为Hibernate的设计目标是彻底的OR映射,彻底的隔离SQL语句。但必然会带来一定的性能损失。大部分情况下,应用如果对性能不敏感,Hibernate也没问题。但应用一旦对性能敏感,有SQL级别调优的需求,Hibernate的优点反而成为缺点。
虽然Hibernate也支持SQL级别的调优,但因为框架设计的过于复杂和精巧,这就需要开发人员对Hibernate理解的非常透彻,这就带来了更高的学习成本。
而现在最流行的MyBatis,作为一个“混合式”,轻量级OR映射框架,既继承了Hibernate的优点,同时也吸取了他的教训。在支持配置的同时,又能接触SQL,从而带来了更多灵活性(包括调试、优化)。
当前,在实际开发中,Hibernate使用的越来越少了。大家更偏爱MyBatis这种轻量级框架。所以,对后来学习者,我的建议是:
“不需要再学习Hibernate了,学MyBatis就够了。”
当然,现在不会有任何公司,再用纯粹的Servlet来时实现整个Web应用,而是转向一些更高级的技术(例如各种MVC框架)。因此,会给人一种错觉:Servlet已经过时,后来者就不需要再学习了。
在这里,我可以非常负责任的说:这种观点是极端错误,极端不负责任的。
Servlet不仅要学,而且要学深,学透。
当前,Servlet虽然不再是一个主流web开发技术,但依然是Java Web开发技术的基础,是Java Web容器的基石,是行业标准。而现在流行的各种MVC框架(包括SpringMVC),在最底层,还是以 Servlet为基础的。
为此,我画了一个简单的图(不准确,会意即可):
所以,如果你想要彻底掌握某个MVC框架,则必须彻底理解Servlet。
而且,Servlet作为一个基础设施。精通它,不仅有助于理解各种MVC框架。即使Servlet本身,也有很多实用价值。
如果你深刻理解了Servlet的生命周期,就可以在底层做很多事情。譬如在Request进来的时候,进行拦截,进行权限的判定。也可以在Response发出的时候,进行拦截,统一检查、统一附加。
所以,如果你正在学习Java,对Servlet,我的建议是:
“Servlet不仅要学,而且要学深,学透。”
目前在国内,Java更多是作为web后端技术出现的。因此在实际学习中,很多技术就不符合“国情”,学习的现实意义不大。下面我就简单列举下。
1.Applet
作为页面插件技术,不用多说,连flash都快被淘汰了,更无论从未流行的applet。
2.Swing
作为桌面UI框架。且不说本身设计的咋样。现实开发中,我接触的桌面应用,要么用C++(例如MFC),要么用C#(Winform、WPF)。所以,Swing就没有学习的必要了。
3.JDBC
作为较低层的数据库基础设施,JDBC被很多框架(例如MyBatis)支持。但在实际开发中,程序员即使不了解也无大碍。因此,虽然我不能建议你放弃JDBC学习,但如果你时间有限,完全可以把它的优先级排低一点。
4.XML
XML现在还在广泛应用。但作为一个web数据传输格式,正在逐渐被JSON替代。所以,对Java后端学习来说,XML简单了解即可。至于庞杂的XML操作API(例如XPath),完全不必学习。将来真要用到,再查也不迟。