「システム開発ってそもそも何をするの?」
僕が新卒で入社したシステム開発会社の入社初日に思ったことです。
当時大学を卒業して間もない僕は、エンジニアとして入社したものの、恥ずかしながらシステム開発では具体的に何をしているかよく分かっていませんでした。
ですがそれから5年ほどエンジニアとしてキャリアを積む中で
- 数十万円規模の小規模なシステム
- 数億円単位の大規模システム
- ウォーターフォール開発からアジャイル開発
- リリースが2年遅れの炎上案件
など、一通りのシステム開発の手法、プロジェクトを経験してきました。
そんな中で気づいたことが一つあります。
それは、
「システム開発は全体像を把握すれば上手くいく」
ということです。
システム開発には大きく分けて2つの手法があります。
「ウォールフォール開発」と「アジャイル開発」の2つです。
この2つがそれぞれどんなプロセスを経て開発を進めているか、いつまでに何が出来上がってくるかを把握していればプロジェクトは上手く回ります。
炎上する案件は大抵、プロジェクトマネージャーまたはクライアントがプロジェクトの全体像を理解していません。
6ヶ月後に納品のプロジェクトの設計フェーズが5ヶ月後に終わったり、要件定義を延々と続け、納期前にそのしわ寄せがエンジニアに来たり、全体像を把握しないまま進んだプロジェクトは大抵炎上します。
そこで、ここでは
- 初めてシステム開発を外注するor管理する人
- プロジェクトマネージャーになったばかりの人
- システム開発の経験の浅いエンジニア
を対象にシステム開発の全行程をご紹介します。
これらの開発工程をしっかりと把握し、何をいつまでにやらないといけないか、を把握することでプロジェクトの成功率は飛躍的にアップするでしょう。
ぜひこれらを知って、炎上しない平和なシステム開発を実現してください。
1. システム開発にはウォーターフォール型開発とアジャイル型開発がある
システム開発のメジャーな手法は大きく分けて「ウォーターフォール型開発」と「アジャイル型開発」の2つがあります。
※「アジャイル型開発」は厳密には更に細かく手法が分かれますが、ここでは最も主流な「スクラム開発」=「アジャイル開発」としてご説明します。
1-1. ウォーターフォール型開発とは
ウォーターフォール型開発とは「要件を決めるステップ」「実装のステップ」「テストのステップ」など開発を複数のステップにわけ、それらを上から順に作業していく手法です。
ガントチャートという管理表用いて、各ステップの工程を洗い出し、メンバーをアサインしていきます。
やるべきことが明確なため、進捗の管理がしやすいのが特徴です。
原則ステップが逆戻りすることはりません。例えば実装後に要件を決め直す、といったことはありません。
そのため、手戻りや想定外の事象が起きた場合に上のステップからやり直しになるため、手戻りによるコストが大きくなるというデメリットがあります。
メリット
各ステップが明確なため、プロジェクトを管理しやすい
デメリット
手戻りが発生したときのコストが大きい
こんなプロジェクトでウォールフォール開発が用いられる
- 納期や予算がシビアに決められている案件
- 要件が明確な既存のシステムのリプレイス(作り直し)案件
など
1-2. アジャイル型開発(スクラム開発)とは
アジャイル型開発とはスプリントと呼ばれる1~4週間程度の間隔で開発期間を分割し、
各スプリント内で少しずつ機能を積み重ねていきます。
スプリントを重ねることで、システムの方向性を微調整しながら理想のシステムに近づけていく手法です。
開発を進めながらシステムの方向性を微調整していくため、手戻りのリスクが少ないのが特徴です。
手戻りによる無駄なコストを抑え、低コスト、短納期で理想のシステムを目指すための手法です。
主にtoC系のWebサービス開発などでは主流の開発手法です。
メリット
少しずつ機能を追加していくため、開発の途中で手戻りが発生しても影響が少ない
デメリット
この予算でこの機能まで出来上がる、という明確な指標がないため、
数カ月後にどのような機能がある状態かを把握するのが難しい
こんなプロジェクトでアジャイル開発が用いられる
- 納期や予算を調整可能な決済権がある案件
- 要件が不明瞭で少しずつユーザーの反応を見ながら作り込んでいく案件(主にtoC系Webサービス)
など
2. ウォーターフォール型開発の全行程と各工程のポイント
ウォーターフォール型開発には次の工程があります。
①要件定義
②外部設計
③内部設計
④プログラミング
⑤単体テスト
⑥結合テスト
⑦システムテスト
⑧運用テスト
⑨システム移行
⑩運用・保守
これの開発を理解することで、何がいつまでにどのような状態になっていなければを理解することができます。
以下では例として
開発予算:500万円
開発期間:3ヶ月
成果物:Androidアプリをストアに公開
というスマホアプリ開発の場合を例に説明していきます。
上記の開発をウォーターフォール型開発で進めるとこのような感じのスケジュール感になります。
それぞれの工程を詳細に解説していきますので、1つずつ確認していきましょう。
2-1. 要件定義(2週間〜1ヶ月)
要件定義では「何を満たすシステムか」を定義し、それに伴う技術やセキュリティの項目を定義する工程です。
具体的には決めるのは次の通りです。
- プロジェクトの体制(ディレクターはAさん、エンジニアはBさんなど)
- スケジュール、納期(10月末までにリリースなど)
- 納品物(設計書は必要か、ソースコード納品で完了か、サイト公開で完了か、など)
- 機能要件(ログイン機能やPUSH通知など、機能実装する機能の洗い出し)
- 非機能要件(パフォーマンスやセキュリティレベルなど)
- 技術要件(使用するプログラミング言語やサーバのOSなど)
2-2. 外部設計(2週間〜1ヶ月)
外部設計は主に画面のデザインやインターフェースを確定する工程です。
ここでは画面遷移図や、各画面の表示項目一覧を作成し、必要な機能を洗い出します。
2-3. 内部設計(2週間〜1ヶ月、開発側のみの作業)
内部設計は主に目に見えないプログラミング実装の設計を行います。
この工程は基本的には開発側が行うため、発注者側で行う作業は特にありません。
2-4. プログラミング(1~2ヶ月、開発側のみの作業)
ここではJavaやRubyなどのプログラミング言語を用いてソースコードを書いていきます。
この工程は基本的には開発ベンダーが行うため、発注者側で行う作業は特にありません。
2-5. 単体テスト(2〜1ヶ月、開発側のみの作業)
実装された機能単位でテストを行います。
例えば、お問い合わせ画面の機能であれば、お問い合わせ機能だけのテストを行います。
お問い合わせから管理画面でお問い合わせの内容が表示されること、といったテストは次の結合テストで実施します。
2-6. 結合テスト(2週間、開発側のみの作業)
結合テストでは機能同士の一連の動作のフローでテストをおないます。
例えば、お問い合わせから管理画面でお問い合わせの内容が表示される、といったテストを行います。
2-7. システムテスト(1週間、開発側のみの作業)
システムテスト段階では、本番環境に近い状態ですべての機能の動作が正常であることをテストします。
例えば、毎日10時に動く処理は正常に動作するか、仕様書通りに動作するか、といったテストを行います。
2-8. 運用テスト (1週間)
開発者側のテストが一通り完了すると、最終的に発注者がシステムを本番環境で実際に動作を確認刷るテストを行います。
ここでは実際の本番環境でシステムが正常に動作することを確認します。
2-9. システム移行(1日)
この工程ではいよいよシステムを本番稼働させることになります。toC系のサービスであれば一般公開されることになります。
Androidアプリの場合はGoogle Play Store、iOSアプリの場合はApple Storeに公開します。
2-10. 運用・保守
システムをリリースが動作に問題ないか等を監視する工程です。
契約の内容によっては保守は発注者自身が行う場合もあります。
3. アジャイル型開発の全行程と各工程のポイント
アジャイル型開発には次の工程があります。
①リリース計画
②スプリント ※複数セット
ここでは以下の
開発予算:500万円
開発期間:3ヶ月
成果物:Androidアプリをストアに公開
というスマホアプリ開発の場合を例に説明していきます。
上記の開発をアジャイル型開発で進めるとこのような感じのスケジュール感になります。
アジャイル開発の考え方は少し難しいですが、1つ1つ丁寧に説明していきますね。
3-1. リリースプランニング(2週間)
この工程ではやることは以下の通りです。
- プロジェクトの体制(プロダクトオーナーはAさん、エンジニアはBさんなど)
- システムの目指す方向性(20代女性をターゲットにしたグルメ情報を発信するAndroidアプリなど)
- システムに必要な機能の一覧(ログイン機能、一覧機能、検索機能など)
- システム開発の優先順位付け(最優先は一覧機能など)
アジャイルは計画が変わることを前提としているため、あとから機能が追加される、または機能が削られることになっても問題ありません。
この段階で洗い出されたタスクの一覧をプロダクトバックログと言います。
横文字で難しく感じますが、簡単に言うと「やることリスト」です。
実際の開発現場で「プロダクトバックログ」や「バックログ」という単語が出てきた場合は
「あれは『やることリスト』のことを言ってるんだな」
と解釈して問題ありません。
3-2. スプリント(2週間×5セット)
この工程ではプロダクトバックログ(やることリスト)の中から1~4週間の開発期間(スプリントと呼ばれる)の中で作る機能を定めます。※見出しの例は2週間を1スプリントと設定しています
スプリントは更に次の工程に分割することができます。
- スプリント計画(スプリントプランニング)
- 設計〜プログラミング〜テスト
- ふり返り(スプリントレビュー)
- 朝会(デイリースクラム)※毎日行う
スプリント計画(スプリントプランニング)
この工程ではスプリントバックログで設定された機能の中から今回のスプリントで開発を行う機能を定めます。
ここで洗い出された機能の一覧をスプリントバックログと言います。
スプリントバックログは簡単に言うと「そのスプリントの中で行うやることリスト」です。
スプリント内に機能をリリースするところまでが作業内容になります。
設計〜プログラミング〜テスト
スプリント計画で設定された機能を開発していきます。
この工程では設計からプログラミング、テストまですべてを行います。
ふり返り(スプリントレビュー)
イテレーションが終わると、必ずスプリント内での課題を振り返ります。
もし機能の実装に想定外に時間がかかった場合などは、今後のタスクの見積もり基準を修正したり、リリースされたプロダクトの方向性を確認してきます。
1つのスプリントが終わると、また次のスプリント計画に移り、そのスプリントが終わると、また次のスプリント計画を行い、というように継続的にシステム開発を続けていくのがアジャイル開発の手法です。
朝会(デイリースクラム)※毎日行う
日本では朝会と呼ばれることが多いです。この朝会ではメンバーの進捗状況などをチーム内に周知します。
朝会は毎朝10分程度の時間で行われ、メンバー間のコミュニケーションと状況理解を促します。
まとめ
いかがでしたか?
最後にもう一度ポイントを振り返りましょう。
・ウォーターフォール型開発とは
ウォーターフォール型開発とは「要件を決めるステップ」「実装のステップ」「テストのステップ」など開発を複数のステップにわけ、それらを上から順に作業していく手法。
メリット
各ステップが明確なため、プロジェクトを管理しやすい
デメリット
手戻りが発生したときのコストが大きい
こんなプロジェクトでウォールフォール開発が用いられる
- 納期や予算がシビアに決められている案件
- 要件が明確な既存のシステムのリプレイス(作り直し)案件
など
アジャイル型開発とは
アジャイル型開発とはスプリントと呼ばれる1~4週間程度の間隔で開発期間を分割し、各スプリント内で少しずつ機能を積み重ねていきます。
スプリントを重ねることで、システムの方向性を微調整しながら理想のシステムに近づけていく手法。
メリット
少しずつ機能を追加していくため、開発の途中で手戻りが発生しても影響が少ない
デメリット
この予算でこの機能まで出来上がる、という明確な指標がないため、
数カ月後にどのような機能がある状態かを把握するのが難しい。
こんなプロジェクトでアジャイル開発が用いられる
- 納期や予算を調整可能な決済権がある案件
- 要件が不明瞭で少しずつユーザーの反応を見ながら作り込んでいく案件(主にtoC系Webサービス)
など
ウォールフォール型開発の全行程
①要件定義
②外部設計
③内部設計
④プログラミング
⑤単体テスト
⑥結合テスト
⑦システムテスト
⑧運用テスト
⑨システム移行
⑩運用・保守
アジャイル型開発の全行程
①リリース計画
②スプリント ※複数セット
プロジェクトの全体像を把握し、何をいつまでにやるかを意識して進めることでプロジェクトの成功率は格段にアップします。
ぜひシステム開発の工程を理解し、より良いシステム開発になるよう願っております。
コメント