Java 20年:历史与未来
作為最受歡迎的編程語言之一,Java已經走過了20個年頭。從已經落寞的諾基亞到現在火熱的電商系統,我們都能看到Java語言的身影。從1995年的第一個版本到現在的Java 1.8,我們甚至能從Java的版本迭代中看到不同時代編程語言關注的重點。經過了過去20年的發展,Java已經成為如今使用最為廣泛的企業級語言。為了慶祝Java的第20個生日,InfoQ為此采訪了Java技術專家彭晨陽(網絡ID:板橋)。
\\InfoQ:您是哪一年開始接觸Java的?還記得當時『世界』是怎么看這門語言的嗎?
\\\板橋:我大概是2000年之前開始接觸Java,當時大家都認為Java慢,幾乎沒有幾個人看得上眼,那時使用Perl/C實現CGI比較快,PHP很方便。
\\\InfoQ:能回憶下你的職業生涯中與Java相關的經歷嗎?
\\\板橋:2000年之前使用Perl開發過一個類似西祠、西陸社區網站,隨著功能日益復雜,維護拓展比較麻煩,打算使用Java改造升級。但是Java比較復雜,當時有EJB等規范,因此誤用過EJB來做產品,其實EJB更適合做企業中可靠性要求比較高的項目。而對于社區項目來說,性能是關鍵,這個道理后來我從CAP定理中才得到答案,當然當時也沒有聽說過CAP理論,這段教訓是相當深刻的,EJB很難掌握,運行起來更慢,最后也以失敗告終。
\\之后研究學習了Jive開源Java論壇,對其設計模式與緩存兩個優點進行了綜合學習與應用。有一段時間參與過手機游戲的開發,那時客戶端是J2ME,但是游戲邏輯不加載在客戶端,而是將客戶端只作為界面展現,類似今天的瀏覽器+Angular.js這樣富客戶端。當然,這個系統對網絡要求比較高,但是當時無線網絡3G還沒有推出,后來放棄了,從該項目中我意識到高性能的大型并發系統使用Tomcat這樣的普通Web服務器已經無法承擔,于是對異步消息JMS等技術產生了興趣。
\\之后,陸陸續續參與過一些項目的咨詢和設計,大部分都比較普通,無非是CRUD增刪改查。于是萌生了做一個快速開發框架,在不丟失多層架構的基礎上能有Delphi等二層架構的開發效率,這大概是JDON框架的原型。當然,該框架后來從快速開發為首要目標轉移到靈活性為首要目標。
\\做了不少項目后,需要尋求理論指導,原來的數據庫+Java路數已經不能包打天下,后來逐步開始引入DDD領域驅動設計CQRS和EventSourcing。
\\\InfoQ:很多人都在唱衰Java,您能結合Java的發展現狀和趨勢談談Java的前景嗎?
\\\板橋:Java發展到今天已經20年了,作為一個編程語言確實不簡單,想當初人人受懷疑的慢語言到今天通用的健壯語言,真是大智若愚啊。Java代表的面向對象思想確實給工程領域帶來了革命性的變化,當然思想是不斷進化發展的,如今人們開始看好函數式編程語(FP)。盡管Java 8也加入了函數語言的特點,但是OOP和FP兩者到底是不同的編程范式,不過掌握FP有一定門檻,這也是造成很多人觀望的一個原因。
\\Java在數據流處理方面還是很有競爭力的,而大數據實時流處理系統是Java的新領域,在這個領域有Apache Kafka、Apache Samza、Apache Storm、Apache Spark的Streaming模塊和最新的Apache Flink。Spark是基于JVM的函數語言Scala編寫,其余都是Java編寫。
\\\InfoQ:JVM的普及促使相關周邊語言不斷涌現,你怎么看這些JVM語言?
\\\板橋:以Scala為代表的JVM語言發展迅速,Scala語言特性是首先區分不變性和可變性,當初使用EJB時首先要區分是無狀態和有狀態,這說明思路是一脈相承的。可變性的狀態是造成副作用和各種Bug的罪魁禍首,可能我們如果只是把可變狀態使用數據庫實現時沒有注意到這種問題。其實這個問題遍布在應用的每個角落,特別是使用類和對象這個OOP概念實現時最容易發生。一個類或對象包括字段和方法,如果這個字段值是可變的(可變狀態),我們使用這個對象時如果不打開它的類代碼是無法得知它有可變狀態的,那么就會導致各種副作用發生。
\\而函數編程由于函數方法是第一公民,沒有什么東西擋在它的前面,沒有類或對象包裹著它們,因此,它們無法私藏可變狀態字段,能夠確保應用系統每行代碼都是基于不可變的基礎之上。
\\如果說Scala之類JVM的函數語言適合不斷添加功能函數的應用場景,那么Java之類的OOP語言適合不斷增加實體物體的應用場景。前者好動,后者好靜。
\\\InfoQ:Java是如何擁抱云時代的?
\\\板橋:Java在云時代面臨以Go語言為主的容器(Docker等技術)生態圈的挑戰。其實JVM也是一種容器,但是這種容器特性正在被Linux學習與趕超,那么,JVM的定位就可能比較尷尬。
\\Docker之類容器可以在本地筆記本或電腦上運行,然后同樣可以部署到云上運行。當在云上運行時,Kubernetes能夠以一種可控的方式升級容器從而實現運行管理一批容器,如同一個大型船隊或艦隊一樣,你可以控制它們的流量訪問量,可以指定多少個容器來擴展支撐一個服務的運行,隨著訪問量提升,你通過增加容器數量能夠整個系統的負載能力。
\\當然,Java的大型分布式系統越來越多,Java在云計算與分布式系統中還是扮演主要角色,形成一個大型的生態圈。當我們站在泰山之上,一覽眾山小,當你在全球擁有多個數據中心時,語言已經變得不那么重要了,關鍵是架構設計。
\\\InfoQ:Go語言這兩年比較火熱,你怎么看這門語言?與Java相比,他有哪些優劣?
\\\板橋:Go語言相對Java主要優點是其并發組件模型,Java的并發比較低級,無非是多線程與鎖,想搞清楚Java中各種鎖的用途,包括數據集合Collection的線程安全性與性能差異對比,需要花費大量時間與精力,包括使用經驗。而Go語言使用了Channel/CEP這樣的組件簡單封裝了多線程與鎖,將以前JMS的Queue隊列模型架構引入到了語言之中,兩個對象之間交互只要通過Channel通道就可以。這種模型保證了并發性,有簡化了編程模型,無疑受到很多人的歡迎。
\\Go語言當前也受到更加強勁的Rust語言挑戰,如果說,Go語言的Channel是一種有形的設計,那么,Rust語言的并發模型達到無形的設計,只要你編寫好函數方法,安全性與并發性就無形中得到了解決,不用專門去思考并發,有意識地去使用并發組件模型編程。
\\\InfoQ:現在的開發語言特別多,Java、Go、PHP、Rust、Python等,你認為未來語言的發展趨勢是怎么樣的?
\\\板橋:現在的開發語言如雨后春筍,主要原因是CPU進入多核并發時代,以及大型架構進入分布式系統,如何使用一種語言從微觀的CPU多核之間并發到數萬臺服務器之間的分布式計算處理,這種大一統的愿景促使人們在不斷探索。
\\在Java中,我們可以通過框架來實現這點,以我前幾年研發Jdon框架為例,雖然能夠勉強實現并發與分布式,但是這種實現需要很強的知識背景,不利于初學者上手。而要達到普及這個目標,必須從語言入手,讓語言初學者在學習掌握語言以后,無形中就會實現了并發與分布式。
\\Go語言在這方面比較突出,其并發模型以讀寫操作為基礎。請注意,Java等語言并發模型沒有這么高,它們是以線程為基礎,再應用到讀寫場景中,而我們現實中必須以讀寫為基礎,再應用到具體業務場景中,這里面高低層次:線程–\u0026gt;讀寫操作–\u0026gt;業務應用,無疑越靠近業務應用的語言越能簡化我們的開發,而分布式系統也是基于讀寫操作,著名的CAP定理也隱含了以讀寫操作為基礎的語境。
\\\受訪嘉賓介紹
\\彭晨陽,Jdon.com創辦者和版主。軟件開發設計咨詢從業20年,10余年Java開發經驗,擁有ERP、大型游戲、互動電視三網合一等架構經驗。獨立咨詢顧問,個人擅長復雜系統的軟件架構和領域建模。流行新技術思想的傳道者,主持解道網站跟蹤國際最新軟件架構思想和設計技術。首個國內Java開源框架項目Jdon框架的設計者。
\\感謝臧秀濤對本文的審校。
\\給InfoQ中文站投稿或者參與內容翻譯工作,請郵件至editors@cn.infoq.com。也歡迎大家通過新浪微博(@InfoQ,@丁曉昀),微信(微信號:InfoQChina)關注我們,并與我們的編輯和其他讀者朋友交流(歡迎加入InfoQ讀者交流群)。
總結
以上是生活随笔為你收集整理的Java 20年:历史与未来的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: onSaveInstanceState和
- 下一篇: 2015-05-26