ProgramByDesign (旧称TeachScheme! )プロジェクトは、 PLT研究グループのアウトリーチ活動です。大学教員、高校教員、そして将来的には中学校教員を対象に、プログラミングとコンピューティングに関する研修を行うことを目指しています。
歴史
マティアス・フェライゼンとPLTは、1995年1月、プログラミング言語原理シンポジウム(POPL)の翌日にこの取り組みを開始しました。フェライゼンがライス大学の新入生と地元の公立学校の代数学カリキュラムを観察したのがきっかけでした。彼の目的は、関数型プログラミングを用いて数学を生き生きとしたものにし、コンピュータサイエンスの入門カリキュラムに設計知識を注入することでした。
この取り組みは、Lispの方言であるScheme言語のバージョンである PLT Scheme というプログラミング言語を使用して開始されました。
このグループは、いくつかの民間財団、米国教育省、国立科学財団から資金を調達し、以下のものを制作しました。
- 関数型プログラミングの初心者に適したソフトウェア
- コースウェア: カリキュラム、講義ノート、演習、ミニプロジェクト
- 教師研修キャンプ
10年間にわたり、約550名の教師を対象に、1週間の研修ワークショップを数十回実施しました。2005年には、TeachScheme!プロジェクトが記念ワークショップを開催し、24名の教師が生徒たちに自身の取り組みを発表しました。
2010年、PLTは主要プログラミング言語の名称をPLT SchemeからRacketに、DrSchemeをDrRacketに変更しました。その後まもなく、TeachScheme!をProgramByDesignに変更しました。
関数型プログラミング、コンピューティング、代数
ProgramByDesignの出発点は、小学校の算数の授業、そして中学校・高等学校の初等代数・代数の授業において、生徒たちがコンピュータとして行動するという観察です。教師は生徒たちにルールをプログラムし、演習を通して具体的な問題を解かせます。重要なのは、生徒たちが純粋に関数型のプログラムを実行することです。
生徒たちが関数型プログラムを作成し、それをコンピュータ上で実行する教師になることができれば、この内容を強化し、数学や関数型プログラムを記述することで、生き生きとしたアニメーションシーンやコンピュータゲームがどのように作成されるかを生徒たちに示すことができます。
次に例を示します。
( 2htdp/universeが必要) ( 2htdp/imageが必要);; 現在の時刻から画像を作成します( define ( create-image t ) ( place-image APPLE 50 ( * 1/10 t t ) SPACE ));; 基本画像の名前( define APPLE ( circle 3 "solid" "red" )) ( define SPACE ( empty-scene 100 100 ))(アニメーション作成画像)この短いプログラムは、小さな白いキャンバスの上から下へリンゴが落ちる様子をシミュレートします。3つの部分で構成されています。
- 数学における1行関数であるcreate-imageの関数定義。place-image、circle、empty-sceneを含む画像の代数が導入されていると仮定する。
- 代数のテキストで「x を 5 とする」のように、名前が何らかの値と等しくなる 2 つの略語
- プログラムを実行するための1行
教師は、代数学の授業でよくある関数と同じくらい簡単に create-image を説明できます。例えば、まず2行n列の表を描きます。各列の上部にはt、下部には適切な画像が配置されます。つまり、数字が左から右に向かって増加する場合、各画像上の赤い点は少しずつ下がっていくことになります。
最後に、アニメーション行は指定された関数 create-image を、0、1、2、3、…と、1秒あたり28ティックの速度で適用します。結果の画像は同じペースでコンピューターのモニターに表示されます。これが映画の作成方法です。
このような例に必要な背景知識は、映画制作に関する知識、DrRacketにおける画像の代数(数字の代数に似ています)、そして最低限の初等代数に関する知識程度です。しかし、ProgramByDesignプロジェクトは、子供たちは庭のタイルの数を数える代数式よりも、このようなライブ関数の方が楽しめると主張しています(Prentice Hallの8~9年生向け教科書を参照)。
ProgramByDesignプロジェクトは、伝統的な数学と理科の両方の授業にこのプログラミング形式を取り入れることでメリットが得られると提案しています。従来のBASICやVisual Basicのブロックを扱った教科書とは異なり、Racketのプログラムは数式と同じ行数で構成されます。そのため、数式とプログラム間の移動は簡単です。さらに、両者の意味は同じです。DrRacketの代数ステッパーを使えば、Racketが6年生や7年生の生徒が簡単な代数を使ってステップごとにプログラムを評価する様子を見ることができます。
プログラミング101における関数型プログラミング、コンピューティング、デザイン
ProgramByDesignプロジェクトは、プログラミング入門カリキュラムにおいて体系的な設計の役割に焦点を当てるべきだと強調しています。たとえ学生が二度とプログラミングをしなくても、問題解決への体系的なアプローチがどれほど役立つかを理解できるはずです。これは、将来プログラマー、医師、ジャーナリスト、写真家などになるかどうかに関わらず、役立つはずです。したがって、プログラミング入門コースは、現在流行している(そしてすぐに時代遅れになる)プログラミング言語の構文を学ぶ場所ではなく、幅広く応用できる何かを学ぶ場所であると認識されるべきです。
ProgramByDesignカリキュラムの重要な設計要素はデザインレシピです。これはプロセス次元とデータ次元という2つの次元から成ります。
プロセスの側面に沿って、生徒は、(単純な) プログラムを実行して他の人が使用できるようになるまでに、6 つのステップがあることを学びます。
- プログラムに入力され出力されるデータのクラスを記述することを目的として問題を分析します。
- 問題ステートメントを簡潔な目的ステートメントとして書き直す
- 目的ステートメントを説明し、成功の基準となる例を作成します。
- テンプレートやインベントリとも呼ばれる、与えられたものを整理する
- コーディング
- 例からテスト スイートを作成し、小さな入力でプログラムが適切に動作することを確認します。
テスト駆動開発と同様に、テストケースはテストの一部として後で作成されるのではなく、要件分析の一部としてコーディング 前に作成されます。
ほとんどすべての人間の努力は、問題を明確に理解し、成功の基準を定義し、利用可能なリソースと与えられた条件を分析し、提案された解決策を開発し、それを基準に照らしてチェックするという順序で行うことから恩恵を受けることができます。
たとえば、ジャーナリストも同様のプロセスから恩恵を受けます。つまり、記事の主要な概念を把握し、見出しを作成し、事例や具体的なデータを並べ、与えられた条件に基づいて記事を構成し、そのストーリーがどのように展開したかを把握し、執筆し、事実確認を行うのです。
データの次元は、「データの形状がコードとテストの形状を決定する」という格言でまとめることができます。たとえば、入力または出力データ型に 3 つのバリアントがある場合、テスト スイートには各バリアントからのテスト ケースが少なくとも 1 つ含まれている必要があり、プログラム コードにはおそらく 3 方向の条件 (明示的であるか、ポリモーフィック ディスパッチで非表示であるかに関係なく) が含まれます。入力または出力データ型に 3 つのフィールドがある場合、テスト スイートではその 3 つのフィールドに値を指定する必要があり、プログラム コードはその 3 つのフィールドを参照する必要があります。入力または出力データ型に単純な基本ケースと 1 つ以上の自己参照バリアントがある場合、テスト スイートには基本ケースと 1 つ以上の非基本ケースが含まれている必要があり、プログラム コードにはおそらく、データ型と同型の 1 つの基本ケースと 1 つ以上の自己参照ケースが含まれます。再帰のテクニックは、神秘的で恐ろしいものではなく、単に既に学習した方法を自己参照データ型に適用するだけです。
与えられたものを整理する作業とは、データの記述をプログラムの骨組みに変換する作業です。それぞれの記述形式は、特定のプログラム構成形式を決定します。この変換はほぼ機械的であり、生徒が課題の創造的な部分に集中するのに役立ちます。
『プログラムの設計方法(HTDP)』は、ProgramByDesignグループの中核メンバーが執筆した教科書です。[ 1 ]第3版が準備中です。[ 2 ]
プログラミング言語の選択
TeachScheme! という名称は、このデザインレシピには Scheme(現在はRacket)が必要であり、Scheme のみで教えることができると示唆しているように思われます。しかし、どちらの結論も正しくありません。PLT のメンバーとその研修生は、このデザインレシピをアセンブリ言語、C、Java、ML、Pythonなどのプログラミング言語、そして幾何学、生物学、詩の講座に応用することに成功しています。ProgramByDesign の基本的な考え方は、プログラミングをデザイン活動として強調することです。この誤解が、2010年に行われた名称変更の理由の一つです。
まず、ProgramByDesign プロジェクトでは、次の 3 つの重要な要素を作成しました。
- 設計レシピに一致しながらも、学生のレベルに一致するエラー報告を備えた、Racket の方言である、より強力で許容度の高い一連の教育言語 (たとえば、標準的な Racket では合法だが初心者の学生には必要のない多くのことは、初心者レベルではエラーとしてフラグが付けられます)
- 初心者に優しく、無料でダウンロードできる教育的なプログラミング環境、DrRacketという統合開発環境は、これらの言語レベルを強制します。
- カリキュラムは主に「プログラムの設計方法」[ 1 ]という本にコード化されており、その第3版が現在作成中である。[ 2 ]
Racketの選択は、Racketが(Javaに比べて)資金の少ない小規模チームにとって、仮説を検証するのに適した言語であるという彼らの信念を反映しています。PLTグループは常に、アイデアが他のコンテキストにも移植可能であることを保証するために尽力してきました。
Javaの場合
ここ数年、チームはカリキュラムの第2段階、つまりフェーズも作成してきました。このフェーズでは、同じ設計レシピのアイデアがJavaのような複雑なオブジェクト指向プログラミング言語にどのように適用されるかを示します。レシピはまず関数型パラダイムに適用され、次にポリモーフィズムや継承といったオブジェクト指向の概念を紹介し、最後に主流のJavaで慣用的に使用されている命令型メソッドを紹介します。
チームの一部は、全米科学財団から助成金を受け、大学や高校でフィールドテストを実施しています。 2007年、2008年、2009年、2010年の夏には、専門能力開発ワークショップが開催されました。このプロジェクトの一部は「ReachJava」と名付けられており、付随する書籍の仮題は「How to Design Classes」です。
ブートストラップ
2006年、ノースイースタン大学のPLTとボストンのCitizen Schoolsは、インナーシティの生徒たちに放課後プログラムを提供する共同の取り組みを行いました。Citizen Schoolsは、ボランティアと放課後プログラムの実施場所をマッチングさせ、計画されたカリキュラムでプログラムを開始させる全国規模の組織です。この取り組みの目標は、教材を6年生のカリキュラムに組み込むことです。ボストンでの最初の数回のテストは大きな成功を収めました。[ 3 ] [ 4 ]このプログラムが数学コースに与えた影響を受けて、MicrosoftとGoogleは全国規模の取り組みに資金を提供し、教師研修用の教材を開発し、テキサス州、カリフォルニア州、その他のボランティア都市にプログラム会場を開設しました。
参考文献
- ^ a b Felleisen, Matthias ; Findler, Robert Bruce ; Flatt, Matthew ; Krishnamurthi, Shriram (2018-01-06). 「プログラムの設計方法」 MIT Press . 2019-01-08閲覧。
- ^ a b Felleisen, Matthias . 「プログラムの設計方法、第3版」 . Felleisen.org . 2019年1月8日閲覧。
- ^ 「Bootstrapプログラムがロクスベリーとドーチェスターの中学生を育成」 Boston.com 2011年5月3日. 2011年9月29日閲覧。
- ^ Krishnamurthi, Shriram (2009年3月). 「スマートフォン向けMoby Schemeコンパイラ」ブラウン大学コンピュータサイエンス学部. 2019年1月8日閲覧。