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

可読性の低いコードを生み出してしまった時の反省記録 with レガシーコード

bayastea
January 17, 2025
14

可読性の低いコードを生み出してしまった時の反省記録 with レガシーコード

2025/01/16に行われたAndroidエンジニア新年会の5分LT枠にて発表したスライドです。

bayastea

January 17, 2025
Tweet

Transcript

  1. ©MIXI 2 2 ⾃⼰紹介 • ばやすてぃー(髙林明⽇美) ◦ X: @bayastea •

    Androidエンジニア @株式会社MIXI • サロンスタッフ直接予約アプリ「minimo」開発
  2. ©MIXI 4 4 ⽬次 1. やらかしに⾄るまで a. 背景 b. いざ実装

    c. 何が起きたか? 2. 原因 a. 負債に対する向き合い⽅がわかっていなかった b. 良い設計⽅法に対しての知識が⾜りていなかった 3. まとめ
  3. ©MIXI 5 5 やらかしに⾄るまで - 1 実装内容 • 検索画⾯に特定の条件を満たす掲載者をピックアップして表⽰ ◦

    すでに似たような機能あり • 「OOの場合はXXX」といった仕様が多く複雑 開発までの経緯 • 次の施策までのスポット施策として対応 • ちょうどキリがいいので年内までにサクッとやりたい
  4. ©MIXI 6 6 やらかしに⾄るまで - 2 プロダクトについて前提 • 10年以上続くサービスのため負債が多い •

    検索機能は核となる機能のため、特にコードの量が多く複雑 ⾃分について • プロダクトにジョインして半年未満 • 前職では新規開発を主に対応 ◦ ⻑く保守するプロダクトは少なかった
  5. ©MIXI 11 11 原因 - 負債に対する向き合い⽅ BAD • 早く実装したいから⼤⽅雰囲気を掴めたら実装に⼊る •

    レガシーコード = 開けてはいけないパンドラの箱だと思っている • なるべく既存コードは触らず、前例に倣って実装する
  6. ©MIXI 12 12 原因 - 負債に対する向き合い⽅ 既存コードに追加するだけだとどこかで限界が来る 例) • 当初予定していなかった変更が追加されることで

    条件⽂がどんどん⻑くなる ◦ 既存の if ⽂に今回追加した「特定基準の掲載者」を追加してごちゃごちゃに ◦ もし今後「星5掲載者」のような区分が追加されたら...? • 変数名と中⾝が⼀致しない
  7. ©MIXI 13 13 原因 - 負債に対する向き合い⽅ 既存コードに追加するだけだとどこかで限界が来る 例) • 当初予定していなかった変更が追加されることで

    条件⽂がどんどん⻑くなる ◦ 既存の if ⽂に今回追加した「特定掲載者」を追加してごちゃごちゃに ◦ もし今後「星5掲載者」のような区分が追加されたら...? • 変数名と中⾝が⼀致しない レガシーコード = 触ってはいけないと思い込むのはやめよう 既存コードを雰囲気だけで理解するのはやめよう ⾃分なりの設計を考えて⼀次レビューやペアプロを依頼しよう
  8. ©MIXI 15 15 原因 - 設計に関しての知識不⾜ • オブジェクト指向やリーダブルコードなどあらかた勉強したつもり ◦ 命名はそれなりに意識しているつもり

    ◦ カプセル化もなるべく意識しているつもり ◦ if⽂分岐が増えると⾟いからコメントをつけてはいる ◦ メソッドが⻑くなったら改⾏したり切り出してはいる
  9. ©MIXI 16 16 原因 - 設計に関しての知識不⾜ • オブジェクト指向やリーダブルコードなどあらかた勉強したつもり ◦ 命名はそれなりに意識してはいる

    ◦ if⽂分岐が増えると⾟いからコメントをつけてはいる ◦ メソッドが⻑くなったら改⾏したり切り分けてはいる これだけでは全く⾜りていなかった 何がいいコードなのかを知っており、かつそれを実践できないと レガシーコードとは向き合えない
  10. ©MIXI 17 17 原因 - 設計に関しての知識不⾜ 良いコードとは? • ⼀つのメソッドには⼀つのことを⾏う(責務を持たせすぎない) 1.

    • 名前は誤解がないようにする • • メンバ変数などスコープの広い変数は気軽に追加しない • • 疎結合に保つ
  11. ©MIXI 18 18 原因 - 設計に関しての知識不⾜ アンチパターンを踏みまくっていた • ⼀つのメソッドには⼀つのことを⾏う(責務を持たせすぎない) ◦

    既存コードのメソッドに追加したためメソッドが巨⼤になってしまった • 名前は誤解がないようにする ◦ 既存と被らない命名を考えた結果、⻑くてわかりにくい名前をつけてしまった • メンバ変数などスコープの広い変数は気軽に追加しない ◦ 実装の楽さを優先し、メンバ変数を多く追加していた • コードは疎結合に保つ ◦ 事前に他の箇所でデータが⼊っていないとバグるコードを書いてしまった
  12. ©MIXI 19 19 原因 - 設計に関しての知識不⾜ アンチパターンを踏みまくっていた • ⼀つのメソッドには⼀つのことを⾏う(責務を持たせすぎない) ◦

    既存コードのメソッドに追加したためメソッドが巨⼤になってしまった • 名前は誤解がないようにする ◦ とんでもなく⻑くてわかりにくい名前をつけてしまった • メンバ変数は気軽に追加しない ◦ 実装の楽さを優先し、メンバ変数を多く追加していた • コードは疎結合に保つ ◦ 事前に他の箇所でデータが⼊っていないとバグるコードを書いてしまった 同じ失敗をしないためには過去から学ぶことが必要 →デザインパターンやオブジェクト指向など、先人が編み出した対応策 は数えきれないほどある 実践できるまで名著を読んで勉強しよう
  13. ©MIXI 20 20 まとめ 1. レガシーコード = 触ってはいけないと思い込むのはやめよう 2. レガシーコードと向き合う際にはきちんとコードリーディングをしよう

    3. その上で設計を考え、必要に応じて⼀次レビューを依頼しよう 4. 良いコードの書き⽅は過去から学ぼう