システムリニューアルで重要視していること

自分は今の会社に入社してから、PHPで書かれたシステムをRubyで書かれたシステムへリニューアルするプロジェクトをやっています。 PHPで書かれたシステムが122万行くらいあって、DBのテーブルも300以上あるのでそう簡単にはリニューアルはできません。 またただ書き直すだけでは意味がないので、アーキテクチャから見直したりDB設計を見直したりしてます。 で、やっと主要機能のリニューアルが終わってきて、だいたい全体の半分くらいリニューアルが終わりました。 リニューアルの仕方は画面or機能ごとにRubyに書き換えて移行をしています。なのでPHPのシステムと並行稼動しているわけです。 あとRubyへリニューアル作業をしているのは初期は数人でしたが、今では大半のエンジニアがPHPよりもRubyで書くようになりました。

ということで自分がPHPからRubyへのシステムリニューアルで重要視していることをまとめてみました。(正確には社内で発表する機会があったのでそれをもとにこの記事を書いている) 書いてあるのは当たり前のことなので主に自分への備忘録目的です。

アーキテクチャから見直す

  • アーキテクチャが適切でなければリニューアルしても不適切なシステムが出来上がるだけ
  • アーキテクチャにはDB設計も含まれる
  • DB設計が間違っていればアプリケーションは正しいものにはなりえない

技術的負債に対して確固たる殺意をもつ

  • 技術的負債はもちろん返却していく
  • その際に絶対に保守的にならない
  • 保守的というのは、「ここを大きく変えると他も直さないといけなくて大変だからそっとしておこう」とか「この仕様がよくわからないけど消したら怖いから残しておこう」とか
  • 保守的になったらこのプロジェクトは終わり
  • 常にアグレッシブでいること

メンテナンス性

メンテナンス性はいくつかの要素があるが以下の2つを大切にしている。

  • 一貫性を大切に
    • 一貫性があるシステムはそれだけで生産性が
高い
    • 「一貫性のあるスタイルは”正しい”スタイルよりも大切」By リーダブルコード
    • 例えばエンジニアがそれぞれ考える”正しさ”を持ち寄ると、バラバラのプログラムが出来上がってしまう
  • シンプルに
    • もし何か判断に迷ったらシンプルな方にたおす

仕様の整理

  • 正しい仕様をもう一度考える
  • 複雑性のわりにユーザへの貢献度が低い機能や仕様を削る
  • 何のためにあるのかよく分からない仕様も思い切って捨てる
  • もちろんディレクターやCSの人と相談したり合意を取ることは必要

継続的な開発

  • リニューアルして終わりではなく継続的な開発ができるようにしていく
  • 継続的にリファクタリングしたり
  • 継続的に不要となった機能を消したり
  • 継続的にバージョンアップしたり
  • 継続的にモダンな技術を取り入れたり

おまけ: レガシーシステムを憎みすぎない

古いプログラムや技術的負債と向き合っていると、 ついつい憎んでしまいます。 しかし憎みすぎると既存の仕様や仕組みをガラッと変えるような判断をしがちです(坊主憎けりゃ袈裟まで憎い)。 レガシーシステムの機能や仕様の中にも不適切な部分と適切な部分があります。その適切な部分は活かすべきです。 慈悲の心を持って、きちんと何が不適切な部分なのか冷静&客観的になって見極めるようにしていきましょう。