連載
» 2020年02月13日 10時00分 公開

ソフトウェア技術者のためのバグ百科事典(5)意外に多い「実装抜け」のバグ山浦恒央の“くみこみ”な話(126)(2/3 ページ)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

3.期末試験と「実装抜け」のバグ

 学生の最も大事な仕事は勉強です。大学生ならば、セメスターごとに受講したい科目を選択し、勉強に励み、期末試験に備えます※1)。試験の結果が芳しくない場合、単位が取得できなかったり、低評価になったり、今後の進学に響いたりします※2)

※1)多くの大学は、中学高校のような3学期制ではなく、セメスター制度(春学期と秋学期の2学期制)を採用しています。

※2)大学の評価方法の一つが、GPA(Grade Point Average)で、S〜Fで評価します。Sが4点、Aが3点、Bが2点、Cが1点、DとFが0点で、S〜Cをとると単位取得となり、DやFは再履修せねばなりません。なお、優秀な生徒は、GPAの平均が3以上、普通が3〜2の間、2〜1は頑張りが必要な生徒としてランク分けされ、就職評価に影響します。

 授業では学期末に試験を実施します。試験では、今まで学んだことを総動員して取り組む必要がありますが、その際、たまに時間が余っているのに問題を解き忘れ、もったいない経験をしたことがある方もいるでしょう。

 プログラマーにも、学生同様、期末試験(テスト工程)があります。自信満々で作ったプログラムでもさまざまなバグが見つかり、修正作業に追われます。バグの中にも、想定外の難解なバグがあれば、初歩的なバグもあるでしょう。「期末試験問題の解き忘れバグ」に相当するのが「プログラムの実装抜け」です。本コラムでの「実装抜け」は、「仕様に記述した内容をソースコードに実装し忘れた」とします※3)

※3)実装抜けより恐ろしいバグが、仕様抜けです。仕様抜けは、文字通り、本来あるべき仕様が抜けているバグです。このバグが発生すると、設計書、ソースコード、テスト項目に現れず、顧客にリリースした時に指摘されます。指摘を受けると、全身から汗が噴き出すほど慌てます。

 仕様通りにプログラムを記述することは当たり前と思いますが、開発している本人は意外に気付きません。このバグは、仕様ベースのテストで確実に見つかるため(逆にいうと、ユニットテストで見つからないと、バグが入ったまま出荷する可能性があります)、怖いバグではありませんが、見つかると非常に焦ります。

4.「実装抜け」のケーススタディー

 数年前、学生の卒業研究の指導をしていた時の話です。学生はプログラムを作る前に、簡単な仕様を作成し、それに基づいてプログラムを作りました。生徒が「プログラムができました」と報告に来たので、筆者は学生の隣に座り、プログラムが仕様通りに動くか確認しました。何件かのテストがパスし、安心したのですが、終盤に仕様通りとならないケースがありました。生徒に、なぜ仕様通りに動作しないか聞いたところ、恥ずかしそうに「すみません。そこはまだ実装していませんでした」と答えました。

 このような「実装抜け」の原因を以下に示します。

  1. やったつもりだった
  2. 作業を後回しにしていた

4.1 やったつもりだった

 実装抜けの原因の1つが「やったつもりだった」という思い込みです。話は脱線しますが、筆者が自宅で風呂に入ろうとしたときの話です。仕事が終わって自宅へ帰り風呂に入ろうと、浴槽を洗い、お湯をためる浴槽のフタを閉め、給湯ボタンを押しました。風呂が沸いたころに服を脱ぎ浴槽に片足を突っ込んだ瞬間、浴槽にお湯が入っていないことに気付きました。原因は、給湯ボタンの押し忘れです。

 このように、学生本人は仕様の通り実装した“つもり”かもしれません。結果として、筆者が確認するまで気付かずに実装抜けが発生したと思われます。

 筆者も恥ずかしながら、実装抜けの経験が何回かあります。仕様を一通り実装し、プロジェクトマネジャーに自信満々に「作成完了しました」と伝えた数時間後、異常ケースを実装していないことが分かり、慌てて追加したことがあります。

4.2 作業を後回しにしていた

 もう1つのあり得る原因は「作業を後回しにしていて忘れた」ケースです。ケーススタディーで学生が実装しなかったロジックは、プログラムの脇道的な機能であり、本人は後回しにしようと考えたのかもしれません。結果として、後回しにしていた箇所を実装し忘れ、バグになりました。

Copyright © ITmedia, Inc. All Rights Reserved.