技術的負債の把握と改善を促すために
こんにちは. 先日水道を止められて水のありがたみを再確認したgoccyこと五嶋@たんぽぽグループです.
今回は, 先日q_zouさんから紹介のあった技術的負債を減らす取り組みの一環で, 僕が開発したビジュアライザについてご紹介させて頂きます.
はじめに
弊社では主な開発言語としてPerlを採用しており, そのソースコード量は数十万行単位に上ります. 自社で開発したライブラリ群はプロジェクトルート下のlib/Mixi/配下に設置されており, 更にその下でサービスや用途毎にNamespaceが分かれています(lib/Mixi/APIやlib/Mixi/Photo, lib/Mixi/Voiceなど). ※以降, 文章中のNamespaceという表現は, これら(lib/Mixi/APIなど)を指すものとします.
本来であればNamespace単位で疎結合化されているべきですが, なかなかうまくいっていないのが現状です.
そこで, それぞれのNamespace毎に, 自身が抱えているコードの複雑度や, 他のNamespaceへ依存している度合いを定量的に評価するツールが開発されました. このツールを使うことによって, 測定対象のNamespaceの循環的複雑度や他のNamespaceに対する依存度等を数値化し, 客観的にソースコードの善し悪しを捉えることができるようになります. (詳しくはmixi Engineers' Blog「きっと何者にも成れないモジュールたちに告げる〜静的解析、しましょうか〜」をご覧ください)
しかし, 技術的負債を見える化する手段ができても, それを開発に活用できているチームはわずかでした. その原因として, 次々と新機能を開発していくタスクがある中で, いったん立ち止まってリファクタリングするコストが大きいということや, そもそも扱っているコードの状況を理解できていないといったことがあると考えられました.
そこで, 各開発チームが技術的負債の返済に当てるべき時間を削減でき, 現在のコードの状況を簡単に把握できるようにするため, 前述したツールのビジュアライザを作成しました.
ビジュアライザの概要と負債返済への取り組み
ビジュアライザでは, あらかじめmixiのmasterレポジトリにコミットされている全てのリビジョンに対して負債の見える化ツールを実行しておき, 次のようなグラフを作成して表示しています.
上の図は, あるNamespaceが抱えている依存度や循環的複雑度をグラフ化したものです. 横軸はコミットされた時間, 縦軸が算出されたスコアを表しています. スコアが高い程, 技術的負債が大きいことを表しています.
このグラフを見ることで, どのコミットによってソースコードの品質が上がったのか, または下がったのかが一目で分かるようになります. また, スコアが右肩上がりで伸びてきていることが分かれば, 要リファクタリング対象であることも分かります. つまり, このグラフを定期的に見ることで, リファクタリングタイミングを適切に設定することができるようになります.
次の図は, あるリビジョンにおける循環的複雑度のNamespace間比較です.
このグラフを見ることで, 現在mixiのソースコードの中で, どのNamespaceが一番大きな負債を抱えているかが分かるようになります. 各Namespaceはそれぞれ管理するチームが決まっているため, 自分のチームが担当しているNamespaceが他に比べて大きな負債を抱えていることを知れば, 改善を促すことが出来ます.
ここまでの取り組みで, 各開発チームがコードの現状を把握する敷居は大分下がり, リファクタリングしやすい環境が整いましたが, 最近, 更にリファクタリング意欲を巻き起こすための機能を追加しました.
次は, その表示画面になります.
上の表は, ある特定期間内で最もソースコードの品質改善に貢献した方々を表示したものです.
前提として, mixi masterにコミットされている全てのリビジョンを対象としてスコアを出していたので, スコアが上下したときのコミッターを調べれば, 誰がどれだけソースコードの改善に貢献しているかを知ることができます. そこで, 毎週ソースコードの改善に最も貢献した方をピックアップし, 賞賛する取り組みを始めました.
もうすぐ年末ですが, そこに併せて, 一年間でもっともソースコード改善に貢献した人を算出して, みんなで賞賛できるようにしたいと考えています. 豪華景品が出れば更に良いですね!
おわりに
今回は, 技術的負債の返済への取り組みの一つとして開発した, コード品質を定期観測するためのビジュアライザの話を紹介しました.
次回僕が書かせて頂くときには, 同じく技術的負債の返済への取り組みとして開発した, Perlコードのコピペ検出器について話したいと思います.