kolmas.tech note

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

機械学習の話をしている?

以前のエントリで言及した藤居氏等の著作『自閉症―「からだ」と「せかい」をつなぐ新しい理解と療育』(以下「同書」とする)を読んだ。中々刺激的な読書であった。2007年発行の本なので、現在の自閉症理解においてはごく一般的な説なのかもしれないし、逆に棄却された説なのかもしれないが。そのあたりは、私にとって更に諸々の勉強が必要な所ではある。

読んでみて、まず第一の感想は、これ機械学習の事を知らないと読むの辛くないか?である。逆に私は、全くの専門外とはいえ、野良プログラマ兼研究者くずれとして機械学習について多少の知識はあるので、氏等の提唱する一般化障害仮説は肌感覚的にも極めて理解しやすいものであった。

階層浅すぎパーセプトロン

氏等の提唱する一般化障害仮説の根幹は、脳の認知機能において世界から情報を取得する「抽出処理」と、そこから一般化されたルールを導く「一般化処理」との間で、抽出処理と比較して一般化処理の能力が相対的に弱い事が自閉症の特徴であるとする点にある。その相対的差異が生じた理由が、一般化処理が通常よりも障害されて弱まっていることによるものか、もしくは抽出処理が通常よりも強すぎることによるものか、あるいはその中間的な状態であるのか、の匙加減によって、自閉症スペクトラム障害の幅広い臨床像が現れるとしている。

同書では、認知心理学コネクショニズムの立場からその説明を試みている。コネクショニズムという言葉は初めて目にしたが、同書の説明によると、これは脳機能をニューロンの相互接続によってモデル化しようとするものであるらしい。一定程度の信号刺激を受けたニューロンは、次のニューロンに対して信号を発する。そして、頻繁に信号が授受されるニューロン間の結合は強化され、そうでないニューロン間の結合は弱まっていく。これがコネクショニズムの立場からみた時の脳の学習機序であるとのことである。それを数理モデルに落とし込むと、個々のニューロンをノードとしてそれらの結合を表す有向グラフとなり、さらにグラフのエッジに重みを付けることでニューロン間の結合度を表現する。これは要するに、機械学習分野におけるニューラルネットワークの話である。一応コンピュータを専門の一つとしている身としては、すんなり理解できる概念である。 ja.wikipedia.org

このコネクショニズム、コンピュータ屋としてはニューラルネットワーク、の視点から見た時、自閉症スペクトラム障害ニューロンが縦列に連なる階層が相対的に浅いことによって表出していると捉えられる、というのが同書の立場である。逆に、相対的に多いのは、感覚入力である最も浅い層のニューロンである。即ち、横方向に浅く広がったネットワークになっている。充分な深さがないニューラルネットワークに複雑なルールを学習させる事は出来ない。同書でも紹介されている通り、例えば単層パーセプトロンは線形分離可能な問題しか学習出来ない。さらに、必要以上に多い入力は学習の精度を下げる可能性があり、それは学習の失敗や、過学習として表出し得る。

これは、単層パーセプトロン程度であれば実装して試してみた事がある身としては、感覚的に同意できる所ではある。自閉症を説明する時に、所謂「心の理論」1が挙げられる事があるが、同書の、それらの課題は単に複雑度が高過ぎるだけ、という主張は中々痛快である。

世界の解像度が高過ぎる

以前のエントリで触れた長男について、世界に対する解像度とでも言うべき何かが高いなぁとは何となく思っていた。田園地帯を車で走っていた時、そこそこ遠くにある高架を走り抜けていく新幹線を見つけ、「新幹線」と言ってきた事がある。私はそもそも運転に集中していたのでその高架には一切注目していなかったのだが、横目に見ると確かに新幹線が丁度走っていく所である。目を凝らす程ではないが、言われて見てみないと気付かないような小ささである。長男は、電車が好きとはいえ2普段から高架を凝視している風ではない。にも関わらず良く気付いたなと思い、そこに長男が持っている世界の解像度の高さが感じられた。

感覚過敏という程の傾向も長男にはあまり見られないので、その時は、世界の解像度が純粋に高いという事は悪い事ではないように思えた。しかし先述の一般化障害仮説を鑑みて振り返るに、その高い解像度=強い抽出処理が、長男における諸々の学習を阻害する要因にもなり得るという事である。勿論、抽出処理が絶対的に強い事自体は悪い事ではなくて、一般化処理と比べて「相対的に」強い事が問題である訳だが。即ち、入力に位置するニューロンの多さに対して充分に深いネットワークが構成されていれば問題はないのに対して、そうでなく、横に広く浅いネットワークになっている事が問題である。

そうは言えど、機械学習文脈でのニューラルネットワーク検討であれば形式ニューロンの組み換えなど造作もなく出来る一方で、人の頭にそのような直接的アプローチは出来ない。それに対して同書が提示するアプローチの方向性は、大別すれば課題の単純化とフィードバックの明確化の二点である。

非線形性(出来るだけ)排除

課題の単純化は、自閉症児が理解しやすいように環境や課題を調整することを指している。いわば、環境や課題に含まれる非線形性をできるだけ排除し、浅いニューラルネットワークでも扱い得る形に落とし込んでやる事である。

長男に関しては、この考え方は特に、守るべきルール的なものや定型的な受け答え、生活動作など決まってやらねばならない事を教えるのに有効であるように感じられる。長男は、大人が言う簡単な指示を一定程度理解する事は出来ているように見えるし、年齢に対しては大きく遅れているものの言葉もある程度出ている。その長男に、例えば帰って来たら手を洗うとか、机には乗らない3とか、その類のルーチンやルールを教えるには、この考え方が重要であるように思う。

この時重要なのは、ルーチン・ルールそのものからの非線形性の排除は勿論であるが、さらに加えて、それを運用する大人等の対応を統一する事であろう。同書でも触れられているが、人間の行動なんてものはそれ自体が非線形性の塊である。あるルーチン・ルールを適用するにしても、その時の状況や体調、精神状態等によって我々の行動は細かく変化する。例えば私の場合、外出から帰って来た時、基本的にはまず最初に手洗い場4で手を洗うが、冷凍食品の買い出しをして来た帰りの際は、一旦手洗い場を無視して部屋に行き、冷凍食品を妻に引き渡してから改めて手を洗いに行く。この、ルーチン・ルールを運用するちょっとした大人の匙加減で、このルールを厳密に説明するための変数が一つ増えている。そしてそのような変数は恐らく先のようなまだ比較的分かりやすいものだけでなく、最早我々の認識の域外も含めて多数存在してしまっている。単純化が必要である。

また、大人によって言う事が違うというのも、言われる側にとってはルーチン・ルールに非線形性をもたらし得ると考えられる。家庭内なら家庭内で、長男に伝えるルーチン・ルールに関する認識を統一出来ているべきとなる。そのような単純化・統一がなされていない場面において長男には、上述の高い解像度によってその差異が見えてしまうのだ。その複雑性を伴った入力を階層の深さが足りないニューラルネットワークに入れた時に、思うように学習が進まないというのは容易に想像できる。

一方で上述の通り、人間の行動というのはそもそも非線形なものであって、程度問題こそあれ、将来的には一定程度それに適応する事も求められよう。既存の学習成果を破壊する事なくルールの複雑性を少しずつ増していくアプローチの検討は更に必要なように思われる。

対人間バックプロパゲーション

学習対象となるルーチン・ルールの単純化は勿論のこと、学習を進めるには適切なフィードバックが必要である。機械学習文脈でのニューラルネットワークにおける言葉遣いで言う所の、バックプロパゲーション=誤差逆伝播である。同書の図の中にも、これ機械学習分野の人から見たらバックプロパゲーションの説明にしか見えないよね、という感じの図がある。

学習を進めるためのフィードバックを適切に与えるための手法として同書で挙げられているのが、ABA=応用行動分析を適用したものである。ABAは、行動に与えられたフィードバックが、そのフィードバック対象の今後の行動にどのような影響を与えるかを体系化したものであると理解している。その知見を、フィードバック対象の行動変容に活用するわけである。実際、ABAの考え方は様々な自閉症療育手法の中でフィードバックの与え方として活用されていて、関連する文献も多々あるようである。長男を通わせている自閉症療育施設でもABAを適用した手法を導入している。

ABAの自閉症療育への適用については、まだ概要に触れられている程度でちゃんと勉強できていない。同書を読んだ上での今の私の理解で述べるならば、行動に対するフィードバックの与え方を構造化して非線形性を排除することに、自閉症療育におけるABA導入の価値の一つがあるように感じられる。フィードバックを与えるのが人間の役目であるからには、何も考えていないとフィードバックもまた場面場面で様子が変わり、結果として非線形性を生じ得る。ABAの考え方を理解して適用する事によって、フィードバックにおけるその非線形性を排除し、学習をより効果的に進める事が出来そうである。

次の読み物、そして実適用へ

ここまでまとめたように、私にとって同書の内容は示唆に富んだ物であった。ただ、冒頭述べた通り2007年の本なので、現在の自閉症理解においてどのように捉えられるのかは分からない。その辺の勉強は深めていく必要がある。現在広く用いられている自閉症療育手法と対照して考える事も有効だろう。実際に長男に対してどんな働きかけをするか、という観点からしても、療育手法の本を読むのは重要である。また、上述の通り勉強途中であるABAの理解も進めねばならぬ。

余談:LLMで自閉症傾向を再現できるか?

自閉症の説明において、同書で述べられている一般化障害仮説、その背景としてのニューロン結合が浅く広い事、が適用できるのならばと思いついたメモ書き。

流行りの生成AI、その背景にあるLLM=大規模言語モデルにおいて、自閉症のように見える応答を返す、というより、自閉症のように見える応答しか返せないような物は作れないだろうか。この思いつきを得てから見かけた記事に、例えば以下がある。 note.com この記事が引用している論文は読めていないが、記事には、LLMを構成するネットワークの前半にはデッドニューロンの割合が高いという事が紹介されている。これ即ち、上述の横に広く浅いネットワークの対極である。では、敢えてそれを横に広く浅いネットワークに寄せてみたら、自閉症傾向の再現が出来ないだろうか?

機械学習界隈の皆様からしたら、この仮説はどう映るのだろう。


  1. 「サリーとアン課題」などで評価されるというアレである。ja.wikipedia.org
  2. しかも長男が好きなのはどちらかといえば在来線の方で、新幹線にはあまり愛がなさそう。
  3. 危ないし、次男が真似する。
  4. 帰って来た流れのまま手を洗えるよう、玄関からどの部屋に行くにも必ず通る廊下に手洗い場を置いている。

「チ。」を読んだ:技術発展・社会変革と人

前回から大分間が空いてしまい、また通読して以来の時間もかなり経ってしまったが、「チ。-地球の運動について-」の感想その3。今回の話題の起点は主に第7集及び第8集、及びそれを含む第三部関連。

以前の感想エントリは以下。 blog.kolmas.tech blog.kolmas.tech

活版印刷と火薬

What gunpowder did for war, the printing press has done for the mind. (思想にとっての印刷は、戦争にとっての火薬のような役割を果たした。) --Wendell Phillips (和訳はCivilization4攻略Wiki - テクノロジー格言集より1

活版印刷は、作中世界においては、第三部の時期に新たに確立された技術である。組織長ヨレンタ率いる異端解放戦線は、第二部でオクジーが地動説について綴り、バデーニの機転により第三部の時期にまで残された本を出版しようとする。作中世界で支配的な立ち位置を持っているC教正統派で異端とされているこの本を流通させることで、その正当性を揺るがす事が目的である。その先には、さのような情報が「解放」されて自由に流通できる世界を目指している。その目的にあたり、従来手法よりも遥かに高効率に写本を生産できる活版印刷術に着目している。これは、作中世界の情報流通の速度を大きく引き上げるものである。現実世界でも、活版印刷術の発明は本の流通増を通じて社会の変革に繋がったという。 ja.wikipedia.org

火薬も同様に、作中世界における第三部の時期にもたらされた技術である。異端解放戦線により、第三部冒頭における件の本の奪取や、組織長ヨレンタの自爆による目眩しに使われている。こちらも、戦闘の場面においてその登場以前の常識を通用させない革新的な技術であることが、特に前者、本の奪取の場面において端的に描かれている。後者の組織長ヨレンタの自爆の場面においても、追跡してきたアッシュ等審問官の予想しない形での自爆が、彼等に強い影響を残している。

このような最新の技術に対するノヴァクの「最新技術はまず悪事に利用される」という発言は、ある意味で正しくもあり、一方で将来の可能性の否定でもある。私とて仮にも技術者の端くれ、ノヴァクのこの発言には素直には首肯し難い。技術そのものには善も悪もなく2、故に技術の発展を抑止する術はない。それを乗りこなすための人の知性が問われる問題である。

革新は止められない

また、第三部の作中世界では、そもそもC教正統派の権威が揺らぎ、社会の変革が進まんとしている。それはドゥラカがアントニの前で放った「今や市民は"宗教"より"娯楽"を欲している。」や、ノヴァクに対して自らの立ち位置を述べた「これから来る、"金"の時代に。」といった発言で示されている。ドゥラカのこの発言に対してノヴァクは反駁しているが、彼の指摘するその変革の善し悪しに関する見解に関わらず、そのような社会全体の変革はそう止められるものではない。

技術発展にしても社会変革にしても、止めようとして止められる類のものではない。そしてそれらは、長期的視点に立てば忌むべき事ではあるまい。火薬は、確かに作中に描かれているような恐ろしい使い方が出来る技術であるが、一方で現実世界において今や欠かせない技術の一つである。また活版印刷についても、それ自体は現代の発展した印刷技術と比して最早時代遅れのものではあるが、長きにわたって社会における情報流通を支え、個人が様々な情報を入手しうるという現代社会の一端を形作った技術であることには違いない。社会変革については人によって様々な考え方はあろうが、少なくとも私個人としては、長期的に見ればこれまで良い方向に社会は進んできていたと思う。

ここでノヴァクの反駁に戻る。彼は、神に道標を与えられなくなった人が、技術発展や社会変革の中で起こしうる悲劇の可能性に言及する。その、ある意味で人類知性を信用していない姿勢は、実はノヴァクだけのものではなく、彼と対極の立ち位置にいるはずである異端解放戦線のシュミットにも共通している。彼は端的に、人の知性を信じていないと発言している。彼は人の作った技術や社会、ひいては人の作った神をも否定しており、自然に神性を見出してそれを崇めている。

これに対してドゥラカは、人が責任を持つべきという姿勢を取る。

過渡期の知性

ノヴァクが問いかけた悲劇の可能性を、ドゥラカは否定していない。ただ、その責任は人にあり、故に悲劇からの反省と自立を経て、技術発展や社会変革に対応できるものへと人類知性が進んでいけるという考えを示している。神による道標無しには人は迷う事になると問うノヴァクに対して、ドゥラカは迷いの中に倫理があるとして上記の考えを述べた。この彼女の言葉は、同じ問いをかけられたヨレンタが彼女に与えたものである。

現実世界において、火薬や、活版印刷から更に発展した印刷技術が、今や欠かせないものになっているのは先述の通りである。現代の人類知性は、それらの技術や、それらがもたらした社会を前提に成り立っているとも言える。技術や社会の革新は人類知性を拡張しているのである。人類知性全体の視点だけでなく一人一人の人間という視点から見ても、例えば、活版印刷の発明以前の情報の流通量と比べたら、今や莫大な量の情報を日々捌いている。これもまた、各個人の知性が技術によって拡張されたもの3といえよう。

この知性の拡張こそ、ドゥラカの指摘する所であろう。それは即ち、例えば活版印刷といった新しい技術がもたらす混乱を乗り越え、それらを当たり前かつ平和的に4使いこなすようになった人類知性の歩みである。社会の変遷についても同じように言えよう。ただ、その段階に至るまで、即ち知性拡張の過渡期において、技術発展・社会変革が負の側面を持つ事は否定されない。人はこれまで、その責任を受け入れ、それを乗り越える事で進んできたのである。その可能性を肯定するのがドゥラカの立ち位置である。

増大する振れ幅

このドゥラカの立ち位置について私は、基本的には賛成・同調するところである。ただ、だからといって楽観は出来かねる、という事を特に最近は感じている。

人類文明の発展度というか成熟度というか、若しくは幸福度とでも言うか、そういった概念の推移を図示する折れ線グラフを想像してみる。ここでは、このグラフは横軸に時間を左から右へ進む方向に、縦軸にその発展度・成熟度を高まるほど上に進む方向に取るものとする。このグラフは、大局的に見れば、右肩上がりなものになっているであろう。一方で、このグラフを局所的に見ると、上がったり下がったり、ジグザグしているように思う。即ち、上述した技術等の発展に伴う知性拡張の過渡期における負の側面の存在である。そのため短期的にはグラフが下がる時もありつつ、ただ上述の通り、人類知性はいずれそれを乗り越えてグラフを上向かせ、結果として大局的には右肩上がりになっていく。

懸念するところは、このジグザグの振れ幅が、技術等の発展に伴って大きくなってきているという事である。作中で火薬を起点に語られる技術の負の側面、例えばこれと比較して核反応技術を考えてみる。原子力発電等の平和的用途が人類文明をより豊かにし得る一方で、使いようによっては遥かに高効率に大量死を招き得るし、しかもその実績もある。グラフが下方向に振れる幅が、火薬発明の時代と比べて遥かに大きい。核反応技術に限らず、これから先の更なる技術等の発展が、この振れ幅を更に大きくしていく可能性もある。そうした背景の中、いつか何かのタイミングでグラフがふっと下方向に振れた時に、それが人類文明を崩壊せしめる一線を易々と踏み越えていく、という時は、来ても全くおかしい事ではない。

一方で上述の通り、また以前のエントリでも述べた通り、私は技術等の発展を目指す事には肯定的である。それら発展がもたらす正の側面が長期的には人類文明を良い方向に進めると信じている。またそもそも、技術等の発展を無理に抑え込む事そのものが難しい。本作でも示されているように、それら発展の原動力となる人の好奇心は絶える事はない。

人の責任

そのような中で現代の人に求められる事は、起こり得る極端なグラフの下振れを抑止しつつ5、その上で発展を目指していく事に他ならない。少なくとも我々は、この「下振れ」が存在する事は歴史から知っている筈である。それがいつでも発生し得るものてあるということを、個人が常に意識しておかねばならない。その引き金を引くのは、上述した核反応技術のようなある意味で天の上の話題だけでは無く、我々一般人の身近な所にある何かでもあり得る。

ヨレンタが言う所の「この世にある悪を善に変える」という神の意思、そしてドゥラカは、我々の中に宿る神性は消せないと言う。私は神を信じていないが、人類知性にあるその可能性は肯定したい。そのためには、個々の人がそれぞれにその意識を持っていなければならない。


  1. Civilization、初心者向け難易度でしかやった事が無いが、とても面白いゲームである。Civ4とCiv6を少しずつ経験。Civ7も出たそうだが、この無限に時間を溶かすゲームシリーズをやっている余力は私には最早無い。
  2. 所謂「Winny裁判」の事が思い出される。
  3. ただ、最近のウェブ上でやり取りされる情報量の増大は、人の知性拡張の速度を超えている気はしている。これについては別途書きたい。
  4. 火薬に関しては、未だ人死の出る使い方もされ続けているという点で、人類知性はまだまだなのであろうが。
  5. あらゆる「下振れ」を抑止する事は出来なかろうと思う。それでも、大きな危機くらいは見抜かねばならぬ。

理想のケバブを求めて・続

ケバブ探求の続き。前回↓ blog.kolmas.tech 尚、前回エントリに引き続き、本エントリ中の「ケバブ」表記は基本的にドネルケバブのことを指す。また、回転焼き機などないので、作っているのはケバブもどきである。

試作2回目(25/06/28)

様々なスパイスがそれぞれどんな風味を与えてくれるのかなど全く分からないので、色々な配合を試してみてそれらの差分から考えるしかない。今回参考にしたのは以下。 spices-herb-mania.com

レシピ

概ね上掲参考元の「本格版・ケバブスパイス」の半量。以下の材料配合以外の手順は前回と全く同じ。

  • 牛もも肉細切れ 500g
  • ヨーグルト 100g
  • おろしにんにくチューブ1 小さじ1
  • コリアンダー 小さじ1
  • パプリカパウダー 小さじ1
  • クミンパウダー 小さじ1/2
  • ブラックペッパーパウダー 小さじ1/4
  • ターメリック 小さじ1/4
  • あらびきチリーペッパー2 てきとうに少し
  • オレガノ 小さじ1/2
  • バジル 小さじ1/4
  • タイム 小さじ1/4
  • 塩 小さじ1/2

前回レシピと比べて、分量からするとクミンの量が大きく減っている。肉の量を同量に換算して大体小さじ2→小さじ1/2。オレガノと塩は前回レシピの半分。にんにくは同量。そしてやたら増えたその他のスパイス。

前回同様、雑にプレートに盛る。今回はフライドポテトがないので主食は米。一人分の肉が前回より多いが、何の問題もなく完食。

感想

  • 前回とは違う方向性の味だが、これもまた美味い。
  • かつて食べたケバブ、という意味では前回の方が近いかも。クミンが重要?
  • ターメリックの効果か肉がちょっと黄色い。
  • こういう物に凝り出すとスパイスの小瓶が収納を圧迫する、というのがよく分かる。

脇道(25/07/05)

妻が魚を食べたいとのことだったので、ケバブの味付けで魚を焼いてみた。

レシピ

上掲「試作2回目」のレシピにおける牛肉500gを、刺身用3ヒラメ柵400gに置き換えただけ。

ヒラメの柵は焼いている間に崩れてしまった。味が良く絡んだということで。

感想

  • 白身魚とスパイスの組み合わせに失敗は無い。
  • 肉と比べると、やや魚の味がスパイスの強さに負けているか?魚の味が分からないわけではないし、美味いから良いけれど。
  • 肉と比べると、焼いた魚の体積減少ぶりは大きい。
  • 少なくとも妻には好評だったようなので良かった。焼き油にオリーブオイルを使っているが、これをもっと増しても良いのではと意見あり。

試作3回目(25/07/21)

試作2回目でクミンの重要性が感じられたので、今度はクミン以外のスパイスが少ないレシピを試してみる。今回参考にしたのは以下。 www.kurashiru.com

レシピ

概ね上掲参考元における肉の下味付けの三倍量。以下の材料配合以外の手順は前回と全く同じ。

  • 牛もも肉細切れ 450g
  • ヨーグルト 大さじ9/2
  • レモン汁 大さじ1
  • おろしにんにくチューブ 小さじ3/2
  • クミン 小さじ3/2
  • ブラックペッパーパウダー 小さじ1/4
  • 塩 小さじ1/2

レモン汁が新たに登場。クミンの量は前回よりは増えたが初回程ではない。にんにく、ブラックペッパーパウダー、塩は続投。にんにくは前回より少し多い。ブラックペッパーパウダーと塩は、元レシピから直接換算すると塩こしょう小さじ3/4だった所を、塩:こしょう比率2:14で割ってそれぞれ前回と同量にしてみた。それ以外のスパイスはごっそり無くなっている。肉の50g差は誤差だと考えておく5

写真では分かりづらいが前回の黄色さはなく、初回試作の色に近い。今回は付け合わせにポテト有。

感想

  • 初回とも前回とも違う味、だがやはり美味い。
  • クミンが重要である感は改めて受ける。ただ何か足りない気もする。初回レシピと比べると、オレガノか?
  • 美味いのだが、後味が若干しつこい印象有。ヨーグルトの味であるように感じる。初回レシピと比べると明らかにヨーグルトの量が多いのは事実である。前回レシピでは様々なスパイスで誤魔化されていた?
  • もっとも、ヨーグルトは前回エントリの脚注で触れた通りヨーグルトメイカーでR-1から培養しているものなので、発酵具合に毎度の個体差が含まれる可能性はある。
  • レモンは好きなのだが、今回試作におけるレモン汁の存在感はよく分からない。

今後方向性

三通りのレシピを試してみて、何となくスパイスを使う時の量加減が見えてきたような気がする。次回以降は、今までのレシピに少しずつ改変を加える方向性を指向してみるか。

続き

blog.kolmas.tech


  1. 参考元レシピでは同量のガーリックパウダーだが、前回買ったおろしにんにくがあるので代用。
  2. 参考元レシピではカイエンペッパーだが、似たようなものだろうと前回買ったチリーペッパーで代用。
  3. 刺身用を加熱することに一抹の罪悪感を覚えるものの慣れてはいる。子供の離乳食で初めて魚を食べさせるときは刺身を茹でて潰すのである。骨や皮がないので安全お手軽。
  4. 塩こしょうの内容比率は商品によって様々らしい。以下などでは概ね4:1で、さらにアミノ酸も入れているよう。www.sbfoods.co.jp
  5. その時買えた肉のパック次第で決まる。

プログラミングは自転車乗るようなもの

自転車というものは、一度乗り方を覚えたら忘れない、が、メンテナンスは必要。

10年以上ぶりにCを書いたら

先日、仕事でちょっとしたデモプログラムをCで作ることになった。それは、とあるライブラリの使い方の一端を簡単に示すものである。50行ちょっとくらいの規模と想定される1ごく小規模なプログラム、また当該ライブラリの仕様も概ね把握済みであったので、まあ10分もあれば余裕でサクッと作れるでしょう、と思って始めたら、30分くらいかかった。

想定外に時間がかかったこと自体も少々ショックだったが、その時間がかかった理由が全体的に、実にしょうもないことばかりなのである。具体例を挙げると以下のような有様。

  • strcpymemcpy2系列の関数における引数destsrcの順序を忘れていて調べ直す。
  • malloc3の返り値をvoid*から実際に利用する型のポインタにキャストするのを忘れてコンパイラに怒られる。
  • memcpymemsetを使うくせにstring.h#includeするのを忘れてコンパイラに怒られる。4
  • fgetsで標準入力から取った文字列から改行文字を除けるのに、strchrの存在を忘れ、しばらくstrstr5で文字列検索していて、後から直す。
  • そのstrstrにしても、引数の順序を忘れていて調べ直す。
  • ライブラリを使うデモプログラム、を書いているくせに、そのライブラリを指定し忘れて6リンカに怒られる。

本質的にそのプログラムで何をどのような順序でしなければならないかは完全にイメージできているし、そのために使う必要がある道具=標準Cライブラリの機能が何であるかも基本的には思い起こせている。ただ、その具体的な使い方が細々と頭の中から抜け落ちており、いちいち調べなければ7ならず、そこに時間が取られている。かつては、調べることなくスラスラ書けていたものであるのに。

ここに、きちんとメンテナンスされていない、ガタガタの自転車を漕いでいるような感覚を覚えた。自転車の乗り方を忘れたわけではないし、実際に乗れている。ただ、あちこち動きがガタガタで、進み方が辿々しい感じなのである。普段使わない自転車も、たまには油を差しておかないとこういうことになってしまう、ということだろう。

ぱぶりっくすたてぃっくゔぉいどめいんすとりんぐあーぐす

ご存知Javaの「最初の呪文」public static void main(String[] args)である。

先のDI自作のエントリの最後でも少し触れたが、7〜8年ぶりのJavaプログラミングとはいえ、これまでJavaでプログラムを散々書いてきたのに、これをすんなり書けなかったことにはショックを受けた。もっとも、その7〜8年前の時点で既に、このmainメソッドを自分で書く事もほとんど無かったが。サーバサイドJavaをやっていると基本的に自分でmainメソッドを書かない。

そしてそれにも増してショックだったのが、件のエントリの注釈で「String[] argsを忘れてコンパイラに怒られた」と書いてしまっていた事だ。気付いてすぐにさらっと直してはあるが。別に引数の指定がないmainメソッドを定義したところで文法上の誤りではないので、コンパイラに怒られる事はない。ただ、当該クラスを指定しての実行時に、呼び出されるべきmainメソッドが無いのでエラーになる。この違いは十分分かっているのだが、咄嗟の言葉遣いで上掲の正しくない表現が出てしまうあたりに、しばらく触っていないうちに思考が鈍ったか?という残念感がある。

こちらも、最終的には自作DIコンテナ完成させるまでやった訳だが、それでも諸々鈍っている。あんなに手に馴染む道具であった筈なのに。

最近はクライアントサイドJavaScriptばかり

今の私の仕事は、基本的にはプログラムを書く事ではない。仕事で扱っている話題を人に説明するためにちょっとしたプログラムを作って見せる事はあるが、主目的はあくまでも説明であって、プログラミングはその補助手段である。上掲のCで書いたデモプログラムはまさにその例である。

先の例は「とあるライブラリの使い方の一端を簡単に示す」のが目的であり、説明の対象は明らかにプログラマである。Cで実装されたライブラリであるので、Cでちょっとしたプログラムを作るのが、プログラマに対しては分かりやすい。とはいえ、このような対プログラマの解説をする機会は少なく、どちらかというとプログラムの利用者に向けた解説を行う方が多い。そうなると必要なのは見た目の分かりやすさである。

遍歴でも触れたが、その用途のためには、大抵クライアントサイドJavaScriptを使っている。HTMLとCSSでそこそこ簡易的にUIを作れるし、何よりウェブブラウザさえあれば大抵どこに持って行っても動く8というのが良い。静的型付けの型システムを持つ言語の経験の方が長いので、varだのletだので変数宣言するのは気味が悪かったが、すっかり慣れてしまった。他にも例えばPromiseを使った非同期処理なども最初は面食らったが、慣れてみればよく考えられた仕様だと思う。

このJavaScriptのように少しでもやっていると慣れてきて、一方で上述のCやJavaのようにしばらくやらずにいるとかつての慣れが失われている、という事象が見える。この「自転車らしさ」は何となく語学にも通ずる所を感じる。使っていると慣れて来るが、使っていないと、使えなくなる訳ではないものの、慣れが失われる。プログラミング「言語」とは良く言ったものである。

非専業としてどこまで最新動向にキャッチアップすべきか

必要な時にちょっとしたプログラムをさっと作る能力を維持するには、時々であっても、また、小規模であっても、プログラムを書くという事をしなければならないと悟った。現に、時々デモプログラムを作っているJavaScriptを書いている中で、しょうもない理由で手が止まる事は少ない。またCについても、上掲のデモプログラムの後にもう一つ別のプログラムを書いたのだが、そちらは上掲のような手詰まりなく快適なプログラミング過程を辿って完成させた。これは自転車に油を注すようなものと言えよう。メンテナンスが大事。9

ただしかし、どこまで本腰を入れるべきかについては悩んでいる。プログラミングを本気でやるなら、関連の最新動向にしっかりキャッチアップしておきたいものである。しかし先述の通り、仕事の一環で少しプログラムを書く事はあるものの、プログラミングは私の仕事の主たるものでは全く無い。今後もプログラミングを主たる仕事の種にするつもりはあまり無い。また、キャッチアップと簡単に言っても、それを常に続けておくのはそこそこ負荷のかかる事であり、今の仕事や生活に紛れ込ませる余力もないというのが正直な所である。

新しいプログラミング言語や、既存のプログラミング言語に関しても新しいフレームワークが、様々に勃興していて、正直全く追いかけられていない。ただ、根源的なコンピュータアーキテクチャやプログラミング方法論に対するパラダイムシフトでも無い限り、必要になった時に勉強すればどうにでもキャッチアップできるだろうとは楽観的に見ている。思うにこれらは新しい自転車である。これまでの自転車とは違うものなので、例えば鍵の開け方とかギアの上げ方とか、細かい違いに最初は面食らうにしても、自転車である事には変わらないから、少し慣れれば問題なく乗れるであろう、と。それくらいの自信はあるつもりでいる。

一方で、こちらが自転車に乗っている横を、バイクで颯爽と抜かされていく、という未来はあり得る。即ち、全く新しいコンピュータアーキテクチャやプログラミング方法論の登場である。そういった話題は大枠で認識しておくべきなのだろう。例えば量子コンピュータの話題とか。古典コンピュータ10とは全く異なるアーキテクチャであり、これまでの考え方が通じない所ばかりである。専門に扱うのでなくとも11、概要や考え方、展望くらいは知っておかねばなるまい。

量子コンピュータと比べたら近視眼的な話題であるが、プログラミング方法論という点において、生成AIの台頭も捉えておく必要があるだろう。生成AIによるプログラム生成がプログラミング方法論に対する観念的・思想的な転換点たるかは、未来の識者の判断に任されるところではある。しかし少なくとも、今日のプログラミング実務において人の手間を現実的に減らすツールたりうるのは間違いない。

どこまでを追って、どこからは眺めておくのか、の線引きは難しい。


  1. 完成品はコメント等込みで68行になった。
  2. ところで、これらの関数って日本語ではどのように読まれるのが一般的なのだろう。私の場合はstrcpy→「すとらこぴー」、memcpy→「めむこぴー」。より面倒臭い例としては、strncpyは私的には「すとらんこぴー」なのだが、流石に伝わらないかと思って人前では「すとらえぬこぴー」。
  3. mallocを「まろっく」と読むのは一般的なのではないかと思う。意味的には「m」だけ独立なので「えむあろっく」とか読んだ方が良いのかもしれないが。しかし「まろっく」は語感が可愛い。まろっくまろっく。
  4. mallocstdlib.h定義なのは覚えていた。
  5. これらについては、私的読み方はstrchr→「すとらちゃー」、strstr→「すとらすとら」。
  6. gccを使っているので、有り体に言えば-lオプションの付け忘れ。
  7. ググるなり、manを引くなりして。
  8. 各種ウェブブラウザの挙動がここまで標準化されてきた事には隔世の感を覚える。
  9. このエントリの内容にはまるで関係ないが、10年近く乗ってない私の(文字通りの意味での)自転車、乗るとしたら自転車屋で諸々メンテナンスしてもらわないと駄目か。
  10. 量子コンピュータの文脈では所謂現行のコンピュータを古典コンピュータと呼ぶ。
  11. 大学〜大学院時代、量子コンピュータアーキテクチャや量子計算アルゴリズムを研究しているグループがあったが、彼らの発表を当時正しく理解できていたかの自信はない。

研究者・教育者指向父親像

息子が二人いる。とても可愛い。

このうち長男5才は自閉傾向有と言われていて、総合的な発達年齢は2歳半程度と判定されている。基本的に仕事が狂ったかのように忙しく、自閉症療育を含む普段の子育ては土日に少し手伝える程度で妻1に任せきりである。まずそれ自体が父親として如何なものか、という心苦しさは常にある。

妻に勧められて、ここしばらく職場帰りの通勤電車内2で以下の本を読んでいた。

そして開眼した。成程これは知的探究であり科学研究であると。

仮説・実践・検証、その反復

同書には「科学の目」というキーワードが出てくる。その根底にある考えは、子供を観察してその現状及びそれに対する有効なアプローチの仮説を立て、それを実践し、その効果を検証する。効果が見られなければ現状認識やアプローチの仮説を再設定し、再び実践・検証する。効果があれば仮説は正しかったという事だが、そこに留まらず、取り組みの中で変化する子供の状況を観察し続け、新たなステップに向けて次の仮説検証ループが始まる。

この説明は、研究者くずれの身には至極当たり前のことに映った。これは科学研究の本質であり、これに知的快楽を見出すのが研究者という生き物である。ただ、これまで私は長男にこの考え方を適用した事があまり無かった。普段から子育て関係の大部分を妻及び同居の実父母に任せきりで、話は随時聞いているものの、実質的なアプローチはあまり出来ておらず、という状態だった。仕事を終えた帰りの電車では最早ガス欠で本を読む気力も無かった3。そして、そんな中途半端な関わり方が望ましくないのは自明である。

しかし眼が開けた。長男の療育から科学研究の知的快楽が得られるし、得ても良いのだ。「くずれ」ではあるものの研究者の端くれ、即ちその知的快楽ジャンキーである身にとってこれは一種の福音であった。その快楽が得られると気付いた今ならいくらでも本が読めるし、現状認識・アプローチの仮説を立てて検証するのもまた快い知的刺激である。これは研究だ。一方で、その知的快楽ジャンキーであるというのが、研究者「ズレ」なのだという事も悟った。仮説を立てて上手くいかないと、普通はめげてしまうらしい。研究者くずれ的には、立てた仮説が上手くいかないなんて事は至極普通のこと4で、それならそれを踏まえてさっさと次の仮説立てましょ、という感覚である。その点でも、これは研究者くずれである私の役割だったのだ。妻にはとても申し訳ない事をしていた。

型はめを(どうにかして)通す

研究者くずれ視点だけでなく、少し教育的な事を齧っていた身としても刺さるところがある。

遍歴や、初学者に物事を教える時に考えている話題を書いた「感動」のエントリでも触れた通り、大学院生時代、学部新入生向けのプログラミング入門的な必修授業の教員をしていた。集団に対してプログラミングを教えていると、どうしても人によって理解の速度に差が出てくる。最初の説明一発だけで理解できる人はかなり稀で相当優秀。大体は練習問題を自分でプログラム書きながら考えることでだんだん何となく分かってくる。一方、それでも全く理解が追いつかず、具体的指示の多い練習問題については指示通りに進めて何とか終わらせるも、指示のほぼない実践的な練習問題になるとパタリと手の動きが止まってしまう、という人も相当数いる。

授業自体は対集団に行っているので、一番遅いペースに常に合わせていることはできない。なので、練習問題を解いている時間等で個別に様子を見てアドバイスしたり、場合によっては授業時間外に質問対応などしてフォローアップする。この個別対応で、いかに理解が詰まってしまっているポイントを打破させることができるかが教える側の手腕であると、当時から思っていたし、今でも思っている。私はそれを、感覚的には型はめパズルのように捉えている5。教員としてその時々において理解してほしいコンセプトが型はめパズルのピースである。そして、それを個々人の理解に落とし込ませることが、そのピースを型はめパズルの枠に通すことに対応する。

そう考えた時、この人の「枠」には何の抵抗もなくスッと通せたな、という場面だけでなく、何だかこの人の「枠」には上手く通せてないな、ということがある。そんなときはピースを回してみたり、知恵の輪的にこねくり回して、なんとか「枠」を通す方法を探すのである。現実的には、そのコンセプトを色々なアプローチから、手を替え品を替え説明するのである。また、一度はピースを通せなかった方法を何度か繰り返してみるのも、繰り返していると「枠」の方が押し広げられていくのか、往々にして有効である。しばらくやっていると、ああこの人の「枠」にはこういう通し方が当てはまりやすいんだな、なんてことも見えてくる。後は、プログラミングという題材故なのか自分には分からない世界だと言って最初から「枠」を手で覆い隠してしまう人もいるので、そういうときはその手を除けるアプローチも必要。6

いずれにせよ、そんなこんなで何とか通りにくい「枠」を通すことができたら、その時の快感は強烈といったらない7のである。「枠」を通そうとする試行錯誤の過程もまた面白いものである。どうすると「枠」を通せるのかという仮説を立てて実際に検証、ダメだったらまた考えるループ、という点で上述の科学研究の知的快楽と同根の感覚であろう。そしてその快楽は、長男の療育から得うるということだ。

「感動」と一般化障害仮説

さらには、教育の視点からもう一つ、まさに「感動」のエントリで述べたその「感動」に対する思索を深化させうる示唆を、長男が与えてくれるかもしれない。

件の本で著者の藤居氏は、「一般化障害仮説」という考え方を提唱したことを述べている。氏はこれを次のように説明している。

ところで、学問でも仕事でもそうだと思いますが、貪欲に知識を吸収しながら徹底的にのめりこんでいくと、やがて、ばらばらに見えていたさまざまなものが有機的につながってくる瞬間がやってきます。私自身にもそんな経験があり、そこから生まれた、自閉症についてのかなり規模の大きな考察である「一般化障害仮説」の記事に、ある日1通のメールが届きました。それは、中京大学心理学部の神谷栄治先生からでした。これがきっかけとなって、「一般化障害仮説」を中核に据えた、『自閉症 - 「からだ」と「せかい」をつなぐ新しい理解と療育』(藤居学・神谷栄治著、新曜社)という本を出すことができました。 --藤井学 お父さんもがんばる!「そらまめ式」自閉症療育 自閉症の子どもと家族の幸せプロジェクト ぶどう社

一般化障害仮説自体の説明は本書の中ではなされていないので、それが何を指しているのかは、まだ具体的には分からない。しかし、ここで述べられている、様々な物事が頭の中で有機的に繋がって理解されていく感覚は、件のエントリで私が述べた「感動」そのものである。そちらでも書いたが、その感動なくして様々な物事を理解しようとするのは辛い。例えばプログラミングにおいて、その感動なきままでいると、サンプルプログラムや詳しい指示がある練習問題ならば何とかなるが、実践的な練習問題には全く対応できないという、まさに先に例示した状況になりがちである。だから何とか、根底に横たわるコンセプト・考え方や、そのコンセプトを元に個々のプログラム例が出来上がっている美しい関係性を分かってもらうべく手を尽くすのである。その理解に至った人は総じて、自分の頭の中が明快に整理された事に対する小さな感動を受けた反応をする。

自閉症の話題に戻ると、長男が抱える困難にこの感動に至らないということが含まれるのなら、それに対するアプローチの考え方には、私が彼らに対して諸々試みたものが応用できるかもしれない。また逆に、その意味で長男を感動せしめる学びを与える事が出来たならば、それは自閉症療育の枠を飛び越えて、元より私の興味の一つである何かを教授するという事一般について、一つの解8を示してくれるかもしれない。

まずは藤居氏の提唱しているこの一般化障害仮説について、上掲の引用箇所で紹介されている同氏の著作を読み始めている。

息子を知的探究の対象にして良い?

以上のように、長男の療育に関わる事が、長男のためだけではなく、私自身の知的探求の欲求を充足する事に繋がり、さらには以前から抱えていた私自身の思索の道標たりうる事に気付いたのが、今回の読書の最大収穫であった。

冒頭で述べた通り息子らはとても可愛く大好きである。その長男を自分の知的探求の対象に据えるのは如何なものかという気はする。何というか、サイコパス的というか。とはいえ、長男が可愛い事に変わりはなく、そして長男は療育を必要としている。そして療育を続けるモチベーションが、長男への愛だけでなく、私自身の知的欲求にも下支えされているのは、悪い事ではない筈である。

と、思っておく事にする。ひとまず。


  1. 看護師だが、今は子育て・療育に注力するために働いていない。
  2. 朝の電車は爆睡であり帰りの電車のみ。帰りの電車は疲労感が強いものの、寝過ごしたらとんでもない場所まで行きかねないため怖くて寝れない。
  3. インプットの気力が尽きていたので、このブログをちまちまと書いたりしていた。
  4. そりゃあ少しはめげるけど。
  5. 喩えではなく、本当にそういう感覚である。
  6. 尚、そもそも学ぶ気がない人に教える、ということについては当時は全く関心がなかった。大学生ともなれば、自ら学ぶ意思を持って物事に取り組むのが基本姿勢でなければなるまい。大学教育に関しては今でもそう信じている。とはいえ、長男の自閉症療育においては、もちろんそういうわけにはいくまい。
  7. 故に、学生には気軽に質問に来て欲しいのだが、どうにも、理解が詰まっている人ほど質問に来ない傾向があった。理解が詰まっていることを本人が自覚していても、である。
  8. ただ一つの解、という訳ではなく、複数解を持つ問いに対する解の一つ、という位置付け。