kolmas.tech note

雑記と思索、偏った技術の覚え書き

電車平仮名カード

電車好きの自閉傾向長男に平仮名を覚えさせようと、随分以前に作ったものの紹介。

お手製電車平仮名カード、山手線の部。子供らには「ひらがなカード」と呼ばれている。

自閉傾向長男の療育の中で、PowerPointのスライドにひらがなを大きく表示して見せて、声と合わせてその読みを教えたり、三文字程度の単語を読むか読ませるかしながらその対象の写真を切り替えて見せたりする事で、ひらがなを読む能力を獲得させんとするものがあった。継次的刺激ペアリング手続き、と呼ばれる手法らしい。ただ、長男の反応は正直な所いまいちであった。これに対して、長男の好きな主題で似たようなものを作ったら好んで取り組んでくれるのではないかと思い立った。

長男が明確に好きな主題と言ったら電車である。それも新幹線ではなく、在来線、しかも普通列車用車両を好む。関東圏のJR沿線に住んでいることからJRの在来線車両を見る機会がよくある他、本を見せて教えた1結果もあり、見た目に区別しやすいJR東日本普通列車用車両については概ね路線名を言える。これを題材にしない手はない。

作成過程

カードは以下のように作成。

  1. 扱う路線を選定。長男がよく知っている路線の他、JR東日本管内の路線をいくつか選ぶ。今回は分かりやすさのため、濁点・半濁点・捨仮名を含まない路線名に限定。また、見た目で区別出来るように、その路線に固有のデザインの車両を持つ路線に限定。
  2. 当該路線を走る普通列車用車両の写真を選定。Wikimedia Commonsから調達2する。
  3. 右半分に同一サイズにトリミングした電車の写真、左半分に平仮名一文字のPowerPointスライドを作る。山手線であれば、同じ写真で「や」「ま」「の」「て」「せ」「ん」の六枚を作成。フォントは将来の書字への発展を期して教科書体。
  4. A4用紙に印刷してラミネータにかける。パンチで穴を開け、路線毎にリングで束ねて出来上がり。

作成したスライドをPDF出力したもの3は以下である。利用している写真素材のクレジットもPDF中に記載している。

まず試しに作ってみた、ということもあり、全ての平仮名を網羅している訳ではない。「を」は流石にどうしようもないとしても、濁点・半濁点・捨仮名を除外する縛りが案外とキツい。以下ページを参考に路線をピックアップした。 www.chikipage.net 上掲スライドに含まれているものでは、例えば青梅線4などはかなり厳しい。中央線を知っている長男は、最初見た時に当然「ちゅうおうせん」5と言ってきた。「先頭にこの黄緑の丸6が付いているのは青梅線」と言って丸め込んだが、鉄道に詳しい方に聞かれたら怒られるに違いない。他にも、羽越線米坂線辺りは全く自信がない。自信はないが、その辺も入れないと平仮名の幅が増えない。

その他、作って利用してはいるものの、紛らわしさがあるので上掲のPDFからは除外している路線もいくつかある。例えば大船渡線7である。キハ100系の写真を入れているのだが、キハ100系、同じ塗装であちこちのローカル線を走っているせいで、それら他路線を選定できなくなってしまった。 ja.wikipedia.org

実際に使ってみて

カードの見た目の長男からの第一印象はとても良かった。長男向けに作ったものだが、次男にも気に入られた。好きな電車の写真を大きく載せているのがやはり良いらしい。今でも時々、二人とも「ひらがなカードやる」と声を掛けてきてくれる。

まず最初に行ったのは、私の方が一枚ずつカードをめくりながら、対応する平仮名を一文字ずつはっきり読み上げる事である。冒頭掲載の山手線の部であれば、まず最初に「や」と言い、素早くめくって「ま」、まためくって「の」、、、と言った具合である。この時、少し大袈裟なくらいはっきりくっきり、大きめの声で読み上げる事が重要だと思う。その話は以前のエントリにも書いた。もちろん、子供らが写真だけでなく隣の文字にも目線を向けているかは意識しないといけない。

次の段階は、この一文字ずつの読み上げを私と子供らで一緒に行う事である。題材が子供らの大好きなものだからか、この段階にはすんなりと進む事ができた。さらにそこから進んで、私と子供らで交互に一文字ずつ読んだり、さらには私が一切読まなくても、促す事で一文字ずつ声を上げる事が出来るようになった。

ただ、この段階に来て長男と次男で差が出てきた。現状の様子から述べると、丁度満三歳になったところの次男は、この電車平仮名カードに含まれていないものも含め、概ね全ての平仮名が読めるようになっている。電車平仮名カードをやっているうちに、平仮名を読む事自体にも興味が出てきたようで、下掲の平仮名と電車の本を妻や父8に読んでもらって概ね覚えてしまったようである。たまに「き」と「さ」を間違えたりもする9が、その間違いが出るという事はつまり、場面で音を覚えているのではなく、ちゃんと文字を読んでいるという事である。

一方で長男は、まだその段階には到達していない。最近、カードをめくる時に文字ではなく写真の方に視線が向いていて、文字を読んでいるというよりも知っている電車の名前を読み上げている、即ち先の表現で言うところの「場面で音を覚えている」節がある。文字を読むことにはまだ興味が薄いのだろう。ただそれでも、頻出する文字10や、特に好きな路線の文字であれば、文字だけでも読めるものもあるので、一定程度の効果は出ているように思う。

今は、先の使い方に加えて更に、カードの左下に小さく書いておいた単語としての路線名を読ませる、ということも時々試している。次男については、文字を読むことから更に進んで、文字の連なりを順に読むことで語や文になる事を理解させるのが目的である。長男については、上述の通りカードをめくりながら路線名を一音ずつ読むという場面を覚えてしまっている節が見受けられるので、今一度文字を意識させるため、やり方を変えてみる試みである。


  1. 親である私自身も、鉄分が濃いとはとても主張出来ないものの、鉄道が好きなので。
  2. 有り体に言えば、Wikipediaの当該路線記事から良さそうな写真を見つけてきた。記事更新により今は当該記事から参照されていないものもあるが。
  3. 公開用の注意書きを付けてある。
  4. 「め」が欲しかった。
  5. 尚、中央線は捨仮名「ゅ」を含むので除外されている。
  6. 「東京アドベンチャーライン」のヘッドマーク
  7. 「ふ」と「な」が欲しかった。
  8. 私の父、即ち子供らにとっては祖父。
  9. 間違いに気付いて自分で訂正することもある。
  10. 例えば「せ」と「ん」

負に正を乗じると負が増す

大学生の頃、「教科書や授業などによる旧来型の学習は人の知識を加算で増やし、ウェブは人の知識を乗算で拡張する」という事を言っている人がいた。ここでいう「ウェブ」は、検索エンジンを使って何かについて調べる、という事を主に指している。この発言が誰のものだったのかは思い出せない。その人も、別の誰かからの聞きかじりだったのかもしれない。

これは盲目的にウェブを礼賛する話ではない。加算に対して乗算というと、そちらの方がより効率的に知識を増大させるものだと聞こえるかもしれない。確かにその側面もあるが、その一方で乗算とは、0に何を乗じたところで0のままだし、負に正を乗じると余計に負が増すものである。その特徴まで踏まえての、冒頭の発言なのである。今時の流行りも含めれば、生成AIに質問して答えてもらう、という事についても同様の議論が成り立つだろうと思う。

「何が分からないのかが分からない」

何か分からない事ついて調べるにあたって、ウェブ、ひいては検索エンジンを使うというのは今日日ごく当たり前に行われている事である。最近であれば生成AIもまた同様である。これらは、何が分からないか特定出来ていて、さらにそれを言語化することも出来ていれば、極めて強力なツールである。分からない事が解消されれば、出来ることが増える。出来ることが増えれば、その中でまた分からない事が出てくる。それが解消されれば、、、と繰り返していく事で、出来ることを主体的にどんどん増やしていける。まさに複利のよう、乗算的アプローチである。

ただしこれは、本節冒頭の条件「何が分からないか特定出来ていて、さらにそれを言語化することも出来ていれば」の話である。実際にはこれが結構難しい。プログラミング入門の非常勤講師時代の肌感覚を思い起こせば、何が分からないかを分かって質問してくる学生は相当に優秀である。そのような学生には少し指針を示してやれば、自分で講義資料を見返したり、それこそウェブ検索したりして、自力で疑問を解消できる。実際には、何かが分からなくてプログラミングの手が止まってしまった学生の大多数は、何かが分からないことは分かっているものの、それが何なのかは分かっていない。講師であるところの私、すなわち教えていることの全景が見えている側から彼らの話を聞いたり様子を見たりすると、どこが分からなくなっているポイントなのかは一目瞭然に分かるのだが、当事者からするとそれが見えていないのは普通1である。

だからこそ、学習しようとしている対象の全景が見えてくるまでは、その全景が見えている立場が学習者に寄り添っていることが必要であると思う。典型的には教員がそれにあたるだろうが、別に必ずしも人である必要はない。人である事の利点は、上記のように何かが分からなくなった時に雑な質問が出来る事である。それを脇に置いておくなら、全景が見えている立場からまとめられた教科書・入門書でも良い。その点では、ウェブ上に掲載されている教科書的・入門書的コンテンツでも良いと思う。それは、同じウェブという媒体上であっても、検索エンジンで何かを単発で調べる、という事とは違う。ただ、教科書・入門書にも良し悪しがあるので、それを見極める審美眼は必要である。で、そんな審美眼が入門段階で備わっているわけもなく、と思えば、まずは先達に頼るという意味でも「人」の利点は出てくる。

情報の審美眼

そして情報の審美眼という点では、教科書・入門書にも良し悪しがある位なのだから、ウェブ上の様々な情報についても玉石混交であることは言わずもがなである。このことには以前のエントリでも触れた。

このエントリを書くにあたって、試しに「HTML 文字を動かす」というキーワードでGoogle検索してみた。今はあまり見かけなくなったが、一昔前のウェブページではよく見られた、電光掲示板風に文字を流して表示するアレである。その時得られた検索結果の一つ目は、marquee要素の解説ページであった。最近のウェブ周りの事を知っている人には当然の事であろうが、現行最新のHTML仕様では、このmarquee要素は非推奨である。同様の見た目を実現するには、今の考え方ではCSSで諸々指定するのが筋である。無論、検索結果を辿っていけば、その方法を解説するページも出てくる。また、最近のGoogleには検索キーワードに対して生成AIによる解答を表示する機能もあるが、そちらはmarquee要素を使う方法とCSSで実現する方法を併記2してきた。

ウェブ上の様々な情報は、それが作られたのがいつであるかを問わず、ある意味それぞれ平等に存在している。marquee要素は、かつては極々一般的に用いられるものであった訳だが、その時代に作られた情報と、現行の標準に基づく情報との間に区別はない。何なら、このように「かつては正しかった情報」と「最新の情報」の区別以前に、「正しい情報」と「誤った情報」の区別すらない。それらは等しくウェブ上に存在することができ、さらに、検索エンジンでどのように表示されるかという点においても、正しいか否かなどという事は評価軸にはならない。生成AIもまた、既存の膨大な情報源の統計上に回答を生成しているに過ぎず、その回答及びそもそもの情報源が正しいか否かなど考えていない。

そのように数多の情報源が存在しうる場においては、低品質な情報はいずれより多数の高品質な情報により淘汰される、という考え方はあると思う。この集合知的アプローチの実装例の最たるものはWikipediaであり、統計に依っているという点において生成AIにも通じる。そしてこれがある意味限界でもあり、個別の情報の信頼性は担保しようがないという事である。無論、ウェブ以外の情報媒体であっても同様の事は当てはまるが、万人が情報を発信できかつ情報の鮮度や正しさに対する責任を問う者もいないウェブという場においては、殊に顕著である。

負の増幅

そのような中で、特定の物事について前提知識を持たない人、即ち審美眼を欠く人がウェブでの情報収集を介して、逆によりおかしな事を信じる方向に振れてしまうという事が起こりうる。これが即ち、冒頭でも述べた「負の前提知識」が乗じられてより増幅されるという状況である。

先の「HTML 文字を動かす」の検索の他に、一般に疑似科学エセ科学の産物とされている製品や概念いくつか3について、その名前をGoogleで検索してみた。ある意味当たり前であるが、それらを販売・提唱するウェブページが検索結果上位に表示されるし、AI機能はそれらの効果として主張されている事項をまとめて表示してくる。上述の通り、それらの情報源が科学的方法論に則っているか否かなどという事は検索エンジンや生成AIにとって範疇外のことであり、そこには検索エンジン最適化の妙技が働くのみである。しかし、科学的手法の心得や関連分野の基礎知識なしにそのような情報に直面した時に、それらを無批判に信じる方向に人が流れてしまうという場面は容易に想像しうる。

もう少し当たり障りのない話題としてmarquee要素の話に戻ろう。そもそも「HTML 文字を動かす」というキーワードによる検索それ自体が、今時のウェブページの作りの考え方からして不適切なのである。今日の整理においては、HTMLは文書の意味的構造を記述するものであって、文字を動かすなどといった見た目の制御を行うためのものではない。見た目の制御はCSSを使って行うのである。その原則を分かっていれば「HTML 文字を動かす」などという検索キーワードはあり得ず、代わりに「CSS 文字を動かす」などとなろう。そのように検索すれば、marquee要素の解説など出てこない。これもまた、十分な前提知識を持っていれば良い情報に行き着く事が出来るが、そうでない=「HTML 文字を動かす」などと検索してしまうようだと、その負の前提知識を増幅してしまう=marquee要素に辿り着いてしまう4、という具体例である。

確たる知識基盤を持つべし

もちろん、十分な前提知識を作るというのは大変な事である。それには冒頭で言うところの加算的学習アプローチが必要であり、その教科書的に勉強するというアプローチには一定の負荷がかかる。ただ、そこを安きに流れてしまう事のデメリットは述べた通りである。即ち、何が分からないでいるのか分からずに物事を進めてしまい、その結果として得られた歪5な知識が負の方向に増幅されてより歪んでいく。一方で、冒頭でも述べたが物事について調べるにあたって、前提として確固たる知識基盤を持っている上で使いこなされる検索エンジンや生成AIは極めて強力なツールである。その正の相乗効果は、最初の加算の負荷を投じて尚、それを十分に巻き返しうるものだと信じる。

それを見越して、最初のうちはある程度の負荷がかかる学習は受忍しなければならない。


  1. だからこそ、何か分からないことがあったら、それを上手く説明できなくても良いから気軽に質問してね、ということは常に言っていた。教員に気軽に質問できる空気感は大事だと思う。仮にその質問が、教員の助けなしに学生自身で何とか出来そうなものであったとしても、その指針を示して学生自身にやらせるよう指示すれば良いのだし。
  2. marquee要素の利用は推奨されないという事も示していたので、まあ及第点か。しかし今日日、marquee要素を紹介する事自体、時代錯誤ではあるが。
  3. 変なリスクを背負いたくないので具体名の紹介は避ける。この逃避もまた迎合であり望ましくないが。。。
  4. CSSアニメーションで文字を動かすより、marquee要素を使ってしまう方が短期的には簡単であるということも、その傾向に拍車をかける。
  5. 「歪」(いびつ)という文字を改めて見てみると「不正」で出来ている。本当に良く出来ていると思う。

意図的コンテキスト放棄

先日、これまでの複数エントリで時々触れている自閉傾向の長男の発達検査のために児童相談所に行ってきた。目的は療育手帳の更新である。改めて考えてみると児童相談所の業務の幅は広い。

発達検査の結果では、実年齢五歳半近くに対して二歳七ヶ月相当という事で遅れ有り、療育手帳は再発行となった。とはいえ結果説明を聞いた所、ここ最近の伸びは結構正確に捉えられているようであった。それは、本人について我々親が感じる「伸びてきている感」にも合致している。そもそも、二年前の療育手帳発行時には最後まで検査を完遂出来ずに測定不能であったという事を思えば、極めて大きな進歩である。そんな発達検査であったが、結果説明において、ああ成程、と思った事があるので、ここに明文化してみる。

抽象概念理解

長男が苦手とする問いの分野として、何かしらの状況への対処、また抽象的な概念の理解があったとの事である。具体的な問いとしては、例えば「喉が渇いたらどうする?」という問いには何も答えられなかったという。尚、この問いへの想定回答は「水を飲む」である。

長男は、水を飲みたい時にはその旨を「お水飲む」と言葉で主張できる。これは具象の動作・行為を表す言葉である。一方で、確かに「喉が渇いた」という言葉は長男のボキャブラリには無い1。これは目には見えない状況を表す言葉であり、「水を飲む」と比べると、視覚に依らない感覚を表しているという点が異なる。それは外部から観測できないか、観測出来るとしても難しい個々人の内的な感覚であり、比較的抽象度が高いといえる。抽象度が高い概念の理解が具象の事物の理解よりも難しかろうという事は、容易に想像がつく。その点で、抽象概念の理解有無という視点が発達検査に含まれているのは道理であろう。

一方で、そんな事を考えている傍ら、この「喉が渇いたらどうする?」という問いに答えられなかった、という話を聞いた時に単純に思い至った他の考えとして、そもそも我々家族は「喉が渇いた」という旨の主張を口にする事がほぼ無いな、という事がある。大人同士での会話においてもそうだし、件の長男を含む子供らに問いかけるときも「お水飲む?」といった聞き方で具象行為について質問している。

大人はコンテキストを共有している

例えば私と妻との間で、どちらかが「水を飲んでくる」という言葉を発したとする。これはよくある場面である。そうすると我々は、相手が「水を飲む」という具象行為に向かっているという事を理解するだけでなく、「喉が渇いている」であったり「離席するのでその間の子供の相手等を頼む」といった言葉としては表面化していない意図の存在も同時に理解する。そのような共通の文脈・コンテキストを我々が共有しているからである。

もしくは上記例において「水を飲んでくる」という発言をしたのが私である場合、かつその場に私と妻しかいない場合、さらに私の口調が戯けている場合、妻は上記の意図に加えて更に「私が飲もうとしているものが実際には牛乳である」事を察するだろう。私は水の代わりに牛乳を飲むほどに牛乳が好きで、冗談で「『牛乳は水』教」2という表現をしている。無論、混乱を招くだろうから子供の前では絶対に使わない表現であるが、むしろそれ故、上掲の場面であれば妻には意図が伝わる。私と妻の間で、そのコンテキストが共有されているのだ。

牛乳の件に関しては最早言葉遊びであり極端が過ぎるが、前述のコンテキストについては一般的にも通じるだろう。このようなコンテキストの事前共有によりコミュニケーションは効率化される。即ち、直接に音声伝達される情報量を減らす事が出来る。中でも具象概念のみを直接伝達するのが最も効率が良いだろう。例えば妻が「喉が渇いている」と言うだけでは対応する具象行為に一意に紐づかない。そのとき妻が「水を飲んでくる」のか「カモミールティーを淹れてくる」のか「状態の表明だけで何もしない」のかは私には判断できないのである。これら具象行為の違いは、更に「離席するのでその間の子供の相手等を頼む」時間の違いに繋がる。

このように、コンテキストの事前共有のもとで具象概念について言及する事が、コミュニケーションの情報伝達効率の視点では最も望ましい。それ故、コミュニケーションにおいて実際に音声伝達される言葉は具象概念を表すものになりがちである。

コンテキストなき個別具象概念

この効率化コミュニケーションが成立する為には、あくまでもコンテキストの事前共有が必要である。一方で上記の抽象概念理解に関する話を聞いたとき、これが子供に対するコミュニケーションになると、そこには共有コンテキストがまだ形成されていないはず、という事に気付いた。

即ち、「お水飲む?」という我々の質問の背景には、長男の喉が渇いていないか知りたいという意図が当然あるが、この部分は長男には伝わっていない。そもそも、関わり合っている大人である所の我々が生活の中でその言葉を発しすらしない時点で、「喉が渇いた」という概念が長男に形成される筈も無い。自閉症児は他者の模倣で学ぶ事に難しさがあると言われるが、最近になって、長男には他者の真似をする事が増えてきたと感じる。しかしそもそも、真似るものがなければどうしようもない。そしてこれは、自閉傾向の長男だけの問題でなく、今のところ定型発達の次男にも当てはまりうる。もっとも、次男については保育園でも色々な言葉を吸収する機会があろうが。

長男は飲み物を水しか飲まない。そのため彼は、我々が喉が渇いたと言うところの不快感があった時には「水を飲む」と言えば良い。どうせ水以外飲まないので、「喉が渇いた」という概念理解を飛ばしていても、その不快感を起点にして得ようとする結果が一意に対応しているから、この点においてはコミュニケーション上の問題がないとも言える。一方で次男は水の他にも牛乳や豆乳、ジュース等、色々なものを飲む。そのような場合、「喉が渇いた」という表現ができなければ、個別に飲み物の名前を挙げて「〇〇飲む」と言うしかない。そう言われてしまうと、この〇〇を切らしている時には何もできない。「喉が渇いた」と言ってもらえれば、代替の何かはいくらでも提示できるのだが。無論、親であるところの我々は長男・次男の発言コンテキストを把握しているので、言葉が不十分でもそれなりに察することはできる。とはいえ、家庭外の環境3でそれは通用しない。

長男を療育で診てもらっている方に今回の発達検査の話をした時に、ああこれも同じ構造だな、と思ったものがもう一つある。長男は基本的にしょっぱい食べ物が好きである。言葉遊びのエントリで書いたスルメや味海苔、他にも鮭とばやサラミ、ベーコン、フライドポテト等。一方で長男はかなりの食わず嫌い4である。長男はあくまでもそれら個々の食べ物が好きなのであって、彼にとってはそれらが「しょっぱい」から好きなのではない=「しょっぱい」という概念が恐らく形成されていない。逆に、それらが「しょっぱい」ものであるという抽象概念が成立すれば、別の「しょっぱい」食べ物を、例えば我々が「これもしょっぱくて美味しい」などと言いながら導入する事が容易になる可能性はある。

見えないコンテキストに言葉を与える

このような目に見えない抽象概念、そしてそれが我々大人等の会話において言葉にされない暗黙のコンテキストになってしまっているもの、を理解してもらうには、やはりその時々においてその概念を指す言葉を我々から声かけしていく、という事になるのだろうと思う。我々にとっては、無意識的に依存している大人の会話のコンテキストを意図的に放棄する事になる。例えば長男にスルメを食べさせながら、単に「美味しいねー」と言うのではなく、「しょっぱくて美味しいねー」といったふうに声掛けをする等が考えられる。また、長男・次男も聞いていると思えば、大人同士の会話でもそうするべきだろう。例えば単に「水を飲んでくる」と言うのではなく、「喉が渇いたから水を飲んでくる」などとする。それを繰り返す。大人視点ではコンテキストを放棄してコミュニケーションの効率を下げる事になるが、ある種、長男・次男のコンテキストに合わせて会話をする、と言えるかもしれない。

ここで難しいのは、このような抽象概念・コンテキストの理解は恐らく線形分離できる課題ではないという事だ。今になって振り返ると、先日、ここまで考えていた訳ではないがそんな雑記を書いていた。 blog.kolmas.tech 以前に感想を書いた藤居氏の著書において、自閉症児の苦手とするものに非線形分離課題が挙げられている。この、抽象概念・コンテキストを伝える為に大人側がコンテキストを放棄するという話題、下手に進めると伝えようとする概念が長男にとって分離不可能、もしくは誤って分離されるようになってしまう可能性は感じられる。何でも一気に進めるのではなく、これから伝えようとする概念を何にするかを絞り込んで、それが他の概念と正しく分離できるように課題設計してやる必要がありそうである。例えば先程の「しょっぱい」の話題、下手な伝え方をすると、長男の中で「しょっぱい」の概念と「美味しい」の概念が等価になってしまう可能性などが考えられる。それは誤分類である。幸にして、長男の好物にはしょっぱくないものもあるので、それらも使って、こちらが関連概念をきれいに構造化した上で長男に伝える、という事をしなければならない。

ここまで書いてきて、この構造化するという話、機械学習における教師データを作る事との類似性を感じた。そう思うと、何だか普通のことだ。むしろ、そういった工夫もないのに抽象概念を理解できる人間の脳すごいな、と思えてくる。

余談 ー 平均は時に乱暴な指標

冒頭の発達検査の話題、実年齢五歳半近くに対して二歳七ヶ月相当、という結果だったのだが、その内訳は、一歳級の課題は全て出来る、二歳級・三歳級の課題は出来るものと出来ないもの有、四歳級の課題はほぼ出来ない、そしてそれを平均すると二歳七ヶ月相当、という事であった。ある意味、平均というのはとても乱暴なものである。上述した状況対処や抽象概念理解等の長男が苦手とする類の課題がある一方で、それよりもよく出来る類の課題もある訳だ。ただ平均すると、二歳七ヶ月相当という一つの値になってしまう。

平均する前の、分野ごとの得手不得手みたいな所もより詳細に結果を見せてくれれば良いのに、と思うところであるが、児童相談所の立場としてはそれは出来たとしてもしてはいけないのだろうな、という雰囲気はあった。


  1. 少なくとも今の段階で我々が観測する限りにおいては。
  2. 大学研究室時代、この牛乳愛を共有できる先輩が二人いて、私も含む三人の間で冗談で言い合っていたものである。読んで字の如く、水の如く牛乳を飲む教義。豆乳は邪教の飲み物。念の為、これは勿論冗談であるという事は重ねておく。
  3. 即ち、子供らのコンテキストが共有されていない環境。
  4. 長男の食嗜好傾向からして絶対に好きになるであろうものでも、初めてのものを食べさせるのはかなり苦労する。最初の一口を食べてくれれば後は食べるのだが、その「最初の一口」の打率は極めて低い。

車を走らせていたら

先行車にこんなものを貼り付けているのがいた。

「突然のエンスト、坂道後退に注意」等という事を声高に主張するような輩はマニュアル車を運転してはならないのではなかろうか。

私はオートマチック限定免許なので、マニュアル車の事は分からないけれども、エンストや坂道後退は運転操作のミスによるものであろう。その自身のミスに起因する問題・迷惑への配慮を、初心者でもないのに1周囲に要求するという感性がどうにも受け入れ難い。そこに不安があるなら、素直にオートマチック車を運転しておいた方が良かろうに。自分の好みでマニュアル車を選んでいる2からには、それを理由に周囲に配慮を求めるのは筋違いではないか。


  1. 初心運転者標識=若葉マークは貼られていなかった。そして初心者への配慮を求めるのなら、若葉マークで十分なのであって。
  2. 類似するオートマチック車が無いような特殊車両、という風貌ではなかった。

生成できても手ずから初心者コーディング

以下のエントリ、の続きのようなもの。 blog.kolmas.tech このエントリで書いた通り、生成AI勃興の今におけるプログラマの役割は、変化する事はあり得ども無くなることはないと考えている。一方で、これからプログラミングを修めようとする人に対して、どのようなアプローチが望ましいのかについては、少し考える所もある。

元・非常勤講師

プログラミング遍歴後半学習と感動に関するエントリでも述べたが、大学院生をしていた傍らで、学部新入生向けの情報技術・プログラミング入門的な科目の講師をしていた。全新入生をカバーするために一学期間に複数のクラスを開講する半必修の科目で、私のような情報技術分野の後期博士課程在学者がよく講師をしていた。教材は全クラス共通のものが元から用意されていて、それに基づいて授業をするのが仕事であった。ほとんどの受講者は、プログラミングの「プ」の字に触れたことすらないレベルの完全な初学者である。

当時のこの科目では、コンピュータやネットワークに関する極々基礎的な内容の座学に加えて、クライアントサイドJavaScript1を使ったプログラミング実習2があった。教材には練習問題も色々と用意されていて、授業時間中に練習問題で手を動かす時間を作ったり、一部は宿題にしたりした。授業時間中の実習は、机間巡視していると教室の全体的な理解具合が大雑把に分かるし、遅れ気味の人にはサポートも出来る。一方で、授業時間内で全てこなしきれないほどには練習問題の量があったし、またそもそも受講学生による授業内容の復習のため、また講師としては各学生の理解度合の詳細な把握もかねて、一部の練習問題を使ってほとんど毎週宿題を出した。

講師の謎眼力

さて、宿題を出したからには提出物の採点をする。提出されたプログラムが練習問題に指定された要件通りに動作する事を確認するのは勿論だが、それが正しく動作する場合もそうでない場合も、そのソースコードの内容まで確認する。私が受け持っていたのは一学期につき学生30人程度のクラス一つだけであるが、それでも地味に大変な作業ではある。それをしばらくやっていると、変な眼力が身につく。学生が自分でプログラミングしたのではなく質問サイト等の回答をそのままコピペして提出してきた時に、分かるようになるのである。明確な基準がある訳ではないのだが例えば以下のような事項について、これまでのその学生のプログラムの癖から逸脱した「良く出来ている」ものが突然提出されてくると、このセンサに引っかかる。

  • 機能要件に関わらない部分の書き方が突然に洗練される。変数・関数の命名とかインデント・空白の入れ方とか、授業でも説明するのだが、初学者がそれらをいきなり綺麗にこなすことは、私の経験上、難しいように見える。
  • 機能要件に対して、無駄に回りくどい解法でプログラムが作られている。例えば、条件分岐と繰り返しの説明が終わったタイミングで出題されたシンプルなFizzBuzz問題に対して、まだ講義で扱っていない配列を使ったプログラムを出してくるとか。
  • 他にも、上手く明文化出来ないのだが、学生自身が新たに体得できたものではない何かが、何故だか見える。

もしこのエントリを学生が読んでいるとしたら、講義課題におけるソースコードのコピペはこのような理由で普通にバレるという事を警告しておく。そのようなバレそうな点を回避する努力をするくらいなら、最初から自分でプログラミングした方が早いし為になる。というか、そもそもその回避努力ができるくらいなら恐らく自分でプログラミングできる3だろう。

謎眼力vs生成AI

勿論、仮に上記のような点が引っかかっても、疑わしきは何とやら、コピペ元の存在確認が出来ない場合に不正として対応することはしない。とはいえ、そのセンサに引っかかったプログラムの特徴的な部分を抜き出してググったりすると、大抵はコピペ元4が見つかったものだ。他には、一学期の中で形成されていった仲良しグループ数人の中に良く出来る学生が一人いて、グループの残り全員がその一人の提出物をコピペしてくる、というパターンもあった。ただ、後者のパターンはともかく、前者のウェブ上に掲載されたプログラムのコピペの発見に関しては、私が非常勤講師をしていた時期5と今には大きな違いがある。即ち上掲のエントリでも触れた生成AIの勃興である。

いつも学期の初めには、コピペについて、引用元を明示しない複製として著作権法上の問題があるし、また上掲のようにバレるので、やるなという説明をしていた。無論、コピペしているばかりでは自分の身に付かないので、科目の履修の意味も無いという事も説明した。しかし、このうち前者の説明については、生成AIが普遍的に利用できるツールとなった今は、少し説明を変えないといけないのだろう。生成AIと著作権の話題は、社会全体としてまだ答えが無い複雑な問題である。バレる件については、上掲の理由は生成AIによるソースコードにも含まれうると思われ、その点で件の眼力により引っ掛ける事は出来るだろう。ただ、明確なコピペ元を特定するのは不可能になる。

当時受け持っていた科目においては、毎週の宿題だけではなく、学期末の試験や最終制作との組み合わせで成績評定していた。そのような複合的な評定基準を取る、即ち授業内容を学生が自分のものにできているかの評価を宿題だけに依存する必要がないと思えば、コピペを特定出来なくても評定はできる。また、少しやさぐれた視点では、コピペばかりで授業内容が身に付かなかった所で困るのはその学生本人でしかないのだから、勝手にすればという気持ちにもなる。大学ともなれば義務教育でもあるまいし、それで追々困った所で自己責任であろうと。

そもそもコピペ是非

とはいえ、やはり授業をやる側としては学生にはちゃんと身に付けてほしいと思う。上述のようにやさぐれてみつつも、身に付いていない学生ばかり本当に送り出してはカリキュラムの意義も無い。ただ、こう思った時に、今日プログラミングを学ぶ学生が身に付けるべきものは何で、それを身に付けるためには自分で手を動かさなければ駄目であるという事は、改めてきちんと理論武装していないといけないだろう。何せ入門レベルのプログラミング課題など生成AIが苦もなく片付けてしまえるのである。自分の手でプログラミングする事の意義が学生にとって分かりづらくなっているだろうと思う。

とはいえ、一概にコピペが駄目かというのは、入門を脱したプログラマの視点からは疑問符が付くかもしれない。何故なら我々、サンプルコードがあったらとりあえずコピペして動かすくらいの事は普通にしているだろう。もしくは、何かエラーが出た時にとりあえずエラーメッセージでググって、Stack Overflow6に投稿された解決策を試してみる、などした事が全くない人が居ようか。少なくとも私はどちらもした事がある。それこそ上掲の生成AIによるソースコード生成も、以前のエントリでも書いた通り、既にプログラマを助ける便利なツールとしての立ち位置は確立している訳であって。

その点では、上掲の著作権等の問題は別に考慮する必要はあるが、実践的プログラミングにおいてはコピペそのものが必ずしも悪であるとは言えない。ただ、それは勿論、自分のプログラムに必要なものが何か分かっていて、その必要なものをコピペしてきているという事も分かってやっているからである。逆に言えば、それを分からないで丸写し的に既存プログラムを持ってくるのは悪である。それは初学者にとっては何の身にもならないし、実践的プログラミングにおいても、その辺に転がっているコードを中身も分からず思考停止的に写してくるなど問題外である。

要件を噛み砕く能力

この「必要なものが何か分かっていて、その必要なものをコピペしてきているという事も分かってやっている」ようになるために必要なのは、言い換えればそのプログラムに対する要件を把握し、かつそれを細分化出来る事であろうと思う。

ここでいう細分化には例えば、このようなライブラリを使うとか、ここでこのようなアルゴリズムを使うとか、そういった大まかな切り分けが考えられる。もしくは、アルゴリズム実装のためにこのような条件でこの類の制御構文をここで使うとか、必要な変数はこれとこれであるとか、そういった細粒度の分解もある。フローチャートを書く、と言っても良いかもしれない。これはある意味、それが出来れば後はそこに利用するプログラミング言語の文法を当てはめれば良い、という段階である。私が、手続き型の考え方を持つプログラミング言語であれば知らないものでも少し勉強すれば書けると思っているのも、思えばこの点を押さえているからである。

もう少し深い所まで言及するなら、先に制御構文という語を示したのと重複する部分でもあるが、この細分化の過程において構造化プログラミングの考え方を理解している事は必要である。全くの初心者にフローチャートを書かせると、制御構造など存在しない、実際にコーディングするとしたらgoto文だらけになるであろう7フローチャートが出てきたりする。また、細分化の過程の中で、関数ないし類似する機能も押さえておく必要があろう。欲を言えば押さえたいポイントは他にも多いが、初心者という観点からは、まずはこの辺りだろうと思う。これくらい押さえておけば、既にあるプログラムを理解する事、また、そこから自分のプログラムに必要な所を組み込む事の下地としての最低限にはなると考える。

それは、上記の通り、また以前のエントリに書いた事にも通じる所として、生成AI勃興の今においてもプログラマに求められる能力であると考えている。逆に、ただ単に言われた通りのフローをコーディングするだけの仕事は、淘汰される方向にあると思う。

センスは実践で磨かれる

ではその能力をどのように身に付けるのか、といえば、結局は手ずから様々なプログラムを作ってみる経験が必要なのだと思う。今日日、前時代的な方法論ではないかという誹りを受けるのかもしれないが、私にはこれより良いものが思い当たらない。

先の「gotoだらけフローチャート」の事を例に挙げれば、そのようなフローチャートでは実際にコーディングする際に手詰まりになる事、またそこからフィードバックして手続きを構造化する事、の実体験が必要だろう。私の講師としての感覚において、一般的なプログラミング言語の制御構文で実現できるフローについて事前に説明していても、それだけで構造化されたフローチャートを描ける初学者は稀である。しかしそれでも、実際に手を動かしながら出来る出来ないと繰り返し考えていると、次第に構造化プログラミングの考え方が頭に馴染んでくる。

最終的には生成AIに代替されうる事であっても、習熟過程では自分で手を動かすべし、というある種の矛盾を孕む不思議な構図ではある。

余談① ー 構造化も生成AIでやってくれるが

構造化プログラミングについて述べたが、生成AIが出力するソースコードも、今時の高級言語を使う以上はその時点でそれなりに構造化されている。要件の処理フローへの落とし込み・構造化も実務的には生成AIに一定程度任せてしまえる。それでも尚、人としてのプログラマが構造化プログラミングを理解している事は必要である。さもなくば、生成AI出力のプログラムの構造を理解・把握する事は出来ないだろう。この分野における生成AIの利用において、それは必要な事である。

余談② ー そもそも要件定義の能力

プログラミングというよりもその上位工程にあたる事だが、要件の細分化以前に、大元の要件を明確化する事が当然必要である。これも、生成AIの存在の傍ら、人の役割であり続けるものだと考える。生成AIがコーディング部分の負担を減らしていく事は確かだろうから、これらの役割は一体化していく方向にあるのだと思う。

プログラムを書く事それ自体を仕事にした経験はないが、野良プログラマとして、自分が必要なプログラムの要件を自分で考えて、それを自分でプログラムを書く所までやる、という事をしている。そのため実は、要件定義とコーディングが分業されるという事のイメージが正直付かない。かの有名な「顧客が本当に必要だったもの」の絵は知っているが。


  1. それが実行されるウェブページを作るためのHTMLについても解説・実習があった。
  2. 私が講師をやめた後の科目内容改訂の中で、プログラミング実習のネタはPythonに変わったらしい。
  3. 言い換えれば、自分がプログラミング出来ない内容をコピペした上でその回避努力をすることは出来ない、ということ。対偶である。
  4. 具体的には、某知恵袋等の質問サイトが典型的である。ご丁寧にも練習問題の文面が質問文にコピペされている事すらある。
  5. 2017年まで。
  6. 例えば。
  7. それ故に今時の主流プログラミング言語ではコーディングしにくいような、もしくは、出来ないような。