右も左もわからない状態からコードが読めるようになるまでにしたこと

# 執筆の背景
LMの**顧客信頼性エンジニアリング**（Customer Reliability Engineer）として、モチベーションクラウドを利用する**顧客、コンサルタント、カスタマーサクセス**からの**仕様確認**や**障害調査依頼**の対応を行っています。

仕様に関する情報はコードの中にあるため、コードを**正確かつ迅速に読む力**が求められます。しかし、これまで私はChatGPTや先輩の力を借りながら、その場しのぎでコードを読んできたため、**根拠を持った調査**ができる状態には至りませんでした。

そこで、この3ヶ月間で**コードリーディング力を向上**させるための取り組みを行い、変化を感じることができたので、その内容をご紹介します。
（使用しているエディタは[VSC](https://code.visualstudio.com/)です。）

# 変化
## Before
1. 値が変数なのかメソッドなのか、判別がつかない
2. 変数やメソッドの定義元がわからない
3. 引数で何が渡され、結果として何が返ってくるのか把握できない
4. 処理の全体像を把握できない

## After
1. 値が変数なのかメソッドなのか、判別できるようになった
2. 変数やメソッドの定義元が特定できるようになった
3. 引数の加工過程と実行結果が追えるようになった
4. 処理の全体像を把握できるようになった

# 何をしたのか？
## 1. 値が変数なのかメソッドなのか、判別できるようになった
コードを読む際、値が**変数なのかメソッドなのか**を判断できない状態からのスタートでした。

### Ruby Silverの取得：数値・文字列・型の理解
1ヶ月間、毎日[REx](https://rex.libertyfish.co.jp/)を解き、間違えた部分を[最短突破 Ruby技術者認定試験（Silver/Gold対応） 公式テキスト](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%EF%BC%88Silver-Gold%E5%AF%BE%E5%BF%9C%EF%BC%89-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E4%BF%8A%E7%94%B7/dp/4297142163/ref=pd_lpo_d_sccl_1/355-0490374-6784703?pd_rd_w=b7CCG&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=CTBWFHJSAP255SGADP9B&pd_rd_wg=LoGeU&pd_rd_r=bfa0249d-c729-4135-b79b-5e998b81cc59&pd_rd_i=4297142163&psc=1)で学び直しました。
特に、**メソッドの知識を習得**したことで、コードを**レシーバとメソッド**という構造で理解できるようになりました。

### コードを最小単位で分節する
常に「**レシーバ + メソッド**」という最小単位にコードを分解して読むことを意識しました。これにより、複雑なコードでも混乱せずに読み進められるようになりました。

![b263d7f04e5f27f9998bdd6267f92c46403c40e4fab4d2f4b1a988c8f85c9b58のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512332/dc6b123e-f135-5b8e-cc2b-edc7fb4225f0.png)

### よく使用されるファイルの役割を理解する
ファイル数が多いプロダクトでは、定義元を検索しても大量の結果が表示されるため、重要なディレクトリとファイルの役割を理解しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512332/3496528c-ab75-526a-2bf3-429d03c35f44.png)

VSCの検索機能を有効活用して、必要なファイルだけを迅速に検索できるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512332/1bd3258f-dd03-7d6b-de10-9680f8d2b73a.png)

## 2. 変数やメソッドの定義元がわかるようになった
次に、判別できるようになった変数やメソッドの定義元を調べようとしました。
しかし、変数名やdefメソッド名、def selfメソッド名で検索すると、検索結果が複数出てきたり、0件であったりして簡単に定義元に辿り着けないことが多々ありました。

### レシーバが何クラス・何モジュールか確認する
レシーバのクラスやモジュールを確認し、メソッドの定義場所を特定するようにしました。

### スコープ解決演算子::を理解する
::を理解したことで、クラスやモジュールの定義場所を正確に特定できるようになりました。
- 参考資料：[::（スコープ解決演算子）](https://qiita.com/minisera/items/12b237890a512bb16bac)

### def以外のメソッド定義方法を理解する
defで定義されないメソッドも理解しました。
- attr_accessor、attr_reader、attr_writerでの定義
    - 参考資料：[attr_accessor、attr_reader、attr_writerについて](https://qiita.com/chimeiwang/items/7ad47237050d371d760c)
- enumと更新・照合メソッドの定義
    - 参考資料：[enumについて](https://techracho.bpsinc.jp/hachi8833/2022_02_18/115735)

### ライブラリ由来のメソッドを理解する
プロダクトコード内で定義元を確認できない場合、インターネットで検索して**ライブラリ由来のメソッド**であることを確認しました。
- 参考資料：[ライブラリについて](https://www.ruby-lang.org/ja/libraries)

## 3. 引数がメソッドの処理の中でどのように加工されるかを追えるようになった
ここまでで、変数やメソッドの定義を調べることができるようになりました。
次に直面したのが、引数に渡されている値の中身が何か、その値がメソッドで処理された結果どうなったかがわからないという問題です。

### binding.pryで処理途中の変数を確認
binding.pryを利用して、ローカル環境で処理を中断し、変数に格納された値やメソッドの結果を確認しました。
- 参考資料：[Pryの使い方](https://pikawaka.com/rails/pry)

## 4. 処理の全体像を把握できるようになった
ここまでで、1メソッド単位ではコードを読むことができるようになりました。しかし、複数のメソッドが使用されていたり、複数のファイルを跨いで処理が実行されていたりすると、定義元を辿っているうちに「今どこを読んでいるんだっけ？」や「さっきのファイルにどうやって戻るんだっけ？」と全体像を見失い、わからなくなってしまいます。

### フロー図を書いてデータの流れを理解する
以下のように、APIリクエスト発生から処理完了までのフロー図を書いてデータの流れを理解しました。
特に、コントローラーとモデル間のデータ処理を視覚的に整理することで、処理全体を把握できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512332/f6e95db6-d614-a38d-4fd6-734d007a3634.png)

# 次の課題：「スピード」
コードを読む力は向上しましたが、**業務で求められるスピード**にはまだ到達していません。

次の課題は、「**目的に応じて読むべき箇所と読まなくて良い箇所を判断する力**」です。
細部を読み込まずとも、処理の全体像を素早く掴む方法を見つけることが必要だと感じています。

VSCで試行錯誤しているため、おすすめのプラグイン等、**良い方法があれば、ぜひご教示ください！**

# 本記事を執筆しての学び
今回の取り組みで気づいたのは、**わからないことが多いと手が止まりがちな性格**であることです。
わからないことが多い場合、**共通の原因**が隠れていることが多く、**焦らず**腰を据えてそれを解決することが成長の近道です。

また、わからないことがあれば、**必ず記録を残し、共通の原因は何か？を先輩や周囲に相談すること**が大切だと痛感しました。
どんなに量が多くても、**わからないことについて記録を残す**ことだけは続けていこうと思います。