roy > naoya > 基礎プログラミングII > (9)自由課題実施期間[1]

(9) 自由課題実施期間[1]

[0]本日の作業について(まとめ)

  • 作業内容の説明
    1. 自己紹介、リーダーと書記の決定
    2. グループ名の決定
    3. エントリー部門とプログラム案の検討
    4. 既存のプログラムやサービスとの差別化
    5. 作業の洗い出しと担当者の決定

注意点

  • グループごとにs4の「基礎プログラミングII」に掲示板を作成し、上記5項目について記載し、相互に確認できるようにする。
  • お互いに連絡を取り合うことができるようにするため、連絡先を交換しておく。
  • Webページ(授業用ページ)やs4の掲示板(メモ代わり)を画面共有しながらディスカッションを進めるとよい。
  • 作成するプログラムが既存のサービスのパクリや劣化コピーにならないよう、似たようなサービスを探した上で、差別化を図ることが大切

[1]自由製作課題について

これまでは一人で限られた時間の中でプログラムを作成してきたため、規模の大きなものを作成することが難しかった。1年間続いたRubyの授業もそろそろ終わりを迎えようとしている。そこで、1年間の集大成として、これまで学んだ技術を駆使してグループで規模の大きいログラムを作ってみよう。

作成条件は以下の通りとする。

作成するもの

  1. プログラム(必ず2つ以上作成すること)
    • 理由(1):プログラムが1つだと得意な人が任されることになり、作業量の偏りが生じやすい
    • 理由(2):プログラムが1つだとグループ内の得意な人1~2名の力量により結果が決まってしまう
    • 理由(3):プログラムが1つだと複数の案が出た時に却下される案が多くなる
    • 理由(4):今年は例年と比べて受講生のレベルが高いので2つくらい作れそう
  2. Webページ(プログラムの説明書やプログラム本体を掲載)
  3. プレゼンテーションファイル(発表時に使用)
  4. ポスター(合同成果発表会で使用)
  5. レジュメ(合同成果発表会で使用)

ポスターとレジュメの例を示す。

ポスター post.pdf usagi.pdf

レジュメ tubuan48.pdf 2g5k.pdf

レジュメはプログラムのセールスポイントを必ず書くこと。

自由課題グループわけ

これまでに獲得をした得点に基づき、各グループの戦力が同程度になるように調整している。発表時間は交代時間を含めて10分とする。

123
須藤 拓馬
大森 颯真
進藤 朱希也
須藤 誠真
天童 大将
佐藤 梨矩
佐藤 翔斗
佐々木 海星
桝村 美結
丸山 正太郎
井上 稚菜
酒井 章吾
菅原 綾乃
菅生 琢斗
吉藤 瑠星
456
竹田 雪乃
清原 永遠
伊藤 翔太
坂内 仁美
丸田 ゆき
本山 颯人
石井 塁
小林 碧
庄司 斐
布施 秀人
山下 紗枝

題材設定

後期グループ課題は諸君の実力を公(おおやけ)にアピールできるよう公開しやすい題材を選ぶ形式とする。以下の各部門から好きなものを選んで課題作成する。

  • 地域活性部門

    何か地域を盛り上げる助けになるもの

  • 福祉部門

    不自由を克服する人を支援するものなど

  • 役立ち情報部門

    知りたい人にとってしっかり役立つ情報を提供するもの

  • シミュレーション部門

    実世界でのできごとを計算機上で仮想的に実験するもの

  • 教育部門

    何かを学習する人の強力な助けになるもの

  • ビジュアル部門

    効果的な視覚情報を多数用意した凝った作りのもの

  • エンターテイメント部門

    大人から子供まで幅広く楽しめるもの

他チームの作品を評価するときに、その作品がエントリした部門のテーマに則しているかも大きく加味する。

前期同様の投票を行ない、上位2チームには合同発表会でのクラス代表発表をしてもらう。

過去の自由製作課題

参考までに過去の自由製作課題の例を示す。

作成が望ましくないプログラム

以下のプログラムは作成を避けるか、作成に当たりユーザが実施したいと思うような工夫を相当に考える必要がある。

  • 占い:乱数で結果を出すだけなので求められる技術レベルが低く、1年間学んだ集大成のプログラムとしては達成感に欠ける
  • 心理テスト:学術的に信頼性や妥当性が確認されている心理検査は著作権の問題があり、自由に利用することができない。適当に作った心理テストは根拠がないので面白みに欠ける
  • クイズ:取り扱うジャンルや問題数が豊富であれば実施したいと思うが、いずれかが不足していると実行してもらえない傾向にある

[2]今後の予定

本日の後半より自由製作課題を実施する。5~6人のグループで規模の大きなプログラムを作成する。以降の予定は以下の通りである。

  • 9回目
    • 自由課題グループ分け
    • 楽しいプログラムを作るためのテクニック
    • グループ名の決定
    • 役割分担の決定
    • 作成するプログラムの検討
  • 10回目
    • プログラムの作成開始
    • Webページの作成開始
    • プレゼンテーションファイルの作成開始
    • 発表の流れの検討
  • 11回目
    • trr
    • プログラムの完成
    • Webページの完成
    • プレゼンテーションファイルの完成
  • 12回目
    • 自由課題発表会(授業内)
  • 13回目
    • 自由課題発表会(全クラス合同)

[3] プロジェクトマネジメント

プロジェクトとは

限られた予算の中で1回限りで行われる、目標に対して成果の求められる作業をさす。人材育成強化科目にある「プロジェクト型応用演習」もプロジェクトに位置付けられる。

プロジェクトの制約条件は対象範囲(スコープ)、納期(タイム)、予算(コスト)の3つ。やるべきこと(スコープ)が決まっていなければ、効率的に作業ができないし、成果物が仕上がっても納期の遅れや予算の超過があれば、プロジェクトとしては失敗になる。これら3つの条件をバランスよく満たしていく必要がある。

ここでは、プロジェクトマネジメントの要素である「スコープマネジメント」と「タイムマネジメント」を取り上げ、限られた期間で最大限のパフォーマンスを発揮する方法を考える。

スコープマネジメント

スコープ=範囲である。成果物として何を仕上げればよいのかを明確にしたものがスコープであり、成果物を仕上げるために必要な作業を明確に定義することがスコープマネジメントとなる。

今回の成果物は「プログラム」「Webページ」「プレゼンテーション」である。ただ、プログラムとはいっても実際にはもっと細かく分類することができる。例えば温泉検索プログラムであれば、以下のような分割が可能である。

  • プログラムの構想(誰に対して何を提供することで、何の解決を目指すのか。例えば、本学学生に対して大学を起点として1時間以内で行くことができる温泉に関する情報を提供することで、日々の疲れを癒してもらう)
  • 要件の定義(実行した時に何ができるプログラムなのかを明確に定める。例えば、大学から1時間以内に行くことができる温泉23か所について、住所と交通アクセス、距離、温泉までの諸省時間、温泉の写真、泉質、効能、料金、おすすめポイントを表示するプログラムを作る。これを受けて収集する情報等を定義する)
  • 温泉に関する情報収集
  • プログラムのコーディング
  • テスト(ホワイトボックス、ブラックボックステスト)
  • デモ版のプログラム(必要であれば)(育成ゲームのように結果がランダムに決まるものは、仕込みのプログラムを作っておくと説明しやすい)

Webページやプレゼンテーションについても、それぞれ作成する上でやらなければならないことを明確にする。これ以上分割できないところまで分割したそれぞれの作業をワークパッケージと呼ぶ。スコープマネジメントではワークパッケージの作成を通して、作業の洗い出しを行っていく。

タイムマネジメント

スコープマネジメントにより、作業の洗い出しができたら、それぞれの業務を誰がいつまでに行うかを定めなければならない。作業の順番も考える必要がある。特定の人に作業が集中しないようにするために、ガントチャートを作成するとよい。

ガントチャートの例

ガントチャートは具体的な作業内容を縦軸に、横軸に日付を入れて、各作業をどのようなスケジュールで実施するのかを図示したものである。このスケジュールに遅れないように作業を進めていこう。また、ガントチャートを作成することで、特定の学生に作業が集中していないかを確認することができる。

グループ単位での課題の進め方

次週までの担当を明確にして授業外は各自で作業
役割分担を明確にした上で、各自で作業をして次週までに実施して結果を持ち寄る。特定の人に作業を丸投げにして何もしない人が出ることが多いやり方であり、各自の作業を作業量を考慮した上で適切に設定できるかどうかが、後で不満が生じないためのポイントになる。
情報教室に集まって作業をする
次週以降は情報教室が自由に使える(可能性がある)。メンバーの時間を調整し、全員で集まって作業を行う。用事があって集まれない人がフリーライダーにならないよう、欠席の場合の作業の設定が大切。
オンラインで共同作業を行う
Zoom等を用いてオンラインで接続し、打ち合わせをしながら作業を進める。メンバー全員が都合のつく時間を設定できる利点がある。通信環境によっては、長時間接続しながら作業をするのが難しい場合があるので、各自で作業を進めつつ、定期的にオンラインミーティングを実施して進捗確認や疑問点の相談を行うとよい。ZoomでIDとパスワードを取得すれば誰でもホストとしてミーティングを開催できる。無料アカウントの場合は40分の時間制限があるので、それ以上に渡る場合は再度ミーティングを行うとよい。

いずれの場合でも必要時に連絡が取り合えるよう、メールアドレスやLINE等をメンバー内で交換しておく。

[4]システム開発の流れ

ソフトウェアライフサイクルプロセス

システム開発を行う場合、発注側(ユーザ)と受注側(ベンダ)で意識のずれがあるとトラブルの発生につながる。トラブルの発生を抑えるための開発の流れを確認する。

ソフトウェアライフサイクルプロセス

企画プロセス
システム化の構想(経営上のニーズを踏まえて、作成するシステムの全体像を明らかにする)と、そのシステムを実現するための実施計画(サービスレベルや品質、費用、投資効果、スケジュール等)を練るプロセス。
要件定義プロセス
利用者側(利害関係者側)が要求を示し、要求(してほしい)をまとめて要件(する、しなければならない)とする。与えられた要件に基づき、システムに盛り込むものを明確にする。提供者側が整理し、利用者側に確認を求める。
この段階で作るものを明確にする。後になって変更が生じると、プログラムの作成をやり直す必要が生じるなど、手戻りが発生し、コストやスケジュールの超過につながる。
開発プロセス
システムを構成するソフトウェアに求められる要件を定義し、それを実現するためのソフトウェアを開発するプロセス。詳細はITパスポート試験や基本情報技術者試験の勉強をすると良い。ここでは、単体のプログラム開発を行う際に関連するプロセスのみ説明する。
ソフトウェア方式設計
システムとして外から見える部分の設計を行う。入出力画面やプリントアウトされる帳票などの「インタフェース設計(画面設計)」や顧客番号や製品番号といった規則性のある情報のコード化ルールを決める「コードの設計」等を行う。
ソフトウェア詳細設計
ソフトウェア方式設計に基づいたプログラム内の構造設計を行う。プログラムをモジュール(プログラム部品)に分割し、各モジュールの処理内容を設計する。
テスト
プログラムの品質と信頼性を向上させるためにエラーを発見するつもりでプログラムを実行する過程。対象とするプログラムの規模により、単体テスト→結合テスト→システムテストの順に実施するが、ここではまとめて説明する。
ブラックボックステスト
システムやプログラムをブラックボックス(中がどうなっているかわからないもの)とみなし、テストデータを準備する。
同値分割法は、無効データが適切に処理されるかどうかを調べる。例えば有効が「0~100」の場合に0未満や100超の値を入力する。また有効が「0を含む正の整数」の場合に、文字や小数、負の値を入力する。
限界値分析法はデータの取る上限、下限を超えたデータをテストケースとする。100点満点のデータであれば、0と100で正常なデータを代表させ、‐1と101で異常なデータを代表する。
ホワイトボックステスト
プログラムの内部構造に着目して、その全ての経路が効率よく実行されるようにテストケースを設計する。if文のすべての分岐を実行して、どの分岐でもエラーが出ないことを確認する。
運用プロセス
開発した情報システムを利用者の本番環境で運用するプロセス。運用テスト、業務およびシステムの移行、システム運用、利用者教育などが行われる。
保守プロセス
・ 対象業務やシステム環境の変化に対応するために、情報システムの維持、改善、機能拡張などを行うプロセス。

ソフトウェア開発モデル

ウォータフォールモデル
システム開発の手順を工程にわけ、上流から下流にかけて水が流れるように開発を進める。各工程の終わりに開発者と利用者が集まってレビューを行い、仕様変更等で前のフェーズにさかのぼる作業(手戻り)が発生しないようにする。比較的大規模なシステム開発に向いた手法。
プロトタイプモデル
早期に試作品(プロトタイプ)を開発し、ユーザの要求を確認しながらシステムを完成させる。プロトタイプを実際に操作することで、開発者とユーザ部門の意識のずれを早期排除できる。
スパイラルモデル
小さな機能範囲に限定したサブシステムをまず作成し、ユーザの要求に対応しながら徐々に機能範囲の拡大と改良を加えてシステムを開発する。少しずつシステムが出来上がっていく様がらせん状(スパイラル)であるためにこのような名称をもつ。

[5]作業の進め方

役割が決まったら各自で作業を行うが、その際担当に応じて該当するページを確認しておくと良いだろう。

[6]プログラム作成上の注意

作成するプログラムは公開することを考え、以下の点に留意しよう。

  • 操作方法をわかりやすくする:ユーザ≠プログラム作成者であるため、初めて実行した人でも操作方法がわかりやすいことが望ましい。例えば、実行直後にprint"好きな数字を入力してください\n"とすると、何をするプログラムであるのか、何のために数字を入力しなければならないのかがわからない。ただし、余りにも細かく説明しすぎると、読むのが煩わしくなってしまう。プログラム作成担当でないグループ内の他のメンバに意見を求めると良い。
  • プログラムの構造をわかりやすくする:どこでどのような処理をしているのかについてコメントを残しておくと良い。複数人で協力して作成する場合、他人が書いたプログラムを理解するためには時間がかかることがある。また、よく出来たプログラムの場合、次年度以降の自由課題作成において参考にされる可能性もある。せっかく作ったプログラムであるため、将来的に活用してもらえるよう、構造をわかりやすくしておこう。
  • 協力して作成する:例えばクイズを作る場合、一人で問題を考えると20問程度が限界かもしれない。しかし、全員で考えれば100問以上の問題を作ることも出来る。毎回同じ問題が同じ順番で出題されるプログラムは1~2回しか実行してもらえないが、プールした100問の問題からランダムに10問出題するようなプログラムであれば、何度でも楽しむことができる。せっかく作るのであるから、多くの人に繰り返し実行してもらえるようなものを作ろう。
  • 技術レベルの高いプログラムを作成する:1年間Rubyを学んできた集大成のプログラムである。単に楽しい/役に立つだけではなく、技術的にもレベルの高いものを目指そう。if文を使ったシナリオ分岐型のプログラムは、ストーリーとしては面白いかもしれないが、それほど難しい技術を使っているわけではない。open-endやハッシュ、CGIなどを使うことを考えてみよう。

[7] 特定の文字・文字列の出現回数を調べる(count, scan)

>>More

[8] 乱数の発生(rand)

>>More

[9] 少し間を空ける(sleep)

>>More

[10] 時刻を取得する(Time.now)

>>More

[11] 大きな文字を出す(systemを用いたbannerコマンド)

>>More

[12] ポップアップで画像を表示(systemを用いたdisplayコマンド)

>>More

[13] 文字色変更・画面操作(\e[Xm)

>>More

[14] 配列に関するTips

>>More

[15] プログレスバーを作る

>>More

[16] 文字列操作

>>More

[17-1] コマンドラインを用いたデータ入力(ARGV)

>>More

[17-2] コマンドラインを用いたファイル出力

>>More

[17-3] STDERRとSTDIN・プログラムの強制終了

>>More

[18] 正規表現で文字列を分割

>>More

[19] プログラムからFirefoxを起動

>>More