Ruby を用いて情報科学の原理を教える
久野靖∗

2009.9.7

1

はじめに• 「何やら面倒なことだが専門家に金を払えばシステ
ムができてくる」(思考停止) →「なんでこんなに□ 竹内先生の講演 --- 「すごい人材を (多いに越したこ

金が掛かるの」「安いに越したことはない」(品質ととはないけれども) 少数精鋭で育成する」にはどうすいうことばを受け入れてくれない)べきか (たぶん)• 「自分がやっている『本当の仕事』(業務知識?) よ□ もう 1 つ必要なこと --- 「世の中一般の人を『あるりずっと下賤なことであり、自分が理解する必要は程度分かっている』人にする」

ない」(思考停止) →まっとうな要求仕様ができる
はずがない• 初等中等教育 (小・中・高) における情報教育• 大学 1 年次における情報教育 (一般情報教育)□ このような「思考停止」が世の中の隅々まで広まって• 情報系学科以外の (理系?) 専門に進む学生に対する教育 ←☆

いる→ 「IT 業界は 7K」(きつい、給料が安い、暗い= 新 3K) + (休暇が取れない、帰れない、結婚できな
い、化粧が乗らない)□ なぜ「世の中一般の人を『ある程度分かっている』人にする」必要?

• 業界もこのようなイメージを助長する面があったのでは? (派遣ベース)• 山は「頂上だけ」を作ることはできない←裾野の広がりが不可欠• 世の中のイメージが悪い → 優秀な人が (人ほど)この進路を選ばない• 「すごい人材」が生まれてもそれを社会が評価できないと不幸□ だからやっぱり、「世の中一般の人を『ある程度分かっ• 「すごい人材」だけでなく「できる人材」「普通の人材」の階層があってはじめて IT 業界は成り立っている』人にする」べきでは?

• 初等中等教育 (小・中・高) における情報教育 ---ているはず

努力中 (文献参照)• 「できる人材」「普通の人材」を正しく評価できる
人はさらに多数必要• 大学 1 年次における情報教育 (一般情報教育) --努力中 (文献参照)□ 情報技術に対する理解の「ピラミッド構造」が必要
2-3%
5%
10%
20%
50%
100%

• 情報系学科以外の (理系?) 専門に進む学生に対する教育 ← 今日のお話

Top-Level ICT Professional
ICT Professional
User Corp. ICT Person

Devl. ExperimentAdv. ICT Understandings2

東大 1 年次科目「情報科学」

2.1「情報科学」の概要□ 東京大学の 1 年次情報教育科目→前期・後期各 1 科目

Basic ICT Understandings□ 前期 → 「情報」(必修)(いわゆる一般情報教育の科目)□ 現在「世の中の人が『全然分かっていない』」ことの弊害…

• (他の多くの大学と異なり) ソフトの操作方法教育を目標としない• 「コンピュータだから何でもできるんだろう/正しいんだろう」(思考停止) →「これはできるがこれ• 情報の人間的側面 (表現、認知、伝達)はできない」という説明を受け入れてくれない• 情報の社会的側面 (情報システム、法、技術と社会)• 情報の問題解決側面 (データ、計算モデル、複雑さ)∗ 筑波大学ビジネス科学研究科

1• 久野は前年度資料 (〜書籍原稿) を改訂して使用• 「難しい」という意見が多いらしい…(本当に難しいのかどうかは?)□ 「扱う内容範囲は定めるが扱い方や順序は各担当に任せる」という東大様の方針のおかげで、好きにやらせ□ 後 期 → 「 情 報 科 学 」(理 系:ク ラ ス 指 定 、文 系:選択)(かなり特殊)ていただいている• 以前の「計算機プログラミング I」(選択) を発展的

• 問題:

履修率の低さ --- クラス指定 (他の選択科

目はない) にも関わらず、1 類 (理・工学部) で 50%、に解消 (2006〜)

2・3 類 (生命・農・医) で 10〜20%程度→ 先に述• 「情報科学の基本概念や思考方法をプログラミング
を通して習得」

べた「思考停止」のせい?

→ 鶏と卵• 「これらの概念の学習の手立てとして Ruby によるプログラミングを使用」□ 興味深い点

3

授業設計と内容

3.1

授業設計• 情報科学の基本概念や思考方法を理系 (できれば)全員に学んでもらう□ 内容範囲は標準スライドをカバーするものとする (科• →理系全員を「ある程度分かっている人」にすることを目指している (かも)?

• 順番については「コードにした時に易しい」ものが目の前提)

先に来るように• Ruby の採用 (2007〜)• →伝統的には C とか Java だったが Ruby だとどうか?

□ 各内容は (原則として)Ruby プログラムで確認・追体験できるようにする

2.2

経緯ないし歴史□ 〜2005:• 確認・追体験の内容が演習問題となる→小レポート
として提出

計算機プログラミング I• 演習の数は多くなるので、難易度を広くとり学生の選択に任せる• 普通の「プログラミング入門科目」• 言語は Java が標準、具体的内容構成は担当教員に□ 上記が可能になるように「Ruby プログラムが書ける」

任されていた□ 2006:

ことも目標「情報科学」試行 (この年からクラス指定)• → できれば、プログラミングの楽しさも知って欲しい• 内容構成を設計→「標準スライド」(東大の関係教員が分担作成)□ 各回 (90 分)、おおむね 2 つ程度のトピックを紹介• 言語は「Ruby または Java」→久野は Java で実施、スライドと別に資料作成□ 2007:• 各回の資料は授業の数日前に PDF で公開 (印刷して持参を推奨)「情報科学」本格実施• 1 つ目について講義/説明した後、対応する例題を• 内容構成は「標準スライド」の改訂 (試行に比べて易しくした)「そのまま」打ち込み動作確認してもらう• 続いてそれを多少手直しするとできる演習をやって• 久野はこの年から Ruby で実施、Java 版の資料をもらう (A 課題) →この演習内容を「当日レポート」

Ruby に書き換えとして出席代わりに提出してもらう• →これを改訂して「Ruby による情報科学入門」を• ここまででだいたい 50〜60 分 (説明 20 分+演習 30

編纂□ 2008:分)• 頃会いを見計らって演習を中断し、2 つ目のトピッ
クを講義/説明「情報科学」本格実施 2 年目

• 「標準スライド」に加えて増原英彦先生が「標準テキスト」を執筆• これに対応する演習から 2 つ選んで次回までに提出してもらう (B 課題)• 標準スライド/テキストでは独自画像/アニメーショ• その解説は次回講義の冒頭に行う (「問題提示→考ン表示ライブラリ使用

えてもらう→解説」の順にしたいため)2□ 全部で 14 回を提示して「ある値から先は計算時間が長くなるが、そのある値はいくつか調べよ」という課題にした• ＃ 1〜＃ 11 --- Ruby により実施 (上記の通り)、B
課題は＃ 8 まで• 浮動少数点の誤差を実際に観察する課題。非常に緻密に調べてくれた学生もいるし、適当にやって誤差• ＃ 12 --- 「さまざまな言語」(各種言語の紹介、がありました、程度の学生もいた

Java を演習)• 全体として、単なる計算のコードだけでできる課題• ＃ 13(グラフィクス、GUI)、＃ 14(クラス階層設計)なので初回の B 課題にぴったり--- Java/出席自由 (強い型の言語も多少やりたいため)• いろいろ実験してくれている。
「コンピュータの計算が正確でないことを知って大変びっくりした」「やっ□ 以下では＃ 1〜＃ 11 の部分 (Ruby で情報科学) の部分てみるとコンピュータの計算のしくみが分かる」とについて内容を紹介

3.2

いう感想が聞かれる＃ 1: アルゴリズムとプログラム/数値の表現

3.3＃ 2: 制御構造/数値積分□ 前述の通り、課題として出した整数演算時間の段差と□ 計算の手順がアルゴリズムで、それをコンピュータで実数の誤差の問題について解説

実行できるように表記したものがプログラムだ、とい□ 制御構造がないと何もできないので、とにかくまず ifう話 (前期の復習)文を教える。

• Ruby の「三角形の面積」プログラムを提示しそのまま動かさせる。

• 例題は「絶対値の計算」で、1 つの動作に複数の書き方があることを強調

def triarea(w, h)s = (w * h) / 2.0
return s
end

def abs1(x)if x < 0result = -x
else
result = x
end
return resultend• 動いたら「2 数の和」
「円柱の体積」など同様の (単純計算の) プログラムを書かせる• すべての例題はメソッドの形で書き、エディタでファイルに打ち込ませ、irb でロードして引数をつけて

def abs2(x)if x < 0return -x
else
return x
endend

呼び出し実行させる• irb で直接式を計算させるのは「わざと」避けている ← 少し複雑になったら結局ファイルに書いて繰り返し修正するので• Java に比べると、入力する行数が圧倒的に少なく、おまじないが少ないため、最初の演習に掛かる労力

def abs3(x)result = x
if x < 0 then result = -x end
return result
endは非常に少なくなった。これはさすがだと思った。

• 「エディタでファイルに打ち込む」というのを丁寧に説明する必要はあった (しかし多少苦労した学生
も 1 週間たてばまったく OK)• これを打って動かした後「2 数のより大きいものを打ち出す」「3 数の〃」を演習してもらう。3 つ、4• 「プログラムが記述した通りに動くととても嬉しい」「非常に細かい (1 文字違っただけでも動かない) のつになると初心者はそれなりに苦労するので楽しん
でもらえるは大変」という感想が多く出される• 制御構造があると「プログラムをしているんだ」という気分になるという感想がある□ 数値の表現について、整数の 2 の補数表現と、実数の浮動少数点表現の説明。数の有限性/有限精度、誤差 (情報落ち、桁落ち) の説明□ if 文が終わったら while 文を説明し、「積分の公式を知らなくても積分が求められる」と言って数値積分の• Java のときは整数があふれて負になるとかを体験概念を説明するする課題を出していたが、Ruby は勝手に多倍長にするためこれができない。しかたないので時間計測法3□ f(x)=0 の解も数値的に解けるよという話をしてから、• 例題は while 文を使って 2 次関数の定積分 (正解が分かっている) を求める→誤差がバラバラ→ dx=W/N
を累計しても誤差のためループが N+1 回になったりすることを示す→回数を決めてループしカウンタから x を求める→計数ループを教える→刻みを小さくするとそれに応じて安定に誤差が減っていることを示す

単調増加関数を前提として区間 2 分法の説明とニュートン法の説明を (あらすじだけ) して、そのコードを自力で演習として書いてもらう□ 基本データ型 (数値、文字、論理値、nil) と複合デー
タ型 (配列、レコード、オブジェクト) の説明

def integ1(a, b, n)
dx = (b - a) / n;s = 0.0
x = awhile x < b
y = x**2# 関数 f(x) の計算
s = s + y * dx
x = x + dx
end
return s
end• Ruby だと文字列がオブジェクトで文字型がないので苦しい。また、シンボル型があるのでどうしようかと思ったが説明してしまう (レコードを作る時に必要)• 配列については沢山つかうので具体的例題で説明。
配列内容の合計を取る程度• 素数列挙の改良として割ってみるのを√まででやめる等を例示し、その後「素数を配列に取っておいて

def integ2(a, b, n)
dx = (b - a) / n;s = 0.0
n.times do |i|x = a + i * (b - a) / n;y = x**2# 関数 f(x) の計算
s = s + y * dx
end
return send

素数だけで割ってみる」「エラトステネスのふるい」の考えを示して作ってみる課題を説明• このあたりで、繰り返し、枝分かれ、配列を使ったプログラムがそれなりに書けるようになった感じ

3.5• 単調増加な関数で左端公式 (?) だと常に小さいことを説明し、ヒント (中点公式、台形公式、両者の混□ 前回課題の説明として素数列挙の問題を中心にプログ合の考え方) を示して次回までの演習問題としてや

ラム例を解説らせる□ メソッドを分けることで「抽象化」がなされていたことを後づけで指摘。またグローバル変数の概念を説明し、グローバル変数を書き換えると副作用のあるメソッ
ドになることを説明。続いて再帰関数の概念を GCD(最大公約数) で説明 (前にループによる最大公約数をやっているので)• 計数ループは for 文も一応教えるが、サンプルコー
ドでは「数値.times do ...

end」が多い (好みと、step も使いたいから)• 積分は理系にとってはなじみあるテーマなので分かりやすいという感想が多い

3.4

def gcd(x, y)
if x == yreturn x
elsif x > yreturn gcd(x-y, y)else
return gcd(x, y-x)
end
end

＃ 3: 制御構造/f(x)=0 の求解/データ型□ 前回課題の説明として、シンプソンの公式による積分の説明と打ち切り誤差の話をする。テーラ展開式をそのまま計算すると誤差でめちゃくちゃになる話もする□ 制御構造の続きとして fizzbuzz 問題を取り上げ、計• 階乗、組み合わせの数、再帰的定義、非負整数の 2

数ループの中に if が入るパターンを演習してもらう。

進表現の 3 つについて再帰的定義を提示し、再帰メ

また素数判定/素数列挙の問題も提示• fizzbuzz 問題:＃ 4: 手続き (関数) と副作用/レコードと画像

ソッドを書かせる演習• 例題と同様のパターンで書けばできるのですんなり再帰に入れるという印象「1 から 100 まで打ち出すが、3の倍数では代わりに fizz、5 の倍数では buzz、両者の公倍数では fizzbuzz と打ち出す」□ レ コ ー ド 型 に つ い て 解 説 し「Pixel = Struct.new• 「世界のナベアツ」のようなバリエーションも可能(:r, :g, :b)」でピクセル値を表すレコードを例示。

• この問題自体は分かりやすいので楽しんでもらえている感じ

これの 2 次元配列で画像を表現できることを説明4• initimage(画像データの初期化)、writeimage(ファイルへの PPM 形式での書き出し)、fillcircle(円を塗りつぶし) を示し、この程度で画像が作れることを示したあと、長方形や直線などを作る課題と「美しい絵」を作る課題を提示
def mypicture
initimagefillcircle(150, 30, 60, 255, 100, 70)
fillcircle(190, 100, 30, 100, 200, 80)
writeimage("t.ppm")
end□ 「美しい画像」について、簡単な絵でも構わないとし
たが、学生は皆いろいろ頑張ってくれた。

5

6

7

8

3.8

＃ 7: オブジェクト指向・乱数□ オブジェクト指向とはプログラムが扱うデータを「もの」として考える「考え方」であると説明し、クラス、インスタンス、インスタンス変数、インスタンスメソッ
ドなどの言語機構/概念を解説• 例題として「犬」のクラスを示しその変更を演習と
して提示

3.6

class Dog
def initialize(name)@name = name; @speed = 0.0; @count = 3
end
def talkputs(’my name is ’ + @name)end
def addspeed(d)@speed = @speed + dputs(’speed = ’ + @speed.to_s)
end
def setcount(c)@count = c
end
def bark@count.times do puts(’Vow! ’) end
end
end＃ 5: さまざまな整列手法/時間計算量□ 配列の整列について＃ 3 で出した課題の解説として単純選択法、バブルソートを示し、N を変化させて時間計測を行う演習□ マージソート、クイックソートを解説□ 時間計算量の考え方を解説□ ビンソート、基数ソートの考え方を解説し実装する課
題を提示□ その他の題材として最大公約数のユークリッド互除法、
フィボナッチのループ版と 22 行列版、組み合わせのパ
スカル三角形版を考え方だけ示し実装と時間計算量の• 「有理数」クラスを示しその演算追加と「複素数」
クラスの作成を演習として提示

計測/見当を課題として提示• 整列はテーマが分かりやすいためか納得してもらった感じ• 犬のクラスとかは簡単だったという意見が多い• クラスを何に使うのか納得してもらえるのかと思ったが、分かったという意見も多い• 計算量については計測してみると納得という感じ
で、一応計算量の考察ができるようになる□ 乱数と擬似乱数、ランダムアルゴリズム、モンテカル

3.7

ロ法による数値積分について説明し適当な関数の積分＃ 6: 連立方程式/常微分方程式の数値解法と試行数による精度分析を課題として提示□ 前回課題の各種アルゴリズムの実装例と時間計算量分析□ 乱数を使ったゲームの例として「数当て」を説明し、任□ 連立一次方程式のガウス消去法を説明し、意のゲームを作ってにみるという課題を提示

Gauss-Jordan に 直 す 演 習 。ま た Jacobi 法 の 原

def kazuatea = (rand(10000)+10000).to_s[1..4]; count = 0
while true doprintf("your guess? ")s = gets; hit = 0; blow = 0
4.times do |i|
4.times do |j|if s[i] == a[j] thenif i == j then hit = hit + 1
else
blow = blow + 1
end
end
end
end
if hit == 4 then puts "you win!"; return end
count = count + 1
if count > 9 thenputs "you lose! answer = #{a}."; return
end
puts "hit = #{hit}, blow = #{blow}."end
end

理と実装例を説明しテスト実行による収束の検討とGauss-Seidel 法に直す演習• 配列操作のロジックなので、このあたりにまだ慣れていない人はかなり苦労していた□ 常 微 分 方 程 式 と は 何 か 整 理 し た 後 、Euler 法 、Runge-Kutta 法 (2 次) の考え方とコード、および
Runge-Kutta 法 (4 次) の考え方と公式までを示し、精度を検討するかまたは 4 次の実装をする演習• 誤差の検討はできるが、アルゴリズムについてはこのようなものという程度の理解?

• この回は数値計算ばかりなのでつまらない? (2007年度は半分を乱数・ランダムアルゴリズムにしていたのでより良かったかも知れない)

9□ 表と探索の概念を説明し、線形探索、2 分探索木の実□ ゲームを作りたい人はかなり頑張ってゲームを作り提装例を時間計測例とともに示す。時間計算量の検討を出してくれた (文字だけでやる RPG とか)

課題として提示• ゲームを作ってみると「作れるものが作れるようになった」という感じを持った人がそれなりにいる• Ruby の Hash について表の一種として説明し、具体的な記法や使い方を示したあと、これの時間計測も課題として提示＃ 8: 動的データ構造/表と探索

3.9• こちらはあんまり人気はなかった□ 動的 (再帰的?) データ構造について説明し、単リストとその操作を説明

3.10

class Buffer
Cell = Struct.new(:data, :next)
def initialize@tail = @cur = Cell.new("EOF", nil)@head = @prev = Cell.new("", @cur)end
def atend
return @cur == @tailend
def top@prev = @head; @cur = @head.next
end
def forward
if atend then return end@prev = @cur; @cur = @cur.next
end
def insert(s)@prev.next = Cell.new(s, @cur); @prev = @prev.next
end
def print
puts(" " + @cur.data)endhead: prev:

cur:
How

are

head:

prev:

cur:

How

are

head:

prev:

cur:

How

are

you?

prev:

cur:

are

you?

top

forwardinserthead:
forward

old
How

head:
delete

tail:

old
How

you?

tail:
you?

EOF
tail:

prev:
are

EOF

EOF

tail:
EOF

cur: tail:
you?

EOF

old

□ 演習として「現在行削除」「現在行と次の行の交換」「1
つ戻る」「全体の順序逆転」から 1 つ作ってもらう• おまけとしてファイル読み書き、置換コマンドの実装を説明 (本当にエディタとして使えるようにする
ために不可欠)＃ 9: 抽象構文木/動的分配/字句解析/再帰下降解析□ この回から A 課題 (当日課題) だけになる□ 式木/抽象構文木の概念を説明し、簡単な式木を組み立てて評価する例題を提示した後、演算の追加や制御構造の追加を演習$vars = {}class Add
def initialize(l, r) @left = l; @right = r end
def exec() return @left.exec + @right.exec end
def to_s()
return ’(’ + @left.to_s + ’ + ’ + @right.to_s + ’)’end
end
class Mul
def initialize(l, r) @left = l; @right = r end
def exec() return @left.exec * @right.exec end
def to_s()
return ’(’ + @left.to_s + ’ * ’ + @right.to_s + ’)’end
end
class Lit
def initialize(v) @left = v end
def exec() return @left end
def to_s() return @left.to_s end
endclass Vardef initialize(v) @left = v end
def exec() return $vars[@left] end
def to_s() return @left.to_s end
end
def test$vars[’x’] = 5
e = Add.new(Var.new(’x’), Lit.new(1))
puts(e); puts(e.exec)e = Add.new(Lit.new(3),Mul.new(Var.new(’x’), Lit.new(2)))
puts(e); puts(e.exec)
e = Mul.new(Add.new(Var.new(’x’), Lit.new(3)),
Lit.new(2))
puts(e); puts(e.exec)end
irb(main):004:0> test
(x + 1)
6(3 + (x * 2))13((x + 3) * 2)16

• 単リストによる行バッファはかなり「面白い!」という反応が多かった→課題提出も多く人気があった• バッファという「抽象データ型」を作っているという感じもする10□ 内容をこれでも減らしているが、まだ「多い」「難しい」=> nilとの意見多数…

□ 類似したノードクラスを継承により短く定義できるこ• 今年どうするかは考え中…

とを示す□ ループ文なども同様に定義できることを示す

3.11

;
;
=
x

□ 抽象データ型としてのスタックとその実現 (配列、リス=
1ト)。抽象データ型としてのキューとその実現 (配列、+yリスト)。いずれも実例は配列版のみ示し、連結リスト

y

x

= 1

;

y

＃ 10: スタックとキュー/状態空間の探索

x

1

= x

+ 1

版を実装する演習課題;y• 式木を深さ優先 (スタック)、幅優先 (キュー) でた
class Assign < Node
どってみせるdef initialize(l, r) super; @op = ’=’ end• JR 路線図をたどる課題、エディタバッファを 2 つ
def exec()v = @right.exec; $vars[@left.getleft] = v; return vのスタックで実装する課題
end
end□ 有限オートマトンの復習/オートマトンを Ruby で実装
class Seq < Nodedef initialize(l, r) super; @op = ’;’ endadef exec() @left.exec; return @right.exec end
endbclass Loop < Nodedef initialize(l, r) super; @op = ’L’ end
def exec()$atm = [{’a’ => 1},
v=0; @left.exec.times do v=@right.exec end; return v{’b’ => 0, :final => true}]end
def accept(s)endcur = 0s.length.times do |i|
def test1
k = $atm[cur][s[i..i]];e =if k == nil then return false else cur = k end
Seq.new(
end
Assign.new(Var.new(’n’), Lit.new(5)),
return $atm[cur][:final] == true
Seq.new(
end
Assign.new(Var.new(’x’), Lit.new(1)),
Seq.new(• Hash のリテラルを使うことで「まんま」書ける感
Loop.new(
じ→ Ruby の利点
Var.new(’n’),
Seq.new(• いくつかオートマトンを示して受理するものは何か
Assign.new(Var.new(’x’),
考えさせる。また Ruby で動かして確認させる
Mul.new(Var.new(’x’), Var.new(’n’))),
Assign.new(Var.new(’n’),
Sub.new(Var.new(’n’), Lit.new(1))))),□ パズルやゲームが状態空間探索として定式化できるこ
Var.new(’x’))))とを説明し、例として箱入り娘を解くコードを提示 (64puts(e)行)
return e.execend
irb(main):006:0> test1(((n$)=(5#));(((x$)=(1#));(((n$)L(((x$)=((x$)*(n$)));((n$)=((n$)-(1#)))));(x$))))=> 120

母
親

下
男

娘
番頭
小

小

小

父
親

下
男

下
女

母
親

下
女

小

小

番頭

小

父
親

小
娘

小

□ 演習で動かしてみてもらうのはここまで□ この先の話題は説明だけ• 状態空間の探索については納得したという意見が多• 字句解析器の考え方とコード例

かった• BNF、構文解析木• オートマトンは前期にもやっているが、改めて分かっ• 再帰下降解析器の考え方とコード例

たという意見

11

3.12＃ 11: 動的計画法/パターン認識• この講義を取った人は「プログラミングとはこういうもの」ということはかなり分かった状態になって□ 動的計画法→パターン認識の前フリとして標準スライ

いると思う

ドで指定

• この講義を取った人は「情報科学とはこういうもの」ということや、その主要概念 (アルゴリズム、計算• 動的計画法の考え方を「フィボナッチ数列」「部屋量、データ構造、抽象化、…) をかなり分かった状割り問題」を題材として説明態になっていると思う• 多くの学生にとって (ほぼ全員)「考え方は分かって• ソフトウェア工学や開発プロセスのようなさらに上も自分で作れるようになる気がしない」。課題も一位のものは…→ あれば望ましいが、1 科目に詰め番易しいものの提出ばかりだった

込むのは無理がありそう□ 文字列のアラインメント→できればこのプログラムを□ これを紹介するとすぐ「東大だから」と言われてしま

自力で作れるようになって欲しいところだが、授業 1

いますが…

回では難しいかも□ パターン認識、forward algorithm、Viterbi アルゴ• どの学校でも、そこに適したレベルで「情報科学の原理」は取り上げることができると考えるし、それ

リズム→一応説明してコードも掲載しているが、これも 1 回では時間がない感じが大学としてのレベルであるべきだとも考える• しかし「情報科学」の内容の最終回ということで意見をもらうと、色々なものがあるのが分かったとい5

う好意的な反応が多かった

学生アンケートから□ すべてのレポートで 3 問ずつアンケートに回答しても

4

らっている

まとめ

• だいたいは、2 個の内容についての質問+感想・要望□ Ruby の採用について→手順を書くという点では Java• 2007 年度に「科目全体としての」アンケートを取っなどと変わらない (当然)た→下記

• Ruby だからいい点…短く書ける、irb で配列リテ□ Q. この講義は「情報科学」の学習を目的とし、その確ラル等を打ち込める (文字からデータ構造を作る部

認手段として「Ruby によるプログラミング」を演習し分のコードが要らない)て頂いていますが、本クラスにおけるその両者の位置• Ruby だと困る点…グラフィクスがない、勝手に多倍長など仕掛けが埋もれている

づけやバランス、難易度についてどう思いますか。

• 一部非常に難しい演習もありましたが、それを除けばバランスは取れていると思います。

• ブロックとイテレータなど、書きやすいのは確かだ
が、書いたものが何を意味しているのか説明しよう• 情報科学としてはバランスはちょうど良かったと思います。難易度は途中で急に上がったような…

とするとちょっと大変• 強い型検査は個人的には体験してほしいところ…

• こういうのはよくわかりませんが、個人的には小難□ 内容はまだハードなのでもう少し易しくした方がいいしい話を延々とするよりはこの講義のように実習をかと思っている (が、骨がある方が面白いと思っても多めに取り入れるほうがいいと思います。ただ難易らえる面も…)

度はもうちょっと低くてもいい気がします。

• 講義の難易度が途中から著しくあがった気がしま
す・・・• 学生さんの感想 (下記) を見ていると、やはりプロ
グラミングを学んでいるという意識が強い。それはプログラミングが魅力的だからと思うことにして…

• 情報科学についても、Ruby によるプログラミング
も、そこそこ理解できた気がします。比較的易しい:-)• 各回の題材についてはそれなりに興味を持ってもら内容や、プログラミングに関してはほとんど理解でえていると思う (いかにも情報科学なので学生もそきなかった内容もありました。Ruby を通して情報

う思ってくれている?)

科学の学習を行うというのは出来たと思います。

• 情報科学の考え方が理解できても、いざそれを Ruby
で表現するとなると大きな困難が伴い、大変苦戦し□ 冒頭の課題:「世の中一般の人を『ある程度分かっている』人にする」についてはどうか?

12

ました。個人的な意見としては情報科学の学習が主

グラミングができるぐらいのアルゴリズムは学べた目的であれば、プログラミングに関してはもうちょっと思います。
・でも結局完全には理解できていないと易しくしてもよかったような気がします。

理論はあります。そして、あやふやなアルゴリズムもあります。試験までに復習しないと…

• バランスはちょうど良いと思いました。難易度は、後半が結構高かったです。

• Ruby が書けるようになったのがよかったですね。課
題も楽しかったです。

• この講義では演習の方に重点を置いていたような気がします。原理的なものについては理解できても、実際プログラムを作ろうとすると難しいことが多かったです。

• Ruby でちょっとしたプログラムをつくれるようになってくらいであまり進歩を感じませんが、プログラミングに取り組む中で「こういうモノがあって、• 内容は理解できても、ルビー化できないときが多々ありました。難しいです。

こういう使い方が出来る」というようなことをたく• 少し課題が大変なときもありましたが、全体としてちょうどいい難度だったと思います。 はじめての• エディタバッファとかは今後使いそうです。後半の授業は難しかったですが、得るものも多かったです。

プログラミングでしたが、楽しくなんとかついてい• とりあえず、プログラミング自体初めて扱うものだったので、新鮮でした。なかなか複雑なもので、さん見た気がします。

くことができました。

• この授業はプログラムの実習が中心だったので、も自分で新しいプログラムを作るのはかなり難しそう

う少し, 解説に力を入れてほしかったと思います。

ですが、この講義で基礎を学べたと思います。

• この講義は、位置付け、バランス、難易度のいずれ• 講義開始時に比べて、パソコンがどのようなロジッ

も程良い感じの良い講義だと思います。効率良く情クで動いているのかがよく理解できるようになった。

報科学の内容が身についたように思います。

またごく簡単なものに関してだけであるが、プログ• Ruby は簡素な言語だなあと思いました。内容は時ラムを書いたり、書いてあるものを理解できるよう間の指数関数的に難しくなっていった気がします。

になった。あと、記号とか打つのが速くなりました。

• Ruby プログラミングの難易度が高すぎる気がしま• 講義開始時は再帰的なものがとても苦手だったのですが、現在ではある程度扱えるようになりました。

す。初学者にはきついです。

• どちらかというと、Ruby プログラミングがメインだったような感じがしないでもないです。ただ、プ• プログラムの計算量について結構理解できまるよう

ログラミングができる=情報科学が学べている、との種類によってかかる時間がかなり違っているといになりました。同じことをやるのでも、プログラム

いうきもするし、なんともいえないです。

• 後半はプログラミング未経験者には無理でしょう。
継承や演算子オーバーロード (実質) がいきなり出てくるのは……(苦笑

うことには驚かざるを得ません。

• 数学に似てても全く異なる分野でした。使いこなせ
るのは html どまり…
• まずプログラミングという、色々な手法を組み合わせて、一つの動作をおこすものが作れるんだとわか• 情報科学を学んでいるというより、どっちかというとほとんど「Ruby でのプログラミング」を学んでいりました。そういうものを自分で作ってうごかすのるという感じでした。ただ、そっちのほうがよかった

は、楽しかったです。

ので、たくさん学べてうれしかったですが。難易度• この情報科学の授業で学んだ事で最も興味深かったはクラスぐらいまではよかったのですが、動的デーのは誤差と計算量でした。 浮動小数点、桁落ち、情タ構造あたりからはかなりきつく、おもちゃ言語で

報落ちの仕組みを理解する事で, これまで原因が分は力尽きました。

からなかった乗除計算の時に微小な誤差が生じる仕• 情報科学を学ぶために Ruby を利用するのは最初疑組みが理解できました。また、同じ目的のプログラ問でしたが、まぁありかなって思います。

ムでも計算方法が違う事で計算時間に非常に大きな• ちょうど良かったです。時々与えられる自由な課題が大変でしたが、やりがいがありました。

差が出る事は実際にプログラムを動かす事で実感する事ができたと思います。

□ Q. 講義開始時の自分を振り返り、今回までの講義で自• ソートの辺りからは (OO はなんとなく分かっていま

分がどんなことを学んだか簡単にまとめて見てくださしたが) 知らないことばかりで、いろいろ新しく勉

い (全体的な感想も含めてどうぞ)。

強させてもらいました。

• アルゴリズムの組み立て方など• 自分はプログラミングの経験はありましたが、Rubyを新たに習得することができました・実用的なプロ• データ型やクラスなどの概念は分かったと思います13

が、プログラミング言語としての Ruby はまだまだ分からないことだらけです。あと、/の逆向きの記号がまだ打てません。なので、上のプログラムも/(の逆)n がありません。

• プログラミングというものを習得し、コンピュータの動くしくみの一部を垣間見た。というのが、「学んだこと」に対して真っ先に思い浮かんだものです。

• アルゴリズム関連弱かったので、経験できてよかったです。

• 講義開始時はプログラムなんて全く分からず、もちろんソースなんか見てもただの意味不明な羅列にしかすぎなかったのですが、現在ではソースを見て何をしているのかなんとなくは理解できるようになりました。数学的な話題 (連立方程式とか微分方程式とか) はほとんど忘れてしまっていますが、基本的な構文、クラスの使い方、配列、ハッシュ等は大方使えるようになりました。興味深い内容も多くあり、楽しくまなぶことができました。(字句解析器はきつかったですが)• 内容が量的に結構大目で大変でしたが、プログラム
がどんな風に組み立てられているのがが少しわかって面白かったです。

• ものごとの表現方法はいろいろあるのだと思いま
した。

6

参考文献

□ 情報処理学会, 情報専門学科におけるカリキュラム標準

J07, http://www.ipsj.or.jp/12kyoiku/, 2009.
□ 情報処理学会, 日本の情報教育・情報処理教育に関する提言 2005, http://www.ipsj.or.jp/12kyoiku/,

2005.
□ 情報処理学会, 2005 年後半から 2006 年初頭にかけ て の 事 件 と 情 報 教 育 の 関 連 に 関 す る コ メ ン ト,

http://www.ipsj.or.jp/12kyoiku/, 2006.
□ 兼宗, 久野, ドリトルで学ぶプログラミング, イーテ
キスト研究所, 2008.
□ 久野, Ruby による情報科学入門, 近代科学社, 2008.
□ Tim Bell ほか著, 兼宗監訳, コンピュータを使わない
情報教育アンプラグドコンピュータサイエンス, イー
テキスト研究所, 2007.

14