本企画で目指す教材では、アルゴリズムよりもデータ構造に重きを置くと本文で書きました。ですが、データ構造とだけ言ってもわかりにくいかもしれません。そこで、基本的なデータ構造を紹介したいと思います。 まず、一つの値だけを保持するものがあります。これを次のように図示します: これ以降は、形や詳細はともかく、この「一つの値だけを保持するもの」のいろいろな組合せになります。 それらの最初のものとして、配列を見てみましょう: これは、横方向と縦方向に並んだ2次元の配列です。横方向だけ、縦方向だけに並んだ1次元の配列もありますし、3次元以上の配列もあります。先の「普通のバブルソートと普通ではないバブルソート (未掲載)」の後者における “pat” は、3次元配列の例です。また、上の図のように直接的な形での配列に限らず、配列の配列、配列の配列の配列などとして2次元以上の配列を実現する方法もあります。なお、情報にかかわる人は「多次元空間」という言い方を普通にしますが、それはただの配列、とくに4次元以上の配列を指しているだけだったりします。 配列は、 “matrix[1][2]”のように、数値の添字で要素を指定します。それに対して、名前で指定するもの、あるいは変数をまとめたものに、レコードがあります。図示すると次のようになるでしょう: なお、オブジェクト指向の考え方にはいくつかあるのですが、その一つとしてレコードを拡張したものというものもあります。この場合、オブジェクトは次のように書けるでしょう: 配列やレコードには、すこし特殊なものがあります。配列は “matrix[1][2]” のように数字の添字で要素を指定します。レコードの場合は、 “record.first” のように、レコードの名前と、レコードを構成する変数の名前で要素を指定します。もし、“a["first"]” と書くような、これらが合さったようなデータ構造があったとしたらどうでしょうか。そして、もちろんそういうデータ構造は存在し、連想配列、あるいはハッシュと呼ばれます。これを図示すると、こうなるかもしれません: 次に、すこし複雑になりますが、よく使われるものとして木構造というものがあります: この図では左右のバランスが取れていますが、バランスは取れていなくてもかまいません。 木構造は、要素の親子の関係がはっきりしていますが、その部分をもっと柔軟にすると、グラフというデータ構造になります: グラフにおける要素間の繋がりには、方向があるものと、方向がないものがあります。 また、要素間の繋がりが輪の形になると、リングになります: リングは、リング・バッファなど、グルグル回りながらデータを書き換えていったり、データを読み出したりするようなものにも使われています。 リングのどこかを切って、切り口の片方をデータの入口とし、もう片方をデータの出口とすると、キューになります: これは、「最初に入ったデータが、最初に出る」ということで、“First In, First Out”、略して “FIFO” と呼ばれたりもします。 それに対して「最初に入ったデータが、最後に出る」というデータ構造もあり、スタックと呼ばれています。 “FIFO” に対応するような呼び方としては、“First In, Last Out”、 略して“FILO” などと呼ばれもします: 最後になりましたが、重要なデータ構造としてリストがあります。図示すると次のようになります: lisp系の言語では、細かい話を除けば、データ構造としてはこのリストしか存在しません。しかし、このリストで、これまで述べたデータ構造の全てを、配列も含めて実現できます。もちろん、配列でも同様に、これまで述べたデータ構造の全てを実現できます。ですが、基本的には、配列はその大きさが固定されています。対してリストは、大きさが可変だという特徴があります。 これらはあくまで基本的なデータ構造、あるいはその概略です。これらをどう用いるかにはかなりの自由度があったり、あるいは目的に対して向き不向きがあったりもします。これらのデータ構造に親しむことで、どのようなデータ構造とアルゴリズムの組合せでプログラムを書くと問題を解き易いのかがわかりやすくなったりもします。言い換えれば、アルゴリズムのみを考えることでプログラミングを行なうことはできないとも言えます。 プログラミング教育の必修化においては、必ずしもプログラミング言語を教えたり、使ったりする必要はありません。ですがプログラミング言語によって、扱い易いデータ構造があったりもします。ですので、教諭はいくつかのプログラミング言語をある程度習得していると、授業にも幅がでるかと思います。プログラミング言語と言えば、マニュアルを参照しながらでいいので、5個や10個のプログラミング言語を使えるのがあたりまえです。その程度を使えないなら、教諭と言えど知的障碍を疑ったほうがいいでしょう。正確には、怠慢と言うほうが適切でしょうけれど。 本企画においてデータ構造を重視するのには、そのような理由があります。アルゴリズム一辺倒でのプログラミング教育は、はっきり言えば誤った方向を向いていると言えるでしょう。 保護者や教諭の方々は、面倒と思わずにコンピュータ・サイエンスを勉強して欲しいと思う。kuzu/NULLでは、本企画のリターンとは別に、その要望に応える準備がある。
『アルゴリズム+データ構造=プログラム』 〔N. ヴィルト, 日本コンピュータ協会〕という古典的著作がある。 また、「Logic + Control = Algorithm」と言われることもある。 これを合わせると「Logic + Control + Data Structure = Program」となる 前回も引用したが、再度引用しよう:「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」には、こうあります:| ○ プログラミング教育とは、子供たちに、コンピュータに意図した処理を| 行うよう指示することができるということを体験させながら、発達の段| 階に即して、次のような資質・能力を育成するものであると考えられる。|| 【知識・技能】| (小)身近な生活でコンピュータが活用されていることや、問題の解決に| は必要な手順があることに気付くこと。| (中)社会におけるコンピュータの役割や影響を理解するとともに、簡単| なプログラムを作成できるようにすること。| (高)コンピュータの働きを科学的に理解するとともに、実際の問題解決| にコンピュータを活用できるようにすること。|| 【思考力・判断力・表現力等】| ・ 発達の段階に即して、「プログラミング的思考」(自分が意図する一| 連の活動を実現するために、どのような動きの組合せが必要であり、一| つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、| 記号の組合せをどのように改善していけば、より意図した活動に近づく| のか、といったことを論理的に考えていく力) [5]を育成すること。|| 【学びに向かう力・人間性等】| ・ 発達の段階に即して、コンピュータの働きを、よりよい人生や社会づ| くりに生かそうとする態度を涵養すること。|| [5] いわゆる「コンピュテーショナル・シンキング」の考え方を踏まえつ| つ、プログラミングと論理的思考との関係を整理しながら提言された| 定義である。 ついでに、同文書から、これも追加しておこう: | [13]反復記号なども含めた音楽に関わる用語には、順次、分岐、| 反復といったプログラムの構造を支える要素と共通する性質| があるものと考えられる。 ここで問題になるのは、「一つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、」である。 「Logic + Control + Data Structure = Program」においては、多くのプログラミング言語における “statement” は現われていない。ここでの「一つ一つの動きに対応した記号」が、 “statement” であるなら、「どのように組み合わせたらいいのか」は “Logic” に対応するかもしれない。 では、この場合、 “Control” に対応するものはなんなのか? “[13]” にあるように、「順次」、「分岐」、「反復」ではあるだろう。だが、それは “Control” の一面にすぎない。たとえば、「再帰」もあれば、「カット」などもある。「カット」について言えば、Prologの「ホーン節」はそのまま “Logic” でもあり、 “Control” でもあるのかもしれない。 このように、ほんの一面とはいえ、 “Control” は含まれているとしよう。では、 “Data Structure” に相当するものはなんなのか? “[13]” には「プログラムの構造」とあるが、こがデータ構造を意味していないことは明らかだ。文書を読む限り、見落しでなければデータ構造に関する言及はない。言及がないということは、そもそも想定の範囲に入っていないか、不要と判断したかとういことだろう。 ここに違和感を感じる。というのも、情報工学の専門家が、はたして議論に加わっていたのかという疑問だ。情報工学の専門家が議論に加わっていたとして、かつデータ構造の話をしたものの、他の有識者からは無視されたという可能性もある。この場合であれば、他の有識者にはデータ構造の重要さが理解できなかったということだろう。そうであれ、そうでないであれ、データ構造を無視している議論に意味はない。なぜなら、「Logic + Control + Data Structure = Program」であるからだ。 そして、私のプロジェクトではないが、「CSの定番教科書「Open Data Structures」を日本にも届けたい!」のような書籍がなぜ存在し、またこのようなプロジェクトがあるのか。それ自体がデータ構造の重要さを示しているとも言えるだろう。 このような有識者会議が出した意見には、参考にすべき箇所は存在しない。言うなら、「この方針だけは−−全部ではないとしても−−、避けるほうがいい」という参考にはなるかもしれない。 保護者や教諭の方々は、面倒と思わずにコンピュータ・サイエンスを勉強して欲しいと思う。kuzu/NULLでは、本企画のリターンとは別に、その要望に応える準備がある。
小道具についての本文での計上は次のようになっています: >60,000円: 小道具の準備費:> トランプ、パズル、ゲームなど。いずれも教材用:> 1,000円 x 10個 (講習の参加人数) x > 5種類 (講習に用いるパズルやゲームの種類)。> 5種類のパズルやゲームから3個を目途に、教材に反映するものを選びます。 >100,000円: 小道具制作費: 実際のところ、本文ではトランプを使うと想定している課題ですが、トランプでは正直枚数が足りません。クラブは1〜13、ハートは14〜26として使うことも可能ではありますが、単純にわかりにくくなります。また、数当てゲームにおいては、トランプのカードは制限がきつく、やりやすいものではありません。 そこで、トランプにしても実際にはこちらがデザインした数字を印刷&可能ならラミネート加工したものを用意したいと考えています。 本文にある迷路にしても、印刷で済ますこともできますが、その場合あまり多くの種類は用意出来ません。ここも、迷路の経路が可変な玩具を用意したいと考えています。 グラフに関係して、これも印刷で済ますことは可能ですが、場所と橋が用意されている玩具、あるいはゲームを準備したいと考えてます。 オートマトンについては、なにか実例をつくり、その動作を確認する教材を用意したいと考えています。 トランプ、パズル、ゲームなど、および小道具制作費と書くと、あまり金額はいらないのではないかと思わるかもしれません。ですが、実際のところ結構シビアな計上になっています。 ですので、ぜひご支援いただき、児童・生徒にプログラミングの講習を受ける機会を用意させていただきたいと思います。
資料を読んでいると、「プログラミング的思考」という謎の言葉が現われる。これについて、「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」には、こうあります:| ○ プログラミング教育とは、子供たちに、コンピュータに意図した処理を| 行うよう指示することができるということを体験させながら、発達の段| 階に即して、次のような資質・能力を育成するものであると考えられる。|| 【知識・技能】| (小)身近な生活でコンピュータが活用されていることや、問題の解決に| は必要な手順があることに気付くこと。| (中)社会におけるコンピュータの役割や影響を理解するとともに、簡単| なプログラムを作成できるようにすること。| (高)コンピュータの働きを科学的に理解するとともに、実際の問題解決| にコンピュータを活用できるようにすること。|| 【思考力・判断力・表現力等】| ・ 発達の段階に即して、「プログラミング的思考」(自分が意図する一| 連の活動を実現するために、どのような動きの組合せが必要であり、一| つ一つの動きに対応した記号を、どのように組み合わせたらいいのか、| 記号の組合せをどのように改善していけば、より意図した活動に近づく| のか、といったことを論理的に考えていく力) [5]を育成すること。|| 【学びに向かう力・人間性等】| ・ 発達の段階に即して、コンピュータの働きを、よりよい人生や社会づ| くりに生かそうとする態度を涵養すること。|| [5] いわゆる「コンピュテーショナル・シンキング」の考え方を踏まえつ| つ、プログラミングと論理的思考との関係を整理しながら提言された| 定義である。 まず、 “[5]” において「プログラミング的思考」についての注が付されている。だが、その注に書いてあるとおり「踏まえつつ」であることに注意してほしい。つまり、ここでは「誰も提唱していない事柄を、何の根拠もなく、ここで採用している」のだ。これは、良く言っても詐欺、あるいは権威を利用した誘導であるにすぎない。もちろん、最悪の場合、そもそもの論文(後述)を理解できなかったという可能性も否定できないが。 なお、「コンピュテーショナル・シンキング」という用語は、元々はシーモア・パパートによる用語だが、広く知られるようになったのは、2006年のJeannette M. Wingによる論文とのことだ。 さて、ここで「踏まえつつ」というのが、元の論文とどれほど違うのかを見てみよう。このリンクは林 向達氏によるWingの論文の翻訳だ。ぜひ一読して欲しい。専門用語が入っているが、上に書かれている「プログラミング的思考」とは、まったくの別物であることはわかるかと思う。「誰も提唱していない事柄を、何の根拠もなく、ここで採用している」と書いたのは、つまりはそういうことだからだ。 また、『図解 プログラミング教育がよくわかる本』〔石戸 奈々子, 講談社, 2017.〕のp. 14にはこのような箇所がある:| なぜ? どうして?| ロボットをつくり、「まっすぐ歩く」という動きをプログラミングしたの| に、その通りに動かない。理由を考える また、p. 15には明確にこうある:| 自然に試行錯誤ができるという特徴もあります。 ここは上記のこの部分に対応すると見ていいだろう:| 自分が意図する一連の活動を実現するために、どのような動きの組合せ| が必要であり、一つ一つの動きに対応した記号を、どのように組み合わ| せたらいいのか、記号の組合せをどのように改善していけば、より意図し| た活動に近づくのか、といったことを論理的に考えていく力 これは一面において試行錯誤とも言えるだろう。だが、すくなくともプログラミングにおいては必要な試行錯誤と、不要な試行錯誤が存在する。『図解 プログラミング教育がよくわかる本』の例であれば、それはデバグの範疇であり、不要な試行錯誤の一例である。 つまるところ、「自分が意図する一連の活動を実現するために [略]」の部分は、「コンピュテーショナル・シンキング」においては、「論理的分析」と、「プログラムがきちんと動くことを論理的に証明」において試行錯誤した上で、実際のコーディングにいてはデバグも必要になるというものだろう。 この二つの試行錯誤はまったく異なるものであることについては、説明は不要だろう。 また、上記「小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)」においても、『図解 プログラミング教育がよくわかる本』においても、「論理的に考える力」というような表現がなされている。これはわざわざ書くまでもないことだと思うが、想定されている「プログラミング教育」において、「論理的に考える力」は身につかない。数十年前だろうか、「プログラミングを憶えると、数学ができるようになる」という話があった。大学生なら具体的なイメージを見るためにそういうこともあったかもしれない。だが、小中高においては、そんなことはまったくない。もちろん、個人の興味によってさらに勉強する児童・生徒については別扱いだが。 この点について見ると、小学校などの授業へのICTの導入に際して言われていたことを思い出さないでもない。というのも業界団体の主導的立場にある人は、「とにかく導入すればいいんだ」といい、twitterにてその後のこと、つまりどう使うのかなどについて訊ねたところ、twitterにてブロックされた経験がある。 今回のプログラミング教育の必修化 (単独の教科になるわけではないが) においても、似たような雰囲気を感じると言えば勘繰りすぎかもしれない。だが、導入が前提であり、内容はおざなりである点は似ているように思える。 また「分割統治」と言えば、プログラミングの経験のある人はイメージするものがあるだろう。だが、資料を読む限りにおいて、ここでいわれている「プログラミング教育」における、「問題を分割し」とは、上にも挙げたが、このようなもののようだ:| 自分が意図する一連の活動を実現するために、どのような動きの組合せ| が必要であり、一つ一つの動きに対応した記号を、どのように組み合わ| せたらいいのか、記号の組合せをどのように改善していけば、より意図し| た活動に近づくのか、といったことを論理的に考えていく力 つまり、「問題を分割し」というのは「分割統治」のことではないようだ。これもまた、本来の「コンピュテーショナル・シンキング」とは異なる箇所だろう。一枚フィルターを通すと台無しになる例のような気がする。 現状、あるいはすでに遅いかもしれないが、児童・生徒の保護者や教諭の方々は、ぜひ「まっとうなコンピュータ教育を」と声を挙げていただきたい。もし、「コンピュータ・サイエンス」などを勉強するのは面倒だというのなら、それはそれでしかたがないが。だとしたら、せめて抽象概念の操作に長けた児童・生徒の邪魔をしないで欲しいと願うのみだ。なお、kuzu/NULLのサイトをご確認いただき、よろしければ声をかけていただければと思う。本企画のリターンとは別物として、対応する準備がある。
「コンピュータを使わない、コンピュータとプログラミング入門」の講習を行ないます。 日時: 2017年 9月 10日 13:00〜16:00 場所: 大月市 市立図書館 会議室 見学も歓迎します。 保護者、見学者、また成人以上の参加者とは、終了後、近くの喫茶店、あるいはカラオケボックスで事後ミーティングのようなものができたらと考えています。