21 September 2014

今年初以來,我們團隊就一直在轉換新的開發環境,按部就班的從 Maven 轉換到 Gradle升級到 Java 8、升級 Cassandra CQL、更新新的 code style、導入 Vagrant... 等等。每一次的升級都讓我們的開發更為進步,更加順暢。而今年最後一次的升級正在進行中 -- 從 Eclipse 轉換到 Intellij IDEA。

轉換 IDE 相當困難

我個人已經用 Eclipse 十年了吧,要把長久以來身體的記憶換掉不是件容易的事。如果你沒什麼再用 IDE,專門用 Vim,那你可以想像自己切換到 Emacs 會有多難。這不是辦不到,只是要很有決心,要有足夠的理由,轉換才能成功,才有意義。

我們團隊在今年初就一直想切換到 Intellij 族系了,期間雖然有斷斷續續在嘗試,但都只是玩玩而已。轉換 IDE 很困難的,所以我比較希望能一次解決,長痛不如短痛。因此熬到了九月,時機才算成熟,可以開始正式轉換。

Pair Programming

如果你是 solo 開發者,或是你們的團隊間開發規定比較疏散,那麼用什麼 IDE 其實是隨自己爽的,愛什麼時間換就什麼時間換。我們的團隊比較特殊,我們有採行 pair programming,所以大家用的開發環境要求完全一致,而快速鍵的設定也得統一才行。不然換個電腦、換個 pair,寫程式時就會變得 卡卡的,節奏會整個慢下來。也因為不能漸進式的一人一人的轉換,要一口氣大家一起轉,所以時機和誘因變得很重要。

外部轉換的誘因

  • Google Android 開發團隊已經講明了,未來新功能只會加在 Android Studio 上,Eclipse ADT 只會做維護。所以到了某版的 Android 之後,是非轉換 IDE 不可了。
  • Android Studio 目前版本 0.8.x ,相較於年初不穩定的狀況,現在已經好很多了,可以上戰場正式開發
  • Intellij IDEA 早在三年前就推出了免費且 Open Source 的 Community Edition,功能也很完整。轉換頓時少了個很大的阻力。
  • 如果你有在追 IDEA 近來幾版的演進,你會發現相較於 Eclipse ,他們的改進比較多比較快,支援的語言種類很豐富,而新加的功能也比較新穎。Eclipse 這幾年幾乎沒什麼變化了。在軟體業,停滯就是一種退步。
  • Intellij 有出 AppCode ,可以取代 Apple 的 XCode 進行 iOS 的開發,我們已經用了一年,的確是相當出色。AppCode 與 Android Studio 兩個都是 Intellij 同一系列的產品,用起來相當的一致,降低學習與訓練的成本。

Android Studio + AppCode + Intellij IDEA Community Edition 這組合從 mobile 端到 server 端,整個開發套餐是統一的。開發團隊不用因為換到不同的開發任務,腦袋和身體就要將思考模式和快速鍵記憶做硬生生的轉換。如果團隊也有開發 web 的話,Intellij 也有 WebStorm 可選。這樣下來,整個開發環境都是連貫的。不僅管理簡化了,而開發者只要專心在程式語言,以及需求的問題上就好,開發效率也會提升。

內部轉換的誘因

  • 在挑選工具時,我通常優先選擇跨平台的,這算是個人理念上的堅持。而 Intellij 的產品基本上就是 Java,三大 OS 平台都 OK,非常好。(AppCode 沒辦法囉,iOS 本來就不能在 Mac 以外的 OS 上跑)
  • 前兩個月我們花了一些時間將我們複雜的大專案從 Maven 轉換到 Gradle。採用 Gradle 後我們的 Android 專案就可以換到 Android Studio 開發了。
  • 我們團隊正值 PC 切換到 Mac 的過渡期。過去幾年我們統一使用 PC layout 的快速鍵配置來開發 app,不論開發機是在 PC 或是 Mac 上。到了今年年中我們的開發機全部轉換到 Mac 了 (包含員工私人的筆電也全都是 MacBook 了)。因此可以正式放棄 PC layout 的鍵盤配置。突然間換到 Mac 鍵盤 layout 其實也是很痛的。我們選擇連同 IDE 在一同時間轉換,要痛就痛這麼一次吧。

我想我們內部轉換的誘因並不適用於各位,當做參考就好。

那麼,轉換後的風景如何?

  • Android Studio is fucking slow!
    在開發模式下,build apk 一次的時間快一分鐘,相比 Eclipse ADT 只要十幾秒真是差太多了。雖然之後會越來越好,但這部份 Google 的進展太慢了,實在是很遜。這也讓我們的 Android 開發變慢。
  • 卡彈啊!卡彈!
    轉換到新 IDE 的兩個禮拜內,寫程式就像拿到一把不斷卡彈的機槍,寫寫停停、寫寫停停。三不五時就要停下來翻快速鍵小抄,直到用身體記住為止。兩個禮拜能回復全速算快的了,像我自己就大概要一個月吧。
  • Intellij 最笨的地方
    相較於 Eclipse,Intellij 少了一個我認為很重要的功能,就是 IDE 不會即時回饋程式不能 compile。在 Eclipse 裡,你隨便把 method 改個名,Eclipse 馬上會在呼叫端的程式碼上標紅叉。但是在 Intellij 裡,你必須手動 Rebuild Project 才行 (Make Project 沒用)。我覺得這缺點實在太糟糕了。
  • Eclipse 和 Intellij 各有優缺,沒有說一方是完勝的
    Eclipse 強在即時 compile 回饋,還有那無所不能的 Quick Fix Ctrl + 1。Intellij 則有 instant completion、postfix completion 讓你寫起程式有如行雲流水,以及更好的 Java 8 Lambda 支援。兩者的關係比較像是 Android vs. iPhone 吧,要比的話是吵不完的。
  • IDE 全部用同一家的真不錯
    開發來回在 iOS, Android, Server 間切換很順啊,快速鍵不會打架了。我們公司還有用 Dart,DartEditor 本質上就是 Eclipse,所以現在變成切換到 DartEditor 開發時就很痛苦。怎麼辦?把 DartEditor 的所有快速鍵全改成跟 Intellij 一樣啊!多少減少一點切換的負擔。

我上面都在一股腦地抱怨 Intellij ,但轉換如果不會痛就不是轉換了。隨著熟練度提升,我想這情況再過個二、三週就會好很多,因為現階段我的速度已經回復了不少。未來學會 Intellij 上更多的新招式後 (例如神奇的 multiple selections),開發速度我想會比 Eclipse 快一點。

我們花的時間比一般的純轉換 IDE 還長,因為我們連 keyboard layout 也跟著一起換。PC layout 的快速鍵只有運用 ctrl, alt, shift 三個。而 Mac layout 多了一個 command 鍵,有些組合鍵一次就要四顆鍵同時按,手都按到快抽筋了,這得練習久一點。

我也應該轉換到 Intellij 族系嗎?

你可以參考我列出的轉換好處,然後像我上面一樣列出自己轉換的誘因,看看足不足夠為轉換的動機。如果你的狀況不甚符合,然後也沒什麼其他誘因,那你的轉換時機還未成熟,那麼繼續用 Eclipse 也無妨。Eclipse 也是很成熟的產品,可以勝任所有的任務,沒有說非換不可,頂多少了些很炫的功能。當然如果你是新手,或是才剛用 Eclipse 幾個月,那我個人建議可以直接用 Intellij,不用再考慮。

你也可以去試用 Intellij IDEA 看看,但我會說試用的時間如果太短其實沒用,你反而會一直抱怨 Intellij 怎麼少了 Eclipse 某某功能,很難用之類的。留下錯誤的印象反而扼殺未來轉換的動機。要試用的話就試用個二週以上,然後期間不要碰 Eclipse,這樣才能去除偏見,玩得出 Intellij 的醍醐味。

最後,建議轉換的話不要用 Intellij 提供的 Eclipse 相容的快速鍵模式,而要學習 Intellij 的原生快速鍵。這就像是你不該在 Javascript 裡用 Java 的程式的撰寫風格一樣,每個生態系都有自己的哲理,要深入學習才能真的了解。Eclipse 相容快速鍵是給那些同時混用兩種 IDE 團隊使用的,但我個人覺得除非必要,同個團隊內混用多種 IDE 很沒效率啦,不太建議。

VimIdea Plugin

Intellij 有 Vim 的 Plugin,能讓你在 IDE 內使用簡單的 Vim 模式。我並不是 Vim 派系的開發者,但是基於某個原因,我被迫實驗混搭 VimIdea 進行開發。原因是 MacBook 的方向鍵太小很難按,而 page up/down 要配上 fn 鍵才有,也是很難按。為了提升程式碼間 cursor 移動的效率,我裝 VimIdea 來使用 hjklwb 鍵來移動 cursor。當然 Vim 模式帶來的不止這些,像是 vi" 啦、ciw 之類的指令也是寫程式時的好幫手。

搭配 VimIdea 的運用我還在實驗中,但加上這個額外的 plugin 又讓我轉換的時程更長了一點,真是有點自找苦吃。目前的心得是 cursor 的移動快很多,手不用移到鍵盤外去按那小小的方向鍵真是不錯。不過 Intellij 的 refactor 模式跟這個 plugin 會衝突,你得先進入 Vim 的編輯模式後,再啟用 Intellij refactor 模式才行。感覺有點像是電影全面啟動那樣,一層一層的進入。

題外話:我個人不太喜歡買 Apple 的產品,十年來也都是一直用 Linux 過日子。不過為了適應這次公司的轉換,新的筆電只好選 MacBookPro。這 MacBookPro 用了快一個月了吧,雖然開發上沒什麼問題,而且 Apple 的東西都是幫你弄的好好的,不用煩惱什麼。但我還是覺得 Linux 比較好,儘管 Linux 上的整合都是破破的。我想這是因為在 Linux 裡有一種獨特的自由感吧,對我來說這無可取代。嘛,有些人就是特別討厭被拘束。

小結

轉換到 Intellij 其實有很多技巧要學,但本文就不提那些了,因為網路上很多文章都整理的更好,我怎麼寫也寫不過那些好文。所以談比較多為什麼要轉換,和轉換後遇到的問題。我們的經驗比較特別,因為包含了轉換到 Mac 鍵盤配置。

Eclipse 沒什麼不好,只是 Intellij 未來會逐漸變成主流。根據國外的統計,Eclipse 仍然是最多人用的 Java IDE,達 48 %,而 Intellij 則成長到了 33%。Intellij 成長速度極快,也許再過個兩年就超越了。這是 Java 人遲早都會遇到的挑戰。


回響

可以用 Tag <I>、<B>,程式碼請用 <PRE>