C++程序員學習Java初感

看了一個多月的 Java 了,涉及的書籍有:《On Java 8》、《深入理解 Java 虛擬機》、《Java 併發編程的藝術》、《Manning Spring in Action 5-th Edition》以及極客時間上的《Java 併發編程實戰》、《設計模式之美》兩門課程,同時,也正在看《Effective Java》。

從當前獲取的信息來看,真的是體會到什麼叫生態,什麼叫 Java 的類庫特別多,什麼叫 Java 程序員只需關注上層業務,也有點了解了很多程序員說的只會 CRUD 的自嘲。

對 Java 並不陌生,剛畢業那麼其實學過一段時間,但是沒有深入。語法層面和 C++ 很像,學習語法很容易,涉及的概念也都是相通的,如果有 C++ 的經驗,轉 Java 確實很方便。

JDK 本身提供了很多類庫,這極大方便了開發工作。對於併發編程,有各種線程安全的隊列、各種線程池、各種鎖、系統無關的各種同步機制。當然,這些通過 C++ 也能實現,但是,在 C++11 之前,運行時庫並沒有提供這些。譬如鎖,你得自己根據不同的平臺進行封裝:你得了解 Windows 平臺的同步機制,也得了解 Linux 平臺的同步機制,這樣才能封裝出跨平臺的鎖。沒有一定的經驗,確實幹不了這個活。

在 C++11 之前,如果想提高開發效率,對於很多通用功能,比較好的方式是用開源庫,Boost 是其中的佼佼者(C++11 標準的功能備選池)。但是,你把 Boost 引入自己的工程,沒個半天一天,還真不一定能搞的定。以 Windows 平臺而言,你得根據你的編譯器版本編譯不同的庫(靜態庫、動態庫)以及對應的版本(MT、MD、MTd、MDd),同時需要把相關頭文件引入自己的工程。編譯這塊,可能就會出不少問題,更不論讓不少對 Visual Studio 工程配置不熟悉的人配置工程了。引入 Boost 可能就極大了挫敗了自信心了,在使用的時候,也不一定能很好的使用。

反觀 Java,由於 JDK 提供了上述功能,你只需 import 相應包就可以了,剩下的就是使用了,遇到問題,網絡上搜索也是一收一大把。這一點上,相比於 C++,Java 程序員節省了大量的時間和精力,能把更多精力放在業務上。

最讓我大開眼界的是 Spring,一個神奇的生態。通過簡單的導入相關包、加上相應的 Annotation,即可實現很複雜的功能。譬如和數據庫的交互、 Web 開發、消息隊列、鑑權、過濾器、網關、配置中心、註冊中心、服務發現、限流、熔斷、健康檢查、服務監測等等。我之前真的不知道,原來那麼複雜的功能,可以通過引入這麼簡單的依賴即可實現,真的是讓人匪夷所思。簡單添加幾行依賴,即可把底層的框架搭建好,只需要加上自己的業務代碼,這更一步加深了我對 Java 開發效率高的理解。因爲他們不用花很多時間解決配置問題,也不需在引入成熟框架時要用九牛二虎之力。成熟的框架,把能做的都做了,使用者只需關注如何處理自己的業務。而自己的業務融入到框架中,一般都很容易,並不會花費多少時間和精力(這可能是我的片面之詞)。

對於 Web 開發,Spring 也提供了簡單易用的框架。通過簡單的Annotation即可把URI和業務代碼關聯起來。我不瞭解 Web 開發這部分的情況,也不清楚主要的框架,寫到這裏,我特意沒有去查。只是爲了說明一個問題,Spring 提供的功能真的是太傻瓜了,如果沒有主動探索的心,Java 開發者真的太容易陷入框架中了,也只會用框架了。

如果用 C++ 開發 Web 後端,那麼首先得處理網絡通信這部分。網絡通信涉及到套接字收發機制,涉及到不同平臺的網絡編程:Windows 下的 IOCP、Linux 下的 select、poll、epoll、kqueue 等;收到數據後,還得對 HTTP 報文進行拼包,以形成完整的報文,然後才能回調給上層。上層根據收到的報文,進行解析,根據不同的 URI,調用不同的處理函數。完整的流程走下來,涉及的東西真的是太多了,沒有相應的水平,真的 Hold 不住。從這點看,Java 的開發效率,吊打 C++,一點都不爲過。

使用 C++ 的這幾年,總是會以較底層的方式去看待問題。譬如對於 HTTP 請求,會用上面的思路去想整個流程的具體實現,會學習 TCP 的相關知識,也會好奇 HTTP 協議是如何將一個個分片的報文組裝成完整的報文的。畢竟,HTTP 作爲上層協議,並沒有很顯示的告知如何組包。但是組包過程肯定少不了,因此會去查詢 HTTP 協議的組包原理及實現,也買了《HTTP 權威指南》作爲深入學習的資料。

對於開頭說的線程安全的各種隊列、線程池、消息隊列以及鎖等,對於C++ 而言,多是自己實現,這很鍛鍊能力。雖然開發效率上比不上 JDK,但是對於練內功卻是很有幫助。有 C++ 的基礎,在學習 Java 時,這部分的內容學的很快。很多東西都是相通的,譬如 Java 中的流式編程,和 C++ 中的模板元編程很像。這是好的編程思想,在不同的語言中的體現。

對於分佈式架構,由於業務的關係,使用 C++ 的我,並沒有機會接觸。經常聽到各種文章談分佈式,有些人張口閉口分佈式,好像不懂分佈式就很 Low 一樣。在極客時間的課程《左耳聽風》中,對於分佈式的各種概念有了基本的認知,在《RPC 實戰和核心原理》這門課中,對於一些概念又有了更多的理解。在學習 Spring 時,有了具體實踐這些內容的方式,理論有了實踐的驗證。這些知識對我的衝擊不可謂不大,這就像在黑暗中行進,突然推開了一道門,然後被耀眼的光刺的睜不開眼。這種感覺就像是發現了一個新大陸,看到了一篇全新的天地。

我這裏不是說 C++ 不好、Java 好。每種語言都有其使用場景,都有其優勢也有缺點。譬如 C++ 的運行高效率,Java 的開發高效率;C++ 讓程序員基本功更紮實,Java 讓程序員關注業務等等。我前面說的 Java 對我的震驚,其實 C++ 也都能實現,只不過是沒看到好的開源庫罷了。

以前,真的是很狹隘,把自己限制在 C++ 的刀耕火種階段。C++11 中的新特性,工作中很少用到,雖然學過,自己寫一些程序時也會用,但是由於不常用,慢慢的也就生疏了。當睜眼看世界,瞭解其他語言時,發現之前沒有機會接觸的東西,突然都能接觸了,雖然當前也只是皮毛,但至少讓我認識到,編程領域的豐富多彩。

我們都知道,閉關鎖國沒出路,睜眼看世界才能強大。對於個人,這也同樣有效,保持一顆開放的心,接觸新事物,不斷充實自己。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章