ふつーのプログラマです。主に企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。

レインメーカー (32) トラブルと責任

»

◆アリマツ通信 2022.6.24
 T社業務のトラブルについて
 先週発生したT 社業務のトラブルは、ようやく全てのデータが復旧し、本日から通常業務として稼働しています。臨時ヘルプとして招集されたSV・OP のみなさん、おつかれさまでした。
 詳細な原因と再発防止策について、DX 推進ユニットの田代さんは、今週中に報告書を出すことを約束しています。トラブル事象経過報告については、すでに共有されていますので、CC 業務に携わるみなさんは一読しておくといいかもしれませんね。報告はこちらから(PDF 形式345KB)。

 文 総務課 土井

 ◇ ◇ ◇ ◇ ◇

 予兆はあった。誰の目にも認識できる形で黙示されていた。一つの重大事故発生の裏には29 件の軽い事故があり、300 件のヒヤリハット事象がある。その多くは再発防止が可能だったから、適切に対応していれば今回の重大トラブルに発展する前に防げたはずだ。にもかかわらず、主に多忙を理由に手を打つことを怠ってしまった。
 「それで」横浜セールス課の三辻課長は、会議テーブルを指で叩きながら、苛立ちを隠そうともせず訊いた。「結局、誰の責任なの、これ?」
 誰の責任でもない。イズミはそう言いたかったが、口を開こうとはしなかった。ここでハインリッヒの法則の話などしても、責任逃れをしていると取られるのがオチだ。
 「それはまだ調査中です」田代が言った。「ソフトウェアの不具合というものは、単純に誰のせい、というようなものでもなく......」
 「あのさ」三辻は田代の言葉を遮った。「そんな言葉遊びはどうでもいいのよ。わかる? 俺は明日にもタマノイさんに経緯の説明をしなきゃならんの。そのとき、うちには責任はありません、なんて言えるわきゃないことぐらいわかるでしょう。とにもかくにも、NARICS の不具合だったのは確かなんだからさ」
 「そこを責任逃れするつもりはありません」田代はきっぱり答えた。「むろん最終的な責任は開発部隊のリーダーである私にあります」
 「だからそういう話をしてるんじゃないんだって」
 吐き捨てるように言うと、三辻は会議テーブルの上に散らばったプリントアウトに手を伸ばした。
 「6 月16 日、14 時21 分」三辻は声に出して内容を読んだ。「顧客No.799003 のお客様から入電。前日の注文内容を一部変更したい、とのことだった。受電履歴検索から顧客No. で検索をかけた。これ、受電したのは誰?」
 「OP の一人です」近藤シオリが答えた。「一件がヒットしています」
 「で、それをクリックして開いたと。当然、前日の受電内容が表示されるわな。ところが、その氏名も住所も電話番号も、全く別人の内容だった」
 「はい。OP は顧客No. を聞き間違えたのだと思い、もう一度、お名前と電話番号を聞き、まず電話番号で検索しました」
 「うん。で、なぜかヒットしなかった。それで氏名で検索かけた。それもヒットしなかった」
 「その時点でOP が手挙げしたので、私がOP 席に行き、同じく検索をしてみました。顧客No. 電話番号、氏名の順に試しましたが、いずれもヒットしませんでした」
 「で、君は」三辻はプリントアウトに目を走らせた。「とりあえず紙に申込内容を書き留め、コールバックを約束して終話したんだな。その後、もう一度、検索してみたが、やはり結果は同じだったから、DX 推進ユニットに連絡したと」
 「私が連絡を受けたので」イズミは発言した。「とりあえずCC に駆けつけ状況を確認しました」
 「そのときは原因はわからなかったの?」
 「そうですね。とにかく事象が再現することだけを確認し、顧客No だけメモしてDX 推進ユニットに戻りました。CC からでは生データを参照する手段がないので」
 「そういうものか。で、戻ってからは?」
 イズミはその日の行動を想起した。
 NARICS の顧客データは、業務コード+顧客No が主キーになっている。イズミはTeraterm でDB サーバに管理者権限でログインすると、主キーで検索してみた。結果は1 件。ただしデータの登録日時は前日ではなく、当日になっていた。
 「登録日時はレコードを登録したときにシステム日時がセットされて、以後、顧客情報や受電内容を更新しても変化しません。おかしいと思って、登録日時が前日のレコードを検索してみました」
 「何かわかったの?」
 「おかしな点が2 つありました。一つめはレコード件数です。妙に少ないような気がしたんです。デイリーで受電報告をクライアントに送るので、前日の送信ファイルは残っています。それを開いて比べてみると、20 件ほどが存在していませんでした。二つめは顧客No です。歯抜け状態になっていたんです」
顧客No はシーケンスで生成されるので、登録時に例外が発生しない限り、連番になるはずだ。それなのに、問題の顧客No を含めて何件かが抜けている。
 別件で席を外していた田代が戻ってきたので、イズミは状況を説明した。田代はすぐにpsql でデータを検索した。その結果、前日、つまり15 日から消えている履歴は、登録日時が16 日の履歴として登録されていることがわかった。

32-2.png
 「ああ、これがその例ってことね」三辻は別のプリントアウトをつまんだ。「なんでこんなことになったの」
 「操作ログを追ってみたところ」田代が乾いた声で言った。「どうやら、登録済みの履歴を検索して開いた後に、新しい履歴を登録した場合、さっき検索した顧客No に上書きされてしまっていたようです。この例で言うと、顧客No.799005 を16 日の9:50 ぐらいに何かの理由で参照しています。その途中で入電があったため、新規履歴登録モードに切り替え、入力を開始、10:01 に登録を実行しています。このとき、本来なら新しく採番された顧客No で登録されるはずが、直前に参照していた顧客No.799005 に上書き登録されてしまった、というわけです」
 「つまりバグっちゅうわけかいな」
 イズミと田代はちらりと視線を交わした。
 「厳密に言うとバグ、というわけではないんですが......」
 「えー、それならなんなの」
 「直接の原因は、ブラウザのタブを2 つ開いて、操作していたことです」
 「ん? どういうこと?」
 Teeda はページ遷移をPRG、つまりPost-Redirect-Get で行う。Get で前ページからの情報を引き継ぐためにはセッションを使用する。そのため、複数タブを開いていると、互いのページ情報が混在してしまう可能性がある。田代は素人にもわかるように言葉を選んで説明した後、付け加えた。
 「そういう問題を防ぐために、複数タブはできるだけ開かないようにと言ってあったんですが......」
 「そうなの?」
 三辻に問われたシオリは頷いた。
 「聞いてましたし、OP にもその旨は周知してるんですが、実際に厳守されているかというと、ちょっと」
 「守ってもらいたいんですがね」
 「お言葉ですが」シオリは穏やかな声で返した。「業務によっては、過去履歴を参照しながらのオペレーションなんて、当たり前にあって、それがデフォルトになってるOP も多いんですよ。なにしろ<コールくん>では当たり前に複数タブ開いて、処理していましたから」
 「......」
 「複数タブ禁止というなら、システム的にできないようにしてもらえると助かるんですけどね」
 「よくわからんけどさ」三辻が自分には理解できない話題を終わらせた。「そういう問題がわかってたなら、何か対策はできなかったわけ?」
 「対策はしてあったんですがね」田代は肩をすくめた。「というか、そういう指示はしたんですが、どうも守られていなかったようで」
 イズミの隣に座っていた池松ノリコが、ビクッと肩を震わせた。
 「誰が守らなかったわけ?」
 田代がノリコに視線を投げた。イズミは首を横に振って、田代の視線を捉えようとしたが、田代は無視した。
 「問題のページを担当していたプログラマに同席してもらっています」田代はそう言うと、優しい声をかけた。「池松さん、別に君の責任を追及しようとか、そういうことじゃないんだよ。状況確認と再発防止のために話を聞きたいだけなんだ。いいかな?」
 「はい......」ノリコは消え入りそうな声で答えた。
 「この登録ページの機能追加を担当したのは池松さんだったね」
 ノリコは頷いた。
 「直前に別履歴を開いていると、どうして新履歴がそっちの顧客No で上書きされてしまうことになったのか、簡単に説明してもらえるかな」
 今にも泣き出しそうな顔でノリコは説明した。履歴を開いたとき、更新するためにselectedNo というプロパティに顧客No を格納している。その値がタブを切り替えたとき、新規登録ページにもセットされる。登録処理のときは、selectedNo がnull の場合にのみ新しい顧客No を採番するロジックになっているので、上書きされてしまう。
 「新規登録のときはpageMode プロパティに"new" がセットされているよね。"new"のときは必ず新しい顧客No を採番するようなロジックにしておけば、今回のような問題は発生しなかったと思うけど、それをしなかったのには何か理由があるのかな」
 「いえ、その......」ノリコはうなだれた。「理由というほどのものは......」
 「まあチェックしなかった私も悪いけどね」田代は苦笑した。「できればそこまで気を回してほしかった」
 「すみません」
 ノリコの目が光っていることにイズミは気付いた。もう止めるように田代に合図しようとしたが、その努力は報われなかった。
 「でも、仕様追加、機能追加が、毎週のように発生してることにも原因はあると思いますよ」
 「は?」三辻は顔を強張らせた。「何、いきなり」
 「いや、いきなりじゃないですよ」田代は勢いよく主張した。「前から言ってることです。NARICS の標準機能にないことは、それなりの日数をいただきますし、できればコストに対して銭をもらってくださいと言ってます。それなのに、継続して追加業務を受注したいから、って、無償でどんどん要求を受けてくるんですからね。こっちも、どうしても手が回らなくなるから、経験の浅い新人くんたちに、重要なタスクをアサインせざるを得なくなるんです。今回の問題も、そういうことが遠因なんですよ」
 「うちが悪いって言ってる?」
 「そうは言ってませんよ。でも、クライアントの要望だからって、なんでもかんでもホイホイ受けてきて、後はよろしく、ってこっちに投げるだけ投げて、後は知らんぷりっていうのは、どうなのかなと思いますがね」
 「言い訳にしか聞こえないね」
 「言い訳じゃないですよ。単なる事実です」
 「ろくに仕事もできない新人に、そんな重要なタスクを任せた責任はどうなるの」
 直接非難されたわけではないが、ノリコは身を小さくした。その様子が目に入っていないはずはないのに、田代は蔑んだような視線を向けただけだった。
 「もちろん、その責任は私にありますよ。それを回避するつもりはありません。ただ背景となった要因も、少しは考慮してもらえないか、と言っているだけです」
 「......まあ、それはそれとして」三辻の方が、ノリコを責め立てていることに気後れしたらしく、口調を和らげた。「原因はそういうことだとして、再発防止策はどうするの。タマノイさんに何と説明したらいい?」
 「今後はできるだけダブルチェックと、テストをしっかりやることにします」
 「もう少し具体的に何かできないの?」
 「たとえばどんなことですか」
 「たとえば、池松さんらには、研修を受けてもらうとか」
 「そんなのムダですよ」田代はバカにするように笑った。「池松さんも今度のことで学んだと思うんでね。今後はもっと注意深くプログラミングしますよ。そうだよね?」
 問われたノリコは小さく頷いた。イズミは絶望的な思いに襲われた。ノリコの目はうつろだった。

 ◇ ◇ ◇ ◇ ◇

 三辻がタマノイにどのような報告を行ったのか、その正確な内容がDX 推進室に知らされることはなかった。もしかしたら田代は、詳細を聞いていたのかもしれないが、そうだったとしても、イズミに共有されることはなかった。
 ただ、その報告に対して、タマノイの担当者が良い印象を持たなかったことだけは事実だった。数日後、深刻な顔をした椋本と根津がDX 推進室の全員が集めた上で、タマノイ業務は7 月いっぱいで終了となる、と告げたのだ。理由は提示されなかった。
 「残念だが」田代はメンバーに向かって言った。「こういうこともある。誰のせいでもない。残りの日数、しっかり残っているタスクをこなすように」
 誰のせいでもない、と言ったとき、その視線は明らかにノリコに向けられていた。
 解散となったとき、イズミが田代に話しかける前に、根津がどうしても言わずにいられない、という顔でイズミを見た。
 「誰のせいでもない、か。君がレインメーカー的な何かを発動したんじゃないといいんだがな」
 根津の言葉は田代とイズミにしか届かなかった。根津は冗談のつもりだったのかもしれないが、田代は、そういえば、という顔でイズミを見つめた。
 次の週、イズミはノリコから相談したいことがあるので時間をもらえないか、というメールを受け取った。ミーティングルームに向かい合って座ると、ノリコはすぐに切り出した。
 「異動願いを出そうと思ってるんです」
 まさか、ではなく、やはり、というのが率直な思いだった。イズミは少し考えてから訊いた。
 「タマノイの件?」
 「ま、それもあるんですけど」ノリコはうなだれた。「正直言うと、田代さんとやっていく自信がなくて」
 イズミが黙っていると、ノリコは続けた。
 「あの件で、私に対する田代さんのイメージが、なんかこう、ビシッとフィックスしちゃったみたいな感ありません? そうすると今後の評価に影響出ちゃいそうで」
 「田代さんはラインの管理職じゃないから、直接評価はしないよ」
 「それはそうでしょうけど、でも、結局、田代さんの意見が通ると思いません?」
 イズミは同意せざるを得なかった。名目上、評価は椋本か根津が行うことになるが、プログラマとしての評価は田代の声が反映されるだろう。
 「もう決めたってこと?」
 「ほとんどは。90 パーぐらいは」
 「残りの10 パーは?」
 「状況、っていうか環境が変われば、もうちょっとプログラマとして腕磨いておきたいなってのはあります。今後、プログラミングの知識ってかなり重要視されてく気がするんで。会社のお金で勉強できるなら」
 へへへ、と笑うノリコにつられて、イズミも笑顔になった。
 「ちょっと考えていることがあるの」イズミは答えた。「もう少しだけ待ってくれない?」
 「そりゃいいですけど......」
 「そんなに長くは待たせないから」
 「ふーん。わかりました。私もまだ迷い中なんで。山下さんのこともあるから、私も抜けちゃうのはちょっと心苦しいっていうか」
 「山下さん?」イズミは首を傾げた。「何かあるの?」
 「あれ、聞いてないですか? てっきり知ってるもんだと思ってました。妊娠がわかったみたいですよ。安定期に入ったら、産休と育休のことを考えないと、って言ってましたから」

(続)

 この物語はフィクションです。実在する団体名、個人とは一切関係ありません。また、特定の技術や製品の優位性などを主張するものではありません。

Comment(9)

コメント

a

大インですよ
-> 多いんですよ
かな?

匿名

外注に作ってもらったのが正にそんな感じの考えで独自に実装してあってページ情報管理でバグ出まくってたなあ

匿名

連休明けの月曜日からこれはきついにゃん

匿名

つい「こちら」をクリックしてしまったw

なんなんし

画像の799009の日付加工ミスで15のままですね(^_^;)

平凡な管理職

複数タブ、複数ブラウザなんて、プライベートでも当たり前に使う機能だし、規制されなきゃ普通に使うって発想がなきゃ駄目だし┐(´д`)┌

営業が闇雲に追加要求引き受けてくるのも良くあるし┐(´д`)┌


リーベルG

aさん、ご指摘ありがとうございました。
「多いんです」でした。


なんなんしさん、ご指摘ありがとうございました。
16日でした。

匿名

前回の仕事の受け方だと、そうなるでしょね。

匿名

女性プログラマ云々以前に、新人の部下を公開処刑かつ人間の盾あつかいするようなやり方はどうかと思うよ田代さん

コメントを投稿する