ねこものがたり

いちにちいっぽ

『リーダブルコード』を再読しました

www.oreilly.co.jp

2年ぶりくらいに通読

ちょいちょいリファレンス的に読み返していたけど通読はきっと2年ぶりくらいの2回目です。

前回は、プログラマーとして現場デビューする前に「力も経験もないけどできるだけ恥ずかしいコードは書きたくない」という思いからこの本を手に取った思い出が。

その時点では飲み込めるところとピンとこないところ半々くらいだったと思います。 でも時を経たらだいぶわかってきて、終始頷きっぱなしで読み終わりました。

書いてあることをできるようになりたい

須藤さんの解説にもありましたが、「この本よかった!感動!」という気持ちよりも「この本の内容を当たり前にできるようになること」を心から望む気持ちがだいぶ大きいです。

やっていくときにこの記事を活用すると良さそうなのでチェックリスト活用してみようかと思います。 「リーダブルコード適用 チェックリスト」を作ってみました - Qiita

読んだきっかけとか感想とか

今改めて読んだきっかけは、『プログラミングの基礎』を読む勉強会で「わたしif文のネスト、読むの苦手なんですよね」という話をしたこと。 『リーダブルコード』でも条件分岐や制御文は1つの章として取り上げられていてなるべく自然にできるだけ単純にというポイントが紹介されております。

条件分岐って後から条件が追加になることも多いように感じているので、追加で実装するときや条件(というか仕様かな)が変わった時などにはシンプルでわかりやすいかをよく考えて手を入れたいです。 ドメイン知識やコンテキストがないまっさらな状態で読んだときに本当に明瞭だと思うかという視点は常に心に据えてコードを読み書きしていきたいです。 そうしていきたいので、心がけてやっていて、いつの日か「そういうふうにやってます!(きりりっ)」と胸をはってみたい。

言語やフレームワークのことをよく知ってリーダブルなコードにつなげたい

少し前にRubyKaigi2013のBe a library developer!を読んだり聞いたりしていた時も思ったのだけどもっと言語やフレームワークの仕様を理解したいということ。 「xxらしい」ってその言語の文化や世界観でもあると思うので、世界観を知って文化を知って思想を知ってそのように開発したい。で美しく読みやすいコードを生み出したい。 rubykaigi.org

これはRubyRailsに限らないし、また、RubyRailsをよく知るためにも、他の言語などどんどんやって自分の触れる世界を少しずつ広く深くしていけたらなという思いを改めて持ちました。

また、それと同様に「現実世界のことをよく知る」というのも大事だなとも感じたので、日常をよく観察し、言語化し、うんと考えていきたい。

「〜したい」しか書いてないけど、そのような感想を持ちました。

名著を読むと心があらわれますね。読み返してよかったです。

最後に、一番心にきたフレーズ。

最も読みやすいコードは、何も書かれていないコードだ

『パーフェクトRuby on Rails 【増補改訂版】』を読みました

gihyo.jp

ざっくりの感想

  • 最初からサンプルコードがたくさんあって、手を動かしてどんどん次にいくぞ!という感じで進められたので終始楽しかったです。
  • 「実際の開発ではこのようにします」など、実践的な知見がたくさん詰まっていました!
  • コラムがだいぶいい。全編はボリュームが多いという人でもコラムだけは読んだほうがいいと思うくらいコラムがいい。
  • 「なぜそうするか」が解説してあるので現実の開発で応用が効きそう。

個人的に勉強になったこと

一番は11章「複雑なドメインを表現する」とか12章「複雑なユースケースを実現する」のあたり。 最近(というわけでもないけど最近)DDDやクリーンアーキテクチャにとっても興味があって、DDDの本を読んだり勉強会に出てみたり話を聞いてみたりしています。 でも「Railsドメイン駆動設計ってなんかこういまいち自分の中で結びつかないぞ?」と感じていました。 そんなステータスの中でこの本を読んだのですがDDDの考え方や物事の切り出し方には適応できそうなのかなと感じました。

あるモデルにドメインのルールが書かれすぎていないかとか、ユースケースを適切に扱っているかとか。

またそれに伴い、少ししか使ったことがないのですが、書籍でふんだんに紹介されていたActiveModelのモジュールについて理解を深め、実装時に使ってけるようにしたいと思いました。

アプリケーションコードを書くというのは現実世界をどう切り出すのか、それをどう表現するのかということだなーと感じているのですが、その辺りの力をつけるためにとても為になる章だと感じています。 いろんなケースに出会ったりプロダクトを作ったり経験を積んでいきたいと常日頃から思っているのですが、それ同時にその都度この本の内容を振り返って「このケースではどのようにするのがいいだろう」と毎回考えて開発していきたいと強く思いました!

発見したこと

これはだいぶ地味だと思うんですが、6章の中にユーザーの退会処理を作る箇所があり、その中に

def check_all_events_finished
  now = Time.zone.now
  if created_events.where(":now < end_at", now: now).exists?
    errors[:base] << "公開中の未終了イベントが存在します。"
  end
  if participating_events.where(":now < end_at", now: now).exists?
    errors[:base] << "未終了の参加イベントが存在します。"
  end
  throw(:abort) unless errors.empty?
end

というコードが出てきます。 ここの趣旨は「callbackを使って削除していいかどうかチェックできるよ」っていう話だと思うんですが、私はこれをみて「throw(:abort)使ってる!!!こういう使いかたができるのか!!!便利!!!!」と感動しました。

というのは、少し前に「俺はRubyのことが何もわからない」という気持ちになって何度目かのチェリー本をやっていた際に「catch/throwで制御できるってあるけど自分で書いたことがないなーどういうユースケースがあるのかが飲み込めてないな」と疑問を抱いていました。

そのときちょうどAsakusa.rbがあったので質問してみたり( 記録)ということがあったので、頭の片隅に関心ごととしてずっとのこっていました。だから「こういうところで使えるのか!」と知れてすごく嬉しかったし「使ってみたい!」と一人で感動していた次第です。

あと、これに関してはRailsが4系から5系に上がったときの仕様変更で使うようになったみたいだということも発見しました! 自分はRails5系から入った人なので、throwをきっかけにRailsの歴史にちょと触れられたことも嬉しく思います。

5.3 throw(:abort)でコールバックチェーンを停止する

最後に

すごく内容の濃い書籍なので、もっともっと勉強になったことはたくさんありますが、心に強く残ったのを挙げると以上となります。 書籍に沿うとサンプルアプリをいくつも作ることになるわけですがその度に rails gコマンドなどであらゆるものが生成できたりして「便利すぎる」と今更震えたりもしましたw そんな感じで楽しく読み切れました。

大変素晴らしい書籍をありがとうございました。