Murayama blog.

プログラミングと、その次の話

上流工程は大切か、って話。

同業者のみなさんと飲んでると、
たまに「上流工程の仕事って意味ないよね」みたいな話になります。
僕も3年くらい前まではそんなふうに思ってました。
「さっさとコーディングして、アジャイルな開発にすればいいじゃん」みたいな、
アジャイルも上流工程お何もわかってない頃の話です。*1


最近、縁があって要件定義とか見積もりとか、
いろいろと勉強する機会がありました。
勉強した結果、やっぱり「上流工程のお仕事は大切だ」という結論に至りました。
厳密に言うと「上流工程の必要性は、プロジェクトの特性による*2」ってことなんですが、
その辺についてまとめてみたいと思います。

上流工程が大事なわけ

ソフトウェアのよくあるメタファ(比喩)として、
「ソフトウェアのお仕事は建築のお仕事とよく似ている」ってのがあります。
たしかに、モノを作っていくという上では似ていると思います。


建築の仕事に例えるときの話として、
「犬小屋を建てるには、計画や設計書は要らない」
「ビルを建てるには、しっかりとした計画や設計をする必要がある」
という話が有名です。
これをソフトウェア業界に置き換えると、
「小規模なシステム開発には計画や設計書は要らない」
「大規模なシステム開発は、しっかりとした計画や設計をする必要がある」
ということになります。


大規模なプロジェクトになると、
プロジェクトメンバー間でコミュニケーションをとるためにドキュメントが必要になったり、
目的を共有したりするためには、綿密な計画作りが必要になったりします。
一方で、小規模なプロジェクトの場合、実際の作業がイメージしやすいため、
必要以上にドキュメントを起こしたり、計画を起こしたりすることもなくなります。*3


買い物の例え

「建築業界とソフトウェア業界は違う」という意見もあると思うので、
もう一個メタファってみます。


例えば、僕のような一人暮らしの若者の場合、
コンビニに買い物に行くのと、スーパーに買い物に行くのでは、
買い物にいく準備に違いがでます。
コンビニの場合、「なんとなくこういうものがほしい」というスタンスで買い物をします。
スーパーに買い物に行く場合、ある程度まとめ買いをするので、
「今週の晩御飯はこんなの作ろう」とある程度頭の中で計画を立てたりします。
、、ん?この例えは微妙?

上流工程の仕事が軽視されるわけ

上流工程の仕事が軽視されるのは、
上流工程での最適なプラクティスが認知されていないから、というのも理由の一つのようです。
プログラミングやテスト手法*4というのは、
Web上の情報や、書籍も充実していて、学習しやすい状況が整っています。
一方、上流工程の作業というのは、明確なプロセスやベストな方法というものがありません。
上流工程の仕事はプロジェクトの特性による影響を受けやすいからです。


例えば、金融系のシステムと在庫管理系のシステムをWebシステム(Strutsとか)として開発するとします。
上流工程の仕事は、扱う業務や専門知識が大きく異なります。
一方の実装工程の仕事は、業務ロジックの難易度に差は出るかもしれませんが、
Strutsを使ったプログラミングという点では同じです。


「じゃー上流工程で最適なプラクティスは?」となると、
私も現在勉強中なので、まだまだ偉そうには語れません。。
これからジョジョに勉強していきたいと思います。

まとめ

大規模システムの開発自体ナンセンスだという話はおいといて、
開発対象のシステムの規模が大きくなればなるほど、上流工程の必要性が出てきます。
上流工程の仕事には「こうやれば正解」っていうものはないけど、
プロジェクトの特性に合わせたより良い方法を模索していく必要がある。
ってことで。


#後半だれた。

*1:今も勉強中です。

*2:プロジェクトの規模とかメンバースキルとか

*3:言い換えると、小規模なプロジェクトにおいては、個々の作業(タスク)が見積もりやすいので、ボトムアップ型の見積もりが適しているということになります。

*4:単体テストのような