こんにちは、Timee でバックエンドエンジニアとして働いている id:ryopeko です。 今回は Timee で使っている API サーバーの Ruby を最新の 3.4.2 (+YJIT) にアップデートしたことについての記事をお届けします。
1. 概要
今回の記事では、Ruby 3.3.6 から 3.4.2 へのバージョンアップについて、パフォーマンスへの影響、Devin を使った実作業、rubocop.yml
の対応など、具体的な取り組みをご紹介します。安定性を重視した今回のアップデートの背景や、今後の展望についても触れていきます。
2. バージョンアップによるパフォーマンスへの影響
今回の Ruby 3.4.2 へのアップデートでは、YJITについては以前のバージョンから引き続き有効であるものの、我々のアプリケーションでは目立った変化はありませんでした。
計測方法とアプリについて
計測には日々活用している Datadog を使用しました。アップデートしたアプリケーションは、スマホアプリ、Web フロントエンドから使われる API で、サービスのメイントラフィックを担う部分です。また、ActiveAdmin によって作られた内部向け管理機能群も含まれています。
Datadog を用いて、CPU 使用率、メモリ使用量と使用率、リクエスト処理時間の各指標を計測しました。計測期間や時間帯などの計測条件についても確認を行いました。
計測結果
各指標の推移を比較した結果、バージョンアップ前後で大きな変動は見られず、安定した状態を維持していることを確認しました。時間帯ごとの変動パターンについても、目立った変化は見られませんでした。
メモリ使用量についても、大きな増加や減少は見られず、メモリリークなどの兆候も見られませんでした。リクエスト処理時間も、バージョンアップ前後で大きな変化は見られませんでした。
今回のアップデートで私たちは、パフォーマンスの維持と最新のバージョンを使い続けることを主な目的としていたため、これらの結果は想定内であり、安定性を重視したアップデートとして成功したと言えます。YJIT の効果は、我々のアプリケーションの特性上からか、これらの指標に顕著には現れなかったようです。
3. Devin を使った実作業について
また、今回のバージョンアップでは AI Agent ツールの Devin を活用しました。
Devin を利用した背景
Devin を利用した背景として、事前に作業の概要が把握できていたこと、動作確認に必要な Unit test が大量に存在していたこと、RuboCop のルールが整備されており、常にパスする状態が維持されていたこと、そしてアップデートの情報収集が AI の得意な分野であると考えたことが挙げられます。
Devin を利用した作業内容
Devin を利用した作業内容は以下です。
- Pull Request の作成
- 現在のバージョン間の主な差分情報の収集とサマリー生成
- Ruby アップデートに必要な差分生成
- Unit test の実施と確認
- RuboCop の実施と必要な変更のサマリー生成(修正内容の提案、提案とは違う内容の修正の指示を含む)
- アップデート可能な bundled gem のアップデート指示と対象の調査方法などが挙げられます。
プロンプトで指示したこと
Devin にはプロンプトで以下の指示をしました。
- commit する前に作成する予定の差分と Pull request 用のサマリーを人間が確認すること
- Unit test の実施
- RuboCop の実施
- アップデート可能な bundled gem のアップデート指示と対象の調査
- 必要な
rubocop.yml
の修正指示と具体的な修正内容の指示 - Pull request の作成
うまくいったこと
Devin を利用してうまくいったこととしては、情報の収集とサマリー生成、修正とテスト等のインクリメンタルな実施と確認が挙げられます。
うまくいかなかったこと
Devin を利用してうまくいかなかったこととしては、Ruby のアップデートと同時に実施した bundled gem のアップデートが挙げられます。これについて Devin は初め、bundle update
で全ての gem をアップデートすることで対処していたため、具体的な指示を出す必要がありました。また、bundled gem に関する情報収集がうまく処理できなかったため、具体的な調査方法を指示する必要がありました。
Devin は情報収集や単純作業の自動化において、高いパフォーマンスを発揮しました。一方で、複雑な依存関係の解析や、具体的な指示がない場合のタスク実行には、改善の余地があると感じました。プロンプトの工夫や、Devin の得意分野と人間の得意分野を組み合わせることで、より効率的な開発が可能になるでしょう。
今後は、プロンプトのテンプレート化や、具体的な指示方法の研究、Devin の得意分野と人間の得意分野を組み合わせた効率的な開発フローの確立、Devin のバージョンアップや新たな AI ツールの導入による効率化を検討していきます。
4. rubocop.yml
の対応
Ruby 3.4.x で有効になった以下のスタイルルールを、Enabled: false
に設定しました。
Naming/BlockForwarding
Style/ArgumentsForwarding
これらのルールは既存のコードと競合するため、一時的に無効化しました。将来的には、これらのルールに準拠するようにコードを修正し、rubocop.yml
の設定を見直すことを検討しています。
まとめ
今回の Ruby 3.4.2 へのアップデートでは、安定性を重視し、パフォーマンスの維持を主な目的としました。Datadog を用いたパフォーマンス計測では、CPU 使用率、メモリ使用量、リクエスト処理時間などの主要な指標において、バージョンアップ前後で大きな変化は見られず、安定した状態を維持していることを確認しました。
また、開発効率化のため、AI ツールである Devin を活用し、Pull Request の作成、差分情報の収集、テストの実施など、様々な作業を Devin に任せることで、開発者の負担を軽減し、効率的な開発を実現しました。
今回のバージョンアップを通して、安定性と効率性を両立させるための具体的な取り組みをご紹介しました。今後も技術の変化に柔軟に対応し、より良い開発環境を構築していきたいと考えています。