rastam on rails

東京在住のマレーシア人 Rubyist

コードレビューで聞く質問集

コードレビュー中には、どこを見ればいいんだっけ、ってよくなりますので、 まとめておきました 英語でまとめたものを日本語に訳しました。

  • この PR の目的は何なの?
  • PR 作成者がこの PR に到るまでの調査結果・決定事項・仮説は妥当か?
  • もっといい解決方法はないか?コード修正以外の解決方法も検討。
  • この PR は根本的な解決?それとも暫定対応?暫定対応の場合は、PR 作成者に根本的な解決の計画を立ててもらう。
  • この変更点はステークホルダーにどんな影響を与えるか?ステークホルダーはエンドユーザだけでなく、チームメンバーとかも含まれてる。
  • その影響は最小限に抑えられないか?
  • 影響を最小限に抑えるには、具体的にどんなステップを取るか?
  • この PR の動作は正しいか?(言うまでもない)
  • 足りてないエッジケースはないか?
  • セキュリティの穴はないか?
  • コードをもっと読みやすくできないか?
  • コードをもっと簡潔に書けないか?
  • 削除できる不要なコードはないか?
  • PR 作成者にもしものことがあったら、レビュワーである あなた はこのコードを引き継ぐ責任は取れるか?
  • マージ前後にやることはないか?特に CI やチームメンバーの開発環境に影響を与える修正。
  • オンラインメンテでデプロイできそうか?
  • デプロイ前後にやることはないか?PR 作成者にチェックリストを書いてもらう。

下記項目は基本確認しないようにしている。

  • コード規約・フォーマット。Rubocop などのリンターに任せましょう。
  • テスト。上記項目の確認がぜーんぶ終わったら、テストまで確認する気がほとんど失せてるから。

ポジティブなコメントも欠かさず

レビューに慣れてない人は最初 レビュー = 間違い探し と思いがち、ネガティブな指摘しか書かない。問題点が見つからなかった PR も「何か書かなきゃ!」というプレッシャー感じて、些末な nits 書いちゃったりする。そういうときは

  1. どんな状態からどんな状態に変わったか?良い方向に変わった場合は褒める。読みやすくなったことだけでも。レビューしやすく工夫してくれたことでも。
  2. コード読んで理解したことを文章化する。理解に時間がかかったときは特に文章化する価値がある。認識の確認にもなる。

このレビュー術は、Aiming で培ってきたものです。

エンジニアの CS 対応メモ

この間、CS からのお問い合わせ対応のやり方について新卒に説教することになりました。 せっかくなので書き落としておきました。

手順は

  1. 何の問題なのか完全に理解すること
    • 不明な場合は、お客様に聞くように CS 担当者に依頼すること。
    • 必要があればスクショ撮ってもらう。
  2. 再現すること(できれば)
  3. リクエストログが追えれば、追うこと
    • 本当にその現象が起きた証拠を集めて参考にするために。その中にある情報で何かが分かるかもしれないから。あと人聞き悪いですが、クレーマーが嘘を付くことがたまにある。
  4. 原因調査すること
  5. 解決すること
  6. CS 担当者に連絡すること
    • 砕けた文章で OK。お客様向け文章を書くのは CS 担当者の仕事なので。
    • 五月雨式の連絡を避けて、出来るだけ連絡内容をまとめてから投げる。
      • お客様に何回も連絡すると、お客様がめんどくさくなる。
      • CS 担当者の負担を増やさないように。エンジニアを理不尽なクレーマーから守ってるのは CS 担当者だから。

Rails Needs Active Deployment: 日本語サマリー

先週の Ruby Rogues ポッドキャストで取り上げられた熱い記事。

medium.com

Active Storage、Active Job、Action Cable、Action Mailbox で超楽になってきたが、デプロイという難関が未だに残ってる。Heroku だと簡単に出来ちゃうけど、それ以外はハードルがかなり上がる。

初心者がやり方ググっても、大量のチュートリアルが出て来て、どれも微妙に違ってて結局自分で大量の決断をすることになり、標準化されてなくて保守しづらいインフラが生まれてくる。

Docker は一見簡単だけど、チュートリアルが大量にありすぎて、ほとんど中途半端かつ開発環境に特化した手順にすぎない。

社内にインフラのプロがいなくても、エンジニアが一人で簡単に本番環境構築できるのは Rails 流ではないでしょうか?Convention over configuration で標準化したデプロイできる Active Deployment 的なものニーズは十分ある。コミュニティで実装方法を議論しましょう。

という主張論の記事。

インフラが怖いと思っている僕はものすごく同感。非現実的だという反論はあるとはいえ。(Ruby Rogues でも実際この点でプチ喧嘩にもなった)

Growing Rails Applications in Practice: 日本語サマリー

leanpub.com

読破しましたのでサマリー書いておきました。

  • コントローラの設計を標準化せよ
  • ユーザーの各インタラクションをCRUDリソースで表現せよ
  • コントローラの責務は4つのみ
  • モデルのAPIをvalidation、コールバックで表現
  • ActiveModel のモデル積極的に作れ
  • クラス切り出してロジック整理せよ
  • ファットモデルをダイエットさせてスリムモデル切り出せ
  • インタラクションロジックをフォームオブジェクトに切り出せ
  • 他オブジェクトモデルから呼ばれる、Active Recordを必要としない単一責務POROのサービスオブジェクトをきり出せ
  • モジュールの使い道はファイル構造化のみ
  • モデルを積極的にネームスペース・サブフォルダに配置せよ
  • CSSはBEMで整理せよ
  • 生きたスタイルガイドを用意せよ
  • Railsバージョンアップせよ
  • Edgeは2〜3パッチレベル成長するまではバージョンアップするな
  • モンキーパッチ、gemが多ければ多いほどバージョンアップのコストが高くなる
  • 単体テスト結合テスト書け
  • テスト駆動設計せよ

Ruby Weekly #411: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/411rubyweekly.com

Highlights

Visualizing Ruby Execution

Ruby コードのロジックをフロー図に変換してくれる VisualizeRuby gem。

Changing the Way Ruby Creates Objects

.new メソッドをオーバーライドしてみた話。

  • #initialize 前にシングルトンクラスに対してモジュールを include
  • #allocate で子クラスにも include されるように。

Finding Where STDOUT/STDERR Debug Messages Are Coming From

Discourse デバッグ中の Sam Saffron 先生が STDERR モンキーパッチでエラー発生元を出力させた話。

Rails 5.2.1 Released

Rails 5.2.1 リリース!

How to Use Bundler in a Single-File Ruby Script

require 'bundler/inline'gemfile ブロックだけで、単独ファイルの Ruby スクリプトでも Bundler 使えちゃう。

First Beta of Hanami 1.3 Released

Hanami v1.3.0.beta1 リリース。v1.3.0 は 10 月リリース予定。

  • RSpec がデフォになった

Articles & Tutorials

Designing Services with dry-rb

dry-rb でサービスクラス実装。

  • Dry::Initializer で注入する依存性定義。
  • Dry::Validation で注入した依存性のルール定義。
  • Dry::MonadsSuccess Failure オブジェクトを返す。

Ruby 2.6's Dir#each_child and Dir#children Instance Methods

Ruby 2.5 の Dir.each_child Dir.children に該当する Dir#each_child Dir#children インスタンスメソッドが Ruby 2.6 で登場。

Improving Partial Loading Performance

partial パフォーマンス向上方法 2 つ。

  • bullet で N+1 クエリ検知・撲滅。
  • ビューからの SQL 発行を検知してくれる自前 concern。

How Can I Use Ruby 2.6 JIT?

JIT の紹介。

  • JIT とは、Ruby 稼働中によく呼ばれるメソッドの特定・コンパイル
    • メモリが倍ぐらいかかっちゃう
    • コンパイル完了までは重い
  • 今までの JIT 実装
    • JVMコンパイルを先にやるせいで、起動が重い
    • Rubinius などの JIT がいろいろ提案されてきたが、起動速度とメモリのせいで却下
  • 許容範囲内の保守性・起動速度・メモリを誇る MJIT は、いよいよ Ruby 2.6 で登場。
    • 稼働中にバックグラウンドで少しずつコンパイルすることで、起動は速くなるが、高速化するまでは時間がかかる
    • 現時点 Rails は重くなるだけ
    • MJIT はデフォ無効

Back to the Primitive. Testing with Simplicity

テストの期待値は、ヘルパーなどの戻り値ではなく、プリミティブにしようという主張。

Code & Tools

Paraspec: Parallel RSpec Test Runner

RSpec テスト並列実行用 gem。ファイル単位だけではなく spec 単位でも分散できる。

Groupdate: Group Temporal Data with Active Record, Simply

ActiveRecord や Enumerable を年、月、日付、曜日、時間などでグループしてくれる gem。

Xcode::Install: A Ruby Tool to Install and Update Xcode Versions

XCode 最新バージョンをインストールしてくれる CLI 用 gem。

TTY::Screen: Cross-Platform Terminal Screen Size Detection

ターミナルのサイズを検知してくれる gem。

capybara-screenshot: Automatically Save Screen Shots When a Capybara Scenario Fails

Capybara テストが落ちたらスクショを保存してくれる gem。

Ruby Weekly #410: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/410rubyweekly.com

Highlights

Stop Shipping Untested Ruby Code with Undercover

指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる undercover gem の機能紹介。

Generating Random Numbers in Ruby

乱数生成いろいろ。

  • rand
  • srandrand のシード指定
  • Random.rand
  • rubystats gem の Rubystats::NormalDistribution正規分布に従った乱数生成

Evaluating Scala and Sticking with Ruby

Scala で新規アプリ開発してみた REA 社が最終的に関数型 Ruby にした話。

  • 生産性向上を期待していたが、そこまで変わらなかった
  • パフォーマンスは確かに Scala 圧勝
  • 関数型プログラミングで保守性の改善を期待していたが、、ボイラープレートが多くて可読性暴落

Rails 5.2.1 RC 1 Released

Rails 5.2.1.rc1 リリース。Rails 5.2.1 は今日中にリリース予定。

Articles & Tutorials

Building a Testing Framework Similar to RSpec in Ruby

RSpec 風テストフレームワークの作り方。

Rails 5.2 Encrypted Credentials Cheat Cheat and Tips

Rails 5.2 Credentials 備忘録。

  • config/credentials.yml.enc はコミットしても OK
  • config/master.key はコミットするな!.gitignore、.dockerignore に入れること!
  • CI ログには RAILS_MASTER_KEY 環境変数を出すな!
  • キー変更手順

Ruby 2.6 Added Some Options to Exception#full_message

Ruby 2.6 で Exception#full_message に追加されたオプション引数まとめ。

  • highlightエスケープ文字を消す
  • order

Send Emails with Style in Rails

HTML メールの CSS をインライン style 属性として当ててくれる gem まとめ。

Ruby 2.6 Adds Option to Not Raise Exception for Integer and Float Methods

変換できない文字列を渡されたら ArgumentError を投げる Integer()Float() メソッドは、Ruby 2.6 以降、exception オプション引数で例外を抑えれるようになる。

Using Rails Encrypted Credentials with Docker

Docker で Rails Credentials を使う方法。

  • 開発用コンテナ上で rails credentials:edit が実行できるための設定
  • マスタキーの渡し方

Code & Tools

Undercover: Like RuboCop But For Code Coverage

指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる gem。

MiniI18n: Minimalistic Internationalization for Ruby

簡易 i18n 用 gem。

Orbacle: A Ruby 'Language Server' for Code Editors

vimemacsAtom などにコード補完やリファクター機能を提供してくれる Ruby 言語サーバ。

Ruby Weekly #409: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/409rubyweekly.com

Highlights

Pundit 2.0 Released: The Pure Ruby Authorization Library

認可用 Pundit gem は v2.0 リリース!

Tweaking Ruby's Global Method Cache

グローバルメソッドキャッシュいろいろ。

  • メソッドの定義元クラス・モジュールをマッピングするキャッシュ。定義元を毎回評価するのにコストがかかるから。
  • RUBY_GLOBAL_METHOD_CACHE_SIZE 環境変数でキャッシュするメソッドの数を指定(デフォ 2048)。
  • メソッド数増やしても高速化は 2%〜3% しかない。

Faker: The Library for Generating Fake Data

ダミーデータ生成用 gem。

Articles & Tutorials

Painlessly Managing Long Running Processes in Your Views

fie フレームワークで ActiveJob の進捗をプログレスバーとして表示。

Adding Authorization to Sinatra with Pundit

Sinatra アプリで pundit gem を使う手順。

Ruby 2.6 Adds Binding#source_location

ファイル名、行番号を返してくれる、Ruby 2.6 の Binding#source_location

Hiding .gemrc Credentials in Dotfiles

コミット対象の .gemrc の中の認証トークンなどを隠す方法。

  1. トークンを dotfile に移す
  2. GEMRC 環境変数で dotfile を指定することで、.gemrc の設定が dotfile の設定とマージされる

Making Ruby Yours with the pretty_ruby Gem

コアメソッドに可読性向上の拡張をしてくれた pretty_ruby gem。拡張はモンキーパッチではなく、安心安全な refinement で。

  • .map { |x| x.join('-') }.map(:join, '-')
  • .map { |x| x.next.upcase }.map(:next >> :upcase)
  • .reduce(['']) { |m, x| m << m.last + x }.drop(1).scan
  • #take #drop のマイナス引数対応

11 Books Every Ruby on Rails Developer Should Read

Rails 開発者必読の書籍 11 冊。

Code & Tools

TTY::Box: Draw Frames and Boxes in Your Terminal Window

CLI で四角い枠を描画してくれる gem。

FastJsonapi: A Super-Fast JSON:API Serializer for Ruby Objects

v1.3 がリリースされた高速 JSON:API シリアライズ用 gem。

Crystalball: Run Only the Specs You Need to Run

カバー率測定で、修正したファイルの関連 RSpec テストを特定してくれる gem。

OpenStreetMap: Ruby Gem for OpenStreetMap API Integration

OpenStreetMap API クライアント gem。

graphql-ruby: A Ruby Implementation of Facebook's GraphQL

GraphQL API フレームワーク用 gem。

Terraforming: Export Existing AWS Resources to Terraform Style

既存の AWS リソースを元に Terraform 用 .tf、.tfstate 設定を生成してくれる gem。