渡るネットは嘘ばかり

元文系、米国大学院CS修士号持ちITエンジニア。自称エンジニアが撒き散らすゴミを少しでもキレイにしたい

子供にプログラミング教室は必要か

お久しぶりです。転職活動がやっと終わって、久しぶりに正社員になります。
フリーランスはお金はいいのですが、やはり、所詮は傭兵です。表舞台で活躍するとなると、大企業にフリーランスで入って一人で大きなプロダクト作っちゃうくらいのレベルにならないと、というか、基本的にそこまで責任のある仕事はさせてもらえません。せめて大きめの追加機能を無茶振り気味に一人で担当するくらいです。会社を代表して登壇させるには企業にもリスクがありますし、フリーランスで表舞台で活躍するとしたら、逆に大きな仕事で業界に名前が轟く状態でフリーランスとして動くしかないでしょう。正社員のいいところは会社から色んな補助が出る。カンファレンスに参加したり、登壇したりするのも仕事の一環です。自分を磨く時間は会社に返ってくるので会社からサポートが出る。フリーランスの場合実費で、仕事休んだ分の稼働時間は給料から引かれます。なので、フリーランスをしながら成長するとなると、勉強会やコミュニティに参加する時間が取れない場合、技術書読んだり実装したり、で、これもまたプライベートを侵食したりします。

あと、正社員になったほうが、当事者意識が高まるので、よりユーザーのために社会のために何をできるか考えるのでビジネス的な目線とか違う能力も磨かれると思います。起業やCTOの選択肢も、会社のサポートの元、業界で名の知れた一廉の技術者になってからの方がいいです。でないと簡単にパクられたり、ビジネス的な視点が足りなかったり、というようなことが起きます。

最近すごく思うのはエンジニアになりたい人は「お金持ちになりたい」でなく、「開発を通じて多くの人のためになることをしたい」という気持ちを持ち続けて欲しいと思います。ここに来てくれる人は現役エンジニアだけでなく将来的にITの仕事に就きたい人も多いと思います。プログラミングできれば儲かる、仕事に困らない、という感覚だけだとおそらく将来的に行き詰まったり、精神がやられるかも知れません。苦しいことから目を背けて楽しいことができるということは殆どありません。スポーツもそうだけど、楽しいと思えるまでに何個もハードルがある。勉強の時間は退屈で眠かったり、理解できなくて苦悩したりするかも知れない。だいたい最高に楽しめる状態までは苦しい道を何度か通るものです。でも、理系の理論というのは理解できた瞬間に霧が晴れたように頭がスッキリする。何万里も先まで景色が見えるようになったような気がする。そんな世界です。学ぶこと、できることが増える感覚は楽しいですし、それを多く感じられる職種です。人のためになることができるように努力することは、実際のところ、自分のできることが増えることだったりしますが、結局、お金になることって人のためになることです。日々の生活を豊かにしたり、楽にしたり楽しくしたり。そういうことに人はお金を使います。こういうのがあったら便利だよな、みんなこれやりたいよな、と思うものを日々ワクワクしながら作ること、お金はその結果として、ユーザーの喜びが換金されて入って来るような感覚を持てるとこの仕事は最高に楽しいと思います。

真逆なのがネットビジネスですね…。Y氏とか、誰一人幸せにしてない気がします。直接的な意味で。グレーゾーン詐欺を教わって稼いで逃げ切れた弟子は感謝してるかも知れませんが、楽な、法の隙間の稼ぎ方をするとまともな、人のために働くことができなくなります。社会の歯車になるなんてかっこ悪い、とかそういう業界の人は言いがちですが、実際は歯車にすらなれてない。人の生きるサイクルに全く貢献していない。別に歯車でなくても潤滑油でもモーターでもなんでもいい。社会の一部として、人の暮らしに関わることはかっこ悪いことでも何でもなくて、そういう積み重ねが多くの人の幸せを作っているのが現実です。結果、Y君は今は投資で稼いでるっぽいけど、自分のために金のためだけです。金を目的に働くとどこまで行っても金しかないので満たされないと思います。彼は基本的にグレーな情報を売ることと、その金を還流させて膨らますことしかしていないので、彼のおかげで幸せになった人より不幸になった人(商材購入者の9割は不幸でしょう)の方が圧倒的に多いと思う。アフィリエイトとかネットビジネスのコンサルとかその辺も一緒です。情弱を鴨にプロから見たら100円にもならない技術や知識を高値でばらまいてるだけです。多くの人の喜びに貢献できない寂しい人生です。

前置き長くなりましたが、今回は子供向けの教室の話。

転職話は次回します。ものすごく人事と現場の意識のズレやエンジニアとして、技術側のキャリアパスが多くの会社でできてきてるのに10年後が想像できてない書類選考や面接であったり、それじゃない感じのエンジニア天国の主張など、違和感感じまくりでしたので次回まとめます。

親の教育への無責任

現在、麻布に住んでいますが、麻布はおそらく日本でも教育水準と言うか、親の教育への意識が日本でトップクラスに高いと思っています。にも関わらず、結構子供の素行が悪いです。夜中に叫んだり(そもそも子供の成長に睡眠は大事なので、22時とかに子供が叫んでる自体異常)傘をすれ違うときに傾ける子も殆どおらず、電車では空席に走ってゲームしたり居眠りしたり。実際のところ、速筋と遅筋が分かれてない子供は肉体的に疲れないので、疲れた、と座りたがるのは飽きてるだけで精神的に耐久性がないだけです。本来、教育は家庭からすべきで、由緒ある名家とかだと、親は厳しく当たり前のことは自分で当たり前にできるように育てられますが、なんとなく稼いじゃった家庭は子供を愛することと甘やかすことの区別がついていない気がします。先日4人組の母親の内一人が横断歩道を渡ってすぐのところに自転車を停め(渡って左に曲がる時に回り込まなきゃいけない位置)、他の3人がコンビニの入り口前に自転車を停めて(これも出て右に曲がると回り込まないと行けない位置)、だめだこりゃ、親から躾しないと駄目だなぁ、と思いました。我が家はなんだかんだ祖父が勲章をもらったりする家系で結構厳しかったので、当たり前のことができない人が多くて、街を歩くと目を覆いたくなることが多いです。
最近の親を見ていると、家庭での躾を全くせずに塾や習い事にとりあえず入れてみたりという勘違い教育が多いように思います。塾でマナーや日頃の振る舞いは身につきません。スポーツでは比較的礼儀が身につきはしますが、儀式的にルーチンになるだけの可能性は高いです。その結果東大に入ったとしても、勉強のできるバカになるだけです。育ちの良さは学力とは別です。麻布で育って育ちが悪いと思われるってどうなんでしょうね。昔は地域で教育をしたので、住んでる場所が育ちの良さにつながっていたかも知れませんが、今は地域の人が叱ると親がキレたりして、どこで育てても差は少ないのかも知れません。田舎は地域で育てる気はしますが、都会的なマナーは身につかない気がします。必要ないので。知らんけど。
また、問題が表面化しだしてるスマホ子守子供にスマホタブレットを渡しても、技術者としての素質は全く伸びません。中毒化して集中力がなくなるだけです。毎日テレビ見てる子供がテレビを作れるようになるわけじゃないし、サッカーを見てたりサッカーゲームが好きな子供が練習もせずにプロサッカー選手になれるわけでもない。おそらく、僕は子供にスマホタブレットも触らせないし、PCも高校くらいまで触らせないと思います。Jobsも自分の子供にはデバイスを渡さなかったり、コンピュータを触る時間に制限を与えたとか。まぁ、プログラミング教育始まって宿題で必要とかなら仕方ないですが。

子供向けプログラミング教室

それで、最近流行りだしてる子供向けのプログラミング教室やプログラミング教育に関してです。
子供向けだとスクラッチを使ったり、楽しく学ぶ、みたいな遊びの延長のものが多いと思いますが、正直、あまり良い技術者になるための教育としては価値がないと思います。子供向けのプログラミング教室は楽しくプログラミングに触れることを大事にしているところが多いので、興味を持ってもらう、という意味ではいいかも知れません。子供は我慢のできない性質があるので、プログラミングがある程度書けるようになってから理論、となると理論はつまらないから嫌だ、と苦手意識を持ったり、知識を軽視する可能性はあるので、この辺のバランスは気を付けないといけないと思います。基本的には動くだけのプログラムを書けるようになる教室と同じ状態なのが現状だと思います。例えば、電子機器の修理の仕事で、トラブルシューティングを見ながら、こういう時はこうする、というマニュアルだけ見て作業するのと、回路図を読み取って症状から原因に当たりを付けて確認しながら直すのでは全く技術の質が違います。よくあるプログラミング教室は前者で、「どうすればいい」だけを教えます。対処法だけ分かる感じです。この方法だと時には根本原因を直さない応急処置になる場合もあり、継ぎ接ぎで将来的に悪化する可能性もあります。「どうなってるか」(何が起きてるか)を教えるのが後者で教室では少なく、大学で教えているのはこちらです。どうなってるかがわかるというのは原理がわかるということで、通常の動作のフローからどこで外れたか原因が特定できる、もしくは大体の当たりが付くという状態なので、そこからテストをすれば特定できるでしょう。僕が教室でこだわっていたのは、どうすればいい、ではなくて、どうなってるかを理解してどうすればいいを考えられる力を付けることです。これがないと想定外の事態に対応できない。

では、子供にどうなってるか、を教えるべきか、というと、結論から言って無理でしょう。裏で起きていることの理解は数式であったり数学的な知識や感覚を要求することが多いです。また、子供に数学的な基礎を飛ばして応用を教えても意味不明で理解できないだけでつまらなくて辞めてしまうと思います。変数の概念も代数学だったりするので、中学位からならある程度理解が早くなる気はします。小学校時代にに5時間かけて理解できる概念が中学生なら30分で理解できるなら、どの段階で始めるべきか、という問題になるかと。計算量だと対数が必須なので高校まで理解が難しいかも知れません。個人的には対数位まで理解できてから一気にやって、それまでは2進数の概念だとか、紙で理解できるコンピュータの仕組みを後述の数学パズルを使ったりして楽しく学んで身につけ、理論的な部分を理解しやすい下地を作るといいのではないかと。

自分の経験上、プログラミングができる状態でコンピューターサイエンス(CS)の授業を受けたら理解は早くてプログラミング課題は簡単にできたので、理論の重要性をちゃんと教えながら基礎構文に慣れさせるのは悪くはないと思います。システム業界の自称凄腕プログラマにありがちな、ただ動くだけのプログラミングを早く書ける、ということに満足しないようにちゃんと導けるならいいと思います。

子供向けプログラミング教室の弊害

自分も独学である程度できたので、情報系の学科に行かず遠回りした経験がありますが、子供向けの簡単なプログラムやゲームをとりあえず動く形で書いて満足して、自分はプログラミングができる、と思ってしまうのは道を間違える原因になります。CSの全体図が見えていないので、プログラミングと言う領域で、理論や品質を考慮せずに書ける、という初心者向けの段階で満足してしまい、そこでプログラミングを繰り返す可能性があります。そんな低いところで足踏みして、数学という基礎を疎かにすると結局量産型の動くだけのプログラムを書くエンジニアになってしまいます。子供の頃から時間とお金をかけてそんなところに着地したらたまらないですね…。子供向けプログラミング教室の問題点としては年代別に段階的に学んでいくカリキュラムが整備されていないことでしょう。実装と理論は両天秤の関係にあって、バランスを取る必要がある。でも、子供は理論を理解する前提を持っていない。それは学年が上がるに連れて学んでいくところで、ただし、基礎構文は結構理論なしでも書けちゃう(たいていプロが見るとクソみたいなコードだけど)ので、バランスが崩れた状態になってしまうわけで。学問の体系として、CSの位置を文科省で明確にした方が良さそうな気がします。高校数学のどこかの先な気がします。高校の情報の授業とかは実は結構質が良くて、大学のCS概論より下手すると踏み込んだ内容かも知れません。時代ですね。ただ、どれくらいの割合の高校生に理解できるのかは疑問ではありますが。

どうなってるかを理解させるために

じゃあ、子供からプログラミングの素養を身に着けさせるにはどうしたらいいのさ、ということですが、数学です。まずは数学パズルから始めましょう。数学パズルは頭の回転も良くなるし、実際世の中は2進数的な事象も多くて、そういうクイズのようなところから遊ばせて、数学オリンピックを目指してみましょう。
ちなみに数学パズルとして有名なのだと、両方に火のつけられる1時間で消えるロウソクを使って15分を測る、というものとか2進数的な問題だと、1000個のまんじゅうの内1つに毒が入ってる、最少で何匹のモルモットを使えばどのまんじゅうに毒が入ってるかを特定できるか、とか。
こういうのはアルゴリズムであったり、数学的な考え方の練習になるし、親も楽しめて面白い。子供が乗ってきたら少しずつ難しく学問的な問題に移っていって数学オリンピックまで行ってしまうと最高です。数学オリンピックレベルの数学力があるとプログラミングコンテストでも世界レベルで戦えたりすることが多いですし、数学が土台になってるプログラミングも天才と呼ばれるレベルでできることが多いです。

結論

子供向けプログラミング教室はプログラミングができるようになるために通わせるのでなく、プログラミングに興味を持ってもらうため、エラーが出たりしても怖くない、と恐怖心を持たないようにするためにはいいですが、まずはしっかり土台となる算数・数学に興味を持たせて楽しく学ばせるのが優秀なエンジニアになるための種を撒くためには重要だと思います。日本人は目先のことに囚われがちな気がしますが、10年20年先のその子の未来を考えて、しっかり土台から、倒れない技術を持ったエンジニアになるような、しっかりとした根を張れるようプログラマの種を植えてあげましょう。
プログラマにならなくてもコンピュータを使えたほうがいい、と思っている親御さんは学校の授業をちゃんと受けさせれば十分です。もしくは、社会人経験あればそのレベルのスキルは自分で教えられると思うので、