上京エンジニアの葛藤

都会に染まる日々

Retryable コードリーディング

今年に入ってまた Ruby をメインで書くようになりました。
少しずつ Ruby 力を高めたいので、今回は Retryable という Gem をコードリーディングします。

github.com

コード量も少なくて読みやすいです。

概要

Retryable は例外発生時に指定した回数 retry してくれる便利な Gem です。
option がいくつか用意されていて特定の例外だけ retry するようにしたり、sleep time を設定できたりもします。

サンプルコード

簡単なサンプルコードを書いてみます。

require 'retryable'
require 'benchmark'

class SampleRetryable
  class NotFoundRequest < StandardError; end

  def execute
    c = 0
    Retryable.retryable(tries: 3, on: [NotFoundRequest], sleep: 3) do
      c += 1
      puts c
      res = Net::HTTP.get("example.com", "/")
    end
  end
end
require 'minitest/autorun'
require 'webmock'
require_relative '../src/sample_retryable'

class SampleRetryableTest < MiniTest::Test
  def test_sample
    WebMock.enable!
    WebMock.stub_request(:get, 'example.com').to_raise(SampleRetryable::NotFoundRequest)

    SampleRetryable.new.execute
  end
end

このテストコードでは request 時に SampleRetryable::NotFoundRequest というエラークラスを stub しているようにしています。

$ bundle exec ruby test/sample_retryable_test.rb
Run options: --seed 3048

# Running:

1
2
3
E

Finished in 6.018869s, 0.1661 runs/s, 0.0000 assertions/s.

このように 3回 request が行われ sleep が 3sec * 2 = 6sec されているのが分かります。
直感的に retry 処理が書けて便利です。

コードリーディング

先ほどのサンプルコードを実行した場合のコードを追います。

retryable/retryable.rb at 7fd390d6d8a8098db8839f3c320bebfd3ff2a604 · nfedyashev/retryable · GitHub

この retryable メソッドを読むことで一通り理解することができます。

まずは引数で渡された option の hash の validation を行います。

    def check_for_invalid_options(custom_options, default_options)
      invalid_options = default_options.merge(custom_options).keys - default_options.keys
      return if invalid_options.empty?
      raise ArgumentError, "[Retryable] Invalid options: #{invalid_options.join(', ')}"
    end

retryable/retryable.rb at 7fd390d6d8a8098db8839f3c320bebfd3ff2a604 · nfedyashev/retryable · GitHub

肝になるのはこのコードで yield でブロックを呼び出して、例外が発生時は *on_exception でキャッチしています。
そして sleep を実行し、retry 回数を count しながら retry メソッドを呼び出してもう一度 begin から繰り返します。

      begin
        opts[:log_method].call(retries, retry_exception) if retries > 0
        return yield retries, retry_exception
      rescue *not_exception
        raise
      rescue *on_exception => exception
        raise unless configuration.enabled?
        raise unless matches?(exception.message, matching)

        infinite_retries = tries == :infinite || tries.respond_to?(:infinite?) && tries.infinite? == 1
        raise if !infinite_retries && retries + 1 >= tries

        # Interrupt Exception could be raised while sleeping
        begin
          seconds = opts[:sleep].respond_to?(:call) ? opts[:sleep].call(retries) : opts[:sleep]
          opts[:sleep_method].call(seconds)
        rescue *not_exception
          raise
        rescue *on_exception
        end

        retries += 1
        retry_exception = exception
        opts[:exception_cb].call(retry_exception)
        retry
      ensure
        opts[:ensure].call(retries)
      end

retryable/retryable.rb at 7fd390d6d8a8098db8839f3c320bebfd3ff2a604 · nfedyashev/retryable · GitHub

コードもシンプルなので扱いやすい Gem だと思いました。
特に yield の使い方として参考になる実装でした。
context なども使えばより便利そうなので機会があったら使ってみたいです。

プライバシーポリシー

個人情報の利用目的

当ブログでは、お問い合わせの際にメールアドレス等の個人情報を入力いただくことがあり、個人情報と合わせて送信元のIPアドレスを取得しています。

取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどでご連絡する場合に利用させて頂くものであり、これらの目的以外での利用はいたしません。

アクセス解析ツールについて

当ブログでは、Google によるアクセス解析ツール「Google Analytics」を利用しています。この Google Analyticsトラフィックデータの収集のために Cookie を使用しております。  
トラフィックデータは匿名で収集されており、個人を特定するものではありません。

この機能は Cookie を無効にする事で収集を拒否する事ができますので、お使いのブラウザの設定をご確認ください。

Google Analytics に関して詳しくは「[Google Analytics 利用規約](https://marketingplatform.google.com/about/analytics/terms/jp/)」をご確認ください。

広告について

Google AdSense

当ブログでは、第三者配信の広告サービス (Google AdSense) を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、Cookie (クッキー) を使用しております。  
Cookie を使用する事で本サイトへのアクセスの関する情報を識別できるようになりますが、お客様個人を特定できるものではありません。

なお、お使いのブラウザ設定から Cookie を無効にする事が可能であり、無効にする方法や Google AdSense に関する詳細は、「[Google ポリシーと規約](https://policies.google.com/technologies/ads?gl=jp)」をご確認ください。

Amazon アソシエイト

当サイトは、Amazon.co.jp を宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazon アソシエイト・プログラムの参加者です。

免責事項

当ブログからのリンクやバナーなどで移動したサイトで提供される情報、サービス等について一切の責任を負いません。  
当ブログに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

また、当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。

プライバシーポリシーの変更について

本サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。

制定日: 2023年12月30日
改定日: 2023年12月30日

管理者情報

管理者: okkun_sh  
サイトURL: https://okkun-sh.hatenablog.com/

「技術書」の読書術 達人が教える選び方・読み方・情報発信&共有のコツとテクニック を読んだ

TL に流れてきて気になりざっくり読んだので忘れないうちに感想を書く。

前提

自分はソフトウェアエンジニアを本業にしていて、平均すると2ヶ月に1冊は技術書を読んでいる。
課題感はいざ学ぼうと技術書を手に取るが、難しくて途中で投げ出すことが多い。
だいたい 1/3 ぐらい読んでギブアップすることが多い気がする。
様々なジャンルをつまみながら読んでいてどれも中途半端になってしまっている。
この本ではそのような中途半端な状態を減らしつつ、少しでも効率良く学べるようになる方法が知れたら良いなと思い手にとった。

概要

主にIT 分野の技術書の読み方の tips が書かれた how to 本で著者二人の読み方が具体的に紹介されている。
本選びから読み方、アウトプットの方法まで体系的に紹介されている。

感想

特に印象に残ったところをいくつか書いてみる。

本の選び方

本の選び方として、以下がとても参考になった。

技術の習得という観点でいえば、自分のスキルから見て少し難しい本であれば効果的に学習できます。たとえば「半分ぐらいは知らないが、読めばなんとかなりそう」、「2割ぐらいはすごく難しそう」といった印象を受ければ、ちょうどよいレベルといえる

確かに今まで挫折した本では半分以上知らない内容のものが多い。
半分ぐらい知らないけど読めば分かりそうな本や、2割ぐらいすごく難しいという本は、逆に簡単すぎでは?と思って対象外にしてしまっていた。
せっかくお金を出して買うのだから少しでも多く得ないといけないような感覚に陥っていた気もする。

様々な読書法

様々な読書法が紹介されていていくつか試してみたくなった。

  • くじ引き読書法
  • 分冊化読書法
  • 時間制限読書法
  • 一点突破読書法
  • 超多読法

くじ引き読書法に近しいことは今もやっていて、例えば、パートナーや友人が持っている本で自分じゃまず選ばない本などを借りて読んだりしている。
確かに新しい発見も多いので面白いと思う。

この中で自分に合っていそうなのは、時間制限読書法 + 一点突破読書法 のハイブリッドな方法がちょうど良さそうだった。
作中にもある通り一点突破読書法で精読するのではなく、時間制限読書法で通読を混ぜながら前進させてモチベーションを高めながら読むのが良さそうな気がしている。

物理本は集中の妨げになるものがない

技術書は基本的に分厚く重く場所も取るので、最近は物理本はやめて Kindle しか買わないようにしていた。
これも iPadMacBook で読んでいると通知がきたり、Twitter を開いて集中できていないことが多いので物理本でまた買ってみようかなと思った。

読書開始日、終了日を記録する

また読書メモなども気が向いたら取っていたけど、読書開始と終了の日付を取れていなかったので定量的に測る材料として残しておいた方が良いなと思った。

まとめ

  • 全体の 3 ~ 4割が知らない内容だったので満足度が高かった
  • 本の選び方として「半分ぐらいは知らないが、読めばなんとかなりそう」、「2割ぐらいはすごく難しそう」と感じる本を選ぶ
    プラスアルファ難易度が高い本も混ぜる
  • 学習したい内容を少し絞って 時間制限読書法 + 一点突破読書法 のハイブリッドでしばらく学習してみる
  • また物理本を試す
  • 読書開始、終了の日付も取りながら定量的に測れるようにする

プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則 を読んだ

表題の通り プリンシプル オブ プログラミング を読んだので忘れないように感想文を書く。

「3年目にまで身につけたい」とタイトルでは謳われていて、ソフトウェアエンジニアになって7年近く経った気がするけど読み物として面白そうだったので手にとってみた。

概要

プリンシプル (principle) = 原理、原則 という意味なのでプログラミングを行う上での原理、原則が紹介されている本だ。
なにかの技術を解説されているわけではないし、コード例が載っているわけではないので実践ですぐに役に立つというものではない。

良かった点

  • ある概念について出典、関連書籍なども含めて紹介されている点で、気になることは深堀って調べやすい
  • 広く浅く知れることで、頭の片隅にインデックスを貼ることができる

感想

概念的な説明が細かく分けて紹介されているので読みやすかった。

自分は運良く業務を行う上で先輩からこの手の指摘をされたりしており、一度は聞いたことあるものばかりだったので、特別新しい発見があったわけではない。
ただ改めて言語化されているものを読んで忘れていたことをざっくり思い出すことができた。

中でも自分が好きなルールの1つの「ボーイスカウト・ルール」も紹介されていた。
これは「来た時よりも綺麗にする」というボーイスカウトのルールをプログラミングにも当てはめて、修正を加える際に少しでもコードを綺麗にして (リファクタリング) いくというような話だ。
大規模にリファクタリングしていくのは大変だが、少しの修正なら手を入れやすいので少しずつ綺麗にしていこうということで良いルールだと思う。
実際業務でも結構意識していたりする。

まとめ

「3年目にまで」とタイトルにもあるように、紹介されている概念は現場では知ってる前提でコミュニケーションを取られることが多い。
確かにそのくらいの経験のプログラマーにはおすすめしやすい内容だった。
もちろんそれ以上の経験がある人は新たな発見は少ないが読み物として楽しめる内容だと思った。