エンタープライズシステム開発における大規模プロジェクトの技術支援
グローバルに展開する製造業のお客様において、全社基幹システムの再構築にあたっての複数部門・複数システムで利用する開発技術のカスタマイズ、エンハンスを実現しました。大規模開発が並行進行する開発プロジェクトで利用する各種の共通部品、フレームワークを実用に耐え得る方式に改善して適用しました。
業種:製造業(以下、「A社」という)
01
大規模開発を進める上での課題
クローズなパッケージ製品からの脱却
A社ではあるパッケージ製品(以下、「Bパッケージ」という)への依存に悩んでいた。Bパッケージでのシステム開発は専用の開発言語を用いるが、この言語スキルを持つ技術者は人材市場に決して多いとは言えなかった。さらに度重なる仕様変更もあいまってか、徐々に設計ドキュメントと実装との乖離もすすんでいた。当該スキルが市場に少ないが故に技術者が固定化しがちで、さらに設計と実装が乖離していくことで実装の属人化が助長され、その環境において要件の変更を繰り返していくことでシステムの複雑度も属人化度合いもさらに増していく、という悪循環に陥っていた。そうした中、Bパッケージの更改タイミングが迫り、更改費も莫大となることが判明し、このまま更改は受け入れられない、という状況に追い込まれていた。Bパッケージへの依存はA社内の複数部門にわたっており、全社的な問題でもあった。Bパッケージに依存していない部門においても、レガシーなアーキテクチャで構築されたシステムが存在するなどの状況もあり、これを機に全社的に複数部門のシステムを新しいアーキテクチャにリプレースするプロジェクトが立ち上がることとなった。
02
技術統括としてプロジェクト支援
新しいソリューションの採用とその適用推進体制
Bパッケージからなんとしても脱却する、属人化・技術者の固定化を完全に無くすことは無理だとしてもその度合いを極力さげる、を最大の目標とし本プロジェクトは始まった。
まず、部門間の流動性、市場からも人材を調達し易い技術としてJavaを採用することが決まった。実際、A社においてJava開発の実績が多数あったことも後押しとなった。
次に、A社グループ系列社がJavaをベースとした開発スイート(以下、「Cスイート」という)がソリューションとして採用された。他製品との比較・検討はもちろん踏まえての採用であったが、Cスイートは設計ドキュメントからJavaソースコードのスケルトンを生成でき、設計と実装の乖離を緩和できるというのが大きな理由のひとつだった。
Cスイートの特徴は下記の通り。
- 開発言語はサーバーサイドがJava、クライアントサイドがTypeScript(Angular)。
- 各種設計書フォーマットが決まっていて、設計書からソースコードスケルトンを生成する。
- テストのためのさまざまなしくみが用意されている。
- SpringやMyBatisといったOSS(オープンソースソフトウェア)で構成されている。
- グループ系列社製ということもあり、オンサイトを含めたサポートを受けやすい。
採用決定を受け、Cスイートを軸にしたさまざまな(見積、設計・実装・テスト、ビルドやデプロイといった構成管理、品質検査など)標準化が推進されることとなった。それらの一環として、実装におけるCスイート適用推進・技術支援というテーマで当社が参画させていただくこととなった。Java開発の豊富な経験はもちろんであるが、A社への技術支援実績や、開発・保守に携わった実績を評価いただいたことによる。Cスイートもひとつのパッケージ製品ではあるが、JavaおよびOSSを中心に構成されておりオープンな製品である。Java・OSSが得意分野ということでCスイート適用推進・技術支援の体制は当社を中心に組まれることとなった。なお、PMO的な支援や構成管理、各システムの開発支援など多岐に渡り当社は本プロジェクトに携わっている。
03
プロジェクト方針決定後から本番稼働まで
Cスイートのカスタマイズに始まった多岐に渡る技術支援
Cスイート適用推進・技術支援においては下記のような施策を実施した。
- Cスイートのカスタマイズ。※詳細は後述。
- 大小さまざまな共通部品を作成・展開した。
- 各種業務ロジック向けの共通部品(日付処理、金額処理、工場稼働日処理、など)
- A社標準のログインユーザー認証システムとの連携用部品
- DBレコード追加更新の一括処理部品
- 開発用ツールも含め、他多数
- Angular、TypeScriptによるクライアントサイド開発を推進した。
- 当初はAngularJSによるクライアントサイド開発を計画していたが、途中まったく別のフレームワークに転向することがA社トップダウン的に決定・推進されるも、最終的にAngularを採用することになった。
- 当時の最新バージョンであるAngular5.x系に転向するか、当初のAngularJS1.x系に戻るか2つの選択肢があったが、将来性やコンポーネント指向など複数の点を考慮しAngular5.xを提案し承認いただいた。
- Angularの経験者は当時まだまだ希少ではあったが、当社含めプロジェクトメンバー一丸となってノウハウの横展開などを行い、本番稼働までこぎつくことができた。
- 設計標準、開発標準を示したさまざまなドキュメントを作成・展開した。
- 設計や実装に関わる規約やルールを定義した各種基準書。
- 共通部品を効果的に使用するための開発手順書。
- 開発者教育。
- 100名以上規模の開発者に対して、開発手法、共通部品、基準書や手順書を浸透させるため、開発者教育を実施した。
制約や苦労はそれぞれあったが、Cスイートのカスタマイズ、これが後の施策につながる最初の、かつ大きな決断であったのでトピックとして紹介する。
下図はCスイートにおけるソースコードスケルトン生成のイメージである。
本プロジェクトにおいて、部門やシステムをまたいだ共通化は重要なミッションのひとつであった。非機能要件やA社特有の業務全体要件など共通化すべきテーマは当然多岐に渡って存在するからである。しかし、CスイートはあらかじめCスイートとして用意した共通クラス群(DB操作、インターセプタ、例外クラスなど)を1システム(または1ライブラリ)ごとに出力する構成(上図)になっており、これが共通化の大きな足かせだったのである(つまり、マルチプロジェクトに対応できない)。
そもそも部門またぎ以前に、部門内に閉じた共通化において上図のようにCスイートが出力する同じ内容の共通クラスが重複してしまいビルドができなくなってしまう。Entityクラスについてもシステムやライブラリごとにパッケージ名を変更できる仕組みが存在してはいたものの、同じ部門内においてER設計は基本的に同じなのでパッケージ名だけ異なる同じソースコードを重複配置することになり、ミスを誘発することも懸念された。
Cスイートの適用を諦めるか?しかし並行して設計ドキュメントは量産されている。後戻りはできない。量産の製造フェーズまで残り1カ月。Cスイートのサポート担当者・技術支援当社メンバーが一丸となり悩み、調査し、出した答えはCスイートのカスタマイズであった。前述の通り当社はJavaやOSSが得意分野である。CスイートのソースやOSSのリファレンスを読み解き、スケジュール含め実現性を説得・提案し、サポート担当者も巻き込み一丸となってカスタマイズ実現に至ることができたのである。サポート担当者を巻き込んだこともあって、カスタマイズ後もCスイートのサポートを受けることができたのも幸いであった。
こうして上図のような構成を実現し、その後の共通化(部門内も部門またぎも)のための礎を築いたのである。
04
プロジェクトの評価
Bパッケージからの脱却実現
そのままでは部門やシステムをまたいだ共通化を実現できない(あるいは何らか冗長な方式の共通化に踏み切ったかもしれない)可能性もあったCスイートであったが、カスタマイズに踏み切ったことで、全社的な共通化やさまざまな施策、そして各システムへの適用を実現することができた。本稿執筆時点でプロジェクトは継続中であるが、既にいくつかのシステムは本番カットオーバーを迎えることができている。実際、製造体制としては業務知識をもたない実装専門のチームが100名を超える規模で組まれ、設計チームが作成した設計ドキュメントをもとにソースコードスケルトンを生成し、設計と実装の乖離もほとんどなく開発を進めることもできている。Bパッケージからの脱却、設計と実装の乖離緩和、属人化緩和、すべてが実現できたと言えるだろう。
カスタマイズに踏み切ったことでCスイートのバージョンアップに追随する難易度が上がってしまったが、グループ系列ということもあり長期サポートが受けることができたので、その点で当面の心配はなさそうである。ただ、OSSのバージョンアップやEOLがついて回ることに変わりはなく今後の課題である。
05
大規模開発プロジェクトの成功のために
100名を超える大規模体制で円滑なシステム開発を進めるということ
100名を超える大規模体制で円滑なシステム開発を進めていく上では、開発技術の標準化が非常に重要な施策になると考えている。設計標準や開発標準を整備し、いかに設計・実装の属人化を排除して「プログラムの作りの均一化」に取り組むことが、開発プロジェクトの効率化はもとより、将来の保守性を確実に向上させることができるのである。
特に、その取り組みの中心となる開発フレームワークの選定とその利活用において、理想的かつ現実的に使える状態に持っていくために、製品提供側も巻き込んだカスタマイズにまで手を入れたが、これは以前よりさまざまなOSSコミュニティーに所属しコミッターとしても経験を積んできた当社のノウハウと経験の成果であると自負している。
部門をまたがったライブラリ構成・展開といった技術支援の知見・経験は他のエンタープライズ企業に対しても応用できるノウハウであり、AngularやTypeScriptといったクライアント技術の知見・経験も大いに役立てることができると考えている。
プロジェクトは継続中であるが、保守やOSSバージョンアップ・EOLに向けた施策がテーマとして残っている。これらの知見・経験も加えることができれば、対応できる幅はさらに広がると思われる。
大規模開発における開発技術の提供は、当社が以前より提供してきたサービスであるが、その採用技術は時代とともに変化していく。お客様の要件を踏まえて、その時々で最適なアーキテクチャを選定するところからスタートし、開発プロジェクト成功のためのシナリオ作りや武器・部品の提供、プロジェクトの運営・統制やベンダー各社のコントロールまで、お客様とともに協働体制を組むことができるので、開発における課題があればぜひとも相談していただけると幸いである。