ソフトウェアは段階的に開発しよう!

この記事は、SLP KBIT Advent Calendar 2015 - Adventarの11日目の記事です。

今回は、ソフトウェア開発の流れについて学んでいきましょう。
なお、プログラミング初心者を対象に執筆しています。
※一介の情報系大学生が書いたものなので、この記事の内容を鵜呑みにするのはおすすめしません。ぜひ自分でも調べてみてください。

ソフトウェア開発の手順

突然ですが、以下のプログラムをつくることを考えてみてください。

  • 3つの整数値を読み込み、最大値を計算して表示する

・・・簡単ですね。おそらくみなさんは、迷わずにエディタを立ち上げ、いきなりプログラムを記述し始めたことと思います。
しかし、世の多くのソフトウェアのプログラムは、この何倍も難しいです。そのようなものを開発するのに、上記のような手法が果たして通用するでしょうか?

実際には、ソフトウェア開発は以下の手順で行っていくのが定石です。

  1. 要求分析
  2. 設計
  3. 実装
  4. テスト・検証
  5. 運用・保守

今回は「人間vs人間のリバーシプログラム」を例に、この手順を説明していきましょう。(以下、C言語の用語を使っていきます)

1.要求分析

要求分析とは、「作りたいソフトウェアがどのようなものなのかを明確化する作業」のことをいいます。今回は、「リバーシのルールを決めること」に相当します。このルールによって「リバーシとはなんなのか」が決まりますよね。リバーシのルールは以下の通りです。

  1. 8×8の盤上の中央4マスに、4個の石を置いておく(左上・右下が白、右上・左下が黒)。
  2. 両者は交互に黒石、白石を打っていく。
  3. 石を打つ時、縦・横・斜め方向に相手色の石を自色で挟み、その石を自色に返す。
  4. 相手の石を返すことができないマスに石を打つことはできない。
  5. 石を置ける場所がなければ、パスをする。
  6. 石を置ける場所があれば、パスはできない。
  7. 両者とも石を置ける場所がなくなれば、ゲームを終了する。
  8. ゲーム終了時の両者の石の個数で勝敗を決める。

この作業によって、「どのようにプログラムを作っていけばいいか」が見えてきたでしょうか。

2.設計

次は、要求分析によって見えてきた「処理の流れ・実装すべき機能」を紙に書いていきます。この作業を「設計」といい、書かれた紙を「設計書」といいます。「設計書を見れば、誰でも同じソフトウェアを作れる」設計書を作成するのが理想的です。
まず、処理の流れとしては、以下のように設計できるでしょう。

1. 盤面の初期化
2. ゲーム進行(ループ)
2-1.盤面の表示
2-2.ゲームの終了判断(終了条件に合うならばループを抜ける)
2-3.打ち手の入力
2-4.盤面の更新
2-5.プレイヤーの交代(その後2-1へ戻る)
3.両者の石の個数を数える
4.ゲーム終了

これで処理の流れ、つまりプログラムの流れが設計できました。
次に、実装すべき機能(関数)を列挙していきましょう。

  • オセロゲームを1回行う
  • 盤面の初期化
  • 盤面の表示
  • 全てのマスについて、合法的な手があるか調べる
  • 打ち手の入力
  • 打ち手の合法性を確かめる
  • 石を置いて、挟んだ石を裏返す
  • 挟んだ石の数を返す
  • 両プレイヤーの石の個数を数える

これでプログラム全体の大まかな設計ができました。

3.実装

次は、作成した設計書に基づいて実際にプログラムを組んでいきます。この作業を「実装」といいます。今回は、サンプルコードの掲載は割愛します。設計書を見ながら頑張って実装してみてください。

4.テスト・検証

さあ、リバーシゲームが完成しました!めでたしめでたし・・・
いえいえ、まだ終わりじゃありませんよ。
例えば、今回作成したリバーシゲームを世に売り出すとしましょう。ところが、このプログラムには致命的な欠陥がありました。「合法的な位置に置いていけば処理は滞りなく進行する。が、5文字以上の入力があるとプログラムの動作が停止してしまう」というものです。この状態で世に送り出したら・・・大変なことになってしまいますよね。
そういった欠陥・バグを見つけ、改善する作業のことを「テスト・検証」といいます。今回の例では、実際に5文字以上の入力を行うことによって上記の欠陥を見つけることができますね。実際には、どのような欠陥があるかは分からないことが多いです。そのため、「(不正なものも含めて)考えられる様々な入力を行ってみる」など、テスト・検証には多くの手段が考えられます。「バグがなくなった!」といえるようになって、初めて世に送り出せるのです。

運用・保守

さて、バグも改善したし今度こそ終わり・・・
ではありません。もう少しだけ付き合ってくださいね。
作成したリバーシゲームを友達にさせてみたとします。すると、その友達から「自分の名前をプレイヤー名として設定したい」という要望がありました。そこで、あなたはその要望の通りにプログラムを修正しました。
このように、必要に応じてソフトウェアの修正や変更を行うことを「運用・保守」といいます。例えば、オンラインゲームではユーザーからの要望に応じて、修正や変更が頻繁に行われていますよね。つまり、実際のソフトウェア開発の現場では、「ソフトウェアが完成したから、ハイ終わり!」ではないのです。

終わりに

今回の記事で、いかにソフトウェア開発が大変か、少しは伝わったかなと思います。そして、みなさんがソフトウェア(プログラム)を作る時に、いきなり実装に入るのではなく、この記事のことを思い出して「まずは要求分析だ!」と思ってくれれば幸いです。