Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Railsでスピード重視で立ち上げたプロダクトの数年後あるある集

shuuuuun
November 01, 2023

 Railsでスピード重視で立ち上げたプロダクトの数年後あるある集

shuuuuun

November 01, 2023
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介
 - 元木駿(もときしゅん)
 - GitHub: shuuuuun
 - 2015年に面白法人カヤックへ新卒で入社し、広告系のWeb受託開発などに従事。 2019年より移住スカウトサービス「SMOUT」に携わり、現在はテックリードを務め る。


    - はじめはフロントエンドで経験を積み、その後バックエンドに転向して現在はSRE領 域も含めて柔軟なエンジニアとしてやっています
 - プライベートでは昨年子どもが産まれ、先日1歳になりました 👶

  2. 技術的負債とは?
 > 実装当時に最適解と考えられたものが、時間の経過とともに、最適とは評価され得な くなったもの
 引用:技術的負債とステークホルダと説明責任と / The Debt - Speaker

    Deck 
 
 > シュミットの定義によれば、技術的負債(実際には、アーキテクチャ資本の資本コス ト)はある機能を付け加えたいときに掛かるコストの差として表現されました。「理想的 なシステム」との差です。
 引用:エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング 
 

  3. 技術的負債の発生要因
 - ビジネス(サービス)を取り巻く状況の変化
 - サービスの開発フェーズにより、重視されるポイントが変化するパターン
 - 様々な理由により要件が想定以上に変化し、システムの追従が困難になるパターン
 - 要件の変化に対して柔軟なシステムを作るのが理想ではあるが、未来の予測は非常に難しい
 -

    負債の解消が困難で後回しになり、さらなる負債となるパターン
 - 自身(開発者)の持つ知識や理解、洞察力の深化
 - 開発者の(技術面/ドメイン知識面の)成長によって負債が明らかになるパターン
 - 新たに参画した開発者の新たな視点の洞察により負債が発見されるパターン
 - システムに関わる組織・チームの規模や役割の変化
 - 開発者の増減や入れ替わりによって過去の経緯が抜け落ちてしまうパターン
 - 組織として得意とする技術が変遷し、そのシステムの技術を扱える開発者が少なくなるパターン
 - テクノロジの進歩や深化、新たな技術的選択肢の登場
 - 利用している言語・フレームワーク・ライブラリ・ツールがより便利になるパターン
 - 利用しているものよりもさらに便利なものが現れるパターン

  4. 古い通知データが残り続けて億レベルのレコード数に
 - 日々大量に増えていく各ユーザーへの通知データ。初期の頃は問題なく動いていた が、数年の年月で非常に大きなテーブルとなり、パフォーマンスの悪化や負荷増 大、障害発生の要因となっていた
 - SELECTが遅いためインデックスを追加しようとしたところALTER TABLEが想定以上に長時間かかって も終わらず、障害発生...
 -

    ビジネス上も保持が必要なデータではなかったため、古いデータを削除することに
 - 単純に不要な行をDELETEするにもとても時間がかかり終わらないので、新しいテーブルを作り必要な 行のみコピーしたあとにテーブルをrenameする作戦に
 - RDS Blue/Green Deploymentsを利用することでダウンタイムを最小限に抑え、約 1千万件のデータをコピーし1億レコードのテーブルを削除した
 ビジネス(サービス)を取り巻く状況の変化

  5. EBからECS Fargateに移行した話
 - それまで利用していたElasticBeanstalkでのインフラ管理から、ECS Fargateのコ ンテナ実行基盤に移行した
 - ElasticBeanstalkで管理するEC2のOS(Amazon Linux 1)のサポート終了が近づき、新OSへの移行

    対応にもそれなりにコストがかかってしまう状態となっていた
 - Webサーバーの潮流としてはコンテナ化がデファクトスタンダードとなっており、ECS Fargateは社内 外でも採用事例が多く、マネージドであるため移行が完了すれば運用コストが下げられる見込みが あった
 - ※2021年ごろ実施
 - 移行コストはある程度かかったが、大きな負債として実害が出る前に対応できた
 テクノロジの進歩や深化、新たな技術的選択肢の登場

  6. ページごとに段階的にNuxtにリプレイスしてる話
 - 当初はRailsと密結合していたViewを切り離し、フロントエンドのフレームワークに Nuxtを利用したアーキテクチャに段階的に移行している
 - ※2021年ごろ〜
 - 溜まっていた負債
 - 初期開発で利用したbootstrapやjqueryが部分的に残存・混在しており、改修の難易度が上がって

    いた
 - シンプルなrails view(slim)でhtmlを構築してる部分と、webpackerでvueを組み込んでhtmlを構築 してる部分の混在
 - バックエンド/フロントエンドの分業制との相性
 - Railsを扱えるフロントエンドエンジニアの減少
 - 現代的なSPAのユーザー体験
 テクノロジの進歩や深化、新たな技術的選択肢の登場
 システムに関わる組織・チームの規模や役割の変化

  7. - なぜ「段階的」なのか
 - 技術的負債とは「機能の追加や改修が困難になっているもの」
 - 変更が不要な箇所であれば移行を進める理由は少ない
 - ※複数のアーキテクチャが混在していることによる開発者の混乱などのデメリットはある
 - 移行しない箇所は確実に化石になって改修の困難さは増加していくが、意図的に後回しにすることで

    貴重なリソースを他の開発に当てられる
 - ページごとに機能の追加や改修が必要になったタイミングで、既存スタック(Rails view)での改修の 困難さと新スタック(Nuxt)移行のメリットを推し量り、都度判断している
 ページごとに段階的にNuxtにリプレイスしてる話
 テクノロジの進歩や深化、新たな技術的選択肢の登場
 システムに関わる組織・チームの規模や役割の変化

  8. - Nuxt 3がリリースされ、同時にVue 2からVue 3へアップデートされたため、それま で利用していたv2とは大きく刷新
 - しばらく旧バージョンを使い続けることはできるが、ビジネス観点で他の開発の状況も踏まえて、 2022末-2023初めごろに実施
 -

    Nuxt Bridgeというv2とv3の橋渡しとなるバージョンを利用していたが、このbridgeも上手く機能せ ず、当プロジェクトでは全面書き直しに
 - 移行コストはかなり大きくかかったが、結果として後に負債を残さずクリーンな状態 にアップデートすることができた
 Nuxt v2 から v3 に移行した話
 テクノロジの進歩や深化、新たな技術的選択肢の登場

  9. 参考文献
 - 技術的負債とステークホルダと説明責任と / The Debt - Speaker Deck
 -

    質とスピード(2022春版、質疑応答用資料付き) / Quality and Speed 2022 Spring Edition - Speaker Deck
 - 【翻訳】技術的負債という概念の生みの親 Ward Cunningham 自身による説明 - t-wadaのブログ
 - エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタ リング