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

人形つかい(21) 4で割り切れる年

»

 プロセス3は、予定より7分ほど遅れたものの、無事に完了した。橋本さんは以降のプロセスの予定に合わせるために、結果チェックを5分で終わらせると、すぐにプロセス4を実行した。プロセス3からプロセス9は、同じプログラムを対象年度のパラメータを変えて実行するだけなので、紆余曲折あったものの、プロセス3が無事に完了したことで、残りの実行結果に楽観的になっているらしい。

 それに先立ち、ぼくは値引率の精度チェックプログラムを組み上げ、東海林さんにチェックしてもらった後、実行していた。単純に申請レコードを読んで、チェックしているだけなので、処理速度は速い。全件のチェックが終わったのは、プロセス4を開始して5分後だった。幸いなことに、小数点以下のケタ数が5ケタを超えるようなデータは存在していなかったので、ぼくは橋本さんに報告した。

 「ありがとうございます」心配の種が1つ消えてほっとしたらしく、橋本さんは嬉しそうに笑った。「このまま順調に最後まで行きそうですね」

 それほど楽観的にはなれないぼくは、橋本さんに同意するのを慎重に避けた。

 「今のところは大丈夫ですが、新しく入力されるデータで、小数点以下ケタ数が5ケタを超えてしまうものがあるかもしれませんよ。そもそも割り切れない数値もあるでしょうし」

 「そ、そうでした」橋本さんの顔が曇った。「どうしたらいいでしょうか」

――それをうちに訊くか

 本来なら、4ケタで切り捨てるなり、四捨五入するなり、仕様の段階で決めておくべきことだ。

 「とりあえずですが」忙しく手を動かしていた東海林さんが言った。「Aフレに渡す前に、値引率の小数点チェックを入れておきました。5ケタ以上は切り捨てにしてあります。あくまでも応急処置なので、5ケタでいいかとか、切り捨てでいいのかとかは、エンドユーザーに確認取って、Aフレの方を直してください」

 「ありがとうございました」橋本さんは一転して安堵の表情となった。「重ね重ね申し訳ありません」

 「それから、Aフレのおかしな日付変換ロジックですけどね」東海林さんは画面を指して続けた。「Aフレそのものは修正できなかったので、関連するメソッドを使っている部分を、『承認くん』側でラップしてます。このままでも大丈夫だと思いますが、今後の機能追加なんかで、うっかり使ってしまうと良くないので、これも早いうちにAフレのチームに修正してもらってください」

 「分かりました」

 「あと、ちょっと怪しそうな部分もいくつかピックアップしておいたので、あとでチェックしてもらってください」

 「助かります」

 橋本さんはもはや東海林さんを拝まんばかりだった。

 ちらりと高杉さんを見ると、面白くなさそうな顔をしている。自社が自信を持ってリリースしたフレームワークに欠点があることを「その年までプログラマをやっている」とまで蔑んだ、下請け会社の技術者から、明白な不具合の実例とともに指摘されてしまったのだから無理もない。

 以前の情報共有ミーティングの議事録をプリントアウトし、高杉さんの発言を赤くマーキングした上で突きつけて、「ほら、言わんこっちゃない」とでも言ってやれれば、どんなにかすっきりしただろう。もちろん、実際問題としてできることではないし、何よりも東海林さんが何も言わない以上、ぼくの出番ではない。

――でも、誰かが声を上げないと、こういう会社は変わらないんだろうなあ

 東海林さんは、いたって冷静な表情で、バッチ処理のソースを追いかけている。さっきの高杉さんのパフォーマンスをどう思うのか訊いてみたかった。

 それからしばらくバッチ処理は滞りなく進んだ。プロセス4は何事もなく完了し、続くプロセス5、プロセス6も終了した。

 高杉さんは疲れを感じさせず、プロセス6まではずっと立ったままだった、プロセス7が開始されたとき、橋本さんの後ろに椅子を持ってきて腰を下ろした。それでも、少なくとも表面的には緊張感が切れた様子はなく、ピンと背筋を伸ばしていた。大河内さんが二度ほど様子を見に来たが、高杉さんはドアが開いた瞬間に、音もなく立ち上がって大河内さんを迎え、すべて順調に進んでいる、というような話をしてで対応した。たぶん内情を知らない大河内さんには、高杉さんがすべての事象を掌握し、的確な指示の元にバッチ処理を成功に向けて指揮しているように見えたのではないだろうか。

 新たな問題が発生したのは、午前4時を少し回ったときだった。プロセス7の実行を開始して10分ほどが経過していた。

 「お、いかん」突然、東海林さんが小さく声を上げた。「今、何年だ?」

 「は?」意味が分からなかったから、素直に解釈した。「201x年ですけど」

 「いや、そうじゃなくて、今、何年度分の処理をやってる?」

 「あ、そういう意味ですか。プロセス7なので、200x年ですね」

 東海林さんは舌打ちした。

 「ち、遅かったか」

 「どうしたんですか?」

 東海林さんは開いていたソースをぼくに見せた。Aフレのロジックのようだが、さっきとは別のソースらしい。

Dateutils

 やっていることは日付の足し算らしい。どうでもいいが、strNen みたいな間抜けな変数名を付けるのはやめてほしいものだ。

 「なんか間が抜けたことやってますね」ぼくはつい正直な感想を口にしてしまった。「なんで、Calendarのaddメソッドとか使わないんでしょう?」

 「さあね。正しい日付が入ってくるという自信がなかったのか、そもそも知らなかったのか。そんなことじゃなくて、2月の計算のところだ」

 「あ」一目見て何が問題なのかわかった。「これはまずくないですか?」

 「まずいに決まってる」東海林さんはぶっきらぼうに言った。「200x年はうるう年だ」

 このメソッドで日付を足すと、2月29日は永久に出現しないことになる。手抜きもいいところだ。まさかうるう年の計算方法を知らんわけでもあるまいに。

 「これは、どこで使ってるんですか?」

 「とりあえずバッチに関係するところだと、承認期限の算出ロジックだな。他でもいろいろ使ってるが……まあ、次のうるう年の2月までは影響ないか」

 「ということは、プロセス6の2月分の承認データがおかしくなってるってことですか」

 「正解」

 隣でぼくたちの話を聞いていた橋本さんの顔が青ざめた。

 「間違いないでしょうか?」

 「生成された承認データを検索してみれば分かりますよ」

 橋本さんがやり方を知らないのは分かっているので、ぼくはSQLコンソールでselect文を叩いた。申請日が200x年2月の末日に近いデータを適当に抽出する。結果は予想したとおりだった。

 「ほら、これなんかそうですね」ぼくは結果行をマウスカーソルで指し示した。「申請日が2月28日で、最大承認日数が2日なので、承認期限は3月1日にならないといけないのに、3月2日になってますよ」

 狼狽した橋本さんは高杉さんを振り返った。そういう問題であてにならないのは、橋本さんといい勝負だろうに。高杉さんは責任を押しつける相手を求めるように、ぼくたちの顔を見回した後、強張った表情で顔をそむけた。

 なんともタイミングが悪いことに、ドアが開き、大河内さんが入ってきた。

 「どんな調子ですか?」

 「順調です」高杉さんの声は、少しかすれていたものの、動揺のかけらさえ現れていなかった。「小さな問題がありましたが、じきに解決しますので」

 「そうですか。どんな問題ですか?」

 たぶん大河内さんが質問したのは、単なる時間つぶしに過ぎなかったのかもしれないが、高杉さんは一瞬、言葉に詰まった。問題があると言ってしまった以上、なかったことにはできないし、適当なウソでごまかすこともできない。いや、その場にいたのが橋本さんだけだったなら、後で口裏合わせるぐらいはしたかもしれないが、協力会社の人間が二人もいたのでは、その手も使えない。

 渋々、高杉さんは事情を説明した。明るい声で、ごくごく小さな問題であるかのように。

 あいにく大河内さんは、聞き流したりはしなかった。

 「それは、私には小さな問題とは思えませんね」

 「もちろん軽視しているわけではありません」

 「だといいんですがね」大河内さんはぼくたちの顔を見回した。「で、どう解決するおつもりですか?」

 ぼくたちは当然のように高杉さんに注目した。

 「そうですね。今、いろいろ方法を考えているところなんですが……」

 高杉さんの視線が助けを求めるように東海林さんに向けられた。東海林さんはというと、高杉さんのことなど、半ば無視してソースを追いかけている。

 「……少し専門的な手段になるのですが……」高杉さんは言い始めた。「……トレースログから対象データをピックアップして、ヒューリスティックアルゴリズムにより、トランザクション制御を解除することによって、static領域を確保し、対象データを修正しようと考えています」

 まったく意味不明だ。static領域って何だ?

 どうやら、高杉さんは適当なカタカナ用語を並べて、相手を煙に巻こうと考えたようだ。ほんとに年収1000万円か?

 さすがに苦笑した東海林さんは、気の毒に思ったのか、それとも単に時間がもったいなかったのか、助け船を出した。

 「まあ、おおむね、そういう方向で何とかなると思いますね」

 「間に合いそうですか?」大河内さんが気にしているのは、その点だけらしかった。

 「予定のプロセスと並行する形で実行しますから」東海林さんは答えて、大河内さんを安心させた。「問題ないでしょう」

 大河内さんは、しばらく東海林さんを見ていたが、やがて納得したようにうなずくと、「よろしくお願いします」と言い残して出ていった。

 それを見送った高杉さんは、力尽きたように椅子にへたりこんでしまった。static領域って何ですか? とか訊いてみたい気もしたが、そこまで追い打ちをかけるのも気の毒になのでやめておいた。

 橋本さんは、そんな上司の姿を複雑な表情で見ていた。それに気付いた高杉さんが、きつい視線を投げ返した。

 「何か?」

 「いえ、別に」

 「トラブル時に指揮系統が乱れていては、お客様に不安を抱かせるのです」高杉さんはいつもの傲慢な口調で言った。「協力会社の人間が、技術的な仕様を決定していたら、お客様がどう思うか分かりませんか?」

 「……」

 「エースシステムの人間がきちんと指揮を執っているからこそ、納品するシステムがお客様に信頼していただけるのです。そこのところが分かっていないようですね、あなたは」

 橋本さんに向けた言葉だったが、東海林さんとぼくにも聞かせているのは明白だ。あいにく、ぼくは少しも感銘を受けなかった。

――言い訳か負け惜しみにしか聞こえないんだよね。

 橋本さんは何も答えなかったが、興醒めした顔をしている。上級SEへの畏敬の念は、一晩でかなり薄まってしまったらしい。

 「細川、さっきのチェックプログラムをコピーして、似たようなのを作ってくれ」東海林さんが、高杉さんの言葉など聞こえなかったかのように平静な声で言った。「内容は分かるな?」

 「あ、はい。申請日付と最大承認日数から、承認期限を再計算すればいいんですね」

 「そうだ。うるう年の2月の申請分だけな」それだけ言うと東海林さんは、キーを叩き始めた。「おれは『承認くん』の本体で、このおかしな日付計算を使っているところを、全部修正していくから」

 「了解です」

 ぼくはPCに向き直った。



 ぼくたちの綱渡りは、こんなふうに夜明け近くまで続いた。大きなものは、うるう年問題が最後だったが、バッチ処理の小さなバグや、データの変換ミスなどはいくつか発生し、ぼくたちはその都度、対応に追われることになった。だが、東海林さんの的確な指示のおかげで、致命的な問題に発展することもなく収束させることができた。

 そして、最後のプロセス9は予定通り、6時45分過ぎに終了した。橋本さんが素早くチェックを行った。

 「実行ログは問題ありません」

 まだ終わりではなかったが、残りは各年度から承認履歴データを適当にピックアップして、「承認くん」の画面に表示してみるだけだった。橋本さんは、事前に用意していたパターンに従って、画面表示の実行を開始した。高杉さんもその背後に立ち、最後のテストを見守っている。

 「これで終わりですかね」ぼくは小声で東海林さんに訊いた。

 「たぶんな」東海林さんは、さすがに疲れた様子で、こめかみをマッサージしていた。「小さなバグはたくさんあるだろうが、カットオーバー延期にはならない思うよ」

 15分後、橋本さんは手を止めた。そして、トントンと丁寧にテストパターンのプリントアウトをそろえると、大きなため息をついて宣言した。

 「問題ありません。すべて完了です」

 飛び上がって歓声をあげるには疲れすぎていたので、とりあえず小さくガッツポーズを作るだけで満足した。東海林さんもにっこり笑った。一番どきどきしていたであろう高杉さんも、一瞬目を閉じて安堵の表情を見せた。

 大河内さんが入ってきた。

 「終わりましたか?」

 「はい。完了です」高杉さんが誇らしげに答えた。「全て問題ありません」

 「それはおつかれさまでした」大河内さんは時計を見た。午前7時だ。「予定通りですね。9時から使い始めますが、大丈夫ですか」

 「はい、大丈夫ですよ」何もしなかった高杉さんは、今こそ自分の出番だとばかり進み出た。「どんどん使ってください」

 「一応、10時ぐらいまでは残っていてもらえますか?」

 「もちろんです。午前中は残っていますから」

――そんな話は聞いてないなあ。

 そう思ったものの、どうせ問題が起これば呼び出されるに決まっている。それぐらいなら、ここに残っていた方がいいだろう。

 大河内さんが出ていった後、東海林さんは大きく伸びをした。

 「ちょっと食事をしてきてよろしいですか?」

 「食事ですか……」高杉さんは不満そうだったが、まだまだ東海林さんの力が必要なことを思い出したのか首肯した。「分かりました。でも、8時30分には戻ってきてください」

 ぼくたちは高杉さんと橋本さんを残して、オペレーションルームを出た。解放感と達成感が疲れた身体の奥から心地よく沸き起こってきた。

(続く)

 この物語はフィクションです。実在する団体名、個人とは一切関係ありません。似たような行動や言動があったとすれば偶然の一致でしかありません。また、特定の技術・製品の優位性などを主張するものではありません。

Comment(32)

コメント

tempom

ようやく戦いが終わったのか・・・?主人公もお疲れさんです。
あの状態から遅延無しまで立て直すとはすごい。
本番稼働中にもう一波乱待っていそうですが。

東海林さんは待ち時間中にも気になっていたうるう年
処理の箇所のソースを確認してたのか。周到ですな。

東海林さん、確信犯ですよね。

「ち、遅かったか」とか言ってるけど、わざと閏年のミスが顕在化するまで処理を走らせてますよね。

東海林さんは、Aフレの内容(ソース)を把握してるのはもちろん、今回の夜間バッチの内容も把握してると思うんですよ。

その上で、わざとやった。

高杉さんへの嫌がらせというか、悪戯というか...(笑)
Aフレのダメさを認識してもらうためには最高のタイミングでしょう。


個人的には、こういう頭の良さ(意地の悪さ)ってのは技術者に必要な能力だと思います。高杉さんみたいに口で言っても理解してもらえない人、多いですからね。

ベイビー

この回を見て確信した。
この著者は下流工程しか経験がない。

haru

確かに今時ハンガリアン記法で書くことないよなあと思います。マイクロソフトも、もう使ってないのに。
ところで値引率の精度チェックプログラムってSQL1文で書けるんじゃないですか?

foo fighters

>ベイビー

目障りなコメントばかりだけど、エースシステムの人間か?
それとも、三浦マネージャか?
視点が、下請け側の人間ってだけだろ。
筆者に上流の経験ないとか、根拠ないだろ。
いいかげんウザいよ。

FIRE

初めてコメントします。

ストーリーを最初から読んでいましたが、
あの議事録の意味が理解できませんでした。
ですが、このような伏線があったとは・・・

そうなると次は、
「取り戻し」「引き戻し」絡みになると予想。

date1414

今までの経緯からすると、この回は前振りにしかみえない

ハムレット

フレームワークって作るの難しいんだけど、会社で内製開発する場合、往々にして実案件優先で、十分なリソースが用意できす、新人や経験の浅い職員の演習課題になっていたりすることもあるよね。

wm

「ヒューリスティックアルゴリズム」なんて使っても居ない技術の名前出しちゃったところが気になりますね。
後で、このシステムの目玉として紹介されて、突っ込まれてしまうとかw

>ベイビーさん
じゃぁ、高杉さん視点での話を作ってみると面白いかもしれませんねw
東海林さんがどのようにけちょんけちょんに思われているのか、気になるところです。

ヤミ

おお、予定通りの終了時間におわりましたか・・
てっきり遅れるとばかり思ってました。
本番はどうなることやら・・
しかし、何故自分で日付の足し算のロジックを作成したのでしょう。。
作った人は、既存のものがあることを知らなかったんですかね^^;

Snery

現場での実務能力がない上司って馬鹿にされるんだよね。少なくとも技術の世界では。

匿名

うるう年の計算方法を知ったのはこの業界に入ってからですかな。
さすがに4年に一度ある、ということ程度は知っていましたが、100で割り切れる年は平年だけど400で割り切れる年はうるう年。なんて正確な方法までは知りませんでした。
そういう「へーそうだったんだ」が多い業界だよなあと感じるのは私だけ?

かかし

確かに閏年の判断は、
「4で割り切れる年は閏年、但し、100で割り切れたら閏年ではない、さらに400で割り切れたら閏年」
だが、もうちょっと考えると、1901年から2099年までは4で割り切れたら必ず閏年なんだよね。
今開発するシステムが2100年まで稼働することは、絶対無いので閏年かどうかは4で割り切れるかどうかだけで判断していい。
俺はもう30年も前にそこに気づいたけどね。

ばんぶー

私はSEでもプログラマでもありませんが、非常に共感持てる話でいつも*苦しく*なりながら楽しませていただいてます。
 で、話外れますが、ヒューリスティックアルゴリズムは、2001年ネタではないでしょうか?

BEL

そうか、著者はプログラマなんでしたね。
こりゃプログラムちゃんとやってる人にしか書けない内容だわ。

逆に高杉さんみたいに何もわかってない人に、
わざと難しい言葉使って間違ったこと言って
「あ~そうだよな」っていう返事を聞いて
「あ、やっぱこいつわかってねえ、ぷぷぷ」って
楽しんでる人を見たことはあります。

>そういう「へーそうだったんだ」が多い業界だよなあと感じるのは私だけ?
私も、閏年の正確な定義は2000年に初めて知りました。
ただ、これがこの業界に居たからかどうかはよく覚えておりませんが。

mo

来年はうるう年なんだよ。さあ自分が面倒見ているプログラムを全部見直してみよう。

grassland

最初何事もなく読み終わった提示のソースコードを、もう一度読み返してみて愕然とした事。

1) 1月31日に30日足すと、2月30日になる(翌々月にならない)
2) 1月1日に-1日足すと、1月0日になる(前月にならない)

そういう使い方は作った人から見て想定外かもしれないが、JavaDocには書いていないし、入力値に対するcheckもしていない。

これでもし、前回のように「例外キャッチしたら、そのままnullを返す」ようになっていたら、ずっと後、計算後の値を使って何かするまで問題が起きたことが分からないのでとても困る。

「ここでしか使わない」とかサンプルプログラムならともかく、共通処理として提供するモノとしてこれはどうかと思った。(作った人に)「あなたこれ自分で使ってみたか?!」と問いただしてみたい。

ほまらら

>高杉さんは適当なカタカナ用語を並べて、相手を煙に巻こうと考えたようだ

今までの高杉女史の行動の中で一番やっちゃアカン事ですな・・・
今までのは単純に無能だったり傲慢だったりしただけすが、
これは相手への誠実さを欠いた詐欺みたいなものだ。

そもそも、相手に踏み込んで説明を求められたら終わりだったじゃないですか。
そして、こういう状況だと普通は相手は踏み込んできます。
相手も上長に状況の報告などをしなければならないんですから。
こんな稚拙な誤魔化しで切り抜けられたのは、奇跡みたいなもんです。(切り抜ける事自体がNGですけど)

ff

>こんな稚拙な誤魔化しで切り抜けられたのは、奇跡みたいなもんです。(切り抜ける事自体がNGですけど)

いや、この手、相手によっては、結構有効だったりするんですよね。
特に、相手が、中途半端に技術をかじってると、知らないと思われることをいやがるのか。

ま、やっちゃいけない手段であることは確かなんですけどね。

むむ

ここまで読んで思いましたが、高杉さんってAフレ自体の責任者じゃないんですよね?
なぜこの場にAフレの担当者と責任者を座らせておかないんでしょう?
あまつさえ、途中までいたバッチ担当者の宮下さんを帰宅させてますよね。これも驚愕です。
責任転嫁が好きな高杉さんがこの時だけ自分に責任が集まってしまうような対応をしているのは何故なんでしょうね。

私だったら東海林さんの契約を越えた献身とここまでの活躍は期待できないので、関連するコンポーネントの担当者とはいつでも連絡が取れるようにしておきますけどねぇ。

ほむ

>関連するコンポーネントの担当者とはいつでも連絡が取れるようにしておきますけどねぇ

東海林氏という格好のスケープゴート候補が来たからこそ宮下某を帰したのではと想像、
収束させられればそれでよし、できなかったらバッチ分も含めて全て東海林氏に押し付ける。

Jitta

> 1) 1月31日に30日足すと、2月30日になる(翌々月にならない)
 「31:00」とか使っているので、仕様として正しいんですよ。だって、日付型を使わないのは、「使いにくい」からでしょ?何が使いにくいかって、「2月30日」を表せないじゃないですか。「日付として無効な入力は出来ない仕様になっている」のだから、これはK自動車の中では有効な日付なのです。   たぶん。

典型

ユニットテストやってるか、少なくとも単体テストレベルで見つけられないとおかしいような、日付計算では典型的なバグなのだけど、Aフレはちゃんとテストしたんかな。

kuma

このソースひどすぎでしょ。
日付の文字列が数字じゃなかったり、9文字だったりしたらガクブルもんだ。

kuma

>かかしさん
閏年のロジック書くなら400で割り切れるかどうかからの順序ですよね。

ベーシッくん

面白いですね。
「下町ロケット」~AnatherStory~ みたいな感じで出版してもいいかも。

tmp

前の話の平良さん、今回の東海林さん。
筆者の分身ですよね。
その人が主人公じゃなくて下の人の目線から客観的に書いているところがいいです。
過去によほどひどい目にあったのでしょう。プロフィールにもそれがにじみ出ているように思います。
頭の古い人とか、上流の人とかまったく役立たないけどお金だけはもってくんですよね。他の国でもそんなものなのでしょうか。

アラファイブ

過去の言質を利用して、無限奴隷コンボに持ち込むとか、
もっとおどろおどろしい展開を期待していましたが、
本当に普通ですね。

指揮命令権と(本音の)実際の権限が内内では違っていた
昔と違い、いまは本当に指揮命令権と権限が一致している
から、下流の人間に責任をなすりつけるカードがなくなった
という事でしょうか。

ストーリー展開としてはつまらないですが、実務としては
本当に良いことです。

自分は下流ですが、上流の人には「仕様を思いつく」という
とてもまねのできないスキルがある訳ですから、少しは
立てることも必要なのでしょう。

ただし、思いつきもしない単なる伝達屋の中間管理は、
無条件に狩りの対象だと思います。まねのできないスキルが
無いのですから。。。

elseorand

下準備は無事終えられたようで何よりです。
ただ、準リアルデータでテストしていないということは、
性能問題が絶対に発生するだろうな~と。

また、このシステムは今後どうなるんだろう?
障害対応を外部パートナーにやらせ、
加えて内部の人間に吸収もさせてないとなると、
最早そのシステムは外部パートナー無しでは成り立たなくなるのに。

まあ東海林さん達に、正当な対価込みで保守・運用が回っていくならいいのですが。

x

うるう年の判定は練習プログラムでよく出てくるけど、かかしさんの言うとおり現実を考えれば私達のつくってる一般的なシステムなら4で割れるかどうかだけで判定して問題ないってことですよね。

spot

「下町ロケット」といえば、ドラマの中で、大手企業のことを、「足の引っ張り合いばかりしてる」「でもそれが強みだ」というセリフがありました。技術力のないエースシステムがトップなのは、そういう理由なのかもしれないですね。

s_t

高杉さん側からみると…

門外の事態にもあわてず対応できる、ちょっとした心がけ : ライフハッカー[日本版]
http://www.lifehacker.jp/2011/07/110707pretend_expert.html
>> 門外の出来事に遭遇したとき、専門家のように振舞うことで、テンパらずに済む

コメントを投稿する