プロジェクトの期間の半分ほどを過ぎていますが、ご支援は0件です。理由はいくつかあるかもしれません:- プロジェクトの説明の本文がわかり難い- ご支援額とリターンのバランスが悪い- リターンが魅力的ではない- そもそもこのプロジェクトに基づく企画が魅力的ではないといったところでしょうか。CAMPFIREにはその機能はないようなのですが、期間の半分程が過ぎてご支援が0件というところから、正直本プロジェクトを削除していいのではないかと考えています。本プロジェクトによるご支援の対象となる本企画の母体の講習会にも、本プロジェクトによるご支援の対象となる本企画にしても、興味を持たれないのであれば、そもそもやる意味がないのかもしれません。この30年ほどの資料を調べ、それらを元に課題案を並べ、またそれらを元に課題の内容を作ったのは結局無駄な労力だったのかもしれません。どのような理由であるにせよ、これまでにご支援をいただけるほどには興味をもっていただけなかったわけですから。プロジェクトの削除はできないとしても、プロジェクトの期間が終了するまでこのまま放置することも考え始めています。気分次第で活動報告になにか書くことはあるかもしれませんが、このプロジェクトとは関係のないものになるかもしれません。実際に放置するかは年内くらいに決めたいと思います。これまでプロジェクトの本文や活動報告を読んでいただいた方々にはひとまずお礼を述べさせていただきたいと思います。
「自己増殖型言語」にてこう書きました:>「プログラムを組むことができる」とはっきり言える人は、10個や20個のプログラミング言語は使えるでしょう。その全部を資料なしにというわけではないでしょうが。ならば、代表的と言えるような5,6個の言語すら検討できないというのは、好奇心の欠如か、能力の不足であるように思えます。教員の仕事が忙しいのはわかります。ですが、「だとしても」です。このように複数のプログラミング言語に触れる利点はなんでしょうか?同じような言語に触れていてもあまり意味はありませんが、考え方が違う言語に触れるということは、問題に対しての考え方を複数持つということに繋がります。そしてもちろん、言語あるいはパラダイムごとに得意な処理があるので、問題に応じて使い分けるという選択肢も得られます。以前、本プロジェクト、本企画の母体である講習会にて「C言語かN88-Basicを使えれば問題ないでしょう?」と仰った方がいました。N88-Basicは極端としても、講習会で聞く限り、プログラミング言語は1つ使えればいいと考えている方も少なくないようです。どちらも汎用言語ですから、その認識がまったく間違っているとは言えません。ですが、こっちの言語を使えばもっと簡単に問題を解けるという例はそこら辺にいくらでも転がっています。「教育用言語」において awk (gawk) を出したからですが、文字列処理をするなら awk (gawk) はかなり賢明な選択でしょう。同じようなことをC言語でやるとしたら、かなり面倒になることは想像に難くないと思います。このあたりは ruby でも Python でも構いませんし、どれだけ汎用なのかを考えれば、 ruby や Python を選ぶという選択肢もあるかと思います。ここで一つ重要なのは、すくなくともユーザー・レベルであれば、なにもかもを一つの言語で書いてしまうのではなく、複数のツール (どの言語で書かれているとしても) を組み合わせて処理をするという考え方です。これは unix の基礎的な考え方でもあり、今もって有効な考え方です。とは言え、本企画およびその母体の講習会では細かいところにまで入るつもりはありません。問題に対して複数の考え方がある、あるいは複数の考え方を繋ぎ合わせて処理をするという考え方があるというところに留めるつもりです。もちろん、「留める」とは言っても、それぞれの処理や処理の考え方を実現しやすい言語があるというところには触れます。しかし、それ以前に問題をどう考えるかが掴めていないと、このおおきな問題には入れません。そのためにこそ、特定の言語を用いるのではなく、そもそもの考え方を体験し理解したもらえるようにしています。興味を持っていただけたなら、ぜひご支援をお願いしたいと思います。
次回 (2019年 1月) の課題予定に「乱数で円周率を推定する」という課題が入っています。本プロジェクト、本企画、本企画の母体の講習会がどういう感じなのかをこの例で簡単に説明します。まず、円周率を求めたいという問題があります。これは代数的にも幾何学的にも求められますが、ここではシミュレーションを通して求めることにします。さてシミュレーションでどのように求めたらいいのでしょうか? まずは、πが含まれている式をともかく書き出します。この過程は、実はなくてもかまいません。あった方がわかり易いのでいれています。さて、その式を、 "π = なんとか" となるように変形します。この段階で、あるいはそれ以前から、正方形と円、あるいは正方形と四分円の面積の関係が見つかります。面積ということであれば、正方形と円、あるいは正方形と四分円をいくつかの区画に分割するという方法が見つかります。ここで乱数の出番です。縦横を仮にそれぞれ10分割し、計100個の区画に分けることとし、10面のサイコロを何回も振って、どの区画に入ったかを数えます。この過程で、円の中に入る場合と、円からは外れて外接する正方形には入る場合があります。円の中に入った回数と、円の中に入った回数+円からは外れ外接する正方形に入った回数から、円周率が推定できるわけです。ここでは10面ダイスを使いますが、これは一様な出目であることが期待されます。仮に6面ダイス2個の出目の合計を使うなどとなると、一様な出目にはならないことが期待されます。そこで、なぜ一様な出目であることを期待するのでしょうか。このあたりで乱数の性質についての話になります。また、得られる推定値はそれほど精度のいいものではありませんが、それはなぜなのか、そしてこの手法で得られる理想的な精度はどれくらいであり、その精度はどうしてそう言えるのかという話になります。また、シミュレーションにおける「理想的な結果」とはどういうものかにも触れます。このように体験を通して理解できることを目指しています。現在用意してあるテキストには上記の内容や手順が書かれています。なお、いろいろな定数や計算結果について、簡単ながらもいい精度を得られる計算方法がある場合もあります。円周率の場合 "355 / 113" が有名で、誤差が10^(-6) くらいの精度を持つ結果が得られます。 こういうものを求めるためにはまた別の知識が必要になるので、これについては "355 / 113" を紹介する程度に留めますが
lisp系とforth系にかならずしも限った話ではないのですが。lisp系とforth系が強く持つ特徴があります。それは自己増殖型言語であるという点です。Javascriptもその一種ではあります。これは、「ライブラリを書き溜めていく」というのとはまったく異なります。絶対とは言えませんが、多くの言語では言語そのものを別の言語にしてしまうようなことはできません。たとえば、"if" 文や "ループ" などの制御構造を新たに定義することはできません。(頑張ればどうにでもなりますが、コンパイラのソースやAPIを理解していないといけないなどの厳しめの条件がつきます。)その点、lisp系やforth系は、その言語仕様のままで新しい制御構造(あるいは制御構文)すら定義できます。lisp系やforth系が言語定義言語、あるいはメタ言語とも呼ばれる理由です (言語定義言語やメタ言語というのは耳慣れないかもしれませんが、コンパイラ・コンパイラ、あるいはメタ・コンパイラにすこしだけ似ているかもしれません)。そのような言語を用いる利点はなんでしょうか? たとえばそのような言語を10年間使い続けたとしましょう。その時間を活かした結果として、それぞれの児童・生徒の手元にはなにが残るでしょうか? おそらくは元の言語とはまったく異なる、各々の児童・生徒独自の言語でしょう。そして、どう考えれば、あるいはなにを考えればそれらができるかという知識と経験も残るはずです。この点において、こうも言えるかもしれません。「わかり易さとはわかり難いこと」だと。lisp系やforth系の言語は様々な機能が隠された言語あるいは環境に比べてわかり難いかもしれません。ですが、Scratchなどは見かけのわかり易さであり、lisp系やforth系言語は見かけのわかり難さです。「見かけこそが重要」という考え方もあるかもしれません。ですが見かけを超えれば、前者はわかり難く、後者はわかり易いのです。どちらを選ぶのがいいかは自明とも言えるでしょう。非常に多くのプログラミング言語が存在します。それらを一つ一つ検証し、どれを使っていくのがいいのかを選ぶのは大変な作業です。教員の方とそのあたりを話したこともありますが、「正直手に負えない」という感想をいただきました。そして、「だから文科省や教科書会社の推奨する言語を使う」とも。それでいいのだろうかとも思います。「プログラムを組むことができる」とはっきり言える人は、10個や20個のプログラミング言語は使えるでしょう。その全部を資料なしにというわけではないでしょうが。ならば、代表的と言えるような5,6個の言語すら検討できないというのは、好奇心の欠如か、能力の不足であるように思えます。教員の仕事が忙しいのはわかります。ですが、「だとしても」です。そして、手に負えないのであれば、児童・生徒の血肉になる言語を選ぶのが現実的には最善の方法であるように思えます。大学のプログラミング教育に用いる言語の選定においても、「社会に出た時に役に立つ言語を」と主張される方がいます。大学でのプログラミング教育はなんのためのものでしょうか? そこで「社会に出た時に役に立つ言語を」という基準は、本末転倒ですらあるでしょう。もちろん、そのあたりが合致している言語もありますが。プログラミング教育は、それがどういう形態で行われるにしても、なんのためのものなのかという根本について考えてみる必要があるかと思います。そして、本プロジェクト、本企画、本企画の母体となる講習会では、「プログラミング言語は必ずしも使う必要はない」という結論から出発しています。このような方法、あるは本プロジェクト、本企画、本企画の母体となる講習会が持っている知識・知見・経験に興味を持たれた方がおられましたら、ぜひご支援をいただければと思います。
多くのプログラミング言語がありますが、プログラミング教育に適した言語や環境はなんなのでしょうか?ブラウザがあれば動くからということで――最近はどうか知りませんが――、Javascriptが使われていたときもありました。ただ、Javascriptがプログラミング教育に適しているかというと、疑問になります。Javascriptで書かれたライブラリであったり環境であったりがいくつも存在します。それらの中身を見ていただくとわかると思いますが、Javascriptの基本的なところからはかなり離れたものになっていたりします。これはJavascriptの欠点という話ではなく、Javascriptにはそれだけの記述力があるということです。しかし、プログラミング教育においてその記述力は必要かという疑問があります。もちろん、学年によってはそこまでのことはやらないかもしれませんが、どこかで気づく児童・生徒はいるかもしれません。それに気づくと、もはや混沌の域に達してしまいます。ならば、記述力はない方がいいかというと、必ずしもそうは言えません。それだけの記述力がなくとも、充分に要は足りる場合がほとんどですが。また、Scratchなどグラフィカルなものが最近は多いようです。ここで考える必要があるのは、「グラフィカルである必要があるのか」という事柄です。これには、もちろん、キーボードを使えるかという問題が前提としてあります。物理的にキーボードを接続できるかどうかではなく、児童・生徒の技能としての話ですが。これはそれなりに大きな障害ですが、Scratchなどでもまったくキーボードを使わないわけではないので、乗り越えられる障害だと考えましょう。そこが問題でないとしたら、グラフィカルである必要性もかなり減ります。そうすると、最後は言語そのものが扱いやすいかどうか、理解しやすいかどうかということになるかと思います。この扱いやすさや理解のしやすさをうまく考える方法はないでしょうか?あることはあります。第一に、汎用言語であったとしても、あるいは特定目的の言語ではあっても汎用的につかえるとしても、その言語の目的そのものが明確であることを挙げたいと思います。この点においては、awk (gawk) を候補に挙げたいと思います。テキスト処理を目的とした言語ですが、汎用的にも使えます。第二に、言語そのものがシンプルであることを挙げたいと思います。これは、児童・生徒への教育用として、機能を隠す必要もないほどにシンプルであるということです。第三に、言語そのものに一貫性があることを挙げたいと思います。言語のシンタックスが、「こうも書ける、あぁも書ける」であるとか、「この場合にはこう書き、あの場合にはあぁ書く」というような、原則が弱かったり例外だらけだったりする言語は教育用には向かないかと思います。よけいなところで児童・生徒がつまづくだけではないかと思うからです。この第一から第三の条件から、lisp系とforth系におおむね限定されるかと思います (lisp系ではなく関数型言語という声もあるかもしれません。それももちろんありだと思います。Viscuitはグラフィカルですが、関数型と言えるかと思います)。lisp系とforth系には、上記とはことなる特徴もあります。それは文法として規定されているというような強い制約ではありません。しかし、どちらも「小さい関数やワードを積み重ねて、全体を構成する」という、ある意味では文化であり、ある意味では言語仕様です。これは、「問題をどう分析し、どう分解し、どう組み合わせるか」というプログラミングにおいて重要な思想です。付け加えるなら、第四に、直交性を挙げておきたいと思います。演算とデータ型が直観的に、自然な感じで、自由に組み合わせることができることと言っていいと思います。lisp系やforth系では、このあたりは弱点かもしれません。しかし、「型」や「オブジェクト」という概念が足止めになってしまうのであれば、それらを基本的には気にしなくていいものが望ましいでしょう。この点については、第一の条件の時に挙げた awk (gawk) を再度候補として挙げたいと思います。awk (gawk) は、それらの特徴だけではなく、「処理対象にこれこれの文字列があったら、これを実行する」という書き方をするのが基本です。これは実際のところは別として、イベント・ドリブンの考え方にも通じるのではないかと思います。awk (gawk) ではこれはできませんが、直交性の例としてこんなものを挙げてみたいと思います:Jun = 6 Jul = 7こう宣言した後に、"Jun + 1" によって、 "Jul" を求めたいとしましょう。ですが、それはできません。 "7" という答えが出てくるのみです。 "Jun" の次を求めたいのだから、 "Jul" が返って欲しいと思うのは不自然でしょうか? あるいは "7" を求めたい場合には "Jun + 1" とし、 "Jul" を求めたい場合には、たとえば "next(jun)" と書くとしたらどうでしょうか? ある面ではという条件がつきますが、シンプルさと一貫性、そして直交性の面から、直観的とは言えないかもしれません。もちろん、このくらいの例であればけっこうやりようはありますが。lisp系、foth系、あるいは awk (gawk) にしなければならないということではありませんが、それらがあまりに無視されているようにも思えます。ここに挙げた条件から、使う言語を考えてみるのも無駄ではないと思います。