結果を予測して試行錯誤する人はプログラミングの上達が速い

今日は妻が検査で通院する日なので、朝9時から母に来てもらって娘の世話を頼む。1ヶ月ぶりくらいでお願いするので、たぶん違いに驚いたのではないかと思うが……。まだ首はすわっていない(座る?据わる?)ので支えないとグラグラするけど、それでもだいぶ全身に筋肉がついてきた感じ。昨日、注文していたバウンサーが届いたので使い始めているが、割と便利。両手で抱っこしてなくてよいので、少なくとも片手が空くのが大きい。

あと、ずっと抱っこしたりゆらゆらしたりしていると腱鞘炎になるようだが(近所のママさん方5-6人と井戸端会議的に話したら、全員腱鞘炎になったそうだ!)、バウンサーとかバスチェアとか、適宜活用しないと自分も手首(商売道具)を痛めるかも。

また、いまも夜中の1時から6時台までは自分がミルク担当で、起きてあげている、という話をママさん方にしたら、本当にしているの?!と驚かれた。父親は起きないので業を煮やして別室で寝てもらっているとか、諦めて自分がやっているとか。自分は午後7時前後に帰って夕食を食べ、8時過ぎにお風呂に入らせてもらい、午後9時前後に寝かせてもらっていて、午後1時に起きても4時間寝られているので、対応できるのだと思う(2-4時にミルクで起きるので、起きたらそのまま仕事をしている)。会社での仕事が忙しくて帰る時間が遅い人は無理だろうな……。

自分も本当は17時きっかりに大学を出て、6時過ぎに家に到着していたいのだが、最近は学生も勉強会やら研究やらで聞きたいことが増えているようで、夕方は可能な限り研究室に行ってから帰ることにしているので、なかなか難しい。質問が多いのは嬉しい悲鳴で、どんどん相談してくれるのは大歓迎なので、家でできる仕事はできるだけ家に持ち帰って深夜にやることで、大学でしかできないことを集中的に大学でやる方針である。

午前中は、コース長と学内のお仕事の打ち合わせ、そして外せない学内の委員会の仕事。といっても30分とかからず終了。

お昼に一度研究室に行き、進捗報告を聞く。前回は研究の進捗がなかったので、今回どうなるかと思っていたが、ちゃんとプログラムを書いていたのでしっかり議論ができてよかった。未実装の部分も、抽象的なアルゴリズムや数式を具体的な(Python)プログラムに落とし込むところも一つ一つ確認。普通はやらないが、最近新入生もいるし、具体的にどう考えるか、を一緒に見てもらうのは意味があるかと思って(たぶんそんなことしなくても、みんなできると思うのだけど、念のため)。

アルゴリズムや数式をプログラムに変換するのは、できる人は(プログラミングの経験がほとんどなくとも)造作もなくできることなのだが、できない人は(何年もプログラミングに「入門」を繰り返しても)できないようで、この2種類の人たちは何が違うのか、ということを最近考える。

後者の人たちは、たとえばコマンドラインからコマンドを入力してもらうとき、スペース1つ省略して言うと全てつなげて入力してしまうとか、基本的に自分が何をしているのか理解していないのが特徴で、メモを取ったり熱心に見えても、それは理解するためではなくあとで全く同じに入力して「復習」するためだったりして、一問一答で丸覚えするためのようなのだ。

自分自身そもそも大学に入ってからしかプログラミングの勉強をしていないし、そもそも人文系出身なので色々なケースを見てきたが、どうやら、抽象的な概念を具体的に考えたり、またはその逆で、個々の事例から一般的な法則を導き出したりするのが苦手だと、何年やってもプログラミングが一向に上達しないらしい、ということが分かってきた。あるいは、背後にある法則を推測する能力が低いか、そもそもそういう法則があるということが分からないとか。推測方法を教えても習得が難しいようなので、たぶん前述のように帰納的な推論あるいは演繹的な推論が苦手なのだと思う(ちなみに人文系に多いが、理工系ならみんなできる、というわけではない)。

60%の人間はプログラミングの素質がないという記事を先日来久しぶりに再読して、あー、そういうことか、と思った。プログラミングも語学のように習熟度別のクラス編成をしたほうがいいのかもしれない。「難しすぎる」と言う人と「簡単」と言う人と、それぞれ全く思った通りのことを言ってくれているのだろうが、一緒に教えるのは無理がある。(同時に教えられるなら、相当技量があるのだろうが、ことプログラミングに関しては、恐らく不可能だと思う。)

しかし、もし仮に習熟度別にクラスを分けたとして、ここからどうやればプログラミング能力を身につけることができるのか、まだ分からない。単純な答えは「人生短いから諦めて他のことをやればよい」というものなのだが、それでも自分でできるようになりたいという人もいるので、悩ましい。これはプログラミング入門以前の問題で、インプットとアウトプットからいろいろ推測して試してどういう挙動をするのか把握する能力を鍛えるか、あるいは仕様書を隅から隅まで読んで、試行錯誤しなくても挙動を完全に理解する強靭な思考力がないといけない。(どうやら、「結果を予想して試す」ということができないようだ、と分かってきたのだが、なぜ予想できない、あるいはしないのだろうか?)

1年とは言わないでも半年も勉強したら、あとは自力でも勉強できるようになる、という状態に持っていける方法があるとよいのだけど……。

進捗報告のあと、ニューラルネットワークに関する質問を受ける。せっかくニューラルネットに興味を持つ人も多いから、ちょっと深層学習に手を出してみてもいいのかな?と思ったりする。基本的にはレッドオーシャンには手を出さない主義なのだが、卒論なら最新の手法を勉強するというのでも、十分大きな学びになるだろうし、何より自分より詳しくなってもらって毎回教えてくれるほうが楽しいし(笑)

午後は家に帰ってきて娘の世話。母といるときもおとなしかったようだ。外出中とか、知らない人がいるときとか、基本的に静かにしているが、我々両親しかいないときはけっこう「かまって!」オーラ出すのにな〜。