2012年12月16日日曜日

サラリーマンシップ宣言

小学校高学年の頃、僕は近所のスポーツクラブに所属していて、春と夏は野球を、秋と冬はサッカーをやっていた。

サッカーは好きだし得意だったけれど、子供の頃から視力がかなり悪くて、しかも当時はコンタクトレンズもしていなかったから、ボールの小さい野球はあまり得意じゃなかった記憶がある。

そのスポーツクラブは、地域の野球大会に定期的に参加していて、僕はとある大会の開会式で選手宣誓をやることになった。

例の「我々は、スポーツマンシップに則り、正々堂々と闘うことを誓います!」っていう、あの場以外で口にするにはちょっと恥ずかしいやつだ。

開会式が終わって暫くすると、僕らの試合が始まった。

他はどうだか知らないけれど、当時の(僕の地元の)少年野球では、試合中に壮絶なヤジ合戦が繰り広げられるのが常で、「相手のピッチャービビってるぞー」とか「ボールが遅すぎてハエが止まってるぞー」とか(以下自粛)、とにかくあらゆる罵声が飛び交っていた。

僕たちのチームの攻撃になると、ベンチからいつものようにあらん限りのヤジと罵声が飛び出す。

まあ、少年野球って言っても近所のガキ集めてやってるんだから、ある意味仕方のないことなのかもしれない。 

試合はこっちがリードする展開で、調子に乗った僕らは、ますます盛大に相手を罵りまくっていた(いわゆる「絶口調」という感じ)。 

と、その時急に、監督が僕らの前に立った。
当時の僕たちのチームの監督は杉山さんと言って、半端じゃなく恐くて厳しい人だったので、 僕らは「さっきの○○の気のないスイングが原因だろ」とか「○○がエラーさっきエラーしたからだろ」とか、あらん限りの悪い想像をして、怒られるのを覚悟した。 

でも、杉山監督は怒ってるわけじゃなかった。

いつもの練習時のように声を荒げるわけでもなく、怒鳴り散らすわけでもなかった。
その代わりに失望と落胆の表情を浮かべて、静かにこんなことを言った。

「相手を馬鹿にするんじゃなくて、味方を盛り上げるための応援をしようぜ」

僕はその時初めて、自分が開会式で口にした「スポーツマンシップ」の意味を理解した。
相手を貶めるんじゃなく、自分たちを鼓舞するのがスポーツマンなんだ、って思った。



さて、あれから20年ちょっと経って、僕も大人(というかオッサン)になって、社会に出てサラリーマンしてる毎日だ
(スポーツマンにはなれなかったw)。

時間はだいぶ過ぎたけど、果たして僕と僕らのチームは、監督を失望・落胆させないような仕事ができているだろうかって、時に疑問に思うことがある。

サラリーマンならサラリーマンらしく、サラリーマンシップ(?)に則って、

  • 正々堂々と、セクショナリズムと闘って、
  • 相手を貶めるんじゃなく、自分たちの能力を向上させるために議論する。

そんな風に仕事をしていきたい。

自省の意味を込めて、忘れないように今日ここで、サラリーマンシップ宣言をしておこう。


2011年11月12日土曜日

Mavenのビルドライフサイクル

Mavenのビルドライフサイクルについてきちんと理解するために、Introduction to the Build Lifecycleを日本語訳してみました。

ビルドライフサイクルの基礎
Maven 2.0はビルドライフサイクルというコンセプトを基本としている。これが意味することは、特定の成果物(プロジェクト)をビルドして配布するためのプロセスが明確に定義されているということである。プロジェクトのビルド担当者は、Mavenプロジェクトをビルドするためのいくつかのコマンドの一覧を学ぶだけでよい。そうすれば、ビルド担当者が望む結果を得られるように、POMが保証してくれる。
「default」「clean」「site」という、あらかじめ規程された3つのビルドライフサイクルがあり、「default」ライフサイクルはプロジェクトの配備(デプロイ)を、「clean」ライフサイクルはプロジェクトの掃除(ビルド成果物の削除)を、また「site」ライフサイクルはプロジェクトサイト用ドキュメントの生成を扱う。

ビルドライフサイクルはいくつかの「フェーズ」から構成される
これらビルドライフサイクルは、それぞれ異なるビルドフェーズの一覧によって規定される。ビルドフェーズは、ビルドライフサイクル中の段階(ステージ)を表現している。
例えば「default」ライフサイクルは以下のビルドフェーズから構成される(ビルドフェーズの全一覧表を見たい場合は、(Lifecycle Referenceを参照のこと」)。
  • 検証(validate) - プロジェクトに誤りがないかどうか、全ての必要な情報が利用可能かどうかを検証する。
  • コンパイル(compile) - プロジェクトのソースコードをコンパイルする。
  • テスト(test) - 適切なユニットテスト用フレームワークを使用して、コンパイルされたソースコードをテストする。ここで言う「テスト」とは、コードがパッケージあるいはデプロイされていなくても実行可能なものを指す。
  • パッケージ(package) - コンパイルされたコードを、jarなどの配布可能な形式にパッケージする
  • インテグレーションテスト(integration-test) - パッケージ(された成果物)を、必要に応じてインテグレーションテストが実行可能な環境にデプロイ(配備)する。
  • 確認(verify) - パッケージ(された成果物)が妥当であり、品質基準に適合することを確認するためのチェックを実行する。
  • インストール(install) - ローカル環境で他プロジェクトの依存関係として利用できるように、パッケージ(された成果物)をローカルリポジトリにインストールする。
  • 配備(deploy) - インテグレーションもしくはリリース環境で実行され、他の開発者やプロジェクトと共有できるように、最終パッケージをリモートリポジトリにコピーする。
これらのビルドフェーズ(に加えて、ここで示されていない他いくつかのビルドフェーズ)が順次実行されて、「default」ライフサイクルが完了する。上述のビルドフェーズについて考えると、「default」ライフサイクルが使用される場合、Mavenは
最初にプロジェクトの検証を実施し、次にソースコードのコンパイルを試み、コンパイルされたソースコードに対してテストを実行し、バイナリ(jarなど)をパッケージし、パッケージされた成果物に対してインテグレーションテストを実行し、妥当性を確認し、確認済みのパッケージをローカルリポジトリにインストールし、最後にインストール済みのパッケージを特定の環境に配備する、ということを意味する。

これらの全てを行うには、最後のビルドフェーズ、つまりこの場合は「deploy」を呼び出して実行しさえすればよい。

mvn deploy

ビルドフェーズを呼び出した場合、Mavenは該当のビルドフェーズだけでなく、それ以前に位置する全てのビルドフェーズを
実行するからである。
従って、

mvn integration-test

を実行すると、インテグレーションテストの実行前に、それ以前の全ビルドフェーズ(検証、コンパイル、パッケージ他)が実行される。

ビルドライフサイクルを構成するさらにいくつかのコマンドがあるが、それについては後のセクションで議論する。

また、同一のコマンドを複数モジュールシナリオ(a multi-module scenario、1つないしはそれ以上のサブプロジェクトを持つプロジェクトなど)でも利用できる。例えば、

mvn clean install

というコマンドは、全てのサブプロジェクトに対して、掃除(clean)とインストール(install、事前の全ステップを含む)を実行する。

ビルドフェーズは複数の「ゴール」から構成される
しかしながら、ビルドフェーズがビルドライフサイクルの特定のステップに対して責任を負うと言っても、ビルドフェーズが責務を果たす方法はそれぞれ異なる。そしてこれは、これらのビルドフェーズに結びつけられた「ゴール」を宣言することによって行われる。
ゴールは、プロジェクトのビルドと管理に寄与する、(ビルドフェーズよりも粒度の小さい)特定のタスクを表現する。ゴールは、0以上のビルドフェーズに関連付けられる。どのビルドフェーズにも関連付けられないゴールは、ビルドライフサイクル外で直接起動することによって実行できる。ゴールの実行順序は、ゴールとビルドフェーズが起動される順序次第である。例えば、以下のコマンドについて考えてみる。引数の「clean」と「package」はビルドフェーズであり、「dependency:copy-dependencies」はゴールである。

mvn clean dependency:copy-dependencies package

このコマンドが実行された場合、最初に「clean」フェーズが実行され(これは、「clean」ライフサイクルにおける、先行する全フェーズの実行を意味する)、次に「dependency:copy-dependencies」が実行される。そして最後に「package」フェーズ(および、「default」ライフサイクルでの先行する全てのビルドフェーズ)が実行される。

加えて、1つのゴールが1つ以上のビルドフェーズに結びつけられている場合、そのゴールはそれら全てのビルドフェーズ内で呼び出される。

さらに、ビルドフェーズには0ないしはそれ以上のゴールが関連付けられている。もし、ビルドフェーズが1つのゴールも持っていない場合、そのビルドフェーズは実行されない。しかし、1つ以上のゴールを持っている場合、ビルドフェーズはそれら全てのゴールを実行する(注:Maven 2.0.5以降では、1つのフェーズに結びつけられた複数のゴールはPOMに宣言されたものと同一の順序で実行されるが、同一プラグインの複数インスタンスはサポートされていない。同一プラグインの複数インスタンスはグループ化されてまとめて実行され、Maven2.0.11以降では順序付けられる?)

2011年8月31日水曜日

Eclipse Indigoのネットワーク設定

インターネット接続にプロキシ認証が必要な環境下でEclipse Indigo(GalileoやHeliosも?)を利用していると、「HTTP Proxy Authentication Required: 」というダイアログが表示され、「Install New Software」からのプラグインインストールに失敗する場合がある。

私の環境(職場)では、これは以下の手順で回避できた。


  1. メニューから「Window → Preference → General → Network Connections」でネットワーク設定画面を開く。
  2. 「Active Provider」を「Native(デフォルト)→ Manual」に変更する。
  3. 「Proxy entries」で、最左列にチェックが付いている各行について以下を実行し、OKを押下する。
    • プロキシサーバのホスト名とポート番号を入力
    • Requires Authenticationのチェックをオン
    • UserとPasswordを入力
  4. 「OK」を押下し、ネットワーク設定画面を閉じる。
  5. Eclipseインストールフォルダ下の「eclipse.ini」ファイルの末尾に、以下の1行を追加する。
    • -Dorg.eclipse.ecf.provider.filetransfer.excludeContributors=org.eclipse.ecf.provider.filetransfer.httpclient
  6. Eclipseを再起動する。

同じ現象で悩んでいる方がいらっしゃったらお試しください(ただし、自己責任でお願いします)。
ちなみに、3・4番と5・6番の順序は逆でもOKでした。

2011年7月29日金曜日

ソフトウェア開発の自動化

NTTデータ社のソフトウェア開発自動化への取り組みに関する記事を発見したので、所感をいくつか。

http://www.ntt.co.jp/journal/1105/files/jn201105038.pdf
http://www.nttdata.co.jp/event/library/itpro2010/day1/pdf/itpro2010_j2.pdf

賛同できる点
・ソフトウェア開発の方法を「大量の開発者による労働集約型ワークスタイル」から「少数精鋭の開発者による知識集約型ワークスタイル」に変えて行く必要がある、ということ。

疑問な点
・「ソフトウェア開発の自動化」は、知識集約型開発を実現するためのよい方法なのか?
・複雑なビジネスルールなどの自動化に目を背けたまま、形式的に生成できる設定ファイルやソースコードを生成することに意味があるのか?
・自動化困難な部分こそが、そのソフトウェアの価値の源泉なのではないか?