見出し画像

断捨離でテーブル約50個消した話

こんにちは。弁護士ドットコム本部メディア開発部のこみやまです。日々の業務では、仕様整理や、業務効率の改善に取り組んでおります。

そんななか、私は、2018年6月から4ヶ月間、 法律相談・弁護士検索ポータルサイト「弁護士ドットコム」(以後、当サ―ビス)でDBのテーブル断捨離に取り組んできました。

弁護士ドットコム - 無料法律相談や弁護士、法律事務所の検索
https://www.bengo4.com/

今回は、より弊社を身近に感じてもらうため、レガシーコードと格闘する皆さんの力になるために、その戦績をご紹介します。

なおここにおけるレガシーコードとは、テストの無いコード、デッドコード、ゾンビコード(処理の結果を使っていないコード)をさします。

目次

・テーブル370個超、ドキュメントなし
・レガシーコード解析と事実確認
・デプロイのサイズを小さくする

・今回の戦いで手に入れたもの
・それでも続くレガシーコードとの戦い

テーブル370個超、ドキュメントなし

当サービスのテーブルの数、なんと372(断捨離前)

「エンジニア御用達のタスク管理ツール、Redmineが約70テーブルなのに、冗談を。」と思われるかもしれません。

ですが、当サービスは、10年以上も続く歴史あるサービスで、度重なる増築で裏側は迷路のようになっているのが実状でした。最近まで、当サービスを安定させるために、事業成長を最優先し、リファクタリングする余裕がなかったことも大きいです。今ではエンジニア(デザイナー)側で撤退条件を決めて、ソースコードが汚くならないように開発を工夫して進めています。

近年開発されるソースコードでは、Swaggerなどの整備が進められ、少しずつドキュメントが増えています。ですが、ベンチャー企業や、成長著しいIT企業にはよくあることで、当サービスでも昔のドキュメントが全くありません。

レガシーコード解析と事実確認

そのため、私は、ER図を作成し、データ構造を可視化することから始めました。MySQLを使用していたため、MySQL WorkbenchでリバースエンジニアリングによるER図の生成が可能だったのが、幸いでした。

画像1

MySQL Workbench: ビジュアルデータベース設計 より引用

対象となるテーブルが多いと、生成にとても時間がかかりますし、全体像が掴みづらくなります。なので、ソースコードのmodelのrelationを元に、ざっくりテーブルをカテゴリー分けし、2日半をかけて十数枚のER図ができあがりました。

そのER図を、当サービスの技術者定例会議に持ち込み、数ヶ月にわたりテーブル構造勉強会が開かれました。

そして先人たちの知恵が集まり、「このテーブルは使っていないような。」、「このテーブルは昔、〇〇に使っていたような。」ということが徐々にわかってきました。ですが人の入れ替わりも多く、また5年以上前のコードは記憶が薄れて、はっきりとしたことはわかりません。それでも、要るものと要らないものが、うっすら見えてきました。

ここからは、上記をもとに、レガシーコードの解析と、事実の確認作業に入ります。当サ―ビスでは、下記のような環境で情報を管理しています。

・社内wiki esa
・それ以外の資料置き場 Google Drive
・ソースコード管理 GitLab
・チケット管理 Redmine

GitLabのblameで得た情報を鍵に、これら全ての情報を洗い出しました。他部署に異動した開発者にレガシーコードと当時のチケットを送り付けて、経緯を聞いたり、当時の責任者に施策の内容を質問したり、あらゆる手をつくしました。もし私が、自分の数年前のコードを突然送り付けられてきたら、後悔の念で悶絶しまいますが。

こうした事業側とシステム側の根本的な調査により、対象となるレガシーコードの概要と構造が見えてきました。

デプロイのサイズを小さくする

ここまで調査をしても、私が開発したわけではないので、対象のコードの挙動を全て把握は出来ているかはわかりません。

O/Rマッパーを使わずSQL文を直接流し込んだり、MVC構造のはずなのに、modelをviewから呼んだり、変数名にmodel名を格納して呼び出したり。予期せぬ負の遺産がひょっこり出てきて、バグを起こすことが多々あります。

そこまで複雑になってしまったレガシーコードを編集するのは、誰しも怖いのが当然。そのために、私が自分を守るために心掛けたことが、デプロイの単位を小さくすることです。

一度の変更を小さくすることで、障害が起きたときに、原因の究明を簡単にし、切り戻しやバグの修正をスムーズに行うことが可能です。

また人の注意する力は対象が広がるほど、劇的にさがると思います。特に、私は凡ミスが多いのです。なので、コミット数を増やし、細くデプロイをするように心がけました。GitLabへのコミット数は、98コミット、デプロイ回数は、平均1日1回にも上りました。

slackbot、codedeployによるローリングアップデートのデプロイを運用していたため、日中帯に気軽にデプロイ出来たのがとっても有難かったです。

今回の戦いで手に入れたもの

こうしてテーブル50個が削除されました。弁護士ドットコム株式会社には、毎月の全社会議で、前月に優秀な働きをした人にMVPとして表彰しており、9月のMVPに私が選出されました。

こうした、売上に直接的に関与していないが、やるべき必要のある仕事を評価してくれたのはとても嬉しかったです。このことからも、開発者に理解のある職場だと、私は感じております。

それでも続くレガシーコードとの戦い

テーブルを50個と関連コードを消したところで、レガシーコードとの戦いは終わってはいません。テーブルはまだ300以上ありますし、テストカバレッジ率も高くありません。そのうえ、開発を続けていくことで、複雑性は必然的に上昇していきます。

そんな中、弊社では、よりよい設計を求めて、Kubernetesによるマイクロサービスアーキテクチャを取り入れたり、様々な新しい試みを行っています。全体の知識を高めるためにも、DDD勉強会や読書会を開催して、課題に取り組もうとしています。

新しい技術で課題を解決し、事業成長につなげていきたいという気概のある方、ぜひ仲間になりませんか?

心よりお待ちしております。

HRMOS 採用 エンジニア系ポジション一覧 | 弁護士ドットコム株式会社


この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
ありがとうございます♪
18
弁護士ドットコム所属 PHP, JavaScript, Pythonエンジニア