どうもこんにちは。
今回は、アジャイル開発の勉強をしている中で興味深いお話があったので紹介します。
読んでいる本はこちらです。
一般的な感覚
一般的に、
質を高めるためにはスピードを下げる
もしくは
スピードを上げるためには質を下げる
という感覚を持っていると思います。
確かに、大学の受験勉強をしている中で「質の良い勉強をするには時間かかるよ...」と何度思ったことか。でも頭の良い人って「効率良く質の良い勉強」をしているんですよね。もしかして、「アジャイル開発も同じでは?」と思いました。
スピードが質を高める
アジャイル開発において、スピードとは「リリースの頻度」です。つまり、「リリースの頻度を増やすことでシステムの質を高めることができる」ということです。
書籍で説明されていた例を用いて説明します。
以下のような二つのチームがあるとします。
チームA | チームB | |
---|---|---|
リリース頻度 | 4週間に1回 | 1週間に1回 |
前回リリースからの差分 | 大きい | 小さい |
テストの対象範囲 | 広い | 狭い |
影響範囲 | 大きい | 小さい |
手戻り発生リスク | 大きい | 小さい |
リリース頻度は4週間に1回のチームAは、一度のリリースに含まれる変更点が大きいため、テストの対象範囲が広くなります。このテストで不具合が発生してしまったら、4週間分の開発したものが全て切り戻されることになります。
一方で、リリース頻度は1週間に1回のチームBは、一度のリリースに含まれる変更点が小さいため、テストの対象範囲が狭くなります。そのため、不具合が発生するリスクは小さくなり、仮に切り戻しが発生する場合でも1週間分の開発分のみを切り戻せば良くなります。
上記の比較からわかるように、スピードが上がったことで、質も安定することになります。
質がスピードを高める
先ほどまでは、「スピードが質を高める」というお話でしたが、逆に「質がスピードを高める」という観点から説明します。
高い頻度でリリースを行うためには、以下が必要です。
- シンプルな設計を保つこと
- テストが行われていること
- 可読性の高いコードになっていること
シンプルな設計は難しいけど、開発者にとっては非常にありがたい
システムがシンプルな設計であることで、開発者はよりコーディングやデバッグを行うことができます。(シンプルな設計で多くの要件を満たすシステムを開発するには、優れた設計者が必要です。)つまり、シンプルな設計であることで、高スピードで開発を行うことができます。
テストが行われていることで質を上げる
次にテストについてです。ここでのテストは、RailsのRSpecやPythonのPytestなどの自動単体テスト、結合試験、総合試験などを含みますが、特に自動単体テストの部分がコードの質を高めると言っても良いと思っています。自動単体テストの質が高ければ、今後のバグの確率も下げることができます。また、プログラミング言語やフレームワークのバージョンアップを行う際にも修正すべきコードを見つけやすくなるため、あらゆる箇所で質の高いコーディング・開発を行うことができます。
なんだかんだで可読性の高いコードは重要!
最後に可読性の高いコードになっていることです。アジャイル開発において、ソースコードはコードを書いた人のものではなく、チームのものです。そのため、チームの開発者がコードを読んで容易に理解できるコードである必要があります。また、可読性の高いコードであることで、バグが発生する確率を下げることもできます。
上記3点を満たすことで、アジャイル開発の質を高め、スピードを向上させることができます。
リリース頻度を上げる時の問題
「リリース頻度を上げることで質を高めることができる」とお伝えしましたが、もちろん問題もあります。それは「要件定義・決定のための対話、設計、実装、テスト」などをそのスプリント内で回す必要があります。
リリース頻度を上げることで範囲は狭くなりますが、その分それぞれの作業が細かくなり、開発フローは慌ただしいものとなリます。
1スプリント内の作業が追いつかなくなることこそ本末転倒となってしまうので、「どのようにスプリントを回していくか」はもちろん、「スプリントが回らなくなってきたらどのように対応していくか」まで、チームで対話して決めておく必要があります。
各スプリントの中で作成物レビューを行うべし
何か新しい機能を開発する際に、短いスプリントを効果的に活かすためには「各スプリントの中で作成物レビュー」を行いフィードバックをもらうことが必要です。
1週間スプリントで開発・リリースを進めていっても、1ヶ月に1回のレビュー・フィードバックだと、開発し直しのリスクが高まります。これでは、せっかく短いスプリントで開発をしているのに効果が半減してしまいます。
一方で、各スプリントに対してレビュー・フィードバックの機会を設けても、システムが動いていない状態ではレビューやフィードバックのしようがありません。そのため、各スプリントで開発するものは最低限動かすことができるものでないといけません。
まとめ
今回は、アジャイル開発における「質」と「スピード」の両立やその問題についてまとめました。
お役に立てたら幸いです。