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

2020/02/24 14:09

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

appstore
googleplay
会員登録
URLからPICKする

会員登録して、もっと便利に利用しよう

  • 1.

    記事をストックできる
    気になる記事をPickして、いつでも読み返すことができます。
  • 2.

    新着ニュースをカスタマイズできます
    好きなニュースフィードをフォローすると、新着ニュースが受け取れます。