ビルドシステム構築スキルの重要性

忙しいプロジェクトだとどうしてもおろそかにされがちなところですが、maven2やant+ivyを使ってビルドやリリースの自動化を行い、Hudsonなどの継続的結合環境上で動作させることは、開発生産性向上のために欠かせないことです。ビルド自動化はアジャイル開発なら当然必須ですが、そうでないウォーターフォールのプロジェクトであっても、是非取り入れたいことです。
そこで、意外な盲点となるのが、正しくビルドスクリプトを作成して、メンテナンスするプログラマーのスキルが非常に重要であるという点です。こういったビルドスクリプトはあくまでも最終納品物ではなく、生産性向上のためのツールという位置づけのためか、多くのプロジェクトではきちんとした工数や担当者がアサインされることなく、仕事の合間に知識のあるプログラマーがボランティアで開発するというケースも多いのではないでしょうか。しかし、最近の複雑なアプリケーションでは、実は、これらのビルドシステムを正しく構築するのは想像以上に難しく、下手をするとアプリケーションロジックの開発よりもずっと専門知識が必要になるケースも多いのではないかと思います。ivyの多数のオプション指定やmavenプラグインの設定を正しく行い、依存関係のあるライブラリーを正しく設定するのは、本当にスキルのいる仕事です。
私の失敗談として、ビルドの自動化ということに熱心になるあまり、ボタンクリックひとつで10個ものwarと30個近いjarを組み合わせて、リリース対象のモジュールを一気に作るというantスクリプトを開発したプロジェクトがあります。そこで、何がまずかったかというと、あまりにも簡単にビルドできる仕組みをつくったのは良かったのですが、仕組みがブラックボックス化されてしまい、中身をきちんと理解して拡張できるSEに引き継げなかったことです。実際リリース作業を担当していたのは元請の会社の新人や2年目のSEさんたちで、手順書どおりにビルド、リリースすることはできるのですが、機能追加などがあって中身のjarが変更になったりすると、そのたびごとに何かの障害が発生して、結局私が呼び出されて注意されるという羽目になってしまいました。ビルドで中身に含まれるjarファイルのバージョンが少しでも違うと大障害になる恐れもあるのですが、そういうトラブルになると、結局antやpomを作ったプログラマーが一人悪者扱いされてしまうことが多いのではないでしょうか。理不尽なことですが、われわれとしては以下のような策をとるしかありません。

  • ビルドシステムをきちんとドキュメント化*1すること(使い方だけでなくしくみも)
  • リリース時のテスト自動化などビルドの問題を容易に検証する仕組みをあわせて作ること
  • pom.xmlbuild.xmlリファクタリングを行いメンテンス性を向上させること
  • ビルドスクリプトもソースの一部としてきちんと構成管理すること
  • 担当者に対してmavenやivyの教育をしっかりと行うこと

というのが防御策になるでしょうか。特に、最後の点については、現状antはともかくivymaven2*2の日本語ドキュメントもほとんどなく、英語力を含めて担当者の理解力がどうしても必要という点に注意が必要です。
エンドユーザーにとっては、ビルドが失敗してjarがうまく取り込まれていないことが原因で起こった障害も、アプリバグで起こる障害も区別が付きません。どちらも、品質が悪いシステムということにされてしまいます。われわれとしては、アプリケーションのプログラムの品質だけでなく、ビルドシステムも納品物の一つという意識をもって開発することが大切であると、この苦い経験により身をもって感じました。

*1:ビルドスクリプトソースコードの一種だから、きれいにリファクタリングしてメンテナンスすればそれがドキュメントになると私も考えていました。しかし、大規模開発だと往々にしてプログラミングスキルのない人たちがビルド担当になったりして、ソースを読んだり理解しようと努力してくれないことが多いと思います。あくまでもブラックボックスのツールとしてしか使おうとせず、問題があったらもともとの作成者の責任にしようとするだけで。プロジェクトを抜けて何ヶ月も後に電話で質問が来たこともありました。そんな前のことは忘れているし、ビルドスクリプトのソースを読める立場の人の方が理解できるはずなのですが。そういう場合の保険としてドキュメントが重要ということです。ここではプログラマーがずっとシステムをメンテナンスするという理想的な場合ではなく、開発後保守チームに引き渡すといったような大規模開発でありがちなケースを念頭に置いています。大規模だと一般的にビルドが複雑にもかかわらず、担当者の平均スキルが低いというところが怖いところかと思います。

*2:maven2については入門的な内容だと日本語の書籍もありますし、最近ではWeb上でいろいろと参考サイトがあるようです。\¬ŠÇ—@ŽÀ‘H“ü–å@‘æ4Í Maven2‚É‚æ‚éƒrƒ‹ƒh“ü–å@‚È‚ºMaven2‚È‚Ì‚©Hなどは非常に参考になると思います。ただ、リリース環境ごとにアーティファクトの内容を切り替えたり、高度なことをやろうとするととたんに敷居が高くなるのがmaven2の危険なところですね。