EclipseからIntelliJへの移行で準備したこと/困ったこと/良かったこと

[ラクス Advent Calendar 2016](http://qiita.com/advent-calendar/2016/rakus)の3日目です。
昨日は@joooiさんの[「ChromeCustomTabs試してみました」](http://qiita.com/joooi/items/ad761884426a48d47e7e)でした。

今年、私のチームはEclipseからIntelliJ IDEAに乗り換えました。
年末だし良い機会なので振り返ってみたいと思います。

## 前提

- 業務でIntelliJ IDEAの使用経験があるメンバーはいない
- Windows7のローカル開発環境でTomcatを立ち上げて開発
- Java8を使用

## ①準備したこと
本当は提案フェーズがありますが、それは別の機会に。
まず自分が人柱になり使い始めて、手順がある程度固まったタイミングで他メンバーに順次使い始めて貰いました。

### ハンズオンに参加
私自身はプライベートでGo言語を書くのにCEを使ってましたが、知識不足感は否めなかったのでハンズオンに参加しました。
実際にIntelliJ IDEAを触ってみて便利さを再実感しました。
サムライズムさんには大変お世話になりました。

### 事前検証
皆が使い始める前に必要な動作確認を一人で実施しました。
意外とネット上に情報が少なく（そんなことない？）、Tomcatを動かすまで一苦労でした。
（特にEclipseに無いFacetsとArtifactsの概念が取っつきにくかった）

### 設定手順を作成
既に導入済みのチームから手順を共有してもらい必要な箇所だけ修正して再利用しました。  
こういう時に隣のチームが何を使っているかを知っておくことは重要だと思います。

手順は必須のものと、推奨するものを明確に分けて書いています。

＜必須の設定＞

- importでワイルドカードを使わせない設定（Editor > Code Style > Java > Imports）
    - デフォルトの自動importでは `*` が使われるがチームのコーディング規約と合わないため変更
- importするパッケージの並び順を指定（Editor > Code Style > Java > Imports）
    - Eclipse時代と順番を合わせないと修正の度に余計な差異ができるため設定
- 新規ファイルの改行コードをLFに変更
- propertiesファイルの変換設定（Editor > File Encodings）
    - デフォルトはUTF-8ですが、我々はnative2asciiが必要なので、`Transparent native-to-ascii conversion` にチェックON

推奨設定は上げたらはキリがないので、行番号表示（Editor > General > Apperance > Show line numbers）やメソッド間に区切り線を入れる（Editor > General > Apperance > Show method separators）ぐらいにして、後は便利そうな機能を見つけたら都度共有することにしました。

### Gradleを導入
IntelliJとは直接関係ありませんが、このタイミングでGradleも導入しました。
後から知ったのですが、build.gradleに`apply plugin: 'war'`や`sourceSets`など記述しておけば、大部分の設定は手動でやる必要がありませんでした。
ここら辺の知識が最初からあれば、手順作成に無駄な時間を費やすことがありませんでした。
初期セットアップや設定を壊した場合にGraldeをRefreshすれば元に戻せるのですごく楽になりました。
今からmavenという選択肢はありませんでしたが、mavenでも同じように出来るかもしれません。

## ②困ったこと

### TomcatのOutput表示が文字化けする

TomcatのVM Option に`-Dfile.encoding=UTF-8`を指定しましたが、
IntelliJ上でのOutput表示が文字化けするので、更に下記の2ファイルに`-Dfile.encoding=UTF-8`を追記が必要でした。
IntelliJのバージョンアップのたびに書き換える必要があるので、何とかならんかなと思っています。

```
${IntelliJのインストールフォルダ}\bin\idea.exe.vmoptions
${IntelliJのインストールフォルダ}\bin\idea64.exe.vmoptions
```

### ソースコードの変更が反映されない

ソースコードは修正してるはずなのに実行すると反映されていない問題にかなりハマりました。
原因は`src/main/webapp/WEB-INF/classes`にEclipse時代にコンパイルしたclassファイルが残っており、Gradleのコンパイル結果よりもこちらのファイルが優先されているようでした。フォルダごと削除することでうまく動きました。

### .ideaフォルダの管理
必要なファイルを選別してリポジトリ管理しようと考えたが、管理しきれそうもなかったので途中から.ideaフォルダ自体を`.gitignore`対象にしました。

## ③良かったこと

すでに書き尽くされていますし目新しいことは無いとは思いますが、社内の人に良く聞かれるので導入して良かった点を書いておきます。
Eclipseもバージョンアップにより進化しており、最新のEclipseとの比較という訳ではないです。

### 操作性の高さ

- ショートカットの豊富さ

GUIのアプリで、これほどキーボードで操作できるものは無いんじゃないでしょうか。
Help > Keymap Referenceでチートシートをチーム内に共有しました。

Alt+数字で対応するツールウィンドウを開いたり、Ctrl+Tabでswitcherを表示は良く使います。

![switcher.png](https://qiita-image-store.s3.amazonaws.com/0/387/843688c9-843d-145b-390f-c748d59f5002.png)


- アクション検索
`Ctrl`+`Shift`+`A` でアクション検索が出来ます。検索結果のポップアップから設定まで出来てしまうのは凄い。

- どこでも検索できる
検索窓ないところでも、とりあえず文字を打ってみると検索できることが多いです。
設定方法が良く分からないことでも、設定画面でキーワードを入れて検索してみると設定項目へ飛べることが多いので大変便利です。

- IntelliJだけで作業が完結できる
大概のことはIntelliJ IDEAだけ出できてしまいます。
以前よりpgAdmin IIIを起動することは減ったし、Source Treeは完全に使わなくなりました。
特に、Database連携の下記の点が気に入っています。

   - SQLでも入力補完してくれる
   - SQLの構文チェックをしてくる
   - サブクエリーの部分だけとか、柔軟にSQLを実行できます

   ![select_statement.png](https://qiita-image-store.s3.amazonaws.com/0/387/3eb73a11-52e1-de31-d887-7fc3b52247f3.png)

   - 2016.3からはpg_dumpが取れるようなり、益々便利に
   - 接続先ごとに最後のSQLエディタの状態を覚えていてくれるの地味に便利

Git連携もかなり便利です。コマンドでしか出来ないこともIntelliJ内のターミナルから操作可能なのでIntelliJから離れることなく操作可能です。

- コンテキストを考慮した入力補完
型から変数名の候補を出してくるのが凄く便利で、変数名を手打ちすることは少なくなりました。
`Shift`+`Ctrl`+`Space`のスマートコード補完で文脈にあった選択候補が選べるのも超絶便利です。

- Java8補完も強力
rambdaとかstreamとかJava8の文法への変換もサジェストしてくれます。

- propertiesファイルの扱い
native2asciiが必要なプロパティファイルも普通に検索できるし、使われないキーも教えてくれます。

- 重複コードを見つけてくれる
クラスを跨っていも、重複したコードがあると教えてくれます。
そのままリファクタリングまで可能です。

- スペルチェック
スペルチェックしてくれるだけでなく、`alt`+`Enter`で修正候補をサジェストしてくれるのは便利。
![spell_fix2.png](https://qiita-image-store.s3.amazonaws.com/0/387/016b19b4-947f-fe31-abad-2a6b913121f0.png)

- ソースコードの静的解析
デフォルトでもかなりのチェックが入っている。`alt`+`Enter`からソースの修正まで可能。

- クイック定義確認（`Shift`+`Ctrl`+`i`）
ファイルを開かずに呼び先のコードの内容が見れるのは便利。
![Quick_definition.png](https://qiita-image-store.s3.amazonaws.com/0/387/e7cfbe67-8aed-49c2-2cfc-3a730158eddf.png)

- マルチカーソル(`Alt`+`j`）
Sublime Textのようなマルチカーソルにも対応している。
![multi_cursor.png](https://qiita-image-store.s3.amazonaws.com/0/387/d32ce494-6d34-b58e-d351-80c1ba5f61ae.png)

- シンボルへジャンプ（`Ctrl`+`Shift`+`Alt`+`N`）
変数などのシンボルを検索できる。
![navigate_symbol.png](https://qiita-image-store.s3.amazonaws.com/0/387/5df5d6e5-9136-8c38-1fc3-13b29f06d43a.png)


- どこでも検索（`Shift` × 2）
Search Everwhere、文字通りどこでも検索してくれる。
![search_everywhere.png](https://qiita-image-store.s3.amazonaws.com/0/387/f36c4419-2b92-ebf9-5ccf-88eda5a6bb9e.png)

- リファクタリング機能も賢い
   - コメント内やリテラル内まで置換してくれる
   - メソッド切り出しでもローカル変数をうまいことやってくれる

ダメだ、書いているとキリがないのでここら辺でやめておきます（笑）

導入効果を定量的に出すのは難しいですが、以前より楽に、速く、気持ちよく、正確なコーディングできているのは間違いないです。
これからIntelliJを導入する方に少しでもお役に立てたら幸いです。