Pythonなどの文法は理解したが、続けて作りたいものが作れない。どこから手をつけていいかよくわからない場合のプログラミングの進め方をまとめる(比較的真面目なやり方)。一般人の勘違い・認識違いというのは、プログラミング=コーディングと半ば無意識的に思い込んでいることである。実際には、コーディングは多くの作業の一部でしか無い。ここで最も重要なのは上流のステップであり、開発者サイドとしてはステップ2から3にかけてこそが重要である。ステップ1に関しては取り付く島もなく決定済の場合がある。
ステップ:
- 要求仕様をまとめる(顧客要求事項を確認する/要求定義/基本設計などとも呼ばれる)
- 設計方針を検討する(詳細設計/要件定義/内部設計などとも呼ばれる)
- アルゴリズムとデータ構造を設計・検討する
- コーディング
- テスト・デバッグ
- リリース(提出/送品)
1. 要求仕様をまとめる(要求定義)
詳細
ユーザー視点でどんなものが欲しいかを考える。ユーザーにどこまでやってもらい、システム(アプリケーション)でどこまでやるか。例えば、ある部品の寸法の平均値と標準偏差から正規分布のグラフの出力を求められたとする。この場合は下記の点のような要求が考えられる。
- 部品の測定はシステム側で行うものか/ユーザーが行うものか
- 平均値と標準偏差の入力はシステム側で行うものか/ユーザーが行うものか
あるいは入力されるのは生データか - システムに入力されるデータのボリュームはどれくらいか
- グラフの出力は画面への表示だけで良いか/画像として出力するか/エクセルなどで利用できる形にするか
その場合ファイルの保存先はシステム指定(固定)か/ユーザー指定(任意)か - CUIベースで良いか/GUIベースが良いか
- nativeアプリが良いか/webアプリが良いか
- etc…
2. 設計方針を検討する(詳細設計)
詳細
要求が分かったら、次はどのように実現するかを考える。つまり、関連技術のリサーチを行う。このステップでは、実際のコードまでは見ない。どうもこれを使えばできそうだ、程度の認識で調査は(ググるのは)やめておく。実例のコードが動作して実現可能性が高いかどうかは必要に応じて確認する。特に初学者の場合は動作確認が容易な場合には必須で挙動を確認しておく。例えば、前節の例では下記のような調査を行う。調査の詳細は省くが、概ね下記のような内容についてリサーチを行う。リサーチのアウトプットはどのようなレベルの技術があるかの確認と実現手法のバリエーションの確認である。ライブラリーを使えるのか、全て自作する必要があるのかを確認することは重要である。
- PCと計測器との連携を行うライブラリー(関数)は存在するか
ex) Pythonのserialライブラリー - 平均値・標準偏差を求めるライブラリーにはどのようなものがあるか
ex1) 数式を自作する
ex2) numpy
ex3) SciPy … - 平均値などの入力値はどのようにインプットするか
画面入力か/csvファイルに入力してもらうか
GUIライブラリー(フレームワークは何を使うか)/ファイル操作ライブラリーでどのようなことができるか
ex1) Kivy の InputTextタグでいけるか?
ex2) Qt Designerでもなんか作れそう? - グラフ化のライブラリーがあるか、それとも正規分布のグラフ化ライブラリーが専用であるか
ex1) matplotlib: import matplotlib.pyplot as plt
ex2) import pandas as pd でも行ける?? - グラフをウィンドウ表示するライブラリーはあるか、グラフを画像化するライブラリーはあるか
ex1) 画像化といえば pillowか
ex2) opencvでもいけるか
ex3) 実はウィンドウ表示だけなら、matplotlibで行けそう
ex4) ウィンドウ表示はKivyか?
ex5) GUIだけHTML/CSSかC#で作るか - 出力先指定時のパスを取得するライブラリーを確認(ファイル操作ライブラリー)
ex) os系のライブラリーはある。
3. アルゴリズムとデータ構造を設計・検討する
詳細
どのような手順で正規分布のグラフを出力するか- アイコン(.exe)をダブルクリックしてもらう。
- Kivy画面に部品名・寸法番号・平均値・標準偏差の入力欄を設けて入力待ち(InputText)を行う。
- 必須項目入力後、OKボタンのグレーアウトを解除する(4項目の入力イベントを監視)。
- 入力されたデータは部品名・寸法番号・平均値・標準偏差の順に配列の1行目から格納していく(np.arry)。
- OKボタン押下直後、同じ行の最後の要素として実行日時を記録しておく(datetime関数)。
- OKボタン押下確認(クリックイベントをキャッチした)後、計算。
- 自作の正規分布関数の引数として、入力されたデータを使う。
def f_N(mu, sigma, x)として定義する。 - x軸の分解能は10000として、標準偏差と同レベルの桁数の100分の1となるような分解能に設定する。
この設定値は出力されるグラフの滑らかさに影響する。
※ 標準偏差が小さい場合、平均値に確率が集中するため、ピーキーなグラフとなるので、特に細かい値でプロットしなければならない。
ex) 標準偏差が0.03の場合、(x,y) = (0.0001, f(0.0001)), (0.0002, f(0.0002)),…… - 上記のような点群(x,y)を1次元の配列x,配列yとして格納する。
- import matplotlib.pyplot as plt にて画面に出力する
- ユーザーは出力されたグラフを Shift + Win + S でキャプチャして使用する。
- グラフ作成に使用した点群データは、ユーザー指定の場所へ実行日時のフォルダを自動作成して保存する(datetime)。
4. コーディング
特筆すべき点はなし。
5. テスト・デバッグ
- 作成したプログラムの一連の挙動を見る。
- if文やループ文の境界条件で分岐するような条件を作り込んでそれぞれのコードが一連の動作を正常に終了するか確認する。
# コード if A == 0: print(r"境界条件") elif ( A < C): print(r"正常動作") elif A == C: print(r"境界条件") else: print(r"unexpected error! : variable={A}")
- ディレクトリ関係のバグを確認する。
どの「ディレクトリにおいても動作するか。 - (自然)言語関係のバグを確認する
どの文字・文字コードを入力してもアプリが落ちないか。