《Thinking In Java》作者:不要使用並行!

2022-09-26 18:02:34

前言

今天純粹就是帶你們來讀讀書的~

最近除了工作,特地買回了自己很喜歡的作者新發售的一本書《On Java》,作者是我的老朋友布魯斯·埃克爾,在Java領域很有名,你可能沒聽過他的名字,但極有可能聽過他的另一本書《Thinking In Java》,我想很多Java工程師都讀過這本書,可以說是Java程式設計思想的良心之作。

雖然布魯斯是我的老朋友,但我不得不吐槽一下,大概通讀了一遍《On Java》之後,我心裡大體認為是不如《Thinking In Java》的,可能和寫小說一樣,讀者的要求高了,而作者的年紀大了。

我認識布魯斯很多年了,他是個比較幽默風趣的人,經常在書中直言不諱某程式語言的垃圾之處,同時又對該語言的未來做一點展望,算是一個很中肯且典型的直男程式猿。

最後說一點,我認識他,他不認識我。


正文

我著重看了自己比較感興趣的並行程式設計這一塊,想知道這位大佬對於目前Java並行程式設計是否有新的看法和意見,不出我所料,他沒講什麼重要的東西,但是好像又講了,帶著吐槽批判式的口吻,陳列了他喜歡和討厭Java並行程式設計的地方。

所以我把一些我覺得有意思的地方畫出來,分享給大家,看看一個資深Java大佬對並行程式設計的理解。

1、大佬的並行定律

其實看到作者研究出的這4條定律時,我還是挺意外的,第一句就點題了,不要使用並行。

仔細想想好像也對……再琢磨一下咦有感覺……最後回憶一下這些年參與的專案……哇擦好有道理!

接下來3條基本算是總綱了,後面的內容都是對這幾條的說明。


2、你已埋下的隱患

這裡就是對2、3條的具體說明了,有些話我覺得略顯囉嗦,我把對於程式設計師來講比較重要的一句話畫出來了。

你很容易寫出一個看起來執行正常但實際上有問題的並行程式。

看到這句話的時候是不是已經開始默默開啟自己的IDEA了,然後審視了一遍自己提交的程式碼?

別看了,你埋的炸彈還少麼,能看出花來嗎。

看清楚作者後面那句:你這個問題只有滿足最罕見的條件時,才會將自己暴露出來。

我可以這麼說,在座絕大部分同行去了下一家公司幹活,可能上一家公司的新同事才會在你毫不知情的時候默默踩到你埋的地雷然後被炸個粉碎,而你在新公司也正在踩別人的雷,出來混都是要還的。


3、別否認你就是這種人

看到這裡的時候,我忍不住親了布魯斯一口,他痛快的描述出了我一直以來在工作中說不清道不明的煩躁,因為你總會遇到這樣的人,同時很難發現自己到底是不是這樣的人。

我在工作前3年其實如履薄冰,感覺自己什麼都學了,但去了公司發現什麼都不會,懷揣著自我否定一點點完成別人佈置的任務,直到工作5年以後才有一種醍醐灌頂的感覺,理解了自己做的是什麼,接下來要學習哪個方向,以前學到那麼多東西究竟是怎麼串聯起來的,這是一種打通任督二脈的滿足感。

等到工作8年之後,才真正開始回頭看Java語言,對以前煩厭欲嘔的Java基礎提起莫名的興趣,同時喜歡看書,寫案例,嘗試閱讀別人的原始碼等等,此時我才真正有自己一隻腿邁進Java領域的意識。

同時,在工作中會對許多能力一般但溝通較為偏執的同事產生抵觸情緒,我有時會認為這是一種大人看小孩耍脾氣的感覺,這個只有在工作多年之後才會產生,作者很準確的闡述出了我描繪不出的這種解釋。

同樣的,我認為在這個成長的過程中,我一定也成為過別人心中眼高手低的人。

我在這裡能分享給大家的經驗就是,在工作中多學習少爭論,多和厲害的人走近一點,虛心把對方的東西都學過來,長此以往你會進步神速,這不是你在網上學習能得到的,一定是在工作中。


4、高階Javaer都有過的想法

這裡我為什麼專門畫出來,因為很多高階javaer一定有過類似的想法,就是發現了Java並不擅長做並行程式設計,是否可以用其他語言來完成,而Java只做他自己擅長的事。

至少我以前就想過,可現實層面我認為是異想天開的,尤其是工作中,基本都是團隊開發,這種想法就已經幾乎被pass掉了,同時為了某一個領域的實現專門引入一門程式語言甚至體系,得不償失,畢竟Java不擅長但卻成熟,光是網上賣課郎告訴你的就有N種諸如《Java千億級高並行解決方案》、《Java萬億級電商實戰》等等這樣的受用終生的鬼東西。

而你辛辛苦苦跟著學完後,發現瑪德用不上,就像你學了《九陰真經》後以為可以當武林盟主最終卻進了鐵匠鋪,而鐵匠鋪老闆還不想聽你鬼扯只想讓你每天加班多打幾把武器。

圖片中我還畫了個圈,我想不少人應該知道這門語言,還蠻有名的,就是國內不太火,這有程式設計歷史因素在裡面,其實還有一門語言也蠻適合的,而且這幾年也挺火,我想你也猜到了,我覺得5年+的Java工程師都應該關注甚至學習一下。


5、我和大佬不謀而合

這是接近尾聲的部分了,也是這位作者熟悉的筆法,發洩完自己的情緒後又開始對Java的某新版本極盡讚美,典型的被PUA了。

但不得不說,Java8我也認為是革命性的版本,在這個版本釋出以前,作為Java工程師你甚至不會想到它敢做到這個地步,就像布魯斯書中講的,這是史詩般的魔法。

你可以在Java8的版本里發現一些其他語言的影子,這沒什麼,天下語言一大抄,發展到一定程度,已經是避免不了的趨勢了。

重要的是,這個版本給Java上油了,為後續的版本提供了活力,而Java17作為官方長久支援版本的其中一個非常重要的版本,你可以發現有其他框架給它背書,比如SpringBoot3只支援Java17,而Jenkins也宣佈在新版本放棄Java8並且該團隊更推薦Java17,IDEA後續新版本可能也會放棄Java8,這明顯就是小圈子,有利益的勾連,但對Java本身發展不是壞事。

所以,Java8的核心技術點最應該學習,如果現在還一點不會,趕緊學吧,我認為這是後續版本的基礎了,lambada表示式、stream流不必說了,是Java8版本的核心技術,CompletableFuture作為Java8並行程式設計中最大的改進要花時間好好學習,這也是本書作者所提到的,而且後面專門花了一個大章來講CompletableFuture。

作者雖然一直強調不要使用並行,但卻對Java8的並行程式設計工具花了較大篇幅,我個人認為他更多的是一種見獵心喜,可是我們面試經常會問到這個工具類相關的東西,看一下大佬對該工具的理解還是很有用的。


總結

《On Java》這本書說實話,我覺得沒有作者的《Thinking In Java》寫得好,可能有多種原因導致。

我說下我覺得不好的主要感受在哪裡,一是有些地方翻譯的不好,會給你帶來困惑,二是作者給出的一些案例有自己的風格,而且例子我沒覺得那麼通俗易懂。

但總體上還是值得一看,尤其是他穿插了很多和其他如C/C++、GO等語言的比較,還包含了自己對Java的理解,尤其是一些程式設計思想很直接,最後給出了林林總總有接近70條的程式設計指南,我認為對於初學者樹立未來工作中的程式設計思想是很有用的。

這位作者的文字中瀰漫著一股濃烈的不推薦使用並行程式設計的味道,我覺得是他多年工作的心得,所以大家在往後的工作中不妨可以借鑑下大佬的思維。

好了,我今天也就是帶你讀了下書,讀的還開心嗎。



本人原創文章純手打,覺得有一滴滴幫助的話就請點個推薦吧~

本人長期分享工作中的感悟、經驗及實用案例,喜歡的話也可以進入個人主頁關注一下哦~