読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

学習曲線に沿ってゆるい言語から硬い言語へ。Visual Basic は最高だった話

Visual Basic Advent Calendar 2016 18日目の記事です。

※当初は ポエム Advent Calendar 2016 18日目の記事として投稿するつもりの記事でしたが、そっちには別の記事を書きました。つまり本記事にはポエム要素があります。昔話をします。

Visual Basic はプログラミング初学者にとって最強の教材だったと思う

時は 199X年、僕が生まれて初めて触ったプログラミング言語Visual Basic 5 (体験版) だった。入門書(名前は忘れたが絵本っぽい雰囲気でかわいい本だった)に付属していた CD-ROM でインストール。

インストールがめちゃくちゃ楽だった

PC に CD-ROM を差し込んで起動するインストーラのボタンをポチポチするだけ。

なるほどこんなものか、と思ったが、20年の時を経て思い返すと「なんでもないようなことが幸せだったと思う」という言葉が脳裏に響く。

GUI作りがめちゃくちゃ楽だった

プロジェクトを作成すればすぐに開かれる、サルでもわかるような簡易なフォームデザイナ画面。伝わるだろうか、このポトペタ感。マウスさえあればそれで良い感。
f:id:kobake:20161211210649g:plain
(※画像は 2015 版です。しかし当時もそれほど変わりない)

デザイナ上でボタンをダブルクリックすればハンドラが作成された

f:id:kobake:20161211212625g:plain
(※画像は 2015 版です。しかし当時もそれほど変わりない)

何の抵抗もなくイベントハンドラをスラスラ追加できていた。インテリセンスによる入力補完も今と同じ程度に優秀だった。

なんでもないようなことが幸せだったと思う。

さてここまではオモチャの話

ここからはプログラミングの話。

変数宣言をしなくてもよかった(当時はそれでよかった)

Private Sub Button1_Click(sender As Object, e As EventArgs)
    a = 10
    b = 5
    c = a * b
    Button1.Text = c
End Sub

#include 等の「おまじない」とか、「宣言」などといった、まどろっこしい、初学者にとって本質ではないところで躓く要素がなかったのだ。デザイン画面でダブルクリックをすると自動で生成される Sub ルーチンの中に「a = 10」とだけ書いたプログラムさえ有効なプログラムだった。最高だ!

「a = 10」とくれば、a という変数に 10 という数値が代入される。ただこれだけ。ここで学習すべきは「変数」という概念そのものだけだ。

「おまじない」「宣言」「変数」の3つを同時に覚えさせられるよりも
「変数」だけに注目して勉強できたほうが絶対に効率が良い。実際まったく躓かなかった。

学習段階

とりあえず学生Aは「変数」の概念を理解し、いろいろなものを作りまくった。

そして事故る

hello = 10
world = 20
result = helo + world ' これの結果が何故か 20 になる

変数宣言が不要なコードにおいては typo により存在しない変数を参照してしまうことがあるのだ。
ここで勘の良い学生は自発的に変数宣言の強制を欲するようになる。

変数宣言を強制する自由があった

そして Visual Basic には自由を縛る自由があった

Option Explicit ' これを冒頭に書いておくと変数宣言を強制できる
....
Dim hello, world, result
hello = 10
world = 20
result = helo + world ' ここでコンパイルエラーが起こり typo に気づく

エラーが発生せずに誤った状態のまま進んでしまうよりは、その場でエラーが起こってくれたほうが数倍マシなのだ。(そうでないケースもあるが)

学習段階

とりあえず学生Aは「変数」および「変数宣言」の概念を理解し、いろいろなものを作りまくった。

型制約をしなくてもよかった

自分の書いたプログラムなんだから変数の意味付けくらい全部覚えてて当然なわけで、型制約など知っていても使わない。Visual Basic には型制約をしなくて済む自由があった。

' すべて数値であることは(プログラムが単純なうちは)自明である
Dim hello, world, result
hello = 10
world = Hoge()
result = hello * world
....
Function Hoge()
  Hoge = 20
End Function

そして事故る

Dim hello, world, result
hello = 10
world = Hoge()
result = hello * world ' world は数値のつもりだったが Hoge() が文字列を返していたせいでエラーに!
....
Function Hoge()
    Hoge = "a"
End Function

プログラムが大きくなってくると、どの変数がどのような属性(型)を持っているのか意識しないとしばしば事故るのだ。すべての変数の属性(型)を人間が記憶するのには限度がある。

ここで勘の良い学生は自発的に変数の属性(型)制限を欲するようになる。

型を制約する自由があった

これもまた自らの自由を縛る自由である。Visual Basic では As 構文により変数の型を制限することができた。

' すべて整数であることを明示
Dim hello As Integer, world As Integer, result As Integer
hello = 10
world = Hoge()
result = hello * world
....
' 関数の戻り値も整数であることを明示
Function Hoge() As Integer
    Hoge = "a" ' ここでエラーが発生し、想定と異なる型の戻り値を構築してしまっていたことが発覚する
End Function

これでさきほどよりも早いタイミングでエラーが検出されるようになった。
エラー検出は早ければ早いほど良い。(コールスタックの段階は浅ければ浅いほど良い)

学習段階

とりあえず学生Aは「変数」および「変数宣言」および「型制約」の概念を理解し、さらにいろいろなものを作りまくった。

ここで最も伝えたいこと

まず問題にぶち当たり、自分の手で自分の自由を縛ることが時には利になることを、初学者は身をもって体験してほしい。

  • 変数宣言強制の大切さに自発的に気づき実践してほしい。
  • 型制約の大切さに自発的に気づき実践してほしい。

何かひとつでも良いから「制約が利益になり得ること」を自発的に気づいて欲しい。
そして自分の手で自発的に制約を加えて欲しい。Visual Basic はそれができる言語だ。

Visual Basic は制約の強い言語ではない。
Visual Basic は制約の弱い言語でもない。
Visual Basic は制約のレベルを調整できる言語だった。

これは学習者にとって最高の教材である。

「自発的な制約により利益を得た」そんな体験があれば、その後に他人から教わる他の制約についても何か意味があるのだろうと前向きな推測をもって迎え入れる覚悟ができるだろう。

もっと踏み込んでいける

プログラミングにおけるイディオムはいくつもありキリがないのだが。

  • 参照型の危険さと便利さを意識して使い分ける
  • スコープを意識する
  • インターフェースと実装を分けて考える
  • バージョン管理を行う

等等。どれもこれも最初は躓くだろうが制約の成功体験さえ最初に掴んでしまえば学習が快感になるのも遠くない。そして我々には学習をサポートする強力なツールがある。

高機能なデバッガが標準で用意されていた

さて、学生Aはみるみるいろんな課題をこなしていった。力試しに FizzBuzz を組んでみることにする。

Dim result As String = ""
Dim line As String
Dim i As Integer
For i = 1 To 100
    line = ""
    If i Mod 3 = 0 Then
        line = "Fizz"
    ElseIf i Mod 5 = 0 Then
        line = "Buzz"
    ElseIf i Mod 15 = 0 Then
        line = "FizzBuzz"
    Else
        line = i
    End If
    result = result & line & vbCrLf
Next
TextBox1.Text = result

実行結果は以下の通り

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz ← FizzBuzz になるべきところが Fizz になってしまっている
16
17
....

込み入ったデバッグの実践

さて、ここでこの問題を解決するにはどうすれば良いだろうか。脳内でループを回し脳内計算をひたすら繰り返す?それは学生としてひとつの真摯な姿勢かもしれないが、我々には Visual Basic という強力な武器があった。

ブレークポイント」「ステップ実行」「ウォッチウィンドウ」は脳内デバッガよりも遥かに優れた実践的ツールである。
f:id:kobake:20161212004823g:plain

変数 i が 15 であるとき、プログラムがどの経路のコードを実行するか、プログラムの実行状態を、まさにヴィジュアルに視覚的に確認することができたのだ。

これにより、i が 15 のときにはウォッチウィンドウの内容から「i Mod 3」「i Mod 5」「i Mod 15」すべてが 0 になり、結果として line に "Fizz" が代入されてしまうコードが実行されていることが判明した。

学習段階

とりあえず学生Aは、脳内ループを回したりログを仕込みまくったりするような泥臭い方法ではなく、高機能なツールに頼った高効率のデバッグ手法を学んだ。

その後

もともとゲームが作りたかった学生A(僕)はパフォーマンス向上のために Visual Basic から無理やり WIN32 API を呼び出すような悪行を繰り返すも限界を感じ、C, C++ の道へと進路を変えた。そして気づけば齢19にして職業プログラマとなっていた。

いつしか自発的な気付きからも脱却し巨人の肩に乗ることを覚え、Effective C++, More Effective C++, Modern C++ Design, デザインパターン等等、ありとあらゆる良書に噛り付いた。兎にも角にもプログラミング学習のはじめの一歩をスムーズに導いてくれた Visual Basic には感謝の念が尽きない。

おわり

Visual Studio 最高!というお話でした。

僕の好きな言語は C++, C#, Java, VB の順ですが、学問としてのプログラミングという意味では初学者には Visual Basic(特にVB.NET以前)をお勧めしたい気持ちです(※これはあくまでも机上のお勧めです。実際に相談されたら C# をお勧めすると思います)。
…というのは、最初は堅苦しくないゆるいスタイルから書き始められて、自分のレベルが上がるのに合わせて自発的に段階的に制限を硬くしていける性質に由ります。

どれだけ積年で培った理想の設計スタイルがあろうが、それを初学者に押し付けることは極めて難しくそして何よりも傲慢であり。まずはゆるい環境下で自由にプログラムを組みいくつもの成功体験と挫折を味わいそして自発的に何かしらのイディオムを見つけ出してもらいたい。その起爆剤の有無がたぶんその人の今後を大きく左右する。

おまけ:筆者経歴

自分は普通学校出身でプログラミングは主に書籍とパソコン通信ニフティ・サーブの技術フォーラム)から学びました。インターネットが使えるようになってからは「猫でもわかるプログラミング」を筆頭に各種サイトから学ばせていただきました。皆さま大変お世話になりました。

プログラミング言語抜きにして自分の初めてのプログラミング「的」体験はスーパーファミコンの「RPGツクール SUPER DANTE (ASCII)」だったと思います。小学生の頃これと出会ったおかげで将来はゲームを作ることを志し、実際ゲームプログラマを10数年ほど勤めました。これがなかったらプログラムを組むこともなかったと思います。感謝。
f:id:kobake:20161211154307j:plain
RPGツクールについて語りだすと記事が膨大に膨れ上がるため、あえてここは「こんなものもあったよね」という懐古に留めておきます。そういえば高校生時代は Visual C++RPGツクールもどきを自作してました。(ドット絵エディタとかマップエディタとかイベントスクリプトインタプリタとか)

});