レガシーコードとは?テストが書かれていないコード?

Nicolas Carlo    
ソフトウェアクラフトマンシップに情熱を捧げ、アジャイルプロジェクト管理、フロント/バックエンドの知見もあわせ持つWeb開発者。
この記事は、著者の許可を得て配信しています。
https://understandlegacycode.com/blog/what-is-legacy-code-is-it-code-without-tests/

「レガシーコード」

IT関係の仕事をしている方は、この言葉をよく耳にするでしょう。開発者はこの言葉についてあれこれ話をすることも多いはずですが、一般的にこの言葉には、否定的な意味合いが多く含まれています。

しかし、開発者たちは一体何を「レガシーコード」と呼んでいるのでしょうか? それは、古いコードのことなのでしょうか? もしくは、他の誰かのコードのことなのでしょうか? いずれにせよ、その言葉が指すのは「優れたコード」ではないことが分かっています。

以前からこの議論に参加してきた人であれば、良いコードがどのようなものかということに対して、みんなの意見がそれぞれ違うということに気づいているでしょう。では、あなたが思う「レガシーコード」の定義とはどういうものでしょうか?

テストが書かれていないコード

これを読む前に色々調べた方は、次のような説明文を読んだ方もいるかもしれない。

マイケル・フェザーズ氏は、著書「Working Effectively With Legacy Code(邦題:レガシーコード改善ガイド)」で、レガシーコードの意味を明確に定義しています。

私にとって、レガシーコードとは単にテストが書かれていないコードを指す

これは長年の経験からの勘だ。

なぜフェザーズ氏はそういう発言をするのでしょうか。通常、テストがなければ、コードでできることをすべて知るのは非常に難しいからです。

コードが何をしているのかを理解したい時には、コードをしっかりと読み込んで、コンピューターを頭の中で動かして、考えられるすべてのシナリオを想像する必要があります。 また、手動でテストしてコードの動きを確認するのもよいでしょう。一般的に、テストが書かれていないコードは、どこかにレグレッションを導入せずに変更するのが難しいのだ。

私はこの定義が気に入っています。十分に納得できるし、テストは、欠落していることが多い。そのため、始めるにはいいでしょう。

しかし、この定義は完全ではないと思います。

その理由は、次の2つの面が欠落しているからです:
1. テストが書かれたコードはレガシーコードにもなる。ちゃんと書かれていないテストは障害の原因になります。そう、その通り!テストの質が悪いと、コードを変更するのが難しくなるのです!テストを読んでも、コードの機能を理解できないというのは、テストの質が悪いということなのです。テストされたコードは、テストがない場合よりも変更が難しい場合があります。

2. コードにはテストが書かれていない場合もあり、そういう場合でも簡単に変更が可能。テストされていない小さなコードベースを保持しようとしているかもしれないが、そういう小さなコードベースは分かりやすく、変更も簡単なのです。ただ、私の経験からしても、こういうことは本当に稀にしかない。このコードベースはテスト可能である。ただし、自動化されたテストがないため、レガシーコードとして認定されない場合があります。

簡単に変更できないコード

次の定義は私が考えたものです。違う方法でもう一度繰り返してみるとしましょう。

「レガシーコードとは変更が必要なコードであり、難解なものだ」

バグの根本原因を探しているのか。もしくは、機能を挿入する場所を探しているのかもしれない。コードを変更したいが、既存の動作を壊さないようにする方法がわからないため、変更するのがとても大変になる。これがレガシーコードなのです。

次のことに注意しておくべきです:
・ コードに不慣れであることは、非常に重要である。なじみのないコードの複雑さを過大評価しているところがあります。自分が書いていない、このコードがレガシーコードだと思う理由はここにあります。もしくは、自分が書いたそのコードは、書いていた時に地獄を思い出すことができないからなのかもしれない。ええ、昔の自分はよく間抜けな間違いをします。自分の未来を語るな🤫

・ 適切なテストのおかげで、なじみのないコードを快適に変更できるようになる。したがって、マイケル・フェザーズ氏が唱えた定義だということです。ただし、不適切なテキストでは快適な変更はできません。

数ヶ月後にはよりよくなるはず。レガシープロジェクトに取り組み始めて、苦労している場合は、ぜひこれを覚えておくべきです。コードが素晴らしいと言っているわけでは決してない。コードのほとんどはひどいものばかりです。 ただ、あなたはそのひどいコードに慣れて、その特性をよりよく理解しているはずなのです。わくわくしてこないかな? 興奮している人もいるかもしれない。では、先に進むことにします。

コードのほとんどはひどいものばかりだ。なぜなら、それは多くの人々が長期間にわたって、時間制限がある中、拮抗しあう条件を満たすために作業している結果だからです。 レガシーコードレシピ™の知識は完璧なものではなく、締切に間に合うように近道をするのだが、だいたいそれがとても一般的な方法です。最終的には、すべての動きがバグを引き起こし、機能が実装されるまでに時間がかかる状態となります。

最後にもう一度言っておこう:

レガシーコードとは変更が必要なコードであり、難解なものだ

その定義が役に立つのはなぜなのだろうか?それは、人々が気付かないポイントを突いているからです。レガシーコードは個人的な観点です。

個人のコードの理解度にもよる。そしてコードを変えることに対するその人の気持ちにもよるでしょう。

チームのすべての開発者にとって、課題になる可能性があるコードもあります。まだそのコードを理解していないため、コードは複雑に感じるコードもあるでしょう。理解できるかもしれないコードもあるが、それでもそれを気軽に変更しようという気にはなれない。

ラッキーなことに、実はレガシーコードをより早く理解するためのテクニックがあるのです!

生産性を高めるには、レガシーコードを理解することが不可欠です。

たくさんのレガシーコードが存在している!作業するコードベースはほとんどがレガシーコードになるでしょう。レガシーコードで引っかかってしまい、それを避けようとして気分が悪くります。

もしくは、それを貴重なスキルを開発し、優れた開発者になる機会と見なすこともできるでしょう。


コメントを読む

新着ピック  



山本 聡山本 聡4時間前フリーランスWebフロントエンドエンジニア



















新着ニュース

 アップル、視覚障害者などへ周囲の状況を触覚や音声で伝えるデバイス--特許取得

集中治療室に55型4Kスマート窓「Atmoph Window Up」設置--ストレス軽減効果を検証

接客中にパンツ脱ぐ客も……ハプニングもあるが人気の「Zoomキャバクラ」 店主と嬢の波乱の自粛期間

「技適マーク」なしデバイスを使う実験実施の届け出がウェブから可能に--総務省が受付

[GithubActions] AndroidアプリをFirebaseTestLabに連携しRoboテストを実行するまでの手順 | Developers.IO

YouTube、チャプター区切りが可能に 長い動画でも目的のシーンにすぐ飛べる

CloudFormationでALBリスナールールを変更する時にはPriorityに注意 | Developers.IO

[アップデート]AWS Fargateがデフォルトでエフェメラルストレージが暗号化されるようになりました | Developers.IO

クリプトン、QRコード活用の新型コロナ対策「リスク通知システム」--GitHubで公開

経団連の関連団体、約500件の個人情報流出か Webサイトに不正アクセス

freee佐々木大輔CEOがリモートワーク時代に1on1を重要視する真の理由——マネジャーが部下と信頼関係を築く要点

携帯電話の「プラン変更」 いつから適用されるの?

「新しい WorkSpaces クライアント」を試してみた (Windows) | Developers.IO

ツイートの予約投稿が可能に--ブラウザー版Twitterで提供開始

「LINE」PC版のビデオ通話でバーチャル背景が設定可能に--「背景エフェクト」を実装

社内勉強会で機械学習の概念に関して発表をしました | Developers.IO

Magic LeapのCEOが退任、後継者は募集中 | TechCrunch Japan

宇宙開発は製造業からインフラ・情報産業へ——インターステラテクノロジズとアクセルスペースが描く宇宙ビジネスの展望

イリノイの工場再開でRivianのアマゾン向け電動配送バンの生産は計画どおり実行 | TechCrunch Japan

ドワンゴ、アフターコロナも基本在宅勤務に 出社と在宅のバランス探る

もっと見る
記事をPICKする
会員登録
Register
記事をPICKする

会員登録すると、もっと便利に利用できます。