わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

1回のプログラム作成と繰り返し実行で,トータルの時間を短く

「さてこの科目では,はじめ数回は前期科目の復習をしまして,そのいくつかはプログラミング授業の準備も兼ねていたのですが,第5回から4コマかけてCを,第9回からの4コマでVBAを,そして第13回から2コマ分でGUIプログラミングを,学んできました.
難しかった課題もあったかもしれません.簡単そうに見えて,たった一つの処理を書き忘れていたために,思うようにいかず,そこで時間を浪費した,なんてこともあったでしょうか.
本日は,最終回です.ここで改めて,『なぜプログラミングを学ぶのか?』の答えを,考えてみたいと思います.この問題設定自体は,第5回の,Cの導入にときにも,していました.あのときは,その答えをWebから取ってきましたが,今回,これまでの授業体験をもとに,問題を次のように表してみたいと思います.

プログラムに何時間もかけるより
手計算やキーボード・マウス操作の方が
すぐできてしまうのでは?

これに同意する人は,いるでしょうか.この科目のプログラミングくらいだったら,if文やfor文や,変数宣言や,あとデバッグなんかをせずに,ちょっとした計算なら紙と鉛筆で,少々複雑になったらExcel表計算やグラフ描画機能で,やればいいじゃないか,というわけです.
ですがそれでも,プログラミングを経験するというのは,多分に実用的な要素を含んでいると思っています.というのも,『…の方がすぐできてしまうのでは?』という問いに対しては,次のように考えればいいからです.

何回も計算させたいときには
1回のプログラム作成と繰り返し実行によって
トータルの時間を小さくできる

『トータルの時間』について,思考実験をしてみましょう.Excelで定型的な集計をする仕事を,想定します.ここで『定型的な』というのは,集計の仕方は同じで,データはそのときどきに変わるという意味です.Excelのデータ登録を誰がするのかについては,ここでは議論の対象外としておきます.
そして,作業者が2人いるとします.名前をつけておきましょう.アリスと,ボブです.
アリスは真面目キャラです.毎回、マウスとキーボードで操作して,グラフを作成します.その作成に要する時間は,そうですね,60秒と設定しておきましょう.
ボブは典型的なプログラマ気質です.はじめに時間的コストをかけて,プログラム,今回の話ではVBAのコードを作っておき,あとはそれをマクロとして実行するだけです.
ボブはVBAプログラミングに少し慣れていなかったと仮定して,使用可能なオブジェクトやメソッドの調査,そしてデバッグなどにも時間をとり,プログラム完成までに15分を要したとします.それでいったん,作ってしまえば,以後はファイルを開いてマクロ実行をするだけ,なので5秒で集計作業を終えることとします.
このように,場面を設定したとき,17回以上,その集計作業をするなら,ボブの方が,総作業時間が少なくなると言えます.Excelの復習の回で作った,携帯電話のプランそしてパケット数に応じた利用料金の表と同じようにして,アリスとボブの計算機使用時間を,グラフにすることができます.

なのですが,手計算でも求められます.作業の回数をx回と,おきます.そうすると,アリスの作業時間は,60xです.単位は秒ですね.ボブはというと,15分は900秒なのに注意して,総作業時間は900+5xと表せます.
そしてボブの作業時間が少なくなるときの,xの条件を求めたいなら,60x>900+5xという不等式を立てることになります.これを解くと,x>16.3636…です.実際にはxは整数ですから,17回以上なら,アリスの時間よりも,ボブの方が時間が短いと言えます.またy=60xと,y=900+5xという2つの直線を比較したのが,スクリーンに表示させているグラフとなります.
ところで,じゃあ我々はボブのように,定型処理があるときにはマクロをつくれ,コーディングをせよ,といっていいのかというと,少し,注意したいことがあります.今回の思考実験で出てきた『60秒』『15分』『5秒』というのは,いずれも,こちらで用意した,いわば恣意的な設定条件なのです.この値が変われば,結果も変わります.
時間を変えるのと別に,検討すべき要因もあります.『何度も』同じ処理をしたいと言っても,『何十回も』ではなくせいぜい『数回』だけというのであれば,『17回以上ならプログラムを書けば時間的にお得』という試算結果によって,そのマクロなり,プログラムなりは『作成すべきでない』という結論にすべきだ,実はアリスのほうが環境に優しいのだ,という場合も,あるかもしれません.
それでは演習課題にしましょうか.『60秒』『15分』『5秒』を入力に与え,ただしそれは任意に変えられるようにし,作業時間のシミュレーションを行い,何回までならアリス,何回からだとボブの時間が短くなるかが容易に判断できるような,出力をしてください.
何でつくるかは,これまでの授業の中から1つ,各自で選んでください.もっとも素直なのは,マクロ入りのExcelファイルだと思いますが,凝りたい人は,GUIでも,あるいはCでも,できますのでチャレンジしてみてください」

なにこれ

元ネタは先月の授業です.後期情報処理科目の最終回,と設定しましたが,実際にはもう少し経緯がありました.約300人の1年生(と再履修生)は,火曜1クラスと木曜4クラスに分かれて受講し,私は火曜1クラスと木曜のうち1クラスが担当です.授業進行の諸事情により,上の内容は1月中旬の火曜の第13回授業でまず話し,ほぼそのまま,下旬の,木曜の第15回授業でも話し(他クラスでも話してもらい)ました.
数値を設定して,ごちゃごちゃやっていますが,簡単にいうと「コストをかけて元をとる」を,プログラミングに適用しただけのことです.
授業で言わず,そして上でもあえて書かなかったことが1点,あります.それは,「900+5x<60x」のような計算式を提示して,これをもとに効率をアピール*1するのは,現代的ではないという点です.
かわりに,上に載せたグラフを見せるのが,ビジュアルが期待される現在の,主張のしかたとなっています.
とはいえあのグラフは,Excelのごくわずかな操作で作成した,極めて単純なものです.値の範囲を変えたり,「繰り返し実行するなら断然プログラミング!!」といった吹き出しを添えたりすることで,訴求力が向上します.


Q: 本題に入る前のところに,「その答えをWebから取ってきた」とありますが,どこからですか?
A: 次の2つです.

ついでに,具体的に取り出した(Cの導入の回のスライドに入れた)のは,以下のとおりです.

  • 「プログラミングをできるようになるということは、人類の叡智を利用できるようになるということです」
  • 「プログラミングを通じて、論理思考力や表現力が高まるため、問題解決スキルが身につけられるようになる」
  • 「ルールさえ作ってしまえば、コンピューターが自分の代わりに作業をしてくれる」

Q: あれ? 作業時間のシミュレーションなんて,授業でやりましたっけ!?
A: いえ,オチのところはフィクションです.この件は,シミュレーションをシミュレーションせよということで,情報分野でときおり見かける「自己言及」*2とも関連します.図のもとになるExcelファイルは,授業担当の先生方には送りましたが,授業からはダウンロードできるようにしていませんでした.

(リリース:2016-02-20 早朝)

*1:主観的かもしれませんが,「アピール」という言葉は古めかしい印象を与えますね.「アッピール」にすると,さらに古くなります.

*2:昔はこういうのを「メタな話」と言ったのでしたっけ.