私が務める専門学校は、IT系の専門学校です。
当然ながら、プログラミングは学生たちが学ぶ大切な分野のひとつです。
これまで、プログラミング基礎の授業は外部講師の力も借りながら実施してきました。
ただ、プログラミングを学校教育の大切な柱のひとつにしていくのであれば、自分たちでも授業を作り、教え、継続的に改善できるようにしたい。
私はそんなことを考えるようになりました。
そこで今年は、私自身がかなりのコマ数を持ちながら、汗をかき、時にはべそをかきながら、プログラミング基礎の授業を作っています。
前期はPythonを中心に、プログラミングの基本を学びました。
では、後期は何をするのか。
Pythonの続きをひたすら学ぶ方法もあります。
でも、それだけでは少しもったいない気がしました。
Pythonを「学ぶ」から、Pythonを「軸に考える」へ
そこで後期は、Pythonを「軸」にして、別のプログラミング言語で書かれた処理を読み、
「これをPythonで書くならどうする?」
と考える授業をやってみることにしました。
最初に題材として選んだのがRustです。
Rustには、公式の入門書「The Rust Programming Language」が公開されています。
その第2章に登場するのが「Programming a Guessing Game」、いわゆる数当てゲームです。
Rust公式「Programming a Guessing Game」
https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html
1から100までのランダムな数字をコンピュータが決め、プレイヤーが数字を入力する。正解より大きいのか、小さいのかを表示し、当たるまで繰り返す。
やっていること自体は、とてもシンプルです。
まずはRustを動かせる環境を自分で作る
ただ、いきなり数当てゲームを書くわけではありません。
その前に、Rustを動かす環境が必要です。
ここも、全部こちらで用意してしまうのではなく、学生自身にRustの公式ドキュメントを読みながら環境を作ってもらっています。
実行環境には、VirtualBox上のAlmaLinuxを使っています。
学生それぞれのWindows環境に直接Rustを入れる方法もありますが、できるだけ環境差を減らしたかったことも理由のひとつです。
そして、ここで面白いことに気づきました。
AlmaLinuxを使うこと自体は、学生にとってまったく新しいことではありません。
前期にLinuxを学んでいるからです。
ターミナルを開く。
コマンドを入力する。
必要なものをインストールする。
ファイルやディレクトリを操作する。
分からなければドキュメントを読む。
前期に学んだLinuxの知識が、後期には「新しいプログラミング言語を学ぶための道具」になっています。
Linuxの授業が終わったから、Linuxは終わり。
Pythonの授業が終わったから、Pythonは終わり。
そうではなく、一度学んだ技術を次の学習の足場として使っていく。
今回の授業を作っていて、この積み上がり方はなかなかいいなと思っています。
RustのコードをPythonに「翻訳」してみる
Rustで書かれたコードを見ると、Pythonを学んできた学生にとっては、見たことのない書き方がたくさん出てきます。
let、match、loop、Ordering、Result……。
でも、処理を一つずつ見ていくと、
「ここは入力を受け取っている」
「ここは数字に変換している」
「ここは条件によって処理を分けている」
「ここは繰り返している」
といったことが見えてきます。
では、それを自分たちが知っているPythonで書くとどうなるのか。
そうやって別の言語を、自分が持っている技術にいったん「翻訳」してみます。
言語が変われば、書き方も考え方も違います。何でも同じというわけではありません。
それでも、初めて見るコードを前にしたとき、
「知らないから分からない」
で終わるのではなく、
「これは、自分が知っているもので考えると何をやっているんだろう」
と考えることはできます。
この経験は、将来また別の言語に出会ったときにも使えるのではないかと思っています。
基本情報技術者試験の科目Bにもつながるかもしれない
この授業を考えていて、もうひとつ気づいたことがあります。
こうやって「知らない書き方で表現された処理を読み解く」という経験は、基本情報技術者試験の科目Bにも自然につながるのではないか、ということです。
科目Bでは、特定のプログラミング言語そのものを使うのではなく、擬似言語で書かれたプログラムを読み、処理を追っていきます。
書き方はPythonとは違います。
でも、
「この変数には何が入っている?」
「この条件で、どちらに進む?」
「この繰り返しは、いつ終わる?」
「この配列をどう操作している?」
と処理を読み解いていくこと自体は、それほど違わないはずです。
RustをPythonに翻訳する。
擬似言語を、自分が知っているPythonの処理として考えてみる。
どちらも、知らない表記を見たときに、表面的な構文だけに惑わされず、「結局これは何をしているんだろう」と考える練習になります。
基本情報技術者試験のためだけにプログラミングを学ぶわけではありません。
でも、普段のプログラミングの授業で身につけた考え方が、そのまま科目Bを読み解く力にもつながっていくのであれば、それはかなり理想的な形なのではないかと思っています。
後半はゼロから作る
後半には、逆方向の経験も入れていくつもりです。
完成した処理をPythonに翻訳するだけではなく、今度はゼロから、
「何をしたいのか」
「そのためには、どんな処理が必要なのか」
「自分が知っている技術で、どこまで作れるのか」
を考えて実装していく。
他人が作ったものを読み解くトップダウンの経験と、自分で処理を組み立てていくボトムアップの経験。
その両方を行き来してほしいと思っています。
GitHubも「特別なもの」にしない
そして、もう一つの柱がGitHubです。
コードは自分のパソコンの中だけに置くのではなく、GitHubで管理する。
変更したらcommitする。pushする。履歴を残す。他人が書いたコードを読む。
いきなり本格的なチーム開発ができるわけではありません。
でも、「プログラムを書く」という行為を、少しずつ「他者と一緒にソフトウェアを作る」という行為につなげていきたいと思っています。
GitHubを使うこと自体を特別な授業にするのではなく、プログラムを書くならGitHubを使う。
そんな状態に少しずつ近づけたいと思っています。
教えている私も、まだ学んでいる
この授業設計が正しいのかは、まだ分かりません。
私自身も、学生に教えるために新しい言語を読み、分からないところを調べ、動かして、エラーを出して、また調べています。
ただ、この学び方は結構楽しい。
知らないものでも、すでに持っている知識を足場にすると、少しずつ読めるようになる。
動かなければ調べる。
直して、もう一度動かす。
それでもダメなら、また考える。
私自身が面白いと思っているこの感覚が、学生にも少し伝わればいいなと思っています。
授業そのものもRetryする
まずは後期15回。
最初から完成された授業ができているわけではありません。
やってみて、学生の反応を見て、うまくいかなければ変える。
授業をしながら、この授業自体もRetryしていきます。


コメント