コードテストでパニックになってはいけない

2021/04/27 09:06

Unix Sheikh
「PHP The Wrong Way」「OpenBSD Router Guide」著者
この記事は、著者の許可を得て配信しています。
 Stop being frantic about code testing 

コードをテストせずにソフトウェアを開発することはできないので、コードテストというのは素晴らしいものですが、開発のためには避けて通れないものです。しかし、私が「一心不乱のコードテスト」と呼ぶものがあり、これは避けなければなりません。

私が疑心暗鬼的なユニットテストを好まないことは周知の事実です。実際のコードベースよりもテストの方が多くのコードを含んでいたり、コードよりもテストの作成に時間をかけていたり、コーディングよりもテストのことを考えているような例もあります。

このような場合、ユニットテストは技術的な問題を回避するのに役立つと思うかもしれませんが、実際には多くの人にとってユニットテストは技術的なものというよりも心理的な効果があるものだと言えます。そうなんです。実は、自分の気持ちをもっと楽にするためにユニットテストは実施されているだけなのです。

私はテストに反対しているわけではありませんし、開発中にも精力的にテストを行っていますが、ほとんどの場合、手動でのテストの方を好んで実施しています。開発中は、小さな変更を加えるたびにすべての機能がテストされます。私が使っている方法は、挿入されたブレークを厳密に使用することです。ランタイム中の特定の場所でアプリケーションを停止し、値やデータが常に正しいかどうかをチェックします。それと同時に、ソフトウェアを壊したり、やってはいけないようなことをやってみたりします。これは、開発の初期段階でバグを発見するのに非常に効果的な方法です。なぜなら、すぐに開発プロセスの自然な一部になるだけでなく、ソフトウェアが意図している動作方法よりしっかりと関連しているからです。特に、間違った種類のデータをシステムに与える癖がついてしまった場合に有効です。忍耐と経験が必要な方法ですが、非常に効果的です。それに、テストを書くよりも時間がかかるというわけではなく、開発プロセスの中において、より直接的で自然な方法なのです。

もちろんユニットテストも行っていますが、フレームワークを使うと単純に時間がかかりすぎるので(例えば、PHPUnitは本当にひどいです)、気になるコードだけをテストするようにしています。

ユニットテストは、主にコードのリファクタリングに関連しています。リファクタリングとは、機能追加やバグ修正を容易にするためにコードを再編成、再構築することです(リファクタリングは決して機能追加やバグ修正のためではありません!)。

ある古いソフトウェアがあって、それは何年も前からうまく動いていて、完璧に機能していたが、突然、新しい機能を追加するために何かを変更する必要が出てきて、何がどういう機能をもっているか、なぜそうなったのか、ほとんど何も覚えていないという状況を想像してみてください。たとえコードがうまく構成されていたとしても、間違ったことを想定してミスを犯すかもしれません。ユニットテストを実施していれば、変更によって何に支障がでるかどうかをバリデーションするのに役立ちます。

特にシステムの重要な部分では非常に有効ですが、自動化されたテストやモニタリングは、それは本当に意味のある場合のみであり、絶対的なルールとして存在しているのではありません。

悲しいことに、この業界の、多くの人が多くの他のことと同様にテストに必死になっています。このような「ベスト・プラクティス」がこれほどまでに高められていることに、ほとほとうんざりさせられます。テストをしていることで優越感に浸り、テストカバレッジが良くない人を見下す人までいます。

「もちろん、あなたのコードにはすでに包括的なテストカバレッジがあるので、Xが悪いアイデアだと言う必要はありませんよね?」

これは、自分のテスト方法が完璧だということを皆に知ってもらうことを人生の使命としている人(名前は伏せておきます)が言った言葉です。

ただ、お言葉ですが、私の考えでは、最近のテストの重視志向の考え方は愚かとしか言いようがありません。むしろそれが全く逆効果になっているのないですか。ソフトウェアが解決すべき問題に焦点を当てるよりも、テストを開発してコードを合格させることに多くの時間を費やしている人はたくさんいます。

ミッションクリティカル(任務や業務の遂行に必要不可欠な要素、例えば機器、プロセス、手順、ソフトウェアなど)なソフトウェアを開発しているのでなければ、プログラミングと問題解決に集中した方がはるかに良いでしょう。そして、早くリリースし、頻繁にリリースすることが効果的です。ソフトウェア障害は、どうしても起こるものですから、あまり気にし過ぎることはありません。その代わりに、事前に計画を立てることです。失敗が起こったときにどう対処するか、しっかりとした戦略を立ててください。そして、システムの最も重要な部分、つまりあなたが心配しているコードのテストに専念してください。明らかに正しいと思われるコードをテストするのは、時間の無駄です。

100%のテストカバレッジを目指すべきではありません。それは間違ったテスト方法です。ソフトウェアの主要な部分は明らかに正しく、テストカバレッジは全く必要ではないため、その部分に時間を費やす必要はありません。ソフトウェアの複雑な部分に焦点を当て、テストを書き始める前に、その複雑さを単純化できる方法がないか検討してみてください。コードをさらに細かく分割したり、他の機能に責任を委ねたりすることができるかもしれません。しかし、ソフトウェアの中には複雑である必要がある部分が存在し、それを避けることはできないのは事実です。ただ、いくらテストをしても効果がないものはないのです!すべてのものが小さなピースに分解できるわけではありません。また、TDDがプログラム設計の原動力になるというのにも、私はうんざりしています。プログラマーはコードではなく、データに集中すべきだと私は考えます。

テスト用ソフトウェアの開発や、デザインパターンやベストプラクティスばかりに縛られていると、熱意が失われ、直面している問題に対処するためのより優れた方法やより効率的な方法を創造的に考え出すことができるはずの貴重なエネルギーを失ってしまいます。

あなたが完全に集中しているときは、ものごとを改善する方法や、新しくてより良い方法を見つけるまでずっと頭の中でそのことについてずっと考え続けているかもしれません。シャワーを浴びているときや散歩をしているときに、突然、素晴らしいアイデアが浮かび、それを試すのが待ちきれなくなるということもあるでしょう。しかし、テストを書くことや、デザインパターンや「ベストプラクティス」に無我夢中になっている人の要求を満たすことに時間の90%を費やしてしまうと、本末転倒になります。

いずれにしても、コードテストを書いていなくても、自分を責めることはありません。コードテストを書くことの価値は誇張され過ぎています。システムが重要であればあるほど、ユニットテストや自動テストが正当化されるのです。

更新 2021年04月01日: この記事に関して寄せられたいくつかのメールやコメントについてコメントしたいと思います。

私はこの業界に34年(執筆時点)いますが、おもちゃのようなソフトウェアや、短期間しか取り組まないソフトウェアに関することだけを言っているのではありません。

私は、単独の開発者としてや、他の人と協力しながらチームとしても大規模なアプリケーションから小規模なものまで、様々な規模のアプリケーションを開発してきました。13年以上も顧客のもとで稼働しているソフトウェアもあり、そのソフトウェアには膨大な顧客ベースがあり、日々の活動量は膨大ですが、いまだに順調に機能しています。

私の経験の中で、あるパターンが非常に早い段階で現れました。それは、Linuxカーネルの開発モデルと非常によく一致しています。

パターンや「ベスト・プラクティス」にこだわりすぎると、ソフトウェアが解決すべき問題に集中することができません。気にしてはいけないと言っているのではありません。ただ現実的である必要があるということです。実用的な経験に基づくべきであり、他の人々(主に多数派、あるいは何らかの理由で常に多数派の人たち)が声高に叫んでいることが正しいとは限りません。

たとえ大多数の人がやっていたとしても、どんなに人々が必死になっていたとしても、たいていそれらは間違っています。なぜなら、このような宗教的な傾向のある人は、非常に不安定で感情的な人が多く、誰かが流れに逆らっているのを見ると、自分の立場が危うくなるので怖くなるのです。彼らは、自分自身が深く考えて行動しているわけではなく、ただ他人の真似をして、自分の立場を守りたいだけなのです。

いわゆる「ベストプラクティス」を謳う人たちの多くは、特定の人が自分をすごい人物だと思い込み、自分の本を売り、たくさん話をして、お金をもらっています。これがそういう人達のお金の稼ぎ方なのです。あなたは、自分の頭で考えなければなりません。

私は本当に真剣です。

appstore
googleplay
会員登録

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

  • 1.

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

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