明治の遺産とグローバル化の波: 日本の大学制度の迷走と構造的課題

Assistant Professor は助教授なのか

ときどき、海外の大学の先生が Assistant Professor の訳のつもりで「助教授」を名乗っているのを見かける。それに対して、それは「助教」ではないかとの指摘が入っているのもみる。

助教授」と名乗っている先生たちの言い分は、独立した研究室を持っている Assistant Professor であり、その点が「助教」とは異なるから「助教授」でいいのだ、ということになる。

私の考えとしては「助教」と名乗るべきであるというものだが、その理由を説明していくと、複雑な話になる。そこでここに簡単なメモを残しておこうと思う。こういう話になるのは、大学と一口にいってもその実態は多様で、大学の先生でも自分の学科以外を知っている人はほとんどいない、ということに尽きる。そして、この話は明治から現在までの大学の歴史、そして将来展望まで繋がっている。

まずは、戦後直後から見ていこう。戦前の教育制度は複雑で、様々な種類の大学と様々な種類の専門学校があったが、それらが戦後、学校教育法によって整理され、まとめて大学という分類が作られた。戦後すぐ1947年施行の学校教育法の第58条を見てみよう。ここには大学教員の分類が並んでいる。

学校教育法(昭和二十二年三月二十九日法律第二十六号)
 第五十八条 大学には学長、教授、助教授、助手及び事務職員を置かなければならない。
 大学には、前項の外、必要な職員を置くことができる。
 学長は、校務を掌り、所属職員を統督する。
 教授は、学生を教授し、その研究を指導し、又は研究に従事する。
 助教授は、教授の職務を助ける。
 助手は、教授及び助教授の職務を助ける。*1
 (下線太字筆者、以下すべて同じ)

この条文を読むと分かるように「助教授は、教授の職務を助ける。」という形で職務内容が書かれている。そして、この項は2007年に改正されるまで変わらなかった。

つまり、日本において助教授とは「教授の職務を助ける」仕事をしている人のことである。助ける教授がいないならば、助教授と名乗るのは不適切である。

さて、2007年に学校教育法が改正(成立は2005年平成17年)されて、助教と准教授という新たな役職が作られる。また、その時の条文を見てみよう。

法律第八十三号(平一七・七・一五)
https://www.shugiin.go.jp/internet/itdb_housei.nsf/html/housei/16220050715083.htm
第五十八条 大学には学長、教授、准教授、助教、助手及び事務職員を置かなければならない。ただし、教育研究上の組織編制として適切と認められる場合には、准教授、助教又は助手を置かないことができる。
② 大学には、前項のほか、副学長、学部長、講師、技術職員その他必要な職員を置くことができる。
③ 学長は、校務をつかさどり、所属職員を統督する。
④ 副学長は、学長の職務を助ける。
⑤ 学部長は、学部に関する校務をつかさどる。
⑥ 教授は、専攻分野について、教育上、研究上又は実務上の特に優れた知識、能力及び実績を有する者であつて、学生を教授し、その研究を指導し、又は研究に従事する。
⑦ 准教授は、専攻分野について、教育上、研究上又は実務上の優れた知識、能力及び実績を有する者であつて、学生を教授し、その研究を指導し、又は研究に従事する。
⑧ 助教は、専攻分野について、教育上、研究上又は実務上の知識及び能力を有する者であつて、学生を教授し、その研究を指導し、又は研究に従事する。
⑨ 助手は、その所属する組織における教育研究の円滑な実施に必要な業務に従事する。
⑩ 講師は、教授又は准教授に準ずる職務に従事する。*2

見比べていただけると分かるだろうが、助教と准教授と教授は、有している「知識、能力及び実績」が「(形容詞なし)」「優れた」「特に優れた」で形容されている以外に差がないのである。それ以前は、「助教授は、教授の職務を助ける。」「助手は、教授及び助教授の職務を助ける。」という関係であったから大きな変更である。実際、PI つまり研究室を主宰している助教もいる。

では、どうして、このような変更をしたのだろうか。こういったことは法改正前に色々な議論がなされているから調べれば出てくる。

我が国の高等教育の将来像(答申)
平成17年1月28日
中央教育審議会
https://www.mext.go.jp/b_menu/shingi/chukyo/chukyo0/toushin/attach/1335595.htm
現行制度では、大学教員の基本的な職として、教育・研究を主たる職務とする職である教授及び助教授とともに、主たる職務が教育・研究か教育・研究の補助かが必ずしも明瞭でない助手の職が定められている。今後はこれを見直し、教育・研究を主たる職務とする職としては、教授、准教授のほかに新しい職として助教」を設けて3種類とするとともに、助手は、教育・研究の補助を主たる職務とする職として定めることが適当である。また、大学設置基準の講座制や学科目制に関する規定を削除して、教員組織の基本となる一般的な在り方を規定し、具体的な教員組織の編制は、各大学が自ら教育・研究の実施上の責任を明らかにしつつ、より自由に設計できるようにすべきである。
……
○ このうち、現行の助教授の職は、職名や職務内容が実態にそぐわない等の指摘や国際的通用性の観点を踏まえて廃止し、「学生を教授し、その研究を指導し、又は研究に従事する」ことを主たる職務とする「准教授」を設けることが適当である。
……

助手については、助手の実態が多様なので、教育・研究の補助をする助手と教育・研究をする助教に分けた、また、助教授は、職名や職務内容が実態とかけ離れており、名称も国際的通用性に欠けるので、准教授とする、ということである。

大学の教員組織の在り方について<審議のまとめ>
平成17年1月24日
中央教育審議会大学分科会
大学の教員組織の在り方に関する検討委員会
https://www.mext.go.jp/b_menu/shingi/chukyo/chukyo4/houkoku/attach/1342439.htm
助教の新設
 現行の助手のうち、自ら教育研究を行うことを主たる職務とする者については、その職務に相応する位置付け(職名、職務内容等)の新しい職(「助教」)を、学校教育法上に設けることが適当である。
職名を助教とする考え方
 新しい職の職名については、1大学の教員組織の一員として自ら教育研究を行うことを主たる職務とする若手教員の位置付けに相応していること、2現行の学校教育法上の各職の定着度や知名度、運用の実態等を勘案して社会的及び大学現場における混乱を招かないこと、3国語的・文化的な観点からできる限り自然な職名であること、4国際的な通用性の観点からも説明しやすいものであることなどを満たすとともに、法制度上の観点からの整理も必要である。なお、新しい職の職名については、広く意見を募集したところ、助教授、準講師などを含め様々な職名が候補として寄せられた。
 本検討委員会においては、これらを総合的に勘案して、種々検討した結果、1大学の構造的な教員組織における若手教員としての位置付けを表すことができること、2新しい職名であり、現行制度上の各職との関係について混乱や混同を避けられること、3国語的・文化的な面から見ても、歴史的・社会的に一定の用例があること、4国際的に職名の意味内容を説明することが比較的容易にできること等を踏まえ、助教という職名が最も適当と考えられる。

助教の名称であるが当初の案の中には「助教授や準講師」という名称を使おうというアイディアもあった。しかし、当時の「教授の職務を助ける」助教授と格が違うので社会的に混乱するかもしれないとして、別の名称になったという経緯がある。そして、助教は、歴史的・社会的に一定の用例があり、国際的な通用性、つまり、アシスタントプロフェッサーとの対応がつくために選ばれている。もう少し遡って検討委員会を見てみよう。

中央教育審議会大学分科会大学の教員組織の在り方に関する検討委員会(第5回)
平成16年2月5日
https://www.mext.go.jp/b_menu/shingi/chukyo/chukyo4/008/gijiroku/040120801/001.htm
……
○ 日本の助手は、あまりにも職域の幅が広いので、アメリカのアシスタントプロフェッサーに相当する方が何%なのかはこれから精査していかないといけない。
……
○ 今いる助教授と新しく作ろうとしている助教授は全く格が違うので、社会的に混乱するかも知れない。今は一般の人には助教授は結構えらいという感覚が結構ある。
○ 新しい「助教授」をつくるとなると、社会的には間違いなく混乱を起こすのではないか。アメリカのアシスタントプロフェッサーに見合う日本の名称は「助教授」はとるべきでないと思う。むしろ、「教授補」、「補教授」にするとか、何か全く違うものをつけないと、明らかに混乱を起こす。

つまり、「もともとの助手の中にもアシスタント・プロフェッサーに相当する仕事をしている人もいた。」「アシスタント・プロフェッサーと日本の助教授は格がまったく違う。」「アシスタント・プロフェッサーを助教授という名称にすると社会的に混乱を起こす。」ということだ。*3

さらに、大学設置基準の第14条第15条には、教授と准教授の資格が定められており、教授の資格の要件の一つに「四 大学又は専門職大学において教授、准教授又は専任の講師の経歴(外国におけるこれらに相当する教員としての経歴を含む。)のある者」とあり、准教授の資格の要件の一つに「二 大学又は専門職大学において助教又はこれに準ずる職員としての経歴(外国におけるこれらに相当する職員としての経歴を含む。)のある者」が挙げられている。前者の法務省の公式翻訳*4は、"a person who has a career working as a professor, associate professor, or full-time instructor at a university (including a career working as a teacher equivalent to these in foreign countries);"であり、後者の法務省の公式翻訳*5は、"a person who has a career working as an assistant professor or an official equivalent thereto at a university (including a career working as an official equivalent to these in foreign countries);" であるから、海外での assistant professor の経歴は教授職の資格要件にならないであろう。

さて、「助教授」と名乗っている先生たちの言い分に戻ろう。独立した研究室を持っている点が「助教」とは異なるから「助教授」の方が混乱しないということであったが、助教の中には独立した研究室を持つ人もおり、さらに、この混乱がまさに助教という名称になった理由であることまで分かった。

では、むしろ、助教は独立した研究室を持たないものだと思っている教員がなぜいるのかのほうが疑問になる。

色々な答え方があるだろうが、ひとつの答えは、日本の大学はとても多様であり、同じ大学の中でも多様であるが、多くの人は一種類でも知っていればよいほうである、ということだろう。

大学教員雇用の仕組みと歴史

大学の仕組みが多様である理由を説明するには幕末まで戻る必要がある。まず、歴史的な事情で大学教員を雇用する仕組みに講座制と学科目制がある。学科目制は教える科目について教員を雇用するのに対して、講座制は、日清戦争の頃の1893年帝国大学にできた仕組みで、専門を決めて、そこに教授、助教授、助手からなる講座という組織を作るというものだ。

幕末から明治にかけて、列強と対抗するために様々な教育機関が作られた。帝国大学、高等学校、教員養成諸学校と各種の専門学校が開かれた。専門学校は、外国語関係、宗教、医学、法律・政治などで、一部は戦前から大学に変わった。こういった教育機関がまとめて新制大学になっている。このため、戦前からの大学・学部は研究中心で講座制を取り、教育中心の高等諸学校は学科目制を取るという構造である。戦後直後は、講座制を取る大学のみが博士課程大学院の設置を認められていた。*6

もともとの講座制は、明治政府が学者に狭い専門性を与えて、発言力を削ぎ予算に制限をつけるためのものだったらしい*7。このため小講座制、つまり、教授と助教授が一人ずつなどと決まっていたのだが、運用が硬直的で不便ということで、1970年代の筑波大学を始めとした新構想大学などから大講座制も取られるようになった。つまり、複数の教授と助教授が広めの専門領域の一つの講座に雇用され、高めの自由度で人事をしていくということである。結果、教授と助教授それぞれが自分の研究室を持つことになる。その後、1989年に大学院設置基準が一部改正され、1991年に大学設置基準の大綱化によって大学への規制が緩和され、より多様な大学の仕組みが許されるようになる。1990年代以降に大学院重点化が行われた際に、大学の部局によっては複数の講座をまとめて大講座制に変えたところもあった。また、学科目制も大学科目に変わるところがあった。つまり、複数の授業をまとめて大学科としそれを教えるために雇用されている複数の教員という構造になる。そして、2001年以降、講座制と学科目制以外の教員組織も許されるようになった。

そういうわけで、同じ大学でも部局によって、大講座制、小講座制、学科目制、それ以外の組織がある。だから、大講座制しか知らないと、研究室主宰者になれるのは教授と助教授のみであると思ってしまうのだ。

大学というのは、場所によって違うものなのだが、なんとなく自分が通ったところをみてすべてを知っている気になっている。しかし、少し考えてみれば、同じ教育でもどのような人物を育てたいかによって、まったく違うものになるのは当然であろう。

たとえば、地方国立大学の法学部というのは、地方公務員の育成が念頭にある。市役所に行って、リーガルマインドに欠けた市役所職員ばかりであったら、市民としては恐ろしくて使えない。たとえば、地方の医学部は、だいたいがその県の地域医療を担っており、おおむね20の専門科が100人ずつの医者を抱えて、その県内の病院の事実上の人事権を持っており、その組織の構成員を育てるために教育をしている。それから、研究大学の理学部は研究に極端に振っている。たとえば、東京大学の物理学科は、7割前後が博士課程まで進学する。物理学科や数学科は物理学者や数学者になる割合が4,5人に1人くらい。同じ東京大学でも法学部だと博士まで行くのは数%と10倍以上違う。東京大学の法学部や経済学部は、官僚を養成する役割があるのだからそういうものであるが、そうなると必然的に学部教育の内容は大きく異なる。もうちょっと変わったところであると、内閣府や省庁が所管する私立大学が日本には5校あり、学位が授与されるが大学ではない省庁大学校が7校ある。

このように大学はとても多様であり、種類の大きく違う専攻や大学に通ってみないとそのことに気が付きすらしないのだ。日本の大学からアメリカの大学に移り、2つしか知らないと日米の違いであると理解してしまうのはいたしかたない。

大学教員ですらこうなのだから官僚はもっと救いがないことになる。東大法学部を出て、上級甲種で入省し、たとえば、アメリカの MBA に留学に行ったとする。知っている教育が、東大法学部では、学者になるひとがほとんどいない前提で2年間授業と試験を受けるものと、アメリカの大学の MBA になる。MBA は、大学からすると諸外国のエリートと付き合いがあることの証明とお金を落としてくれる客としての待遇だ。昔、文科省の高官に「アメリカの大学院では大学院生に給与が支払われることはない。高額な授業料を払っている。」といわれたときには驚いた。そりゃ、MBA や LLM しか知らないならばそう思うでしょう。そして、このあたりの無理解は日本の科学技術政策や教育政策に影響を与えているだろう。

特任教授

ついでに、教員組織の多様性という文脈で「特任教授」についても書いておこう。実は、特任教授という言葉は大学によって意味がまったく違う。

2002年の「新しい「国立大学法人」像について」にもあるが「・採用は、法人の定めるルールにより採用。」ということになったので、現在、基本的に大学はおのおの非常に自由な裁量で採用を行っている。*8このため、大学によってルールが大きく異なる。

たとえば、京都大学では、特任教授は、京大教授の経験者が、総長が特に命じる職務に従事するものだ。つまり、名誉教授の中で、ばりばり仕事をする人に与えられる称号である。*9

これは、東京大学では、特別教授、特命教授が近いものである。特別教授は、退職予定の教授が最長 75 歳まで研究に専念することができる称号で、特命教授は、退職予定の教授が最長 75 歳まで大学運営業務に従事する称号である。

東京大学での特任教授は、プロジェクト等に従事する者で、選考基準は教授と同等。常勤も非常勤もいる。予算の出どころが外部資金ということだ。東大教授が、これからは自分で資金を取って自由になるべきとかで、自ら辞職して東大特任教授になったという例もあるから本当に色々である。*10

京都大学で、東京大学の特任教授に対応するのは特定教授のようだ。こちらは称号ではなく職名。もともとは、特別教育研究教授、科学技術振興教授、COE教授、産学官連携教授、寄附講座教授、寄附研究部門教授など予算の分類ごとに職名をつけていたようだ。*11

京都大学にも特別教授はあるが、東大でこちらに対応するのは卓越教授であろう。それぞれ、京大の特任教授と東大の特別教授の上位版である。

似たような名前が多くて閉口してきたのではないか。私もここまで書いたところで、京都大学には別の特任准教授がおり、上記の特任教授とは意味が異なるようだということを聞かされ閉口している。*12

大学教育の未来

ここまでの話をまとめよう。幕末から明治にかけて作られた仕組みをなんとか時代に適合させようとあがいてきたが、残念ながらあまり大きく変えられないためにここまで来てしまったのだ。明治時代に作った仕組みが大学教授の力を削ぐために故意に硬直的に作られていたというのも一つの理由だ。

それに対応するために、文部科学省は戦後少しずつではあるが大学の自由度をあげて、時代にあった人材を育てようとした。

ところが、大学に対して「採用は自由だ」といったところで文部科学省の思ったようにはならない。大学はボトムアップの組織で、たとえば教授会が次の教授を選考することが多い。大学教員は研究者だ。研究者は、おおむね学会の分科会程度の粒度で同じ興味関心を持ち研究をしている。だから、大学教員は、基本的に学問とその継承をしたいのであって、全大学で社会に必要な人材をバランスよく生み出そうなどということはしていないしできない。

具体的に起きる問題を考えてみよう。物理学科のように伝統的な分野は比較的問題が小さいが、それでも新しく量子情報というどこにも分類しがたい領域が出てきた。こうすると辞めた教授と似たような領域の教授を採用するということを繰り返しているだけでは、量子情報を専門とする教授が採用できない。学科を新しく作ることもあるがその方式も問題だ。既存の学科から教員と学生のポストを出し合って作る。分かりやすくするために極端な例として、法学部がない世界で法学部を作ることを考えてみよう。法律に関係している先生をあらゆる学部から集めてくることになる。経済学部から独禁法の先生、文学部から古代ローマ法の先生、水産学部から水産資源保護法の先生などが集まるだろう。しかも、この法学部の大学院進学率が半分を超えるとすると、修士博士で研究ができるようにしないといけない。産業組織論や計量経済学ラテン語古代ローマ史、海洋生態学や資源動態学が選択授業として用意されるだろう。この学部に入った学生が商法、刑事訴訟法民事訴訟法を履修するかという問題だ。はっきりといってそれが出来るのは法学にすでに相当詳しい人物である。学生に選択授業の整合的な履修を期待するのは無理である。

既存の大学がすべてなくなって完全に新しく作り直すとしたら、今のような定員の配分にはならないだろうが、数十年単位では動かせない。そこで、最近は、学長に強い裁量権を持たせていこうという方向だ。これはアメリカの研究大学の方式に近い。

高等教育の予算は変わっていないが、大学運営費がどんどん減って、競争的資金に化けていっている。要するに、明治時代からの組織をゆくゆくはゼロにして、新しい高等教育の組織に置き換えようとしているのだ。

ただ、「明治時代からの組織」をなくして置き換える先の「新しい高等教育の組織」というのが一体何なのかは、いまいちはっきりとしない。 政府だって社会に必要な人材がどのようなものか分からないのだろう。文科省も色々と試しているようだ。アントレプレナーシップ教育をしてみたり、留学させてみたり、総合型選抜枠を拡充してみたり、女子枠を作ってみたり。ただ、いずれも迷走気味に思われる。やりたいことは分かる。現在の大学教育では、大学入試問題のような簡単な問題が解ける状態で入ったあと、専門家があまり育ってくれない。

東大に新しい学部「ディープテック学部」と「コンピューティング学部」を作る話も「新しい高等教育の組織」という文脈から理解できるだろう。また、学士と修士を5年一貫制という話もこの文脈から理解できる。日本の修士号は海外のものに比べて質が高めなので、質の低い修士を量産して海外の博士課程に送り込もうというものだ。分野にもよるだろうが、学部から海外の大学院で研究を志望したとしよう。研究遂行能力、知的探究心、専門科目での成績といった要素を形にして提出する必要がある。たとえば、出願する大学4年の秋から冬の時点で論文が1本査読中か国際学会発表くらいがないとその次の9月から進学するのは難しい。逆算していくと、十分に研究をしたことがあれば1年で十分かもしれないが初めて研究をする学部生であるから、大学3年生の頭くらいには研究を開始していたいという話になる。これができていないと、一旦日本で大学院に進学して修士まで研究をし、海外の5年制博士課程に入り直すことになる。これで2年半の足踏みである。専門課程の教育や研究が始まるのが遅い大学は不利である。

さて、ここまで大学が多様であるという話をしてきた。

現在の文科省の考える人材育成は、博士人材・国際人材・科学技術人材といったあたりのようだ。しかし、一体、それで十分に通じているのか。大学は多様なのだから、それぞれの視線からみた博士人材・国際人材・科学技術人材がいて各々がそれを育成しようとするはずだが、本当に育てたいものはなんなのでしたっけ。たとえば、一口に博士といってもその中身は本当に多様のはずだ。

逆にどのようなものを育てたいのかがはっきりしているならば、やりようはなんとでもある。東大の理学部物理学科は、ほぼ全員が大学院に進み、7割程度が博士になるのだから、それに倣った組織を作れば、7割とまではいかなくても多くの博士を育てることはできるだろう。聞くところによれば、文系でも、一橋の法学部や東大の経済学部は、学部から研究者養成をするゼミがある。学生数に対する教員数が効いているようだ。

しかし、本当に物理学の博士を量産したいのかは考えるところだろう。物理学科はノーベル賞を取るので国威発揚の面がある。本当にノーベル賞に集中と選択をしたければ、日本で繰り返し受賞している場所は限られており、京都大学工学部の化学系と東京大学理学部の物理系だけで自然科学系の受賞の3割ほどを占める。だから、物理学者は、物理学は役に立たないが人生を豊かにしてくれるなどといって開き直って許されている。物理の人たちは他の分野でも活躍するから量産するというのは一つの考えかもしれない。ただ、研究者の教育は分野によってかなり違うし、それぞれの分野の研究者の養成がなされている場所はあまりない。論文の読み方でさえ分野によって違う。たとえば、生物学の論文というのは Nature でも再現性が3割だったりするので、そういう前提で読むものだ。メソッドとフィギュアを中心に見て「アーティファクトが見えているのではないか」「このグラフを描くのにとんでもない金が使われているぞ」「このあたりは参考になったから自分の研究にも取り入れてみたい」などといいながら最終的に「本当かなあ」と思うのが標準的な論文の読み方である。こういう読み方を教えてくれるところはあまり多くないのではないかと思う。たとえば、宇宙の理論では、かなりの割合の論文が現実とはまったく関係がない。モデルの記述力自体を上げることに価値があるからだ。つまり、多くの分野では、読んで文字通り受け取っているわけではなく、ここまでまとめたので共有しておくというものだが、その精度や射程には暗黙の留保がついている。そして、健全な中の人はそれを暗黙に理解している。だから、論文への言及の仕方を見ると研究者としての訓練を受けているかが分かる。

多様な人材を育てるというときに、よく例えになるのはオーケストラだ。たとえば、弦楽器の奏者も管楽器の奏者もたくさん育てた、と聞くと多様性があるように聞こえる。だが、詳しく楽器の内訳を見たら全員コントラバスファゴットかチューバだったとなるとそれは多様性があるとはいえないだろう。つまり、楽器の粒度で多様性を見る必要があるという主張だ。スポーツで、日本はサッカー選手や野球選手と色々な競技の選手を育てましたでは多様性があるかは分からない。中をみると、サッカー選手は全員がゴールキーパーで、野球選手は全員が投手かもしれない。それでは日本代表は戦えないだろう。つまり、ここでいいたいのは、多様性を考えるときにどの粒度で考えるかを目的との関係で明確にする必要があるということだ。そして、大学の場合、研究チームは通常近い分野の研究者で組織され、優れた教育者が多くの弟子を育てるから、人為的に調整しない限り、ゴールキーパーゴールキーパーを育てゴールキーパーだけのチームで活躍して多様性が失われていくはずだ。このとき、何を持って人材が多様であるかは、目的を基準に粒度を決めることになるだろう。たとえば、数学者について考えてみよう。数学者には工学部などの教養課程の数学を教えるという仕事がある。また、国際的な賞を取ってくることも大事なのかもしれない。もしも、この2つだけが大事ならば、教養課程の数学が教えられて、世界的に研究されている分野の研究者ならばよいので、たとえば、日本のすべての数学者が複素幾何学の研究者でも構わないことになる。一方で、企業や他の学術分野がある数学の分野に興味を持った時に国内に共同研究を始められるようにしておくならば、満遍なく薄くばらまきどのような事態になったとしても誰かが拾えるようにする必要があるはずだ。これからの世界では何が当たるか分からないというならば特にそうだろう。

私見では、楽器に相当する粒度はまがりなりにも査読ができるかである。関連論文を追っていないと新規性やメソドロジーの妥当性などが分からないだろう。ただ、これよりももう少し粗い粒度も妥当に感じられる。職業人として、どれくらい引き継ぎ可能かという基準だ。たとえば、典型的な日本の会社のホワイトカラー総合職を考えてみると2, 3年でローテーションをしている。1年程度で引き継ぎができているということだろう。それならば、育成という文脈においては会社内で一つの職能集団として扱ってよい。先程の楽器の例ではコントラバスは四度調弦なので切り替えが少し大変であるが、五度調弦のバイオリン、ヴィオラ、チェロの間は一年以下で切り替えられるという話もあったので、この文脈では一つの職能集団とするべきなのかもしれないということだ。

ここでどの粒度が最も適切かは論じないが、いずれにしても学会の分科会かそれよりも細かい粒度になりそうだ。博士人材は生物学でいう多系統群なのであり、どの粒度で同じ分野であるとみなしどの分野の博士がどれだけいて欲しいのか考えることは重要だろうが、それがなされた形跡が見られない。

アントレプレナーシップ教育で経営者・起業家を育てたのも評価が難しい。経営をしてみた感想として経営に向く人物があまりいないことは確かである。ただ、実際のところ日本でスタートアップを作っても、ほとんどが日本の市場をターゲットとしている。AWS やら Apple Store やら Google 広告やらを利用して海外に上納金を納めながら、日本の他の企業とパイの奪い合いをするのだから日本の国力に繋がっているとは思えない。国内の雇用は総和として減っていそうだ。日本の国力がますます高くなっていく算段があり、豊かな中間層があるならば、そこに向けた商売をする人たちを増やすことは好ましいことだが、それが有効になるためには現状その前に必要なことがある。

国際人材について文部科学省の考える人物像は、「語学力、主体性、異文化理解」の3つのようだが、この3つが高い水準で揃っている人物は世界中にいる。海外の大学などで研究室を持つことなどを想定しているようだが、そのためには学術的能力も必要なので多くはそうならず、結果、そこそこできるこの3つに世界的に比較的珍しい日本語能力を組み合わせて、外資系の企業で日本のマーケットに向けて仕事をするというのが典型的な役割になる。これはマイナスグローバルとでもいうべきものだ。こういった仕事は他の企業により多くの選択肢を与えるので、日本国内の産業に国際競争力があるときには必要な仕事かもしれないが、日本経済の先行きが不安なときに文部科学省が予算をつけて育てるようなものではないだろう。少なくとも、町工場で輸出される自動車の部品を作っている方がよほど国際人材であると私は思う。バネなどを作れば確かに海外の顧客に届いている。別に外資系企業で働いていたとしても、外国市場に向けて仕事をしていれば、日本に外貨を持ってきていることになるから国際人材だろうが、日本市場に向けて働いていたら外貨は流出している。つまり、日本のマーケットを顧客としている部分が想定と違うのだ。

そういうわけで、私は本当にするべきことは、国力を上げるための外貨の獲得と国内雇用の創出であると考えている。つまり、国内の人で外国にいる人のために何かをするということだ。日本は資源がない国であるから食料やエネルギーを輸入せざるを得ない。そうなると、輸入のために外貨が必要で、最終受益者が海外であるような産業が必要になる。日本は伝統的に自動車・鉄鋼・半導体である。そして、そういった産業をいかに人材で支えるかという話になる。ところが、おそらく特定の産業分野へのテコ入れは難しいのだろう。結果的に、容易に育成できる予定外の人材が育っていく。

特に日本は国家予算や預金の循環の担い手の立場が強い。古くは三公社五現業、電電ファミリー、護送船団方式などといわれ、長信銀3行が旧6大銀行グループの上にいた。このため、国家予算と預金の流れに近い場所がよい職場と考えられやすい。その後現在まで単に循環の担い手のいる組織が少々入れ替わったにすぎない。よって旧来の価値観のまま人物を育てるとそこへ入り込もうとする。しかし、それは外貨の獲得から最も遠い場所だ。

もちろん、最終受益者が国内である仕事、つまり「国内をきちんと回す」仕事も大切である。日本の国内の生活環境は素晴らしい。しかしそれを支えるためには「国外からお金を取ってくる」仕事が十分になくてはいけないという話をしている。『日本は人不足なので「国内をきちんと回す」仕事もおぼつかなくなってきている。だから低技能の外国人労働者に働いてもらい、高技能の日本人がより生産性の高い業種に就くことで、国全体の生産性が上がる』という話が移民研究の分野である。それは一面真実だとは思うのだが、「高技能の人がより生産性が高く国内に向けて仕事をし外貨を流出させる職業についている」というのが実際ではないか。

外貨の獲得をどのようにするか考えるために、一般に仕事を価値の源流で分類すると、それほど種類はないように思われる。1.自然から価値あるものを採取・育成するか、2.物質を加工や構築して価値を増やすか、3.価値のあるものを修復や維持するか、4.移動や接続によって時空間の制約を解消するか、5.価値のある場所や環境を提供するか、6.対人サービスか、7.知識や情報自体が価値か、8.計画や管理で効率的に機能させるか、あたりだろう。このうちで最終受益者が海外になりやすいものは、1.採取・育成、2.加工・構築、4.移動・接続、7.知識・情報あたりで、長期間保存できるか、時空間の制約の解消自体か、時空間の影響を受けないものになる。観光を盛んになれば、5.6.も外貨を獲得できるかもしれない。しかし、常識的に考えると観光の産業のサイズはそこまで大きくならない。日本の人口は世界の1.5%であるからすべての世界の人が日本に毎年平均5日滞在すると、国内のインバウンド客の人数が日本人の人口にようやく並ぶ計算になる。

また、最近の日本企業の潮流に、海外の企業の買収や投資で食べていこうというものがある。もちろん、うまくいけばいいのだが、海外の企業の統制がとれないなどの失敗事例も聞く。そして、仮に、うまくいったとしても日本国内の雇用があまり創出されないだろうから「国内をきちんと回す」前提となる豊かな中間層が成立しない。

もしも、日本の伝統的な企業がこれからも巨大なチームを作り、外貨を獲得し続けてくれるならば、それで問題はない。日本のエネルギー自給率は1割、食料自給率は4割程度、それも肥料や農薬や飼料を輸入に頼っているのを計算外にしてこの数字だ。仮に、日本の企業が外貨を獲得できなくなるとすると、一人で外貨を稼ぎ出す能力を持った人物を日本中で育てなくてはいけない。

一方で日本の経済は、失われた30年で低迷している。特にここ10年、日本の給与水準はアメリカの給与水準に対して相対的に、半分から1/3になったという感覚がある。アメリカの給与に対してドルの価値が落ちていて、ドル円の為替で円の価値が下がっており、日本円での給与が変わらないためだ。この10年で給与が半分から1/3というペースはあまりにも速すぎる。しかも、まだ日本の給与水準は世界平均や中国平均(内陸部が下げている)から見ると3倍くらいある。マクロ経済の未来予測というのは難しいが、仮にこのペースが継続すると、給与水準が10-20年で世界平均まで落ちる計算になる。日本の給与が安いという話をすると物価も安いから大丈夫という反論が来ることがあるが、これは、国内の労働付加価値が相対的に下がり、輸入品が相対的に高くなっていく話である。

そうなると、日本も食料とエネルギーのために出稼ぎをする国になる。日本の10倍、30倍給与が払われる国に、自分たちの子弟を送り込む。そして、親兄弟の食料のために仕送りをする。別に必ずその様になるかは分からない。しかし、そのような可能性が1割でもあるならば、そのためのリスクヘッジはしておくべきであろう。

この想定では、海外で働ける人たち、しかも、日本語を使わずに働ける人たちを教育する必要がある。それも毎年数万人の単位で必要だ。

この際に、語学能力がどうしても高い壁になる。日本語がよく通用する国は他にないので、なんらかの語学能力が必要になるが、この語学能力の差は基本的に埋まらない。大人の言語能力は20年程度かけて完成しているので、いずれにせよ同程度の時間がかかる。そこで、語学能力が不完全でも専門性があればなんとかなる専門職を探すことになる。

海外で日本語を使わずにできる仕事はいろいろある。出稼ぎをせざるをえない状況に対処するためには、そういうスキルをえり好みせずに日本中にばらまくことが大切だろう。

ただ、アメリ就労ビザの内訳を見ると、どのような職業が国境を超えられるかは比較的はっきりしている。2024年度の H-1B VISA (特殊技能職ビザ) の3分の2が情報科学に関連する職で25万件以上が発給されている。H-1B VISA の抽選の通過率が下がったので現在はないが、2010年過ぎには日本の新卒採用でシリコンバレーでソフトウェアエンジニアとして働き始めることさえできていた。その他の職業はどれも全体の1割以下だが、エンジニアリング・建築、経営・会計、医療・健康といった分野でも発給されているから、そういった分野でも育成ができる人は育成して欲しい。出稼ぎができる能力を保険として持っている人物は多ければ多いほうがよい。

私自身、ソフトウェアエンジニアの育成をしており、Google だけでも毎年入社していった。今年も含めて10年近くの間、毎年している。ここ3年ほどは少し市況が厳しいが、それまでは未経験から速ければ半年程度で入社した。今、ビッグテックは以前よりも運の要素が高まっているが、とはいえ選択肢は広がりより多くの企業に就職していっているくらいだ。研究者の話をすると、高校の周囲の学年では20代のうちに准教授になったのが100人に1人くらいで、アラサーのうちに海外の研究室をもったのが50人に1人くらいであると思う。おそらく本来、文部科学省が考えているような人材を育成することは難しいことではない。

(これに対して、それは教育なのか選別なのか、と聞かれることがあるがそれは別に書いたのでそちらを見て欲しい。)

nuc.hatenadiary.org

ここまで来て、文部科学省が何をしたがっているのか、そして、なぜ大学改革がうまくいっていない状況が続いているのかが想像できる。文部科学省が持っている道具があまりにも大味で、当初のアイディアがよかったとしても、具体的に実行される頃にはなんだか少し違うものになっている。そして、条件を満たす中で、もっとも育ちやすいものが育つのだ。国際人材を育てたいと願ったときに、国内のリーダーとして、あるいは、国外の企業や大学で働き、外国の市場で活躍する人材を想定していたはずだ。外資系企業に雇われて日本の市場の中で働く人たちを育てたいとは思っていなかっただろう。だが、実際には、後者のほうが遥かに容易だから工夫しなければそちらが育つ。また、専門家というのは少し分野がずれればその共通基盤としている能力が大きく変わるものである。だから本来どこを伸ばしたいのか、学会の分科会程度の精度で指定しないといけないはずだ。だが、玉虫色にするためにどのような分野でも参加できるようなプログラムになっている。日本も AI に力を入れたが、世界の AI の研究者の半分は中国系になっている。そして、本来は、もっと大規模にドラスティックに大学の構造を変えたいはずだ。H-1B の 2/3 が情報科学関係になるという規模感に数年で追従する必要が本来はある。だが、明治時代から続く古い組織が学生を選び、数十年ごとに教授会が次の教授を選んでいくのでそのようなドラスティックな変化はできない。そうなると、大学に日本の経済を支える労働者を育ててもらうことの限界が来ているのだろう。

さて、ここまで、助教の呼称の話からはじめて、大学の制度の歴史について書いてきた。歴史的な経緯で硬直的な制度と現代のグローバルな研究教育環境の取り合わせが悪く50年以上にわたってあがいてきたのだ。文部科学省は、大学の自由度を高めて時代に即した人材育成を模索するが、ボトムアップの教員組織や研究者としての価値判断から必ずしも思惑通りには動かない。大学は非常に多様な組織であり、学会の分科会程度の単位で異なる学問をしており学問の継承をしたい。一方で、日本は、経済の低迷や国際競争の激化といった環境の変化によって海外で稼げる人物を必要としている。状況変化に即応して必要な人材を大量に生み出す仕組みが必要だ。しかし、旧来の仕組みではそれは難しい。そこで旧来の仕組みの予算をどんどん削って新しい仕組みを作ろうとするも、新しい仕組みも目的を達成できているとは言い難い。助教の呼称はつまらない問題に見えて、日本の教育制度全体に繋がっているのだ。

私がこの文章を書くことで日本の高等教育の状況が変わるとは思わない。旧来の組織はこれからも予算を削られ続けるだろうし、新しい組織は少しずれた施策によって常に予定外の結果をもたらし続けるだろう。これは、大学のみならず、日本の未来を左右する話である。ただ、日本の教育がこのようなことになっているという認識を広く共有するだけでも、将来的な変革への一歩になるのかもしれない。

*1:その後、この条文には、1950年に「講師は、教授又は助教授に準ずる職務に従事する。」1973年に「副学長は、学長の職務を助ける。」が追加された。
昭二五・四・一九 講師追加
https://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/00719500419103.htm
昭四八・九・二九 副学長追加
https://www.shugiin.go.jp/internet/itdb_housei.nsf/html/houritsu/07119730929103.htm

*2:その後、平成19年法律第九十六号で現在は92条に繰り下がっている。
https://www.shugiin.go.jp/internet/itdb_housei.nsf/html/housei/16620070627096.htm
また、副学長の職務が平成26年法律第88号で変更されている。「副学長は、学長を助け、命を受けて校務をつかさどる。」
https://www.shugiin.go.jp/internet/itdb_housei.nsf/html/housei/18620140627088.htm

*3:もっとも、中国や韓国では、助教は独立していないアシスタントを指す言葉であるらしく、中国や韓国との関係では混乱をおこすのではないかという意見もある。
馬越徹『新設された「助教」名称は適当か―日・韓・中の三国比較の視点から―』
https://www.cshe.nagoya-u.ac.jp/publications/journal/no7/14.pdf

*4:大学設置基準第14条翻訳
https://www.japaneselawtranslation.go.jp/ja/laws/view/3793#je_ch4at2

*5:大学設置基準第15条翻訳
https://www.japaneselawtranslation.go.jp/ja/laws/view/3793#je_ch4at3

*6:学制百年史:文部科学省
https://www.mext.go.jp/b_menu/hakusho/html/others/detail/1317552.htm
2002『国立大学の構造分化と地域交流』国立学校 財務センター研究報告https://www.niad.ac.jp/publication/sonota/pub_zam/center_research_report/n000c006.html
天野郁夫『戦後国立大学政策の展開』(『国立大学の構造分化と地域交流』第1章)
https://www.niad.ac.jp/media/001/201802/nc006004.pdf
天野郁夫『国立大学論 ―― 格差構造と法人化』
https://www.niad.ac.jp/media/001/201802/nf003011.pdf

*7:佐々木研一朗『明治期の東京大学における政治学教育に関する一考察-カリキュラムを中心に-』
『どうして井上は講座制を導入しようとしたのか。帝国大学とその学問,その経費の大きさへの世論の批判があった。井上は批判をかわす方策のーっとして講座制を導入した。効果として(1)講座制に伴う「専門」重視の傾向, (2)文部大臣と大学との,講座制を媒介とした新しいあり方の構築がある。上で見たように講座の設置改廃は勅令による。政府と文部省が講座の設置改廃を通じて大学に対して新たな統制形態を確立しようとしたのである。(1)は要するに学者を非政治化するものである。学者に「専門」を意識させることで研究に専念させ 大学内に閉じ込めておくという意図である(寺崎2000:371-411)。』
https://meiji.repo.nii.ac.jp/records/10088

*8:国立大学等の独立行政法人化に関する調査検討会議『新しい「国立大学法人」像について』
https://www8.cao.go.jp/cstp/siryo/haihu16/siryo2-2.pdf

*9:2010京都大学特任教授の称号に関する規程
https://www.kyoto-u.ac.jp/uni_int/kitei/reiki_honbun/w002RG00001233.html

*10:2002年の東大先端研の例が詳しい。
小林俊哉,馬場敏幸『東大先端科学技術研究センターにおける特任教員制度の 現状と展望一国内大学における 教員任期制の一事例として一』
https://www.jaist.ac.jp/coe/library/jssprm_p/2003/pdf/2003-1C07.pdf
「各国立大学法人の非公務員型教職員の身分保証は、就業規則等において規定。採用は、法人の定めるルールにより採用」と明文化

*11:2005年国立大学法人京都大学特定有期雇用教員就業規則
https://www.kyoto-u.ac.jp/sites/default/files/static/ja/profile/policy/kisoku/kichiran/documents/h17/2005_3-656fa6eb912209996540304518959711.pdf

*12:京都大学に特任准教授がいる件であるが、いくつかの下部組織が独自に特任教授や特任准教授などの称号を付与していることが分かった。おおむね学外の人物に身分を与える際に用いる称号のようである。内規で定められているため公開されているものが多くは見つからなかったが『京都大学数理解析研究所数理解析研究交流センター内規』が『京都大学数理解析研究所要覧2025』に掲載されていた。
「第 3 条 所長は,国内外の優れた研究者であって,センターにおける研究交流の推進のために必要と認める者に対し,協議員会の議を経て,特任教員(特任教授,特任准教授,特任講師又は特任助教)の称号を付与することができる。」とある。
https://www.kurims.kyoto-u.ac.jp/~kenkyubu/youran2025.pdf

教え方を教える: ソフトウェアエンジニアリングと中学受験

……春にして君を離れ……でも今は春じゃないわ、十一月じゃありませんか……
アガサ・クリスティ『春にして君を離れ』

はじめに

この文章は、「競技プログラマーのためのコーディング面接、これだけ」というタイトルで書き始めたものだ。以前よりソフトウェアエンジニアの教育をしており、年によっては GAFA が揃うこともある。Google のソフトウェアエンジニアだけでも10年近く毎年入っており、教えられて入った人も教えるようになり、今年曾孫(4代目)の Google ソフトウェアエンジニアが誕生した。ただこの育成速度ではまったく十分ではない。年間一万人の桁で育てる必要があると考えるので教え方自体を広めることにした。書き進めていくうちにコーディング面接に有用なだけでなく、むしろ学習や仕事全般に共通する話になった。おそらく、汎用性がある話ではあるのだろう。外資コンサルタント外資系金融機関の人たちが時々見学に来て、職種が違っても同じ面接手法だとみな言っている。また10年以上前にスポットで家庭教師をして桜蔭や開成に入っていったことがあり、本質的に同じところがある。特に偏差値40台から開成中学に入る方は詳細を書いた。コーディングに関係がない人はここをクリックして「選別と教育」の章から読むといいだろう。

競技プログラマーのためのコーディング面接、これだけ

競技プログラミングでは普通に行われていることだけれどもコーディングインタビューでは本当にやらないほうがいいことがある。ここによくみるものを列挙しておく。これですべてとはいわないが、どうしてそれがまずいと判断されるのかについても丁寧に書いておいたので、これを丁寧に読むだけでレッドカード級のやらかしはほぼなくなるのではないかと思う。

全体を通して重要なポイントを3つあげる。まず、採用したいのは仕事ができる人であるということ。次に、なにか目的のために仕事をしていることを意識すること。そして、遠い帰結やリスクを予想できること。

それぞれについて簡単に説明しておくと、まず、仕事ができるというのは、一緒に働いたときに成果がより出るということだ。典型的な簡単な仕事は「巨大なコードベースと要望が与えられて、要望に従うように振る舞いを少し変えること」や「バグの原因を突き止めて修正すること」などである。それが十分にできるかを間接的に見るために採用活動をしている。次に、仕事の目的と現在の行動の整合性が取れているかは当然に重要だし、ここから外れた行動は違和感の形で見分けがつく。そして、遠い帰結を考慮していないと、痛い目にあったことがないのだなと判断される。

勘違いしやすいこととしては、最終的に出てくるコードの文面のみで判断されているわけではないということだ。あらゆる場面での感覚といったものまで見ている。特に、なんとなくこれは嫌だなという気持ちを共有できるかは大きなポイントになる。

ここからは具体的な例を書いておこう。

標準入出力からのやりとり

もちろん、オンラインで提出するなどで、標準入出力でやり取りが指定されていることがある。そういった場合はそれでいいのだが、面接官と対面していて、テキストエディターやホワイトボードなどで単にこういう感じのコードを書いてくれといわれてコードを書くときに、標準入力から受け取って、標準出力に出力するコードを書く人がいる。

仮に面接官が親切ならば次のように言うだろう。「関数で書いて欲しいです。ところで、関数呼び出しのオーバーヘッドはいくらでしょうか。また、標準入出力でデータのやりとりをするときのオーバーヘッドはいくらでしょうか。それぞれの、いい点悪い点を挙げてください。」

許容される範囲の答えの一例としては、「関数呼び出しのオーバーヘッドは1ナノ秒オーダー。一方で、標準出力でデータを受け取る場合はプロセスの立ち上げがあり、状況によって違いますが、たとえば1から10ミリ秒くらいを想定しますので、速度としては1000万倍くらい違います。一方で、シェルスクリプトなどから呼ぶ想定ならば、標準入出力が詰まったりすると自動的にプロセスを一時的に止めたりしてくれるいい点があります。」くらいになるだろう。言語によっては数字が変わる。言語間をまたいだやりとりとして FFI や RPC などを混ぜて比較してもいいだろう。

どういうことかというと、まず、標準入出力をインターフェースとしようというのは技術的なデシジョンである。技術的なデシジョンをしたというからには、なぜそれをしたかについての答えが返ってこないと恐ろしい。これは何も考えずに、10ミリ秒、ライブラリーの都合によっては1秒を超えるかもしれない水準の高いコストをかけることにしたということになるので、なぜそうしたのかを説明する必要がでてくる。

ただ、ここまで答えられたとしても、マイナスが消えても時間が経過した分だけ損で、より評価されるわけではないと個人的には感じる。

秒での判断

上の件でもそうだが、だいたい何がどれくらいの時間で実行されるかを見積もれることは大事だ。

プログラムを書くというのは、なにか目的があって、その目的を満たすために行うものである。その内容は様々で、たとえば、スーパーコンピューターを数ヶ月借りて数値計算を回して気象現象について知りたいのかもしれないし、リアルタイムで動画を生成したいのかもしれない。知りたいことは今の方法で間に合うのかである。つまり、スーパーコンピューターならば何ヶ月で終わるか、リアルタイムの動画生成ならば計算が10ミリ秒で終わるかである。正確に時間を見積もるのは難しいので、事前に終わるか分からない場合もあるだろう。その場合はちょうど難しいところなので計測してみるという話になるかもしれない。いずれにしても具体的に何秒なのかが見積もれないといけない。計算量はその計算をするための手段なので、計算量が分かるのに計算時間が見積もれないと驚く。計算量はあくまでも極限を取ったときの漸近的な振る舞いのことなので、それが直接何かの根拠になることはない。たとえば、社内研修を開く仕事を任されて計画を立てている。全員の弁当を手配することになった。その時に、弁当代は来場予定社員数に比例することしか情報が出てこないと動揺する。単価が500円でも3000円でも概算でいいので予算を提示して欲しい。これと同じことだ。熱伝導方程式の形から、火の通りやすさは厚さが半分になると4倍になるが、ある厚さの肉がどれくらいで焼けるかの目安がないと実践できない。これと同じことだ。

もちろん、分かっている人たちでも、時間内に収まることがあまりにも明らかな場合は明示的には言及しないことがあるのだが、そういう状況でも言及していないだけで見積もりはしている。見積もりのために必要な知識はそれほど多くない。どうせ桁くらいしか合わないものなので、言語ごとの倍率と記憶階層やネットワークなどに典型的にかかる時間を合わせて20も覚えればそれらしいことが言えるようになる。少し古いが Jeff Dean numbers で調べると出てくるものが代表的な資料だろう。そこにない数字では整数の割り算が遅くて20-50クロックくらいかかるのは知っておいてもいいかもしれない。言語ごとの倍率は、おおまかに3つに分けて考えている。コンパイルしてネイティブコードになるタイプ。これを1とすると、中間コードやガーベージコレクションのオーバーヘッドが入るグループが2〜5倍。動的型付けするインタープリタ型の言語は30〜100倍くらいで見積もっている。このあたりの数字は時代によって倍くらい平気で変わるのであくまでも目安である。

リアルタイムの動画生成の例でも少し書かれているが制約はプログラムの目的からある程度自然に出てくるものである。コーディング面接では入力の制約を質問すると評価されるものであると考えている人たちがいるようだがそうではない。プログラムの目的から制約を見積もること、見積もれないと判断できる場合には質問すること、確認して合意を取ること。そういったことがなされないと不自然に感じられる。これを表面的に真似すると制約を質問すると褒められているようにみえるということだ。

また、目的から制約がだいたい決まるとはいえ、制約は破られていくものであるので、ものによっては制約が変わっていくかもしれないと思って作るほうが好ましい。

一方、論理の方向が逆なので制約から想定解の計算量は推測できない。コストをかけて良い状況であればデータセンターを何ヶ月も占有することを想定しなくてはいけないこともあるからだ。コーディング面接はこういう状況のことを考えて欲しい場合がある。

計算量の使い方についても一応コメントをしておこう。プログラムはその目的から使用できるリソースに制限があり、実行前に大まかにその制限を満たすかどうかを見積もる必要がある。その見積もりの一部で計算量を使うということだった。このため上から抑えるのであり、どれくらい緩い評価をしていいかは、どれくらいリソースが逼迫しているかに依存する。あまり文句をいいたくないのだが、LeetCode などに載っている計算量評価は緩すぎて意味があるものになっていないことがある。また、計算量の評価だけでは間に合うか分からないときには計測する話になるだろう。

タイトな計算量の評価は難しくて期待されていない場合がある。真面目に評価すると計算量がカタラン数や分割数などの組み合わせ論的な数やフィボナッチ数などになる場合はそれなりの頻度で現れる。カタラン数は分岐の数が一定の二分木の総数、分割数は正の整数を順序を考慮せずに正の整数の和に表す方法の数を指す。そうなると、カタラン数や分割数の漸近評価がしたくなる。カタラン数の方はスターリングの公式から導出できる。分割数の方はハーディとラマヌジャンが発見したもので  \displaystyle p(n) \approx \frac{1}{4\sqrt{3}\,n} \, e^{\pi \sqrt{\frac{2n}{3}}} である。計算量に分割数が絡むコードは結構あるのだが、この漸近評価は競技プログラミングでも競技数学でも範囲外になっているようだ。国内外のメダルを持っている人たちにもそれなりに聞いたが、うろおぼえでも知っていたのは一人だった。近い分野を専攻したので知っているとのことで、競技関係では見たことがないとのことだった。導出に複素解析などが必要でただの知識問題にしかならないからだろう。このように高校生くらいでも理解できるものしか扱われていないことは意識しておいたほうがいい。一方で、分割数の漸近評価は1, 2%の面接の問題で絡むという印象がある。現実の問題は高校範囲を超えないように出題されたりはしない。そうなると、計算量の計算自体が難しいのでもっと緩い評価でなんとかするか実際に計測したいというので十分だろう。

計算量についてもう一つ。具体的な計算をすると  n! \approx 10^{\,10} \, となるような n を求めたくなることがあるだろう。腕を組んでじっと考え出す人たちがいるのだが、こういうときには手を動かして掛け算をはじめよう。どう考えても答えは10以上20以下である。十数回もかけ算をすれば分かるはずである。桁があえばいいので数字を丸めていっても構わない。6か7まではまじめにかけて、あとは10だと思ってもよい。

一応、四則演算ができれば十分時間の見積もりはできると思うが、それに加えてルートと指数対数を知っていると速いところもあるだろう。特に、常用対数で 2, 3, e あたりを覚えておくと会話がスムーズになることがある。たとえば、IEEE754の倍精度浮動小数点数仮数部が52+1ビットだが、これは十進法では53*0.3010だから有効桁数が15,16桁だといえる。たとえば、上の分割数の漸近評価をすると、 \pi \times \sqrt{\frac{2}{3}} \times \log_{\,10}{e} \approx 1.1 なので  \log_{\,10}{p(n)} \approx 1.1 \sqrt{n} - \log_{\,10}{n} - 0.84 となる。意外に n が100でも億の桁である。そもそも分割数の漸近評価をすることはないだろうがこういうこともできる。実用的なところだと、万、億、兆、京が 4, 8, 12, 16 で、K, M, G, T が 3, 6, 9, 12、m, μ, n が -3, -6, -9 を覚えておいて足し算引き算をするくらいでも便利である。

速度の最適化

コードは多角的に評価されるもので、状況に応じて何が重視されるかが変わる。コードの複雑さを減らすことが比較的重視される事が多いが、ライブラリーなどでどういう使われ方をするか分からないので速度を重視することもある。速度の議論をするならば定量的にするべきである。典型的にかかる時間を覚えていてそこから概算し、それよりも細かい精度が必要ならば実際に測定してみる。

時間の議論では、ナノ秒から年(3*10^7秒強)単位まで広いスケールの時間が出てくる。3京倍違う。年単位のプロジェクトの話をしているときに、ナノ秒改善する方法について固執する奇妙さが分かるだろうか。地球から最も近い恒星系アルファ・ケンタウリまでの距離をメートルで表すと4京メートルくらいだから、約4.3光年先のアルファ・ケンタウリまでの旅行の計画中に、1メートル経路を短くする話をしているようなものである。1ナノ光秒が30cmほどだから桁感が同じになる。物理的な世界ではこれほどの差がつくことはまずない。コロナの初期に医療物資の輸入のため上海から東京のチャーター便を船便と比較したことがある。1000万円程度であったからこれくらい斬新なことをしても輸送費が1万倍変わらない。だが科学技術関係の見積もりでは大差がつくことがあるので局所的相対的な計算はあまり意味をなさない。つまり、たとえば全体の一万分の一の部分を百倍速にしても全体ではほとんど変わらないということだ。

多角的な評価は実際に大事で最近もそういう経験をした。有向グラフの上で7つ以下の辺で繋がっているノードの組を列挙する再帰関数が C# で与えられ、サーバーのメモリーを食い尽くしてクラッシュするので直して欲しいということだった。再帰関数の中で、長さが7以下のリストからハッシュセットを用いてループがないかを確認していたのだが、このハッシュセットを使うのをやめてリストの全要素を確認するようにすると速度もメモリー使用量も改善して動くようになった。そもそも長さが20以下程度ならば、線形に全要素を調べるほうが速いし、ハッシュセットはヒープ上に作られるのでガーベージコレクションへの負荷が大きく、ここが動くかどうかにクリティカルなのだ。

局所戦にこだわらない

多角的に評価で思い出すのは Python の文字列結合だ。

s = ""
for x in a:
    s += x

というコードを書いたとしよう。

「文字列の追記は文字列の再構築が走るので、リストに append して join するほうがいいのではないか」というのがよくある面接官の反応だ。これに対して、「そうですね。」といって直したらそれほど大きな問題はない。だが、たまに抵抗する人がいる。「そう思っていたんですが実験した範囲では最適化が効くみたいです。」この返答はなかなかに困る。「いつでもその最適化は行われるのか。インタープリターのバージョンに依存しないのか、たとえば、バージョンアップで最適化がなくなることはないのか。もしも、最適化がされることが保証されていないならば、そのように書いておいたとして、どういった場合に最適化されないのか。そのような仕様が仮にあるのだとしたら、そのドキュメントへのリンクをコメントで書いておいて欲しい。また、Python のバージョンが変わったときには、その最適化がされることが保証されていないならば、そのドキュメントをもう一回見て、バージョンによって仕様が変わっていないかどうかを確認する仕組みが必ず走るようにして欲しい。」という疑問や欲求が自然に湧いてくる。ここまでの疑問にその場で答えられるならば、面接官は「なるほど、そうなんですね。」といって、Python に詳しい人だと思うだろう。そして、仕様レベルで最適化が保証されているのだとしても、最低限コメントとして、「このような場合には最適化されることが保証される。どこどこ参照。」と書いておいてほしいと頼むだろう。なぜならば、今後そのコードを読んでデバッグする人が、「むむ、もしかして、今回のタイムアウトの原因はここではないかな?」といって余計な実験をすることになりかねないからだ。それで、そうなのだとしたら join で書き直したほうがよいだろう。つまり、気にしているのは思ったように動くか、ではなくて、半年後に読んだ別の同僚が不安にならないか、環境の変化に対して頑健か、なのだ。

ちなみに、疑問への答えだが模擬面接のあと調べた。Python 2 の公式ドキュメントには CPython などでは文字列の追加の最適化が 2.4 から効く場合があることが書かれている(5. Built-in Types — Python 2.7.18 documentation)。Python 3 については公式ドキュメントには言及がないようだが、ソースコードを見る限り CPython では 3.3 あたりから最適化が効く場合があるようだ。

さて、ここまで来て、知識のレベルによりそれぞれ異なる理由で異なる判断をすることが分かった。1. += が文字列を再生成すると知らない人。2. += が文字列を作り直すと思っているので join で書き直す人。3. 経験上最適化が効くらしいから += で書く人。4. 最適化が効くかどうかは難解な話なので join で書く人。などだろう。ここで 3. が一番困るのだ。

試してみたところ動いているというのはそれはそれでひとつなのだが、特に情報セキュリティーでは賢い敵が間違いをつついてくるので、ランダムな入力で試してみて動いたからといって問題がないということにはならない。気になって調べるという動作をすると30分もかからずに 3. から 4. になるだろうから、3. であることは気になったことがないことを示している。また、仮に、4. であったとしても、聞かれなければ細かい議論には立ち入らないほうがよい。コミュニケーションとして仕事の目的に向かっておらず、詳しいことをアピールしようという行為だからタイムペナルティーにしかならない。

ここまでをまとめると仕事の目的と遠い帰結が見えていないために局所戦をしていてそれに気がついていないという状況に気をつけようということだ。

変数名・関数名

命名規則やスタイルは状況に依存して変わるものであるから、一人で開発しているならば自分なりの理由があってコンシステントであればいい。ただ、言語によっては標準的な指針があるので、それくらいは軽く見ておいてもいいかもしれない。それに加えて、様々な考え方がありチームで統一することの重要性は知っているので合わせることにやぶさかでない、という態度であることが大事だろう。大規模な開発においては適切な独裁が重要である。

例を少し挙げれば……

関数名のほうが、変数名よりも大事ではある。巨大なコードベースでソースコードを読んでいて、関数名から何が返ってくるか分からなければ、定義の中身を読んでから戻ってこなくてはいけなくなる。そこで、呼び出し元のコードを読んでいて、概ねこういうものが返ってくると分かるものが好まれる。これは、心の理論の問題だ。つまり、書いている自分が分かることを読む人が分かるか分かるかということだ。自分が書いたコードであっても数ヶ月も経てば覚えていない。よくある痛い目に遭うのひとつである。

class が作れるように

言語によっては struct かもしれないが、なんらかのデータ型を作れるようにしておくことは大事である。仕事でまず使うからだ。そして、できて欲しいことの典型例が「巨大なコードベースと要望が与えられて、要望に従うように振る舞いを少し変えること」や「バグの原因を突き止めて修正すること」であり、それができるかを確認するのがインタビューなので、こういったところを見ている。

C++ の分割コンパイルの方法などは一人で小さいコードを書いているとあまり使わないかもしれないが大規模開発ではまず使う。ヘッダーファイルの中で using namespace std; すると include したファイルがすべて影響を受けることになる。なんらかの行動をしたことによる遠い帰結を予期できるかという話である。

何ができるようになる必要があるかの一つの考え方として「社内のエンジニア全員が数年かけて自分の分身に徐々に置き換わったときに会社が回るか」というのはいいのではないだろうか。すべてができる人はほとんどいないだろう。一般に、人は誰かに頼って生きているので、自分が代われない仕事があるのは当然なのだが、それはそこで人の世話になっているということだ。道路があるのも、食事が食べられるのも、ウェブが見られるのも、誰かがあなたのために投げかけてくれたからである。得てして、人は自分ができない仕事を軽視ないし無視する。また、相手の仕事の内容を理解していたら、より相手の仕事がしやすいように仕事を頼むことができるだろう。

「必要があるときに調べて分かれば別によいのでは」という意見は、状況によっては正しいのだが、壊れているのを見つけたときには問題の切り分けが必要だ。「こういう原理でここが動いているから、こういう入力に対して、これが返ってきたということは、ここまでは正常に動いていて、ここからも正常に動いているから、おそらく、ここのチームの担当箇所が問題を起こしていると思われる」と特定して連絡をすることになる。「こういう問題があって、たぶん、こういう理由で君のところだと思うんだけど、もしかしたら私の問題かもしれない。ちょっと協力してくれないか。」みたいに。これができないと関係している全チームに対して連絡をすることになる。で、各チームの人たちが上の行動を取り、要は全体の仕事を増やすことになる。

グローバル変数を汚さない、二度呼べるか

たとえば、トポロジカルソートを書いて欲しいといわれたとしよう。

from collections import deque

def dfs(G, v):
    seen[v] = True
    for next_v in G[v]:
        if seen[next_v]:
            continue
        dfs(G, next_v)
    sorted_list.appendleft(v)

N, M = map(int, input().split())
G = [[] for _ in range(N)]
for _ in range(M):
    a, b = map(int, input().split())
    G[a].append(b)
seen = [False] * N
sorted_list = deque()
for v in range(N):
    if seen[v]:
        continue
    dfs(G, v)
print(*sorted_list)

だいたいこんな感じのコードを書く。このコードは、グローバル変数に結果を書き込んでいるので、二回呼べない。seen を初期化をすればいいがスレッド並列で呼ぶとどうなるのか。こういう風に色々と再利用できるかについて疑問を感じる。引数で渡す程度で回避できる問題であるのに対してバランスが取れていない。環境によっては変更ができるかもしれないが再帰の深さには限界がある。他にも、ループがある入力であった場合に何が返ってくるのが好ましいのか、なども考えるところかもしれない。変数名が相当変なことはもうすでに書いた。

つまり、面接の場では、動くか動かないかだけを気にしているだけではなく、コードを見たときに多くの人が感じることを感じるか考えることを考えるかをみている。

こういう書き方は、2005年前後に日本の ICPC のコミュニティーで見かけるようになったもので、(当時は C++ が多かった)どうせ使い捨ての関数なので再帰の引数を引き回すようなことはしないでいいという考えでなされているものだ。

ここで軽く競技プログラミングの歴史を説明しておこう。日本では、1990年代に ACM-ICPCスパコンコンテストや旧情報オリンピック(4回で終了)が開催されるようになった。その後、2004年の夏に ACM/ICPC OB有志の会(https://web.archive.org/web/20050206181855/http://acm-icpc.aitea.net/camp-2004/ 後の OB/OG 会)によって合同練習会が開かれ、大学を超えたつながりができてきた。このあたりの人たちが TopCoder も遊ぶようになる。

そして、卒業生が練習会を開くのにならい、在学生も練習会を開くようになった。2007年にできた東京大学競技プログラミング同好会もその一つである。2007年国内予選1位から3位を独占したこの練習会(FrontPage - 東京大学競技プログラミングクラブ)には他大学や高校生も参加するようになり、また、年に一度 ICPC に似たプログラミングコンテスト UTPC を開いたので、競技プログラミングという言葉が ICPC 型のプログラミングコンテストのことも指すようになった。要するに、OB/OG 会でプログラミングコンテストの街ができ、そこの道場の名前が競技プログラミング同好会だったのである。そして、道場の看板が種目名となったということだ。ラグビーやバドミントンがもともと学校名・邸宅名であるようなものである。

もともと道場の名前を指すので、種目名としての競技プログラミングという言葉が指す範囲は一定しない。狭義には「複数の問題が与えられ、問題ごとにコードを書き、時間内に入出力の一致した問題の数を競う」というタイプのコンテストだが、ICFP コンテストなどこの定義に当てはまらなくても競技プログラミングと呼ばれることがある。この道場の出身者がよく遊んでいるためである。最近はオンラインジャッジシステムのことを競技プログラミングと呼ぶことさえよくあるようだ。もっともこれは最近の用法ではなく、2008年には Project Euler を含む言葉として使われているのでむしろ古くからある用法である。(焼き鳥屋で刑法学者と意気投合してコインハイブ事件について書き出すだけの難儀なお仕事 - 白のカピバラの逆極限 S.144-3)

ここで歴史の話をしたのは、この記事で書かれているような内容は昔は先輩から教えられてきたが、競技プログラミング同好会が登場したあたりから継承されなくなったというように理解しているからだ。過去にどのようなことがあったかを追うと自然と考えが相対化され、その射程と限界が浮かび上がってくる。

本題に戻ると、グローバル変数を汚すとインタビューの文脈では、こういう道具を作ってくれといったらわざわざ一回使うと壊れるように作った、というようにみえる。もちろん、一回使うと壊れるように作ることも技術的なデシジョンであるから、なぜその技術的なデシジョンをしたのかについての説明がつけられることが求められる。

REP マクロ

#define REP(i,a) for(i=0;i<a;i++)

正確には覚えていないがこれも2005年頃にはあったマクロである。TopCoderICPC あたりで使われていたようだ。

このあたりで見つかる。私は好まなかったが、特に i, j で二重に回したときに i, j を打ち間違うことがあって、見かけが似ているので気が付きにくい、というので使っている人がいた。当時の C++ には範囲 for 文もなかった。

いまでも rep という名前が保存されて伝承されているというのが面白い。

1972年にできた C 言語のシンタックスFORTRANCOBOL などと違い記号を多用する。この学習が難しいのでマクロでなんとかしようとする流れが昔からある。いくつもの流儀があるが、たとえば C 言語を FORTRAN 風にするマクロというとこんな風になる。

#define BEGIN {
#define END }
#define IF(c) if (c) {
#define ELSE } else {
#define ENDIF }
#define DO(i, from, to)  for (int i = from; i <= to; i++) {
#define ENDDO }

古くから今日まで伝わるものでは /bin/sh (1977年の Bourne shell) のソースコードのマクロが有名だ。これは Algol 68 の影響を受けている。

#define BEGIN	{
#define END	}
#define FOR	for(
#define WHILE	while(
#define DO	){
#define OD	;}
#define REP	do{
#define PER	}while(
#define DONE	);

昔から定期的に取り上げられており Usenet の1980年代1990年代にも記録がある。

1986年には Pete Orlin と John Heath が Easy C という記事でこういったマクロを推奨して、大きな論争を引き起こしたらしい。

そして、毎回猛反対を受けているものである。学習を阻害し、技術的に予期しない動作をすることがあるという理由もあるが、可読性・保守性を下げるというのが大きい。

プログラムのソースコードは、人が機械に命令を伝えるものであると同時に、人同士の意思伝達の手段である。だから、書くことよりも読むことのほうがだいぶ重要である。変わったマクロを使ったコードを使うということは、読むことが大事だと考えていないか、ほとんどの人が知らないものでも自分が使い慣れているから他人も読みやすいと考えているということを示唆するので、コミュニケーションや社会的な関わりに独特な感性を持つと判断される。

オンラインジャッジで機械しか読まないとしても避けたほうがいい。採用すれば年単位で一緒に働くかもしれないわけだ。最終候補者が若干名残っていたら、ここまで出てきたものを全部精査することもあるだろう。その時に自分のコードやレジュメなどを読んでいる横までいって説明することはできないのだ。

二分探索を読めるか

二分探索が典型的なので二分探索と書いたが、アルゴリズム全般、書けるけれども自分が書いたものさえ読めない人がほとんどであるように感じている。

書く時は自分の書き方を固定してもいいが、読むときにはどんな書き方がされていても動くのか動かないのかも含めて読めないといけないので読むほうがだいぶ難しい。

よく、開区間、閉区間という表現を使っているのを見る。それ自体は別によいのだが、中身を聞いてみると自分でも何を言っているのかが分かっていないことも多い。典型的には開区間や閉区間は数学で実数についていうもので、位相空間論における開集合と閉集合は性質として大きく異なるものだ。だが、配列の範囲の話の際は、自然数という離散量なので大した意味がなく、単に表現する不等式にイコールがついているかないか程度の意味しかない。そして、このときに何の値と範囲の関係の話をしているのかが分かっていないことがある。

とりあえず意味が分かっていないと感じたときによくする話をしておく。プログラムというのは融通の効かない機械に対して作業をしてくれと頼むものだ。だから、そもそも自分で手作業でその仕事を実行することができないならば読み書きできるはずがない。また、プログラムを書けるくらい理解しているならば、一人での手作業よりは少し難しい方法として複数人でシフトを組んで実行することもできるはずだ。

典型的な二分探索の問題として、広義単調増加の配列とある数が与えられて未満と以上に分けることを考える。複数人でシフトを組むために少し物語風にしよう。標高5000mの広い高原の奥に塔が1万本立っていて、0から9999までの番号がついている。各塔は登って降りてくるのに一日かかる。塔の上には数字が書かれていてその数字は小さい順にならんでいる。塔の上には同じ数字があることもある。したいことは5000未満の書かれた塔と5000以上の書かれた塔に分けることだ。

一人の人が毎日連続で塔を登るのは大変だから、ベースキャンプを作ってシフトを組むことになるだろう。一度、どの塔に登るかの戦略は忘れて、ベースキャンプの情報共有の仕組みを整えよう。普通に考えると、登って降りてきた人にレポートを書いてもらうことになる。まず、レポートの書式だが「何月何日何番の塔に登った。いくつだった。責任者サイン。」くらいで十分な情報だろう。「3月5日5番塔に登った。10だった。太郎。」「5月7日15番塔に登った。50だった。次郎。」そういったものだ。これを書類入れにまとめていく。シフトの日にやってきた隊員は、書類入れの中身を一通り見てどの塔に登るかを決めて出かけていく。隊員が何も考えずにランダムに選んだとしても10万回(ランダムに出てくる商品が揃う期待値と同じなので n log(n) くらい)も登頂したらおおむねすべての塔の情報が集まってくるだろう。

これだとあまりに効率が悪いのでベースキャンプに書類の整理係でも用意しよう。毎朝、書類から登る塔の選定に重要な情報だけを抜き出してホワイトボードに書く係だ。情報がないときにはホワイトボードに何も書かないのが自然だが番兵を使うこともできる。つまり、存在していない-1の塔と10000の塔を仮想的に考えて、-1の塔には-∞、10000の塔には+∞と書かれていたというレポートを作っても結果が変わらないことを利用する考え方だ。さて、このとき、本質的な情報は2つのみだ。「3月5日5番塔に登った。10だった。太郎。」「5月7日15番塔に登った。50だった。次郎。」という2枚のレポートがあったとして、5番塔の情報は、15番塔が5000未満と分かったらいらないのだ。そういうわけで、小さい側と大きい側の情報の2つだけあればいい。それをホワイトボードに書くときに、いくつかの書き方がある。「小さいと分かっている塔の中で最大の番号」でもいいし「情報がないのはここから」でもいい。同じ状況を表すのにどのように表現するかの方法は何通りかある。ただ、表現された数字が何を意味しているのかについてこのチームの中では共通理解がないとまずい。あとで揉め事になりうる。

何を言っているかというと、二分探索で左だの右だの書いてあることがあるが、それが部隊内でどのような共通理解がなされているのかは必ず問題となるはずなのに、書いた本人もその理解がないまま書かれている場合がよくある。動くコードだとしても少し話をしてみるとなぜかここを理解せずに書いていることが分かるのだ。ここの了解があれば、あとは登る塔は必ず妥当か、必ず終了するのかと、終了時に欲しいものが出てくるのかくらいの問題でしかない。なぜか理解せずに覚えようとする人をよく見る。中学高校あたりで仕込まれるのだろうか。

また、読むときには上の部隊内の共通理解がなんなのかを読み取って辻褄があっているかを確認すればいいはずである。これも二分探索に限らない。

標準ライブラリーの実装を読んでみるのもいい練習だ。そこにあるコードは、典型的な解きたい問題に対して、その欲求を満たすためにエンジニアリングした結果、標準ライブラリーに収納されている。つまり、何をしたいのかという欲求や目的があり、それをどう表現するか、という順番で作られているので、表現から意味を読みとくことになる。

ついでなのでここに書いておくが、一般的にコードは書くよりも読むほうがずっと大切で重要である。読んで理解するためには書くよりもどうしてもある面では高い能力が必要になる。自分で書くときにはどう書くかは制限できるが、他人がどう書くかは読んで理解するまでは分からないからである。これは、AI で書くようになったとしても同じである。AI でコードが書ける時代になったのでコーディング能力が不要になるのでは、と聞かれることがあるが、あまりそうは思わない。私がときどき例え話で述べているのは『最高に優秀で信頼できる弁護士がいて、分厚い契約書を持ってきて「契約書の中を直接読ませてあげられないが、どういう内容かはいくらでも説明してあげる。だからサインして。」といったとしよう。そのときあなたはサインができるか。』ということである。ソースコードはその会社の中の仕事をこなす機械のためのマニュアルであるから、契約書のようにそのまま動いてしまう。説明を聞くよりも中身を読んだほうが楽で正確であるという状況が変わらないならば、これからも読むことの重要性はそう変わらない。特にレビューを人間がせざるを得ないとすると、ボトルネックは人間が読む速度になる。自動テストなどの仕組みが AI 向けにチューンアップされるとますます開発速度が上がっていき、それに比例してレビューで読む量が増えることになる。そういうわけで、コードを読むことの重要性、物事を理解することの重要性は変わらない。

しかし、AI のある環境が訓練の難易度を上げる側面があることは確かである。専門家はコードを見たときに「書いた人がこういう意図で書いていてこう動く」「バグがないか」などを読み取っている。ただ、いきなりそれを同じ精度でやれといわれても厳しいので、そのプログラムについて自分で書くなどして十分に分析や準備をしてから読むことで補助輪にする。そして、最終的には補助輪なしにできるようになるとよい、というように訓練するだろう。この訓練は一つ難しいところがある。自転車の走行は、物理的に外から見ても自転車が走ったか否かは分かるが、読めているかは心の中の話なので外から見ても基本的には分からない。だから、自分で訓練をどんどん骨抜きにしてしまうことになりやすいのだ。

面接官を見すぎない

技術面接において、教授からの試問のように対応する人がいるがそうではない。一番近いのは、家族から電話がかかってきて「今から20分で家に着くんだけどその後10分で出かけないといけない。この10分で食べられないと夜まで食べられないからなにか用意してくれないか。」と頼まれたような状況だ。返事は「いいよ。何したらいい。」ではない。分かったといいながら、自発的に冷蔵庫を開けたりしてプランを立てて欲しい。

また、まったく難しい問題を出しているつもりがない。難しい問題を出しても大した判断材料にならないからだ。

面接官が次のような状況だと思うといいかもしれない。「1年間準備してきたプロダクトもローンチまであと少しだ。そこで、小さな問題があるという連絡があった。ローンチ後に直してもいいができれば直したい。だが、忙しすぎる。この仕事は自分でやったら10分でコードは書けるがそのあとにプロダクションに乗せるまでに問い合わせが来たりで手一杯なのがさらに手一杯になる。隣りにいる候補者にちょっとお願いできないかしら。」これが何を言っているかというと、自分ならば10分でできることをお願いしているだけなので、ある程度自律的に動いて勝手に完成させて欲しいのだ。とはいえ、はじめのお願いからして十分ではないので判断に迷うところは聞いて欲しい。また、面接官の手間をかけすぎるならば、そもそも自分でやったほうが早いということになる。もちろん、面接は緊張状態にあるし、普段の仕事ならば共有している前提はもっとあるだろう。そういったところは割り引いて見てもらえるだろうが、とはいえ、本筋と何の関係があるのかよく分からないことを滔々と語られても、時間ペナルティーを自分に与えているくらいにしかならない。

クイックソートについて

アルゴリズムについて知っているというと、書けることと呼び出せることくらいができれば十分知っているといえると思われている気がするが、おそらく面接の場ではそれでは足りない。特にクイックソート再帰の典型例であるから知っていて欲しいことが少し多めである。

インプレイスなクイックソートをナイーブに書くと次のようなものだろう。

int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[low]; 
    int i = low + 1; 
    for (int j = low + 1; j <= high; ++j) {
        if (arr[j] < pivot) {
            std::swap(arr[i], arr[j]);
            ++i;
        }
    }
    std::swap(arr[low], arr[i - 1]);
    return i - 1;
}

void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

とりあえず、クイックソートを書いて欲しいといわれたら、それは頭の中にある操作をコードの形で表現できるかという意味なので、これでも構わないと個人的には考えるが、このコード自体にはいくつか感じるところがある。

ピボット選択の方法として頭から取っているが、これはソート済みの配列に弱い。これに対して、乱択にする方法、頭と尻尾と真ん中の中央値を使う方法などがある。理論の文脈で最悪計算量が改善するメジアン of メジアンという手法が知られているが、これは現実的には遅く、知らなくてもいいのではないかと思う。

また、上のコードは同じ値がある時に弱く、特にすべて同じ値であったときに最悪計算量を引く。これに対しては、3値で分ける方法、ピボットと同じ値の半分を後ろに半分を前に回す方法などがある。

最後に、最悪計算量に近いときのスタックオーバーフローを起こさないようにするためには小さい方から先に再帰する必要がある。大きい方は末尾再帰除去最適化に任せるかループに書き換える。一般に関数呼び出しのスタックのサイズはそれほど大きくないからこういう工夫が必要になる。

Google のソフトウェアエンジニアに聞くとだいたい上のような内容が出てくる。アルゴリズムの本ではクイックソートが載っていることが多いと思うが、これくらいまでが載っていないと不十分だろう。面接ですべてが答えられる必要はないが、アルゴリズムに詳しいとアピールするならばこの程度は知っていてもよさそうだ。

データ構造やアルゴリズムの連想

何も分からなかったときに「これはセグメントツリーですか」というような質問が来ることがある。これは、データ構造やアルゴリズムを思いつけば解ける問題を解いてきているためである。

しかし、知りたいことは、手作業でできることを機械にお願いできるかなので、データ構造を思いつくと終わりというような単純な問題は好まれない。一番いいのは5つくらい解法が思いつくがどれも嫌なところがあるというものだ。その嫌なところを感じ取れる人ととは働きやすい。

それはともかく、解法が思いつかなければ、手作業でやるとしたらどうするのか、そしてそれをシフトを組んで複数人で行うとしたらどうするかを考えればよいだろう。

ちなみに、セグメントツリーは知らなくても別に評価の変わらないデータ構造だ。確かに私も Google の面接中に一度言及した記憶はあるが、言及したところで評価が一切変わらなかっただろうと思われる。数十行程度で書ける単純なもののわりに複雑な木の代用として使いやすいという特徴があるので過剰に意識されているデータ構造である。

コンピュータサイエンスの知識

コーディング面接から少し離れており会社や職種によっては聞かれないこともあるが知識についても簡単に書いておこう。詳しく知りたい場合はソフトウェアエンジニアリング協会にコンタクトを取ってほしい。

www.swe.or.jp

ソフトウェアエンジニアに限ると技術面接で聞かれる知識はかなり狭い。はじめにも書いたが、典型的な簡単な仕事は「巨大なコードベースと要望が与えられて、要望に従うように振る舞いを少し変えること」や「バグの原因を突き止めて修正すること」であるので、これに必要な知識が聞かれる。特にバグを修正するためには正常な動作を理解した上で異常な動作から原因を推測する必要がある。医学でいうところの生理学と病理学である。身の回りにあるソフトウェアがどのように作られているかと、それが問題を起こしたときにどう見分けるかということである。正常系は、ネットワーク、OS とアプリケーション、データと分散システム、言語処理系くらいであろう。そして、どこの部分が問題を起こしたかによって症状は異なる。

聞かれる場所は、重要で問題発生に直結しやすいところなので、たとえば、TCP ならばスリーウェイハンドシェイクと輻輳制御くらいである。それぞれ SYN flood やネットワークのスループットの低下などに関係している。他は、DNS、HTTP、ロードバランサー、プロセス、スレッド、ファイルディスクリプタ仮想メモリ、ページング、システムコールトランザクション、インデックス、ガーベージコレクションなどであろう。発生する問題を分類すると、応答性能の異常、リソース消費の異常、通信の異常、データの異常くらいである。

デバッグの方法は、基本的にはプログラムのデバッグと同じである。問題を再現して、発生箇所を特定、原因を分析して、修正案を作り、検証する。これだけである。また、いくつか難易度の高いデバッグ類型がある。複数のプロセスやスレッドの競合に関するもの、メモリーなどのリソース管理の失敗によるもの、不安定な分散システムとネットワークで起きるもの、バージョンや環境の変化に依存するバグなどである。

最後に、詳しいという自己評価は避けたほうがよい。たとえば、ガーベージコレクションを考えてみよう。今でも研究がなされている分野である。だからガーベージコレクションの研究者で主要な論文を毎週追っていて代表的な言語における実装を触っているのでもない限り深く知っているなどということは得策ではない。「参照カウンタ、マーク・アンド・スイープ、コピーGCが教科書的にはあり、実務ではさまざまな工夫がなされていることまた深い研究がなされていることは知っていますが、それほどよく知りません。ガーベージコレクションが問題を起こすととてもつらい目にあいますね。本当につらいです。」といっているほうがいいのである。ガーベージコレクションが問題を起こすと、メモリー使用量が徐々に増えていったり、突然一時的に固まったりする。直すのがなかなかに大変だ。試行錯誤なしにガーベージコレクションのどんな問題でも解決できるという自己評価の人がいれば、それは間違いなく大した問題に出会ったことがないだけである。何かに詳しいというのは悪いことではないが、採用したいのは「一緒に働くとより成果がでる人」である。

数の暴力に対する耐性

簡単なコードが書けるようになったとして、その後に、大きなコードベースを読めるか。そして、書けるか。それから、ソフトウェアエンジニアリングの範囲を超えた複雑性にどう対処するか、といった問題がある。そこらへんは応募している職によっては要求される。いずれにしても働き始めたら必要になるだろう。数十行程度のプログラムだけを扱っていると、数の暴力に対する耐性はなかなか身につかない。

このように学習が進むにつれて評価基準や要求水準が変わっていくのは、どのような分野でもよくある。高校までの歴史は歴史的な知識の有無を確認しているが、大学からは歴史的な史料を原語で読むようになる。そして、研究者となれば、史料批判を通じて過去の出来事や思想を理解し、それに基づいて新たな解釈や歴史像を構築する。数学でもそうだろう。数学者でもはじめは九九の暗記をしていたはずだが、大きな桁の掛け算を暗記するのが数学者の仕事ではない。

このことを認識しているだけでも振る舞いがよくなるように思う。

魔法が解ける

技術面接では難しいことを聞かない。なぜならば、仮に社員のほとんどができないことを聞いたら、入社してよいかの判断材料にならないからだ。ところが、実際に技術面接をしてみると予想外にできない。平均的な技術面接の通過率自体は5%以下で応募から1%以下0.1%以上くらいの感覚である。ただ、これは人為的に変えられる。十年ほど教えているという話を書いたが、特に初めの5年は一人あたりにかけていた時間は典型的には6時間から20時間程度だった。通常5%以下の通過率のところ教えた結果ほとんどが通過した。

技術面接では難しいことを聞かないことは体感しているし、少し考えれば分かることであると思うが、そうは考えていない人も少しいる。この活動を聞いた元同僚に「あの面接は天才しか通らないはずだ。」といわれた。そもそも選別がかかっているに違いないというのである。もちろん誰にでもできるようになるという気はないが、中学英語や高校化学程度の難易度であるのでそれほど大変ではない。文科省の公式発表では中学の英語の授業についてけるのは半数程度であるとされている。そういう話をした時に、近く受けるという人がいたので見学をしてもらった。「とても通るとは思えない。キャリブレーションがずれているのかフィードバックと準備で短期間に改善するのかどちらか。」というのが次に聞かれたことである。3回ほどの模擬面接を見てもらうと、通過しても不思議ではないところまできたという評価に変わり実際に通過していった。そして、模擬面接をしているのを見た人たちも自分で工夫して教えると教えられることが分かっていった。

それでは、教える時に何をしているのだろうか。表面的なその場しのぎでは無理だ。伝えた内容をできるだけ広い範囲に応用できるようにする必要がある。このためには、普遍的で抽象的な話から大枠を描いて、考え方を変えて行動の変容までつなげる。憑き物を落とす、魔法をかける、呪いを解く、現実を見せるなど、呼び方は何でもいいが、一番効率がよい方法が、何か致命的な行動をしたところで、なぜ問題があると感じるのかをかなり抽象的なところから具体的なところまでつながるようにすることだ。知識が足りなければ、その知識があったと仮定したらどのように振る舞うかなどを説明して知識の使い方を説明する。現実を見せるときに苦痛を与えてはいけない、というか効率が落ちるので、そこのあたりのさじ加減は、対面で相手の心の動きを見ながら行う。また、どのようなリカバリーが取れるかなどを説明する。人は言い間違えることが多々あるのでリカバリーは効くものである。面接は緊張状態なので普段の力がでないことが前提であるし、普段の仕事ならば資料を確認して当然な状況など面接の場ではできないことがある。ただ、何を気にしているかなどの価値観が普通ではないのは見て取れるので影響が大きい。

それから、振る舞いによって小さな傷を作らないようにするのは大事だ。チームマッチが難しいというが、2017年から2022年のハイアリングフリーズまでの5年半で、チームマッチに失敗したのは、枠のほとんどなかった一番はじめの一人とハイアリングフリーズに巻き込まれた一番最後の一人だけであった。これは面接のときの小さい傷がチームマッチに影響を与えるからであろう。

こういう内容であるから、オファーを貰ったあとで面接を頼んでくる人たちもいた。ソフトウェアエンジニアとして働くにおいて、本質的な考え方や技能を伝えているので、その魔法が面接以降も続くことを前提としている。

ところが、まれに面接が終わってオファーを貰った途端に魔法が解けることがある。短時間で変化したものは短時間で戻りうる。経験上、こうなるとあまりよいことにはならない。また、もちろん、もともと現実が見えないままオファーを貰ってしまう人もいる。本来のソフトウェアエンジニアの仕事のうちで簡単なものは「巨大なコードベースと要望が与えられて、要望に従うように振る舞いを少し変えること」や「バグの原因を突き止めて修正すること」などであり、仕事との関係で誰でもできる大したことを聞いていないのだが、技術面接を通った自分は優れた人物であると思うようになる。入社している人物は同じ基準をおおむね満たしているのだが、以前よりも難易度が格段に上がっているはずだ、などの根拠のない説明をつけていく。実際は容易になっている感覚さえあるのだが。こうなると以前からいる人たちは自分よりも愚かであるということになる。これは自分の技能と仕事の関係が分かっていない状態である。

これは原理上いたしかたない。2000年ごろまではソフトウェアの仕事は好まれていなかった。IT は新 3K や 7K「きつい、帰れない、給与が安い」「規則が厳しい、休暇がとれない、結婚できない、化粧が乗らない」などといわれていた仕事であった。学んでいる人はなんらかの強い動機があった。しかしながら、(事実かどうかはともかく)良い待遇の仕事であると考えられるようになると仕事の目的を認識せずにこの分野に入ってくる人たちが増えていくのだ。医学科も近いところがあると言われる。しかし、そういう学生でもベッドサイドに立って患者を見てからは目の色が変わる場合がほとんどだと上司の教授に昔聞かされた。ただ、情報系は医療に比べて不利な点がある。医療の場合は、自分が何かをした直後に容態が急変するという経験をする。多くの場合自分の責任ではないかもしれないが、しかし、事実として結果は変わらない。オペラント条件付けによればより強い刺激がより即時的に与えられるほどよく効くわけだが、情報系で何かを行ったとしてもそれが実際に悪い影響が出るまでには相応の時間がかかる。そういう意味で情報系は学習がしにくいのだ。そういうわけで、生得的な学習メカニズムを意識的に補助することが必要となる。だから、仮に働き始めたあともここで書かれているようなことが当たり前であるかを時折確認して欲しい。

最後に、教えたことを後悔することはないのか、などと聞かれることがあるのでコメントをしておく。別に迷いがないというわけではないが、原則論として、まず、教育が良かったか悪かったかは、教育を受けた人が老年になり一生を振り返ったときに決めることである。だから、外野ましてや教えた人物が教育自体が良かった悪かったなどというのは筋が違う。ただ、私自身の目標という意味では、情報系の能力を配ることであり、特に自分よりも効率的に教育する人物を生み出すことであるので、そのように教育する人物が生まれなかったならばそれは目標との関係では失敗である。

レジュメの書き方

コーディング面接とは少しずれるが、せっかくなので書いておく。STAR メソッドなど色々と形式的な話はあるが、それよりも前の方針の話がしたい。一番の根本は「私があなたたちと一緒に働いたら仕事の成果がより出る」ということが基本的なメッセージであるということである。

また、読む人は3種類と理解している。リクルーターがはじめ数秒見て会うかどうかを決める。エンジニアなどが面接前にみてどういう内容の質問をするかを決める。ハイアリングマネージャー(直属の上司になる人)が最後に採用するときに面接の内容とともに自分のチームにいると本当にありがたいかを決める。この3種類の特にリクルーターとマネージャーにどう受け取ってもらいたいかを考えて書くといいだろう。読んでいる横でこういう意図で書いたという説明はできないので、何も知らない人の気持ちになって読むことになる。

本当に書くことがないならば、コードが書けるだとか Git や Docker を使ったことがあるだとか書くしかないが、なんらかの人のために役に立った経験があるか、そしてそれを就職した後でもできるのか、ということが問われている。よって、インパクトと再現性を書くといいだろう。インパクトというのはどのように人の役に立ったのかということだ。再現性は、まぐれでインパクトが出たわけではないということなのでいろいろな要素がある。そのプロジェクトはそれなりの複雑性を持つものなのか、自分がいなかったら何が起きなかったのか、つまり自発性といったことだ。関わる人が多いことも複雑性に関するものだろう。『このことからも分かるように「私を雇って一緒に働くと、あなたのプロジェクトはもっと成果が出ます」』とつけて違和感がある行はおそらくずれている。仕事の経験である必要はない。自分や周りの人のために何か作った経験はないだろうか。エンジニアリングをするということは物や環境を構築して有用なものを作ることなので、その欲求があるならば自分の周りの環境を少しでも自発的に整備しているはずなのだ。高校の文化祭のときの経験でもよい。場合によってはソフトウェアを作ることで人の役に立ったのでなくてもよい。組み合わせて一緒に働くとより成果が出ると説得したい。

競技プログラミングのレートについては消すようにという指示まではしていないが、書くことが他にないので書いている程度の認識でいるべきだ。明らかに消したほうがいいと思うレジュメは見たことがある。レジュメスクリーニングにどこも通らないというので見たのだが、経験年数があり様々なプロジェクトで成果を出しているのに、レートを強く売り込んでいると歪んだ価値観を感じさせる。「私があなたたちと一緒に働いたら仕事の成果がより出る」というメッセージと繋がらないのだ。これは LeetCode のレートであったと記憶している。よほど書くことがなければコードの読み書きができるということを意味しているので、レジュメスクリーニングでプラスに効く場合があるかもしれないが、それくらいである。外資系企業は国内でレジュメスクリーニングをしていない場合があるためほとんどレートの書かれたレジュメは見ておらず、そういったレジュメが通りやすくなっていないと考えられる。一方で書かなくても問題はないようである。大学の授業や本の内容をなぞっただけの個人プロジェクトを書いているのもネガティブに働く。情報科学の技能を使って問題を解決したことではないことをアピールしているからだ。なんらかの現実の不便さを解決するために仕組みを考えたこととは異なる。

もう一つ、レジュメに書かれた内容は自己申告であるので本当かどうかは分からないということである。ただ、何を重要だと考えているかの価値観は突き抜けてくる。どういう人物は仕事の成果がより出ると考えているのかが分かるのだ。特に日本は儒教的であるため格の話をしがちである。

最後にレジュメについて言いたいこととしては、一種のセルフハンディキャッピングをしないということだ。「環境はひどいものだったが、私の能力が高かったので、結果的に差としてそこそこの成果になった。」という主張をする人が結構いる。どんなプロジェクトでもそれなりに面倒なことは起きる。「周りの仕事は不完全なこともあるが、そういうものである。そういう状況でも別に乗り越えていけるのだからどうということはない。でかいプロジェクトになれば当然ややこしいことも起こる。エンドユーザーが喜んでもらえるようなことができてよかった。」という態度でいて欲しい。他の類型としては、たとえば「このプログラミング言語を初めて使ったにもかかわらず、プロダクトが出せた。」というのがある。これは「プロダクトが出せて素晴らしいインパクトがあった。」とインパクトを差分ではなくて絶対的に書くべきだ。「習得が早く、初めて使う言語でも柔軟に扱えた。」というのを付言するという形ならば否定まではしないが、こちらのほうがだいぶ弱いシグナルだろう。高いプロ意識と成果を出す能力を持っているという主張をし、未来での貢献を予感させて欲しいのだ。

最後の後に追加しておくが、リクルーターによるスクリーニングの部分だけは少し異なる要素がある。まず、ここはあまり再現性がない。面接はコストがとても高いので面接できる人数は限られている。そこでリクルーターが通りそうだと感じる人を選んでいるがこの時点では情報があまりないのでどうしても安定しない。精神的なダメージを受けるだけ無駄である。同僚の経験談として、レジュメを出して応募し、リクルーターから「面接にぜひ来て欲しいのだが、手続き上の問題でここにレジュメを出し直してくれないか」と頼まれて従ったところリジェクトの通知を受け取ったという話がある。リクルーターに問い合わせたら面接に呼ばれたので同僚になったということだが、それくらい適当である。Google Code Jam のファイナリストや IMO メダリストでもレジュメで落とされた例を知っているのでコンテスト成績もあまり関係がなさそうである。学歴が効くと思っている人もいるようだが、ここで少し書いたように東大医学部医学科のレジュメがなかなか通らなかった。そういうわけで、上で書いてきたようにコンピュータを使ってエンジニアリングをした形跡がほぼ必須である。この形跡がなくても許されるのは、情報系か物理系に在学中の場合くらいで、ここはよくいる経歴の人たちなので単にレジュメを書くのが下手であると思って拾ってもらえることがあるようだ。こういうトリックがいまでも有効かは分からない。いずれにせよ、この条件を満たした後は、レジュメスクリーニングは抽選に当たるかどうかくらいのものだと思ったほうが精神衛生上もいいだろう。

そういえば、もう一つ。会社によっては新卒での応募だけレジュメスクリーニングがなされない場合がある。そもそも、新卒一括採用と中途採用が厳格な分かれ方をしているのは日本の流儀であり、アメリカでは一般的にはそうではない。通年で区別なく採用していてポジションによってスキルの要求が異なるという形だ。そして、日本のように入社の一年前に内定を出すというようなことは普通なくせいぜい数ヶ月前だ。ただ、それでは日本の新卒一括採用の文化に合わないので早めに受ける枠を用意しているのが新卒一括採用枠であるように見えているだけである。この枠は短期間に応募が多くレジュメスクリーニングを人手でするのが大変であるためオンラインでタスクを与える形式で代替することがある。そういうわけで採用基準が変わる訳では無いがレジュメスクリーニングを回避できる利点がある。特に理工系でない学生の場合は、卒業後にインパクトのあるプロジェクトの経験を集めることになるのでこの利点が大きい。よく「新卒でどこかの会社に行ってから、希望の会社に転職をしたい。どこの会社がいいか。」と聞かれるがこのような理由から新卒が一番入りやすい。あえていえば、レジュメスクリーニングの観点からは人の行き来がある会社であるとわずかによいかもしれないが誤差程度である。もっとも、受動的に在籍していることでソフトウェアエンジニアとしてのスキルが身につく環境というのが日本にあるとは思えないので、スキルについては自発的に習得して欲しい。それに、かえって職歴があるということによって自然に増える期待もある。たとえば、東京でタクシードライバーをしていたというならば、東京の道路やランドマーク、客や渋滞の分布を知っていることが期待される。横浜でしていた人に大阪のことを知っていることは期待しないが、大阪でしていたら大阪、名古屋なら名古屋のことを知っていることが期待される。つまり、仕事の適性、主体性や観察力が問われる範囲が広がるのだ。

選別と教育

この話もついでにしてしまおう。私にはいまいち分からないのだが、持って生まれた才能を重視する人達がいる。言い方を変えれば、選別か教育か、という話だ。

行動遺伝学によると、人間の能力は遺伝が5割、共有環境が1割、非共有環境が4割であるということになっている。これは双生児の研究から出てきた数字で、共有環境とは家庭内で兄弟姉妹で共有されている環境、非共有環境とはそれ以外のことである。割合は分散を考える。人間の能力が正規分布をするとして、その分散の寄与を回帰させると上の割合になるということだ。

ただ、私がまず言いたいことは、この考え方自体、教育が敗北している状況が前提でなされているということだ。

人間の身長はほぼ正規分布になるが、イヌの体長は正規分布にならない。これは何を言っているかというと、人間の身長に影響を与える要因が極めてたくさんあり、それらが独立に作用するのでおおむね正規分布のようになるということである。一方で、イヌの体長はヒトが人為的に交配をして品種を作っているので正規分布にはならない。仮に、人間が隕石に当たると身長が3倍に成長する生き物であったとしよう。一定の人数が隕石に当たるとすると、人間の身長は正規分布しなくなるだろう。

つまり、行動遺伝学の前提とする、ヒトの能力の分散に対しての寄与を遺伝、共有環境、非共有環境に分けるという考え方自体が、そもそも人為的な教育による介入が乱数程度にしかできないことを前提としているのだ。

念の為書いておくと、この遺伝の影響が半分というのはよい遺伝子があるということを意味するとは限らない。同じ家庭と異なる家庭で育てられた一卵性と二卵性の双子の能力から分散に説明をつけているだけなので、ある二卵性の双子のどちらの遺伝子が、ある環境にその尺度でよりフィットしていたかをいえても、その遺伝子が普遍的にすべての環境で優れているとはいえない。また、遺伝に支配されている割合は文脈依存性がある。つまり、たとえば、環境の要因は双子同士の育つことになった平均的な違いに依存するので状況に依存しているはずである。このように行動遺伝学の研究には様々な限界があり「遺伝が5割、共有環境が1割、非共有環境が4割」は標語程度の意味しか持たないものである。

もちろん、私は遺伝の影響がないという気はない。しかし、それ以上に教育による強い介入が可能であると考えている。しかしながら、教育が行われることはめったにないため、上のような分布になる。私が教育による強い介入が可能であると考えているのはいくつかの観察と経験からくるものだ。

たとえば、囲碁のプロ棋士には5代続けてプロ棋士、4代続けてプロ棋士の一族がいる。2022年のワールドカップサッカー日本代表は、26人中6人が川崎市の西部と横浜市の北西部の狭い地域で小学校時代を過ごしている。湯川秀樹(旧姓:小川)の兄弟は、戦死した末弟を除いて4人全員が東大または京大の教授で、父と次男の息子も東大か京大の教授であった。全員分野も違う。親子兄弟姉妹は遺伝子を半分しか共有されていないので、逆説的だが、親子は25%、兄弟は共有環境を加えて35%しか能力を共有していないというのが定説からの計算になるが、それではこの割合は説明がつかないだろう。つまり、隕石が当たるような稀な事象を一定割合で人為的に起こすことがある家系や地域や家庭で可能であったということだ。

私が学生時代に学部ごとに誕生日の分布を調べたことがある。結果は面白いものだった。法学部や経営学部などは4月生まれが2割前後多いが、理系はほぼ偏りがない。つまり、誕生日が大学の専攻に影響を与えるということだ。この原理を考えるとさらに不思議なことを意味する。幼少時に周りを見渡してなんとなく自分はこういう人物だと思い込む効果が、誕生日によって確率的に異なるために、統計的に専攻の分布が変化するということだ。論理的飛躍を恐れず、私はここからこう結論づけた。わずかな思い込みによって専攻が強制されており、そこの制限は精神をいじれれば外すことができるはずだ。

それでは、強い介入とはどのようになされるものなのだろうか。私もそのメカニズムが完全に分かっているわけではないが、私はそれを暗黙の前提を直接的に特定・修正・再構築する行為と考えている。いくつか具体的な話から説明しよう。

これは私の話ではないが私を教えてくれた人の話である。ある日、小学校二年生の子が宿題をしていた。「1デシリットルの水が入ったコップが12個あります。これは、1リットルのやかん□個と1デシリットルのコップが□個です。」というような問題が並んでおり、その子はいろいろな数字を書いてみるが答えと合わない。それを見ていたある人が、いくつか質問をしていって、次のような発見をした。この子は「せんべいを3枚持っています。空のお盆の上に置きました。お盆の上にせんべいはいくつあるでしょうか。」という問題には答えられるが、「やかんの中に水が2リットル入っています。空のバケツに移しました。バケツには水が何リットル入っているでしょうか。」という問題には答えられない。つまり、はじめの言動を引き起こしていた欠如していた知識は「液体には量があり、それは移動によって保存する。そして、その単位はリットルである。」であったということだ。

そこで、「バケツの中に3リットルの水が入っています。なべに移しました。何リットルでしょうか。」「5?」「それがねえ。なんと3リットルなんだよ。」「水槽の中に2リットルの水が入っています。ビニールプールに移しました。何リットルでしょうか。」「3?」「それがねえ。なんと2リットルなんだよ。」というやりとりを繰り返していると、なぜか「液体には量があり、それは移動によって保存する。そして、その単位はリットルである。」ということを理解するようになる。

何を簡単なことの発見を重大なことのように話していると思われたなら心外である。この質問に対して、どれほど暗黙の知識を使っているかはちょっと変えてみたら分かる。「デュワーの中に液体窒素が50センチメートル入っています。ざるに移しました。何センチメートルでしょうか。」これは50センチメートルではないだろう。ところで、この状況は暗黙の前提を置くと身の危険を感じる。

水に話を戻そう。特にこの場合、発達段階の議論では一般に液体の量の保存が分かるようになるのが7歳前後とされているから、量の保存概念がない可能性は十分ある。量の保存の概念がない状態ではリットルとデシリットルの換算は意味が分からない。また、この子が当てずっぽうにでも数字を言い続けてくれるのが解析の大きな手助けになっている。そして、この子は量の保存の概念を分かった後、そのことがあまりにも嬉しくて周囲のあらゆる人にリットルとデシリットルについてのクイズを出し続けた。

子供は特にこういった概念を理解しないために躓き自発的に解決できないことがよくあるが、これは大人にもあてはまる。大人でも誤った学習によって袋小路に陥っていることは多々あるし、修正がどれくらい自発的にできるかは人によって異なる。たとえば、経理で理由を求められたときには意図を書くのだが、原因を書く人がいる。法律上の扱いは意図に依存し、意図は本人しか知りようがないので聞かれているのだが、特に自然科学の教育は意図を排除して記述させる。このため話が噛み合わなくなる。たとえば、約束に対価があるかで無意識に人は異なる扱いをするがこれに気がついていない人がいた。人間関係の観察だけでこれが体得できる人はいいができない人にいかに説明するかは問題になる。コモンローでは Consideration (約因)という概念がある。約因というのは、要するに契約の対価ということで対価がない契約は英米法では認められない。アメリカで CEO が給与を1ドルにすることがあるのはこれである。コモンローは慣習から発見されるという建前をとるから、おそらくこれも約束と契約の差異が制度化されたものであろう。日本では取締役の報酬は0円にできるが、書面によらない贈与は解除できるから、対価のない契約に一定の特殊性が認められているといえるだろう。このように大人でも誤った学習が残っていることがよくある。それが問題を起こしていなければいいのだが、ときには大きな障害となる。こういった問題は、得てして、その根本的な原因からは遠い形で表出しているので、問題が起きる最小のケースを探し特定する必要がある。この際、もちろん見つける側にもスキルが必要だが、見つけてもらう側も見つけてもらいやすくするスキルがある。

他にも問題が解けていても意味が分からないまま習った儀式を繰り返しているケースがあり、こういった場合は一瞥して違和感を感じるのだが紙の試験では点数が引くことが難しい。ただ、口頭試問では容易に確認できる。

教える経験から得た理解もある。ソフトウェアエンジニアを育てることもそうだが、中学受験のアドバイスをしたこともある。数時間話をしただけで変わり、偏差値40台から半年で開成、30台から二年で桜蔭に入っていった。小さな障害を取り除いた程度の話であり、自分の貢献であるという気はない。小学生まではおかしな癖がついていないので特に容易である。会ってそれぞれ20個程度、40個程度の改善点を書き出しただけである。開成の子については半年と時間がなかったこともあり、気がついたことの半分は保護者に向けてであった。

たとえば、保護者に聞いたことは偏差値をどのようなものだと思っているかである。学校の偏差値は定義は一意ではないようだが、典型的には、ある模試を受けた集団を点数で輪切りにしたときに、その学校に80%以上の確率で合格すると推定される切片のうち一番低い点数を正規化したものである。だから、倍率が1.25倍より大きく模試の成績と無相関に採用している学校は偏差値が無限大に発散する。つまり、模試の質が下がれば、学校の偏差値は上がるのである。ここでいう質というのはその学校の難易度を測る尺度としての適切さという意味である。こういったことを理解していないことが広くどのような問題を引き起こすのかはこの章の最後に譲ろう。

このように、私は観察や経験から強い介入が行われた形跡があると考えている。しかも、プロ棋士やサッカー選手を育てるには長期的に強い介入が必要なのかもしれないが、開成・桜蔭・ソフトウェアエンジニアを育てる程度ならば、経験上、短時間で強い介入を行えば十分なのである。短時間の接触で済んでいるのは自発的または家庭内で「暗黙の前提を直接的に特定・修正・再構築する行為」を再現できるようにできたからであろう。

そして、これまで行ってきた強い介入をどのように起こしたかをおぼろげながらにしても説明したつもりだ。一人で再現することは難しいかもしれないが、複数人で議論しながら読み込めばおそらく再現できるようになるだろう。強い介入は「隕石が当たるような稀な事象」であってはならない。故意に引き起こせるものにしなくてはいけない。

ただ、強い介入を受ける側にもそれなりの用意がいる。小学生くらいのうちは強い介入を素直に受け入れられるのだが、高校生くらいになってくると余計な自己判断が出てくる。この強い介入がなされたとしてもある種のホメオスタシスによって元に戻っていく。これで正しいのか自信がないなどの理由をつけてやらない理由を発見する。

この際、一番問題になるのは報酬系である。多くの場合、何かをできるようになるのは退屈なのである。どのような分野の専門家であれ、共通言語基盤となっている範囲を満遍なく押さえないといけない。しかし、既にできるところを伸ばすことは容易であるが、できない部分を伸ばすのは退屈である。たとえば語学では徐々に映画や小説などが楽しめるようになるが、ある水準まで到達するまでは意味が分からず退屈である。たとえば楽器で曲の練習をしていて一音だけ間違えたからといって、その音だけ後から出しても一曲通しで弾いたことにはならない。多くの場合、その音の前に本来の問題があって、そこを見つけ出して修正をし、さらに安定してできるようになって初めて一曲通しで弾いたことになる。こういった解析は自分の失敗について考える作業であるので退屈である。こういう場合、報酬が支払われるまでの時間がどうしても長くなる。少年漫画的な世界観だと「窮地に追い込まれて苦痛を感じ絶望したときに相転移を起こし劇的成長を遂げカタルシスを感じる」が現実にはそうはならない。はじめは単に退屈で味がしないが、淡々とこなしているとかすかに味を感じるようになって、そこから味がどんどんするようになってそれが普通になる。高校生にもなるとこれが難しくなってくる。この点、上に出てきた小学校2年生の子は恐ろしく強い。辛抱強く滅茶苦茶な数字を言い続け、液体の量の保存とリットルが分かったというかすかな報酬だけでずっと喜んでいられた。

この報酬系の問題は、強い介入を受ける上で大きな抵抗を引き起こしやすい。強い介入が「暗黙の前提を直接的に特定・修正・再構築する行為」であるから、それは必然的に退屈な分析や思い込みを修正する作業を含む。そして、長期間、強い介入を続けられない状況では、個人または家庭内でその介入の効果を継続させるようにせざるを得ない。対面で話をする場合は、まだ強い介入に持続性をもたせることがやさしめで、退屈などものともせずに全力で走り出すことがあるが、そうでもないとある種の意思の力が介入を受ける側に求められる。

素質や偏差値への信仰も強い介入に対しての抵抗となる。生まれつきの素質によってできることの多くが決まっており、偏差値という単一の尺度によってそれが測れるという考え方だ。「遺伝が5割」という考え方も基本的に軌を一にしている。この理解は、強い介入を受けたときに自身の制限を正当化する考えをもたらす。遺伝や素質の影響が、環境や介入によって劇的に変動するものであるという認識があれば、強い介入を受けいれる余地が生まれる。

ここまで、強い介入が「暗黙の前提を直接的に特定・修正・再構築する行為」であるという推測と、それがどういう状況で効果的になるのかを書いてきた。この考えからは、プロ棋士小川一族やサッカー日本代表に見られる「才能の集中」は強い介入が特定の家系や地域で継承されていたということだと解釈できる。隕石を当てることは人為的にできるのである。

継続的に強い介入が起きる場所があるとして短時間で行う場合はどうだろうか。短時間で大きな効果をもたらすためには強い介入の効果が継続する必要があると上に書いた。自発的に発生し続けるようにするということは、つまり、介入を受けた人が自ら介入できるようにするということである。だから、強い介入に関してメタ的な認識をすること自体が強い介入の最も重要な部分である。短時間で行う場合は憑き物落としに近い感覚を持っている。そういうわけで、この章がここに設けられたのである。この文章全体で書かれた内容の実践にこの章の内容が役に立つことを願っている。「Twitter で医師を拾ってきて Google のソフトウェアエンジニアにするだけの簡単なお仕事」「人生のチュートリアルを終わらせるたったひとつの冴えたやりかた」も参考になるだろう。

さて。この章の最後に学生時代に中学受験生の男の子を教えたときの話を書いておこう。実は私は教育をするのがそれほど好みではないので、小学生を教えたことは2, 3度しかない。桜蔭の子が1人目でこの子が2人目だ。この部分はまったく別の文脈で何年も前に私信として書いたものであるが、色々な人に私的に見せるととても評判がいいのでそのままここに置いておく。具体的なアドバイス部分は省いているので万人の役に立つ部分であろう。これを参考にしようとする人が万が一現れたときのために追加で3点書いておく。まず、理解できない反応が出てきているときほど黙って観察する時間がより必要になる。多くの場合先生役が話しすぎている。次に、保護者が伴走し塾も使う場合、仮に塾の先生に疑いを抱いたとしてもそれを子供に伝えてはいけない。判断材料を集め先生を変えると判断をするならば黙って変えるべきだ。さもないと習えと疑えという両立しがたいメッセージを出し続けることになる。最後に、これは何年も経った後に書いているので、伝えている内容はある程度正確にしても、表情や話し方などが書かれていないため雰囲気はおそらく読んで得られる印象とは著しく異なるだろう。会ってお母さんはとても明るい気持ちになったということだった。

ある日、友人から、そのさらに友人から次のような相談を受けたので、ちょっと見てきてくれないか、といわれました。その家庭には、小学生の息子がおり、成績が平均以下と振るわないので志望校を変えることも視野に入れているというのです。私も友人の頼みですので、紅茶とケーキくらいごちそうしてくれれば見に行くと申し上げ、最近の模試の問題用紙と解答用紙を用意してくれるように頼みました。

席につくと、お母さんは、まず、成績表を見せて偏差値をこれくらいにしたい、という話をされました。それに対して「偏差値をそれくらいにするには何点とればいいのか計算できますか」と聞きました。分からないという答えをもらい、そのあと少しやり取りをしたあとにこのようにまとめました。

「要するに、偏差値が思ったような値でない、将来に悪いことが起きるのではないかと感じて不安になる、不安になるが子供にその重大さが通じていない気がするのでいかに不安かを子供に伝える、という理屈で行動していますね。それで私が呼び出されたと理解しています。ただ、思ったような成績が取れないことは本人にとっても十分に嫌なことであり追撃を入れる意味はないと私は思うんですよ。」

「子供への指示は常に具体的に肯定形で。何かをするなという否定文での命令は読解が必要になるので難しいです。」

「私が何を言っているかというと、子供をサンドバッグにするな、ということです。子供の受験で不安になるのは自然ですが、それを子供に言っても状況はおそらくよくならないでしょう。だから不安をぶつけてもいい人を用意します。精神的に安定した大人、普通は他の家族とかになります。ああ、私も家族にサンドバッグになってくれと明示的に頼まれてサンドバッグ役をやっていたことがありますよ。あと、もちろん、今の話が納得できなくて、本人に不安をぶつけたほうが成績がよくなると思うならば、もちろんそうすればいいのですが、ここでもう一つ言いたいことは、なにか行動を取る前にできればそれの帰結が何かを考えたいということです。」

国語を見るとまったく違うことをしているので、そう伝えました。「自分の感情や願望の話をしていますが、何が書いてあるかが聞かれています。求められていることが分かっていないです。サッカーとバスケットの区別がついていないレベル。算数でいうと、時速何キロで歩いているかを割り算ではなくて、自分の普段歩く速度で答えるレベル。」そして要求されていることを説明しました。「将来、あなたがなにをするのであれ文章を読むことになりますが、そのとき相手がどう考えているかを理解することが求められます。あなたがどう思うか、などどうでもいいのです。」

その後、算数の問題を4問ほど、息子さんと同時に解きました。

終わると、私は息子さんの答えを覗き込み「どっちが違うかは分からないけれども一致しないやつがあるなあ。」といってから自分の解答の確認に入りました。

すると、お母さんが、模範解答を見て横からどの問題が間違っているかを指摘し、すぐに息子さんは修正しました。お母さんは「ミスが多いのですが、ミスだから大丈夫だと息子がいうんです。」といいました。

「まず、お母さんが模範解答を見てどれが間違っているかを指摘したのはよくありません。試験会場についていけないのだから、本人が見つけないといけません。あと、息子さんが間違っていると聞いてすぐに直せたのもよくありません。基本的に自分のやったことに疑いを持っていないということだからです。」

「息子さんのよくいうというミスだから大丈夫である、という発言が何を意味しているのか、考えてみましょう。ミスであるから本質的には理解している、よって、自分は悪くない、自分の知性に傷はついていない、という話をしていますね。もうちょっと踏み込むと、知性に傷がついていないので、親に愛される資格がある、といっていますかね。」

「一般にミスというのは、罪が重いものです。あなたは将来なんらかの重要な仕事につくでしょう。そうですね、分かりやすいところで医師になったとしましょう。たとえば、投薬量の計算で小数点を打つ場所を間違えて事故で患者さんが死に至ったとしましょう。そのときに、ミスだから大丈夫、といったら遺族の方々は「ああ、よかった、ミスだったか」といってスタンディングオベーションをして帰っていくと思いますか。よほど、「全力で、あらゆる手立てを尽くしましたが、力が及びませんでした。」といわれたほうがまだ納得できるでしょう。ああ、これはどんなことでも一緒ですよ。もちろん、人は誰でもミスをするのですよ。ミスはなくならないものです。しかし、ミスをしたならばそれと向き合わないといけません。正直、塾の模試なんてどうでもいいのです。できてもできなくても、行きたい学校に入学できたならば、どうでもいいでしょう。ミスをしたのがそういうどうでもいいところで、とても幸運だったわけです。入試も行く学校が変わるだけですから、大して大事なわけでもないです。ただ、次のミスがそういう幸運なものかは分かりませんよ。」

「それから、あなたが悪いか悪くないかにも、あなたの知性にも、私は興味がありません。」

「最後に、親に愛される資格、というのに引っかかります。あなたは親よりも長生きするであろうし、そうしなくてはいけないです。そう考えると、あなたは10歳を過ぎたのだから、そろそろ周りから与えられる価値判断から離れ、自分の判断を持ちはじめてよいのではないかと思います。私は、あなたが例えば試験で満点を取ったとしても、自分を許せなくて怒り狂う事があってもよいと思うし、仮に零点であったとしても、自分はよくやったのだと満足することがあってもよいと思うのです。」

「いや、まあ、明日からあらゆる価値判断を自分でし始めたらそれはそれで困ると思うので、これから10年かけて自分の考えを確立していって欲しいと思いますけどね。」

というようなことを楽しそうに話していると、平均を切っていた子供が次の模試でクラスが4つ上がり、最終的に開成に入りました。たしか、今は医者になっているんじゃないですかね。

もちろん、この他に具体的なアドバイスもたくさんしておりますが、一番大きいのは親子関係の変更、次が科目によってはまったく違うゲームで戦っているので、ゲームのルールの理解。あとは、現実の認識です。認知行動療法みたいなものですね。

最後に

コーディング面接であれば、だいたい上のような内容を読めばかなりの部分が解決するだろう。コーディング自体の習得もそれほど難しいものではない。2023年の年末からコーディングの練習会を開いており、速いと2, 3ヶ月もあれば書けるようになる。

コーディング練習会参加マニュアル(一般社団法人ソフトウェアエンジニアリング協会) - Google ドキュメント

プログラミングコンテストの能力とはほとんど関係がない。Google だけでも10年近く毎年送り込んできたが、半分はコンテストに出たことがなく、残りも緑、水色、青が同じくらいずつだ。緑より上は、ゆるく下がる印象があるがこの記事の内容を理解すればほぼ差が消えるだろう。茶色下位でながらく停滞していた人も少し教えればできるようになった。

練習するときには何をできるようにするのかを気にしなくてはならない。だいたいの場合基準をハックをすることは簡単なので、自分でハードルをどんどん下げていってしまう。

また、この考え方が非常に広い応用範囲をもっていることも分かるのではないだろうか。たとえば、物理学の研究者になりたいならば、何も見ずに一次元調和振動子シュレディンガー方程式くらいは解けて欲しいといったことに相当している。学部の演習問題というのは、専門家集団にとっては突然聞かれても解ける常識程度の問題しか出ていないのであるから、知的な挑戦として解いてはいけないのだ。

就職活動に際しての面接は当たり前だが職種によって違いがある。機械学習エンジニアなどであると、典型的な仕事としてモデルを作ったり改良したりするので、そういったことが聞かれる。モデルの改良はこうすれば必ずこうなるということがあまり言えないが、状況に応じてどういう手立てがあるかがある程度網羅的に出てくることが求められているように思う。

ここまで競技プログラマーという言葉を使ってきたが、競技プログラミング同好会の影響を直接的または間接的に受けた人くらいの意図である。競技プログラミング同好会と関係がない人物が競技プログラマーを名乗るべきではないという考え方もあるが、同好会の影響下にあると自認しているならばいいだろう。今でも道場で育った人たちがプログラミングコンテストの街で活躍しているから実際のところほとんどすべての人が同好会の影響下にある。それは悪いことではないが、それはともかく私の世代が能力の継承を一部途絶えさせたのだろう。ここまで書いてきた内容の多くは競技プログラミングという道場ができる前のプログラミングコンテストの街で私が身につけたことだった。ただ、競技プログラミングをしていたと申告して私のところにやってくる人たちを教えていると、身につけたことの中には今となってはあまり見られない知識や能力があるのでそれを戻す目的でこの文章を書いている。代わりに当時はたとえば Dynamic Programming が分類されておらず一種類しかなかった。その後、分類を細分化してパターンを増やしてコードが読めなくても書けるように整備されていった。鶴亀算などをたくさん知っていれば、一次方程式と行列を知らなくてもよいというようなものである。

私は誰が何の仕事をしようがどうでもいい。ただ、日本の経済の立て直しのためにしなくてはならないことの中に、コーディング能力を広めることがあると考えている。そして、それを前提としたソフトウェアエンジニアの大量の育成とソフトウェア産業に関連する研究者の養成がある。特に、ソフトウェアエンジニアというのが「機械に指示を出せる文系総合職」に近い職業であるから人口のかなりの割合にソフトウェアエンジニアとしての能力を配らなくてはいけない。これには少し注釈が必要かもしれない。先日、内閣府から IT システムを作るよい方法はないのかと聞かれた。答えたのはだいたいこういうことだ。50年前を考えて欲しい。少々、人手がかかるかもしれないが紙とペンと電話と FAX で事務の仕事はできるはずである。会社の各部署に文系総合職が散らばり、それぞれが自分の部署がうまく回るように全力で考え、人に指示を出しながら綱引きをすると回る仕組みである。仕組みの変更をするときには、文系総合職同士が抗議をしたり飲んだりと調整をしていく。この仕組みの一部を電子機器に置き換えていったものが現在の業務のワークフローのはずだ。人は指示を出しておいても勝手に指示を変更していったりするが、電子機器は指示を出しておけば同じことを繰り返してくれる。一方で融通が効くわけではない。だから、文系総合職の役割のうち保守などの部分は減るが、むしろ、業務フローが回るか、それを束ねたときに回るか、仕事を業務フローに翻訳する仕事、業務フローを改善する仕事などの部分は大変になっているはずだ。そして、予想できない状況は必ず残るので会社だと部長や社長などの決裁でかたをつける。こういう風な業務フローと機械の場合はデータの管理方法・溜め込み方を考え、変更で起きる問題を洗い出す仕事は電子化によって減るどころか増えているはずである。これをするためには業務と機械の特性を理解した人物が必要である。そういったことを説明した。しかし、日本にはそういった人たちが足りない。ソフトウェア産業に関連する研究者の育成はもっと大変である。日本の大学の仕組みがもともと戦前にできたものであり、研究分野が硬直的になっているため日本では原理的に十分なソフトウェア産業に関連する研究者を生み出すことができない。だからおそらく海外の大学院に進学する人を増やす必要がある。この話は別に書こう。

(2025/11/30 追記: 書きました。)

nuc.hatenadiary.org

情報系の分野について、中国語では非常に正確な情報が飛び交っているが日本語では情報が十分でないため、圧倒的な差がついてしまった。その結果、世界の AI 研究者の半分が中国系で、Google などのビッグテックのソフトウェアエンジニアの2, 3割が中国系だ。言い方を変えれば、きちんとした訓練方法が日本で知られていないために起きているだけであるともいえる。

なぜ日本では必要な人たちに情報が届かないのか。この文章を読んだあなたもたとえば小学生の子供を持つ親にこの文章を共有しようと思わないだろう。それは情報を発信して周りを助けることが当たり前になっていないからだ。そうすると、小銭稼ぎのためのマーケティングによって誤情報が流れ続け、社会全体が損をする。毎年数万人の規模でソフトウェアを扱える人を増やすにはこれも何とかする必要があるだろう。

幸いなことに若者が力のある分野である。正しく養成をすると10年あれば追いつけるはずだ。

 

追記(2025/12/5): ソフトウェアエンジニアリングの習得で、上の考え方の実践をするのに助けが必要ならば、下のリンクが参考になるであろう。

ソフトウェアエンジニアリング協会: 業界関係者で集まっている団体。オンライン・オフラインで授業や練習会を開いている。

ソフトウェアエンジニアリング協会のイベント情報の購読: 大学などで定期的に集まっている。今年は、東京大学、東京国際工科専門職大学、水道橋内海、大阪キリスト教短期大学で開かれる。

https://x.com/ainsophyao: 著者の X。DM などでの連絡もどうぞ。

docs.google.comこの記事と同じ考え方によって開かれているコーディングの練習会の考え方についてまとめたもの。

docs.google.com練習会に参加している人に向けてしたアドバイス集。一部は Discord 上であるが、上の協会にコンタクトするなどで参加すれば全文が読める。

docs.google.comなぜか定期的にバズっている学習についてまとめた スライド。

nuc.hatenadiary.org教える側から見た体験談と学習のための書籍など。

アメリカの確定申告をする羽目になった

いくつかの事故が重なって、国外からアメリカの確定申告をする羽目になった。

国外にいてもそれほど難しくはない。本来1万円かからずにできるところで無駄な手間を掛けたので他山の石となるようこれをしたためる。

幸いにして SSN (社会保障番号)を持っているので少し簡単だった。持っていない場合は Form W-7 を使用して ITIN (納税者番号)を取得する話になる。パスポートの原本を郵送したくなければアメリカ大使館に行くことになり、通常7週間かかるらしい。

確定申告の方法は郵送にすること。電子申告だと先方が辻褄があっているか確認していくれるから楽と思いがちだが、電子申告が認められている州は限られており、複雑なヤク・シェイビング(ヤクの毛刈り)をした挙げ句にできないことが判明する。

電子申告では IRS (内国歳入庁)のアカウントを作ることになり ID.me でのアカウント作成が求められるが、こちらの方向に行ってはいけない。

無益なヤクの毛の話をしよう。日本の住所の認証のために、英文の住所の書かれた公式の書類が必要になる。英語で調べると日本在住で国際免許証でできたという記述があるがこれは駄目だ。プラスチック製の国際免許証は認証に使えるが日本の国際免許証は紙製だ。そこで銀行に行って住所を証明する書類を作ることになる。オンラインで写真を送って待っていると、オンラインでの面談が予約できる。オンラインで面談をするとアカウントが認証される。ここで電子申告ではできないことを理解した。

郵送にすると決めればそれほど大変ではない。状況によって色々なフォームを埋めることになるだろう。生成 AI に聞くとどこの行に何を書くかまで教えてくれた。少々間違っているが修正できる範囲で助けになるだろう。はじめあっていた行番号も適当に大きくしていくのでだんだんずれていった。私がした中で少しややこしかったのは Form 8833 で租税条約を引いて事情を説明するあたりくらい。あとは、印刷をして国際郵便で送るだけだ。

口座番号を書いておいたのだが振り込めなかったのか3ヶ月ほどで IRS から小切手が送られてきた。日本で米ドル小切手の換金をしてくれるのは SMBC 信託銀行プレスティアのみになっている。小切手の有効期限は12月末までだ。

幸運を祈る。

焼き鳥屋で刑法学者と意気投合してコインハイブ事件について書き出すだけの難儀なお仕事

JavaScript で仮想通貨を採掘するコインハイブというライブラリがありました。

コインハイブ事件というのは、この仮想通貨をマイニングするプログラムコードを自身の管理するウェブサイトに設置したところ、不正指令電磁的記録保管罪(刑法168条の3)に問われたというものです。

このコインハイブ事件に関して、「アプリ開発の実務を踏まえた不正指令電磁的記録に関する罪の一考察 -コインハイブ事件を契機としてー」というタイトルで千葉大学の紀要に書き、千葉大学のページ上で PDFでも公開されました。
https://opac.ll.chiba-u.jp/da/curator/900119535/S09127208-36-1-P056.PDF
https://opac.ll.chiba-u.jp/da/curator/900119535/

内容に入る前に、まずは、この事件に関わっている、被告人、弁護士、検察官、裁判官、調査官、書記官等の皆様に敬意を表します。すべての人々がその信じる正義に対して真摯に判断をしているのだと思います。特に、被告人の方は、望んでいない状況に突然放り込まれてそれに向き合おうとしており、公共のためを思っての行動であることを強く感じます。

私自身は刑事事件の被疑者となったことはないのですが、一度だけ会った人物が冤罪で重大事件に巻き込まれたために、刑事弁護に強い遠隔操作などのサイバー犯罪ともご縁のある弁護士を紹介するなど奔走していたことがあり、傍で見たことはあります。特にコインハイブ事件は、判例のないところを走る複雑な事件であり、意に沿わない先例を作らないようにするためには並々ならぬ労力を割かれていることと推察いたします。一般に、刑事事件は、地裁で無罪でも高裁は8割有罪と、1.3審制といわれることさえある民事事件よりもどの審級でも手が抜けず負荷は常に高いです。

そして、人的資源という意味であまり公平ではありません。検察や裁判所は官僚組織ですし、法務省の立法担当者とも話ができますからね。

ところで、このなんだか固い内容に似つかわしくないタイトルですが、これは「Twitter で医師を拾ってきて Google のソフトウェアエンジニアにするだけの簡単なお仕事(https://nuc.hatenadiary.org/entry/2021/03/31)」と対になっています。私は同時期に、この「不正指令電磁的記録に関する罪の一考察」と「簡単なお仕事」の二つを並行して書いておりまして、量もだいたい同じくらいで、問題意識もかなり共通して書かれている、私にとっては双子のような文書です。そして、その問題意識のうちの一つは「常識」です。なぜか、これを「教養」や「優秀さ」と読み違えた人が多かったようですが、専門家集団にはその集団特有の共通知識がある、という極めて当たり前のことを書いていて、そして、多くの職業人にとっては当たり前の内容であったかと思います。「簡単なお仕事」において書かれていることは、「常識」を身につけることが求められているのであって、他人にはできない「抜きん出ていること」をしようとすることではないということです。少々戯画的にいえば、あの入社試験は優等生だと通りにくいものです。

もちろん、「簡単なお仕事」に限られる問題意識もあります。どのような人物が採用されるかについて誤解が流布しているので、高嶺の花感が出てしまって、本来受けて欲しい人が受けてくれず、採用がうまくいかない、それを言いふらされるので、さらに、という悪循環の形で、古巣の人事が迷惑を被っております。ときどき一緒にコーヒーを飲むのでそういう事情を知っているにも関わらず、私は迷惑をかけるほうの片棒を間接的に担いでしまったからには、腹を切るということです。このように一般に Hiring について言及されることは企業にとって迷惑なことになりえますので繊細な配慮をしています。元同僚たちがこの点に思い至るか至らないかきれいに分かれたように見えたのは非常に興味深い現象です。あまりあからさまに書く気はなかったのですが、部署内の人間関係さえ希薄になった匂いがします。もちろん、自覚した上で踏みにじることも時には必要でしょうがね。

この点、最近入社したエンジニアに優秀さにこだわる優等生が増えてきたというのは感じるところです。先だっても、そのようなエンジニアがメンターをしているインターン生に対してほぼ初めて書いた言語でのコードレビューに際し「これを知らないとはお前は優秀ではない」「お前よりも優秀なやつはたくさんいる」などといい、一週間くらいそのインターン生は悩んでいたらしいのですが、ふと別の社員にその話を漏らしたところ、大問題になって適切に処理されたとのことです。問題となった箇所は、その言語特有の仕様で、たしかにそれをよく使っている人ならば常識的に知っているかもしれないが、使ったことがなければ知らないようなことです。「ああ、この言語を使う人達の間では一般的な知識です。今後もこの言語を使うならば覚えておくといいでしょう。ここをみるといいと思います。」その程度でいいのに、なぜか優秀かどうかの話、つまり人としての性質の話が始まりました。こういう一次元的な優秀さの尺度で人を判断することを非常に好むようになったというのが最近感じる変化です。「人間が才知を尽くして労苦するのは、仲間に対して競争心を燃やしているからだということも分かった。これまた空しく、風を追うようなことだ。(伝4:4)」また、こういうパワハラ被害者は面接官を怖がるようになるので、教えることもとてもやりにくくなりますので本当にやめて欲しいのです。

もっとも、このように、一切書かれていない、優秀さや教養について書かれていると誤って読み取るのは、分からないわけではありません。というのも、選民思想能力主義への批判が根底にあるからです。この文書は、多くの人には楽しく読めるでしょうが、人によっては何かに障るのでしょう。特に、「模擬面接をするようになってからは技術面接はほぼ通過する」という内容がどうしても受け入れられないので、防衛機制がいろいろな留保をつけようと頑張るわけです。これを書いた時点では私達が教えた人は知る限り面接は全員通ってましたからね。もっとも、私も正確に難易度を把握できていないようで、私の感覚も明らかに実際よりも難しい方にぶれています。おおまかな自分の見積りから計算される通過人数の期待値は有意に現実よりもだいぶ悲観的です。ですから少しこの通過率は下げる方向に動かさないといけないとは思っております。ある Google に通った教え子に、「簡単なお仕事」の感想を聞いたところ、楽しい文書だなあと思って読んだが、あとから激昂している人を見かけて、意味不明で怖いと思ったといわれました。しかし、そうなるのは内容上不可避なのです。これは内容が必然的に誤読を生むからです。

さて、その他の共通している問題意識が何なのかはおいおい説明していくとして、エンジニアの面接対策の活動をここ数年一緒にやっている小西さんから、最初期の競技プログラミングである第1回の UTPC 2008 の時に出した問題を皆さんに紹介して欲しいとの言付けを預かっておりますので、忘れないうちにここで紹介しておきます。
Problem K: 電波基地 https://www.utpc.jp/2008/problems/radio.html
Problem L: チクチクバンバン https://www.utpc.jp/2008/problems/toy.html
当時の遊びを思い出そうということでしょう。

話を少しもとに戻しますと、このブログを書くことにした背景には立法担当者に届けたいという気持ちがあります。最高裁は、判決を出す前に関連する解釈論を集めるようですので、最低限の形式を整え、できるだけ常識的なことを、法学系の大学の紀要に書いておけば、おそらくこの事件の係属している最高裁の第一小法廷の方々の目に紀要自体は留まるかもしれず、調査官解説で切り捨てられるかもしれませんが、それに加えて、法務省の立法担当者に読んで欲しいのです。

さて、コインハイブ事件に戻りましょう。

3,4年前にコインハイブ事件について初めて聞いたときに、技術者の感覚と法曹の感覚がだいぶ乖離するだろうなあ、と思いました。

ただ、どうも法曹側の感覚からすると、思われているよりも被告人不利な事件で、周囲の法曹に聞いてみても全力で戦って6,7割有罪という感覚です。これは、ベイズ確率とかいう話ではないもっとプリミティブな話で、1割弱勝てそうな論点が少しあって適切にクリティカルヒットで衝ければ勝てる場合があるかなくらいのところかと思います。

そもそもの前提として、法律の判断というのは基本的に決定木の形をしており、末端で利益衡量によるバランスがついている場合があるという構造をしております。人間、こういう構造でないと、たぶん、決定するアルゴリズムを共有できないのです。そして、刑事事件では、被告人側は、一箇所でも合理的な疑いを持たせることができれば勝ちという構造です。ただ、そうであったとしても、どの要件もそれなりに大変に見えるということです。

それに対して、技術者側の感覚としては、こんなもの回避できないだろうというのが正直なところかと思います。いつものように、普段使っているライブラリーと特に変わりなく使おうとするもので、反対動機を形成しなかったことに対しての道義的な非難が想定できない方も多いのではないか、と思います。少なくとも、無警告で逮捕(最高裁まで係争しているこの事件では逮捕されていませんが類似の事例ではあったようです)や起訴するような事例ではないのではないでしょうか。

怒っている技術者の方も見ました。怒りは二次的な感情であるとよく言われます。人は、なんらかの強い感情を揺さぶられたあとに現実と理想なり願望なりとの食い違いを認識すると怒り出します。

それで、この技術者の感覚を私にとって一番自然な発想で法学のディシプリンの中に入れ込んでみたというのが、この「アプリ開発の実務を踏まえた不正指令電磁的記録に関する罪の一考察」です。内容は、不正指令電磁的記録性のさらに反意図性に絞って議論し、できるだけ丹念に立法担当者の見解を読み解くと、反意図性が認められないので、無罪になるのではないか、とするものです。おおよその考え方自体は、事案を聞いたときに私ならばこう解釈すると直感的に考えた方法そのままです。

ただ、検察側の理屈があまりにもシンプルで強い。俺は難しいことは分からないが人としてやっていいことと悪いことくらい分かるといってみながハッとするみたいな紋切り型ってありますがそんな感じでしょうね。ただ、最高裁の説得が難しいにしろ、畢竟独自の解釈と切り捨てられるにしろ、20年後のために書いておかないといけない、私の確信している理屈があると思っています。

これを書くことになった背景事情ですが、久々に刑法学者の友人と会ったので、焼き鳥を食べながら、もともとはもっと広範囲の話をしていて、まあ、私のほうが法学については圧倒的に保守的な考え方をするといういつもどおりの展開だったんですが、タピオカミルクティーを飲んで、餃子屋に行くなどをしている間に、不正指令電磁的記録性の反意図性の話になり、ほぼ見解が一致したので、この内容で一本書いてみようということになりましたというところです。

うっかり書くことが決まってしまったので、別の法学者の友人に深夜に相談しました。30分位で何を考えていて何を書くつもりなのかをざっと話をして、一体どれくらいの分量になりそうかを聞くと「ひー、ふー、みー、よー、2万字かな。最低でも。」との返事をもらいました。それで、どれくらいの時間がかかるのかを聞くと、人によるが自分だったら準備ができていれば4時間位だということでした。共著者の指導教官とかだと1時間半で書くらしいですね。仮名混じり文が秒間4文字とかですか。どうしてそれができるかさっぱり分かりません。どう考えても無理ですね。というよりも無理でした。

それで、大まかな筋が半分くらいできた時点からは、定期的に、お昼過ぎに集合して共著者のお家にいって、床に座り込んで、二人で書きながら適時議論するというのを4,5回くらいやりました。とにかく負荷が高くて、2時間位すると共著者の意識が朦朧としてきて、仮眠を取り始める、そして、もう1時間位すると今度は私の意識が朦朧としてくるので、私が仮眠を取り始める、といったところです。
統一されている話ではあるが法学の論理構造になっていなかったから組み替えないといけないというのもあるのですが、とにかくコンテキストスイッチが重い。複数の分野にまたがった話をすると、境界領域であるために、普段だったら当たり前のように成立している前提が成立していない場合があるので、分野の議論の再構成を繰り返すことになります。

また、共著者はこのように説明してくれました。刑法の論文を書くというのは将棋みたいなものなのだと、ただ駒の動かし方はどこにも載っていない。だから、教えるためには、とりあえず、思うように盤面を並べて、それで、盤面を作って動かしてみせると、そんな動きしないと初めて指摘ができると。それを繰り返していくと、だんだん合法的な動かし方が分かっていくのだと。

たとえば、「この到達が認められる範囲については、ある程度、総合考慮の結果として行われざるをえないであろう。」という文を書いて、見せたところ、相手は倒れ込んでしばらく考えた後に、「反意図性は規範的に判断されると解されている以上、その下位基準もまた規範的に判断されることになる。よって、ここで述べている到達が認められる範囲については、ある程度、総合考慮の結果として行われざるを得ないことになる。」と書き換えられました。ああ、これは教育を受けないとできない。読んだときのいやらしさがまったく違う。これについて話したら、なんだか、後期ウィトゲンシュタイン味のあるいい話ですね、と法と文学の研究者にいわれましたが、私もいいセンスだなと思います。

こうやって様々な話が刑法の構文に綺麗に収まっていくというのは、なかなかに面白い経験でした。もともとの話が統一されているというのは本当に大事なことですね。

ペーパーの内容を法律の議論とは逆方向から話すと、まず、この事案は、ブラウザー上であったことがとても特殊です。たとえば、カフェで作業をしていて、席を立った途端に、外部記憶装置からバックグラウンドで動く仮想通貨のマイナーをインストールされ、それ以降気が付かないうちにマイニングをしている状況であったり、ダウンロードしたゲームの中にマイナーが仕掛けられていた状況であったりとは、倫理的に区別がある話であるように思われます。ただ、法的にこれを区別するのが難しいのです。この差異を日常用語で説明すると、インターネットやウェブの歴史的な経緯と合意から、ブラウザーJavaScript は閲覧者がウェブサイト設置者にある限度で使用を許している、というのが素直な答えではないでしょうか。インターネットやウェブの世界は標準化がなされていて、何をどのようにやっていいか、世界規模で合意が取られています。そういった技術者の感覚や歴史的経緯がにじみ出ているのが技術者の書いた説明であるから、そこから規範を読み取れば、どの程度のことまでが想定されていたのかが分かるはずです。

ただ、それだけでは、法学の議論に乗りません。法学は視野を制限するようにできています。子供の喧嘩でも見ていれば分かると思いますが、基本的に関係のないことを延々と言い続けるものですが、実は、これ民事裁判でも一緒です。だいたいの場合、自分がいかに優れているかということから始まり、まったく本題と関係のないことを延々と言い続けますが、意味はありませんし、そういったことを拾わないように法学というのはよくできていると思います。だいたい、とてもよく分かっている当事者でも、裁判をしている当事者が10言ったことを、弁護士が3くらい拾い上げて、そのうち裁判官が判決に使うのが1くらいという感覚かと思います。

そのように、法学の議論に乗せるためには何らかの決定木のどこかに潜り込ませないと、それはないことと同じなのです。

それではどこをとっかかりにしましょうか。今回選んだのは、不正指令電磁的記録に関する罪についての立法担当者の解説の反意図性のところに「使用説明書等に記載される」ことが反意図性を否定する総合考慮の材料として詳しい例示とともに挙げられているので、その箇所を文言解釈として精査すると、技術文書が入ってもいいのではないのでしょうか、というところです。

そろそろ「アプリ開発の実務を踏まえた不正指令電磁的記録に関する罪の一考察 -コインハイブ事件を契機としてー」を読んでください、という気持ちになってきましたが、簡単にまとめます。
https://opac.ll.chiba-u.jp/da/curator/900119535/S09127208-36-1-P056.PDF

まず、東京高裁の議論では、反意図性について、「プログラムの反意図性は,当該プログラムの機能について一般的に認識すべきと考えられるところを基準とした上で,一般的なプログラム使用者の意思に反しないものと評価できるかという観点から規範的に判断されるべきである。原判決は,本件プログラムコードが,その機能を認識した上で実行できないことから,反意図性を肯定しているが,一般的な電子計算機の使用者は,電子計算機の使用にあたり,実行されるプログラムの全ての機能を認識しているわけではないものの,特に問題のない機能のプログラムが,電子計算機の使用に付随して実行されることは許容しているといえるから,一般的なプログラム使用者が事前に機能を認識した上で実行することが予定されていないプログラムについては,そのような点だけから反意図性を肯定すべきではなく,そのプログラムの機能の内容そのものを踏まえ,一般的なプログラム使用者が,機能を認識しないまま当該プログラムを使用することを許容していないと規範的に評価できる場合に反意図性を肯定すべきである。」という抽象論を展開しました。

それに対してのあてはめとして「一般的に,ウェブサイト閲覧者は,ウェブサイトを閲覧する際に,閲覧のために必要なプログラムを実行することは承認していると考えられるが,本件プログラムコードで実施されるマイニングは,ウェブサイトの閲覧のために必要なものではなく,このような観点から反意図性を否定することができる事案ではない。その上,本件プログラムコードの実行によって行われるマイニングは,閲覧者の電子計算機に一定の負荷を与えるものであるのに,このような機能の提供に関し報酬が発生した場合にも閲覧者には利益がもたらされないし,マイニングが実行されていることは閲覧中の画面等には表示されず,閲覧者に,マイニングによって電子計算機の機能が提供されていることを知る機会やマイニングの実行を拒絶する機会も保障されていない。このような本件プログラムコードは,プログラム使用者に利益をもたらさないものである上,プログラム使用者に無断で電子計算機の機能を提供させて利益を得ようとするものであり,このようなプログラムの使用を一般的なプログラム使用者として想定される者が許容しないことは明らかといえるから,反意図性を肯定した原判決の結論に誤りはない。」としました。

これは立法担当者の見解と基本的な方向性は同じです。立法担当者の見解は、「意図に沿うべき動作をさせず、又はその意図に反する動作をさせる(第168条の2第1項1号)」という文言について「当該プログラムの機能の内容や機能に関する説明内容、想定される利用方法等を総合的に考慮して、その機能につき一般に認識すべきと考えられるところを基準として規範的に判断することとなる。」と述べて、あてはめの具体例として、「例えば、市販されているソフトウェアの場合、電子計算機の使用者は、そのプログラムの指令によって電子計算機が行う基本的な動作については当然認識しているものと考えられる上、それ以外の詳細な機能についても、使用説明書等に記載されるなどして、通常、使用者が認識し得るようになっているのであるから、そのような場合、仮に使用者がこのような機能を現実には認識していなくても、そのプログラムによる電子計算機の動作は、「使用者の意図に反する動作」には当たらないこととなる。逆に、フリーソフトの中には、使用説明書が付されていないものもあり得るが、その場合であっても、当該ソフトウェアの機能は、その名称や公開されているサイト上での説明等により、通常、使用者が認識し得るようになっていることから、使用説明書が付されていないというだけで、「使用者の意図に反する動作」に当たることとなるわけではない。」としています。

まず、違和感を感じるであろうところは、ブラウザ内で動く JavaScript について、本件プログラムコードという言葉で被告人が書いたコード単体を持って判断しようとしている点です。実際には高々数行のコードで、別の人の管理するサーバーからライブラリーを呼び出しているだけのはずです。そこをどのように評価するべきなのか。技術者の感覚として、あくまでも呼び出しだけなのだから、作成といえないのではないのではないかというものがあるかもしれません。ただ、法学の感覚としては、結果惹起に繋がる以上、行為の軽重によっては侵害主体性がないという議論は成立しがたいものを感じます。そうなると、複数のプログラムが協調動作をしているのだから「反意図性を判断するために必要なプログラムの範囲」について議論をする必要があり、それは、動いているものすべて、になるでしょう。そして、協調動作をしているのだからそれがどのように協調動作をするかについて「使用説明書等に記載される」内容があるはずです。それらを読み解いていけば、ある種の規範的な判断が必要にせよ、「RFC標準」や「W3C勧告」といった自然と技術文書に到達できるはずです。「使用説明書等に記載される」は「プログラムの動作について正しく記載した説明の存在」かつ「当該説明に対する一般の使用者からの到達可能性」の2つが必要だと解しました。この辺は哲学などでもする法学の概念工学的な側面ですね。

そうすると「RFC標準」や「W3C勧告」といった技術文書が、正しく動作を記載しており、そして、現在では高校の教科書にもあるようなものなのだから、一般の使用者からも到達可能だろうという議論をします。

そして、「W3C勧告」を読んでいくと、「一般に CPU の使用には制限がかかっていない」というのが現状の合意であるというのが読み取れるでしょう。Permissions API というユーザーからの許可を取る方法があるので、どのような動作について許可を取る必要があるかは書かれていて、現状ではマイニングはその制限がありません。また、Chrome 独自の機能として、2020年に導入された Heavy Ad Interventions という機能があり、広告表示にも使われることの多い iframe 内での CPU の使用には制限がなされています。開発者によると、これは、広告ネットワークによる仮想通貨のマイニングを制限することが狙いの一つということです。逆にいえば、この時点まで、仮想通貨のマイニングについての制限はなかったということでしょう。

このように、技術者の間の合意と、そして使用者に対してのインターネットとウェブがどのようなものであるかの説明が、技術文書から読み取れるはずだ、それを考慮して判断をするべきだというのが、紀要に書いた内容です。

一般に、法学のペーパーの形で、法解釈について主張をしたら、その主張を生涯続けるというのが、求められるものだと聞きます。標準となっているなんらかの技術文書から一般に禁止されるべきであると読み取れる箇所が出てきたら、それは文献調査不足であったとして意見を変えるものでしょうが、規範として「技術文書を考慮して法解釈をするべきである」という主張は単独説だとしてもしつづけるつもりです。

情報系の人にはそれなりに楽に読めるようですが、法律系の視点からは読むのが少し大変のようです。法律系の人々に聞くと、まず「一般の使用者からの到達可能性」について、擬制や評価が伴うのではないか、という疑問がでるようです。それはその通りで、もともと「一般の使用者」には評価が伴っていることは間違いがなく、その評価の線引をどうするべきかということになるでしょう。現に、法人や個人の枠を超えて人々が密なコミュニケーションをとって、よく使用できるルールにしようにしようとした結果がそこに蓄積しているのだから、刑事罰を与える水準で判断する際には、それらを丁寧に読んで理解している人物としてよいだろうという規範的な判断をしませんか、というところですね。友人の法哲学者が、この紀要をいろいろな刑法学者に送りつけて読んでもらうという遊びをしておりましたが、返ってくる結果が結構面白かったですね。みなさんもいろいろな法学部の人に送りつけてみましょう。

もう少し書いた意図を一般化すると、そもそも、裁判の証拠に採用されるのは基本的に裁判の要件や事実に関わるところであり、現状では、技術文書が参照されることはないでしょうから、技術文書を視界に入れる仕組みを用意したかったというところです。一方、たとえば、医療過誤の裁判では、医療の専門資料として診療ガイドライン等があり、それが参照されます。スポーツの試合中に怪我なりをして、裁判になったらスポーツのルールはある程度は参照されるでしょう。
ただ、情報技術では、そのようになっていないです。といっても、別に医療裁判の場合を考えてみても、医療については診療ガイドラインを参照するようにと書いてあるわけではなく、たとえば、過失の要件から読み込むわけです。判例を少し引用すれば「思うに、人の生命及び健康を管理すべき業務に従事する者は、その業務の性質に照らし、危険防止のため実験上必要とされる最善の注意義務を要求されるが、右注意義務の基準となるべきものは、診療当時のいわゆる臨床医学の実践における医療水準である」(最三小判昭和57年3月30日・裁集民135号563頁未熟児網膜症日赤高山病院事件)などと書かれております。
このように医療過誤などではガイドラインなどの専門文書が参照されますが、デジタル刑事罰ではそのような専門文書が参照される筋道が現在は見当たりません。そこで、技術文書が存在すること自体を刑法のディシプリンの枠内で主張しようというのがこのペーパーの大きな目的です。

仮に、このように技術文書の存在が、刑法学の議論の中で使えるようになると、それ自体が不正性や故意の否定においても使えるものだろうとは思います。

さて、紀要論文の周辺で本文に入らなかった話をいくつか補っておきます。一番はじめにこの事件を聞いたときに考えたことは、脚注含めてほとんど入っていて、連想していて入らなかったワードは部分社会と国際慣習法くらいです。理屈を詰めてみるとあまり関係がありませんでした。ただ、校正中に、法学者や技術者、特に Chrome 開発者たちと話して、知らなかった周辺の関係する要素があり、いくつかは本文にも反映したのですが、論理展開には不必要となったものをここにメモをしておくものです。本来ならばあるべき謝辞が間に合わなかったことをお許しください。

まず、AndroidiPhone などの他のプラットフォームで、同じ議論が成立するのか、という質問があります。注意すべきは、サンドボックス内で技術的に動くものは無条件ですべて合法だという主張ではなく、技術関係の文書などにその計算をしていいかしてはいけないか自体が書いてあるからそれを参照しよう、ということです。ですから、AndroidiPhone において、今回提案した規範を踏襲すると「Google Play Store や App Store に並んでいるソフトウェアについては、公開される前に GoogleApple によって開発者に悪名高い審査がなされており、その審査は、その下位基準に至るまですべてが公開されているかはともかく、ある程度公開された文書に書かれたなんらかの基準によっており、その文書はストアに並んでいるプログラムの動作を正しく説明しているものであるから、すくなくとも審査が正しく行われて審査に通過した場合は反意図性を否定できるであろう」ということになるでしょう。

次に、Chrome から見ると、2010年代には WHATWG が標準のメインストリームとなっていたので、2019年5月に WHATWG の検討素案が W3C 勧告となることが決まった、というのは感覚的には遅すぎる記述のようです。ただ、どこから切り替わったかを追うことは本題から外れますのでここにしました。ニュアンスは少し調整したほうがいいのでしょうか。こういうニュアンスや「てにをは」に専門性が出るんでしょうね。

ささいな忘れ物として、HTTP/2 も RFC7540 になってますね。HTTP/3も部分的にですが QUIC がそろそろです。(https://quicwg.org/base-drafts/draft-ietf-quic-http.html)
また、インターネット標準過程を定めたRFC2026をRFC6410がアップデートしているのは一言書くべきでした。

現在では、geolocation や push といった強力な機能はセキュアなページ内でのみ許すべきという方向に合意されてきています。
https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts/features_restricted_to_secure_contexts

W3C の草案段階ですがプライバシーの定義について議論がされています。
https://w3cping.github.io/privacy-threat-model/

開発者としては、ブラウザーは誰が書いたか分からないデータを表示して実行する仕組みなので、許可なしにできることはすべて安全であるべきで、ユーザーはインフラ上で実現可能ないかなり動作についても許諾している、だからユーザーから見える挙動が正常で、プライバシーやセキュリティーの問題がなければ、良いという考え方を取ることが多く、これは、CIA侵害を基準とする西貝説とも繋がります。

Heavy Ad Interventions は、広告ネットワークを狙ったものでしたが、一般に広告に対してのブラウザーレベルでの制限は多く、Feature Policy や iframe sandbox などがあります。
Heavy Ad Interventions は、service worker でのマイニングが行われる例があるため、worker intervention の必要性が議論されてますが、現状はまだないようです。

重い処理を止めるような機構が Chrome にはあり、たとえば一例としては、ネット回線が細いときの document.write() intervention です。
https://developers.google.com/web/updates/2016/08/removing-document-write

Chrome 独自の CPU リソースの使用の制限として、Tab Throttling というバックグラウンドで走るタブの中の Javascript の CPU 使用量を制限する機能があります。
https://blog.chromium.org/2020/11/tab-throttling-and-more-performance.html

RFC の MUST/SHOULD を無視した実装、たとえば、concurrent http 接続や輻輳制御の方法などを標準から変えるということの扱いはどうするべきなのか。この辺は、非常に難解な議論になると思われるのですが、その旨を別に書けばよいという話になるので、ドキュメントされていれば扱いは変わるでしょう。また、ここは客観的構成要件のうちの、反意図性に限定した話なので、不正性のあたりで切れるという議論にもなるでしょう。このあたりは、本当に不正性が例外的なものなのかということにもつながると思います。

それから、戯れに、レッシグのCODEの議論、すなわち、人は「法」「規範」「市場」「アーキテクチャ」の規制を受けるという話を混ぜ込んでみたら急に味付けが変わって刑法学でなくなったので抜きました。本当に論文のテイストが一発で変わるので、アメリカ西海岸はやっぱり日差しが強すぎるんだなと思いました。

あとは、本当は引用してみたかったのは、レヴィストロースの「野生の思考」。最後の章がサルトル批判なんですが、未開人の思考と"われわれ"の思考を比較した上で、情報理論の話をするんですね。少し引用すると「野生の思考の法則が再び支配する情報の世界の発見(la découverte d'un univers de l'information où régnent à nouveau les lois de la pensée sauvage)」「情報の世界が自然界の一部ないし一面であることの発見は、情報理論の成立のために確かに必要であった。(Pour qu'une théorie de l'information pût être élaborée, il était sans doute indispensable que l'on découvrît que l'univers de l'information était une partie, ou un aspect, du monde naturel.)」(大橋保夫訳)といったところです。

文脈としては、歴史学の哲学における特権的地位と弁証法から話を始め、進歩史観に対して疑義を挟みます。そして、文化人類学歴史学を補完する地位にあるというのです。
そして、具体的な法則から積み上げていく自然科学と、抽象からはじめる野生の思考を対比した後に、近年発見された情報理論(1962年当時)も野生の思考と同じであると断じるのです。なので、この紀要論文においては、近代国家の法律家共同体が、野生の思考と同視される情報の世界の共同体の論理を発見するという話ですね。いやはや、ゲーデルの話が出てくる書いた本人も何を書いているのか分かっているのか分からないような文をコンテキスト無視して引用するとかアクセントとしていいじゃないですか。これがおしゃれフランス文化人の正しい使い方だと思いますね。

また、民法では、約款の有効性という話題があって、それとの類似の比較もありました。約款の問題だと、多分、例えば携帯電話サービスなどが想定されていて、大会社は寡占市場なので一方的に有利な状況にあり分厚い約款を突きつけて、読もうが読むまいが同意をせざるを得ない状況であり、実際に、誰も読んでいないし、後で、滅多に起きない状況になったとしても約款を盾に大企業が守られるのは適切か、という問題かと思います。一方で、企業が作って公開しているのだから、そんな変な内容ではないだろうという感じもあるわけです。
それに対して、こちらは刑法の問題なので、こういう国際的な仕様書を読みながらコードを書いている人たちがいて、そのコードの動作を使用者が知らないといったときに、どれくらいそのコードを書いた人を救うべきか、という話なので、ちょっと違うとは思います。

刑法38条3項の法の不知という話をはじめると、いろいろな法律家の皆様に怒られると思いますので、このあたりにいたします。いやね、優等生の背理法と個人的に呼んでいる理屈があるんですよ。「私は優れている。」「私はそれを知らない。」「よって、それは私のような優れた人物が知る必要のある内容ではない。」というものなんですけれども。

プログラミングコンテスト競技プログラミングの歴史

いやはや、競技プログラミングが、競技プログラミング同好会というサークルの名前に由来し、プログラミングコンテストからどう出てきたかが知られていないようなので、簡単にまとめてみようと思います。奇しくも、コインハイブ事件も、インターネットとウェブの歴史から規範を引き出そうという話でしたし、野生の思考は史学は特権的ではないって話でしたしね。

プログラミングコンテストの分類については、2012年に shinh さんが非常によくまとめています。

shinh.hatenablog.com

審査員が評価する系
面白いゲームを作るコンテスト (アスキーのやつとか)
綺麗なデモを作るコンテスト (demo scene, mega demo)
なんか役に立つソフト作ってこい (高校生とか向きでなんか国がやったりとか)
邪悪なコードを書いて来い (IOCCC)
善意を装って悪いことをするコードを書いてこい

明確な評価軸がある系
速いコードを書け (cell/GPU challenge, topcoder marathon)
短いコードを書け (code golf, TLE)
なるべく速く正しいコードを書け (ICPC, topcoder algorithm, codejam)
強い AI を書け (imagine cup, robocode)
難しい問題に最適解になるべく近い解を出せ (topcoder marathon)
プログラムにまつわるパズルを解け (codepuzzle, python challenge)
数学的な問題を解きまくれ (project euler)

古くからあるプログラミングコンテストといえば、1980年から続く全国高校生プログラミングコンテストや1990年から続く全国高等専門学校プログラミングコンテストがあります。特に、後者のプログラミングコンテストには競技部門がありますが、これはロボコンのように長期間準備をしてAIを持ってきて戦わせる競技です。基本は「なんか役に立つソフト作ってこい」で、他に伝統的なところですと2002年から日本学生科学賞にソリューション部門(後に情報技術部門に改名)ができました。

日本における「なるべく速く正しいコードを書く」という意味での競技の嚆矢濫觴は、1994年から1997年まで続いた情報オリンピックと思われます。
http://www.f.waseda.jp/moriya/PUBLIC_HTML/joi/index.html
それ以前の学術系のオリンピックは、1990年からはじまった数学オリンピックと1992年からはじまった算数オリンピックがあります。

この時、日本は国際大会で4枚のメダルを獲得しています。余談ですが、うち3枚を獲得した2人は77年度生まれの筑駒生で、当時は、農芸部を中心として、文化系の部・同好会の連合を形成していて、学年の少なくない割合が、その中の複数のものを掛け持ちする人たちであったと聞いています。彼らが中学2年生の時に、フルアセンブルで PC98 と Towns の両方で使えるグラフィックライブラリ tcpl を作り、そこから10年間以上に渡り、パーソナルコンピュータ研究会というコンピュータの部活はその遺産で遊ぶことになります。このときの唯一の金メダリストは後に数学者になっており、現代数学ができて、システムが作れる人物は、この時代でもいたんですね。
もっと古くは、たとえばなんですが、河東教授 https://www.ms.u-tokyo.ac.jp/~yasuyuki/vitae2.htm 大島教授 https://www.ms.u-tokyo.ac.jp/~oshima/dviout/dvihist.html など、ソフトウェアを開発できる数学者というのは珍しくありませんでした。

この情報オリンピックメダリストの数学者が学生時代に初回の発表者になったのが2000年からはじまった「なんでもセミナー」です。当初は、代々木のK会でやっていたと記憶しています。
http://new.pya.jp/nandemo/
そして、2004年から「情報科学なんでもセミナー」がはじまります。
http://www.cs.toronto.edu/~kawamura/nandemo/old.html

なんでもセミナーは、レトロニムとして(情報科学のほうと区別するために)数学なんでもセミナーと呼ばれることがありました。数学なんでもセミナーは情報オリンピックのメダリスト、情報科学なんでもセミナーは数学オリンピックのメダリストが第一回発表者なのがちょっと面白いですね。この余談が挟まったのは、この時代のプログラムが書ける人たちは、他の分野にも興味を持って、広く交流を持っているのが普通であったという話をしたかったからです。

また、1995年から東工大主催で supercon (スパコン)が始まります。こちらは、「速いコードを書け」「難しい問題に最適解になるべく近い解を出せ」の系統です。
https://www.gsic.titech.ac.jp/supercon/main/attwiki/index.php

1998年に大学対抗のプログラミングコンテストである ACM-ICPC が日本国内で始まり、ここまで挙げてきたような高校生高専生向けのコンテストの出場者たちが ACM-ICPC に出るようになります。

名前がでているので、軽く見比べると、2002-2007のACM-ICPCの国際大会出場者のおおよそ半分が、情報オリンピックスパコンに出場していたようです。また、数学オリンピックや算数オリンピックと共通して出ている人もいないわけではないようですね。もちろん、これはあくまでも、国際大会出場者の話であり、その他にはアジア大会の出場者や国内予選の出場者がおりました。また、そもそもの話として、こういった「大会に出る」ということは、あくまでもいろいろな遊びをするコミュニティーがあって、その遊びの一つとして行われていたということが大事かと思います。コミュニティーが先であって大会は後だったのです。

この頃、東京大学の出場者数が、2000年には6チーム、2001年には5チームであったのが、2002年10チーム、2003年9チームとなり、さらに2004年に20チーム、2005年に23チームと急に増えました。ACM-ICPC は、大学対抗で、大学ごとに地区予選や国際大会に出場できるチームが限られていますので、急激にチーム数が増えたことにより、国内予選は、東大だけ異常な難易度となり、陰では東大予選、とも呼ばれるようになりました。

この背景には東大の情報基盤センターと総合文化研究科の先生方の尽力もありました。東大では極めて多くの学生が「電源の付け方が分かりません」という質問をするため、それに答えるためだけに教職員が呼び出されてはたまらないということで、システム相談員という学生アルバイトを用意しており、質問のトリアージをする仕事をしておりました。そして、システム相談員を統括していた情報基盤センターの先生方は学生たちへの影響力がありました。特に、情報基盤センターの田中哲朗先生の研究室には出入りが自由で、田中先生は2003年から国内予選審判(出題委員)になりました。
https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/programming04/kadai1116.html
https://lecture.ecc.u-tokyo.ac.jp/~ktanaka/is06/0117.html

また、遅くとも2002年から布教に努めていたようですが、増原英彦先生や金子知適先生が、2004年から駒場ICPC に出ることを目的としたゼミを開くようになりました。
https://prg.is.titech.ac.jp/members/masuhara/classes/icpc2004/

金子先生の問題解決のためのプログラミング一巡り(2019年版)は、
https://github.com/tkaneko/icpcseminar/blob/master/all.pdf から読めます。

Aizu Online Judge (AOJ) http://judge.u-aizu.ac.jp
Peking University Judge Online for ACM/ICPC (POJ) http://poj.org
Codeforces http://www.codeforces.com/
szkopul https://szkopul.edu.pl (旧 http://main.edu.pl/en)

などを用いた練習を勧めております。(2019年度版)とありますが、2000年代の雰囲気をよく残していると思います。

少し話がずれますが、2003年からパソコン甲子園がはじまりました。これは、会津大学の主催する高校生と高等専門学校生向けのコンテストで、なるべく速く正しいコードを書けの系統の部門があります。また、綺麗なデモを作るコンテスト系のCG1枚絵を作る部門もあります。

このころプログラミングコンテストで活躍していた日本人として Shin Natori さんがいます。
2000年の IOCCC や 2005年のThe Underhanded C Contest で活躍をしたほか、2006年までの TopCoder SRM で活躍しました。
https://competitiveprogramming.info/topcoder/handle/natori
http://www.underhanded-c.org/_page_id_8.html
https://www.ioccc.org/winners.html#S
最近だと「医療や健康に関連する検索結果の改善について」名前が出てました。
https://webmaster-ja.googleblog.com/2017/12/for-more-reliable-health-search.html

また、2005年から2009年頃まで SRM で活躍した Hayato Ito さんがいます。
https://hayatoito.github.io/2017/faq/#google-hiring
https://hayatoito.github.io/2017/faq/#competitive-programming

時間は前後しますが、2012年から Endoh さんが IOCCC で入賞を繰り返しています。
https://www.ioccc.org/winners.html#E

2003年に ICPC東京大学にはじめのメダルをもたらした kinaba さんは、2004年の ICFPICPC に出ようという記事を書いています。(国際大会への初出場は1998年の京都大学。初のメダルは京都大学の2000年です。)
http://www.kmonos.net/wlog/39.php#_2206040524

2004年からは、ICPCのOB/OG会が発足し活動を開始します。また、2005年前後には、ICPC 出場チーム GNC 主催の ICPC 練習会が行われていたと記憶しております。GNC は、まさにスパコンコンテストと学術オリンピック等の出場者からなりますね。

2004年度のISの雰囲気は下から
http://is.zng.info/archive/1112196863.html.sjis

ICPCとは,大学生を対象にした世界規模のプログラミングコンテストです.
ISの先輩方には世界大会に進んで活躍なさった方もいます(IS公式ページ参照)

形式は,3人で1チームを作り,与えられた問題に対し,適切な出力をするプログ
ラムを書いて,運営側にメールで送るというものです.出題された問題のうち何
問を解けたかを競うわけです(なお,解いた問題数が同じ場合は早く解いたほう
が上位となります).

なお,国内予選の上位26チームがチームがアジア地区予選に進むことができます
.しかし同じ大学からは3チームまでという制限があり,東大は例年とても強い
ので,実質的には東大内での戦いとなります.

で,去年このような企画を教養学部の増原先生が立ち上げていらっしゃいました

http://www.graco.c.u-tokyo.ac.jp/icpc-challenge/
これを読んでいる人で参加していた人もいると思います.

この企画と同様に,週に1-2題を課題に設定してその解答を考え,解法に使った
アルゴリズムプログラミングテクニックについて議論する場を設け,ICPCで上
位を目指す(そして予選突破を目指す)企画をやりたいと思います.一緒に戦い
たい方の参加をお待ちしています.
Y.Matsumoto, Thu Mar 31 00:56:30 2005

http://is.zng.info/wiki/generic/index.php/%E7%89%B9%E5%88%A5:%E3%83%9A%E3%83%BC%E3%82%B8%E4%B8%80%E8%A6%A7

当時は PKU JudgeOnline http://poj.org/ を使って練習をしていました。

2006年に情報オリンピックが復活。

そんな中、2007年の3月に作られたのが競技プログラミング同好会です。

mayah.jp

競技プログラミング同好会は「ICPCの他国のレベルがあまりにも上がりすぎていて、このままでは日本が再びメダルを取ることはないだろう。世界大会で、再び日本がメダルを取れるようにするには、知識を受け継いでいく仕組みが必要だ」ということで競技プログラミングクラブとして活動します。なお、ymatsux は、競技プログラミングの名付け親であると同時に、ルシファー音頭のオリジナルでもあります。ymatsux は、昔、ドラえもんのオープニング曲の替え歌とともに謎の動きをしていました。ルシファー音頭は、その「あんな夢こんな夢いっぱいあるけど」の部分のオマージュです。いってみれば、ymatsux はルシファー音頭と競技プログラミングの親であり、ルシファー音頭と競技プログラミングは生き別れの兄弟なのです。

競技プログラミングは、当時は、とても違和感のある名称でした。

ああ、この inazz も、りりあんさんを Google に叩き込んだ悪いやつです。どうかこの広告に憤る読者は inazz 君に非難を加えて下さい。

当時、OB/OG会などプログラミングコンテストのための勉強会はありましたが、複数チームが定期的に集まるサークルとしてできたのがこの競技プログラミングクラブです。そして、この競技プログラミングクラブは、定期的な勉強会が主な活動でしたが、もう一つの大きな活動が UTPC (東京大学プログラミングコンテスト)です。

翌年の2008年、第1回の東京大学プログラミングコンテストが開催されます。
https://www.utpc.jp/2008/
署名としては東京大学プログラミングコンテスト実行委員会とありますが、全員、競技プログラミングクラブの人たちによるものです。出場者も、多くが競技プログラミングクラブの人たちですが、東工大や京大の人の名前も見えます。

このように「競技プログラミング同好会(競技プログラミングクラブ)」が競技プログラミングの誕生した場所でした。

UTPC は、2008年から2014年まで続き、2020年に復活しています。2008年から2013年までの ICPC の国際大会の出場者は毎年最低一人は第1回 UTPC に参加していて、2014年から2018年までも、UTPC に出ている人がいるはずです。2019年以降は知りません。

また、この頃、2006年3月に ICPC の卒業生たちを含む人々が集まって、Preferred Infrastructure ができます。後に Preferred Networks とレトリバになります。Treasure Data もここからといっていいですかね。

他に当時の学生の作ったものとしては、2007年1月から shinh さんによる、Anarchy Golf という Code Golf のサイトがあります。
https://www.slideshare.net/shinh/code-golf

当時、Short Coding がとても流行り、「ショートコーディング 職人達の技法」が Ozy さんとやねうらおさんによって書かれました。

2009年の shinh さんと2010年の pure pure code ++ のICFP優勝しています。2013年以降は Team Unagi がよく優勝しています。

2009年に UAPC 会津大学プログラミングコンテストが開催されます。
https://jag-icpc.org/?plugin=attach&refer=2011%2FCoachWorkshop&openfile=5-en.pdf
UAPC という名前は UTPC に倣ったものとのことです。実は、2008年と2003年にも教員の手で学内でプログラミングコンテストが行われていたらしいのですが、2003年のコンテストは教員によるもので、2008年は2003年と同一問題セットに難易度調整のため tayama さんが手頃な2問を作題して追加したものとのことです。この経緯からレトロニムとして、2003年や2008年に行われたプログラミングコンテストを UAPC 200{3,8} などと呼ぶようです。

2009年から会津大学の Aizu Online Judge https://judge.u-aizu.ac.jp/onlinejudge/会津大学の外にも公開されます。2005年に作られたようですが、学外に公開されたのはこのときです。コンパイラにも任意コード実行のバグがあることがあり、セキュリティーなどいろいろ難しいでしょうからね。

また、quolc さんによる Imagine Cup の公式競技の Herbert をオンラインゲームにした Herbert Online Judge http://herbert.tealang.info/ が2011年に始まりました。

学生主催のプログラミングコンテストとして、2011年には、KUPC 京都大学プログラミングコンテスト、2012年には AtCoder が始まります。どちらも主催者の大半が UTPC 第2回からの参加者のはずです。
https://www.kupc.jp/#/2011/
https://atcoder.jp/

2011年の Google Code Jam Japan が開催されます。この大会は、ICPC OB/OG会やUTPCの初期メンバーなどによるものでした。
https://developers-jp.googleblog.com/2012/01/google-code-jam-japan.html

このあたりで、UTPC の初期メンバーが「なるべく速く正しいコードを書け」系の開催側から離れていくようですので、ここからのプログラミングコンテスト競技プログラミングの歴史について書くのは、他の方にお任せいたします。

過去の用例を調べていくと、まず初出の「東京大学競技プログラミングクラブ」のウェブページはもう消えています。
https://b.hatena.ne.jp/entry/inazz.jp/utokyocpc/
inazz の管理でしたね。

2008年6月に「東京大学競技プログラミングクラブの練習会」という文字が見えます。
https://wata-orz.hatenadiary.org/archive/2008/06/07

確認できた中で一番古い、一般名詞としての競技プログラミングの用例は、kinaba-san の2008年12月の「わりと競技プログラミング的なものに時間を使った年だったかもしれない。 」という一文です。
http://www.kmonos.net/wlog/92.html
この文中では「 Project Euler, Topcoder, ICFPc, Google Code Jam 」などを総称して使われています。この「的な」という箇所に一般名詞になりきれていない時代の匂いを感じますね。

また、2009年5月には、UTPC2009の主催者の nya-san による「UTPC2009のお誘い」の中で、競技プログラミングという単語が使われています。
https://nyaasan.hatenadiary.org/entry/20090518/p1

東大生・東大OBはもちろん,学外のみなさんも紹介があれば参加可能です.

普段は競技プログラミングに参加されていない方から,コンテストで活躍されている方まで,広い層に楽しんでもらえるような問題セットを用意しています.沢山の方に参加してもらえればと思います.

ただ、これが一般名詞としての用法なのか、自分たちのサークルを指す言葉なのかは解釈に余地がよく見るとありますね。

2008年の UTPC では少なかった学外者ですが、2009年5月の第2回からは、開成や筑駒の高校生なども含めた学外の人々も広くコンテストに参加するようになり、競技プログラミングの名前をそこから受け継いでいったのです。
https://www.utpc.jp/2009/standings.html

tanakhさんの「Scala競技プログラミングを行う際に気をつけることの列挙。」が2009年の9月です。
https://tanakh.hatenablog.com/entry/20090908/p1

mayah さん主催のYUHAの2010年夏 (C78)のコミックマーケットの「競技プログラミング2010」がはじめて競技プログラミングを扱った書籍のようです。
http://yuha.jp/books/

mayah さんの「競技プログラミングという言葉の誕生」によると「自分の体験談を少し振り返ると、私が YUHA で競技プログラミングに関連する同人誌的なものを書き始めた 2008 年夏 (C74) には、「競技プログラミング」という言葉はまだ広くは知られてはおらず、同人誌中でも競技プログラミングという言葉は使われていませんでした。2010 年夏 (C78) に発行した同人誌からタイトルに「競技プログラミング」という言葉が使われ始めています。この頃売り子も自分がやっていましたが、「競技プログラミング」という言葉は全く浸透しておらず、興味を持ってもらった人に「競技プログラミング」とは何かを一から説明するような状況でした。」「それであれば、自分は卒業しているため 2007 年にその言葉を知らず、一方後輩からその言葉を知ったおかげで広く知られる前から使い始めたということで、納得ができます。」
https://mayah.jp/posts/2019/07/competitive-programming/

https://twitter.com/search?q=競技プログラミング%20until%3A2008-12-31

このように競技プログラミングという言葉は2008年から2009年にかけて一般名詞化していったものと思われます。

ここまで見てきて分かったように、1980年代から、さまざまなプログラミングコンテストというものがあり、その周辺に境界の漠然とした大きなコミュニティーが存在しました。その中で、2007年3月に ymatsu の手によって競技プログラミング同好会(競技プログラミングクラブ)の名称が生まれ、そこからスピンアウトした UTPC が日本の初期の学生主催のプログラミングコンテストとして、プログラミングコンテストのコミュニティーに浸透します。こうして、サークルの名前でしかなかった「競技プログラミング」が、2年程度でなぜかサークル外でも使われるようになっていくのです。(なお、埼玉大学のプログラミングサークル Maximum は、おそくとも2003年から学生主催のプログラミングコンテストをしていましたので、UTPC は最初の学生主催のプログラミングコンテストではありません。Maximum 杯は、とにかく自然言語の読解とテストケースが恐ろしいことで有名でしたね。)

この理由は、はっきりとはしません。一つには、世代交代によって「何その名称かっこよすぎうける」という感覚や「はじめてその奇妙な単語を聞いたときの違和感」がなくなってしまったことがあると思われるのと、それと、私は、プログラミングコンテストは「出る」ものであったのが、競技プログラミングは「する」ものである、というのが一つの理由ではないかと思っています。「出る」から「する」になったことで「する人」「できる人」といった概念ができるようになったのです。

誕生日と専攻

本当は、この後にこれらの話がどのようにつながるかを話すところなのでしょうが、おそらく分量はさらに倍になるでしょうから、大学時代に調べていた未発表のデータについて、軽く書いて今回は終わりにします。

相対年齢効果というものが知られています。たとえば、小学校入学時に、誕生日の差で、ほぼ7歳とほぼ6歳がいます。成長していたほうが、野球やサッカーには有利で小さい方が脱落するため、野球選手やサッカー選手は4,5月生まれが多くなります。これを相対年齢効果によって、野球選手やサッカー選手は4,5月生まれが多い、という言い方をします

当時、アウグスティヌスが告白の中で、親友フィルミヌスと同時に生まれた召使いの子がまったく異なる運命であったという話を引いて、星の位置や時刻で運命が決まるという議論を否定することを思い出して、では、人間の興味はどれくらい星の影響を受けるのか調べようと思い、興味と関係のあるであろう大学の専攻はどれくらい影響を受けているかを調べようと思ったのです。当時、日本である SNS が流行っており、そこには出身中学、高校、大学、学部ごとの集まる場所がありましたので、誕生日と専攻の相関を読むことができました。

結果、

  • 大学よりも中学高校のほうが相対年齢効果が効く(4月(遅)生まれに比べ3月 (早)生まれが少ない)
  • 中高一貫校は、2月3月生まれが、期待値よりも3割前後少ない
    • ただし、慶應塾高と女子高だけは相対年齢効果の影響がない
  • 女性よりも男性のほうが効く
    • これは男性の方が成長が遅いためとよくいわれる
  • 商学部・法学部・経済学部、教育学部・文学部は相対年齢効果が大きく効く
    • 1,2割程度
  • 理数系・外語は比較的影響が少ない
  • 芸術大学音楽大学はほぼ差がない

ということが分かりました。多くの中高一貫校は、4-6月生まれと2-3月生まれを比較すると、人口比で正規化した後でも、倍くらい人数が違います。とはいえ、4月2日に近ければ近いほうが有利というわけでもないようです。

注意しておかなくてはいけないのは、これはあくまでも同窓的な場所の参加者であるというだけですので、本当にそこの同窓生であることを保証するものではありません。ただ、これはアンケート調査でも同じで、アンケート結果が直接意味するところは、ある箇所に印をつけた、ということであり、その反射的効果として、何かが分かる、ということです。これは、試験などでも同じですね。出題者と思考がどれくらい類似しているか適合しているか、というのが試験であり、その反射的効果として、何かが分かる、たとえば、大学における教育を受ける準備がどの程度できているか、など、ということです。

私は、これは、非常に興味深い結果だと思っています。身の回りにどのような人がいたか、そして相対的に自分が劣っていると感じたから、自信を失う割合が誕生日によって、わずかに違い、その影響は、大学入学時点まで引きずり、それは何に興味を持つかにさえ影響を与えるのです。もちろん、4月生まれでも自信を失うことがあるが、3月生まれのほうが多いというだけなのにも関わらず、その影響は「割」の単位で統計に表れるという話ですね。

逆に言えば、物事に対する見方や考え方、言い換えれば、メンタリティーとか、マインドセットとか、人間性とか、そういう精神的なところが、できることできないことを規定しています。そして、私は、このメンタリティーが人の能力のかなり本質的な部分だと思っております。

大抵の場合、現実を見ることは苦痛で、自己愛や保存本能から、思考が適当に逃げるので、そこを乗り越える必要があり、自分がなんとなく出来ないことを出来るようになるには、メタ認知能力を注入してもらうようなことをするのがいいのでしょう。

私のこの話の好きな点は、誰にでも誕生日はあり、誰でもその影響をかなり大きく受けているのだけれども、それについて意識しておらず、能力や実力で勝ち取ったと思っているものが、思っても見なかった下駄があったと分かるところですね。

最高裁判決へのコメント

ここまでの記事は、2020年の8月頃、いまだ最高裁の弁論が決まっていない時期に書かれたものです。

2022年1月20日に、最高裁第一小法廷は、反意図性を認め、不正性を否定する、判決を出しました。山口厚裁判長は、弁護士枠ではあるものの、もともと東大の刑法学の教授で、サイバー法についての著作もありました。そして、その当時、刑法学の助教をしていた人の一人が、共著者の西貝先生です。

今回の判決の内容は、共著者が法学セミナーでした議論と類似しており、当てはめもかなり近いものです。その意味では、反意図性についてはともかく、大枠では私の考えと大きく異なるものではありません。

ただ、結局のところ、反意図性についても不正性についても大まかな利益衡量に持ち込んでおり、結論の予測可能性がないものです。マイニングの社会的価値なんか計上しなくても無罪にできたと思われるところ、わざわざそうしていて射程が狭いものとなっています。条文の出来が悪いと私の考える不正指令電磁的記録に関する罪について、あまり本質的な手当てをしないまま、判例として法律解釈における規範を残したのではないか、と考えます。

すなわち、これは、近いうちに似たような事件がふたたび起きる可能性を示唆しており、そのときまで、本質的な法規範の定立を先延ばしすることになったものかと思います。

最高裁は、各々の裁判官が個別意見の書ける唯一の裁判所です。僭越ながら、最高裁に求められていることは、深みのある補足意見であり、切れ味の鋭い反対意見であり、凄みのある意見であり、それらが法廷意見の判旨や判例の射程を検討する上で私達を導くのです。しかし、私達に与えられたものは、全会一致による予測可能性のない利益衡量に過ぎなかったと残念に思います。

あえていえば、近く、事件を担当した最高裁判所調査官が判例を解説するはずです。その調査官解説を楽しみに待ちたいと思います。

ちょくだいさん、ごめんなさい

ちょくだいさん、ごめんなさい。(ちょくだいさんが中高の後輩で、中学校一年生や中学校二年生の頃の印象からアップデートされていないことも行き違いの原因かと思いますので、この書き方にいたします。) 

nuc.hatenadiary.org

このあいだ書いた上の文章に対して、なぜか、ちょくだいさんに反論されています。

chokudai.hatenablog.com

しかし、ちょくだいさんには、かなり感謝と配慮をした文章を書いたつもりでした。

まず、前の方には、ちょくだいさんのおかげで、りりあんさんは模擬面接を受けることになったよ、ちょくだいさんがいなければ知り合うことすらなかったよ、ということが書いてあって、後ろの方には AtCoder のこのあたりの過去問(4問時代のABCのC問題)を解くといい勉強になるよ、とまで書いてあるわけじゃないですか。宣伝までしたくらいの気持ちでしたよ。

 

というわけで、ちょくだいさんが、先輩に失望したといっているのを見たときは、何を言っているんだろう、と思いました。

AtCoder

それで、しばらく首をひねっていたんですが、実は、まったく理解していなかったところがあったことに気が付きました。それは「競技プログラミング」とは「AtCoder」のことであり、「AtCoder」とは「ちょくだい」のことである、と読む人がいるということです。

競技プログラミングをしている」と言ったら、非常にありがたいことに、殆どの人がAtCoderに取り組んでいると思います。日本における「競技プログラミング」は、「AtCoder」と言い換えても、さほど問題がないかと思います。(競技プログラミングの在り方 ~「競技プログラミングを我々が終わらせる」を受けて~ - chokudaiのブログ)

これは、ちょくだいさんが blog に書いてくれたので気が付きました。なるほど。なるほど。これについては、意図せず失礼なことを書いたとお詫びしたいと思うと同時に少し背景の説明と本来の意図をご説明させてください。

 

当たり前ですけれども、あれくらいの長文を表に出すからには、あらかじめ、それなりの数の関係者に閲覧して感想をもらって修正してから投稿してます。それなりの数の先輩や後輩や同僚や教えた相手などに先に見せてます。もちろん、りりあんさんにも見せてます。

で、この「競技プログラミングを終わらせなければ」における「競技プログラミング」というのは、もともとは、今回の模擬面接をした3人の周りの人たちの間では、競技プログラミング同好会・クラブやその周辺の活動を指すわけです。

 そりゃそうじゃないですか、「競技プログラミングをする」という表現は当時はなくて、「プログラミングコンテストに出る」と言っていたわけです。だから、競技プログラミングといえば、自分たちが大学生の頃の集まりを指すわけです。「学生時代のバンドを終わらせなければ」と置き換えたら意味が通じるでしょうか。つまり、自分たちの大学生・大学院生の頃を反省して、とても大事なことをやり忘れてきたのでやり終わらなければいけない、ということです。

 少々不正確になって誤解されることを恐れずにもうちょっというと「東大理学部情報科学科に2002年から2005年ごろに進学した人々とその周辺のうちでお祭りが好きな人たちのコミュニティー」があったという話です。そして、2007年に競技プログラミングの名前が付きます。つまり「競技プログラミング」が広まり変質したというのは AtCoder ができる2012年より前の話をしています。「前競技プログラミング時代」には Gokuri-Squeeze GNC  kitsune- というような本当にすごい先輩たちがいたんですよ。ただ、競技プログラミングができた少し後あたりで、どこかで歯車を狂わせてしまったように感じております。

 

だから、あらかじめ閲覧していた人たちの中には、「競プロ終わらせるは本当にそう」といった反応をしている人も複数いました。

 

別に「競技プログラミング」という単語を商標登録していたわけでもないですから、その後、誰が使うのも自由です。ただ、さすがに、個人の代名詞や会社の代名詞のようになっていると思っている人がいることには私は気が付かなかったわけです。

それを前提に、元の文章を置き換えて、

「ちょくだい」は、東京大学「ちょくだい」同好会2007年春台湾合宿から始まります。

「ちょくだい」は変質し、その悪影響は看過できない所まで来てしまったと思います。

我々の目的の一つは、我々が始めてしまった「ちょくだい」を我々が終わらせることです。

という風に読んでいると理解すると、なるほどこれは、たしかに「抹殺する」という意味にもなりそうですし、

AtCoder」は、東京大学AtCoder」同好会2007年春台湾合宿から始まります。

AtCoder」は変質し、その悪影響は看過できない所まで来てしまったと思います。

我々の目的の一つは、我々が始めてしまった「AtCoder」を我々が終わらせることです。 

という風に読んでいると理解すると、なるほどこれは、たしかに「破産させてやる」という意味にもなりそうです。というか、それ以前に「お前たちは始めてないよ」といわれそうですよね。

そりゃそういう風にいわれたら怒ります。ごめんなさい。だけど、破産させる気も抹殺する気もありませんでした。というよりも、こう読まれるのにあらかじめ気がつけというのは、正直無理です。

僕たちは、競技プログラミングを娯楽として楽しんでいます。これを、初期にちょっとプログラミングコンテストに取り組んでいた程度で、我が物顔で「我々が競技プログラミングを終わらせる」などというのは、到底容認できるものではありません。競技プログラミングは貴方のものではない。もちろん僕のものでもないので、多様な競技プログラミングのあり方があるべきでしょう。(競技プログラミングの在り方 ~「競技プログラミングを我々が終わらせる」を受けて~ - chokudaiのブログ)

 という部分は

僕たちは、「AtCoder」を娯楽として楽しんでいます。これを、初期にちょっとプログラミングコンテストに取り組んでいた程度で、我が物顔で「我々が「AtCoder」を終わらせる」などというのは、到底容認できるものではありません。「AtCoder」は貴方のものではない。もちろん僕のものでもないので、多様な「AtCoder」のあり方があるべきでしょう。

という意味だとすると、納得がいかない理由はとてもよく分かります。なので、わざわざ、プログラミングコンテスト競技プログラミングを書き分けているということですよね。

しかし、「我々が「AtCoder」を終わらせる」というのは、容認するとかしないとか以前に、具体的に何をすることをイメージしていたんでしょうか。やっぱり、破産させるとかでしょうか。容認できないと判断できる程度には具体的にイメージできていたはずと思います。「AtCoder はあなたのもの」の具体的な意味もよく分かりません。ただ、なるほど、これはなんかとんでもないことをする計画だったっぽいですね。

しかしながら、前の文章でも AtCoder の過去問を解いてみたら、とおすすめしていることからも分かるように、サービスはあって欲しいと思います。

本当にごめんなさい。

 

5歳くらい歳が離れると一部の言葉が通じなくなることがあるのは、少し前に「アンチ」という言葉で強く実感したことがあります。これもそうなのでしょう。

 

ここまでが謝罪です。

質問

ところで、ちょくだいさんの文章、何を言っているかまったく読めないというか、全体として言いたいことはあるみたいなのだけれども、部分部分の整合性がないのではないでしょうか。局所的にころころ意見変わっているように思います。

ちょっとよければ書き直していただけませんか。

たとえば、「競技プログラミングが役に立つかどうかは企業が決めるべき」だと考えているんだったら、問い合わせなり資料を漁るなりしましょう。しかも、競技プログラミングAtCoderのことと置き換えてもいいとかいっているんだったら、AtCoder が役に立つかどうかを問い合わせましょう。

Googleはどっちかというと役立つ企業だと思ってますが……。」みたいな希望を書かれても知らんがなというしかないです。GoogleAtCoder が役に立つか問い合わせるなり、公開されている資料を探すなりすればよいでしょう。

その一方で、「AtCoder社として主張してそのまま通っているもの(注: IT就職における評価)もある」ということで、「AtCoder社が自発的に就職に役に立つと評価している」ことも書いていて、こんな短い文章で自己矛盾しちゃうのは読む方としては厳しいです。

そして、そもそも「Googleに入るのが偉い」という価値観を批判していたわけで、そういう価値観じゃないのだったら、Google 就職で役に立つかなんか、どうでもいいはずで、文章中でだらだらと一番長い章を立て語っているのは何がしたいのか不明です。役に立とうが立つまいがどうでもいい。そうなるでしょう。

 

また、私も、AtCoderGoogle 入社にまったく役に立たないと書いた記憶はなく、教える立場として「4問時代のABCのC問題とかが問題集としていいですよ」というのは生徒に対しても繰り返し言っているところです。この点、ちょくだいさんは、具体的にはどの程度まで役に立つとお考えでしょうか。「あくまで一部の要素でしかない」「勉強時間の2~3割は競技プログラミングに充てても良い」とありますが、具体的にはレーティングでいうといくらでしょうか。あるいは、どの問題を何問くらいでしょうか。

 

(ちょくだいさん向けの文章は、ここまでです。)

競技プログラミング

競技プログラミングの名前が何を指しているかという意味では、競技プログラミングの名前が付く前のプログラミングコンテストの時代で活躍された三廻部さんの以下の発言はとても示唆的だと思います。

「とっくの昔に終わっていたのではないでしょうか」っていうのはそうかもしれません。ただ、名前の付替えがどうとかそういうのはいいので、三廻部さんもお願いなので、「もしも、自分がクラスメイトなどだったら友達になってお茶をするだろうなと思う」ソフトウェアエンジニアになりたいという人を見つけて、授業なり模擬面接なりをしてあげてください。たぶん、私の言いたいことが伝わると思いますので。

Gokuri-Squeeze の川中さん(mayah さん)も同じ問題意識を持っていて、一緒に模擬面接をすることもありますけど、そういう問題意識があるんですよ。

mayah さんは、競技プログラミングのできる前の世界大会クラスのプログラミングコンテスト勢であるだけでなく、Google にもいた CEO かつ CTO で、エンジニアの教育にもボランティアで精を出していますので、ソフトウェアエンジニアになりたいならば今すぐフォローしましょう。

就職に役に立つ

なお、ちょくだいさんが、Google の人も競技プログラミングは就職に役に立つと主張している例として挙げられている下のツイートですが、私は ymatsux とは小学校3年生からの付き合いです。

これを受けて、Twitterで、現役Googleエンジニアかつ現役競技プログラマの方から、以下のような宣伝が行われていることも確認できます。

 このような事実を見ると、 競技プログラミングGoogle就職の役に立つ、というのも、そんなに間違っていない事実なのではないかと思います。(競技プログラミングの在り方 ~「競技プログラミングを我々が終わらせる」を受けて~ - chokudaiのブログ)

ymatsux も合宿のメンバーで、私は公開前にあの文章(2月の頭の時点の草稿)を見せておりました。しばらく話して、バックスラッシュが出力できないことがあることなどいくつかの例を出すと「よく見つけたなあ」などといってくれた一方、「情報系っぽい経歴がないと、レジュメのスクリーニングに通らない。しかし、競技プログラミングの成績があるとスクリーニングに通るようになる場合がある。これはとても重要な側面だが、お前は分かっていない。」という旨のことをいわれまして反省しました。そして、あの文章に書き足すのを忘れました。

状況

さて、たしかに、あの文章は思い込みがあると読めないものなので、いくつか明らかに断絶があるわけですが、これが分かると読みやすくなることを簡単に説明しましょう。

  • ゴールからかなり遠く、面接本番まで2週間しかなかったので、3人の面接官は本当に焦って、りりあんさんにリアルタイムアタックをさせることにしました。
  • コストパフォーマンスを最大にするために、手分けしながら渋谷の大きな本屋で本を探し、どの本の内容ならば常識的な内容を網羅していて、どこの章は読まなくていいかを議論しました。
  • そして、オアシスの見えない夜の砂漠のような場所を2週間走り続けてください、ぎりぎり間に合うかもしれないから、というようなひどいアドバイスをしました。

ということです。

というように、とにかく3人の面接官は慌てまくっており、あの文章では「りりあんさん」については「リアルタイムアタック」させるための「コストパフォーマンス」の話しかしていないのです。どうも人間関係資本と教養の話をしていると思う方がいるようなのですが、Google の面接に教養も人間関係資本もいりません。

具体的にイメージしやすいように伝えますと、難易度・分量的には、私は「大学受験の物理」くらいと思っていて、一緒に面接官をしている人はそれよりは多くて「大学受験の物理+化学」くらいといいます。センター試験の数学のタイムアタックだけをやりこんできた人に、「残念なお知らせがあります。2週間後に2次試験があって、科目は物理と化学の2科目だけです。聞いたことがない科目かと思いますが、4時間で自然科学の概論を教えるから、その後で知識を詰め込むために本屋行きましょうか。難しい問題はでないからなんとかなると思います。」と告知して間に合わせなくてはいけなくなった。というのが伝わる比喩でしょうか。(聞くところによると、速い人は、数学1Aは8分、2Bは17分前後で解けるらしいですよ。)

 

また、「Google 入社は、えらくもないし、すごくもないし、むずかしくもない」と我々は心から思い、言い続けています。というか「えらくもないし、すごくもないし、むずかしくもない」と思っているから、たとえば、教育制度を整えて国策として大量に人を輸出するべきだといっているんですよ。

私に対して、

とかいっているけれども、どう見ても「「Googleに入るのが偉い」という価値観」を持っているのは、ちょくだいさんのほうですよね。私には「お茶が飲めて偉い、すごい」くらいの違和感があります。

 たとえば、さっき見つけたこのツイート。

「化け物」だとか「注目が集まった」とかいうことですが、偉い、すごい、という価値観がないとでてこない説明です。

私は、このけんちょんさんのために仕方ないと思って記事を書いたのですよ。本当に面倒で書きたくなくて、他に書くものもあり、ツイッターで書こうかなと宣言して自分を鼓舞までしたのに、2ヶ月以上かかりました。

りりあんさんについては、私からすると「やりたいっていうなら手伝ってあげるけど、いくら難しくないからって、さすがに2週間前になってからなんとかなるかっていうの、最後にして欲しいんだけど。でも、2週間走りきったのよく頑張ったね。」というような感覚です。

 

たとえば、こちらの方は私の見え方に近いです。この人も合宿に一緒に行きましたね。

まじめにこれは言い訳しなくてはいけなくて、本当に申し訳ないです。教えるときに古巣の「会社のため」を毀損していないかは考えています。そして、実際に能力が偏っていると「本人のためにもならない」ことがあるのは確かです。

今回は、海外の模擬試験を自分で申し込むようなやる気で、2週間全力疾走をする伸び率が叩き出せるならば、それからも伸びるだろうから「会社の判断が取るならそれでいい」と判断しました。なのでオファーが出た後もなんか色々いいましたよ。

お知らせ

ここで残念なお知らせがあります。とある医学部教授から「読んだよー。文章はいいけど、お前が卒業生をひょいひょい適当にエンジニアにすると教授会で問題になることがあるから、するんだったら出来の悪いのにしてよね。いいね。ほんと頼むよ。特にそこにいる生徒会長みたいなのはだめだから。」ということなので、今後は、あらかじめ「出来が悪いかを問い合わせる」約束をしてきました。

列挙

ここからは、「コミュニティー」からの反応を見た範囲で列挙したものです。

chun さんに、このようなことをお伝えするのは本当にお耳汚しなのですが、散逸は意図的です。私の経験則で「誰にとっても新しい情報」のメッセージを広く伝えたいときには、「詳しい人は同意するが、そうでない人は違和感を感じる内容」を加えるんです。そうすると、人は、「新しい情報の真贋を、周囲の情報から判断しようとする」ので、一部の人に認知負荷がかけられます。こうすることで、根拠と結論が噛み合わない支離滅裂な発言も出てきて広まると認識しています。

この話の内容「かわいそうなことに、りりあんさんは、いかれた3人の模擬面接官が今まで何をやっていたんだと慌てふためいたことにより、2週間のリアルタイムアタックを宣告され、無理やりクリヤーさせられました。コスパがよかったですね。でも、こっちの胃までおかしくなるから真似しないでね。」で終わるのですが、これだけ書いてもぜんぜん広まらなさそうですよね。そこに、フィロソフィーと教育関係の問題意識の話を突っ込むとこうなります。

 我々の世代はこういう考えでしょうね。

 

Spaghetti Source を思い出して懐かしい気持ちになりました。

 

  

 

 

 普段、抑えているところを少しだけ外しました。

 

 ああ、そこは前もって閲覧してもらったときにも複数人がひっかかった箇所です。その前についている「それ以外で、」の部分に相当押し込んでいます。ただ、おそらく、主張が整理しきれていなくて、少しだけ整理し直すと

  • 戦前ならば、単純労働力として南米やカリフォルニアの農園にでも放り込めた。
  • 婚姻などの手段は変わらずあるが、仕事がいるならば、いまではなんらかのジョブ型の仕事をするスキルが必要。
  • だが、なにがスキルとなりうるのか。
  • 社内のスキルを使った社内トランスファー
  • スポーツ・芸術・音楽・料理などは国によってはスキルとなる。
  • 高等教育において徒弟的な教育を受け、理系スキルとしてのエンジニア(ソフトウェアに限らない)があるようだ。
  • 海外で徒弟的な教育を受けても良い。
  • ただ、MBA やローなどの職業訓練で海外の大学院に行っても、現地では働けないようだ。ただ、中国語などができると、そうでもないっぽい。

くらいの気持ちです。ここはコントロールに失敗しています。

元生徒その他

 

すまん、脱線はしないつもりだったが、とあるところが「死に至る病とは、絶望のことである」と構文が同じだったのでしばらく笑っていた。

  

Twitter で医師を拾ってきて Google のソフトウェアエンジニアにするだけの簡単なお仕事

はじめに

【転職エントリ】Googleに入社します|Lillian|note」という、医師から未経験で Google のソフトウェアエンジニアになった記事があります。

note.com

私は、この記事に出てくる「とある元 Google のソフトウェアエンジニア」で、面接の対策を立てました。

記事が出た当初から大反響で、私もそれなりの反応を見まして、いろいろと誤解されているなあ、と思う一方、アドバイザーはあくまでもアドバイザーだから、アドバイザーとして知りえた情報については、口をつぐむべきだと思っていました。

ただ、あまりにも誤解されており、悪影響が大きく、犠牲者も多くなってきたと思ったので、許可を得て簡単に背景を書いておこうかと思います。

これはあくまでもアドバイザー側からどう見えていたかを書いておくものですが、医学部卒だけでも3,4人 GoogleAmazon に入っていったおぼろげな記憶がありますので、他の人の話と混ざっていたらご容赦ください。

<追記: 2025年3月14日>
この記事が書かれてから4年ほどが経過し、教育体制が拡充しました。この記事(簡単なお仕事)の意義が減損したわけではありませんが、下記を加えて読むことでより立体的に内容が理解できるでしょう。

</追記>

教えるに至った背景

動機はいろいろ複雑なところがあるのですが、以前から Google の面接対策をしておりました。はじめは履歴書の添削や教科書の紹介くらいだったのですが、授業もするようになり、ある時期から模擬面接をしてもいいことになったので、模擬面接をするようになりました。

もともと教えることは得意で、特に短時間で全体図や戦略を伝えるのが一番効果が出ていた気がします。学生時代、成績が悪くて志望校を変えろといわれたのでどうしたらいいか見てやって欲しいと言われた小学生が2人いたのですが、それぞれ開成中学桜蔭中学に入っていきました。偏差値40や50からでもなんとでもなりますね。ちなみに、筑駒だけは試験問題の内容が毎年ぶれすぎていてかなりが運です。教員がまともに生徒を取る気がないのでしょう。そして、運要素が大きいので偏差値が高くなります。

それはともかく、模擬面接をするようになってからは技術面接はほぼ通過する感じになりました。ほぼ、というのは、模擬面接はしたけれどもやっぱり受けない人や面接が終わったあとにチームが見つからなかったり辞退する人がいるため分母と分子がよく分からないのですが、面接自体は滅多に失敗しないという感覚です。

前年の2018年はインターンを含めて4人全員が技術面接は通り、2019年6月当時は、すでに2,3人見ていたが結果はまだ出ていない段階だったようです。

今年はもう1人くらい見てもいいかなと思っていたところ、ツイッターGoogle を受けると書いている人がいて、競技プログラミングサイトを運営している中高の後輩がなにか作用したので、偶然見つけました。アカウントを見ると DM が送れたので「Google 受けられるんですね。」と聞いてみたところ、6月の末に模擬面接をすることになりました。「日本から西海岸に人を輸出しようとしている」と説明しました。

Google の技術面接

Google の技術面接は、シリコンバレーのなかではそれほど難しい方ではありません。

西海岸の文化では、面接の場では仕事に関係のない能力を評価できません。このため、日本語能力は評価外です。英語能力は問われますが意思疎通が取れればよく、ここ自体が問題になることはあまりありません。仕事をする上では、どうせ英語能力は帰国子女(小学校から高校までの半分未満を英語圏で暮らしたくらい)でもまったく足りないですし働き始めると伸びます。

また、エンジニアについては、性格についての評価をあまりしないため、差別的でないかなどのポリティカル・コレクトネスを除けば、ほぼ純粋に技術的な能力だけを見ています。

そして、システマチックであるために、個人的には非常に評価をゲームしやすいと思っています(game する: manipulate (a situation), typically in a way that is unfair or unscrupulous. Oxford Languages)。正直な話、FAANG+M 内で比べてもとても対策しやすい印象です。

ポリティカル・コレクトネスについては、日本が儒教の影響下にあるため、西海岸文化でやってはいけないことがむしろ好まれていたりするので、かなり釘を差します。たとえば、長幼の序や男尊女卑などは外すのが難しく、禁忌なのでたまに事故が起きます。一番安全で簡単なルールは、相手が明確に出してきた情報以外を使って会話しないことだと思います。たとえば、目の前の人物がXXだと思っても、明確に相手が自分はXXだというまで、そうであるか分からない前提で会話をすることです。

ラッキーだったのは、リクルーターから声がかかっていたので、面接前の足切りであるレジュメスクリーニングで撥ねられることがなかったことです。東大の工学部や理学部は通るのですが、東大医学部卒は社員がリファーしてもとにかくスクリーニングに通りませんでした。

模擬面接当日

少し雨が降っていました。大きな黒板のある部屋を借りて、午後1時に集合しました。

その年からは、大学の同期で元 Google のエンジニアがもう一人講師役を務めるようになっていました。また、この日はもう一人腕の立つエンジニアが講師役で遊びに来ていて、全部で4人でした。

はじめに手続き的な流れをざっと説明してから、実際に問題を解いてもらいます。

模擬面接から受けた印象としては、このままでは通る見込みはなく、間違った方向に努力してきていて、かなり修正しなくてはいけないが、時間があまりにもないので間に合うか本当にぎりぎりというものでした。

せっかくですので、ここで本人の記述を見てみましょう。

 このタイミングで、とある元Googleのソフトウェアエンジニアの方から声をかけていただき、模擬面接をしていただけることになりました。後から思うとこの機会は私にとって本当に幸運でした。模擬面接では私がコードをすらすら書いてみせたので、ちょっと驚かれました。競技プログラミングで得られるようなアルゴリズムのコーディングスキルは、面接対策にはもう十分過ぎるほど練習済だと思うとの評価でした。

 その反面、情報科学の知識を前提としたディスカッションでは、私の知識量があまりに乏しいことに半ば呆れられました。模擬面接はその時点で終了して、一緒に近場の書店に行って、教科書を買うことになりました。ここで選んでいただいたオススメの教科書は本当に良書ばかりでCPUやOSの仕組み、ウェブの技術など、情報系の学部で学ぶと思われる情報科学の基礎をしっかりと勉強することができました。

実のところ、こちらからみると、コーディングを始めてから15分かからずに知識がほとんどないことに気がつきました。それを前提に、通る確率を最大化するような戦略を立てます。知識はあとから自習で補ってもらうとして、まず、どうやってコーディング中の応答で知識を使うかについて丁寧に説明します。質問をしたあとで、こういうことを知っていたとしたらどう答えますか、と聞き直すのです。

そして、驚いていたのはコードをプリンターのように上から書いていったことです。これは暗算のようなもので、まともなエディターのない環境や速度が本当に大事なときにやりますが、普通はやる理由がありません。ああ、競技プログラミングの価値観に浸かりすぎたなと思いました。

コードの読み書きができることが救いです。とはいえ、パースなどが絡むと迷うのは理論的バックグラウンドが弱いからでしょうか。さて、4時間で軌道修正します。

競技プログラミング

競技プログラミングは、東京大学競技プログラミング同好会2007年春台湾合宿から始まります。それまで、プログラミングコンテストは開催されてきましたが、競技プログラミングの名前が使われたのはこの合宿がはじめてで、このとき一つのジャンルが生み出されたのです。

合宿のメンバーは、プログラミングコンテストにおける世界と日本の差を感じており、世界で戦えるような後進を育てることにしました。そして、競技プログラミングが日本に広まっていくのです。

黎明期の競技プログラミングをしていた人たちは、Google に入る程度のことくらい造作ない人たちで、実際、その合宿のメンバーは12人中9人が Google で一時期働いていました。

私は情報科学を専攻しておらず、Google 本社から受けることを勧められてオファーレターをもらうまでは、国家一種経済職で官僚にでもなるつもりでエンジニアになる気がありませんでした。そして、大学院でふらふらしていたので多くの同期たちから3年遅れで入ったのですが、同期たちに通るとは思わなかったというと、「何言っているんだこいつは馬鹿か」という顔をされたあとに「いや、通らないわけないだろうけれども、まさかこういう仕事をする気になるとは思わなかった」といわれることが2,3度あってからは、なるほど馬鹿げたことを言っているんだという認識を持ちました。また、入ってみると日本(で教育を受けた程度の意味)のエンジニアの10%-20%は知り合いでした。

そして、自分も面接をするようになってから分かったのですが、たしかにこれは友達とお茶をする程度の難易度です。

大学に入ったばかりの頃、プログラミングコンテストで世界大会にも行くことになる先輩に次のように聞いたことがあります。「情報科学の自主ゼミをしている友人からソースコードと出力が同一になるプログラムが存在すると聞きましたがどのようなものなのでしょうか。」先輩は即答しました。「クワイン文ですね。クリーネの再帰定理から存在が導かれます。それくらいは常識です。たぶん、少し考えたら書けると思うので書いてみてください。」この人の専攻は理工系ではありません。
この先輩は他にもとてもいいことを言ってました。研究者ならば、どのような分野であれ、プログラミングコンテストの初級中級くらいの問題は20分位で解けるべきだが、それ以上やりすぎてはいけない。情報系を大学で専攻しないと決めた以上、圧倒的な知識の差ができるが、それでも彼らが常識としていることを常識としなくてはならない。
そういうものかと思っていたら私もまがりなりにもできるようになりました。たぶん、投入した時間は多く見積もっても半年くらいです。

このように、昔は、Google競技プログラミングは当初はとても近いところにあったのです。

今回模擬面接を受けられた方のように、競技プログラミングを熱心にして、Google に入りたいという人に会うことは多々あります。ただ、現在では昔のように造作ないとは行かないようです。

競技プログラミングは変質し、その悪影響は看過できない所まで来てしまったと思います。競技プログラミングを始めた人たちができていたことが、その少し下の世代ではみるみるできなくなっていったと思われます。少なくとも、競技プログラミングの関係者がここまで Google に通らないことはありませんでした。

というのも、競技プログラミングは面白くするために、いろいろなところが捨てられています。

面白くするためには、やはり勝ち負けはきれいな方がいいので、オーダーの正しいアルゴリズムを思いついて正しく実装できることを基準にしてあります。また、打ち込むのがあまりにも大変なアルゴリズムはでません。

一方で、プログラミング言語の選択は影響がないように作られています。このために、1000倍くらいの定数倍は無視します。

実際の現場では、計算量が遅いもののほうが速いことも多々あります。たとえば、場合によってはハッシュ値を計算している間に50くらい線形でなめられるでしょう。メモリーヒエラルキーを意識することも大切です。また、当然、プログラミング言語の選択だって、実際の現場では重要な技術的な決定の要素です。

クイックソートのようなライブラリーが提供するアルゴリズムについても詳細を聞かれません。たとえば、最悪計算量に近いときにスタックオーバーフローを起こすので、短い方から再帰して、長い方は末尾再帰最適化することなど、いくつかの常識があります。

もっと簡単なところでは、バックスラッシュを含む文字列をリテラルで書く方法は不要な知識になっているのか、かなり書けてもできない人をよく見ます。結構ホラーですよ。さらさらとコードを書くのに、どうやってその知識を避けて生きてきたんだと。

こういったものを無視することによって面白くなっているのが競技プログラミングなのです。

昔は、面白くないコンテストというのがたくさんあったのです。

たとえば、線形時間アルゴリズムの最適化のコンテストで、締め切り後にフロッピーディスク内のファイルで計算が行われることが発表され、フロッピーディスクから大きなファイルを読み込むため、非同期処理をして読込み中に計算をした人が2位にダブルスコアで勝つというコンテストがありました。騙された感じはあります。ただ、本当に勉強になりました。

その後、その当時はじめの競技プログラミングをしていた人々は、競技プログラミングの普及から足を洗っていきます。そして、競技プログラミングを広めるのがその下の世代になるにつれて、競技プログラミングは本来の意味を失い、カーゴ・カルト化してしまったのでしょう。

つまり、面白くするために作られたルールだと分かっている人たちがいなくなり、そのルールとそれによる序列が絶対的なものになってしまったということです。競技プログラミングがとてもできるのに落ちたというときに、おそらく起きていることは、バックスラッシュが出力できなかった、ということがたいていでしょう。面接官をすることに慣れている人ならば15分もすれば違和感を感じ始めるものです。まれにすりぬけるんですけどね。

感覚的なものですが、ルールの距離について、新聞記事の編集とクロスワードパズルの解答くらいの距離感と言っていた人がいました。少なくとも、将棋と詰将棋よりは遠い感覚があります。いわゆるフェアリー詰将棋でしょうか。この人も私が教えて未経験から Google でソフトウェアエンジニアをしています。

実際のところ、競技プログラミングは初期はコーディングの読み書きの能力を鍛えますが、かなり初めの方から出題者の気持ちを読む能力を重点的に鍛え始めます。

そして、いまではクリーネの再帰定理すら分からなくなってしまったのです。

今回、模擬面接を受けられた方は、ゲームをゲームと認識しないままやりすぎていたという印象でした。

ところで、ここまで書いてませんでしたが、今回の講師役のうち二人は、競技プログラミングがはじまった2007年春の台湾合宿に参加しておりました。

我々の目的の一つは、我々が始めてしまった競技プログラミングを我々が終わらせることです。

模擬面接

さて、模擬面接に戻りましょう。

面接では難しい問題はまず出ません。ただ知識の不足から知的な問題だったと感じるだけです。そしてたいていの場合、テンポが遅すぎます。よい面接は漫才のように進みます。

LeetCode とかに問題がさらされていますが、あれは、たいてい入り口で倒れているので、本体に到達していないんです。そういった足を踏み入れると深みがあるような問題が好まれます。

解答にひらめきがいるように思われていますが、だいたいの場合は、人類の100年近い情報科学の歴史の中で類題が解かれているので、それを思い出すだけで解ける話ばかりです。そのようにしなくてはいけない制限が随所にあって、それらは、いくらかは合意、いくらかは人類の技術的理由、いくらかはこの宇宙の数学的物理学的制限から来ているものです。

「何をどれくらい知っていなくてはいけないのか」と聞かれたので、ちょっと考えてから、右手を前に突き出しました。手を開いた状態で右手を伸ばしたあとに、「手を握ります」と宣言してからゆっくりと手を握ってみせました。「いま、手を握ろうと思ってから握るまでのあいだに起きたことをできるだけ詳細に説明してください。」
いままで鉄門を何人か教えてきたので、医師にはこれが一番通じると思ったのです。
前頭前野。運動野。頚椎。腕神経叢。ミオシン。アクチン。
「そうですね。H-H方程式やイオンチャンネル、骨や筋肉の名称の話をしてもいいでしょうし、答えが足りなかったら追加で聞いてきます。では、頚椎損傷で今の動きができなくなったとしたら、Cいくつの損傷を考えますか。医師でも結構忘れているので答えられなくてもいいのですが、この答えられなかったときに感じる答えられて当然という感覚を覚えていてください。その番号で人生が大きく変わった人はたくさんいますよね。」
「ヘモクロマトーシスの患者さん、いままでどれくらい見たことありますか。要するにプロというのは、数年に一度見るくらいのことは当然に知っているんです。いままで仕事で書いたダイクストラの数覚えてますか。」
同僚の8,9割が知っていることを8,9割知っていることがどの世界でも求められるのだと思います。

 採用面接は単なるコーディングスキルの試験ではなく、ディスカッションの中でのコミュニケーション(意思疎通)が非常に重要であることを強調されました。チームとして一緒に仕事をする仲間を見極めることが面接の目的であることを考えれば、実践的なコミュニケーションが重要視されるのは合理的だと思いました。

終わったあと、渋谷の本屋に寄り、徹底的に山を張ります。
面接官役3人で協議した結果、できるだけ量を減らして6冊が選ばれました。オペレーティングシステムの本は、どうするのがいいのか少し自信が持てませんでした。3人とも似たような本を読んでいたのがなかなか面白いです。

ただ、これはどの分野でも同じはずです。もっとコモディティー化している、たとえば、生理学の教科書にしても、多く数えてもせいぜい10冊くらいしか選択肢はなく、そのうちの何冊かは読んでおり、いくつかは比較のためにパラパラと見て、少なくとも友人が使ったので評判を知っているという状況になっているので、自然とこうなるのです。

「うーん、たしか、医学部医学科の教育って、これくらいの量の本を読んで、2週間位で試験をするのは普通なのでできますよね。」と聞いたところ「はい」と答えていらっしゃったのですが、あとから、内心、「間に合うのかこれは」と思っていたと聞きました。私の見積もりも間に合う確率50%くらいでした。

結局の所、知っていて当然な知識かどうかの判断をする際には、同僚のエンジニア同士が夕食時などに雑談をして、まあ、そこにいる8-9割方が知っていることならば、出題ミスではないよねとなり、それが常識とされるわけです。その量から比べたら、6冊の本ではあまりにも心もとない、しかし、4時間だけならば被弾せずに耐えきれる可能性があるだろうという読みでした。

そのあとで、面接官の1人は帰ったのですが、残りの3人でメキシコ料理を食べに行きました。

そして、勉強が終わったら応用情報技術者試験がちょうどいいと思います。応用情報技術者試験の勉強をするとクイズのようになるのでよくないですが、勉強した結果、応用情報程度の問題が明らかに感じるようになるとちょうどいいと思います、とお伝えしました。

東大理学部は、研究者による研究者養成なので、半分前後が博士課程まで進学し、そこの教育は仲間なり後継者なりの育成としてなされます。数学科の差しゼミとか顕著ですよね。教授が大学四年生を一対一で詰め続けると数学が分かるとは何かがようやく分かるようになるのです。それまでは、東大理学部数学科でもだいたい学年の半分しか分かっていないと京大の准教授がいっておりました。これでもとても高くて他の旧帝だと普通は1割と聞きますね。
そして、一廉の人物が自分の仲間になるかもしれないと思って教育をするとき、そこには莫大な常識が流れます。その常識を横から掠め取るだけでも相当なものです。医学部だって、そうでしょう。多くの教授たちは、自分が授業をしている相手がいつか、自分の部下となり同僚となり、自らが挫折したところを踏み越えていくと思って育ててたんじゃないんですかね。少なくとも、研修医が終わって医局に配属されたあたりからは、本気の教育がはじまりますよね。そして、その結果、医師同士の能力差は信じがたいほど大きい。
私は、時々、自分を育ててくれた人たちと、その人たちをどれくらい裏切ってきたかを思って、一人嗚咽することがありますよ。あなたもきっとそうでしょう。

動機

さて、このような模擬面接をしている動機についていくつか書いておきましょう。

まず、ある程度は遊びです。数時間の介入で見違えるようになり、人生が大きく変わるのですから。今回は、勉強の仕方を教わらなければ絶対に得られなかった内定だと本人にも思ってもらえているようです。ああ、まあ、分かっている人を教えることも多いんですがね。70%通るだろうという感じの人が95%通るだろうに変わるのはそれはそれで達成感があり楽しいものです。

次に、エンジニアは天然物しかいない、という信念を打破したい、と考えています。エンジニアは養殖できることを立証したいということです。
エンジニアの出身学科で一番多いのは東大理情なのですが、次が東大理物でした。理物では、情報科学教育はほとんど行われていません。ただ、出身者が多く、教育をしようがしまいが現れる、生まれつき、天性のもので、天然物しかいないという信念に繋がります。
あと学科ではありませんが多いのは京大マイコンクラブ(KMC)です。つまり、理情とKMCのようにそもそも天然物が集まる場所と、一切、教育がなされていない場所で、天然のエンジニアが発生するという考え方です。
さらに、現在は若いうちからやらないとよいエンジニアにならないという信仰もあるようです。ただ、大学教育は圧倒的なのでスタートの差が誤差になることが多いでしょう。
この信念を示す目的で行っています。

それから、中国やインドとの国力差です。Google では、およそ中華系インド系がそれぞれ全エンジニアの2割ずつを占めているというのがラフな計算です。一方で、日本の人(中学から大学までの教育の半分以上を日本で受けた程度の意味)はとても少なく、それより2桁小さいと思われます。人口が1桁少ないことを勘案しても、あまりにも少ないです。
いろいろな試算がなされたのですが、仮に日本で教育を受けた人全員がこの面接を受けても、通るのは日本で2000人くらいだろうと思われています。これはどちら方向にも3倍は間違っていないと思われます。

そして、特に Google では、ソフトウェアエンジニアを含むエンジニア職が、企画調査研究開発から設計製造流通までを握り込んでいます。しかも、日本でよくある本社が決めた内容を支社が実行する関係ではなく、全世界のエンジニアのチームがある意味で対等に近い関係である一方、エンジニアの部署とそれ以外の部署の間の情報隔壁は高いです。
実際にやっていることは、戦略を立て、データを解析し、マーケットを分析し、コードを書く仕事です。
そして、少人数で圧倒的なインパクトが出せます。インパクトといってもお金に限らず、人々にどれくらい影響を与えるかです。10兆円を売り上げる何かを触るとそれなりのものがでてきます。

現在、米国の成長を牽引している企業、たとえば FAANG+M の企業文化を知ることのできる人物があまりいないことはストレートに国益を害するでしょう。
端的に言えば、これが日本の情報科学教育の質です。特に研究者や大学教員でもあまり通らないのは問題です。

この人数を中国やインドに比する割合まであげなくてはいけません。

Google の特殊事情を差し置いても育成はエンジニアにせざるをえません。というのも、基本的に、日本人が海外で自発的に生活する手段というのはほぼないからです。たしかに他人の都合に依存して滞在する方法はあります。まず、「紐付き」で企業や官庁などがスポンサーをしてくれて海外にいるように命じている場合。次に、「結婚」で配偶者に養われている場合。芸術やスポーツなどのプロ。ほか、事実上の通訳。そういう現地の人とは異なる手段での滞在の方法はありますが、それ以外で、海外で生活している人は、大学等の研究者かエンジニアの二択です。(金融系や建築系でモデルを書くなどの広い意味で数学的工学的技能を使う人はエンジニアに含めておきます。)

私の知人では例外は、カリフォルニアで幼稚園の先生をしている人、それと、フランスでパンを焼いている人の二人です。

たしかに、アメリカなどで弁護士資格を取ってくる人いますが、ほぼ間違いなくアメリカでは働けていないはずです。日本の帰国子女程度の語学力では、弁護士資格を取ることはできても、向こうで働くことは困難なのです。まあ、いちおう、インターナショナルスクールで教育を受けてアメリカで大学とロースクールに行った知人で、アメリカで弁護士ができている知人が一人いますので、この人も例外に入れておきましょうか。ただ、中学から大学までの大半を英語で教育を受けており、さらに日本人の多い都市で働いているという留保をつけてです。

不思議なことに、日本語が第一言語でない場合は働けている人がそこそこいます。ただ、いずれにしても、日本語が第一言語の場合は、中学から大学までの半分以上を英語圏で教育を受けなければ、とても英語だけで仕事ができる能力にはならないでしょうが、エンジニアと研究者だけはなんとかなります。

つまり、日本の将来の競争力に対して、エンジニア教育はクリティカルに効くはずです。

そして、教育の格差を埋めることです。その原因のかなりが家庭と大学における教育の欠如と人間関係にあります。

まず、大学における教育の話です。

東大では、入学時から学問をするとは何かが見えている人はあまりいません。そもそも、入学当初の数学の授業についていけるのがそもそも10%程度で、基礎学力すらおぼつかない状況です。そして、そこに対して、仲間を育てる水準の教育をしようという人があまりいないため、教育を受けられる学生はそれほど多くないです。

筑駒の同期たちは、5%がアラサーのうちに准教授相当になり、1割が助教相当になりました。たしかに、学者になることを考えていそうなのにならなかった人がある程度はいますので、それぞれ学年の1割2割を占める法曹や医師がほぼ挫折していないことに比べれば難しく、運の要素もあるのだろうという感じはしますが、それでも、これはおそらく学者になることが中学受験に比べて簡単になってしまっていることを意味しています。

日本のアカデミアは多くの場所で競争がないということです。組織の大きなところ、たとえば医学部はそれでもまだ活気があります。
ただ、実際に、信頼できる友人たちは特に人文社会系の教員は3割くらいは会話が成立しないと嘆きます。
この原因はなんとなく分かります。数学科では学部のうちに教授と1対1で毎週詰めるという話をしましたが、人文社会系の多くの学科では、教員あたりの学生数が多く、それほど博士進学率が高くないために、そこまでのコストが払えません。このため、教育が大学院からはじまるのですが、指導教員にはっきりとつくために、運が悪いと教育をなされないまま、博士を取り教員になっていくことになります。

そして、懸念に拍車をかけるのが大学における人間関係が薄いことです。
囲碁や将棋には田舎初段という言葉があって、正規の訓練を受けた人からは相手にされるほど強くないが、素人になら無双できるレベルというのがあるんです。レベル5くらい、と私は時々表現します。人間関係が薄いとこれに簡単になります。<追記: 2025年3月14日>(この田舎初段の説明は知らない方には伝わらないと思われるものでうまくありません。田舎初段とは、「あとちょっとで初段だから頑張ってね。」と言いたくなる相手ではありません。「受け方を知らない初心者をなぶるのが好きなんですね。ちょっと知っている相手には通用しないでしょうけど。でも、まあ、そういう楽しみ方もあると思うので好きにしてください。」という相手です。つまり、進歩の袋小路に入ってしまっていて、そこから成長するにはアンラーンする必要がある状態のことです。)</追記>

多くの能力について、初級のときに身につけるスキルとその後にずれがあります。たとえば、数学をするにしてもはじめは九九の暗唱をします。それが得意であれば、レベル5くらいまでにはなります。それをよしとするかあしとするかはともかく、大学受験までは芸大でもなければ、田舎初段で通ってしまうというのが日本の水準です。東大でも数学が得意だと名乗って証明と称するグロテスクな画像をネットにあげている人いますよね。受験数学は好きだったが数学者とカジュアルにお話をしない法学部文学部医学部あたりではよく見ますし、理学部でさえもたまにいますね。レベル5で周りから賢い人と思われるまでになったとしても、そのあとに国家試験などでふるい落としがある場合は、やり方を変える必要に気が付かないと苦しむんですが。

田舎初段になるのは、別に学問だけじゃないです。たとえば、事務でも同じことが起きます。新型コロナウイルス感染症が日本に来た頃に「マスクを医療従事者に」というクラウドファンディングを立ち上げまして、1.5億円集めて500以上の病院にマスクを寄付しました。トップページの文章はだいたい口述筆記してもらったもので、また輸入元と配布先の選定を主にやっていました。あの頃は英語や中国語が読めたら明らかにおかしいと分かるような書類や品物が飛び交っていて、かなり立場がある人や法人等でも漫然と事務をしていると偽造された書類をさっくり踏むんですよね。京都大学が苦しんでいたので身投げする気分で突っ込んだんですが、結果的には、関税局とのやり取りが面白かったので「緊急事態における手続き変更・解釈変更――マスク・手指消毒薬不足に対しての財務省の応答――」というペーパーを税法学者と書けて、自分の中では辻褄が合いました。が、それはともかく、日本の資料読解力に危機感を持ったのは確かです。専門職でジョブ型の雇用されていると事務や執行のあたりがまったく見えなくなる方は多く、その点、日本の雇用制度の定期人事異動システムはよくできていますね。

話を少し戻すと、Google の入社試験は、そういう意味では田舎初段では難しい、ただ、レベルが10あれば通る可能性がでてきて、レベルが30くらいあれば余裕というのが私の感覚です。これの恐ろしいところは、なにかの分野では一廉でも別分野では田舎初段に容易になるということです。

学者とかでも、他分野に友人が十分にいれば、そう踏み間違えないが、孤独ならばどんどんおかしなことを言い始めます。よく分かっていないことに対して一定数が陰謀論を取るのは進化論的に正しいことだと思っていて、たとえば、新しい食べ物が手に入ったら、群れの1,2割はホールドバックエクスペリメントに割り当てて、食べないようにしないと、運悪く遅効性の毒だったら群れが全滅するでしょう。でも一部が残っていれば、それがまた繁殖して増えればいいのです。だから親子兄弟ほど仲違いをし、保険がかかるようになっているのではないでしょうか。このために、人は思い込んだら説得が効かないようにできているのだと私は思ってます。

これを止められるのは、かなり簡単に狂うことを意識していることと分野を超えた人間関係があることが揃っている場合くらいでしょう。

たとえばですが、最近、ひやっとしたことがありました。とある大企業の創業者会長と散歩しながらビッグバン元素合成の話をしていました。散歩しながら自然科学の話をするのはだいたいコーディング面接と頭の使い方が同じです。そこで、陽子と中性子の存在比がおよそ7:1になる理由を口にしようとしたところで違和感を感じ、あとで京都大学の准教授に聞いたところ、宇宙の膨張率と反応率の兼ね合いで、現在の人類の理解では必然ではないことが分かりました。

こういうことがあるので、ビッグバン元素合成の話をするときには信頼できる人にちょっと見てもらうわけです。このブレーキが壊れると簡単におかしくなります。

ちなみに、ネットで有名になるためには、田舎初段であることはかなりプラスに働きます。専門性があるとある種のためらいがありますが、仲間がいないとそれがなくなります。そして、ためらいがないほうが、一般に知的に見えるんですよね。

普段から様々な分野の学者と話し合っていると、およそまともではない専門家の意見がネットで飛び交っているのがよく分かります。特に、ネット上で声の大きい医師や弁護士の意見は、医学者や法学者の集まりでは評判が悪いです。
別に学者ならば問題がない人たちであるわけではなく、ネットによく書き込んでいる大学教授がクイズの定期便扱いされていて、どう勘違いしたらこういい出しちゃうのかというクイズが解かれているのはよく見ますね。

要は、教育を受けた人たちでさえ、仲間とお茶をしていないのです。そしてそれを見抜くのはとても簡単です。

もう一つは、家庭の話です。

エンジニアの人数で男女差がないのが中国でほぼ半々ですが、日本は2%という感覚でした。
まあ、そもそも総数もとても少ないのですが、それはともかく、男女比が問題となりました。米国では、人種によるエンジニア比率も人口比と大きくずれ、エンジニアの女性率は2,3割です。

ある日、私は東大の二年生の方に話を聞きました。すると「Google が私達なんかに興味を持つのか」と聞くのです。私は意味がよく分かりませんでした。そして、しばらくして、なぜ進振りで情報系を女性は選ばないのか聞いたところ、いろいろな理由を挙がったあとに、最後に「理学部は大学院がほぼ必須なので」といわれました。
まさか戦後生まれで大学院に行くことが人生の選択肢にないことがあるとは思わなかったので、私は本当にショックでした。30を過ぎるまでこれにまったく気が付かなかった自分自身への怒りで、視界がおかしくなっていました。浅くなった呼吸を整えて、「この程度の情報科学を学び、計算とは何かについて考え、学問がもたらす景色を見ることができると思えないことは、尊厳の……尊厳の問題だと思います。」とだけいいました。

昔、母方の祖母のところに FAX が毎晩届いていました。祖母の同級生で、第二次世界大戦とその後のごたごたで高校に行けなかった人が、一念発起をして高校受験をすることにしたので、英語を見て欲しいといって、英作文を FAX で送りつけて祖母に採点してもらっていたのです。私も二三回英作文の微妙な表現などで祖母の相談にのりました。そして、干支が一周くらい下の人たちと高校を卒業し、その後大学を受験して大学も卒業していました。

少し落ち着いた後に、私は、そういった話をいくつか思い出し、なるほど、と気がつきました。これは、私にとって、être を直接触られる話なのです。そして、最後に、新約外典のペテロ行伝に、ペテロがローマに戻ろうとしているキリストの幻を見て、自らがローマに戻り十字架に架けられることを理解する話があったことを思い出しました。

小銭のために大学に行くのも悪いとは思いませんが、私は、人として生まれたからにはこの世界について知りたいと思うのは自然であると思うのです。

ただ、男女問わず、どうしても家庭の期待がエリートになることであると、家庭の考えるエリートになるために必要な修行をさせようとします。

冒頭の方で少し言及した中学受験のアドバイザーをして御三家に入れる話でも、はじめに手を入れるのは親子関係です。まずは、親を制圧します。親が抑えきれなければ、子供を精神的に切り離して影響を受けないようにします。
だいたいの場合は、親が不安を子供にぶつけているのが悪いのでそこを止めるために、どうしても親子関係に手を入れるのが必要になります。なおさら悪いのが、親が学問をしたことがない場合で子供が苦痛を感じていないと安心しない場合です。親が高学歴のエリートでも教育を受けていない場合は多く、そうなっていることがあります。
そして、わるくて無意味、よくてもレベル5のための訓練を延々と強制されるおぞましい環境が現れるのです。

このように、家庭内の人間関係と大学内の人間関係、そして教育が問題です。常識が何かを教えてくれる人がいるだけでいいのに、家庭内どころか大学内でさえもそれが見つけられないのです。

それから、私はね、教育というのは、いつか、この人は自分を踏み越えていくと思って教えなくてはいけないと思っています。同僚たちでもそうではない教え方をする人いますが、私はこんなしょうもない内容で下々の者を調教するという態度が取れるのはちょっと理解し難いですね。

いや、正直、Google はそういうのを排除しようとしていますが、それでも儒教的な価値観が言動の端々に見られることがありますからね。実感として、北米の人々も人種差別から抜けられない人がそこそこいますね。としても、少なくとも排除しようという努力をしているだけましでしょうかね。少し前に、Google で James Damore というエンジニアが、"Google's Ideological Echo Chamber" という文章を書いて首になってましたね。当時一緒に仕事をしていました。こういう内容について話すことはなかったのですが、きっとしていたら、私は教育がどれほど後天的に人を変えられるかについて話したでしょう。私の父母世代とそれから下の世代の親戚の女性は大半が理系です。そこまでは普通にそうなるものです。(参考までに Google 元幹部の応答を私が訳したものもつけておきます。: さて、グーグル社員の書いた例の文章(声明)についてだ。 - 白のカピバラの逆極限 S.144-3)

最後に、京都帝国大学の学生たちが南方で血を流したからですが、その話はまたいつか。いや、周辺のエピソードの部分だけしてしまいましょう。

昔、神学博士に会ったことがあります。数学から経済学まで話題も広く、圧倒的な視野だなと思っているとあとで祖父がこう説明をしてくれました。あの人は京都帝国大学の経済学部で学んでいて学徒動員に取られ、南方で多くの級友たちを失ったと。それで帰ってきてから、なぜ自らが生き残ったかに悩み、卒業後に神学の道を選んで、イェールで博士を取ったと。祖父は最後に余計なことを言いました。残念なことに神学も(leider auch Theologie)博士の疑問に答えたかは分からないと。

これもまた、第二次世界大戦の末期の話です。法学部の助教授が徴兵されて広島で被爆し、数日後に京都の私の祖母宅までたどり着きました。そして、そこで、歴史上類を見ないことが起きた、近代国家が近代国家の市民を明白に標的にしたと述べたというのです。私はそこに救いを見出していて、どれほど取り返しのつかない惨めな目に(im unwiederbringlichen Elend)遭おうとも、それを理解できるならば、そこに救済があると思うのです。

そして最後に。高校時代から語学に堪能な人がいました。8カ国語を操り、在学中に旧司法試験に合格し、大学教員をしていました。私はその人の授業を受けていたのですが、他大学の教員にその話をすると、あの人が本当に知的だったときのことを君は知らないだろうといわれました。ある日、ちょっとした事件があってそれ以来キレを一切失ったのだと。
ときどき、授業中にまったく関係のない話を突然する人で、ある時、授業を受けていると、とある経済史の論文を読んだ者がいるか尋ねました。たしか、明治時代の製糸業の M&Aミクロ経済学的に扱ったものでなかなか面白かったと答えると、どこで読んだのか、と聞くのです。ああ、先学期にその先生による学生二人だけの授業を受けていて、そこで取り上げられたので読みました、というと、君は本当に幸せだな、君は本当に幸せだな、といわれました。
また、ある時、先生は「ところで君は司法試験を受けるのかね。」と聞きました。いや、受ける気はないというと、「受けてみなさい。受かるから。」と言いました。その時の表情。ええ。そう言いたくなった気持ちを私は分かるように思います。
この話を法学者の友人にして、救われている(ist gerettet)のだと、私が主張すると、その学者は私をたしなめました。

最後に

この面接が、最も胃が痛かったですね。模擬面接が終わった後のフォローアップを最もしたのもこのときでした。

今回間に合ったのは、競技プログラミングをやり込んでいたのを止めたからです。本人の努力と真摯さはもちろんですが、見ず知らずの人に常識を叩きこもうとする私の狂気も貢献していました。そして、そもそも別分野で一度教育を受けたことがあったということも大きな要素です。あれは友達とお茶をする程度のものだからです。ただ、その友達は常識人でないといけないのですが。

たしかに、Google の面接も、情報技術全体からしたら一部しか切り取っていないものです。そうであるからこそ、容易に対策することができるのです。
とはいえ、技術的に最低限のことが分かっていることになるので、社内で明らかな間違いに基づく決定がほとんどないです。私が経験した明らかに不可解な結論が出た議論は、セキュリティに関すること、統計に関すること、法律に関すること、くらいで、そのときは説明しても理解してもらえずおかしな結論になったのですが、結局すべて1週間程度で修正されていました。
つまり、基礎的な土台としては十分であり、そこから社内の大量の独自フレームワークを見て、エンジニアリングとは事物や環境の構築を通じて価値を届けることだということを習い、同僚たちと雑談をし、すぐに大きなインパクトを社会に与えるのでしょう。

せっかくなので、本を紹介したときに何を話したかと、もう少し時間があったら紹介していたであろう本を追加しておきます。

どの分野であれ、ここからここまでは常識という範囲があり、特にある程度体系化された学問はそれがはっきりしています。たとえば、ACMIEEE-CS は Computing Curricula を出しているので、それを参考にするのでもいいですし、関係する学科のカリキュラムを参考にして、その授業でどのような書籍が参考に挙げられているかを見るのもいいでしょう。

情報科学は、「作ってみた」「現実はこう」「理論的制限」の本を読むとよいと思います。たとえば、交通ルールを考えてみましょう。標識の形が各国違うように、その標識の形自体はただの約束として作られたもので、さまざまな歴史的な経緯の集積の末にできあがったものです。ただ、まったく無作為に作られるものではなく、たとえば、左側通行と右側通行が同じ道で混在すると問題を起こすことであったり、見通しが悪ければ一旦停止が必要であることであったり、速すぎる速度でカーブに突入すれば曲がりきれないから速度制限がいることであったり、さまざまな数学的物理的技術的制限がかかってきて、それ自体も知る価値があります。そして、それらを分かっている人が無人島を借り切って箱庭で交通システムを作ってみることがあり、その記録を読むと、何が起きているかとてもよく分かります。作ってみた系は意外と現実についても最低限の言及がありますね。

CPUの創りかた
「作ってみた」系の本として、CPU やメモリーの構造が分かりますので、このレイヤーを俯瞰するのによいでしょう。

・32ビットコンピュータをやさしく語る はじめて読む486
古い本ですが、このあたりで現在のマルチタスク OS をサポートする CPU が完成しますので、アーキテクチャについて、知っているべきことについてだいたいカバーしていると思います。欠けているものがあるとすれば、高速化や仮想化のための技法くらいでしょうか。興味があれば「プロセッサを支える技術」あたりがそれを埋めるでしょう。

・マスタリング TCP/IP 入門編
3ウェイハンドシェイクと輻輳制御が書かれているとなると、ほとんど選択肢がありませんでした。逆に、Tier 1 network とかは知らなくていいんじゃないでしょうか。

・岩波講座 ソフトウェア科学 オペレーティングシステム
オペレーティングシステムについての本はこれでよかったかはまだ迷いがあります。

オペレーティングシステム―設計と理論およびMINIXによる実装
一緒にタネンバウムも紹介していました。

・Webを支える技術
REST にこだわりが強い本ですが、そこは軽く流すようにと伝えました。

・ふつうのコンパイラをつくろう
コンパイラの大まかな原理は聞かれることがあるかと思います。言語に特有のことは出てこないので、そこは別で補ってください。

・Modern Compiler Implementation in ML
高速化の技法の部分は過剰かもしれません。

・30日でできる! OS自作入門
この本はたしか本屋では名前が挙がっていました。OS を作ってみようという本なのですが、周辺の技術、たとえば、ハードディスクのフォーマットである FAT16 の仕様が載っているのがいいですね。

<変更: 2025年3月14日>
プログラミングコンテストチャレンジブック
アルゴリズムが苦手だったら入れていたでしょう。最近の模擬面接ではコードがおぼつかない感じだと思うと、なんでもいいんですが、AtCoder の ABC 4問時代の C 問題くらいを埋めることをおすすめしています。あと、コードは書けたら終わりではなくて、どの行をどう変えたらどうなるのか、どういう場合に動かなくなるのか、どう書いたらより洗練されるのか、を考えるといいと思います。

プログラミングチャレンジブックを勧めたことは完全に私の間違いでした。

先日、ある文系の学部生におかしいという指摘をもらいました。
要約すると、この記事(簡単なお仕事)は、クイックソート再帰の仕方が常識の範囲内であると述べているにも関わらず、この記事(簡単なお仕事)の勧める本をすべて読んでも『入門コンピュータ科学』にクイックソートについて1行書いてあるだけだったというのです。
この指摘はあまりにも真っ当であったので、改めて本屋に行って、アルゴリズムの本を漁ったところ、短い方から再帰するなどクイックソートについて十分に言及があったのは次の二つだけでした。

・世界標準MIT教科書 アルゴリズムイントロダクション 第3版 総合版
セジウィック: アルゴリズムC 第1~4部、第5部

このため、アルゴリズムイントロダクションセジウィックに推薦を変えます。もっともこれらの本は大部で常識に対して過剰な面もありますので、ソフトウェアエンジニアリング協会のコーディングの練習会も参考になるでしょう。

このような間違いをした背景を申し上げますと、プログラミングチャレンジブック、通称蟻本は、我々の世代からは実家のような安心感のある本だからです。
上述のように、競技プログラミングは、本来「競技プログラミング同好会」を指す言葉でした。ところが、現在では Competitive Programming の訳語であるかのように使う人もいます。通常、Competitive は「競争的」と訳すのに対して、「競技」は Competition (cf. 競技ダンス) と訳しますからなにか変なのです。では、なぜこうなったのでしょうか。
一般に、固有名詞が種目名になることはそう多くありません。英国ラグビー町にあるラグビー校でルールが決まったのでラグビーと呼ぶようになったくらいでしょうか。つまり、それくらいのことが起きたはずです。
結論から言えば、この同好会が特徴的であったのは、「自分たちで問題を作りコンテストを開いたこと」と「後輩を育てた」ことです。
この同好会のメンバーは ACM ICPC (International Collegiate Programming Contest) や Topcoder の参加者でしたが、お互いに問題を出し合うようになり、自分たちでも UTPC (東京大学プログラミングコンテスト2008) という名前のコンテストを開きます。(東京大学競技プログラミング同好会東京大学プログラミングコンテスト2008実行委員会による開催です。)このとき、一歩ひねった問題を作らないと面白くないわけです。こうして、ソフトウェアエンジニアの常識と少し乖離した問題が作られていきました。また、競技プログラミング同好会は、練習会を開き、大学や高校を超えて学生を教えました。そして、こういった活動に参加した人たちが他大学などでコンテストを開くようになります。それから、蟻本は競技プログラミング同好会で練習をしていた人たちの書いた本です。このようなわけで、我々の世代は蟻本を読むと、学生時代のサークルで飛び交っていた会話を思い出し安心感を感じるのです。しかしながら、当時の会話はコンテストの問題の出題や解答に必要な内容以上に広いもので、ソフトウェアエンジニアの常識も包含するような内容でした。このために、この本にアルゴリズムについて知るべきことが一通り載っているかのような混同が生じました。
この同好会の初期メンバーの多くが Google に入社し Google Code Jam Japan というプログラミングコンテストに繋がる(Google Developers Japan: Google Code Jam Japan ができるまで)こともしたためておきましょう。(GCJ Japan が一回で終了したのは期待していたような参加者があまりいなかったからであると聞いています。)
さて、同好会が開いたプログラミングコンテスト UTPC は、練習会の参加者に引き継がれ、2008年以降も続きます。
UTPC 2011 は、当時の様子を把握するのによいでしょう。このコンテストは「Google の支配するディストピアで記憶喪失の人物が目覚める」ところから始まります。この頃、問題文に自分や仲間を登場させる文化が始まっており、練習会に参加していた人たちの名前が問題文に埋め込まれています。そして、最後の問題を見ると、「反乱を嗅ぎつけた多くの G○○gle のコーダーが我々を取り押さえにやってきた. かなりの数だ. その中には,東京大学時代に僕らを優しく指導してくれた先輩たちも多く見受けられる. 残念ながら,今では敵同士だ.」と上の世代への言及があります。この UTPC 2011 が AtCoder ではじめて開かれたコンテストです。
このようにして、競技プログラミング同好会の開催する勉強会やコンテストに参加した人たちが、「競技プログラミング」という名前を受け継いでいきました。いまでは、もともとの同好会との関係を知らない方もいるかもしれません。しかし、UTPC の順位表を見れば、有名な競技プログラマーのほとんどがそこにいることが分かるでしょう。
このように、競技プログラミング・競技プログラマーは、競技プログラミング同好会という固有名詞に由来し、直接間接を問わずその影響を受けた人が使う言葉ですから、プログラミングコンテストにおいて世界的に活躍していても、同好会の影響下にない人物は使いません。また、影響を受けたと自認していない人は他人のサークルの名前を勝手に詐称しないというのは、至極一般的な倫理の話です。

なお、この指摘をした文系の学部生も、無事に Google でソフトウェアエンジニアになりました。
</変更>

・Introduction To Functional Programming
C++ Templates: The Complete Guide
・Purely Functional Data Structures
この辺は私の趣味ですが、関数型言語はなにか触っておいたほうがいいと思いますし、C++ テンプレートはやらかしでチューリング完全なので一回目を合わせておくべきですし、純粋関数型データ構造は見ておいて、いいんじゃないでしょうか。

・エキスパートCプログラミング―知られざるCの深層
・Modern C++ Design
・Effective C++
・Exceptional C++
競技プログラミングの始祖のあたりの人たちは、C++ 使うならばこのあたり読んでいた気がします。最近の C++ はちょっと違うものですが、大切なのは、見慣れていて使役しているものが本性はおぞましいという感覚じゃないでしょうか。

言語は何でもいいと思うのです。たとえば、従妹にはじめてプログラミングを教えたときは C++ でしたが、妹には Perl + SQLite という構成で教えました。Perl は、たとえばレキシカルスコープとダイナミックスコープが両方あるなど、とても教育的にいい言語です。ただ、とにかく表層的にしか理解していない人や本であふれていて、社会的なノイズのせいできちんと理解するのが大変です。私は、大学の同期を問い詰めるまで、振る舞いが分かりませんでした。なお、その人も合宿のメンバーで Google の同僚になりました。

・入門 コンピュータ科学 ITを支える技術と理論の基礎知識
これは、最近見つけたんですが、広く書かれていて、とりあえず、これもいいんじゃないでしょうか。


必要な能力は「椅子に座れること」「四則演算ができること」「本が読めること」だと思います。

そしてできるだけ多くの人と話をしてください。


なにかあれば、Twitter の DM 開放してますのでどうぞ。

twitter.com

 

エリート二世

桜蔭、東大から弁護士資格を取って中央官庁で働いている友人がインタビューを受けていました。

そして、SNS にインタビューを受けた旨を書いて、記事へのリンク(https://blogos.com/article/164974/)を貼っておりました。以下の文章は、その SNS のコメント欄に投げ込まれたコメントです。

 

-----

 

これ、すごい「エリート二世」らしい文章だと思うのよね。

 

田中裕子さんは、日本のエリートと呼ばれるような人たちと同質のつもりだったようだが、もともと同質でなかった、というのが僕の読んだ感想。

 

沖縄で1年過ごして世界観が変わる話は、要するに、それまで田舎に行ったことがなかったってことだよね。観光で上っ面を舐める以外。

普通は家族や親戚がいて、それなりに田舎の生活というのを知っているんだ。

東大でも、半分は地方出身。東京出身でも、その親はおそらく高度経済成長期における集団就職などで出てきていて、当時、大学進学率は2割程度。都会に出てきていても多くは別にエリートではない。

 

なんで、日本のエリートと呼ばれるような人たちが経歴の自慢をするかといえば、それが本人の周囲から突出していると自分で思っているからだよ。例えば家族とかから。裕子さんは、これが分からないからそれが鼻につく。「なに東大入った程度で、エリート気取りなの?」「なぜ大学院行った程度で、エリート気取りなの?」「どうして弁護士になった程度で、エリート気取りなの?」

それが期待なのは仕方ないじゃないか。彼らには、子孫のための足場を中央に作るという人生をかけた大きな仕事があって、それが無事にできそうなのだから、それ以上余計なことをしてはいけない。

 

その上、親の世代は、多くが教育の仕方が分からなくて、多くは苦痛を与えることが教育だと思っているときている。

さらに、職業選択もかたよる。資格業を好むよね。中国の田舎の子供たちが小学校教師と郵便局員になりたがると聞いたことはないか。それくらいしか知っている職業がないんだ。

こうやって、大学をでてもまだ優等生でいらっしゃる方ができあがる。

 

でも、裕子さんにはその水準がしょうもないものに見える。

 

なんで、この水準が当然になる路線が既定路線だったのか。親でしょう。

もちろん、この路線は自分で選んだと思っているかもしれないけれども、反対を受けないという時点で刷り込まれてたのさ。

なぜ二世が親世代から「既定路線の刷り込み」がくるかといえば、そりゃもちろん、親世代は田舎の生活を知っているからで、親世代が比較して判断する能力があるからだね。親がエリート一世だから。

 

で、沖縄に行って、漁業をしてもいいと理解した割には漁業をしてなくて、中央省庁で官僚をしている。ようするに、沖縄の経験によって、下々の者の暮らしが、思い込んでいたようなひどいものではないと分かり、そして、その上で、成り上りの「日本のエリートと呼ばれるような人」と共にいることを耐えてでも、エリートとして生きることを選んだ、という話だね。

 

全体像までもう少しだ。成り上がりは、もともと下々の者から這い上がってきたという自負があるのだ。それが、「エリートと呼ばれるような人々」がどうして鼻につく連中かの理由だろう?

 

だから、これは半歩先んじた話じゃないんだ。一周先んじていた人が、ようやく相対的な半周遅れを理解した話なんだ。もう少しで一周遅れの「エリートと呼ばれる人々」も理解できるようになるよ。

困難を乗り越えて、中央の足場として死のうとしている。本当に立派じゃないか。

たまには、両足で踏んでいるものをみてよ。