← メディア一覧

間違い探しシリーズ:アルゴリズム・ミステリー:謎の巨大数

5分35秒 | アルゴリズム科目BデバッグFE

基本情報技術者試験の頻出テーマを解説した動画コンテンツです。

トランスクリプト(字幕テキスト)

さあ、今回はですね。皆さんと一緒にちょっとしたコーディングの謎解きに挑戦してみようと思います。 ごくごく単純な計算のはずが、なぜかとんでもない結果を叩き出してしまう。 そんなミステリーです。早速真相に迫っていきましょう。 はい。どん。見てください、この数字。1,240,832? これ、信じられます?実は1から10まで足した答えなんだそうです。 いやいやいや。もちろん大間違いですよね。一体全体、どうしてこんな天文学的な数字になっちゃったんでしょうか。 このプログラムを書いた新人開発者のカイ君も、もう頭を抱えちゃってます。えっ、1から10まで足すだけのプログラムのはずなのに、 なんで合計が100万を超えちゃうのってね。 でもね、彼の計算ロジック、実は間違ってないんですよ。問題はもっともっと深いところに潜んでいるんです。 では、捜査開始です。こちらがいわば犯行現場、問題のコードですね。 さあ、皆さんも探偵になったつもりで、このコードをじっくり見てみてください。やってることは 1から10までの数字を順番にSumっていう変数に足してるだけ。めちゃくちゃシンプルで、ごく普通の処理ですよね。 うーん、一見するとどこにも間違いなんてなさそうに見えるんですが。 さあ、バグは一体どこに隠れているんでしょうか。ここで、先輩エンジニアのアキさんから鋭いヒントがきましたよ。 Sumの最初の状態ってどうなってる?なるほど、これがこの謎を解く最大の鍵なんです。 そうなんです。実はね、犯人はこの計算ロジックの中にはいないんですよ。 問題なのは、このコードに書かれていないこと、つまり見落としなんです。このループが始まる前のなにもない空間、ここがポイントです。 いよいよ新犯人の正体を明かしましょう。その名も「ゴミデータ」です。 これどういうことかっていうと、変数のためのメモリ領域を確保した時、そこには前に別のプログラムが使っていたデータの残りカス、 いわばゴミがそのまま残っちゃってることがあるんですよ。 で、その残りカスがたまたますっごく大きな数値として解釈されちゃうと、あの124万みたいなとんでもない値から計算がスタートしちゃうってわけなんですね。なるほど。 このスライドのイラスト、すごくわかりやすいですよね。まさにそのメモリの状態を表現してくれてます。 みてください。変数Sumのメモリ空間が、まるで掃除前のホコリだらけの箱みたいに描かれてますよね。イメージはまさにこれです。 で、このゴミが残ったままの汚い箱にですよ、新しい数字、つまり1から10をどんどん放り込んで足していったら、 どうなると思います?ええ、当然合計はぐちゃぐちゃに汚染されちゃいますよね。これがあのわけのわからない巨大な数字が生まれた本当のカラクリだったんです。 ここでカイ君が素晴らしいひらめきを見せてくれました。「そっか、バケツをまず空っぽにしないと、もともと入ってた汚い水と新しく入れる綺麗な水が混ざっちゃうんだ」 いやあ、この例え、めちゃくちゃわかりやすくないですか? この「汚れたバケツ」の例え、もう一回整理してみましょうか。まず変数Sumがバケツで、 初期化する前っていうのは、このバケツに汚れた水、つまりゴミデータがなみなみと入ってる状態。 そこにForループで綺麗な水、つまり1から10の数字を注いでいく。さあ、最終的に出来上がるのは、 そう、汚れた水と綺麗な水が混ざったよくわからない液体。これが、あの間違った合計値の正体というわけですね。 じゃあなんでこの話がこんなに大事なのかってことなんですけど、実はこれ日本の基本情報技術者試験みたいな、 プロになるための資格試験でもものすごくよく狙われる定番の落とし穴なんです。だからプロを目指すなら、これはもう絶対に押さえておかなきゃいけないポイントなんですよね。 そして解決策はもうびっくりするくらいシンプルです。左が問題のコードで右が正しいコード。 さあ見比べてみてください。違いはたったの一行だけ。そう、Sum=0。これがあるかないか、ただそれだけだったんです。 つまり、解決策はたった一つ。変数は使う前に必ず初期化する。これに尽きます。 計算を始める前に、まずSum=0と書いてあげる。これがさっきの例えでいうところの、バケツを空っぽにして綺麗にする作業なんですね。こうすればもう安心して新しい水を注げますよね。 最後に先輩アキさんからの大事な教訓をもう一度。変数を注ぐときはまずお掃除から。 これはもう全てのエンジニアにとっての鉄則です。この一言を心に刻んでおくだけで、本当にたくさんの厄介なバグを防ぐことができますからね。 さて皆さん、この超基本的なルール、マスターできましたか?変数の初期化ってつい忘れがちなんですけど、 プログラムが正しく動くかどうかを左右するとっても大事なステップです。ぜひこの機会にご自身のスキルを試してみて、この感覚を忘れないようにしてくださいね。

このコンテンツは Web society で視聴・学習できます。