はじめに
この4ヶ月間で、フロントエンドのリポジトリにおける負債解消を行いました。取り組みに際しては、課題と目標を明確にし、計画的に進めることを意識しました。
開発環境
- React v18
- Next.js v13
- CSS Modules
課題
負債解消のために取り組んだ際に直面した、主な設計や構造に関する課題を以下に示します。
共通のデザイン箇所がそれぞれベタ書きで書かれている
ページごとに共通のレイアウトが存在していたにもかかわらず、共通化がされていない箇所が多く、各ページで個別にコードが記述されていました。その結果、デザインに一貫性が欠け、ページ間で違いが生じてしまう問題が発生していました。
ビューとロジックが1つのファイルにまとめられている
ビューとロジックが同一ファイル内に集約されているため、コード量が増大し、可読性が低下していました。また、どこにどの機能が実装されているか分かりにくく、問題の特定や修正が難しくなる可能性がありました。
コンポーネントがパーツとレイアウトで適切に区切られていない
1つのコンポーネントフォルダ内に複数のレイアウトファイルが混在しており、汎用性が低い設計になっていました。これにより、コードの可読性が悪化し、管理が煩雑になっていました。
ファイル名が長い
コンポーネント名が長く、同じ名前のバリエーション(例: "HogeBlockInnerFeature"、"HogeBlockInnerItem")が多く並んでいるため、親コンポーネントと子コンポーネントの関係が分かりにくくなっていました。このような命名は、構造の理解を難しくする原因となります。
フォルダがバラバラの場所に存在している
コンポーネントが参照される場所がバラバラで、ファイルの場所を毎回確認しなければならない状態でした。これにより、開発者がコードの構造を把握するために多くの時間を費やすことになりました。
命名規則・フォルダを作る際にルールがない
コンポーネント作成のルールが不明確であり、開発者ごとに異なるアプローチが取られていました。その結果、コードベースにばらつきが生じ、メンテナンスが困難になる要因となっていました。
削除されていないコードや機能が存在する
実際に使用されていない可能性がある機能が残っており、不要なコードが多くなっていました。これがリポジトリの肥大化を招き、全体的な可読性を低下させていました。
課題により起こり得る問題
これらの課題が放置されると、以下のような問題が発生する可能性があります。
- 新しい開発者がチームに加わった際に、コードベースの理解が難しく、認知負荷が高くなる
- エラーが発生しやすくなり、バグの原因を追跡するのが困難になる
- ルールがないため、コードレビューが属人化し、チーム全体での品質保証が難しくなる
- 同じ機能を追加したい場合に、再利用可能なコードがないため、再実装が必要になる
目標
課題に対して、理想的な状態を実現するために以下の目標を設定しました。
- ファイル構造の見直し: 認知負荷を減らし、効率的に開発が進められるようにする
- コードのリードタイム短縮: 開発スピードを上げ、素早い施策実施を可能にする
- 保守完了期限: 6ヶ月を目標に、SP全体の保守作業を完了させる
進め方
- 優先順位付け: 施策で頻繁に触るコンポーネントから優先的に進める
- 安全な改修: 大規模な変更(ディレクトリ構造など)は避け、最小限の変更で進める
- スケジュール管理: 進捗状況を把握するため、計画的にスケジュールを立てて作業を進める
具体的に取り組んだこと
以下の取り組みを実施しました。
- 課題整理: 複雑な構造のコンポーネントはFigmaでスクリーンショットを貼り、現状の課題を視覚的に整理する
- コードの共通化: 共通化可能な部分はパーツコンポーネントとして切り分け、再利用性を高める
- 不要な機能の削除: 使用されていないコードや機能を削除し、デザインの見直しも行う
- レビュワーに共有: 具体的な取り組み内容やその意図、確認してほしいポイントをすり合わせる
成果との紐付け
リファクタリングは直接的なビジネス成果には結びつきにくい場合がありますが、以下のような長期的なメリットが期待できます。
- エラー削減: 問題のあるコードを整理することで、将来的なエラーのリスクを減少させることができる
- 開発スピードの向上: より効率的に開発できるようになるため、施策を迅速に実施できるようになる
- 品質向上: コードレビューの負担を軽減し、チーム全体で品質が向上する
このように、リファクタリングと保守作業は、ビジネス成果と切り離して考えるべきではなく、並行して取り組むことが重要です。また、コードだけでなく、ドキュメント作成や開発ルールの整備も並行して進めることで、属人化を防ぎ、チーム全体の生産性向上に寄与します。