コネヒト開発者ブログ

コネヒト開発者ブログ

リファクタリング対象を選ぶ戦略を決めよう

f:id:fortkle:20150929115239j:plain

この記事はConnehito Advent Calendar 2017の5日目の記事です。

こんにちは、ゲスの極み乙女。のライブに最近行きまくってる @fortkle です!楽曲”だけ”なら絵音は天才ですね!

さて、今日はリファクタリングについて書いていこうと思います。

フェーズによる目的の違い

スタートアップ初期の開発では、「コードが綺麗なこと」よりも「とにかく早く出してユーザーに受け入れられること」の方が重要です。

一方、サービスがある程度立ち上がった後の開発では、継続的に開発/運用するためにコードの品質を高めていく必要があります。なぜなら、コードの品質が低いと「予期せぬバグ」が発生したり、「生産性」が落ちたりするからです。

よくある問題:リファクタリング疲れ

コードの品質を高めていくために継続的なリファクタリングをしていく必要がありますが、こんな経験はないでしょうか。

  • どこからリファクタリングすればいいのか分からない
  • とりあえず目に入ったところから手当たり次第にリファクタリングを行う
  • たしかにコードは綺麗になったはずなのに、リファクタリングの努力に対して効果が実感できない
  • 効果が感じられないのでだんだん疲弊してくる

これは「リファクタリングの努力をどこに集中させるのか」という戦略が欠如しているために発生する問題です。

戦略を決めよう!

こうした問題を避けるにはどうすればよいでしょうか。 最初の努力で最大の効果を出せるようなリファクタリングを行うためにはどういった戦略が必要でしょうか。

重要なのは「推測するな、計測せよ」ということです。 データを計測することによって、「どれだけ効果が出たのか」が分かります。さらに「次のリファクタリング対象はなにか」を導くための戦略を考えることができます。

実際に戦略を考えてみよう!

データを集める

戦略を立てるために有益なデータには以下のようなものがあります。 またデータを計測するために、実際にコネヒトで使っている/検討しているツールも列挙します。

  • 不具合(バグ)
  • エラー
  • コーディング規約に対する違反
  • 性能
  • 循環的複雑度
  • CRAP (Change Risk Anti-Patterns)*1
  • 価値の高い機能
    • サービスのコア機能は何か考える
    • お金が絡む機能を考える
  • よく使われるファイル
    • 直近90日間で最も頻繁に編集された上位10ファイルを抽出するワンライナー
      • git log --since="90 days ago" --pretty=format:"" --name-only | grep "[^\+s]" | sort | uniq -c | sort -nr | head -10

戦略を考える

たとえば、「よく使われるファイル」と「CRAP」を組みわせると、「よく修正が発生しているのに質の低いファイル」を効率的に導きだすことができます。

他にも「価値の高い機能」と「不具合(バグ)/エラー」を組み合わせると最優先で対応していく必要があるものがわかりますね。

こういった戦略をチームで検討し、その戦略でリファクタリングを進めることによって効率的にコードの質を上げていくことができます。また、定期的に変化を追っていくことで「改善が上手くいっている!」というモチベーションにもなり、疲弊を防ぐこともできそうです。

まとめ

リファクタリングを始めるときに、「負の感情」から戦略もなく”えいや”で作業を進めてしまうことがあります。一時的には満たされた改善の欲求も、効果が薄いとどうしてもつらくなってきてしまいます。

そういったときに一度落ち着いて戦略を考え、チームで効率的に改善していくことで楽しく目の前のサービスと向き合えるように思います。

この記事があなたのリファクタリングライフを良いものにすることを願っています!

さて、明日は@tommykwによるオウサムな6日目の記事をお送りします。

*1:CRAPについては Hirakuさんのこのスライドが詳しい。 クソコードの測り方 - https://speakerdeck.com/hirak/kusokodofalsece-rifang