天天看點

從 PHP 到 Java

前言

最近主要程式設計語言從 PHP 轉到了 Java。這一個多月的經曆對我很有意義,是以寫文章記錄一下。

程式設計語言各有側重,它們之間的比較沒什麼意義,是以本文隻寫一下我對兩種語言的看法,以及我轉到另一種語言的經曆,再分享一下最近學習 Java 的心得體會。

開始

PHP

說來人生際遇無常,因為從小會幾手 PS,直到大學,我的人生規劃都是做一個平面設計師。大四時由于畢業和女朋友的壓力,最終才入了程式設計的坑。幸好專業是計算機,應付考試的同時,學習專業課也為程式設計打下了一些基礎。現在看來,以我的直男審美,第一批被阿裡的魯班這樣的人工智能替代的人中就有我。

學習過程中的雞湯不再潑灑,這裡必須誇贊一下 PHP 非常平緩的學習曲線。文法簡單能讓人快速入手,解釋性語言的特性也讓人更易于了解,而且做出些什麼産生的成就感會讓人更願意去學習。不過 PHP 是一個易懂難精的語言,前期使用它進行簡單的開發很容易,中期需要學習 MySQL、Redis、Nginx 等知識,後期更是要了解架構、性能優化、C擴充等技術,是以 Web 靠 PHP 叩門真不是一句玩笑話。

每種程式設計語言都是完備的,PHP 在各個領域都能有所發揮。我用 PHP 做過支付,也用 PHP 做過背景多程序開發,還有用 PHP 做遊戲服務端的,PHP 快速開發快速部署的特性完全契合靈活開發的思想,節約了開發人員大量時間,對一些公司來說,快速開發意味着市場,意味着生存。

轉變

當然各個語言都有自己擅長的領域,PHP 适合靈活開發、Web 快速疊代,可是面對純後端的高效率需求卻有點捉襟見肘,效率真的是硬傷。出于對後端網絡程式設計、并發程式設計的興趣,我開始考慮換一種編譯型語言。雖然說到了架構師、技術專家的層次,各個語言意義不大了,但其中的過程還是必須要考慮的。

由于 PHP 是純粹的 C 系語言,我原準備繼續學一門 C 系語言,跟 PHP 互補,我在 PHP 調用 Go 服務的正确方式 一文裡也提過,我的選擇是 Go。後來,我也寫了一個小項目(Gotorch)來練手,也有 Go 為主題的幾篇文章。Go 确實是一門非常适合 PHPer 轉的語言,天生适合并發,高效率,語言也很簡潔。

但是世事難料嘛,剛好公司有比較好的工作機會,面試通過後就這麼來了,這邊的主要開發語言是 Java,我也隻好緊跟大家的步伐,上了 Java 的車。不過組内也有 Go 語言的項目,希望能有機會繼續了解 Go。

過渡

從 PHP 換到 Java,确實有很多地方不适應,雖然大學時也學過 Java,可是已經忘得差不多了,況且寫小 Demo 和工業級開發是完全不同的,說說幾個轉變的點:

強類型:從弱類型到強類型語言,意外地過渡得非常自然,可能因為之前寫了些 Go 和 C,使用強類型語言并沒什麼不适應,反而因為強大的 IDE 的代碼提示功能,代碼更不容易出錯,編碼更順暢了。

注解(反射):Java 裡注解非常繁雜,類、方法、變量上都是,不光基礎類庫、Spring 架構裡有很多,還可以自己定義新的注解。一開始見到滿屏的 @ 符号,很多功能莫名其妙地實作了,有些頭大,後來慢慢發現常用的也就那麼幾個,學習了用法,又了解了下反射,也就清晰了。

類庫:Java 的類庫非常全,我們需要的功能基本都有人提供,真是 琳琅滿目、亮瞎狗眼。比如僅 Json 相關,在 maven 倉庫裡就可以搜到 2000 多個結果。

類庫多了,一開始使用時更容易一臉懵,連接配接資料庫進行一次查詢有 N 多種類搭配方式,建立一個線程有好多種寫法, 而且各個 Java 版本都會添加一些文法糖。用哪個方法都行,又沒有一個權威訓示的話,反而很難讓人很難決定。

部署:項目的部署是讓我最難适應的,小小的改動就需要把所有代碼打成 jar/war 包,動辄幾十M 再上傳到遠端伺服器上測試,如果有一點錯誤,又需要重來,非常蛋疼。而且部署架構有 maven/gradle,使用什麼包,每個包需要注意什麼,也要學習适應。

生态:我認為 Java 很大的一個優勢就是生态,當然适應成本也高。有各種架構群組件需要學習,如 web 架構 spring系列、資料庫架構 mybatis、日志架構 log4j2,測試架構 spock,JVM語言 groovy 等等,每一種學習都需要花費很多時間。

幸運的是,部門對代碼的要求很高,累積下來,讓我有很多優秀的源碼可以看,可以模仿;同僚們也非常樂于助人,我有問題時甚至都追着解釋;利益于 Java 生态,網上也有很多工具和經驗能幫我簡化繁雜的操作。是以入門雖然累,但也還算平穩。

經驗

一個月多來,感覺自己勉強入門了,雖然還有很多東西不熟悉,甚至都沒有接觸過,但不再是之前的一頭霧水,面對小問題也一臉茫然了。是以我覺得也有必要做一個小小的總結,不僅有利于自己進步,最好也能幫其他 Java 新人少走一些彎路。

IDE

首先要說 IDE,一個好用的 IDE 可以幫你提示代碼、解決依賴、代碼追蹤、檔案搜尋、部署運作,毫不誇張的說,一個好的 IDE,能讓你省一半的時間。

這裡我推薦 jetBean 公司的 IDEA,首先 jetBean 針對各種程式設計語言,有一系列的 IDE,如果你之前使用過他們的産品 ,現在換成 IDEA 沒有任何不适,當然,以後再使用别的産品也很輕松。

當然 jetBean 的産品都是收費的(雖然也有經過功能閹割的社群版),如果你認識在讀的同學或教師,可以借用一下他的 .edu 郵箱申請學生或教師賬号,詳情可以看連結: 學生授權申請方式,如果資金無壓力的話,還是支援一下正版,買一個比較省心。這裡還有個IDEA使用教程:IntelliJ IDEA日常操作, 能幫你盡快熟悉 IDEA。

部署運作

接下來是部署運作的問題了,隻要代碼能快速運作得起來,我們就可以對代碼進行調試,慢慢掌握其他的開發技術。

部署運作要解決類庫依賴問題,首先我們要知道我們需要哪些依賴,這個我們可以在 mvnrepository.com 查詢自己需要的類庫,點進版本号可以直接複制 maven/gradle 等依賴工具需要的語句。

部署架構推薦 gradle,易學易配置,對新手很友好,自己花半小時使用它配置一個 demo 後就能用起來了。使用時,查到依賴後隻需要在配置檔案中添加一句 compile domain:lib:version 就能使用 IDEA 的 Auto-Import 功能自動把 jar 包導入進來了。

運作代碼一般有以下方式:

自己寫 psvm 方法,自己寫小 demo 時可以使用;

使用 gradle/maven 打包部署在 tomcat 中運作,使用 spring boot 等架構時可以使用;

使用 spock 等測試架構來運作,比較靈活,像測試一樣提供多個 case 運作程式;

推薦學習使用 spock,文法簡潔,還可以省去不必要的打包時間,快速調試,可以在 IDE 裡一鍵運作。

Java 文法

至于 Java 文法的學習,我認為是最不需要着急的,它需要代碼經驗的積累,不是幾天就搞得定的。

學習一門語言最好的方式就是閱讀源碼了,可以是開源項目,也可以是業務代碼。閱讀源碼時,可以總結一下在什麼時候使用哪種資料結構,面對什麼樣的資料結構時使用哪種文法最有效率、代碼可讀性最高。

然後是多寫,自己經常寫一些小 demo,想到什麼有意思的東西就動手去實踐,遇到有疑問的地方也要自己寫代碼試運作來驗證一下。

總結就是多讀,多寫,多問,多查。

小結

既然入了 Java 的坑,那麼後續會多研究一下 Java 的技術,實作一些工具時也盡量使用 Java,歡迎大家繼續關注。

新的一年,新的一輪折騰,這下算是徹底走出了舒适區了,新的語言、新的業務、新的部門,總之生命不息,折騰不止。順便寫下今年的計劃吧:滿足工作需求之外,10+ 本技術書籍,25+ 篇技術部落格,1+ 個開源小項目。

從 PHP 到 Java

最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要擷取這些内容的朋友請加Q君樣:909038429

/./*歡迎加入java交流Q君樣:909038429一起吹水聊天

下一篇: json2