大学生などを対象にしたプログラミング教育の教科書などでは、疑似コードが用いられます。疑似コードとはなにかについてはこちらをご覧ください。いくつかスタイルがありますが、Pascal-likeなものが多く使われています。問題の分析とアイディアをコードの形にする際に使われます。これは日本語 (あるいはもちろん他の日常で使われる言葉) でも構わないのですが、「意味するところ」を明確にするために、疑似コードが用いられます。疑似コードは、プログラムのなにもかもをそれで書くことは意図していないので、通常疑似コードと日常の言葉とを合わせて使います。明確にしたい箇所は疑似コードで、それほどでもないところは日常の言葉でという具合です。疑似コードは教科書で使うためなどの理由もあり、そもそもそれ自体は動かなくて構わないのですが、実行系が存在する場合もあります。とくに、特定の言語を適切に制限した形の場合、元の言語の実行系で動かすことも可能である場合があります (日常の言葉を含まない場合)。その例というわけではないのですが、プログラミング教育の初期にはScratchやそのコピーであるSmalrubyが使われます。いずれも普通のプログラミング言語でできることはおよそできるのですが、教育現場やプログラミング教室の現場においては、命令を表すブロックをどう組み合わせるかというパズルとしての活用が多いようです。文部科学省の指針においては、「プログラムを試行錯誤によって作る」という記載がありますが、例や実践例を見ると、それはまさしく「パズルとしてのプログラミング」を指しています (個人的にそうではない方法を取っている方もいます)。本プロジェクト、本企画および本企画の母体となる講習では、そのような立場を否定します。つまり:- 問題を分析する -分析からデータ構造とプログラムをデザインする- コーディングする- コードを検証するとなります。ここにおいて、本プロジェクト、本企画および母体となる講習においては独自の疑似コードを用います。その簡単な説明についてはこちらをご覧ください。これはペラにまとめたもので、フル仕様ではありません。このペラの仕様では次のものを定義することはできません:loop i in リスト : 中身;loop 条件あるいは値あるいは変数 : 中身;これはそちらの疑似コードがフル仕様ではないためです。フル仕様 (もちろんまだ設計中ですが) "loop" という命令が取る引数の違いにより、実行される部分が異なるという定義が可能です。これは両方とも "loop" という命令を使っていますので、むしろわかりにくいかもしれません。その場合は次のようにすることも検討しています:loop/for i in リスト : 中身;loop/while 条件あるいは値あるいは変数 : 中身;この場合であれば、オブジェクトのメソッドないしリファインメントの違いとして、公開しているペラの仕様でも定義可能になります。また、これに加えて ――そのすべてではないとしても――、文芸的プログラミングの考えも導入したいと考えています。本企画では、この疑似コードのフル仕様をより十分なものとし、同時にペラ版の仕様にも反映し、可能であれば形態はともかく実行系の実装も行ないたいと考えています。しかし、目的はあくまで分析結果にもとづくデザインの理解のしやすさである点は変えずにいきたいと考えています。
現在用意してある課題および課題案23個の内、13個はこのようになっています。本プロジェクトおよび本企画の母体が2年弱で用意し選んだものの一部です。なお、6x6オセロについては先にも書きました。6x6オセロの課題は考えたことを記録することに慣れてもらう、および記録を分析することに慣れてもらうことにも使いますが、ゲームとしての扱いも課題として行ないます。なぜ普通の8x8のオセロではないのかというと、講習の時間の関係から盤面や手の数を減らしたいためです。 8x8 - 4 = 64 - 4 = 60手かかりますが、 6x6 - 4 = 36 -4 = 32手となり半分くらいの手の数になり、おおまかな見込みとして一局の対戦も半分くらいの時間になると想定できます。これにより、二局の記録を取る、それを分析するなど、特定の対局に限らない例が使えるようになることを想定しています。小道具についてですが、最初の頃に用意した「迷路」の課題での小道具はこのようなものでした。これではわかりにくいですが、迷路の入り口、出口、分岐点と行き止まりに紙のタグを貼った紐でできています。現在のものも大きな違いはなく、紐が太くなりタグが大きくなっているくらいです。この小道具がなんの役に立つかというと、迷路を入り口、出口、分岐点、行き止まりとそれらの繋がりとして表現できるということがまずあります。加えて、入り口と出口は必ずつながっているため、入り口と出口のタグを持って引っ張ると、その経路が物として見えるという理由もあります。一種のアナログ・コンピューティングですが、現在のプログラミング、あるいはコンピューティングが基本的にはデジタルであることに対して、そうではないプログラミング、あるいはコンピューティングもあることを示すことができます。上の写真のものだと、一回ひっぱるとタグがいくつかちぎれかけるという問題もあり、現在はその補強も含めてすこしだけ改善されたものになっています。また、迷路を入り口、出口、分岐点、行き止まりとそれらの繋がりとして表現できることを示すと、一回アナログ・コンピューティングとして解いた後には (再現には時間がかかるので)、これを使い (あるいは使わなくても)、迷路は木構造として表現することも可能であることを示すこともできます。本プロジェクト、本企画の母体となる講習では古い資料も掘り出しましたが、このアナログ・コンピューティングの例に限らず、すでに忘れられた知識をいくつも発掘しました。たかだか30年ほどの資料なのですが、現在のプログラミング教育の資料や、プログラミングに関しての教室などにおいては、それらの知識のどれほどが忘れられているのかには驚くほどでした。本プロジェクト、本企画、あるいは本企画の母体となる講習では、それらの中から依然として有用であるようなものも取り上げていきます。小道具については、上の紐の例では簡単な手作りでなんとかなりますが、他の小道具はアナログ・コンピューティング関係のものに限らず、なかなか素人の手作りというのも難しく、専門の方に作っていただく、あるいは加えてそもそも図面を引いてもらう必要もあります。このようなことにも興味を持たれるようでしたら、ぜひご支援をいただけたらと思います。
本プロジェクトの成否にかかわらず、2019年2月の講習会から新たなサイクルを回したいと思います。まずは、プログラミング言語にどういうものがあるのかからスタートです。これは1月に予定している「そこにあるデータを計算する」とも関連する内容です。2月からのサイクルでは、これまでに用意してある内容を各回にどう割り当てるか、またまだ用意していない内容の資料の追加、そして既に用意してある資料の改訂を行なっていきます。最終的には、2020年の2月には資料 (集) の草稿の第一稿をとりまとめる予定です。
本プロジェクトおよび本企画の母体となる、次回の予備的な講習会を、2019年1月5日(土)の13:30〜16:30に開催いたします。課題は、「乱数で円周率を推定」と、「そこにあるデータを計算する」です。
本日講習を開催してきました。参加という形での参加者はいませんでしたが、ちょくちょく覗いてくれる方に来ていただけました。問題の分析などにノートを使うということはすでに承知の方なのでノートは持参されており、前説的なものはなしで、こちらが構築しておいたチューリング・マシンを転記し、動くことを確認していただきました。その際に気づいたのですが、状態を示すのに6面ダイス(いわゆる普通のサイコロ)を使いましたが、持っている数が多少心もとないかもしれません。題材によるのですが、6面、8面、10面のダイスを補充しようかと思います。(TRPGが趣味なので、それなりに持ってはいるのですが、これまでの参加人数が多かった時を考えると心もとない数です。)その後、sedで足し算(超簡略版)などの記事を読んでもらい、簡単な説明をしました。これについては、sedをまず覚えないといけないという、ちょっとしたハードルがありますので、講習で扱うかどうかはわかりません。sedを見てもらったということもありますが、その後、本企画あるいはそれ以外でもプログラミング言語を扱うとしたらどの言語を使うかという話になりました。いろいろあるわけですが、androidにgforth (GNUによるFORTHという言語の実装) があるので、それを見てもらいました。よく見かけるプログラミング言語とは多少見た目が違いますが、プログラミング教育に使う言語として悪くはないと私は考えている言語です。詳しいところまでは説明しませんでしたが、forth自身でforthにオブジェクト指向を導入できるなどなどの自己増殖性や、forthにある思想に触れたところ、興味を持っていただけたようです。