やってる俺たちってイケてるぜ、いぇぇぇ〜〜。
みたいなプロジェクトが、時間を経つにつれてメンバーの眉間にシワがより始め、一人抜け、二人抜けしていく……。
という光景は珍しくないのではなかろうか?
アジャイルでの開発は、いやそれに限らずどんなことも、やり方を表面的になぞるだけではダメなんです。
確かに仕様は揺れるけど、それでも大まかな仕様、流れはきっちりと詰めておかなければ、各機能ごとに仕様を決めていって最後に全体が完璧にハマる、という偶然はまずもって訪れないだろう。
家を建てる時のことを考えれば、大して難しい話ではない。
「風呂いるよねー」
「トイレもねー」
「キッチンは対面式でー」
「居間は大きな窓でー」
と適当に並べていって、住みやすくて掃除しやすい家になるわけがない。
一番最初に、住人の構成、生活動線を考えて、廊下、階段、上下水ガス管、電線の取り回しを確定してから、それぞれの部屋なりを設計、実装しなきゃならないだろう。
システム開発で言えば、大まかなデータ構成、流れを確定して、それをどう流すかというFoundation部分の有効性をざっくりとでも検証しておかなくてはならないということだ。ここを後回しにすると、ある機能を追加したいのに他の機能が邪魔をするから変な制約を追加しなければいけないとか、その場しのぎが多発することになり、その場しのぎの邪魔な杭があちこちから顔を出しているせいでアジャイルのストーリー消化がどんどん遅延していくことになる。
今回のプロジェクトでは最初に全体設計を提案したのだが、そんなのアジャイルじゃない、こうした方が(最初に実装予定の機能に関しては)アーキテクチャ的に単純化されて綺麗、などなど猛反対を受け、機能ごとに漸進的に拡張することになった。
で、プロジェクト開始から半年、当初私が提案した形にしないと全体がうまく動かないんじゃないか? 的な雰囲気になりつつも、絶対にそれを認めないという嫌な感じで、かなりうんざりした状態になってしまっている。
とにかく、ある部分をクローズアップしてみれば、「メッセージドリブン」とか「マイクロサービス 」とか「DI」とか、ちょっと前に流行ったテクニカルワードっぽい、Webページで「やってみた」みたいに紹介されている見たことがあるような実装っぽくなっているのだが、そもそもそれ使うならこれはしないとか、そういうのとは組み合わせないとか、全体を俯瞰するとてんでちぐはぐなことになっている。全体がイベントドリブンの非同期処理だったはずなのに、安易にサーバにステータスを積み上げていって、とうとうサービス全体で細かく排他処理しなきゃならなくなったり、マイクロサービスのはずなのに全サービス共通のAppBaseみたいなのがあるせいで、一箇所変更したら全マイクロサービスを毎回デプロイしなきゃならなくなったりとか。
とりあえず、Webで「やってみた」とか紹介されている表面的な部分を猿真似しても、所詮猿真似なのでうまくいかない。
特に、OJTでやってきた系の、派遣系Web厨をありがたがるのはやめた方がいいよ。
やっぱり、レンガ積みがそこそこできるからといって、家全体を設計して立てられるかというと、そんなことはないわけ。
ちょっと考えればわかりそうな話だけど、なぜわからないんだろう?
Webなどで紹介されている「アジャイルでやること」「スクラムでやること」「××でやること」のHowToをなぞるんじゃなく、アジャイルやスクラムで何を実現しようとしているかを考えて、そこから逆算してそれを実現するために必要な事前条件を整えて、その上で実現しようとしていることを実現するために必要なことを、そこで紹介されているあれやこれやを取捨選択して参考にしつつ、日々の開発を進めることが本当のアジャイルや、スクラムだろう、と思うわけだ。