1年半近く関わったプロジェクトが完了したため総括する。

はじめに

一年間半近く関わったプロジェクトが完了間近になっています。要件定義を経てドキュメントの作成、実装、単体テスト結合テスト、総合テスト、受け入れテストと完了し、バグはなく、要求は満たせており、プロジェクトとしては成功という事になっています。顧客も概ね納得頂いているようです。リリースはまだですが、バグ自体は環境要因以外ではおそらく出ないでしょう。品質*1は問題ないというのが上司の主張です。ですが、私はハッキリと大失敗したと考えています。顧客の大切なお金を無駄にしてしまいました。設計はガタガタで、実装は酷い有様です。今は問題が生じていないですが、きっと保守開発のスピードが大きく低下し、お金をかけた割にシステム利用のフィードバックが改善されずに、失敗プロジェクトとして受け取られるようになってしまうと思います。今後の取引はなくなるでしょう。本当に悔しい気持ちで、自分が恥ずかしくて仕方ないです。二度と同じような失敗プロジェクトに導かないために総括します。

背景

私は経験3年目のITエンジニアです。一年ほど雑用みたいな仕事に関与したあと、初めて今回のような要件定義から行うプロジェクトに参加しました。プロジェクトの目的としては古くなったUI層を刷新しつつ、新規機能を複数追加するプロジェクトです。顧客側発注チームはITベンダに丸投げをしていて自社システムのことはあまり分かっていない様子でした。こうしたいというデザインイメージはあったため、それを何とかして引き出して頂き、追加したい機能についても伺っていました。私の所属する受注チームは顧客のシステムの保守運用を担当しているITベンダです。保守運用がメインですので、開発についてはほぼ素人集団です。他にデザインを担当するデザインベンダーが存在しています。このような体制でプロジェクトが進んでいました。

問題点

要件定義結果として今あるシステムのHTMLを書き換えてviewを刷新するということになりました。 しかし、今になって思うとこれは顧客が本当にやりたかったこととは思えません。 我々がやるべきだったことは、現在のサーバサイドでJSPコンパイルしてHTMLを返す昔ながらのシステムから、バックエンドとUI層を切り離して、モバイルでもWEBブラウザでも利用できるようにすること、さしあたってはWEBフロントエンドを現代的なWEBアプリケーションとしてフロントエンドフレーワークを使用して作り変えることだったはずです。そのためにWEB APIによってJSONを返すようにバックエンドをリファクタリングするチームとWEBフロントエンドをゼロから構築するチームに二分割してプロジェクトを進めるべきでした。*2 これによって、顧客は今後5年はそのWEBアプリケーションを利用しつつモバイルAPPを作成して両面から集客してビジネスを進めることが出来たはずです。いま、この時点でそのプロジェクトを進めるべきだったはずです。そうでなければUIの古臭さによって競合に差を付けられてしまいます。我々が作ったjQueryを使用した昔ながらのviewではもはや競合には勝てません。

次の問題点として、今のシステムにはテストコードがありません。元々は存在していたようなのですが、保守開発を続けるうちに壊れてしまい、無視されて廃棄されたようです。悲しいですね。我々はテストコードを書き直すプロジェクトを行うべきでした。何度も説得したのですが無駄でした。

この要件定義を経て良くわからないデザインベンダーが作り上げたHTMLとjQueryを使用してただただHTMLを書き換えるプロジェクトが進行しました。しかし、そんな作業をしていてももはやソフトウェアの根本的な価値を増進することにはなりません。この時点でプロジェクトは失敗していました。

プロジェクト結果

その後、良くわからない設計ドキュメントというエクセル資料を大量に作成する作業で顧客の資金を無駄にし、実装はバグが無いものの可読性の低い修正困難なコードが量産され*3、結局テストコードは書くことが出来ませんでした。わざわざ書きませんがプロジェクトの大部分は信じられないような無駄な作業が大半を占めており、指摘しても聞き入れられませんでした。システム自体はリリース判定を超えてリリースすることが決まっています。しかし、果たしてこれからシステムを保守運用していくことが可能なのでしょうか。システム自体は動くはずですが、機能追加などの速度は一気に落ちてしまうはずです。viewはデザインは新しくなったものの見かけだけで、利用者のUXの改善につながるとは到底思えません。

何故こうなってしまったのか

何故こうなってしまったのでしょうか。発注側、受注側ともに私含めて素人ばかりだったからこうなってしまったのだと思います。顧客チームはシステムのことを丸投げしていたせいでまともに仕様すら把握していない。受注側はソフトウェア設計についてまるで知らず、その場しのぎの対応しかできない。ソフトウェア開発が専門職集団による知識集約型の仕事だということをあまりにも理解していないから、こうなってしまうのでしょう。私はもうこんな仕事はしたくありません。顧客の資金を有効に活用し、ソフトウェアの価値を高めていく仕事をしたいです。もう本当に嫌になってしまいました。

これからどうするか

今回のことを経て専門知識がなければソフトウェア開発を受注してはいけないと強く痛感しました。なによりもソフトウェア設計の重要性が身にしみてわかりました。 上に挙げた問題点もClean Architectureでviewとビジネスロジック疎結合にすることの重要性を学んだから気づけたことです。entityとユースケースを保護しつつフレームワークやUI層はいつでも切り替え可能な設計にするべきでした。ソフトウェアの設計自体を大きく変更する視点が必要だったのです。リッチなウェブアプリケーションが増えるにつれて古臭いjQueryを使用したシステムはなんだか見劣りすると思われてビジネスの足かせになってしまうでしょう。他にもウォーターフォールの問題点や、コードの可読性、テストコードの重要性についてなど、多くの反面教師となる事象に気づきました。結局の所問題はすべて学ぶこととソフトウェアを良くしていくことに対する情熱がかけているから発生しているのです。私は知らないことが多すぎてめまいがするほどですが、良いソフトウェアを作成して顧客に貢献するためには、これから死ぬほど学ばなければいけません。今回のプロジェクトはそんなことを気づかせてくれました。

楽しかったこと

愚痴っぽくなってしまいましたが、楽しかったこともあります。 自分が作成した機能やバッチが無事動いて出力が表示される時はとても楽しいです。自分の実装した共通機能がチームメンバーに利用されるのは嬉しいです。 意味不明なバグを解決した時は自分で自分を褒めたいような気分になります。他メンバーが解決できないバグを自分が直せた時などは平静を装いつつも内心は「おっしゃあ!」と思っています。 もっと、そんな楽しいことをたくさんしていきたいです。

*1:バグがなく、要求を満たせていること

*2:多分我々のチームでは出来ないでしょう…。でも、それを提案するべきだったというのは間違いないです

*3:ちなみに派遣で来たメンバーが残したコードはバグまみれでした