知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技

Java程序员,最常用的20%技术有哪些?

发表时间:2022-03-25来源:网络

学Java,为了找到工作,我们看一个公式:

找到工作 = 工作需要的技术栈 + 计算机基础知识 + 项目经验 + 加分项

让我们分别看看公式右边的这些方面具体是什么。

1. 工作需要的技术栈

工作需要的技术栈往往和特定语言以及配套的周边工具相关。

对 Java 技术栈来说,又可以分为以下几个方面:

1.1 基本语法

基本语法在面试里不是说会用 for 循环、if else 语句之类去写代码就行,而是利用基本语法去编写更合理、更规范、更可读的代码。

比如,是不是能让变量处于很合适的作用域?String、StringBuffer、StringBuilder 适合的应用场景是不是非常熟悉了?

如果对于 Java 的基础还很薄弱,推荐去看《Effective Java》,以便真的能够写出来好代码。

另外,为了能更加规范的写出高质量工程代码,推荐研究下阿里的《Java开发手册》。

1.2 常用数据结构

如果要想通过面试找到工作,Java 中一些常用数据结构一定要好好掌握。最常用的就是以下几种:

LinkedListArrayListStackArrayBlockingeueHashMapLinkedHashMapTreeMapConcurrentHashMapHashSetTreeSet

以上列举出来的这些数据结构,不仅要熟练使用它们,更需要理解它们的原理。

知道了原理,才能证明你能灵活且正确的使用这些数据结构。所以,面试中经常会问这些数据结构的原理。

如果对这些结构的原理还不熟悉,这里推荐一本很老但是依然很有用的书《Java Generics and Collections》,它详细介绍了 Java 中各个集合的实现。

但是这本书没有中文版,如果英文书读的很痛苦,大家可以去网上搜索一些好的文章,也能达到相同的效果。

1.3 异步与多线程

现在只要编写高性能的代码,就离不开异步;只要在多核 CPU 下工作,就离不开多线程去平行执行任务。所以,异步和多线程是一位后端工程师必须掌握的核心技能。

而要达到找工作的水平,我认为至少满足如下几个条件:

能准确的理解进程和线程的概念至少弄懂什么叫 race condition 和死锁之类的概念需要理解 JVM 的内存模型了解常见的多线程编程模式

对于异步和多线程,我也不用多说了,肯定是首先推荐去读懂《Java并发编程实战》,然后还有一本《图解Java多线程设计模式》。这两本书读透了,面试异步和多线程,基本你也没什么问题了。

1.4 IO 操作

这里说的 IO 操作,主要是利用 Java 去读写文件。

Java 的 IO 都在 http://java.io 包中,大概有 40 个流类。其实不用每一个都掌握,最基本的要求就是:

理解 IO 流的概念O 里哪些是字节流哪些是字符流IO 里哪些是节点流,哪些是处理流哪些 IO 流带缓冲可以提高性能的

了解了这些东西,才能在实际开发中做到有的放矢,从而把 IO 用对用好。

推荐看下 《Java IO》和《Java NIO》这两本书。其中《Java NIO》有中文版,《Java IO》没有,如果英文不好的同学,可以看个千锋教育的视频:

Java入门基础教程视频—(IO框架)

1.5 常用框架

除了 Java 语言本身的语法和库啊什么的,要找到工作还请务必熟悉至少一套开发框架。

Java 最常用的框架就是:

SpringSpring MVCSpring BootMybatisNetty

其实,Spring、Spring MVC、Spring Boot 都是 Spring 体系的。所以,要找后端工作,Spring 是必须要掌握的。有了 Spring 的基础,别的 Spring 体系可以即插即用的。

SSM 中的的 M——Mybatis 也最好掌握了,有数据库基础的话,Mybatis 学起来也不算难。

Netty 是一套网络框架,我估计初期用到的机会不多,但奈何有些面试官会问、会考,所以,若有闲暇功夫,推荐对它看个大概。

相关推荐的书有《Spring 5 开发大全》、《MyBatis技术内幕》、《Netty进阶之路:跟着案例学Netty》。

1.6 常用数据库

一般来说,找工作,熟悉一个数据库就好。推荐 MySQL,这是最常见的数据库(其次是 Oracle)。

要熟悉到什么程度呢?我认为最低水平要知道怎么用 MySQL 执行 CRUD 操作。但是这还不够保险,因为很多面试官为了防止新人删库跑路,会对面试者要求更高。

像在 CRUD 里,R 代表查询,是后端工程师最常打交道的操作。而查询用的又对又好是对工程师使用 MySQL 水平的重要标准。所以,面试官就希望面试者能对 MySQL 的索引原理有一定的了解,面试的时候也会经常问这类问题。

同样的道理,除了查询以外,CUD 即增、改、删是非常危险的,既可能影响性能,还可能出现各种误操作。所以,为了保证把人招进来,不会对数据库乱操作,面试的时候大概率会考察程序员对 MySQL 中的锁和 MVCC 的理解情况,明白怎么用才安全可靠。

如果对这些都不太熟悉,推荐看下《MySQL是怎样运行的》,对 MySQL 讲的非常透彻。

1.7 Linux 基本操作

现在只要想做后端工程师,就肯定避不开和 Linux 系统打交道。

基本的命令操作是肯定要熟悉的,比如:目录切换、设置环境变量、文件的增删查改等等。

除了这些基本命令,还要理解 Linux 中一切皆文件的概念。并且对于一些重要概念,比如:管道、重定向、标准输入输出、标准错误输出等,也要明白他们是什么东西。

有时候,还需要开发人员直接在线上机器去编辑文件,所以还要会用 Vi/Vim 去在线编辑一些文件。

另外,如果服务器有了问题,起码基本的查询性能的命令,也要会用。比如用 netstat、vmstat 等命令去查看下机器状态。

这些知识可以看下《鸟哥的Linux私房菜 基础学习篇 第四版》。

2. 计算机基础知识

除了技术栈以外,还需要面试者有扎实的计算机基础。这个计算机基础是考察面试者在学校的学习状况的,如果你计算机基础不好,那大概率说明你本身学习态度、学习能力至少有一项不太合格。

对 Java 后端工程师,咱们挑几个很重要的基础知识说说:

2.1 算法

现在面试尤其是大厂,必考算法,想知道大厂怎么面试算法以及答案的,一定要看看这几份刷题笔记,答案都是大厂大佬写的,质量很高,学好之后应付面试基本没啥问题了。

2.2 计算机网络

后端大部分的时候就是各种接口和协议,数据传来传去,总是需要关注到网络问题的。如果一个后端工程师,对 TCP 不熟悉,对 Http 一问三不知,那么谁能相信你是一个合格的后端工程师了呢?

对于计算机网络,我推荐好好看看《计算机网络(原书第7版)》这本书,在自己的头脑中,构建出一套完整的网络体系来。

2.3 操作系统

学完了计算机网络,接下来就是去好好学习下操作系统。学习操作系统就是去学习如何在复杂的情况下,去协调分配各种像 CPU、内存、IO 等这些竞争性使用的计算机资源。

学懂了操作系统,你心里就有了一套在复杂情况下,去管理协调资源的成熟套路和方法论。

而这些成熟的套路和方法论,最终都是你后面能成长为优秀的工程师,以及能应对各种复杂业务需求的核心竞争力。所以,操作系统学懂是很重要的。

如果对操作系统不熟悉,我推荐看下《操作系统导论》这本书,人民邮电出版社出版,王海鹏翻译的。

3. 做过的项目

面试官是如何在面试中考察你是否真的做过项目呢?

其实挺简单的,只需要问一下你做的项目中核心模块的业务流程,然后挑出这个业务流程中的一些技术难点或者技术特点,重点问你是怎么实现的,就能大概判断出你是否真的做过项目了。

至于项目,主流的项目有这么几类:

电商社交垂直领域平台音视频平台出行门户

在面试前,最好去专门熟悉下不同类项目的核心流程都有哪些。比如,电商的核心流程就有购物流程,社交的核心流程就有私聊、群发消息,出行平台则是人们叫车的这个过程。

而在这些核心业务流程里,一定有技术难点需要克服,比如:

购物车到底放在客户端还是服务器端?放客户端,排序规则,缓存的更新策略你是怎么解决的?而放在服务器端呢,你和客户端之间通信频率啊,客户商品的实时更新啊,又是怎么考量的?

这些没有经过实战,很难给面试官讲清楚。

所以,在应聘工作前,最好就是自己能去参与个项目,多学多问,多考虑为什么项目中需要这样做的道理。

如果真的参与不了,我推荐去 github 下载个开源的项目,然后弄清楚架构和业务流程,对于一些不懂得,可以问下开源的作者,或者去问下已经工作的前辈,又或者去专业的论坛问。

github 的开源项目可以参考我之前写的这个高赞回答

总之,一定要从我给的分类项目中找一个项目,去深入了解业务流程和对应的技术实现,以及实现背后的动机,只有这样,面试官才会真的认为你有了实战经验。

4. 加分项

说完了项目经验,我再说说加分项(技术博客、开源项目、竞赛奖项等),加分项在去大厂应聘的时候尤其有用。

无论你是有开源项目还是有博客文章,都说明了一件事——你是一个爱学习、乐于分享的人。

大厂里,很重视的一件事就是分享。分享经验、分享技术、分享心得,这些都是大厂非常提倡的事情,如果在一群候选人里,你有加分项,别人没有,面试官会选谁不言而喻了吧。

所以,一定要经常性的对公众输出一些东西,文章啊、开源项目啊、竞赛分享啊,能输出什么输出什么。这样才能让面试官看到你有实力的证据以及你 open 的态度,从而在面试中占有更多的优势。

再说说学习方法。

对新人来说,可以通过看视频来进行学习,视频的话,可以在B站看视频,学习路线和视频可以我之前的这个近600赞的回答。

如果你喜欢看书,我推荐一些我认为的比较经典的书籍(包括了一部分上面回答提到的书)。


书名后面的数字,是豆瓣评分。评分几乎都在8分以上,都是经典好书!

已经打好包了,免费下载方式如下

总之,就是知识储备一定要足。要说达到什么水平就一定能找到工作,这完全是根据你应聘的公司,应聘的岗位以及你的竞争对手的优秀程度去动态变化的。

最后,推荐一波Java程序员最常用的工具和框架,新人们可以直接照搬,有些暂时不明白的,没关系,可以先收藏后面再用。

一、项目工具

1.1 IDE

主流的 Java 开发工具现在非 IntelliJ IDEA 莫属。前几年,可能 Eclipse 还能和 IDEA 一争高下,到了现在已经基本是 IDEA 的天下了。

就拿我自己来说吧,我最早用 IDEA,后来用了几年 Eclipse,再后来又用回了 IDEA。

包括我身边的程序员,之前用 Eclipse 的人,这几年不少人都换成用 IDEA 了。

如果你问我用 IDEA 到底哪最爽,我觉得有 3 点:

代码智能提示,爽!代码自动生成,爽!代码调试,爽!

而这 3 点,恰恰就是能极大提高开发人员开发效率的 3 点。所以建议做 Java 后端开发的,可以优先考虑 IDEA 作为开发工具。

1.2 版本管理工具

对于项目中的代码版本管理工具,Git 已经处于垄断地位了,新项目的话不需要再考虑 SVN、CVS了。

之所以 Git 现在处于垄断地位,主要胜在 2 点:

Git 是分布式的,不会因为版本管理服务器崩溃导致完整的代码历史版本丢失。Git 创建分支是非常廉价的操作,可以随意创建分支,从而使并行开发很容易落地。而 SVN、CVS 这些版本管理工具创建分支则非常笨拙,并行开发非常麻烦。

上述第 1 点大大提升了代码资产的安全可靠程度;第 2 点则完美适应当代的敏捷开发需求。也因此,Git 大行其道就不足为怪了。

给大家分享一本非常不错的 Git 开源手册。

1.3 构建工具

Java 项目的构建工具现在是龙争虎斗,业内一般有两个选择:Maven 和 Gradle。

如果是后端的 Java 项目,那绝大部分用的还是 Maven 去构建项目。如果是前端的 Android 项目,则选择 Gradle。

Gradle 本身要比 Maven 先进很多:它配置灵活,性能优秀,真的是个非常优秀的构建工具。

那为什么在后端 Java 项目构建的时候,大部分用的还是 Maven 呢?

因为Gradle本身太过灵活了,这种灵活带来了两个和后端项目构建特性不太匹配的问题:

Gradle 因为灵活,所以用法规则多变,导致学习门槛过高——后端项目本身的构建流程,套路比较死板,变化非常少,所以不需要太多的构建特性、构建规则。也就是说,灵活本身引入的多种用法、规则、特性对后端项目意义不大,为了构建工具本身的使用,去投入时间学习,本身性价比不高。上面说了,后端项目本身的构建流程是比较套路化的,需要进行一些强约束,去保证这种套路的可靠与稳定。而 Gradle 因为本身比较灵活的配置规则,反而失去了 Maven 的那种强约束,这就很可能因为失去了约束,从而造成团队在使用 Gradle 的时候,出现各种冲突和潜在的错误,造成项目构建的不稳定,这对后端项目来说是得不偿失的。

二、开发框架

2.1 Web 框架

现在的 Web 项目开发,大部分都转向了 SpringBoot 了。使用 SpringBoot 有三个最大的好处:

配置非常少,可以说是即插即用基于 Spring 构建,入手门槛非常低直接运行,不需要再考虑 Web 容器的问题

SpringBoot 大部分人都很熟了,不再赘述了。

2.2 持久层框架

项目开发中用到的持久层框架,基本有两类:

Mybatis 系列衍生框架JPA 系列衍生框架

在国内来讲,大部分持久层框架还是首选 Mybatis,貌似在国外大部分项目是用的 JPA 框架。

在我看来,互联网项目、toC 的项目更适合 Mybatis,toB 的项目更适合 JPA。

toC 项目的业务需求经常是灵活多变的,所以,往往它需要项目的技术也要跟着灵活多变,而Mybatis本身就是 SQL 的简单封装,很容易加表加字段、改SQL。

而 toB 项目则不一样,需求基本比较稳定,设计好的数据模型不会频繁变化,所以不太需要 Mybatis 的灵活性的,反而更需要对随意修改模型进行一系列的强约束。而这也是 JPA 自身的特性:非常规范,且有众多约束,要改 JPA 的数据模型成本比较大。

因此,大家选持久层框架的时候,要看清项目的特性,根据实际情况选择用 Mybatis 还是 JPA。

2.3 RPC 框架

现在 Java 项目的架构,基本都在转向分布式架构。分布式系统的整合,核心就是 RPC,因此很多项目中都引入了 RPC 框架。

RPC 框架,现在用的比较多的是 Dubbo 框架。

Dubbo 性能非常好:

很多 RPC 框架底层使用的通信协议是 HTTP,而 Dubbo 则选择了 TCP 协议作为通信协议。仅从性能上来说,TCP 的性能肯定要比 HTTP 好上许多。而且 Dubbo 自身还大量使用了 NIO 异步编程去进一步做了性能优化。

所以,如果项目中需要使用 RPC,可以首先考虑 Dubbo 框架。

三、中间件

3.1 Web 服务器

现在的 Java 开发,由于大部分使用了 SpringBoot,所以以前大家常用的什么 Tomcat、Jetty、Resin 等 Web 容器都不怎么单独部署使用了。

但是,有一个 Web 容器反而还愈加兴旺起来,这就是 Nginx。

Nginx 在 Java 项目开发里,地位是非常特殊的。它在 Java 项目架构里起到了两个作用:

处理静态资源请求的web容器——Nginx 在 Java 项目中,专门负责处理对图片、html、js、css等这类静态资源的 Http 请求。反向代理做分发——除了做专门处理静态资源请求的 Web 容器之外,Nginx 同时还会把对 servlet、controller 等这些动态资源的请求,转发给后面的 SpringBoot 中内置的 Tomcat 容器。

多说一句,因为反向代理这个特性,Nginx 后面会被部署上集群,Nginx 在转发请求的时候,同时也会做负载均衡的请求分发的反向代理。

3.2 消息队列

如今,大家做架构越来越趋向分布式架构。分布式架构里,常用的通信手段,除了网络请求,就是消息队列了。

现在主流的消息队列框架有 RabbitMQ、RocketMQ、Kafka 等。

我之前写过一篇 RabbitMQ 和 Kafka 对比的高赞回答:

RabbitMQ 性能虽然低一些,但是容易上手,更适合用在中小项目。

另外,做金融领域相关项目,用消息队列的话可以优先考虑 RabbitMQ,原因有以下两点:

RabbitMQ 是 AMQP 协议的实现,而 AMQP 协议本身就是来自于金融行业的软件专家们联手制定的,非常成熟和全面,已经成了工业标准。RabbitMQ 是 Erlang 写的,Erlang 的虚拟机对内存和 CPU 过载的保护非常成熟,也因此塑造了 Erlang 应用本身的可靠和健壮。

大项目、非金融项目,大家可以在 RocketMQ、Kafka 这两者之间选择。

RocketMQ 和 Kafka 差不多 90% 的功能和概念都是相通的,只是 RocketMQ 在 Kafka 理念的基础上做了一些改进,更适用的业务场景也更广泛。

在流数据处理上,大家应该优先考虑 Kafka,原因是 Kafka 的流数据处理生态更加的完善周全。

3.3 数据库

互联网领域,主流数据库就是MySQL。在一些传统行业,比如银行,Oracle 用的不少。

Oracle 贵,互联网项目的一个特点就是数据库服务器数量贼多,如果用 Oracle 的话,成本太高了。

而且大家越来越有版权意识,国家对这方面也抓的越来越紧,所以,在互联网领域几乎都在用 MySQL。

使用 MySQL,常见的有 MHA 方案——MySQL 的高可用方案,基本架构就是一主两从。当主机出故障了,从机就会被提升为主机。

3.4 外置缓存

对于高并发的架构,外置缓存不可或缺,其中最最最常见的就是 Redis。

之所以大家都采用 Redis 做外置缓存,原因有三点:

Redis 本身性能非常好。Redis 有很多数据结构去适配不同的业务缓存需求。Redis 的集群高可用方案和分片存储的高性能方案相对成熟。

以上,就是 Java 开发中经常遇到的主流技术工具了。

由于篇幅所限,我也只列出了一些最核心(或者说每个人都会用到的)工具和中间件。

有一些重要的中间件,我觉得不是所有人都会用到,就没有提及,比如 ElasticSearch、MongoDB、Zookeeper 等(以后再写文章和大家介绍)。

希望这篇文章对大家有帮助,能帮大家快速精准的找到当今的主流技术工具,能帮大家提高开发效率。

看完有收获的话,求点赞。

我是 @四猿外 ,是一名工作十几年的程序员,也是一家上市公司的技术总监,除了以上内容,我还写了很多程序员相关的学习技巧、架构经验、职场生存法则类的优质文章,总结成了一份电子书,我相信你看完之后,对你一定会对你有帮助。想获取电子书可以戳下面链接。

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜