ウラシマさん達の輪舞曲(ロンド)
・前段
鏡に映る変わり果てた自分の姿に呆然とする。どうしてこんな事になったのか・・・。そう、思い返せば、それは一本の電話から始まった。
昔世話になった上司から助けて欲しいと連絡が来た。移動中に携帯電話でかけているのか、ドップラー効果のようなものが掛かり低音に歪んで聞き取りにくかったが、何でも今、国際的に事業を展開している企業の購買管理・販売管理・財務会計システムを入れ替えるプロジェクトを推進しているのだが、進捗が思わしくなく、このままでは期限に間に合わない可能性が高いとのことだ。
今は自分の時間を自分で管理したいこともあり、独立し田舎に住んでフリーランスでシステム開発の下請けをしている。己の腕一本で世間を渡り歩くフリーランスの人間は、士業や料理人等が挙げられるが、開発言語が複数あり奥が深い上に技術進歩が速いシステム関係も多い。元上司の彼には昔大分世話になった。フリーランスで今食って行けているのも彼に鍛えられた部分が大きい。夕食時に上さんに相談する。
「昔、お世話になった人なら仕方がないわね。」
上さんがため息をつきながら言った。
僕は、まだ幼いわが子に乳幼児用の角のないプラスチックのスプーンで離乳食を与えながら答える。
「稼働までの2年間だそうだ。2年なら良の幼稚園入園式の前に戻って来られるはず。育児が大変な時期に本当に申し訳ない。」
「義理堅いところがあなたの良いところだから。実家も近いから良のことは母さんにも手伝ってもらうね。」
上さんが謡うように言った。僕は上さんの透明感のあるこの声の響きがとても好きだった。
・要件定義
翌朝早く新幹線「はやぶさ」に乗って、都心に向かう。
システム開発の流れは大まかに言うと、要件定義→設計書への落とし込み→単体プログラム開発→処理されたデータを繋いでゆくプログラム間の連携テスト→夜間にデータ処理を行う夜間バッチのテスト→本番と同じデータ量を走らせてパフォーマンスを確認するストレステスト→本番環境の構築(→過去データの移行)→稼働開始となる。開発期間は大体2年位。稼働後、1年位初期不良の解消(始めから完璧なシステムというのはあり得ない)を経て、プログラムが一巡、安定稼働に入る。
どんな仕事もそうだが各段階で押さえなければならないポイントというものがある。要件定義は、システム導入により何をしたいかを顧客と話し合う。営業や製造の現場から承認等の様々なプロセスを経て経理を通って、トップマネジメント等の管理に至るまでの複雑多岐に渡る今の業務フローを踏襲するのか、それとも簡素化したり新しい業務プロセスを入れるのか。その際、そもそも今の業務プロセスが必要なのかという視点も必要となってくる(長い歴史を経て今のやり方になったのだとは思うが、我々、第三者の視点で見ると「何でこんなやり方を」と言うことも結構多い)。また市販されているパッケージソフト(大規模なものからPCに入るものまで色々ある)を使うと、事前に作り込まれているのでデータ不整合が起こる可能性は低くなり、開発期間も短くなる(おまけに英語を含め多言語に予め対応していることも多い)が、業務をパッケージソフトに合わせて変える必要が出てくる。パッケージソフトをカスタマイズして業務に合わせることも可能だが、カスタマイズしすぎるとパッケージソフトがアップデートされた際に対応できなくなるリスクがあるため、システム側と顧客側の要件のバランス取りが重要となる。
僕がプロジェクトに加わったのは、要件定義から基本・詳細設計に移る辺り。成長著しい、今を時めくネット企業である顧客の銀色の宇宙船のような外観の本社ビルの一角に開設されたプロジェクトルームで、初日の朝、皆の前で簡単な挨拶をする。見渡すとプロジェクトメンバーは20名程度。その中で元上司のマシタさんも含め、見知った顔が半分位といったところか。初日からプログラム仕様書のレビューを一通り頼まれる。新人が記載したプログラム仕様書を見て絶句する。
-帳票を印刷するプログラムだが、A4横に印刷されるデータを縦に取ってくるようになっている。これでは2ページ以上印刷する場合、一度印刷した紙をもう一度プリンターに入れなければならない。こんな基本も出来ていない連中をも率いるのでは、マシタさんも苦労するはずだと嘆息する。
要件定義から基本設計にあたっては、顧客の業務プロセスとパッケージソフトの制約の他にデータをどの程度集約するか-データの粒度を考える必要がある。例えば、販売先に請求書を送付する際にはいつ、誰に、どんな商品を幾つ販売し、本体価格が幾らで、付随費用が幾ら、消費税が幾ら、合計は幾らといった様々な情報が必要だが、会計上はいつ、誰に、幾ら販売したか位の情報があれば良い。日本の商習慣では請求書を月毎にまとめて送ることが多いが、請求書の元になるデータを財務会計システムから取得する仕様にすると同じ日の同じ取引先に対するデータが会計データでも何行も必要になってしまう。しかし、細かな情報を販売管理システムから取得するようにすると、会計データは一日一行で良いことになる。販売管理や財務会計等の各システム間で情報をどの粒度でやり取りするか、入り口の設計段階で失敗すると後々、その後始末に苦しめられることになる。もう少し言うと請求書自体の仕様を変えると言う手もある。請求書の表記は簡潔にし、詳細は納品書等、別の書類を参照してもらう事にするのだ。その場合は、業務プロセスどころか取引先との関係すら変えかねない為、顧客とよくよく討議しなければならない。まあ、粒度ばっかり気にしていると承認プロセスやら階層別データアクセス権の設定等といった組織運営に関わる事項が疎かになっらりもするのだが。。。
要件定義から基本・詳細設計辺りは人との交渉が中心なので、まだ時間に余裕はある。眼下に見える煙草部屋でオオシタが右手に火の付いた煙草、左手にソーダ味の青い棒アイスを持って、交互に口に運んでいる。オオシタは小太りのどこか憎めない奴で、顧客に可愛がられることが多い。一緒だった前のプロジェクトでは、彼が顧客に説明に行った際は(広い敷地内に各部署が点在している顧客だったが)帰りは何故か必ず顧客の担当者に車でプロジェクトルームまで送ってもらっていた。
少し強い風が窓から吹き込んできたので、ふっと我に返る。翻って僕のことに戻れば、早くアパートを探さなければ。今は暫定的にビジネスホテル暮らしだが、開発が佳境になれば帰って寝るだけの生活になるので、日当たり等は重要ではない。プロジェクトルームに近くて、静かで、出来れば家賃は安い方が良い。今までもそうやって、プロジェクトを移る度に引っ越しをしてきた。
設計が固まるとプログラム開発に移り、人と違い眠る必要がないコンピューター相手の時を忘れた戦いが始まる。
・単体プログラム開発
プログラムには大まかに画面、帳票、バッチの3種類がある。画面はデータ入力と参照、帳票は出力、バッチはデータ処理を行う。プログラム開発は1つ1つのプログラムが仕様書通りにデータを処理するように作り込む。人工知能(AI)とよく言うが、コンピューターはデータ処理量が人より多いだけで、何をするかは人が教え込まないといけない。まっさらのコンピューターは生まれたての赤ん坊と同じ。何も知らない。おまけに人と違って、空気なんぞ読まない。どんな時に何をするか、プログラムを動かすソースコードにありとあらゆるパターンを書き込まないといけない。ソースコード一つ作り上げるにも時間が掛かる。プログラムを動かしてみると想定と異なる動きが出る。そうなると仕様書通り動くように人の手で問題となる箇所を特定してソースコードを修正する。
開発が佳境になり平日は夜2時まで働いて、その後朝5時まで飲みに行き、アパートに帰って仮眠して、お昼の12時頃また出社する(尤も顧客に「貴社はフレックスなんですよね?」と聞かれた際に「そうです。」と力一杯答えたら、言下にマシタさんに「違います!」と否定されたが、、、)。稼働開始を無事迎えるという共通の目的のために皆で力を合わせて走り続ける生活。世間から隔絶された桃源郷に住んでいるようだ。
今夜も例によって午前2時まで働いて、行きつけの近所の中華料理屋「龍宮」に行く。ここはいつ行ってもプロジェクトの誰かが居る(期間限定なのにお店のマスターがビッグウェーブが来たと勘違いし始めたとも聞く。駄目だよ。お店拡げよう、なーんて考えちゃあ。)。店に入ると、すぐにガウガウと特徴的な濁声が聞こえて来た。ガウさん。もとい、マシタさんが居るらしい。お世辞にも綺麗とは言えない小汚い店の奥の方に座っているマシタさん他4名を見つけ、そのテーブルに座る。「とりあえずビール。」と言ってからメニューを手に取り「1番から10番まで。2個ずつ。」と頼む。この店は何故かメニューの端から連番が振ってあり、番号を言うだけで注文出来る(そのせいで完全制覇を目論む者が後を絶たない)。今回の番号の中には大根餅と小籠包が入っていたと思うけど、他はよく覚えていない。金を使う暇がないのとストレスが溜まっているので、皆、金使いが荒い。まだ週中なので午前5時に解散。精算額がやけに多い。先に帰ったオオシタ達がマシタさんのテーブルにこっそり代金を付けていたらしい。
「しょーがねー奴らだなー。」
マシタさんがブツブツ言って、苦笑いしながら(しかし、何故か若干嬉しそうに)カードで払っている。
・連携テスト
単体プログラム開発が終了すると複数のプログラムを繋ぐ連携テストが始まる。
世の中にコンピューターが行き渡ったこともあり、最近のシステム開発は、会社のシステム全体を作り上げたり、入れ替えるのではなく、一部分を入れ替えることが多い。その場合、既存システムとの間でデータを受け渡しすることも必要になるため、接続テストは開発しているプログラム間のみならず、既存システムとのデータの接続も確認していく。接続テストでは、受け渡するデータの仕様が違う、受け渡す場所が間違っているから始まり、文字化けする、データに空白が混じっている等の問題が次々と出る。昨日は稼働時には月次バッチプログラムになるインターフェース・プログラムのインターフェース前後のデータの金額が数百円合わず、原因も解らない。
追い込まれたオオシタが「これだけだったら毎月、俺が金を出す。」と訳の分からないことを言い、「マイナス残で余ったらもらうんですか?」と新人の突っ込みを受けていた。そういえば、消費税計算の四捨五入の円未満の端数を寄せ集めて自分の銀行口座に振り込むプログラムを仕込んだシステムエンジニアが居たという都市伝説を聞いたことがある(塵も積もれば何とやらで、結構な金額になったとも聞く。)が、それは本当の話なのだろうか?
-結局、データ型が数字であるべきところが文字列になっているインターフェース元データがある(そのため、プログラム内で集計されない)ことが判明。既存システム側のプログラム修正が必要な為、既存システムの運用チームと協議が必要となった。生じた問題は解決策をどんどん見つけていかないといけないが、開発するシステムに逆に光速で振り回されている感もある。
週末の今夜はオオシタがカラオケで爆風スランプの「45歳の地図」を狂ったように大声で歌っている。ストレスが溜まってくるとよく歌う彼の持ち歌だが、前のプロジェクトでも同じこの歌を歌っていた(浜田省吾の「MONEY」が彼の次の持ち歌だ)。何年経っても変わらないなあと思う。興に乗ると皆が服を脱ぎ、裸族になるのも同じ。コンプライアンスという言葉を知らないのか君たちは。全く。
週中より遅い午前6時頃解散。土日は日頃の寝不足を解消する為、昼過ぎまで寝ている。この間は起きたら夕方だった。辺りが夕焼けに赤く染まっていた。こんな感じの同じ流れの日々がグルグルと24時間回り続ける。
・夜間バッチテスト
夜間バッチは手動ではなく人がいない夜間に順番に動くが、日次や週次、月次、年次の他に、条件に当て嵌った時に動くプログラムがあり、それぞれをどの順番でいつ動かすか整理する必要がある。また、障害があった時の後処理のためログも重要となる。予期せぬ障害が生じたときや予定時間内で終了しなかったとき等にプログラム等がどのような状態だったかという情報をログに記録し、障害解消に役立てる。そもそも単体プログラム開発時にはログまで考えられていない(標準仕様がまだ定まっていなかったせいもあるが・・・)ことが多く、ソースコードにログ処理を追加する必要も出てくる。この頃になると開発部隊から昼夜逆転となる夜間バッチ部隊が分節される。夜間バッチ部隊は夜間常駐し、夜間バッチの進捗を見張り、障害が発生したときに即座に対応する。そのため、本番稼働後もシステムが安定稼働するまで昼夜逆転の生活を続けることになる。システムが落ち着いてくると常駐しなくても良くなるが、緊急対応で夜中に叩き起こされることになる。
上さんからメールが来る。もうすぐ息子が小学校に入学するとある。親戚の大きな子の間違いじゃないかと思うが、今日も出社したら大騒ぎだった。夜間バッチが、あるプログラムから進まないので、その夜の担当のオオシタが頭に来てPCの画面をグーで殴ったら、液晶画面が割れただけではなく、離れたところにあるサーバーが壊れたと。オオシタの右手からシス卿のような電撃が出てネットワークを経由してサーバーまで伝わったのではないかと冗談を言う奴もいたが、何故サーバーがその時、壊れたか、本当のところは解らない。顧客にお詫びに行くと誰がやったのかという話になり、「オオシタです。」
「-オオシタなら仕方がないか。」と一言でお許しが出た。なんでそういうリアクションになるのかさっぱり判らない!まぁ、オオシタの人徳に感謝すべきところなのか。。。
結局、その騒動のせいで上さんからのメールは確かめられずそのままになってしまった。。。
・ストレステスト
本番と同じデータ量を走らせてパフォーマンスを確認するストレステストは大きな壁になることがある。個々のプログラムは求められる要件を満たしており、(プログラム仕様書で要求された処理パターンを網羅した)少量のテストデータでは仕様通りの動きをしても大量のデータを予定時間内に処理できない場合、処理速度を向上させるパフォーマンスチューニングを行う必要がある。今回も毎夜行うはずの販売管理システムから財務会計システムへの夜間日次バッチが一週間経っても終わらない。帳票がいつまで待っても印刷されない。調べると、そもそも全体のデータ量の見積りが甘かった(顧客が急速に成長を続けているためもあるか?)上に、特殊な取引をする顧客向けの月次請求書が会計システムから出力されることになっている為、財務会計で粒度が細かいデータが必要とされ、財務会計のデータ量が想定のン十倍に膨れ上がっていることが判明した。間違いなく設計ミスなのだが、今更データの粒度を変更することは、開発済みのプログラムほとんど全てに影響するので、まず不可能。他の手段を講じるしかない。余計なデータを参照しないようソースコードを修正し、サーバー等のハードウェアを高性能、大容量のものに変えたのだが、パフォーマンスは十分には向上しない。
マシタさんがシステム構成を変える決断を下した。具体的にはデータ処理の一部をリアルタイムではなく夜間バッチにし、情報量の少ない中間DBを作って、帳票や画面はそこから必要なデータを拾うという仕様変更をする。顧客に当日入力当日反映を謳っていたはずが、当日入力翌日反映ということになるため、顧客に説明と謝罪をすると共に了解を得る必要がある。マシタさんを始め、幹部が顧客の間を走り回る。
その日の夜はいつにも増して皆の酒量が上がった。オオシタが酔い潰れて寝込んでいる。マシタさんがオオシタの財布からクレジットカードを抜いて精算している。オオシタを揺り動かす。
「オオシタ!起きろ!サイン!」
「ん〜。」
オオシタが眠い目を擦りながら訳も分からずサインして、また寝てしまった。まあこの間のこともあるし、今日はマシタさんがオオシタを家まで無事に送り届けてくれるだろう。
翌日。
オオシタが心配顔で皆に聞いている。
「昨日、何かにサインしたような気がするんだけど、、、」
・・・聞かれた誰もが目を逸らして真実を伝えない。大丈夫。何処かの漫画の主人公のように中東に売り飛ばされたりしないから。
開発が始まるときに大幅に増員してはいたが、もう少し負荷が増えると何日も家に帰れない者が続出し、プロジェクトルームに饐えた匂いが漂うようになってしまう。が、ギリギリ持ちこたえている。働き方改革が謳われる今日、人員を追加投入することも考えられる。だが、追加人員に色々教えている間、既存メンバーのパフォーマンスが下がる為、習熟曲線と期限を考えると既存メンバーで頑張る方が良いということになった。頑張れ!マシタさんと愉快な仲間達。稼働開始日はもうすぐだ!
今日も出社したら大騒ぎだった。日次夜間バッチの結果、今まで見たことがないログが出たという騒ぎが起こり、緊急対応が必要となる。・・・結局、ログの正体は夜間バッチが(初めて)エラーなく終了した旨のログだったが。。。
・本番環境でのテスト
本番環境と同じIT基盤を構築、いよいよシステムの本番稼働に備える。不思議なことにハードウェアやソフトウェアには相性というものがあり、組み合わせを変えると障害が解消したりすることもある。また、今回の顧客からは過去データを新システムで参照したいという要望があるため、旧システムの情報を変換、集約して新システムに移すデータ移行作業も開始されている(これがまた、データ不整合が良く起きる)。加えて、少し前から顧客に新システムの操作方法の説明、顧客の検証等が始まっている。
今回の顧客は12月決算なので、1月1日に稼働開始を迎える。稼働開始直前まで足掻く。今日は大晦日なのにプロジェクトルームにほとんど全員居る。世間から隔絶され、顧客の建物の形のせいか光速で宇宙を進んでいる気もする。そういえば、夏の花火もプロジェクトルームから、どこか別世界の出来事のように見たことを思い出した。眼下の首都高では、初日の出暴走か、首都高の往来を止めて、暴走族が首都高を逆走している。その光景を何度か見たデジャブに襲われ、軽い眩暈を覚える。
・稼働開始
初詣に出かける着飾った人の群れを横目にプロジェクトルームに出社する。街の人が着ている服の流行がどんどん変わってゆく気がしていたが、最近、一周して元に戻ってきた気もする。
今日の顧客の始業開始-9時に、いよいよ稼働開始だ。稼働開始から数日は新システムを触らずに済まそうという人が多く、障害等もあまり出ず、のんびりしている。1、2週間経つと問い合わせが増えてくるので使われ始めているという実感が湧いてくる。月末締めの請求書を翌月初に顧客が指定する用紙に初めて印刷したら、明細が一行ズレていることが判明。連絡してきた顧客の担当部署に向かって飛び出そうとするオオシタを止める。
「待て、オオシタ。俺が行く。」
-オオシタはこのところ負荷が掛かりすぎている。
顧客にお詫びし、戻ってからプログラムの修正を指示する。
・帰宅
ユーザーからの問い合わせも減り(明け方にサーバーが突如不規則にシャットダウンされるという残っていた、奇怪な不具合も掃除のおばちゃんが気を効かせたつもりでサーバーの電源スイッチを切っていたことが原因と判明したばかりだ。ちなみにいくら「電源スイッチを切らないように」と張り紙をしても、本能的に電源を切ってしまうおばちゃんには効果がないので、電源スイッチが露出していないサーバーに買い替えることになった。)、システムが安定稼働に向かっていることが判ったので、遂にプロジェクトを離れることになった。少し名残り惜しいが、アパートやら電気、ガス、水道と言った公共料金の解約手続きを進める。最終日、(前日の送別会の酒が残っていたが)定時より大分前だが皆の前でお別れの挨拶をする。花束を受け取る。エレベーター前まで皆見送ってくれる。オオシタが若干涙ぐんでいるように見えるのは気のせいか。またすぐにこの中の幾人かとどこかのプロジェクトで会うことになるだろうなと思いながら、本当に久しぶりに新幹線「はやぶさ」に乗って自宅に帰る。
駅から家まで歩く。明るいうちに外を歩くのは本当に久しぶりで目がしょぼしょぼする。まるで日光が苦手なドラキュラになってしまったようだ。
「ただいまー。」玄関を開ける。
「お父さん。やっと帰ってきたね。」自宅には見知らぬ青年が居た。息子-良だった。日に焼けてがっしりした体格の息子は二十歳になっていた。背丈も僕より高い。
光速で移動する宇宙船内では時間が進まないと聞いたことがあり、それを元ネタにしたアニメも見たことがあるが、自分が地上に居たまま浦島太郎になるとは思いもしなかった。
どこで間違えたんだろう。今回のプロジェクトの様々な出来事が走馬灯のように思い起こされた。どれもこれもどこかおかしなことばかりだった。そういえば、マシタさんから受けた始まりの電話からして、どこかおかしかった。ひょっとしたらプロジェクトの始めから・・・。
浦島太郎だって竜宮城で時を忘れて楽しく暮らしていたはずなのに、これじゃあオオシタが歌っていた歌の歌詞そのまんまだと、僕は深いため息をついた。
了