[轉]2022 年 Java 行業分析報告

2022 年 Java 行業分析報告

你好,我是看山。

前段時間介紹了從 Java8 到 Java17 每個版本比較有特點的新特性(收錄在 從小工到專家的 Java 進階之旅 專欄),今天看到 JRebel 發布了《2022 年 Java 發展趨勢和分析》,于是借此分析一下 Java 行業的現狀,希望給大家一些參考。

JRebel 是通過調研問卷的方式總結的報告,涉及了不同國家、不同崗位、不同公司規模、不同行業,相對來說,該調查報告是有一定參考意義的。

Java 語言及開發趨勢

Java8 的占比還是比較高

我們先來看下大家都在使用的 Java 版本(包括 JVM 語言:Kotlin、Groovy、Scala):

Java 各版本語言占比

從結果我們可以看到,Java8 占比 37%,Java11 占比 29%,甚至有 12%的被調查者使用了高于 Java12 的版本。

Java8 是 2014 年發布,相較于之前版本,增加了 Lambda 表達式、Stream 流式處理等一種優秀的 API。至今已 8 年時間,Java 版本也是從 8 一直升到了 17。版本號一直在增加,卻沒有增加特別吸引人的語言特性。

哪些因素是大家升級的動力呢?

升級的動力

可以看到,主要的升級因素包括 LTS 版本(25%)、安全性(23%)、性能(20%),新特性(18%)和隨大流(14%)占比低一些。

從這點我們也就知道為什么 Java11 之后的版本占比并不高了,隨著 Java17 的發布,可能 Java8 和 Java11 的占比會降低。安全性方面,除非是嚴重的漏洞,一般 Java 開發團隊會通過補丁的方式升級,不會影響大版本號占比。

性能方面,Java 團隊一直在不斷優化,隨著 G1、ZGC、Shenandoah 等一眾優秀的 GC 被添加進來,這也成為大家從 Java8 升級的重要原因。

就功能特性而言,Java11 之后增加了 Record 類型、密封類、instanceof 模式匹配、Swtich 表達式和模式匹配等一些語法糖。這些新特性,也能夠提升升級到 Java17 的意愿。

升級 Java17 的意愿還是比較強的

Java17 是 2021 年下半年發布的 LTS 版本(長期支持版)。

我們看下大家升級的意愿:

升級 Java17 的意愿

從結果可以看出來,有 37%的人會在未來 6 個月內升級,有 25%的人會在 6-12 個月內升級,不會升級的占比僅占 8%。

可見,有 62%的人會在未來一年內升級到 Java17,大家的升級意愿還是比較強的。

OracleJDK 和 OpenJDK 占據過半市場

我們都知道,市面上有很多的 JDK 版本,在 Oracle 起訴 Google 侵權之前,非企業特供的情況下,我們基本上用的都是 OracleJDK,后來因為容器中使用 JDK 版本的版權問題,容器中大部分使用了 OpenJDK。

從問卷結果也反映了這種情況:

JRE/JDK 各種版本的市場份額

OracleJDK 的版本占比 36%,OpenJDK 的版本占比 43%,其中包括標準 OpenJDK 和 AdoptOpenJDK 版本。

有些同學會疑惑 OracleJDK 和 OpenJDK 的區別在哪?我們日常用到的部分,沒有任何區別。

Java 應用架構趨勢

這個問題的結果有些出乎我的預料:

Java 應用架構趨勢

各種架構風格中,微服務架構僅占 32%,單體架構占比 22%,模塊化單體架構占比 13%,SOA 架構占比 12%。

從結果來看,這個問卷的對架構風格的定義和分類比較細膩。

很多公司把系統的服務化、模塊化也統稱為了微服務,這是一種很嚴重的錯誤,在之前的文章 《微服務架構的陷阱:從單體到分布式單體》 中介紹過這種錯誤。

推薦閱讀:

  • 《什么是微服務?》
  • 《微服務編程范式》
  • 《從單體架構到微服務架構》。

這里不對架構風格做出評價,架構只有合適與否,沒有優劣之分。

微服務架構趨勢

既然微服務架構占比高一些,我們就來看一下微服務架構的應用趨勢。

微服務架構的應用狀態

微服務架構使用狀態

從結果來看,有 44%的人團隊已經是完全微服務架構了,還有 44%的團隊在向微服務架構遷移。可見,在 Java 行業中,微服務架構是得到大家普遍認可的。

但是這個結果與上面的架構風格占比結果有出入,可能是問卷題目設計問題,或者問題回答者的主觀原因,不能夠苛求結果準確性。

每個應用中微服務的數量

每個應用中微服務的數量

既然是微服務架構,每個應用中服務數量必然超過 1 個。從結果可以看出來,有 54%的應用中少于 10 個服務,還有 22%的應用服務數量超過 20 個。

微服務數量與公司規模的關系

按照公司規模維度,越是大公司,每個應用中服務數量越多,結果符合康威定律的。從大家普遍實踐結果看,當團隊規模較小時,要盡量減少微服務數量。市面上很多老師會告訴我們,微服務架構要按照業務域拆分,但是你要知道,如果團隊規模不大,即使拆分了業務域,可能最終開發調試維護也只有你一個。

SpringBoot 幾乎霸占了整個微服務市場

微服務框架的使用度

從結果看,SpringBoot 幾乎霸占了整個微服務市場。所以,大家在日常工作學習過程中,還是主要看看 SpringBoot 棧吧。

在國內,SpringBoot 技術棧還會細分為 SpringNetflixCloud 棧、SpringAlibabaCloud 棧、SpringBoot+Dubbo 棧等。

不同的技術棧中組件有些差異,所以我們需要掌握的不是簡單的應用,還要了解其中的原理。原理掌握了,不同的組價只是在應用層面的差異。

啟動時間在增長

隨著公司業務的增長,應用中會增加各種各樣的新功能。問卷中有個問題是關于隨著時間推移,微服務啟動時間的變化:

啟動時間在增長

可見,有 60%的服務啟動時間都在增加,甚至有 13%的應用啟動時間增長超過 50%,有 30%的應用啟動時間增長范圍在 10%-50%。

為什么啟動時間會增長呢?這個與公司業務增長后,代碼增加了很多新功能有關。隨著功能增加、類的增加,系統體積增大、加載類數量增大,啟動時間會隨之增加。這會引起系統的腐化,當腐化到一定程度,可能就需要重構了。或者隨著業務增長,原來的微服務邊界劃分不合適了,需要重新劃分系統邊界,拆分微服務。

啟動需要多長時間

既然微服務總體的啟動時間在增長,那啟動時間一般是多久呢?

啟動需要多長時間

可以看到,只有 9%的服務在 1 分鐘內啟動成功,有 26%的服務啟動時間需要 10 分鐘以上。

不同公司規模服務啟動時間分布

從上圖可以看出來,人員規模大于 100 人的公司中,服務啟動時間普遍長于少于 100 人的公司。產生這種情況的原因有這么幾個:

  1. 公司規模大一些,可能業務復雜一些,服務中的代碼、類庫更多一些;
  2. 公司規模大一些,依賴的組件更多一些,在服務啟動時,需要與各種中間件建立鏈接,然后彼此交換成功心跳,自然需要時間更多。

采用微服務其中一個好處是服務足夠小,啟動時間比較少。但是,從上面兩個問卷結果來看,普遍情況是啟動時間比較長,而且在變得更長。

Java 技術趨勢

Java 應用超過半數使用了容器部署

Java 應用超過半數使用了容器部署

從問卷結果可以看到,Docker 使用率是 41%,Kubernetes 使用率是 26%,VMware 使用率是 16%,Vagrant 使用率是 3%,即有 86%已經實現了虛擬化,其中 Docker、Kubernetes 占比最高。

所以在 Java 升級版本特性中,實現了容器感知的能力,使 Java 服務容器化更容易一些。

PaaS 平臺還得看 AWS

PaaS 平臺

JRebel 的這個問卷調查是全球性質的,從全球范圍看,AWS 當之無愧的 NO.1。AWS 作為亞馬遜曾經的附屬產業,已經成為了亞馬遜的重要業務之一。

與亞馬遜的經歷類似,阿里巴巴從電商切入,然后布局云服務(阿里云)。如果還是走亞馬遜的老路,勢必沒法超越。不過阿里從很多年前開始布局 CPU 和芯片領域,如果能夠有所突破,就可以破開西方技術的封鎖,依托我國的發展潛力,未必不能撼動亞馬遜的 PaaS 服務商地位。

近半數服務端使用 Tomcat 容器

應用服務器

前面關于微服務的問題中,SpringBoot 是眾多微服務框架中的首選,SpringBoot 默認的應用容器是 Tomcat。加之 Tomcat 的開源方式,將近半數應用服務器選擇 Tomcat 也是預料之中。

Maven 是主要的構建工具

構建共建

Maven 和 Gradle 到底該用哪個?這個問題似乎爭論許久。從問卷結果看,Maven 占有率是 68%,Gradle 占有率是 23%,Maven 還是有絕對的優勢。

Gradle 采用了約定大于配置的方式,與 SpringBoot 的理念一致。但是從市場接受度和發展而言,并沒有形成替換 Maven 的風潮。Android 項目默認使用 Gradle,能夠看出 Google 對 Gradle 的推崇,也從側面印證 Gradle 的優秀。但是,Gradle 并沒有絕對優勢。

近半數開發者使用 IntelliJ IDEA

IDE

我是從 2015 年開始使用 IntelliJ IDEA,試用之后立馬拋棄了 Eclipse。首先是快捷鍵的設計,可以很大程度擺脫鼠標。內置的插件市場,可以找到任何需要的插件,提升編程體驗。更關鍵的是,JetBrains 公司出品的 IDE,可以無縫對接,實現不同語言的編程支持。

Eclips 也不是一無是處,它的插件體系也是相當豐富,很多低代碼開發工具都是基于 Eclipse 開發的。如果是普通開發,推薦使用 IntelliJ IDEA;如果想要做低代碼工具,可以考慮對 Eclipse 進行二次開發。

開發者生產力趨勢

這一部分屬于 JRebel 有私心的部分,JRebel 一個優勢功能是提供熱部署能力,所以會在問卷中詢問被調查者重新部署應用的時間。

重新部署應用的時間

很多時候,我們可能只改動一行代碼,然后驗證功能是不是正常,這個時候需要重新部署應用。JRebel 統計了重新部署需要花費的時間。

重新部署應用的時間

從結果上看,重新部署需要超過 3 分鐘時間的占 50%,其中 21%的比率需要 10 分鐘以上。那這段時間,大家會干什么?

如果節省重新部署的時間你會做什么?

重新部署時大家在做什么

有 28%會增加新功能;有 20%會優化系統性能;有 19%會完善測試覆蓋。這些都是正向的,大概率的是那些回答其他的:喝咖啡、喝啤酒、開趴、睡覺、釣魚……

不過也是符合我們工作的原因:我們工作是為了生活,而不是為了加班。所以,假如每天給你 1 小時的自由時間,你會用來做什么呢?歡迎評論區討論。

文末總結

  1. 微服務的使用情況來看,啟動時間和重新部署時間不是優先考慮的因素。多數選擇微服務架構的原因無非有兩個:
    1. 看中微服務架構流行趨勢,聽說這個很好,那就開始用,至于是微服務架構還是分布式單體架構,就不重要了;
    2. 微服務的優勢能夠彌補帶來的弊端,比如業務迭代速度等;
  2. 微服務收康威定律影響比較大;
  3. 技術在不斷革新,但是大家會比較理性地接受。公司規模越大,越趨于選擇成熟的技術;
  4. 容器已經是大勢,需要掌握。

技術不斷發展,我們需要學習的東西越來越多,很多時候感覺學不動了。但既然選擇了這個行業,拿著高于其他行業的薪資,也承擔著各種裁員的風險,總歸是要有一些技能傍身,才不至于被歷史的車輪碾成粉末。

青山不改,綠水長流,我們下次見。

參考

  • https://www.i-programmer.info/news/80-java/15317-wheres-java-going-in-2022.html
  • https://www.jrebel.com/resources/java-developer-productivity-report-2022

推薦閱讀

  • 一文掌握 Java8 Stream 中 Collectors 的 24 個操作
  • 一文掌握 Java8 的 Optional 的 6 種操作
  • 使用 Lambda 表達式實現超強的排序功能
  • Java8 的時間庫(1):介紹 Java8 中的時間類及常用 API
  • Java8 的時間庫(2):Date 與 LocalDate 或 LocalDateTime 互相轉換
  • Java8 的時間庫(3):開始使用 Java8 中的時間類
  • Java8 的時間庫(4):檢查日期字符串是否合法
  • Java8 的新特性
  • Java9 的新特性
  • Java10 的新特性
  • Java11 中基于嵌套關系的訪問控制優化
  • Java11 的新特性
  • Java12 的新特性
  • Java13 的新特性
  • Java14 的新特性
  • Java15 的新特性
  • Java16 的新特性
  • Java17 的新特性
  • 從小工到專家的 Java 進階之旅


你好,我是看山。游于碼界,戲享人生。如果文章對您有幫助,請點贊、收藏、關注。我還整理了一些精品學習資料,關注公眾號「看山的小屋」,回復“資料”即可獲得。

個人主頁:https://www.howardliu.cn
個人博文:2022 年 Java 行業分析報告
CSDN 主頁:https://kanshan.blog.csdn.net/
CSDN 博文:2022 年 Java 行業分析報告

👇🏻歡迎關注我的公眾號「看山的小屋」,領取精選資料👇🏻


---------------------
作者:看山
來源:CSDN
原文:https://blog.csdn.net/liuxinghao/article/details/125356270
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/283824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283824.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql 數據庫學習筆記03 存儲過程

一、存儲過程:如下 通過 out 、inout 將結果輸出,可以輸出多個值。 * 調用存儲過程: call 存儲名稱(參數1,參數2,...); 如指定參數不符合要求,返回 Empty Set * 查詢存儲過…

android 代碼混淆模板

#指定代碼的壓縮級別 -optimizationpasses 5 #包明不混合大小寫 -dontusemixedcaseclassnames #不去忽略非公共的庫類 -dontskipnonpubliclibraryclasses#優化 不優化輸入的類文件 -dontoptimize#預校驗 -dontpreverify#混淆時是否記錄日志 -verbose# 混淆時所采用的算法 -opt…

vue+vuecli+webapck2實現多頁面應用

準備工作 在本地用vue-cli新建一個項目,首先安裝vue-cil,命令: npm install -g vue-cli 新建一個vue項目,創建一個基于"webpack"的項目,項目名為vuedemo: vue init webpack vuedemo 這里有一個地方需要改一下&#xff0…

一文把Docker、Kubernetes搞懂:什么是Docker?什么是Kubernetes?Docker和Kubernetes有什么關系和區別?通俗解釋Docker、Kubernetes

一、Docker解決的問題 1、統一標準 ● 應用構建 ○ Java、C、JavaScript——編程各異 ○ 打成軟件包 ○ .exe(類似Windows,最終也只是生產exe執行) ○ 使用docker build … 打包成 鏡像——這就類似于exe ● 應用分享 ○ 所有軟件的鏡像放到一…

Python-高階函數

#encodingUTF-8import sys # 高階函數高階函數實際上是參數可接受函數的函數即參數為函數的函數 # map()map()接收兩個參數,一個是函數,一個是序列,將此函數分別作用于該序列的每個元素,返回處理后的序列結果def c2(x): return x…

程序員雙手飛快敲鍵盤的時候是在敲代碼嗎?

當你看到一個程序員的兩只手在鍵盤上上下翻飛,行云流水的時候,多半不是在敲擊代碼大概率是在跟產品經理撕逼討論需求另一種可能就是在跟測試打口水仗10%幾率是在論壇碼字摸魚或者和人家開噴了。1%幾率是在跟MM聊天可以手速飛快而不需要停下思考的代碼&am…

erlang-17版本的編碼方式

最近在騰訊云租了個云主機:鏡像提供方:選擇服務市場 :多語言環境(Centos 7.0 64位 Python Perl Ruby Erlang ) 他們集成軟件安裝的是erlang-17版本,我之前用erlang-16版本一直沒遇到什么問題; 這…

幾分鐘上線一個網站 真是神器

1、ToolJet 簡介 ToolJet 是一個開源的低代碼框架,可以快速構建和部署內部工具,而無需工程團隊付出太多努力。您可以連接到您的數據源,例如數據庫(如 PostgreSQL、MongoDB、Elasticsearch 等)、API 端點(To…

翻譯:用戶變量(User-Defined Variable)(已提交到MariaDB官方手冊)

本文為mariadb官方手冊:User-Defined Variables的譯文。 原文:https://mariadb.com/kb/en/user-defined-variables/我提交到MariaDB官方手冊的譯文:https://mariadb.com/kb/zh-cn/user-defined-variables/ 用戶變量是指由用戶創建&#xff0…

移植Python3到TQ2440(一)

平臺 硬件:TQ2440 64MB內存 256MB NandFlashbootloader:U-Boot 2015.04kernel:linux-4.9Python: Python-3.6.0工具鏈:arm-none-linux-gnueabi-gcc 4.8.3概述 現在樹莓派很火,在樹莓派上面用戶可以通過Python來控制板…

WinForm(六)組合布局屬性

WinForm是基于控件的,不像codemark的架構,可以非常靈活的用mark來布局,它只能用控件布局屬性和窗口控件來完成對UI的布局。容器控件有一組控件叫容器控件,對布局特別有作用,它們分別是:TableLayoutPanel&am…

Qt 網絡編程

QT 網絡編程 TCP 編程 模塊引入 QT network 頭文件 #include <QTcpServer> // TCP服務器端使用 #include <QTcpSocket> // TCP服務器和客戶端都使用 編程流程 服務端 1&#xff09;實例化 QTcpServer 對象 -----------------------------> socket 2&#x…

HDU 5037 Frog(2014年北京網絡賽 F 貪心)

開始就覺得有思路&#xff0c;結果越敲越麻煩。。。   題意很簡單&#xff0c;就是說一個青蛙從0點跳到m點&#xff0c;最多可以跳l的長度&#xff0c;原有石頭n個&#xff08;都僅表示一個點&#xff09;。但是可能跳不過去&#xff0c;所以你是上帝&#xff0c;可以隨便在哪…

Kafka高性能高吞吐的原因總結

1、磁盤順序讀寫 保證了消息的堆積 順序讀寫 磁盤會預讀,預讀即在讀取的起始地址連續讀取多個頁面&#xff0c;主要時間花費在了傳輸時間,而這個時間兩種讀寫可以認為是一樣的。 隨機讀寫 因為數據沒有在一起&#xff0c;將預讀浪費掉了&#xff0c;需要多次尋道和旋…

日利率

2019獨角獸企業重金招聘Python工程師標準>>> 利率計算 轉載于:https://my.oschina.net/u/3342652/blog/1649028

linux下使用tar命令

解壓語法&#xff1a;tar [主選項輔選項] 文件或者目錄 使用該命令時&#xff0c;主選項是必須要有的&#xff0c;它告訴tar要做什么事情&#xff0c;輔選項是輔助使用的&#xff0c;可以選用。主選項&#xff1a;c 創建新的檔案文件。如果用戶想備份一個目錄或是一些文件&…

Kafka 安裝詳解

注意&#xff1a;確保有JDK1.8版本及以上 官方文檔&#xff1a;https://kafka.apache.org/quickstart 清華鏡像下載&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/ 首先下載安裝包&#xff0c;在linux及Windows都可以使用。 1. Centos 安裝部署 1.1 下載 將下…

【Maui正式版】創建可跨平臺的Maui程序,以及有關依賴注入、MVVM雙向綁定的實現和演示...

前言&#xff1a;Maui終于在2022年8月9日推送出來了。今兒就迫不及待來把玩一下先。A、我本地已有VS2022&#xff0c;不過版本比較老&#xff0c;此處選擇更新。工具 -> 獲取功能和更新里面&#xff0c;可以獲取到新版本更新。B、最新版本是17.3.0&#xff0c;我本地只有17.…

學go語言能做什么工作?

Go語言主要用作服務器端開發&#xff0c;其定位是用來開發“大型軟件”的&#xff0c;適合于很多程序員一起開發大型軟件&#xff0c;并且開發周期長&#xff0c;支持云計算的網絡服務。Go語言能夠讓程序員快速開發&#xff0c;并且在軟件不斷的增長過程中&#xff0c;它能讓程…

WebSQL存儲

2019獨角獸企業重金招聘Python工程師標準>>> WebSQL這種存儲技術&#xff0c;相對于學過數據庫的人來說&#xff0c;還是比較容易理解和上手的&#xff0c;主要就是它的存儲風格和我們一般所學的SQL Server 和Oracle比較像&#xff0c;對于HTML5來說&#xff0c;當然…