まなソフトウェア  
ユーザの声  特定商取引に基づく表示  プライバシーポリシー  運営事業者
ソフト Q&A 登録ユーザ お問合せ 購入方法 コラム リンク
■はじめに 最初にお読みください

■Leaf.1 詳細設計書がほしい

■Leaf.2 設計前に創造力を発揮する
 Developer Leaf 〜理想のシステム開発を想う〜
■Leaf.2 設計前に創造力を発揮する
■開発フェーズで創造力を発揮
みなさんはシステム開発のどの段階で創造力を発揮していますか?たいていのシステム開発では開発フェーズで創造力を発揮しているのではないでしょうか?たとえば、設計書に「製品コードは入力必須で、数値のみ入力可とする。」と記述されていた場合、そこから先は開発担当者が各々の方法でコーディングしてプログラムを作りあげていくケースが多いと思われます。これは、開発フェーズで創造力を発揮していると言えます。

以下は、上記仕様に基づいて2人の開発者によって実際に作成されたコードです。
 タイプA
Private Sub Cmd_CheckTypeA_Click()
'*============================================================
'*○製品コードチェック
'*============================================================
   '■変数宣言===============================================
   '□一般
   Dim Str_SEI_CD As String '製品コード
  
   '■前処理=================================================
   '□初期化
   '入力値取得
   Str_SEI_CD = Txt_SEI_CD.Text

  '■主処理=================================================
   '□製品コードチェック
   '未入力チェック
   If (Str_SEI_CD = "") Then
     'エラー
     MsgBox "製品コードを入力してください"
   Else
     '数値チェック
     If (IsNumeric(Str_SEI_CD) = False) Then
       'エラー
       MsgBox "製品コードは数値で入力してください"
     End If
   End If
End Sub


 タイプB

Private Sub Cmd_CheckTypeB_Click()
'*============================================================
'*○製品コードチェック
'*============================================================
   '■変数宣言===============================================
   '□一般
   Dim Str_Err   As String 'エラーメッセージ(最初のエラー)
  
   '■前処理=================================================
   '□初期化
   'クリア
   Str_Err = ""

  '■主処理=================================================
   '□製品コードチェック
   '◆未入力チェック
   If (Str_Err = "") Then
     'チェック
     If (Txt_SEI_CD.Text = "") Then
       'エラー
       Str_Err = "製品コードを入力してください"
     End If
   End If
  
   '◆数値チェック
   If (Str_Err = "") Then
     'チェック
     If (IsNumeric(Txt_SEI_CD.Text) = False) Then
       'エラー
       Str_Err = "製品コードは数値で入力してください"
     End If
   End If
  
   '■後処理=================================================
   '□エラー判定
   If (Str_Err <> "") Then
     'エラーメッセージ
     MsgBox Str_Err
   End If
End Sub


プログラム経験のある方ならおわかりになると思いますが、タイプA、タイプBともに仕様を満たしており、どちらのタイプで作成しても、納品されたシステムには何の問題もありません。

しかし、私はここに大きな落とし穴があると考えます。上記のようにして作成されたプログラムは開発担当者のスキルに依存しているため品質のばらつきにつながり、また他にも弊害が生まれることになります。
 
■開発フェーズで創造力を発揮することの問題点
私の経験上、上記のような形で開発すると以下のような問題がおきることがありました。

◆品質にばらつきが出ることによる問題点
・システムの安定度やレスポンスが均一でなくなる
・類似のプログラムであっても、動作が異なることがある(チェックの順番やメッセージなど)
・全体的な仕様変更が発生した場合、プログラムごとにケースバイケースの対応が必要
・作成者本人にしかメンテナンスできないプログラムとなる

◆その他の問題点
・プログラム開発に時間がかかる(生産性が落ちる)
・同じ仕様に関して、複数の開発者が同様の試行錯誤をすることになる
・仕様書に書かれている内容を、プログラム(言語)で実現できないことがある
・プログラムの再利用性が低くなる
・高いスキルを持つ開発者が必要になる

これでは、安定したシステムを納品することは難しいですし、また開発コストも高くなってしまいます。
 
■設計前に創造力を発揮する
では、せっかくの創造力をどこで発揮すればよいのでしょうか?私が考える創造力の発揮タイミングは「設計前」です。設計フェーズに入る前に、システムを構成する部品やルールを準備しておくことが重要です。(ここでいう「システムを構成する部品」とは、ユーザインタフェース、入力チェック方法、データ更新方法などプログラムを形づくる上での単位機能を指します)

1.創造力を駆使してシステムに必要な単位機能の試作をおこなう。
2.試作した単位機能について設計者/開発者(新人からベテランまで全員)で意見交換をおこない、実現可否の判断や最良のロジックを検討する。
3.ここで採用された部品をシステム構成部品(雛型)とする
4.上記作業とあわせて、システム開発におけるルールを規定する(上記部品の使用法、設計書/プログラムの作成法など)

これらの準備が完了して、はじめて設計フェーズに移ります
 
■効果
設計前に創造力を発揮することによりどのような効果があるかを説明していきます。

◆設計フェーズでの効果
・実現不可能な仕様を記述することがなくなる
・機能的に統一感のある設計が可能となる

◆開発フェーズでの効果
・構成部品(雛型)のコピーが主な作業となるため、試行錯誤の時間が削減できる(生産性の向上)
・同じ仕様に関して、複数の開発者が同様に試行錯誤をすることがなくなる(全体でも生産性向上)
・システム全体にかかわる仕様変更が発生した場合、一定の手順でプログラム変更をおこなうことができる
・仕様書に書かれている内容を、プログラム(言語)で実現できないことがない

◆運用フェーズでの効果
・システム全体を通して安定した稼動が可能になる
・ユーザーインタフェースが統一されている

◆その他の効果
・作成した単位機能やルールは資産となり、次回からの開発で再利用することでさらにコスト削減できる
・作成者以外のメンバーがメンテナンスをおこなうことができる
・設計者(SE)と開発者(プログラマ)の間の意識統一ができる
・新人はベテランの技術を吸収でき、また新人ならではの斬新なアイデアが活用されるチャンスも生まれる
 
■まとめ 〜設計前に創造力を発揮する〜
このようなことから、私が開発をおこなう際には「設計前に創造力を発揮」し、それをベース(雛型)にして設計や開発をおこなっていくことを念頭においています。また、実際の作業の上で守るべきルールを定義して、それに基づいて開発を進めるようにしています。このようなシステム開発ができるようになれば、設計フェーズから運用フェーズにいたるまで、さまざまな効果をあげることができ、また次システム開発への大きな資産を残すことができるようになります。
 
■最後に
最後に、先ほどの仕様に対するシステム構成部品の検討を実際におこなってみましょう。

ここでは、仕様変更がおこることを想定し、タイプA/タイプBのコードについて対応シミュレーションをおこないます。仕様は「製品コードは入力必須で、数値のみ入力可とし、かつマスタに存在しなければエラーとする。エラーメッセージは(!)を表示、タイトルは"入力エラー"とする」に変更されたとします。

以下は、仕様変更に対応したコードです。(赤い部分が対応箇所です)
 タイプA

Private Sub Cmd_CheckTypeA_Click()
'*============================================================
'*○製品コードチェック
'*============================================================
   '■変数宣言===============================================
   '□一般
   Dim Str_SEI_CD As String '製品コード
  
   '■前処理=================================================
   '□初期化
   '入力値取得
   Str_SEI_CD = Txt_SEI_CD.Text

  '■主処理=================================================
   '□製品コードチェック
   '未入力チェック
   If (Str_SEI_CD = "") Then
     'エラー
     MsgBox "製品コードを入力してください", vbExclamation, "入力エラー"
   Else
     '数値チェック
     If (IsNumeric(Str_SEI_CD) = False) Then
       'エラー
       MsgBox "製品コードは数値で入力してください", vbExclamation, "入力エラー"
     Else
       'マスタチェック(共通関数でチェック)
       If (Fnc_ChkMst_SEI(Str_SEI_CD) = False) Then
         'エラー
         MsgBox "マスタにある製品コードを入力してください", vbExclamation, "入力エラー"
       End If

     End If
   End If
End Sub


 タイプB

Private Sub Cmd_CheckTypeB_Click()
'*============================================================
'*○製品コードチェック
'*============================================================
   '■変数宣言===============================================
   '□一般
   Dim Str_Err   As String 'エラーメッセージ(最初のエラー)
  
   '■前処理=================================================
   '□初期化
   'クリア
   Str_Err = ""

  '■主処理=================================================
   '□製品コードチェック
   '◆未入力チェック
   If (Str_Err = "") Then
     'チェック
     If (Txt_SEI_CD.Text = "") Then
       'エラー
       Str_Err = "製品コードを入力してください"
     End If
   End If
  
   '◆数値チェック
   If (Str_Err = "") Then
     'チェック
     If (IsNumeric(Txt_SEI_CD.Text) = False) Then
       'エラー
       Str_Err = "製品コードは数値で入力してください"
     End If
   End If
  
   '◆マスタチェック(共通関数でチェック)
   If (Str_Err = "") Then
     'チェック
     If (Fnc_ChkMst_SEI(Txt_SEI_CD.Text) = False) Then
       'エラー
       Str_Err = "マスタにある製品コードを入力してください"
     End If
   End If
  
   '■後処理=================================================
   '□エラー判定
   If (Str_Err <> "") Then
     'エラーメッセージ
     MsgBox Str_Err, vbExclamation, "入力エラー"
   End If
End Sub


ここまでの結果をもとに、タイプA/タイプBの特徴を洗い出してみました
タイプA タイプB
○ コードが短い × コードが長い
○ プロパティ参照が一箇所 × プロパティ参照が複数箇所
○ 実行速度が速い × 実行速度が遅い(エラーがあっても次ブロックの実行判定を通る)
× チェックが増えるとネストが増える ○ チェックが増えてもコードの挿入で対応可能
× チェックが減るとネスト構造の変更が必要 ○ チェックが減ってもブロックのコメントアウトで対応可能
× メッセージの表示法が変わると複数箇所変更が必要 ○ メッセージの表示法が変わっても一箇所変更でOK

これらの特徴について意見交換をおこない、最終的に以下のタイプCを作成し、コードチェックのベース(雛型)に決定しました。
 タイプC

Private Sub Cmd_CheckTypeC_Click()
'*============================================================
'*○製品コードチェック
'*============================================================
   '■変数宣言===============================================
   '□一般
   Dim Str_Err   As String 'エラーメッセージ(最初のエラー)
   Dim Str_SEI_CD As String '製品コード
  
   '■前処理=================================================
   '□初期化
   'クリア
   Str_Err = ""

  '入力値取得
   Str_SEI_CD = Txt_SEI_CD.Text

  '■主処理=================================================
   '□製品コードチェック
   '◆未入力チェック
   If (Str_Err = "") Then
     'チェック
     If (Str_SEI_CD = "") Then
       'エラー
       Str_Err = "製品コードを入力してください"
     End If
   End If
  
   '◆数値チェック
   If (Str_Err = "") Then
     'チェック
     If (IsNumeric(Str_SEI_CD) = False) Then
       'エラー
       Str_Err = "製品コードは数値で入力してください"
     End If
   End If
  
   '◆マスタチェック(共通関数でチェック)
   If (Str_Err = "") Then
     'チェック
     If (Fnc_ChkMst_SEI(Str_SEI_CD) = False) Then
       'エラー
       Str_Err = "マスタにある製品コードを入力してください"
     End If
   End If
  
   '■後処理=================================================
   '□エラー判定
   If (Str_Err <> "") Then
     'エラーメッセージ
     MsgBox Str_Err, vbExclamation, "入力エラー"
   End If
End Sub


今後の開発では「製品コードのチェック」に関し、設計者はこのようなロジックが実行されることを意識して仕様を作成し、またプログラマもこのロジックをコピーしてプログラムを作成していくようにします。

(補足)今回はコードのメンテナンス性を重視しました。コードの長さについてはベースとなる部品のコピーをおこなうことで生産性の問題を回避でき、また実行速度に関してもその差が微々たるものであったため問題なしとしました。)

 

▲ページの先頭へ▲
©2003 MANA software All Right Reserved.