レガシーシステムのおそうじ / Tidying legacy systems
by
Sansan
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
レガシーシステムのおそうじ Sansan株式会社 加畑博也
Slide 2
Slide 2 text
自己紹介 - 加畑 博也(Kabata Hiroya) - @kabaome - 基盤チーム - Webエンジニア
Slide 3
Slide 3 text
今日のおはなし - レガシーシステムとは - おそうじの事例 - おそうじガイド - まとめ
Slide 4
Slide 4 text
レガシーシステムとは
Slide 5
Slide 5 text
レガシーシステムとは:定義 “ 私の定義は非常に広いもので、 保守または拡張が困難な既存の プロジェクトなら、なんでも「レガ シー」(legacy)と呼ぶことにしてい る。”
Slide 6
Slide 6 text
レガシーシステムとは:特徴 - 古い - 大きい - 引き継がれている - ドキュメントが不十分
Slide 7
Slide 7 text
レガシーシステムとは
Slide 8
Slide 8 text
おそうじの事例
Slide 9
Slide 9 text
おそうじの事例 事例1. 名刺画像処理アーキテクチャの刷新 事例2. 名刺データ量の削減 事例3. サンプル名刺の撤廃
Slide 10
Slide 10 text
おそうじの事例 事例1. 名刺画像処理アーキテクチャの刷新 事例2. 名刺データ量の削減 事例3. サンプル名刺の撤廃
Slide 11
Slide 11 text
事例1. 名刺画像処理アーキテクチャの刷新:背景 「名刺画像のid」と「S3のkey」の変換 名刺画像サイズの正規化 S3アップロード失敗時のバックアップ
Slide 12
Slide 12 text
事例1. 名刺画像処理アーキテクチャの刷新:課題 - 信頼性 - 単一障害点、名刺画像データが消失するリスク - 性能 - 名刺の取り込み量が増えると、リソース(CPU/Network)が不足 - メンテナンス性 - ブラックボックス化、技術ノウハウの不足
Slide 13
Slide 13 text
事例1. 名刺画像処理アーキテクチャの刷新:方法
Slide 14
Slide 14 text
事例1. 名刺画像処理アーキテクチャの刷新:結果 - 信頼性向上 - SDKによるリトライ・適切な例外処理 - 性能向上 - 画像サーバを経由しない - メンテナンス性向上 - アプリケーションコードに組み込み
Slide 15
Slide 15 text
おそうじの事例 事例1. 名刺画像処理アーキテクチャの刷新 事例2. 名刺データ量の削減 事例3. サンプル名刺の撤廃
Slide 16
Slide 16 text
事例2. 名刺データ量の削減:背景 - データベースは手を入れにくい - レガシー化しやすい - 不要っぽいカラム - 名刺データテーブルにある、 全文検索用のカラム - どうやら使われていない - 確証はない
Slide 17
Slide 17 text
事例1. 名刺画像処理アーキテクチャの刷新:課題 - 不要なカラム? - データベース容量を不必要に圧迫する - アプリケーションで不必要に考慮しなければならない - パフォーマンスを劣化させる(PostgreSQLでHOTが効きにくい) https://github.com/postgres/postgres/blob/master/src/backend/access/heap/README.HOT
Slide 18
Slide 18 text
事例2. 名刺データ量の削減:方法 1. アプリケーションコードからの暗黙的な参照を消す 2. 開発環境の対象カラムをRENAMEしてしばらく放置する 3. 本番環境の対象カラムをRENAMEしてしばらく放置する 4. 本番環境の対象カラムをDROPする
Slide 19
Slide 19 text
事例2. 名刺データ量の削減:結果 データベース容量にがっつり余裕ができた
Slide 20
Slide 20 text
おそうじの事例 事例1. 名刺画像処理アーキテクチャの刷新 事例2. 名刺データ量の削減 事例3. サンプル名刺の撤廃
Slide 21
Slide 21 text
事例2. サンプル名刺の撤廃:背景 新規ユーザ登録時、システムが自動で登録する名刺
Slide 22
Slide 22 text
事例2. サンプル名刺の撤廃:課題 - ユーザ一括登録時の性能ボトルネックになる - ストレージを無駄に消費する - サンプルとそれ以外の分岐がシステム/UIを複雑化する
Slide 23
Slide 23 text
事例2. サンプル名刺の撤廃:方法 1. サポート部にヒアリング、要件を整理する - 既存のサンプル名刺をどうするか? 2. タスクを整理する - ユーザとのコミュニケーション => サポート部 - UI変更、ユーザ登録コードの修正 => 開発部 3. サンプル名刺の登録を撤廃する
Slide 24
Slide 24 text
事例2. サンプル名刺の撤廃:結果 性能改善&UIの改善により利用率が向上した
Slide 25
Slide 25 text
おそうじガイド
Slide 26
Slide 26 text
おそうじガイド 計測・分解・合意
Slide 27
Slide 27 text
おそうじガイド 計測・分解・合意
Slide 28
Slide 28 text
おそうじガイド:計測 - 課題の定量化 - 「なんとなくよくない」のはみんなわかっている - 初手としての計測 - 計測した結果そのものは負債にならない - 「未知である」ということがレガシー化を促進する
Slide 29
Slide 29 text
おそうじガイド:計測 - 余談:試行錯誤も共有する
Slide 30
Slide 30 text
おそうじガイド:計測 事例 計測したもの 名刺画像処理 アーキテクチャの刷新 刷新前後のレスポンスタイム、画像登録から参照までの タイムラグ、参照頻度、画像サーバのリソース状況、画 像サーバのインスタンス費用、 名刺データ量の削減 DROP前後のテーブル(DB)サイズ、パフォーマンス、ス ケールアウト費用、 サンプル名刺の撤廃 撤廃前後のパフォーマンス、S3ストレージの利用料、
Slide 31
Slide 31 text
おそうじガイド 計測・分解・合意
Slide 32
Slide 32 text
おそうじガイド:分解 - スコープの分解 - 要件は際限なく増幅する - 「やる」と「やらない」の意思決定を明確にする - タスクの分解 - 最小単位のタスクを考える - その上で、「いつだれがやるのか」を考える - リスクの分解 - 複数のリスクを同時にハンドルしようとしない
Slide 33
Slide 33 text
おそうじガイド:スコープの分解 事例 やる やらない 名刺画像処理 アーキテクチャの刷新 画像サーバを TERMINATEする 画像サイズ正規化の 処理を改善する 名刺データ量の削減 テーブルAの 検索用カラムをDROPする テーブルA以外の 検索用カラムをDROPする サンプル名刺の撤廃 サンプル名刺の 新規登録をやめる 既存のサンプル名刺を 削除する
Slide 34
Slide 34 text
おそうじガイド:タスクの分解 - 必要に応じて他チームへ依頼する
Slide 35
Slide 35 text
おそうじガイド:リスクの分解 - 仕様の考慮漏れリスク - 愚直な手動テスト、歴史を知る人に聞く - 想定外の負荷リスク - ユーザ毎・アプリケーション毎に段階を分ける
Slide 36
Slide 36 text
おそうじガイド 計測・分解・合意
Slide 37
Slide 37 text
おそうじガイド:合意 - ステークホルダーとの合意 - “正しい情報があれば正しい判断が下せる” - 事業上(ユーザ)のメリットを言語化する - 開発メンバーとの合意 - 他チームにタスクを依頼する - 「なんのためにやるのか」を繰り返し伝える
Slide 38
Slide 38 text
おそうじガイド:合意 プロジェクト 開発上のメリット 事業上のメリット 名刺画像処理 アーキテクチャの刷新 シンプルになる 速くなる、画像サーバの 維持コストが削れる 名刺データ量の削減 シンプルになる データベース費用が削れる サンプル名刺の撤廃 シンプルになる UIが改善し利用率向上す る、速くなる
Slide 39
Slide 39 text
まとめ https://buildersbox.corp-sansan.com/entry/2018/12/11/110000
Slide 40
Slide 40 text
まとめ “本書を通じて私は「レガシー」(legacy)を、何か悪い言 葉のように扱ってきたが、そうする必要はない。望むと 望まないとに関わらず、我々は次世代の開発者に遺産 (legacy)を残すのだから、できるだけのことをして、誇 らしい遺産にしよう。” 『レガシーソフトウェア改善ガイド』 https://www.shoeisha.co.jp/book/detail/9784798145143
Slide 41
Slide 41 text
No content