社内SEになりました

社内SEは本当に楽なのか?ユーザー系IT企業とSierとの違いは?これからIT企業への就職や転職を考えている人むけに、ユーザー系IT企業から社内SEに40代で転職した筆者がITエンジニアの仕事内容やプロジェクト管理のノウハウ等をご紹介。

開発工程(受入テスト)

開発工程の中の受入テストの説明です。

受入テストはベンダーのテストが終わった後、発注者が検収のために実施するテストです。受入テストには、システム部門の受入テストとユーザー部門の受入テストの2種類があります。

1.システム部門の受入テスト

システム部門の受入テストは、外注している場合に実施します。当然、内製している場合には実施しませんし、ベンダーに丸投げしているようなシステム部門もやりません。きちんとベンダーコントロールしているシステム部門でも小規模案件では実施しないことも多いです。

ベンダーのテスト内容をきちんとレビューしていれば、システム部門の受入テストは必ずしも必要ではなく、必要なケースはベンダーの責任範囲がテストに必要な範囲よりも狭い場合です。

例えば他システムとの連携が重要なシステムで、ベンダーの請負範囲は自システムだけの場合、他システムとの連携テストはベンダーのテスト対象となりません。その場合には、システム部門が他システムとの連携テストを実施します。

私が新卒で入った会社は、システム同士が密に連携し合っていたため、システム部門の受入テストを非常に重視していました。規模の大きい案件の場合、システム部門の受入テストを半年間も延々と実施していたこともあります。

2.ユーザー部門の受入テスト

ユーザー部門の受入テストは、自分たちの思ったとおりにシステムが作られているかを確認するためのものです。

きちんとテスト仕様書を作ってテストする場合もあれば、ユーザーが好きなようにシステムをいじる場合もあります。テスト仕様書を利用する場合、通常はユーザーはテスト仕様書なんて作れないので、システム部門やベンダーが作ってお膳立てをしてあげます。

一般的に良く言われるのが、「テストは後工程に進むほど不具合の修正で手戻りが大きくなる」というものですが、これは必ずしも正しくはありません。V字モデルを妄信して、テストの工程の本質を理解できていない人の誤解です。

テストの初期の段階である単体テスト結合テストでも、致命的な不具合が見つかって早々にユーザー部門に「ごめんなさい」を言うこともあります。

対応が難しい不具合と、発見されるテスト工程には関係がありません。

もちろんユーザー部門の受入テストでも、対応が難しい不具合を指摘されることもゼロではありません。ただ難易度の高い不具合をユーザーがテストで見つける可能性は非常に低く、ほとんどの場合は表面的な「メッセージ修正」であったり、「メッセージの出るタイミングの変更」であったり、修正量としては軽微なケースが多いです。

ただユーザー部門の受入テストは、通常、リリース間近に実施する場合が多く、不具合が出ないことを見越してリリース資産を凍結してしまう場合もあります。そういった場合、軽微な修正であっても「安全なリリース」の観点から、ユーザー部門に「ごめんなさい」をして、リリース後の対応とする場合も多々あります。

3.運用部門の受入テストというものもある

システム運用の部門が強い会社だと、この運用部門による受入テストがあります。

開発部門は「柔軟にユーザーの要望を叶えたい」という顧客満足を最優先とし、運用部門は「安定したシステムをユーザーに提供したい」というシステムの安全安定運行を最優先としているため、この性質の違いから開発部門と運用部門は水と油のように相容れません。

そのため会社によっては、この運用部門の受入テストが最大のハードルになる場合もあります。

運用部門の受入テストの観点としては、今までの運用マニュアルの中で正常にシステム運用ができるか?というものです。あるいは運用が変わる場合、変更された運用マニュアルで「誰でも」運用ができるか?というものです。

この「誰でも」という部分が非常にくせ者で、私かかつて在籍していた官公庁系の会社では、PCの電源を入れるところからマニュアルに記載しないといけませんでした。しかもその電源の入れ方も、PCの写真を貼りつけて電源の場所まで明記しないといけませんでした。

マニュアルが無いとPCの電源も入れられないような人に、運用を任せたくはないのですが・・・

【振り返り】

今回は受入テストの説明でした。

開発工程の紹介は以上となります。

①戦略・企画
②要求定義
③要件定義
④基本設計
⑤詳細設計
⑥製造
単体テスト
結合テスト
⑨総合テスト
⑩受入テスト

今週のお題「自慢の一着」

はてなブログ今週のお題「自慢の一着」

はたして自慢と言っていいのか・・・

新入社員の時に、社員旅行で幹事をやりました。

幹事みんなで揃いのユニフォーム?を着ることになり、多数決で選ばれたのは泥棒柄の全身タイツ・・・。

まだ実家通いだったので、会社で支給された全身タイツを持って帰ると、父と母が興味津々。

冗談で「着てみる?」と聞いてみると、嬉々として二人とも全身タイツマンに。

意外な両親の一面を発見しました。

f:id:SystemEngineers:20200516173323j:plain

全身タイツ

テレワークの終焉?

新型コロナの感染者が減ってきて、うちの会社の店舗も少しずつ営業を再開。

とても喜ばしいことですが、この快適な在宅勤務生活はどうなるのか気になります。

今のところの方針は、本社は出社人数70%減の方針。

細かいルールはこれからのようですが、この2ヶ月間、テレワークでまったく不便を感じなかったので、オフィスに出社する意味を見いだせなくなってしまいました。

もう電車に乗りたくないです。

今週のお題「会いたい人」

はてなブログ今週のお題「会いたい人」

かれこれ20年近くお世話になっている石垣島の民宿があります。

オーナーが海人(うみんちゅ)の宿で、毎年夏に1週間くらいお世話になっています。

台風で宿に閉じ込められている時に、暇つぶしに車で島内観光をしてくれたり、オーナーが経営している水産会社を見学させてくれたり、行く度にお土産をもらったり。

でも20年近く毎年行っていると、飽きてくるのも正直なところで、最近は「また会いたい」というより義務感のような感じで滞在していました。

でも今年は、コロナの影響で民宿は休業。オンシーズンに宿を閉めてしまって、果たして民宿を継続できるのか。

オーナーたちの温かい笑顔を思い出すと、「会いたい」という思いが強くなります。コロナは歓迎できないけれど、当たり前だったものの大切さに改めて気づかせてくれました。

来年は、またオーナーの笑顔に会いに、石垣島に行こうと思います。

f:id:SystemEngineers:20200510190725j:plain

経営会議承認

4億円の案件の承認を得るため、経営会議に出席。

役員たちは皆、出社して会議室に集結していましたが、私は在宅勤務なのでテレビ会議で報告。

目の前に社長がいないので、重苦しい雰囲気を感じることもなく、淡々と説明することができました。

会議は1時間かかりましたが、その大半は「これだけの投資をして、本当に効果があるのか」という答えの無い、誰に対しての質問なのか独り言なのか良く分からない、つぶやき?

同じ会議室にいたら、きっと強いストレスを感じたと思うのですが、パソコン越しなので、会議室で社長から目をそらしている役員たちを、ドラマでも見るかのようにぼーっと眺めていました。

そして、「もう一度、費用対効果を出し直すように」という捨て台詞はありましたが、無事に承認。これで1年以上は社内失業せずにすみます。

開発工程(結合・総合テスト)

開発工程の中の結合・総合テストの説明です。

1.V字モデルの勘違い

テストは、一般的には単体テスト結合テスト、総合テストと呼ばれる工程に分けられます。たまにV字モデルというものを持ち出して、この工程の違いを説明する人がいますが、その説明はほとんどの場合、実態とずれています。

テストは、システムが自分たちの思ったように作られているかを確認する作業です。厄介なのが、この「自分たち」です。「自分たち」には、ユーザー部門、システム部門、元請けベンダー、再委託先のベンダー、様々な立場の「自分たち」がいます。テストの工程は、この「自分たち」の違いで大きく分けられます。

例えば製造工程までの責任範囲が以下のような場合、
①要件定義:事業会社のユーザー部門やシステム部門
②基本設計:元請けベンダー
③詳細設計と製造:再委託先ベンダー

テストは以下のような工程と責任範囲で分けられることが多いです。
①受入テスト:事業会社のユーザー部門やシステム部門
②総合テスト:元請けベンダー
結合テスト単体テスト:再委託先ベンダー

これがいわゆるV字モデルです。V字モデルを持ち出して説明する人の多くが、例えば②の総合テストであれば、「総合テストでは基本設計書通りに作られていることを確認する」という説明をします。

f:id:SystemEngineers:20200426152759p:plain

でもこれは誤りです。なぜなら詳細設計書も基本設計書も要件定義書も書いてあること(書きたいこと)は同じで、表現方法がユーザーよりかシステムよりかで違うだけだからです。

2.テストの工程の意味

テストは大きくは、「プログラムのテストか、機能のテストか」と、「単体のテストか、結合のテストか」の計4パターンで分けられます。

f:id:SystemEngineers:20200426162036p:plain

プログラムのテストは、いわゆる「単体テスト」と呼ばれる工程で実施するものです。テストの最小単位は「モジュール」です。スタブやドライバといったダミーモジュールを使って、モジュール単体のテストやモジュール同士の結合テストを実施します。

機能のテストは、いわゆる「結合テスト」とか「総合テスト」と呼ばれる工程で実施するものです。テストの最小単位は、「画面」とか「帳票」とか「バッチを動かすシェル」とか、システムを使う人が意識するものです。この機能テストも画面や帳票単体のテストと、画面遷移や画面から帳票を出力したりといった結合テストの2種類があります。

つまりテストのパターンは、テストの最小単位を「モジュール」とするのか「画面や帳票等」とするのか、テストの範囲を最小単位自体とするのか(「単体」)、最小単位同士とするのか(「結合」)の4パターンで分かれるのです。

そして一般的にモジュール単体のテストと、モジュール同士の結合テストは、「単体テスト」工程で実施し、画面や帳票単体のテストとそれら同士の結合テストは、「結合テスト」工程と「総合テスト」工程で実施します。

f:id:SystemEngineers:20200426104857p:plain

3.結合テストと総合テストの違い

結合テスト工程以降では、機能のテストを行います。前述のように機能のテストは、画面や帳票、バッチ等の単体のテストとそれらの結合テストの2種類しかありません。

ここで大切なことは、テスト範囲の定義です。一般的には「機能」や「サブシステム」といった括りで複数の画面や帳票、バッチをまとめます。本来は設計工程で定義するものですが、設計工程での定義とテスト工程での定義が、必ずしも一致しないことも多々あります。

機能テストの最小単位は画面や帳票等で、機能はそれらをまとめた「要件を実現できる最小単位」です。サブシステムは、それらの機能をまとめたもので、業務の括りでまとめたりします。

例えば稟議のワークフローシステムの場合、「稟議申請画面」や「稟議承認画面」、「稟議参照画面」、「稟議整理簿出力画面」、「稟議整理簿」、「未承認稟議の催促通知バッチ」、「稟議削除バッチ」、「稟議整理簿削除バッチ」、「ユーザーマスター登録画面」、「組織マスター登録画面」といったものがテストの最小単位になります。

f:id:SystemEngineers:20200426114035p:plain

この稟議申請画面と稟議承認画面を「稟議決裁機能」、稟議参照画面、稟議整理簿出力画面と稟議整理簿、未承認稟議の催促通知バッチを「稟議管理機能」、稟議削除バッチと稟議整理簿削除バッチを「メンテナンス機能」、ユーザーマスター登録画面と組織マスター登録画面を「マスター管理機能」といった機能で括ります。

f:id:SystemEngineers:20200426114155p:plain

さらにこの機能を、稟議決裁機能と稟議管理機能は「稟議サブシステム」、マスター管理機能とメンテナンス機能は「管理サブシステム」といったサブシステムで括ります。

f:id:SystemEngineers:20200426114250p:plain

一般的には、このサブシステム内の結合テストを「結合テスト」工程で実施し、サブシステム間の結合テストを「総合テスト」工程で実施します。

冒頭の責任範囲の例でいうと、再委託先ベンダーは、サブシステム内で完結するテストまでが責任範囲で、元請けベンダーはサブシステム間のテストが責任範囲となります。

4.なぜテストの工程を分けるのか?

 理由は二つあります。一つは立場の違いによるものです。それぞれの立場の責任範囲でテストをするため、それぞれの立場ごとにテストの工程を分けます。

そしてもう一つの理由が本質的なもので、「割り切り」のためです。

結合テストは、対象範囲が広くなればなるほどテストの数が膨大になります。

例えば、稟議申請の入力パターン(機密区分の違いや決裁者の違いなど)が10パターンあり、承認のパターン(承認、差し戻し、否認など)が5パターンあった場合、申請画面と承認画面の結合テストは、50パターンあります。さらにそれらを参照画面で4パターンの人(申請者、承認者、同一部署、別部署)が見る場合、200パターンのテストとなります。

f:id:SystemEngineers:20200426120311p:plain

でも例えば「承認された社外秘の稟議」と「否認された社外秘の稟議」、「承認された厳秘の稟議」と「否認された厳秘の稟議」を参照する際、これらの違いは社外秘か厳秘、承認か否認なので、「承認された社外秘の稟議」と「否認された厳秘の稟議」の2種類を参照すれば、テストとしては十分です。もちろんこの2つがOKでも、「承認された厳秘の稟議」の参照がNGとなる可能性はゼロではないのですが、費用対効果の観点で、テストをしていなくても恐らくOKだろうと割り切るのです。

f:id:SystemEngineers:20200426122518p:plain

具体的なテストケースとしては、以下のように全200ケースのうち、実際の稟議参照のテストは52ケース程度に絞ることができます。

f:id:SystemEngineers:20200426190445p:plain

f:id:SystemEngineers:20200426201900p:plain

この割り切り度合いが、機能内の結合テスト、サブシステム内機能間の結合テスト、サブシステム間の結合テストと範囲が広くなるにつれて(結合度が弱くなると表現します)、大きくなります。

先ほどの例でいうと、稟議申請と承認の結合テストは、どちらも稟議決裁機能内の結合テストなので、全パターンをテストして、これらを参照するテストは、稟議決裁機能と稟議管理機能の機能間のテストなので、必要な要素の組み合わせテストに絞ってテストをします。

申請した稟議を削除するといった「稟議サブシステム」と「管理サブシステム」といったサブシステム間の結合テストの場合には、さらに大量にあるテストの組み合わせの中から、実際にテストする組み合わせを大幅に絞り込むことになります。

f:id:SystemEngineers:20200426173854p:plain

役割分担の例でいえば、再委託先のベンダーは、稟議申請をして承認をして稟議整理簿を出力するといった流れまでは品質を担保して、元請けベンダーは稟議申請をして承認をして稟議整理簿を出力して、一定期間経過後に稟議を削除したり、稟議整理簿を削除したりといった流れまでの品質を担保します。

これが元請けベンダーがテストをする際、申請した稟議を承認できないといったようなバグが見つかると、再委託先ベンダーに強化テストを要請したりして、本来やろうと思っていた稟議の削除等のテストが進まなくなり、総合テストの進捗が遅延することになります。

5.重要なこと

繰り返しになりますが、結合テストと総合テストの本質的な違いはありません。

重要なことは、機能やサブシステムを定義し、元請けベンダーや再委託先ベンダーの責任範囲をどこまでのテスト範囲にするかを明確にすることです。

結合テストは、誰がどの範囲のテストをすることなのか、総合テストは誰がどの範囲のテストをすることなのか、といったテスト全体の工程定義を全体テスト計画というもので、テストを開始する前に明確化します。

契約時点でおおよそのことは決めていますが、開発が進まないと具体的な画面や帳票といったテストの最小単位が決まらないので、通常は製造工程に入った頃に全体テスト計画で、テスト工程をいくつに分けて、それぞれの工程の範囲を決めることになります。

ここでしっかり定義ができないと、テストの網羅性が担保できず、テストの不足が発生することになります。

先ほどの例でいうと、結合テストは再委託先が実施し、テスト範囲はサブシステム内の結合テストまで。総合テストは元請けベンダーが実施し、テスト範囲はサブシステム間の結合テスト、といった責任分担にしたとします。

このとき機能の定義が曖昧だと、再委託先は「稟議削除バッチ」が「稟議申請画面」とは別サブシステムと思い、この2機能の結合テストを実施せず、元請けベンダーはこの2機能を同一サブシステムだと思い再委託先がテスト済みと思い自分たちではテストを実施しない、ということが起こりえます。

f:id:SystemEngineers:20200426161549p:plain

f:id:SystemEngineers:20200426161609p:plain

結合テストは××設計書のとおりに作られているかを確認し、総合テストは△△設計書のとおりに作られているかを確認する、といった考えとは根本が違います。

定義ありきではなく、プロジェクトごとにテスト工程の定義を作ることがとても重要です。

参考までに私がPMとして携わった一番大きなプロジェクトは40億円の規模でしたが、この時にはテスト工程を以下のように定義しました。ちなみにプロジェクト体制は、元請けベンダー配下に再委託先が7社あり、7つのサブシステムをそれぞれの再委託先1社が担当していました。

単体テスト(いわゆるプログラムテスト):再委託先が実施
②機能内結合テスト(いわゆる画面単体のテスト):再委託先が実施
③サブシステム内機能間結合テスト:再委託先が実施
④他システムとの連携テスト:元請けベンダーが実施
⑤サブシステム間結合テスト(いわゆる総合テスト):元請けベンダーが実施
システムテスト1(いわゆる受入テスト):発注者のシステム開発部門が実施
システムテスト2(他システム含めた事業会社のシステム全体テスト):発注者のシステム開発部門が実施
⑧運用テスト:発注者のシステム運用部門とユーザー部門が実施

6.テストは、たくさんやれば良いというものではない

このテストケースの絞り込みですが、最近は起こりえる全パターンをテストするベンダーが多いのが実情です。テストケースの絞り込みは、個人のスキルに依存するので、全ケースをテストした方が良いという主張です。

果たして、全ケースをテストすることと、ケースを絞ってテストをすること、どちらが品質が良いでしょうか?

必ずとは言いませんが、ケースを絞ってテストをする方が品質が良いです。

プロジェクトに与えられた予算、期間、要員には限りがあります。実施するテストケースの量が多いからといって、テスト期間を延長するということはありえません。

同じ期間でテストを実施する場合、当然、ケース数が少ない方が一つ一つのテストを丁寧に実施できます。逆にたくさんテストをすると、テストを実施することで精一杯になり、本来のバグを見つけるという目的を見失ってしまいます。

人間はルーティンワークに、いつまでも集中力を保つことができません。似たようなテストを繰り返すと、いつの間にか思考が停止してしまいます。

テストをしてエビデンスにはバグがはっきりと出ているのに、バグを見逃すということがあります。無駄に大量にテストを実施するプロジェクトでありがちなミスです。

ではテストを絞って、除外したケースにバグが潜んでいたら、どうすればいいでしょうか。

それは反省すればいいのです。きちんとロジカルにテストケースを絞ったのであれば、そのロジックに考慮不足の点があったはずです。その考慮不足の点を補って、追加テストをすればいいのです。ほとんどの場合、漏れたテストケースは業務全体で見ればレアケースなので、致命的なバグである可能性は非常に低いです。このロジカルにテストケースを絞って、考慮が漏れていた点があれば反省して次のプロジェクトに活かす、ということの繰り返しがスキルアップに繋がっていきます。

スキルの低い人は、このロジカルにテストケースを絞ることができないので、何も考えずに全ケースをテストしてしまい、いつまで経ってもスキルが向上せずに効率の悪い仕事を延々と続けていくのです。

もちろんこの考えは、人の命に関わるようなミッションクリティカルなシステムや、100億円を超えるような規模のシステムには当てはまりません。プロジェクトの特性に合わせて、テストの仕方を変えていく必要があります。

【振り返り】

今回は結合・総合テストの説明でした。次回は受入テストの説明をしていきたいと思います。

①戦略・企画
②要求定義
③要件定義
④基本設計
⑤詳細設計
⑥製造
単体テスト
結合テスト
⑨総合テスト
⑩受入テスト

今週のお題「カメラロールから1枚」

今週のお題「カメラロールから1枚」

きのこフェチです。

家の観葉植物の土に、きのこが生えることがあります。

本名は分からないので、きのこ姫と名付けています。

最初は、しめじのような形で、徐々に成長するに従って傘が開いていきます。傘が開いて少し経つと、胞子のようなものを吐き出して、徐々に干涸びていきます。

そろそろ大往生かと思っていると、少し離れたところに赤ちゃんきのこが!

きのこ姫の一生は、だいたい1週間くらい。世代交代を繰り返して2、3ヶ月くらい楽しませてくれます。

f:id:SystemEngineers:20200502162641j:plain

きのこ姫