システム開発を成功させるアプローチをまとめてみた
「予定外の仕様変更とかお客さんと揉めたりとか…」
「何かうまくやる方法はないかなぁ…」
私も15年以上ITエンジニアをやってますが、システム開発ってホント大変ですよね。
予定通りに行かないことが多いので、心配が絶えません。なんとかしてリリースまでこぎつけるとホッとします。
全てがスムーズにいくとまではいかなくても、出来るだけうまくいくアプローチを取りたいところです。
そこで今回はシステム開発を成功させるアプローチまとめてみました。
Contents
1. 開発プロセスでトラブル回避!
なんといっても開発の進め方は重要です。大きく分けて2種類あります。
伝統的なウォーターフォールモデル
システムの要件全てを洗い出してから、基本設計 → 詳細設計 → 実装 → 単体テスト → 結合テスト → システムテスト → リリースするものです。
水が上流から下流に流れるように進むことからウォーターフォールモデルと言われています。
業務システム開発では多くの企業がこのやり方を採用しています。
アジャイルプロセスでリスク軽減
ウォーターフォールモデルがシステム全体をいっぺに作るのに対して、アジャイルプロセスでは、開発範囲を数回に分けて開発を進めます。例えば20個の機能があるシステムの場合、最初の開発(イテレーションと呼ぶ)で5個の機能を要件定義 → 基本設計 → …システムテストまで進めます。そこでシステムをリリースして使い始めても良いですし、全ての機能を作り終えてからリリースしてもかまいません。
開発範囲を狭めて何度もイテレーションを繰り返していくことで最終的に全ての機能を実装するというアプローチです。
なんでこんなやり方をするかと言うと、ウォーターフォールモデルのように初めからすべての機能を作ろうとすると、後工程になって前工程の間違いが分かって仕様変更が発生した場合に、手戻りが大きくなってしまうからです。開発範囲を絞った中で仕様変更が起きても、手戻りは比較的少なくて済みます。
アジャイルプロセスは自社サービス開発のプロジェクトでよく採用されています。
2. フレームワークで生産性と規律を上げる!
フレームワークとはソフトウェアの骨組みです。例えばWebアプリケーションを作ろうとした場合、あるURLにリクエストが来たら、このプログラムを動かすといったルーティング処理のようなお決まりの処理手順があります。これらの手順を簡単に実装する仕組みがフレームワークには用意されています。
そろぞれのプログラミング言語には有名なフレームワークがあります。
- Ruby → Ruby on rails、Sinatra、Padrino
- Java → Spring Framework、Struts、JSF、Wicket、Tapestry
- PHP → Symfony、Laravel、CakePHP、CodeIgniter、ZendFramework(言語はPHP)
フレームワークを使うと、
- お決まりの処理をフレームワークがやってくれる
- フレームワークの流儀に沿った規律あるプログラム構成で開発できる
などの利点があります。
3. 自動テストで品質とテスト効率を上げる!
システム開発のトラブルは大きく分けると2つあります。
- 顧客の要求と予算・期間が合わない
- 開発したソフトウェアの品質の低さ
1は顧客とのコミュニケーションの問題です。前述した通り、アジャイルプロセスを採用することで一度に行う開発範囲を狭めることで、顧客の要求のぶれを小さくできます。
2はテストの問題です。テストの質を上げれば、ソフトウェアの品質を上げることが出来ます。
テストの品質を上げる方法の一つとして自動テストがあります。
自動テスト = プログラムをテストするプログラムを作ること
テストは通常、人の手で行われます。実際のそのシステムが使用されるのと同じように操作して、正しく動くことを確認します。
テストが終わった後に仕様変更があってプログラムを改修したらまた同じテストをしなければなりません。何度もやるのは面倒だからと省いてしまうと、バグが取り残されてリリース後に発見されるなんてことになりかねません。
そこで、プログラムをテストするプログラムを作成し、プログラムにプログラムの正しさを確認させます。
JavaではJUnitというテスティングフレームワークを使うと簡単にテストをするプログラムを書くことが出来ます。
//テスト対象プログラム public class Calc { public static boolean add(int num1, int num2) { return num1 + num2; } }
↑これが納品するプログラムだとして、これをテストするプログラムが↓です。
//プログラムをテストするプログラム import junit.framework.TestCase; public class CalcTest extends TestCase { public void testAdd() { //テスト対象メソッドを実行する int result = Calc.add(2, 4); //戻り値が6であることを確認する。6じゃない場合、テスト失敗と判定される assertEquals(6, result); } }
一度テスト用のプログラムを作ってしまえば、プログラムを実行するだけで何度でも繰り返しテストを一瞬で行えるようになります。
提案が通らない場合は?
この記事で紹介したアプローチを取れば、システム開発を以前よりもずっとスムーズに進めることができるはずですが、このような取り組みを提案しても通らない場合があります。
「今までと同じでいいよ。」
「そんなことやって失敗したらどうするの?責任とれるの?」
こんなことを言われた経験があるのではないでしょうか?私も何度も言われました。
そこで、私はきれいさっぱり、転職しました!
転職してみて分かったのは、自分に合った良い会社は存在するということです。もっと早く決断すればよかったなと思っています。