はじめに
RUNTEQ Advent Calendar 2025
の25日目を担当するりゅうと申します。
今年のテーマ『みんなにおすすめしたい〇〇tips』です。
私はコードリーディングtipsを書いていこうと思います。
コードリーディングを1ヶ月、毎日30分~1時間ほどしていきました。
そこで、自分なりに気づいたことや感じたことを共有していきたいと思います。
コードリーディングtips
自分が感じたtipsはこの3つになります
- コードは極力読まない
- コードを理解するときは用語を正しく使う
- メソッド名を信じる
1. コードは極力読まない
はっ、コードリーディングなのに読まないってどういうことって疑問を持ちますよね。
わかります。自分もコードリーディングに関する記事を読んで、どういうこと?と感じました。
この「コードは極力読まない」の理由としては、
あまり深くいきすぎると
帰って来られなくなるから、
だいたいこんな感じの処理なんだなで一回理解した方がいい
こういうことだと思いました。
例を見ていきます
def create
@room = Room.new(room_attributes)
user_id = params.dig(:room, :user_id)
user = User.find_by(id: user_id)
unless user
flash.now[:alert] = "ユーザーを選択してください"
return render :new, status: :unprocessable_entity
end
unless current_user.following?(user)
redirect_back(
fallback_location: root_path,
alert: "フォローしているユーザーのみです"
)
return
end
@room, @proverb, @invitation =
Room.create_with_owner_and_invitee!(
owner: current_user,
invitee: user
)
redirect_to edit_room_proverb_path(@room, @proverb), notice: "ルームを作成しました"
rescue ActiveRecord::RecordInvalid
flash.now[:alert] = "ルームの作成に失敗しました"
render :new, status: :unprocessable_entity
end
このcreateメソッドのコードを見ていくとします。
createメソッドのコードを1つ1つ見ていき、create_with_owner_and_invitee!メソッドの中身をroomモデルに行ってみにいきます。
createメソッドでなんとなく何が起きているかを確認するにしては深く行き過ぎてしまい、どこを読んでいるのかわからなくなってしまいます。
↓
↓
なので、今回であれば、
このcreateメソッドでは、@room,@proverbと@invitation変数に値を作成して代入している。このくらいで良いと思います。
つまり、ざっくり理解するときには、1つ1つコードを確認していくとどこを読みたいのか曖昧になり、かえって複雑になります。
それを避けるために極力読まないということです。
2. コードを理解するときは用語を正しく使う
コードを理解するときに用語を正しく使う理由は、自分が正しく理解しているか判断できるからです。
用語を正しく使うことで曖昧な理解が浮き彫りになり、自分がどこを理解していないか確認できると感じました。
例を見ていきます
def create_notification_comment
recipients = proverb.users.where.not(id: user_id).distinct
return if recipients.blank?
省略
end
end
この中のproverb.usersを見ていきます。
bad😓 用語が曖昧な時:
→proverbから取得したuserオブジェクトが入るのかな、、、
good😊 用語をしっかり使った時:
→proverb には has_many :users が定義されているため、
proverb.users として関連名を通じてアクセスできる。
これは、特定の proverb に紐付いている user の
ActiveRecord::Relation(Userオブジェクトの集合) を返し、
配列のように扱うことができる。
[
#<User
id: 1,
name: "Alice",
email: "alice@test.com",
created_at: "2025-06-01 10:00:00",
updated_at: "2025-06-10 12:00:00"
>,
#<User
id: 3,
name: "Bob",
email: "bob@test.com",
created_at: "2025-06-02 11:00:00",
updated_at: "2025-06-11 13:00:00"
>
]
用語をしっかり使うことで、オブジェクトの中身や戻り値に何が入っているのか明確に理解できると思います。
なので、用語をしっかり使うことが重要だと感じました。
3 メソッド名を信じる
メソッド名を信じる理由は、全部のコードを読もうとすると大変だからです。(1のコードは極力読まないに近いです)
例を見ていきます
def create_notification_comment
recipients = proverb.users.where.not(id: user_id).distinct
return if recipients.blank?
recipients.find_each do |recipient|
Notification.find_or_create_by!(
actor_id: user_id,
recipient_id: recipient.id,
action: :comment,
notifiable: self
)
end
end
このメソッド(create_notification_comment)を見たときに、「コメントの通知を作っているんだな」と、メソッド名を信じて推測することで1つ1つ読まなくて済みます。
1つ1つコードを読んでいくと時間的にも体力的にも大変なので、メソッド名を信じることが大事だと感じました。
コードリーディングをして良かったこと
先ほどはコードリーディングをするときのtipsを見てきましたが、ここではコードリーディングをして良かったことを共有していきたいと思います。
- 自分のコードを読み返すようになったこと
- 独りよがりのコードを抜け出せること
- 新しいコードの書き方を学べること
1. 自分のコードを読み返すようになったこと
コードリーディングをしているときに、このメソッド名は分かりやすいのか?、、、このSQL文のパフォーマンスは最適なのか?、、、
偉そうにレビューをしていきます
↓
そうしたら、「お前のコードはどうなんだ?」という自問自答が始まります。
そこで、自分のコードは読みやすいのか、パフォーマンスは最適なのかを確認し始めます。
その結果、自分自身のコードに対しても意識が高くなりました。
2. 独りよがりのコードを抜け出せること
例を見ていきます
class ApplicationController < ActionController::Base
before_action :authenticate_user!
以下省略
コードリーディングをしているときに、ApplicationControllerにauthenticate_user!と書いているのを見つけました。
このコードをここで書くことで、ログインしていない全てのユーザーは、コントローラーのアクションが実行される前にリダイレクトされます。
skip_before_actionを使って、特定のアクションではauthenticate_user!の処理が走らないようにしています。
一度理解したら、確かにこちらの方が安全で良いコードの書き方だと分かりますが、自分の知識としない場合ここに辿り着くには大変だと感じました。
コードリーディングをすることで、新しい知識を得て独りよがりのコードを改善することができると感じました。
3. 新しいコードの書き方を学ぶことができること
これはそのままです。コードリーディングをしているときに、使ったことがない機能を見ることで、どういうロジックで書くのかインプットできます。
まとめ
コードリーディングをするときは、コードを極力読まずに、メソッド名を信じたりコメントを読んで理解することが大事です。
逆に、コードを理解するときは用語をしっかり使い、曖昧な理解をしていないか確認するように意識することが大事です。
最後に
コードリーディングをしてみて、すごく楽しかったです。特にroutes.rbを見るのが面白かったです。
routes.rbを見れば大体どんなアプリなのか、この人のコードが読みやすいのかなども少し分かります。そのアプリの目次みたいなもので、ここを読む時が一番楽しいです。
また、人によってコードの書き方も少し変化するところも楽しかったです。
少しでも、皆さんのコードリーディングの参考になれば幸いです。
それでは
参考になった記事