OSSのソースを読む手順とあると便利な機能

- オープンソースのコードを読んでみたいけどどうすればいいのか？
- どんなツールや機能があるとソースコードが読みやすくなるか

と思っている方に私が実践しているやり方を共有出来ればと思います

## コード読む上での手順
1. 読みたいオープンソースを決める（私の場合は[Rails](https://github.com/rails/rails)でした）
2. ローカルマシンにクローンする
    こちらの記事が分かりやすいかと思います。[今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000)

3. 読んでみたいメソッドを決める（私の場合は[blank?](http://railsdoc.com/references/blank)でした）
4. クローンしたソースの中から3で決めたメソッドの実装箇所を探す
5. 処理が理解できるまでソースを読む、調べる（※[私のブログでRailsのソースコードリーディングの手順をまとめているので参考になればと思います](https://blog.shitake4.tech/archive/category/Rails%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA)）


## コードを読むときにあると便利な機能
私がソースコードを読むときに利用している機能は以下の4つになります。

| 機能 | 利用シーン |
| :--: | :--: |
| 検索 | 調べたいメソッドを探すとき |
| コードジャンプ | 参照されているメソッドの実装を読みたいとき |
| ファイル内の指定範囲のコミットログを閲覧できる | どんな意図、経緯で実装されたのか知りたいとき |
| Githubのプルリクエストを読める | どんな意図、経緯で実装されたのか知りたいとき |

基本的には、検索とコードジャンプする機能があるツールを使うと、サクサクと読めると思います
私が読むときに意識しているのは、

- どんな実装なのか？  
- その機能はどんな意図で実装されているのか？  

なので、簡単に検索できたり、気になった機能のプルリクエストが調べられると便利だなと思っています。

私の場合は、RubyMineとGithubをブラウザで閲覧しながらソースを読んでいます  
RubyMineはソースを読むのに非常に便利な機能が多いので、参考までに紹介出来ればと思います（Ruby以外であれば、他のJetBrains製品を使うといいかもしれません）  

## RubyMineで実現できる機能
### 1. メソッド検索
RubyMineの検索機能は高機能で様々なパターンで検索可能です
私の場合は、探したいメソッド名を検索することが多いので ``` def xxx ``` のようにメソッド定義部分を検索することが多いです  

#### 1. プロジェクト全体からインクリメンタルサーチ
``` Command + Shift + F ```　で検索のウィンドウが表示されるので、 in Projectを選択し、検索したいものを入力すれば、プロジェクト全体から定義部分を調べられます
![1.png](https://qiita-image-store.s3.amazonaws.com/0/64171/043604b7-a7d4-4647-bcfb-de217ebbab52.png)

#### 2. 特定ディレクトリ配下から検索
``` Command + Shift + F ```　で検索のウィンドウが表示されるので、 Directoryを選択し、検索したいものを入力すれば、特定ディレクトリ配下から定義部分を調べられます
![2.png](https://qiita-image-store.s3.amazonaws.com/0/64171/a86d5944-655f-2688-6aae-f2f95cb7e850.png)

#### 3. ファイル名をインクリメンタルサーチ
``` Command + Shift + O ```　で検索のウィンドウが表示されるので、 検索したいファイル名を入力すれば、プロジェクト全体から一致するファイルを調べられます
![3.png](https://qiita-image-store.s3.amazonaws.com/0/64171/c1623c01-c423-7b99-ff02-80b476a0f303.png)

### 2. コードジャンプ
呼ばれているメソッドの実装が気になった際に利用しています  
ショートカットキーは、``` Command + B  ``` です  

![4.png](https://qiita-image-store.s3.amazonaws.com/0/64171/ae0d247c-83f4-3f4f-1bc8-6e582f9d1f24.png)

![5.png](https://qiita-image-store.s3.amazonaws.com/0/64171/746dc439-bab6-cc59-c041-4404ac2be2c5.png)


### 3. 指定範囲のコミットログを閲覧
気になったメソッドなどのコミットログを調べるときに使用しています。どんな経緯で実装されたのか、実装の意図はどんなものか調べたいときに利用している機能です
#### 1. 調べたい範囲を選択します
![6.png](https://qiita-image-store.s3.amazonaws.com/0/64171/e24d3fc0-a6b8-e76d-0314-359246238b3f.png)

#### 2. 右クリック→Git→Show History For Selection
![7.png](https://qiita-image-store.s3.amazonaws.com/0/64171/a442f6fc-4995-df47-da84-e4bfd8ffe3b1.png)


### 4. Githubのプルリクエストに飛べる
``` 3. 指定範囲のコミットログを閲覧 ``` でコミットログを閲覧しどんな差分があるのかを把握したあとに使うことがほとんどです。機能が実装された経緯を知りたい場合に使用します  

1. 右クリック→Copy Revision Number
2. Githubで貼り付け
![8.png](https://qiita-image-store.s3.amazonaws.com/0/64171/b00e8ba5-b683-e102-a770-fd9fed6892d0.png)

3. 対象のコミットを選択
![9.png](https://qiita-image-store.s3.amazonaws.com/0/64171/02bba721-4129-385e-de25-0635e87ecce9.png)

3. PRを閲覧
![10.png](https://qiita-image-store.s3.amazonaws.com/0/64171/ebe9655b-bac0-2f18-6b70-05d6ca48d20c.png)

## まとめ
以上が私のソースの読み方と読む際に使っている機能でした。もっと効率いい方法があるなどがあれば教えていただけると嬉しいです。