1.
我不能算是一個(gè)Java程序員,因?yàn)樽饕粋€(gè)合格的Java程序員要熟悉各種通用框架,而我工作的8個(gè)年頭里真正開始用Java編碼和調(diào)試卻始于我的第二任雇主介粘,做嵌入式Android的移植和Debug喷鸽,甚至連APP都很少寫乐设。但卻由于對(duì)Android框架調(diào)試時(shí)的耳濡目染讼庇,對(duì)Java各種設(shè)計(jì)模式和思路也就漸漸的熟悉了起來。
雖然大學(xué)4年有一整個(gè)學(xué)年都在學(xué)Java近尚,但由于我最初的崇拜是C/C++蠕啄,對(duì)Java都很不屑。直至今日戈锻,工作和業(yè)余能用C++寫的絕不用其他語言歼跟。但是這幾年Windows的衰敗以及Linux、嵌入式格遭、Mac的崛起哈街,讓我對(duì)Java的看法有了很大的轉(zhuǎn)變。
2.
相信每一個(gè)程序員的成長過程中拒迅,都糾結(jié)過該專注于哪門語言骚秦。各種業(yè)內(nèi)新聞也為了博得眼球而故意挑起了各大語言的爭戰(zhàn)。類似于Java的沒落衰敗璧微,將要被取代作箍,甚至還有鼓吹Python要替代Java成為服務(wù)端首選語言之類的偏見報(bào)道不計(jì)其數(shù)。我由于當(dāng)年在微軟實(shí)習(xí)接受過.Net的洗腦往毡,甚至一度認(rèn)為.Net不遠(yuǎn)的將來就會(huì)替代JVM蒙揣,C#也將替代Java成為最流行的跨平臺(tái)語言靶溜。后來時(shí)間證明了微軟的尾大不掉开瞭,谷歌帶領(lǐng)著開源社區(qū)將閉關(guān)鎖國的微軟和蘋果兩家企業(yè)踩在了腳下,成功將Java再次推向了神壇罩息。事實(shí)證明了不要錢的開源的才是最容易深得人心的嗤详。言外,在Java撫養(yǎng)權(quán)爭奪戰(zhàn)中瓷炮,谷歌生了個(gè)二胎Kotlin葱色,但畢竟依然是同父異母JVM的親兄弟,就將Java和Kotlin看成是一國的吧娘香。
3.
我路轉(zhuǎn)粉的原因苍狰,并非是被Java(Kotlin)語言特性之類的宣傳折服。因?yàn)樵谖铱磥砗嬲溃瑳]有什么語言特性是完美無缺的淋昭,C++雖然也經(jīng)常被人所詬病,但用起來順手安接,沒有什么是不可接受的翔忽。最多也只能說對(duì)新手不友好罷了。Java最強(qiáng)大的魅力在于他的完美跨平臺(tái)的特性,這是沒有任何語言可以替代的歇式。我在這幾年為雇主公司戰(zhàn)略選型時(shí)候驶悟,調(diào)研用過了多種平臺(tái)組合:
C# & .Net雖然也鼓吹了自己的跨平臺(tái)特性,但可笑的是至今都不支持ARM平臺(tái)材失,非Windows系統(tǒng)的移植進(jìn)程也慢之又慢痕鳍,兼容cocoa以及l(fā)inux平臺(tái)的開源.net幾年過去了依然無法開箱即用。微軟真該考慮換帥了龙巨。要不是有個(gè)Mono的死忠社區(qū)额获,我想.Net現(xiàn)在早已經(jīng)從地球上消失了。
以QT為首的各大跨平臺(tái)GUI框架恭应,也可以說是烽火一時(shí)抄邀,畢竟他們都是可以用我最熟悉的C++編碼。但當(dāng)我在為Arm平臺(tái)移植QT而編譯了幾十個(gè)G的代碼昼榛、為QT做優(yōu)化的時(shí)候境肾,我就已經(jīng)開始懷疑人生了 -- 整套QT源碼和Android框架有啥區(qū)別呢,為什么我要費(fèi)這么多時(shí)間去移植優(yōu)化一套沒人優(yōu)化的QT而放棄了Android已經(jīng)移植優(yōu)化好的框架呢胆屿?而當(dāng)我又嘗試在我的Mac上用QT寫通用工具時(shí)候奥喻,我再一次的懷疑起QT的必要性,過時(shí)的GUI控件非迹,跨版本甚至無法兼容的庫环鲤,無法交叉編譯,跨平臺(tái)我甚至還得要找到一臺(tái)目標(biāo)機(jī)才能編譯和調(diào)試憎兽。最終一狠心冷离,建議老板還是放棄QT吧。
當(dāng)然很多人喜歡Python纯命,python的開箱即用的特性確實(shí)讓我很感動(dòng)西剥,很多C++需要寫幾百行的功能,Python一兩行就搞定了亿汞,也得益于開源社區(qū)工程師的經(jīng)驗(yàn)積累瞭空,python的很多抽象方式依然值得我在C++、Java上借鑒和學(xué)習(xí)疗我。甚至公司某一年的項(xiàng)目我直接帶著團(tuán)隊(duì)用Python開始做咆畏,也正是因?yàn)樵擁?xiàng)目,讓我感受到了Python的很多不足吴裤。Python最大的問題就是他的解釋性運(yùn)行方式旧找,一個(gè)經(jīng)驗(yàn)豐富的Python工程師是可以用最好的架構(gòu)和邊編碼邊編寫單元測試用例來規(guī)避該問題,但是你沒有辦法控制整個(gè)團(tuán)隊(duì)都經(jīng)驗(yàn)豐富嚼摩。寫到項(xiàng)目最后钦讳,已經(jīng)讓我無法整合他人的代碼了矿瘦,很多新手寫Python單元測試的覆蓋率不足50%,很多的代碼邏輯在開發(fā)時(shí)候走不到愿卒,卻在測試運(yùn)維時(shí)候走到缚去,然后崩潰了,后期Debug的代價(jià)相當(dāng)?shù)拇笄砜芏嗟腷ug都是非骋捉幔可笑的語法問題,而這些問題在編譯性語言的編譯階段都能完美的規(guī)避檢查掉柜候。所以我非常不建議使用Python來做大型團(tuán)隊(duì)項(xiàng)目搞动。
4.
最終,調(diào)研了一圈比較流行的跨平臺(tái)方案后渣刷,重新拾起了一直不被我看好的Java鹦肿,才慢慢發(fā)現(xiàn)了他的諸多優(yōu)點(diǎn)。JRE完美跨平臺(tái)特性辅柴,一次編寫隨處執(zhí)行箩溃,JNI調(diào)用Native c/c++編寫的庫也能很有效的規(guī)避了性能問題,最關(guān)鍵的是其穩(wěn)定性碌嘀,開源社區(qū)的多種框架涣旨,UI的統(tǒng)一,大部分的系統(tǒng)都默認(rèn)安裝了JRE股冗,也極大的方便了項(xiàng)目的部署霹陡。嵌入式平臺(tái)上還有谷歌大佬精心優(yōu)化的ART虛擬機(jī),加上公司這幾年的android框架優(yōu)化的積累止状,很快就能完美的將項(xiàng)目運(yùn)維起來烹棉。之前一直很不看好的windows和osx上jar的后綴,覺得其很小眾导俘,后來發(fā)現(xiàn)網(wǎng)絡(luò)上其實(shí)是有各種工具能將jar打包成exe和app程序的峦耘,配合上當(dāng)下流行的JavaFX的窗口應(yīng)用框架,直接讓我拋棄了.net/mfc/cocoa/gtk之類的框架旅薄,路轉(zhuǎn)粉投向了Java家族的懷抱。