中年エンジニアによる、私の将来の夢

私は40歳目前の中年エンジニアである。
もう人生も折り返し地点を過ぎ、能力は下り坂。技術者としても踊り場を迎えており、今後劇的に技術スキルが身につくことも期待できない。お腹の脂肪は簡単に身につくのに、身につけたいものは簡単に身につかないのである。

そんな中年が夢を語るのは少々照れ臭いことであるが、勢いにまかせて書いてみる。
中年だって夢を見てもいいはずである。心はいつだって20代。石は投げないでください。

# 子供向けのプログラミング教室をやりたい
そんなことを思い始めたのはここ2～3年ぐらいのことである。
きっかけははっきり自覚はしていなかったが、なんでだろうって考えたら最近の小学校におけるプログラミング教育の必須化の流れのなかで、色々な意見を見聞きしたからじゃないかと思う。

儲かる儲からないは気にしていない。むしろ私に十分な蓄えがあったとするならば無償でやりたいとさえ思う。
激怒する家族の顔が頭をかすめるが、今はまだ妄想の中なので決して誰にも迷惑をかけていない。娘よ、こんな父を許してほしい。

# なぜやりたいか？
最終的には国が目指す方向と同じで高度IT人材育成が目的である。
プログラミング教育を通して高度IT人材を育成し、国際競争力に繋げるとする国の方針には完全に同意できる。
日本は、2000年には一人当たりのGDPが世界3位だったが2014年には26位へ、国際競争力も1990年には1位だったが2016年には26位へと転落したらしい。今後も世界で例をみない少子高齢化社会に突入する。資源もなく労働力もない。うん。辛い。
もしかしたらグローバル化の流れの中で国家の枠で考えるのは古くさいのかもしれないが、私は日本や日本の文化が大好きであり日本人であることに誇りを持っている。
ITが今後も国際競争力や企業競争力の中心であることは確実で、そこで勝負しない限りは日本には未来がないのではと私ごとき小物でも心配になってくる。
で、心配しているだけじゃなくって私も日本の未来に貢献したいと思うようになった。

# 今の子供プログラミング教育ってどうなの？
そんなことを思いながら、いくつか子供向けのプログラミング教室のカリキュラムを調べていた。
入門コースとしてはブロックを積み上げるような感覚でプログラミングができる[scratch](https://scratch.mit.edu/)（ビジュアルプログラミング言語というらしい）というものが流行っているらしい。なるほど子供にはとっつきやすいかも。
そのあとは急に本格的になってiOSアプリ開発やAndroidアプリ開発、Webアプリ開発が定番らしい。
で、それに少しだけ違和感を感じた。
それらの技術は現代の大人が盛んに使っている技術で子供たちの時代にはどうなっているかさえ分からない。今の時代の高度にフレームワーク化された技術の上に成り立つ旬な技術を覚えても、子供の時代には変わっているんだろうなと思う。（いや、やらないよりも全然やったほうがいいのは間違いないし、きっと役に立つ。裾野を広げることにも繋がるし、関係者たちの情熱には敬意を覚えます。生意気言ってすいません）
もっと普遍的でコンピューターがなぜ動くかという根源的なことを小さなうちに学んでほしい。
私は力強く言いたい。子供にはもっと低レベルな技術を教えるべきだ。と。
教える人の確保とかもあるのかも知れません。なので本当に勝手なこと言ってすいません。

# なぜ低レベルな技術を子供のうちになのか？
理由はいくつかある。ありすぎて書くのが面倒になってくるが歯を食いしばって書くことにする。長文になってくる予感がしてくるが決してくじけない。団塊ジュニアの底力を見せてやる。

1. プログラミング技術の進化の通りに教えることが理に適っていると思うから
プログラミング技術はもともとコンピュータが理解できる低レベルなものから始まり、より人間が理解しやすい高レベルなものへと進化している。
歴史は古いものから順に教える。新しい時代から教えるべきという意見があることも知っている。私も過去にそう思っていたし、より新しい知識が今の時代にはより役に立つからというのがその時の持論であった。
歴史の勉強が嫌いな私は歴史を勉強していると鎌倉時代とかそのあたりまでで力尽きて本当に学びたい近代史までたどり着かなかったのである。
しかし物事は必ず原因があって結果がある。因果関係を理解して歴史を流れで理解することは意味があると思う。ある原因から結果が生まれて、またそこで新たにうまれた歪が原因となって...というような先人たちが作った歴史の過程を学ぶことが新しい時代作るうえでの教科書になるはずだと信じるからである。（でも、歴史の勉強は好きではなかった。すまん。）

2. 低レベルな技術を学べる機会はすごく限られているから
技術は日々進化するし、通常新たに作るシステムは新しい技術が採用される。なのでエンジニアが普段扱う技術も必然的に新しいものになっていくのである。また最新の技術はどんどん沸いて生まれるので、それをキャッチアップすることに時間が使われることになる。よって低レベルな技術を学ぶ時間を確保することが困難なのである。
現代のエンジニアは本当に忙しく時間なんていくらあっても足りない。新しい技術を学びキャッチアップしなければ、エンジニアとして競争に生き残れないというプレッシャーも相当にある。そんな中で低レベルな技術は利用頻度の観点からもそこに時間を投資することは余程の強い気持ちや思い切りがないと出来ないのである。
最新の技術をキャッチアップする必要のない年代にこそしっかりと根源の技術を学ばせたいのである。

3. 低レベルな技術は未来にも必ず残り続けるから
先ほど歴史の話を例にしたが、歴史とは異なりプログラミング技術は常に新しい技術が古い技術を塗り替えるとは限らない。
古いか新しいかと、低レベルか高レベルかは違う概念なのである。
低レベルとはコンピュータの世界により近い技術で高レベルとは人間の世界に近い技術。
通常はプログラマの生産性が高いのは高レベルな技術で、コンピュータをより高速に動作させられるのは低レベルな技術である。要はどちらに生産性の軸足を置いてるか。
一方、プログラムは一度実装されるとたくさんの人によってたくさんの回数利用される可能性がある。
これが非常に重要であり作る側と使う側のバランスで、たくさんの人に高頻度で利用されるプログラムを低レベルな技術を使って高速に動作させるように作ることは、作る人と使う人全体の効率を考えたときにすごく合理的であるといえる。
なのでOSやデータベースなどの基盤となるソフトウェアはほぼ例外なく低レベルな技術で作られている。逆にたくさんの人に高頻度で利用されるソフトウェアを開発するには低レベルな技術の習得は避けられない。
人類の基盤となるような技術を日本から発信するためには低レベルな技術の習得を目的とした教育は欠かせないのである。

4. 低レベルな技術を知っておくと高レベルな技術の習得にも役立つから
高レベルな技術はより人間に分かりやすいように使いやすいようにするために低レベルな技術を覆い隠すように実現されている。利用者には意識させないが内部では低レベルな技術を使って実現されているのである。
全てを覆い隠してまったく見えなくして（見る必要をなくして）くれれば問題ないのだが、高レベルな技術を追求しようとすると突如低レベルな技術との境目を垣間見ることがある。例えば高レベルな技術を使いながらもどうしてもこの処理だけは高速に動作されたいと思った場合や原因不明なトラブルにはまってしまった場合などである。
また高レベルな技術であったとして最終的にはコンピューターを動作させることが目的である。
その時にコンピューターに分かりやすい低レベルな技術を知っておくことで役に立つことは沢山あるのである。

5. 生産性よりも本質的なコンピュータの理解を
もちろん子供に生産性を求める必要はない。私は若いエンジニアには生産的に仕事するよりも時間をかけてでもわからないことやブラックボックスの中を開けてみるようなことをあえて勧めることがある。
公式を理解して早く問題を解くような学習には意味がなく短期的な生産性はあがっても長いエンジニア人生の中の長期的な生産性では必ず逆転できる。同じ事が子供のプログラミング教育にも当てはまるはずである。

まだまだありそうな気もするが、息が切れてきたのでこの辺にする。
瞬発力も持久力も衰えているのである。

# どうしたいか?
私は広くプログラミング教育の裾野を広げるようなプログラミング教育ではなく、その中でセンスのある子供たちがさらに高みを極めるために一時的に低レベルな技術にどっぷり漬けるようなことがやりたい。
その中で日本の競争力の源となってくれるような人材が輩出されたらと考えると非常にワクワクするし社会に貢献できたと思えると思う。
カリキュラムのゴールをOSカーネルの開発やデータベースソフトなどの基盤ミドルウェアの開発に置くようなイメージである。私自身ももっと勉強しないといけないし、私にはもうたどり着けないかもしれない。
でもそういう可能性のある子供たちにそういった世界に一日も早く触れられるような機会を提供できるようになりたい。

# いつ頃？
未定。
今はマネーフォワードが変えようとする日本の未来に貢献したいという強い思いもある。
いつか老害であるとヒソヒソ噂されているのを耳にした時には、そっと立ち去るかもしれない。（すでに？）

# 最後に
この私の夢に共感できる危篤なエンジニアな人。あなたには適性があります。（なんの）
いつかどこかで会いましょう。マネーフォワードで出会うのもいいかもしれません。