- 中高生向けの全12回のプログラミング授業で、文法より基礎概念に集中するため、1970年に登場したスタックベースの連結型言語 Forth を選択した
- 紙皿で後入れ先出し構造と演算を実際に行ってからコンピュータに移し、生徒たちがForth インタプリタの動作を身体感覚で理解できるようにした
- インストール不要の Easy Forth で絵・アニメーション・ゲームを最終課題にし、生徒たちは Snake のルールや色を変えたり、ピクセル単位の作品を完成させたりした
- Forth は文法の負担は少ないが、初心者がスタックのような低水準構造を早い段階で扱う必要があり、入門授業には即時の視覚的フィードバックが得られるScratchのほうが適していた可能性もある
- 特定の言語そのものより、結果をすぐ確認して自分で探究できる環境が重要であり、LLM 依存で技術を学べなかったり維持できなかったりする危険が大きくなるほど、人間中心の教育がより必要になる
Forth を選んだ理由
- Python や Scratch の代わりにスタックベースの連結型言語 Forth を選び、あまり試されていない教育の道筋を探った
- 限られた授業時間で基礎概念を扱うため、文法教育にかかる負担を避けたかった
- Python はプログラミング経験者には疑似コードのように読めるが、初学者には依然として理解しづらかった
- 候補言語は Forth と Haskell だった
- Forth は命令を書かれた順に実行するため、スタックを理解すればプログラムを作れる点が魅力だった
- Haskell は数学で学ぶ変数や関数の概念と相性がよく、変数を値を入れる箱として扱う一般的なプログラミング流儀の混乱を避けられた
- 最終的に Forth を選んだ理由は 2 つあった
- カスタム学習環境に統合しやすかった
- 教室での最終デモでは、関数型プログラミングより手続き型プログラミングのほうが理解しやすいと判断した
- あまり知られていない言語を使うことで、プログラミング経験のある生徒も新しいことを学べ、初心者も疎外されにくかった
12時間のカリキュラム設計
- 授業は週 1 回、1 回 1 時間で全12回行い、授業外課題を多くこなすことは期待しなかった
- 最終目標は Forth 環境で絵・アニメーション・ゲームのいずれかを自作することだった
- コース終了後も目で確認でき、保存しておける成果物を残したかった
- 技術的なことは多く学んでも、手元に何も残らないと感じる状況を避けたかった
- 生徒ごとに OS が異なり、一部の端末では外部ソフトウェアをインストールできなかったため、別途ダウンロードやインストールなしで各自のコンピュータ上でコードを実行できる必要があった
- 当初は Rust で Forth を自作し、WASM として授業用 Web サイトに埋め込むつもりだったが、バグ修正に予想以上の時間がかかり、計画を変更した
- Nick Morgan の Easy Forth をカリキュラム兼インタプリタとして採用し、各回のスライド、授業計画、Easy Forth のコピーをオンラインポータルに載せた
コンピュータの概念から始めた授業
- 初回の授業では、コンピューティングの歴史とコンピュータとは何かから扱った
- そろばんを含むさまざまな装置を見せてコンピュータかどうかを問い、そのうえでコンピュータを「数字を計算するあらゆるもの」と定義した
- この定義によれば、ほとんど何でもコンピュータになり得て、生徒自身も含まれうることがわかった
- コンピュータの範囲に関する既存の認識を広げたあと、Forth と 実際の活用分野、組み込み用途を紹介した
- Easy Forth は読者が少なくとも 1 つ以上のプログラミング言語とスタックデータ構造を既に知っている前提だったが、生徒たちにはその知識がなく、別途説明が必要だった
紙皿で理解したデータスタック
- コンピュータを使う前に、Forth の基盤であるデータスタックを紙皿で可視化した
- 空白で区切られた数字は入力順にスタックへ入る
1 2 3を入力したあと. . .で出力すると、最後に入った項目から出るので3 2 1になる- スタックは後入れ先出し(Last-In First-Out)構造で、上に積む push と上から取り出す pop を中心に動作する
- 生徒ごとに紙皿を配り、Forth の演算を実際に実行させた
- 数字を push するときは皿に数字を書いて一番上に置く
- 足し算では一番上の 2 枚を取り出して加算し、結果を書いた新しい皿を載せる
8 6 +は 2 つの値を積んで足し、14をスタックに載せる演算である2 3 *は 2 つの値を掛け合わせた6をスタックに載せる
- さまざまな演算を繰り返しながら、生徒たちは自らForth インタプリタの役割を果たした
- コンピュータはこの作業を自動化しているのだと理解したうえで、実際の端末へ移った
Easy Forth の実習と最終作品
- 毎週 Easy Forth の授業に沿って概念説明、練習問題、質疑応答を行い、全体の進行は特に問題なく続いた
- 全 12 時間の中で完成させつつ学習内容を示せる最終プロジェクトとして、Easy Forth のグラフィックフレームワークを活用した
- 絵、アニメーション、またはゲームを作れるようにした
- 新しいゲームを完成させるには時間が足りない可能性があるため、組み込みのSnake ゲームを改変して独自の成果物を作るよう勧めた
- Easy Forth のプレイグラウンドコードを別ページに切り出し、片側にコード、もう片側に大きなグラフィック領域が表示されるように拡張した
- 最終回で生徒たちは、Snake のコードを少し変えるだけでルールや色が変わることをすぐに見つけた
- 大規模なリファクタリングができる段階ではなかったが、Forth を恐れず探索・修正できるほどには慣れていた
- 組み込みグラフィックで物を描く方法と、線のような図形を簡単に描く新しい単語を作る例を見せた
- 生徒全員が自分なりの作品を選び、多くはピクセル単位で絵を制作した
- コース終了後も、生徒たちが望めば実験と学習を続けられるよう、環境を一定期間オンラインで維持した
Forth 教育を通じて得た判断
- Forth は興味深い教育用言語だったが、最善の選択だったかは確信が持てなかった
- 厄介な文法はない一方で、多くのプログラマが抽象化の下に隠しているシステム要素を、初心者が自分で考える必要があった
- スタックは計算機科学の基本データ構造だが、初期教育の最前面に置く必要はない
- コードを単語の連なりとして書ける点は強力であり、より高水準の構成要素を持つ連結型言語も教育に有用かもしれない
- Factor のような言語や、まったく別のアプローチも候補になりうる
- もし選び直すなら、内部構造よりも明確で即時の視覚的フィードバックに集中できる媒体を検討するかもしれない
- Scratch は低水準の詳細抜きで制御フロー、変数、関数などを教えられ、スプライトも簡単に動かせる
- 特定のプログラミング言語そのものはそれほど重要ではなく、短いコースでも生徒たちは Forth を効果的に学べた
- 生徒ごとに合うパラダイムは異なる可能性があり、学習過程を完全に細かく最適化するのは難しい
- 結果を素早く反復的に確認しながら、自律的に探究できる環境が重要である
- 生徒たちは、計算機科学の基本データ構造を深く理解する低水準の入門体験を得た
- 授業の進行役にとっても、生徒に求めた反復学習と同じように教授法を改善する機会になった
LLM 時代に必要な人間中心の学び
- プログラミングが確率的自動化によって主導されるほど、人が自分でプログラミングする方法を教えることはいっそう重要になる
- すでにプログラミングを知っている人でも、LLM に依存すると技能が衰える可能性があり、最初から学ばなかった人はその技能自体を形成できないおそれがある
- 新しい技術を学ぼうとする人々の間でも、信頼ある資料ではなく LLM を使うケースが増えている
- LLM は不正確である可能性があり、ユーザーに迎合する傾向があり、一部の事例では精神疾患を深刻に悪化させうる
- 世界と関わる方法を学ぶ段階の子どもたちにとって、こうした性質はさらに危険である
- 背景に関係なく誰もが、特に子どもたちがプログラミングのような技能を学べる人間中心の環境を提供しなければならない
- 多様な背景を持つ人々が時間とエネルギーを使って知識を分かち合い、追加の知識を安全に得る方法も教える必要がある
- 専門の教師でなくても教え方を学び、人と人のあいだで知識が自由に流れる場を作るべきである
1件のコメント
Lobste.rs のコメント
Easy Forth は良い教材に見え、すべてのプログラマーに10分だけ使って Forth を体験してみることを勧めたい。学ぶのは非常に単純でありながら、どこか馴染みがあり、思考様式を揺さぶる言語で、高級言語を急いで一から作る必要があるときにも実装しやすい
DOES>のような要素はそうではないForth の実装は楽しかったが、コードを多く書くほど好きではなくなっていった。
DUP、ROT、SWAPのようなノイズ語のせいで流れを追いにくく、好みではないグローバル変数の使用も促しがちhttps://archive.ph/0ZOVa