プログラマーならみんなレガシーコードに困らせられたことがあると思いますが、レガシーコードは一体どこから生まれたのかを考えてみました。
まず「古い」と言う概念があるのは、「新しい」の概念がないと成り立たないです、新しいバージョンが出たからこそ、今使ってるバージョンが古いというわけで、新しい選択肢を増えなければ、既存なものも古くなりようがないです。
例えば使ってるフレームワークに新しいバージョンが出て、1.0から2.0にアップグレードしないといけない、そうすると今の1.0ののコードは「古い」と見なされる。多くのアップグレードはいきなり書き直しを強要せず、まずは非推奨にし「警告は出るが、一応動くよ」という状態になることが多いです。それがレガシーコードの生まれです。
ここに特筆にしたいのが、最初どんなコードを書いたのと関係なく、レガシーコードは未来の変更によって生まれるんです。どれほど美しいコードを書いたつもりだろうが、未来予測ができなければレガシーコードが生まれるのを防げないです。
レガシーコードの誕生を減らしたいなら、まずは破壊的な変更や、ベストプラクティスの変更を減らさないといけないです。例えばJS界隈はころころ変わるのが有名で、3年前のReactと今の理想的なReactは全く違うし、なんならReact自体はもう流行ってない、数ヶ月更新されてないプロジェクトはそれだけで「メンテナンスされてない」と言われます。そういう新しいものが高頻度で出てくる環境にいると、レガシーコードも自然にとんでもないスピードで増えてしまう。
新しいものは外部から降ってくるだけじゃなくて、内部からも現れます、むしろそっちの方が多かったりします。例えば会社に「今の〇〇に不満だから、別のに切り替えたい」と言う声だったり「〇〇と△△を分けた方がいいよね」だったり、理想を語ることが皮肉にもレガシーコードを増やしてしまいます。
「レガシーコードが増えてもコツコツ掃除すればいいでしょう」というのはごもっともです、むしろ「理想を語る」よりも実際に掃除することこそが理想に近付かせる行動とも言えます。しかし本当にうまくいくのか?
掃除することはつまらないことが多いです、微妙に自動化できなかったり、同じことをずっと繰り返すことが多いです。機能が増えない上に、書き直しによるバグのリスクもある。パフォーマンス改善以外、経営陣から見て業績に貢献してなさそうだから、評価もされにくく、強いて言えばプログラマーの気持ちよくなったくらいでしょう。
たとえ本当に実行できても、「追いつく」とは限らないです。掃除するのに時間がかかりますが、理想を語るのは一瞬です。例えばリファクタリングするのに一年かかるアイデアを、半年毎に提出されたり、コードの負債が増える仕様変更が頻繁にされると、掃除が追いつくはずもなく、レガシーコード永遠に増えるだけです。
業務が忙しすぎて書き直す時間がないのはよくあるケースですが、実は理想を語る人も書き直すとは限らないです。
最近買った本、読み終わりましたか?多くの人は本を積読し、そして積読してることを知った上で、さらに新しい本を買い、積読する。本を買う瞬間は「私は今度こそちゃんと読むから」と、証拠も実績もない自信でいる。「今度こそ勝つから」と負けてるパチンカスはいう。「今度こそちゃんとダイエットするから」と今まで一度も成功したことがない人はいう。
では「今度直すから」と //TODO
と書いたのは、本当に直すのか?そういうのは球児が「俺たち絶対勝つぞ!」と意気込むように、絶対でもなければ、約束でもない。確実に責任を取らせる制度がなければ、ただの「行けたらいくわ」です。
その非現実的な自信の良し悪しはともかく、少なくてもレガシーコードに関してはそういう風に放置されていく部分があると思います。もちろん本人からしたらそれは放置ではなく「まだやってないだけ」でしょう。そして頃合いを見て転職すると、レガシーコードが完成です。
人は夢を見たがる生き物です。プログラミングに関しても「〇〇で書き直せたらなー」「あのライブラリー使ってたらなー」と隣の芝の方が青く見えます。
今まで見た一番面白かったのは「List
よりもVector
の方がいいよね」とベストプラクティスを制定し、そしてすぐ「Vector
より自作のCollection
の方がいいよね」とベストプラクティスを変更し、さらになぜかUserCollection
というどっちでもないUser
専用な型が出てきたり。本人はきっと完璧なコードベースに近付けようとしてたでしょうが、実際は今までのコードを書き直せずにレガシーコードを生み出してました。
レガシーコードも、それを生み出す人がいる世界も、それこそコードのように完璧になりようがない。人の振り見て我が振り直すなら、ここは増え続けるレガシーカオスを楽しめられるほど穏やかな心を鍛えた方が、実は身のためかもしれない。