SI業界(日本)のJavaプログラマーにはオブジェクト指向より忍耐力が求められている?

私自身は10年以上も前(JDK1.1の頃)にSJC-Pの認定を取って以来、Javaプログラミング関連の認定試験は受けていないのですが、昨日たまたまネットを検索して、SJC-Pとは別にJavaプログラミング能力認定試験という試験が存在していることを知りました。結構メジャーな認定試験のようですので、現役のJavaプログラマーJavaプログラマーを目指している学生さんで、今後受験に向けて勉強されている方々も多くいらっしゃるのではないかと思います。
試験は難易度に応じて3級から1級までランクが分かれており、2級まではJava言語の知識に関する筆記試験ですが1級の試験では実際のプログラムの修正を行う能力が実技試験として課せられます。試験範囲は以下で公開されています。
Javaプログラミング能力認定試験(試験範囲)
私は(自分で言うのも変ですが)、Javaプログラミングについてはこの道15年近くのキャリアーがある「ベテランJava PG」なので、最上級の1級に余裕で合格できなくては恥ずかしいと思われますが、この1級の試験については実技試験で機能追加を行うベースとなるプログラムのソースコードと設計書が正規のサイトで公開されていました。いきなりぶっつけ本番で仕様書を渡されてゼロベースでプログラムを書くということではなく、事前にソースコードを十分読み込んだ上で試験に臨むことができるようです。もちろん、プログラムのどの部分が改変対象となるのかというところについては公開されていません。(ちなみにサンプル問題を見る限り、改変は機能修正や機能追加であり、リファクタリングということではもちろんないです。改変部分の変更定義書の記述も必要。この問題が既存の設計をあるべきオブジェクト指向設計リファクタリングせよということであれば、非常に難易度が高いけど、チャレンジしてみたいと思う良問となるのですが・・・。)
私としてはちょっと興味があったので、以下から1級の試験問題のサンプルを実際ダウンロードして、試験で改変する対象となるプログラムの設計書とコードを読んでみました。
Javaプログラミング能力認定試験(試験サンプル)
もともと、この試験の目的としては

Javaに関する基本知識を有し、オブジェクト指向に基づくアプレットやアプリケーションプログラムを作成できる能力を認定します。

オブジェクト指向に基づく分析・設計(UML)により業務システムの流れを把握し、変更仕様に従ってプログラムの保守ができる能力を有する。なおUMLの表記はユースケース図、シーケンス図、クラス図などの基本的な知識を有する。

ということになっていて、あくまでもオブジェクト指向言語の試験であることが明記されているようですが、ダウンロードした設計書とコードを見ると、純然たる手続き型構造化のクラス設計で作られていることが一目瞭然でした。まず、個々のクラスの単位が以下のように処理の単位、すなわちCOBOLの主プログラム、副プログラムと同じ考え方で分割されています。このことは以下のようにクラス名が通常のように名詞ではなく、機能を表す動詞となっていることからも明らかです。

クラス名 処理概要
Manage 人材派遣管理メインクラス(機能選択)
DContents 機能表示
GChars 入力受取り
GGList 業種リスト作成
JDelete 人材情報削除
JDisplay 人材情報表示
JInput 人材情報追加
JUpdate 人材情報更新
KDelete 稼働状況削除
KDisplay 稼働状況表示
KInput 稼働状況追加
SInput 検索情報入力(検索条件指定)
SOutput 人材検索

これがStrutsのアクションのような感じでTransaction Scriptとして作られているなら良いのですが、そういうものではなく、純粋にCOBOLプログラムのような設計となっています。そして、クラスの抽出の方法のみでなく

  • ファイルから読み込んだレコードデータをオブジェクトに入れず、すべてString[ ]やString[ ][ ]などの配列として扱っている。(コレクションクラスはほとんど使われていない)
  • 単にグローバルメソッドのstatic importの目的のためだけにクラスを継承している。ポリモーフィズムは一切活用されていない。
  • privateやpublicなどのアクセススコープの指定は(mainメソッド以外)一切ない。
  • メインクラスからサブクラスまで処理単位の入れ子モジュールとして構造化されている
  • ファイルの読み込み(データアクセス)、画面出力、ロジックが混在して記述されており、アーキテクチャー上まったくレイヤー化されていないし、MVC構造といったものもない。
  • FileReaderなどの低水準のクラスを直接アプリケーション層のクラスが扱っている。(例題とは言え、例外処理やクローズ処理がいい加減過ぎる。)

などなど、これが資格試験の問題なのかと目が点になってしまうような驚くべき設計のコードとなっています。まさに、以前にJava EEや.NETはCOBOLやVB6よりも本当に生産性が高いか?で指摘したように、COBOLの方がよほど生産性が高いのではないかと思われるような設計となっています。
一応出題者の名誉のためにフォローしておくと、この試験の目的は
あくまでも取得した後に実社会で価値のある認定試験であること
ということのようなのです。よって、日本のSI業界でJava PGとして仕事をするためには、オブジェクト指向的にきれいなあるべき姿でコーディングできるスキルではなく、このようにオブジェクト指向をまったく理解していない上流のSEが作成した異常な設計書に忠実にしたがってコードを書き、また、その複雑なスパゲッティコードを長期にわたってメンテナンスする根性と忍耐が最重要のスキルとして試験で試されているということなのかと私は理解しました。(そういうことであれば、私はこの試験に合格する自信がないですが。)
運良く私がPGとしてかかわったプロジェクトではここまでひどい設計を押し付けられたことは無いのですが、仕事に役立つとされる資格試験の最上級の試験で、このような問題が出題されているという事実をあらためて知り愕然としました。
書籍の例題プログラムやOSSで公開されているソースを作成したプログラマーは、それなりにオブジェクト指向を理解している優秀なプログラマー達なのですから品質の極端に悪いコードを見かけることはめったにありません。その一方で、以前にも(グルーポンのおせち事件を受けてSI業界が本当に教訓とすべきこと)で指摘したように、SIerが開発したシステムのソースコードがネット上に公開されたり、議論されたりすることは当然ですがほとんどありません。しかしながら、記述されているコードの分量から言えば、日本SI業界においてネットや書籍で多くの人から評価されないJavaコードの大半は、この試験の問題が象徴しているような低品質のものが多いということがやはり事実ではないでしょうか?
OSSなどで活躍されている一流のプログラマーの方々は、こうした業界の有り様には興味がないのでしょうか?実際、

などという議論がネット上で盛んに行われていますが、こうした一流PGの方々は、業界の一般のPG(私を含めて)とはまったく別次元の遠く離れた世界で生きているのではないかと感じてしまいます。でも、少なくとも20年は遅れた開発手法が蔓延している、日本のSI業界のPGを取り巻く環境の惨状を、今後もはたして放置しておいてよいものなのでしょうか?確かに、このような時代遅れで低レベルのプログラムを開発しているのは自分とは関係の無い、ブラック会社などSI業界の底辺の一部の世界で行われていることなのであると単に無視してしまうことは容易です。しかしながら、一般の職業Javaプログラマーの大半は、旧態依然としたSI業界の枠組みの中で日々働いています。このような問題をずっと見過ごしていては、今後もSI業界を支える多くのプログラマーの価値が低く評価され続け、無益かつ過酷な単純労働を長時間強いられることになる*1のではないでしょうか?技術者として自分の興味のある最新技術を追いかけるのもよいですが、私としてはこういった業界の問題があたかも存在しないことのように無視され続けるのは非常に残念に思います。
なお、そもそもこの例題プログラムで行っていることは、単純なタブ区切りのファイルに対するCRUD処理を行うものです。今の時代にこのようなシステムの構築に最低限RDBを使うのが当然ということはおいておいたとしても、設計書に記載されているシステムの仕様自体、ビジネス上ほとんど価値のない事をやっているわけです。それにもかかわらず、正しい設計であれば本来不要な、大量のコードや設計書の記述が必要で、ちょっとした機能追加を行うだけで最上級の試験問題のネタになってしまうくらいに大変な作業が要求されることになるのです。プログラミング技術のわからないSEの書いた不適切な設計書に従ってこのような生産性の低いコーディング作業を行うのであれば、確かにPGは付加価値の低い単純労働であり、その仕事に対する労働対価は非常に低いということはそのとおりであり、私としても否定する余地がありません。
ところで、百聞は一見にしかずです。機会があれば、この例題プログラムをあるべき形にリファクタリングした結果と、そのリファクタリング手順を皆さんにお見せできればと思います。そうすれば、生産性を向上させ、PGとして付加価値の高い仕事をする上で、プログラムの正しいアーキテクチャー設計がいかに大切であるかということをご理解いただけるものと思います。

*1:問題の本質は単に3Kとか7Kとかいうことではなくて、PGとしてのスキルが正当に評価されることなく、単純労働を強いられるということにあります。