Javaで作れとの命令!しかしJavaの技術者は一人しかいない!という場合にとった方法

以前、携わったプロジェクトのお話です。

客先の要望で、WebのシステムをJavaで作れとの命令が下りました。

ナゼお客はJavaを要求したのか。
それは、CGIではなWebのシステムで、Javaでの導入事例が過去にあったからです。
お客は過去の導入事例が成功していたら、それを習い続けようとする風習がありました。
そのため、有無を言わさずJavaで作れとのお達しがでたのです。

ところが、その仕事を請け負うチームには、当時Javaをベースに設計ができる人がいませんでした。(爆)
いや、いるにはいたのです。2人。
一人は、別プロジェクトで大わらわ。他の仕事に手を割くことができない状態でした。
もう一人は、病気で戦線離脱(休職)中でしたが、もうすぐ戻ってくるというウワサが立っていました。
チーム長は、後者のもうすぐ戻ってくる病人に白羽の矢を立てることにして、
とりあえず仕事を請けた模様です。

その病人が私なんですが。(爆)

ともかく、プロジェクトは進んでいました。
要件定義は半分以上終わっていて、ツメの段階になって、ようやく私は復帰&参戦。
同時に、訳の分からんまま(爆)、即、クラス設計に入らなくてはならない状況でした。

このプロジェクトの特徴は

  • 旧システムのリプレイスである
  • 改修が頻繁に入る可能性がある
  • 運用とメンテナンスを引き受ける必要がある
  • 納期までが短い…(涙)
  • 爆速レスポンスを要求される…(滝涙)

そのため、

  • 「ここの仕様は前と同じ」といわれる可能性があるので、調査時間が必要
  • Javaを使える後輩を育てる時間がない
  • 私がいなくても誰かが改修ができる工夫が必要
  • Javaのチューニングはなるべくプロジェクト期間中に

という制約ができてしまいました。(汗)

ここで、一番の問題は、

  • 改修が頻繁に入る可能性がある
  • Javaの設計ができるやつがいないと想定する必要がある

の条件を同時にクリアする工夫が必要になっていることです。

幸い、HTML&JavaScriptに関しては、達人がいましたので、
その人中心に後輩の育成&作業をお願いできました。
ついでに、その方中心にXMLの作業もできるという環境ができましたので、
私はXMLをばんばん使うということが許される状況になり、かなり助かりました。
この状況を大いに利用させてもらい、
私自身はJavaに注力することが可能になりました。

◆問題点克服のキーポイント
改修をするということは、データのやり取りの方法が変わるということです。
 Webシステムのサーバから、ユーザ側に送るデータ(出て行くデータ)
 Webシステムのユーザから、サーバ側に送るデータ(入ってくるデータ)

大きく分けると、この2種類のデータのやり取りの部分をJavaに影響なくやる方法を考える必要があります。

◆出て行くデータ
出て行くデータは、Webの画面上に表示するデータの事を指します。
Webの画面上に表示するデータは、増えることも減ることもあります。

表示するデータが減った場合は、表示しないという工夫をすればいいだけですので、比較的簡単です。
HTMLを作成するのにXML+XSLを使えばいいのです。
JavaのプログラムからXMLを吐き出させ、XSLを使ってHTMLに変換する。
XSLという静的なファイルをメンテナンスしてやるだけで、Javaには一切触れることなくデータを見せないようにすることができます。
Java側には、
 ある画面を表示するにはどのXSLを使えばいいのか
の情報が書いてあるメタデータ(これも外部ファイル)を渡してやればいいようにしてやります。

表示するデータが増えた場合は、データが減った場合と同様、XSLを改修する必要がありますが、その元になるデータをストックして吐き出してくる場所…即ち、データベース(DB)とその呼出のSQLJavaの中に埋め込まないでおく必要があります。
Java側には、
 ある画面を表示するための元ネタとなるデータを拾うSQLはどれを使えばよいのか
メタデータ(外部ファイル)を渡してやればよいようにしてやります。

◆入ってくるデータ
入ってくるデータは、Webの画面上に入力したデータの事を指します。
Webの画面から入力するデータは、出て行くデータと同様増えることも減ることもあります。

入力するデータが増えた場合、増えた分のデータが何かをJavaが知る必要があります。
しかし、Javaのコードを変えることなくJavaにその辺構文を知らせるには、
はやりここでもメタデータ(外部ファイル)を利用します。
 ある画面から入力されるデータは、これとあれとそれだよ
ということをメタデータに記録しておき、そのメタデータJavaに渡してやるようにします。

入力したデータをストックしておかなければならない場合、
出て行くデータと同様、DBを利用することになります。
方法は、出て行くデータとまったく同じ方法になりますので、割愛します。

◆その他
出て行くデータと入ってくるデータだけが重要なデータというわけではなくて、例えば、人によってコンテンツを見せる・見せないという選択が必要になることもあります。
そんな場合も、迷わずメタデータ(外部ファイル)を作成して、Javaに渡してやることにします。

……………

こんな状態で、外だしにできるデータはすべて外出しにし、
Javaはデータを統合してコントロールするためのエンジンとしての役割をになわせることにした。
ただし、上記のパターンでは収まらない仕様の画面もあるだろうので、
 Javaの継承&オーバーライドの機能を使ってしのいでくれ…
という遊びの部分は多少なりとも残しておく必要はあった。
Javaを採用できたから、こういう遊びが作れたのかもしれないけど…。

ともあれ、Javaを使って一人で牙城(?)をくみ上げ、いろいろなすったもんだもあって火を噴かせてしまった(爆)ものの、もう一人のJava使えるヒトも投入し、メタデータ読み込みのオーバーヘッドを何とかチューニングし、ついでに、コンマミリ秒単位のSQLのチューニングもして、ようやく、プロジェクトは完了した…。

今も、このプロジェクトで作ったWebのシステムは、某企業で稼働中です…。
心配していた運用や改修も、なんとかできているようです…。

めでたし、めでたし。
…つーか、そのときのプロジェクトでたいそうなご迷惑をおかけしました。
非常に反省しております…。[参考:反省の内容と、所信表明]

…所信表明が実行できる状況になってないぞ…>CAMUS