レガシー移行について
こんにちは。株式会社ココナラDevOpsチームのソクです。
入社半年間、レガシー移行に一番時間を使っている毎日です。現時点では順調ですがその分、残りのコードがどんどん難易度が上がっています。
今回はレガシー移行の話をします。
以前の記事に細いレガシー移行の記事があるのでこの記事も是非読んでください。
レガシーコード
レガシーというのは明確な定義がないので説明する方によって違いますが、自分は「コードを書く瞬間レガシーコードになる」と思います。
既存のレガシーコードの移行に成功しても少し未来には誰も触りたくない複雑なレガシーコードになるはずです。
自分が書いているコードも結局レガシーコードを書いているのではと時々心配ですが、
- テストを書く
- コードだけで仕様を把握可能にする
の2箇所をばっちりにした移行を目指しています。
今どんな状況?
皆さんが頑張った結果、影響範囲が限定的で変更規模も少ないコードの移行は大体完了した状態です👏
逆に言うと残っているものは影響範囲が広くて変更規模も大きいものです。
作業の難易度と比較して外から見た目はそんなに変わらないので地味なタスクですが、性能改善になる部分もあります。サービス利用時に処理が早くなっていると感じたら、「見えない中身が新しく進化しているかも?」と考えてくださると嬉しいです。
移行する時、困るポイント
作業の内容を具体的に話すことはできないので、困ったことをどう解決したかの紹介します。
仕様が把握できない
長めに動いているシステムでは良くあるケースです。
サービスが10年休まずサービス中なのでコードもサービスと同じ年齢になっているし、ドキュメントもないし仕様を明確に把握できないです。知っている方がいると助かりますが、レガシーコードなら書いた本人もすぐ把握できないものも多いので手を入れるのが怖いですね。
実際の動作結果やコードをちゃんと読むしかないです。
けどそんな時にcommitログが大きいヒントになります。
曖昧な時にgithub画面でblameを良く使います。更新履歴とcommitメッセージが見えるので把握する時便利です。
11 years agoは怖いですけどcommitメッセージさえあれば大きなヒントになります。
もちろん修正とかメッセージだけで把握できない場合、PRまで確認すれば把握できます。
多い重複
ココナラではPC・SP・アプリどのデバイスでも同じサービスを利用可能な環境です。それでバックエンド処理も同じになるパーツが多いですが、場合によってデバイス毎に内容が似ているコードが重複で存在するケースがあります。1件1件内容把握はそんなに難しくないですが、微妙に違う部分が良く見えないし、デバイス毎に移行すると同じレガシーを追加する作業になります。
こんな場合は単純に新しい環境に移行だけじゃなくリファクタリングとして重複も減らす流れで対応します。
- 現在の処理を図式化
- 共通処理を把握してメソッド化
- テスト作成と動作確認
それだけでコード量が結構減り、次の移行が楽になります。
長すぎメソッド
「機能追加が続いて長くなったメソッド」も把握が難しいです。一つのメソッドが複数のことをしていることもあるし無駄な分岐が多いケースもあります。
重複が多い時と同じく、処理を把握し、リファクタリングを行います。
- 現在の処理を図式化
- タスクをできる限り最初に分けてメソッド作成
- テスト作成と動作確認
単一責任の原則を考えてリファクタリングしながら移行する感じです。
削除しても良いコードかの判断
ココナラのシステムはマイクロサービス化になっているので入社直後は全部把握できていない状態だったので本当に利用しているコードか判断が難しく、利用しているコードを削除した経験があります。他のリポジトリまでgrepして呼ばれていないエンドポイントだと確認して削除しましたが、実際はproxyで自動でリダイレクトされている状態でした。
この一件以降、削除しても良いか判断する時には
- コード全体でメソッド・エンドポイントなどをgrep
- アクセスログを検索して実際呼ばれていないこと確認・最近呼ばれていないと最後いつ呼ばれたか確認してコード更新履歴確認
をする流れで確認しています。削除しても良いコードは早めに削除してコード量だけ減らすことで少しでも読みやすいコードになります。
これから
現時点で残っているレガシーの中には、結構使っている機能もあります。そのため今もレガシーの修正が発生しています。早めに移行しないとレガシーコードが増えちゃう心配があります。社内の他のエンジニアや、新たに入社するエンジニアも楽に読んで触ることができる環境になるまでがんばります。
終わりに
ココナラではいろんな課題を解決するエンジニアを絶賛募集しています!
気になった方は採用ページをご覧いただければと思います。
Discussion