Transcript
00:00:00今日は「CRAP」についてお話しします。いえ、変な意味の「CRAP(クソ)」ではありません。
00:00:05これは略語で、「Change Risk Anti-Patterns Index(変更リスク・アンチパターン指標)」の頭文字をとったものです。
00:00:12複雑すぎるのにテストが不十分な、コード内のリスクの高い関数を見つけるために設計されています。
00:00:18決して新しい概念ではありませんが、最近あるパッケージのリリースによって注目を集めています。
00:00:24Alexander Prokhoranko氏が公開した「Cargo CRAP」という、Rustコード内の重要関数を特定するツールです。
00:00:31CRAP指標の元となったアイデアは、2007年に自動テストツールの実験を行っていた
00:00:37Alberto Savoia氏とBob Evans氏によって考案されたものです。しかしAlexander氏が
00:00:44最近、この指標についての洞察に満ちたブログ記事を執筆し、再び注目を集めました。
00:00:49今日ではコードのほとんどがAIエージェントによって書かれているため、こうした隠れた問題を見つけることが
00:00:55これまで以上に重要になっています。とてもクールな概念ですので、今日の動画で詳しく掘り下げていきます。
00:01:01それでは始めましょう。なぜこれが重要なのかを理解するために、画面上のこの関数を見てみましょう。
00:01:11これは、深くネストされたmatch文、いくつかのループ、そして多くのエラーハンドリング経路を持つ
00:01:16多段階のデータ変換処理です。そのため、循環的複雑度は15前後と非常に高くなっています。
00:01:24もし「循環的複雑度」という言葉に馴染みがないなら、これはコード内をデータが通る経路の
00:01:30数を測るための格好いい言い方だと考えてください。if文やmatch、whileループ、
00:01:36catchブロックを書くたびに、道の分岐が生まれます。分岐が多ければ多いほど、
00:01:43複雑度のスコアは上がり、人間の脳が関数内のあらゆる可能性を把握するのは難しくなります。
00:01:51そのため、可能な限り関数を小さなタスクに分割しようとするのです。
00:01:57画面のこの関数の場合、複雑度15は、開始から終了まで15個の全く別々のパスがあることを意味します。
00:02:04もしこの関数がユニットテストで完全にカバーされていれば、
00:02:09CRAPスコアは15のままです。複雑ではありますが、動作が検証されているので安全です。
00:02:16Alexander氏のツール「CargoCrap」を実行すると、スコアは15ではなく13と表示されます。
00:02:23おそらく、ライブラリがエラーハンドラを考慮に入れていないからでしょう。
00:02:27しかし、15と13はかなり近い値なので、このツールは期待通りに動作していると言えます。
00:02:33では、誰かがテストを削除したり、AIエージェントがテストを書かずにこの関数を
00:02:39ゼロから生成したりした場合はどうなるでしょうか。ここではテストをコメントアウトしてみます。
00:02:45そしてCargoCrapを再度実行すると、スコアは突然100を超えます。
00:02:51このツールは、コードを通る線形実行パスの数である循環的複雑度と、
00:02:57テストカバレッジを天秤にかける単純明快な計算式を使っているからです。
00:03:03この関数を見ると、Cは関数の循環的複雑度、COVは0から1の間の小数で表したテストカバレッジです。
00:03:10この計算式は、テストのない複雑なコードに対して厳しくペナルティを与えます。
00:03:17もしカバレッジが100%であれば、式の前半部分は0になり、
00:03:23CRAPスコアは単に循環的複雑度と同じ値になります。
00:03:26しかしカバレッジが低下すると、式の左側にある3乗の指数によってリスクスコアが急上昇します。
00:03:33複雑度が10でカバレッジが0の場合、CRAPスコアは110になります。
00:03:39これは良いことです。例えば、コードベース内のどの関数も
00:03:43循環的複雑度を5以下にしたい場合、これが注視すべき基準指標となります。
00:03:49もしどれかの関数が5を超えたら、そこが注目すべき領域だと判断できます。
00:03:55通常、もう少し高い複雑度を許容するでしょう。CargoCrapのデフォルトは30に設定されています。
00:04:00ですが、この指標は自分で自由に設定できるということをお伝えしたいのです。
00:04:05基本的に、これは注目に値する優れた中間指標です。
00:04:09そして、AIが生成したコードの時代において、これは非常に重要になります。
00:04:13なぜならAIエージェントは、構文的に正しい極めて複雑なコードブロックを生成するのは得意ですが、
00:04:20明示的に指示しない限り、意味のある堅牢な統合テストを書くのは極めて苦手だからです。
00:04:25そのため、CargoCrapのようなツールは、全体のコード品質を評価するために、
00:04:30すべてのユニットテストを実行した後の二次チェックとして実行されることを意図しています。
00:04:37要するに、コード品質を評価するのです。
00:04:39つまり、技術的負債のヒートマップとして機能し、リファクタリング中に最も壊れやすい
00:04:44コードを直接指摘してくれるのです。
00:04:47また、新しいエンジニアがチームに加わる際に、コードベースを適切に構造化しておくためにも
00:04:52非常に役立ちます。
00:04:56今日、AI生成コードによってコードベースがどれほどひどい状態になり得るかは、
00:05:02放置すればどれほどか、という実例を私たちは知っています。
00:05:06また、AIエージェントには同じ関数を複数のファイルに重複して生成する傾向もあります。
00:05:13ですから、このようなツール、そしてさらに重要なこととして、こうした手法を意識しておくことは、
00:05:19現代のコーディング環境においてコード品質を高く保つために重要だと思います。
00:05:24この手法を考案した著者らは、Java用のCRAP指標ツールも公開しています。
00:05:30正直なところ、Alexander氏のブログを読むまで、私はこの指標の存在すら知りませんでした。
00:05:34ですから、彼のツールのおかげで、この忘れ去られていたエンジニアリング手法に気づくことができました。
00:05:40他のプログラミング言語でも、こうしたツールがあれば有益だと思います。
00:05:44もし暇な時間に面白いプロジェクトを作りたいと考えているなら、
00:05:48Alberto Savoia氏の元の記事を読んで、他の言語用に作ってみてください。
00:05:53多くの開発者にとって非常に便利なユーティリティになるはずです。
00:05:57というわけで、皆さん。
00:05:58これが「CRAP」の概要です。
00:06:01今の、ちょっと面白かったですね。
00:06:02それはさておき、皆さんが知っている、今のエージェントコーディングの時代に
00:06:08もっと注目すべき、忘れ去られたエンジニアリング手法や指標はありますか?
00:06:13ぜひ下のコメント欄で教えてください。
00:06:15そして皆さん、このような技術的な解説がお好きでしたら、
00:06:18動画下の高評価ボタンを押して知らせていただけると嬉しいです。
00:06:21また、チャンネル登録もお忘れなく。
00:06:24BetterStackのAndrusでした。また次の動画でお会いしましょう。
00:06:28また次の動画でお会いしましょう。
Community Posts
No posts yet. Be the first to write about this video!
Write about this video