第8話 テストエンジニアは最後の砦
ソフトウェア開発の最終工程は「テスト(試験)」です。ここをパスすれば、製品またはお客様に納品出来る品質だと一般的にはいわれます。
ところで、テストエンジニア(以下、TE)って、いつごろ派生したエンジニアなんでしょうか?
というのは、わたしがエンジニアになったころは、そういう担当?はなかったと記憶しているからです。せいぜい「テスター」と呼ばれる人たちがテスト仕様書を元にチェックするぐらい。初めて聞いたのは組み込みソフトの開発現場からそういう要求があった時かな。今から10数年前です(この話は後から出てきます)。
テストは、「単体テスト」「結合テスト」「総合テスト」と段階を踏んで実施します。会社によっては多少言葉が違うかもしれませんが(結合テストと総合テストを一緒にしてしているところもあります)だいたいこんな感じでしょうか。
誰が実施するかも会社によって考え方は異なります。一番多いのは「単体テスト」はPGで、「結合テスト」「総合テスト」はSE主導で、PGや他のグループから少し人を借りてやることが多いようです。組み込み機器はある程度動作してからTEを導入するケースが多い。TEがいても通常PGもテストしていると思います。テストはある意味「責任の担保」なので作った人(主にPG)に責任を持ってもらうという考え方もあるようです。
ただ、最近はシステムが複雑化しており、例えば携帯電話では機能は増えるわ納期はないわといった事情だと、どうしても予定がずれ込んで、最終工程のテストがおろそかになりがちです。結局、ある程度デバッグできた所からテストしてもらいバグ出ししながら進める方が効率が良くなります。本当はこのような考えは品質保証の点から言うと良くないのですが、第三者(開発担当者以外)にテストしてもらうこと自体は個人的に賛成です。
■本当のテストができないエンジニア
わたしは、基本的に単体テストの仕様書はPGに、結合テストや総合テストの仕様書はSEに担当させます。最近、レビューして感じるのはテストに対する認識が甘いことです。前にも書きましたが、とにかく「動くこと」が頭の中では最優先なので、テスト仕様書も動くことしか考慮していません。
ひどい仕様書になると、わたしはそれを見るだけでプログラムの構造が理解できます。そう、あくまでもプログラムに沿って正しい動作の検証しか書かれていないのです。わたしから見れば、そんな仕様書作るだけムダだと考えているので、レビューの時にはかなり厳しく意見します。
テストの基本は正しい操作で正しく動作することを確認することだけではありません。逆をいえばそれは当たり前の話で、単体テストの段階でデバッグレベルのバグがあっては正直困ります。イレギュラーな状況、例えば不正な入力データ、サーバーの停止、ネットワーク障害、非常識に大きいファイル入力、めちゃめちゃなキー操作……など、挙げればキリがありません。こういう時にシステムがどのように動作するのかを検証するのが、テストの目的だといえます。
あくまでもユーザーが利用することを前提に、システム(機器)が異常終了やフリーズすることを避けるために行うのであって、間違ってもプログラムが正しく動作することを確認するためではありません。マニュアルに沿って正しく動作することは当たり前です。
■複雑化するシステム、潜在化するバグ
業務システムは多種多用なミドルウェアが、組み込み機器も汎用的なOSの派生であるWindows MobileやLinux、最近ではiPhoneやAndroid等も出てきてシェア争いを繰り広げています。一昔前(今でもだと思いますが・・・)は組み込みOSはリアルタイムOSとひとくくりで呼ばれていた気がします。今ではWebアプリだろうがデスクトップアプりだろうが組み込み機器だろうが同じような開発環境、同じような手法で開発が可能になっています。
どのシステムも一昔前のような「シングルタスク」のOSではないので、高速、高機能な反面、プロセスの実行順序(優先順位)やメモリ配置・配分などすべて時々の状況に合わせてOSが調節してくれます。
これはソフトウェアを作るという意味においては大変ありがたいのですが、逆をいえば、個々のプログラムがどの様に動作するかを決められないと言うことになり、コードの書き方によっては自分達が意図しない動作をします。時には再現性が低いバグもあります。何回か実行するとバグが出るが、その回数も条件もまちまちなケースです。
最近の携帯電話でも発売直後に不具合が発生することは決してまれではありません。昔は回収しましたが、今は端末が自分自身のファームウェアを書き換える機能を持っているので回収しなくても済みますが、これも複雑化するシステムや機能の副作用だといえます。
■テストエンジニアに向いている人は?
一般にソフトウェアテスト呼ばれる物は「ホワイトボックステスト」と「ブラックボックステスト」に分類されると思います。わたしは、ホワイトボックステスト(カバレッジ)は、PGが責任を持ってやるべきで、「ブラックボックステスト」はTEが行うものだと考えています(あくまでもわたし個人の考えです)。
エンジニアは知識と経験をバランス良く積んでいくことが理想だと思います。知識に偏ると頭でっかちなエンジニアになり、応用が利かなくなります。経験だけではアーキテクチャーが古くなり、設計時に支障が出ます。
しかし、TEは以下の項目については他のエンジニアよりも長けている必要があると思います。逆にプログラミング技術は基本的なものだけ理解していれば良いと思います。
- システム全体を正しく把握できること
- ドキュメントの行間が読めること
- 恣意的にKY(空気読まない)なこと
例えば、携帯電話で考えてみます。携帯電話の基本的な動作はキャリアによって決められています。電話がメインなのでメールを入力している途中など、着信があればどんな操作よりも着信動作が一番優先になります。メール着信はおそらくその次ぐらいでしょうか。
プログラム的には割込動作なのですが、テストではそんなもの目に見えないのでTEは「電話の着信は最優先」「メール着信はその次」と考えます。切断(終話)ボタンを押すと必ず待ち受け状態(画面)になり、長押しすると電源オン・オフします。これら全体の動作を把握することがまず第一歩です。PGは機能単位で切り出すので、全体動作(結合・総合テスト)でどうなるのかを考慮しません。逆を言えば、仕様書段階で考慮しなくても良いようにしてあるのが普通です。ですから、他の担当者の機能についてはあまり詳しくない(関知しない)のが普通でしょう。
通常、マニュアルには正しい操作方法や、してはいけないことが書かれています。仕様書も処理方法やエラーなどが書かれていると思います。TEはここから「暗黙の了解」を読み取ることが必要になります。何故かと言えばユーザーは「マニュアル通りに操作するとは限らない」からです。例えば、携帯電話で、通話の最中に「メニューキー」を押すとどうなるか、切断(終話)キーを押すと通話が終了するが、長押ししたらどうなるかなどはあまり書いていないと思います(実際はキャリアの方でどのように動作させるか決めてある)でも、書いていないからとテストを怠ると、発売後にユーザーが通話中に何気なくメニューキーを押したら電源が落ちた……なんてことになりかねません(あくまでも例です)これがタイトルに書いた「最後の砦」の意味です。不具合が発生してから「やってなかった」ではその砦は何の役にも立ちません。
本当にKY(空気読めない)では困りますが、テスト中はKY(空気読まない)がベストだと考えています。試験は製造工程とは別のラインで行うのが普通です。納期が迫ってくると現場の雰囲気もピリピリしてきてテストしてても「バグが出ないといいなぁ」と言う感じになってきますが、TEはこういう時こそどんどんバグを発見して欲しいと思います。バグなんてそういう時に出るものですし。バグが出て文句言うエンジニアは文句をいう前にバグを出さないソフトウェアを作るべきであって、バグを発見してもらったらむしろ感謝するべきです。
先ほども書きましたが、「最後の砦」である以上、妥協も温情も許されません。品質保証のためには厳しすぎるぐらいがちょうど良く、それができないならテストエンジニアは務まりません。リリース後の不具合は「しょうがない」ではなく、人災だと考えるべきです。
■テストエンジニアを育ててみた
わたしは、コラムの第3話で登場した上司にテストチームを作るからその連中を教育して欲しいといわれたことがあります(いまでもあるかはわかりませんが)。背景は組み込み機器(携帯やカーナビなど)の高機能化と開発期間の短縮があります。また、開発する側としても、ソフトウェアの開発とテスト専属チームによる品質保証で仕事を取りやすいと言ったメリットがあります。当時、この話をもらった時はすでに案件(携帯電話のテスト)があって、嫌でもやらなければならない状態でした。いつものことでしたが……。
チームは女性ばかり3名で新人から5年程度のエンジニアでした。当然、テスト専属なんて経験はありません……って、わたしにもありませんでしたが。
取りあえず、経験から方針と納品方法(テストをやった、だけではさすがにお金はくれないでしょうから)を決めました。テストはマニュアルを元にしたブラックボックステストで、ビルド別に最低3回行ないます。(それ以上は別契約)検査項目書(検査仕様書)はデータベース(この時はMicrosoft Access)で作成し、レポート印刷を可能としました。納品物はデータベースファイルと印刷したレポートです。
わたしはデータベースの作成と検査項目の作り方をメンバーに教え、あとはリーダー予定の女性と2人で打ち合わせに行ったりしてました。あとはレビューなどで指導しました。自分では手探りでしたが、わたしが関わった最初と、その後2回検査を請け負った結果では発売後に不具合が出なかったのでまずは及第点かと思いますが、わたしのキャリアの中で唯一「良かったのだろうか?」と今でも考えることのある案件です。
ちなみに携帯電話の場合、昔は地域によって会社が分かれていました。この場合「ローミング」があるのですが、社内でテストできないので、車でエリア外まで行ってテストしたこともありました。あと、困るのは「非常電話」です。いわいる「110」や「119」ですが、こればっかりは実際にテスト出来ないので、網シミュレーターを使いました。
■あなたは本物のエンジニアか?
何回かに分けて今のエンジニアの問題点など書いてみました。PM、SE、PG、TE、他にもまだ役割はありますが、WindowsのクライアントOSですらかなり複雑なものになっており、作るソフトウェアの規模や種類によらず1人でプロジェクトを遂行するのは期間的にも難しくなっています。
わたしは、エンジニアは自分の与えられた役割の中でベストパフォーマンスを発揮できる人だと考えています。SEだろうがPGだろうが関係ありません。スキルだけでも経験だけでもなく常に全体を考えて欲しいと思います。
複雑化するシステムの中では大変だと思いますが、みんなが本物のエンジニアを目指せば、きっとデスマーチも失敗プロジェクトも減り、少しはこの業界を目指す人も増えるのではないのでしょうか。若いエンジニアが自由に活躍できる業界になることを期待したいです。
次からはエンジニアを取り巻く環境をメインに進めようと思います。具体的にはビジネス、経営、職場や雇用、そしてお金です。エンジニアはこれらのことを、あまり自分に関係ないことのように捉えがちですが(フリーの人はそうでもないと思いますが)これからはそうも言ってられない状況になると思います。スキルだけでは生き残れる保証もありません。それにはまず、自分たちの取り巻く環境を知り、考えることから始めましょう。
コメント
インドリ
今回もよいコラムですね、熟読してしまいました。
にゃん太郎さんが仰るとおりで、システムは複雑化し、それに伴いテストエンジニアも高い技術が求められているのに、テストエンジニアは技術力がそれ程なくても大丈夫だと考えている会社が多いんですよね・・・
デバッグをする際には、次のスキルセットなどが必要です。
・プロジェクトの理解や知識
・プログラミング言語の知識
・テクノロジーとツールの理解
・OSと環境の知識
・CPUに関する知識(アセンブラや動作)
これらのスキルセットを兼ね揃えた人物は悲しい事にそうそういません。
あと、デバッグは計画的にせねばならないという事を知らない会社も多いですよね・・・
「デバッグは計画的に!」
ビガー
ビガーです。
テストは、設計の不備を補完するものとして働いて、初めて意味があるものと考えています。
そのため、全体を俯瞰できるスキルやある意味設計者以上のスキルが求まられる高度な作業だと個人的には捉えています。そういう意味でとても共感できる内容でした。
前に関わったプロジェクトを思い返してみると、バグを発見しても報告をしてこないエンジニアが結構いました。理由は、納期が近いから今更どうしようもないでしょ?とか、大した問題ではないと考えたので。。など。
致命的なバグであれば、代替手段を講じるか、納期を延ばさざるを得ない。
致命的でなくても、既存の仕様としてお客様と認識をあわせて、いつ対応するかを決める必要がある。
確かにプログラマからするとバグは、自己否定的要素が大いにあるので心情的にはわかりますが、プロジェクトのことを本当に考えるなら誠実に報告するべき。
その後、猛省して同じことを繰り返さないことが肝要だと思います。
テストはそういう意味でも最後の砦だと思いますね。
第3バイオリン
にゃん太郎さん
帰省先からコメントです。
今回のコラムはテストエンジニアとして大変共感しつつ、耳が痛い部分もありました。
開発者(PG, SE)は資格の種類も多く、キャリアパスについての啓蒙活動も社内外で頻繁に行われています。一方、テストエンジニアとなるとキャリアパスについてのモデルケースが圧倒的に少なくて、エンジニアの中でもまだまだ発展途上なジャンルである感じは否めません。その分、伸びしろがあるというか、穴場でもあると思っています。
(私のコラムがモデルのひとつになれたら・・・と思ってはいます。きれいなモデルとはいえないでしょうが)
>、「最後の砦」である以上、妥協も温情も許されません。品質保証のためには厳しすぎるぐらいがちょうど良く、それができないならテストエンジニアは務まりません。
おっしゃるとおりです。
私は「私が最後のストッパーだ!」という気持ちで仕事に臨んでいます。
テストというのはうまくいって当たり前、失敗してユーザー元でバグを出してしまえば責められます。
つまりテストエンジニアというのはユーザーに存在を知られてしまったら負けだと思っています(なんて皮肉な商売)。
そうはいっても、仕様書に書かれない「暗黙の了解」をうっかり障害として報告してしまったり、開発者の事情にほだされそうになったり(元開発者なので無駄にわかってしまう)間抜けな失敗は時々やってしまいますが。
>スキルだけでも経験だけでもなく常に全体を考えて欲しいと思います。
テストエンジニアになってから、プロジェクト全体のことやいろいろな立場の人の思惑(いわゆる「大人の事情」)に嫌でも向き合わなくてはならない状況になりました。
プログラマをやっていたときには考えたこともなかったことばかりです。
正直キツイですが、今は「何でも来い!乗り越えてみせる!」という気持ちのほうが勝っています。
にゃん太郎
インドリさん、ありがとうございます。
> テストエンジニアは技術力がそれ程なくても大丈夫だと考えている会社が多
> いんですよね・・・
それは私も思います。最近では余剰人員のPGなどがシフトしているように見えま
すが、本来は設計やプログラミング同様、ひとつのスキルとして確立すべきジャン
ルです。業界全体では重要度は認識されていますが、個々の会社やプロジェクトと
なるとまだまだ腰が重いのが実情です。
> ・CPUに関する知識(アセンブラや動作)
ここまで必要かと言われれば難しいですが、まぁ、私の経験上知っていれば大抵
のトラブルは解決しますよね。昔、デュアルCPU(デュアルコアじゃなくて本当に
CPUが2つある方)で動作するWindowsのデバイスドライバを作った時、おかしな動
きをする時があったので解析する時にアセンブラの知識があったので解決した、と
言う事はありました。
最近のJavaや.Netはブラックボックスが多すぎて今のエンジニアにはOSの知識
やアセンブラなんて念仏程度にしか聞こえないかも知れません。このあたりは次の
次のシリーズで書こうと思います(書きたい事はまだまだあるので)
にゃん太郎
ビガーさん、ありがとうございます。
おっしゃる通り、納期近くでのバグ発見は状況によっては大打撃になります。で
も、そのまま放置すると逆に損失が出るのは確実なので顧客がいる場合は誠実な対
応が不可欠だと思います。前に、納期ギリギリで発見したバグをエンジニアが隠し
てしまいそのままリリースしたら当然不具合が出て、損害金がかなり出た事があり
ました。
本来はテストに関しても教育が必要だと思っていますが、確認だけだから誰でも
良いだろうと言う風潮は大なり小なり存在します。この考え方がリリース後の不具
合が減らない要因のひとつだと思っています。スキルとモラルの両方が高いレベル
で求められるポジションなので設計やプログラミング以上に厳しいと思いますが、
顧客に「また(バグが)出たの?」って言われないようにしないと利益も信頼もな
くなります。
作る事にばかり目を向けないで、作った物の品質にも同じかそれ以上手をかけな
いとシステムが複雑になっているだけに死活問題にも繋がりかねない事を認識すべ
きです。
にゃん太郎
第3バイオリンさん、ありがとうございます。
> 帰省先からコメントです。
うらやましいです(笑)私は今日も仕事です。
テストエンジニアの難しいところは「バグを探す(出す)事が仕事ではない」と
言う事です。プロジェクトによってはナゼかバグの発生率を決めていてそのノル
マ?達成のために頑張ってバグ出しするケースもありますがどこか間違っていると
思います。
現実問題、バグがない事なんてあり得ないでしょうし時には仕様かバグかなんて
ケースもありますが、テストエンジニアの仕事は使う側の立場に立って検証し不具
合があれば開発側と相談して修正するためのプロセスを効率よく行う事にあると考
えています。ビガーさんのレスにも書きましたが、スキルとモラルの両方が高いレ
ベルで必要なポジションです。また、発見した不具合を蓄積、共有する事によりシ
ステムの信頼性や生産性を上げるためにも優秀なテストエンジニアのいる組織は顧
客の信頼も厚いと思います。
プログラマからみると天敵みたいに思われがちですし、状況によってはプログラ
マからシフトすると「左遷」みたいなイメージもあります(タイミング良く?森姫
さんがこの事を書いていますが)でも、私は優秀なプログラマが優秀なテストエン
ジニアになれるとは限らないと思いますが、優秀なテストエンジニアは優秀なシス
テムエンジニアやプログラマになれると思います。他人が作ったものを客観的に捉
え、テストする事は基本的にはリバースエンジニアリングと同じ手法だと私は思っ
ています。バグ出しだけに精を出すのも困りますが、バグを出す事により「なぜバ
グが出たのか」という分析をする事はシステムの品質を上げるにも、自分がこれか
らエンジニアとしてキャリアを積むにも最適なポジションだと思います。
これからも第3バイオリンさんの活躍を期待してコラムを楽しみにしています。
kuma
にゃん太郎さん
私も、新人の頃にパッケージソフトの「テスター」を2年近く
やったことを思い出しました。昨今は、テストを請け負う会社
もあり、かなり立場が違ってきているなと思います。
自分で、シナリオを書いて、チェックしてもらってユーザー
テストをしていました。
今となれば、この経験は開発する上ですごく貴重な経験に
なっており、開発をする上で活かされています。
ヘルプデスクをした経験も役に立っています。
本当に、ユーザーの立場に立ったシステムを開発したいのなら、
経験する価値は大きいと考えています。
ただ、テストエンジニアの方を見て残念に思うのが
単価(人月)が安いなと思います。専門会社でもない
限り、PGの方より安いことが多いのではないでしょうか?
この変が改善されればと思っております。
次回の記事も楽しみにしております。
にゃん太郎
kumaさん、ありがとうございます。
> ただ、テストエンジニアの方を見て残念に思うのが
> 単価(人月)が安いなと思います。
重要性の割に待遇はいまいちだと私も思います。総じてこの業界は「PM > SE
> PG > TE」という構図があります。もっと言えば運用とかネットワークエンジニ
アとかもあるのでなかなかひとくくりに出来ませんが、本来は役割なのでこういう
構図はおかしいですよね。役職じゃあるまいし(この辺の話はまたコラムに書きま
すが)
あと、テストにはたいしたスキルは必要ないと思われている部分もあると思いま
す。極論すれば誰でも良いみたいな。SEやPGと異なるスキルが必要なのでその部分
をきちんと確立して評価しないとテストエンジニアが待遇に不満を持って中途半端
な仕事するようになるとプロジェクト自体が崩壊しかねません。
最近の野球も昔みたいな先発完投ではなく、先発→中継ぎ→ストッパーという形が
ほぼ確立しています。プロ野球のピッチャーの年俸トップ(推定)は岩瀬選手(中
日)、2位は藤川選手(阪神)でともにストッパーです。いかに最後を締める事が重
要か・・・なんだと思います(いや、単純に野球と比較は出来ませんが詰めが甘いとど
うなるかと言う部分では同じだと思います)