$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

マイクロサービス化や大規模リファクタリングの手順を学ぶ - モノリスからマイクロサービスへを読んだ

本当に最高の本でした。マイクロサービス化に取り組んでなかったとしても、規模が一定以上大きいプログラムのリファクタリング手法としても勉強になるので、みんな読みましょう!少なくともマイクロサービス化をしていきたいと思っていて、この本を読んでないならば、まずは一旦手を止めて関係する人全員でこの本を読んでから再度手を動かす、くらいでも良いレベルと感じました。

この本を読んでいると、マイクロサービス化をしたいときは、必ず以下の手順でやっていくべきと感じました。

  1. 目的を明確にする
    • 達成したいことは何か?事業が達成しようとしていることにあった一連の成果が目的でなければならない。これは、システムのエンドユーザーへのメリットを説明する方法で明確にできる
  2. その目的を達成するために、なぜマイクロサービス化でなければならないのか明確にする
    • マイクロサービスの他に代替案はなかったか?マイクロサービスの利点は別の方法でも実現できることが多い。そのような方法は検討したか?そうでない場合、それはどうしてか?
  3. 目的の優先度を決める
    • マイクロサービス化を行う時は、核となる目的と、二次的な利益を切り離して置けると良い
    • 本当に大事なステップと感じた。目的の優先度を決めておかないと、全部やろうとしてスコープが広すぎて終わらないだったり、二次的な目的が優先されすぎて(二次的な目的の例としてはエンジニア採用しやすいプログラミング言語を使いたいなど)本当に達成したかった目的があまり達成できなかったり、などということが容易に起こってしまう
  4. 段階的なアプローチを取れる設計を考える。切り戻しができるパターンを採用する
    • どういうパターンが良いかは、この書籍のパターンリストを参考にすると良い
  5. 継続的にリリースしながら、少しずつ実装を進める
  6. マイクロサービス化を実施中に、定期的に振り返る
    • 何を達成したいと期待しているかの再確認。ビジネスの方向性が変わって、方向性が意味をなさなくなったならその時点でやめよう
    • 導入している定量的な手段を確認し、進歩しているかどうかを確認
    • 定性的なフィードバックを求める。みんなは物事がまだうまくいっていると思っているか
    • もし何かあるなら、今後変えていくことを決める

他にも、モノリスとは何でどういう問題があるのか、マイクロサービス化以外の選択肢はどのようなものがあるか、マイクロサービス化のよくあるメリットデメリットは何か、マイクロサービス移行の設計パターンは何か、マイクロサービス化をやっていく上で組織としてどういう問題が起こりそうか、なども教えてくれるので非常にためになりました。買いましょう。

モンテッソーリ教育の研究者に学ぶ子育てがぐっとラクになる「言葉がけ」のコツが出版されました

最近妻が子育てに関する書籍を出版したので宣伝です。

この本は子育てで自分たち夫婦が「子供に伝わり、かつ自分たちもラクになるために、どうやって声がけしたら良いか」と悩んでいることを、モンテッソーリ教育の研究者である島村華子先生に質問して教えてもらうというコミックエッセイです。例えば、

  • 子供に伝わりやすい褒め方はどのようなものか
  • どうやったら子供も一緒に片付けをしてくれるのか
  • 保育園で起こった出来事を教えてもらうにはどうしたら良いか
  • 子供に一緒に遊んで欲しいと言われた時に、親はそんな気分じゃない時はどうすれば良いか

といった内容を教えてもらいました。

聞いた内容を実際に試したところ、もちろん育児において全てうまくいくということはなく、うまくいったりいかなかったりという状況ではあります。しかし、育児においては「少しラクになる」が精神的に非常に助かるため、以前と比べると子供とコミュニケーションをしやすくなったかなと感じてます。特に自分の家の場合は子供が保育園の出来事を多く話してくれるようになったので、育児の楽しみが増えました。

育児をしている人には書かれている内容がすぐに試せるものになっていて非常に役立つ内容だと思うので、良ければ買ってください!

note.com

before_actionなどのCallbacksに登録されているものを知る方法

と悩んでいたが、方法を教えてもらえたり、便利なツールを発見したりしたのでメモ。方法は二つ。

  • 特定アクションアクセス時に登録されているCallbacksを全て表示する
  • Callbacksが呼ばれたときにログを出力

特定アクションアクセス時に登録されているCallbacksを全て表示する

Debugging Action Callbacks (aka Filters) in Rails | Hashrocket

pry-railsを使い、_process_action_callbacksを見ることで、実行予定のCallbacksを全て表示するという方法がある。

pry-railsをインストールした後に、出力したいアクションの周囲に以下のコードを入れる。

  prepend_before_action do
    require 'pry'
    binding.pry
    true
  end

その後、そのアクションが実行されるURLにアクセスすると、pryが立ち上がるので、_process_action_callbacksを呼ぶと良い。すると以下のように出力され、このアクションではどのCallbacksが実行予定なのかを把握することが可能だ。

f:id:shiba_yu36:20211114164836p:plain

Callbacksが呼ばれたときにログを出力

先程の作戦は、特定アクションに紐づく一覧を全て出力する形式だった。一方で実際に呼ばれたものだけ表示したいという場合もある。このような時は、以下のようなツールを使い、呼ばれた場合にログを出力することもできる。

github.com

これを使い、tail -F log/action_tracer.log することで、何が登録されていて、何が適用されているかが一目瞭然となる。便利。

I, [2021-11-15T11:19:21.482139 #71440]  INFO -- : ["NO_APPLIED", :Proc, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise/sessions_controller.rb", 7]
I, [2021-11-15T11:19:21.482214 #71440]  INFO -- : ["NO_APPLIED", :verify_signed_out_user, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise/sessions_controller.rb", 61]
I, [2021-11-15T11:19:21.482243 #71440]  INFO -- : ["NO_APPLIED", :allow_params_authentication!, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/lib/devise/controllers/helpers.rb", 163]
I, [2021-11-15T11:19:21.482270 #71440]  INFO -- : ["APPLIED", :require_no_authentication, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise_controller.rb", 102]
I, [2021-11-15T11:19:21.482315 #71440]  INFO -- : ["APPLIED", :assert_is_devise_resource!, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise_controller.rb", 64]
I, [2021-11-15T11:19:21.482345 #71440]  INFO -- : ["APPLIED", :verify_authenticity_token, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actionpack-6.1.4.1/lib/action_controller/metal/request_forgery_protection.rb", 227]
I, [2021-11-15T11:19:21.482377 #71440]  INFO -- : ["APPLIED", :set_turbolinks_location_header_from_session, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/turbolinks-5.2.1/lib/turbolinks/redirection.rb", 43]
I, [2021-11-15T11:19:21.482457 #71440]  INFO -- : ["APPLIED", :Proc, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actiontext-6.1.4.1/lib/action_text/engine.rb", 58]
I, [2021-11-15T11:19:21.482487 #71440]  INFO -- : ["ACTION", "new", "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/devise-4.8.0/app/controllers/devise/sessions_controller.rb", 10]
I, [2021-11-15T11:19:21.482516 #71440]  INFO -- : ["APPLIED", :Proc, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actiontext-6.1.4.1/lib/action_text/engine.rb", 58]
I, [2021-11-15T11:19:21.482533 #71440]  INFO -- : ["APPLIED", :verify_same_origin_request, "/Users/yuki.shibazaki/.anyenv/envs/rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/actionpack-6.1.4.1/lib/action_controller/metal/request_forgery_protection.rb", 257]
I, [2021-11-15T11:19:21.482552 #71440]  INFO -- :