karashi39とはいったい

夢と希望と明日と正義を讃える

新人研修でプログラミングを教えたときの学び

プログラマーになって1年も経たないうちに、入社1ヶ月が経過した会社で1ヶ月だけ後輩の新入社員3人のプログラミングをメインとした研修を行うという、なんとも色んな人達が無茶なことを考えているという感想しかない事をやってきたので、その時の学びです。 とはいえプログラミング教育論みたいなのは諸先輩方が素晴らしい知見をいっぱい残してくださっているので、そういうことは書かないつもりです。

結論的なこと

  • とにかく厳しくして教える側のコストを下げるのはNG
  • プログラミングのテストは便利な測定ツール
  • 勝手に学んでいく人に育てるために役立つツールから教える
  • 手っ取り早いプレOJT、それはハッカソン
  • 失敗は宝だけど失敗を用意するのは無駄
  • 教育的な目的において、勝手に何かを無駄だと判断しない方が良い

とにかく厳しくして教える側のコストを下げるのはNG

いきなり精神論なんですけど、前職の先輩が新人に対して通常のエンジニアとして接してついてくるやつはその後も育つし、ダメな奴は辞めていく。だから厳しくするべきだし、その方が楽だよね。という話をしていたんですけど、それってただの生存バイアスですよね… 厳しくしても甘くしても育つやつは育つし、育たない人に対しても育てることができないと仕事での教育は成り立たないので、新人を殺しにかかるようなことはできません。もちろん程度によりますが、程度をどうやって決めるかって話になると、新人の事を注意深く観察して課題を設定していかないといけなくて、楽をするのは不可能だし、プロジェクトと並行して何人ものずぶの素人の教育をしようなんて無理があるということを知らなければいけません。

でもまあ、じゃあいったいどうやるのという感じになるので、以降にやってみて良かった具体的な方法を書いていきます。

プログラミングのテストは便利な測定ツール

プログラミング能力を定義するのってかなり難しいので、外部のリソースを使用しました。当時怪しげなゲームで評判を落としていたあのサイトを使ったんですが、プログラミングスキルチェックはかなり便利です。*1

  • 仕様がはっきりした出題
  • 答えをググっても簡単には見つからない*2
  • ユニットテストの通過率でスコアが決まる
  • 問題のランクも分かれていて、新人の今いるステージがわかる
  • 同じランクの問題が複数あるので、放置で予復習をやってもらえる

上の方はまあわかると思うんですが、後半2つくらいが特に良くて、大事なのは、これで教える側が楽になる、特に新人の状況を把握するのに役立つといいう部分です。技術者という人種は、偏見かもしれませんが、自分が1人で学べるのでそれを若手にも押し付けがちであり、当然のように「自習に役立つ方法」を教えがち、こういうサイトを選定するときも自習に役立った経験を活かしがちですが、こっちは仕事で教えるということをやってるのでそういう発想ではダメだと思いました。独習用のWEBサービスはいくらでもあり、それはまあ役に立つとは思うんですが、教える側になったら「新人の状態を把握するのにどれだけ便利か?」という視点を忘れてはいけない。新人に楽をさせるんじゃなくて、私が全力を尽くす上で楽な方法というのが大事なんです。

しかし、最初からそんな考えを持っていたわけではなく、なんとなく実力を定期測定しようと導入したのだった。そんな中しばらく最低ランクの問題でずっと0点という子がいて、それも学びだと思って研修チームが放置してしまっていたんですが、3週目に突入して流石にまずいとなって個別指導に力を入れたらススッと1人で学べるようになったので、こういう気持ちになったんですね。新人は1人では学べないこともあり、ただ、それがどこか教える側には見えにくいので、こういうツールが便利だと思った次第です。感覚では、1週間たってもスコアが伸びないなら、重点的に教育したほうが良いという判断に使える気がします。

あまり探せていなくて、こういう新人研修に便利なサイトは他にもありそうです。ただこう、あのサイト、名前がいいよね。おっPythonみたいな感じで。

勝手に学んでいく人に育てるために役立つツールから教える

結論的には、

  • Lintを最初から使わせる
  • Git教育は自由に使えるリポジトリを用意して、Qiitaとかに書いてある実証をやらせる
  • 機械学習の理論的な部分はYouTube

です。この辺はもうわかりそうです。

特にヘーシャは機械学習の理論的な部分を大事にしているので、そういった教育が必要なのですが、経験者いわくYouTubeがおすすめとのこと。情報の質がまず良くて、あそこまで有名な動画サイトになると、適当な情報を流せばボコられることが目に見えているので、検索に引っかかるような動画はすべてちゃんとしたものしかないそうです。黄緑色のあのサイトなんかは、機械学習関係の人は本当に承認欲求がもうあれなのであれです。*3YouTubeで有名な学者さんの説明を聞きましょう。通勤中とかでもぼーっと聞けるし、自習にすごく役立ちます。

Lintは、Rubocopが良かったですね。なんというか初心者向けのメッセージが充実している印象でした。プロも使えるんでしょうが、いちいち教えるのが面倒くさい思想っぽい部分をツールが指摘してくれるので、ああいう作業はすべてツールに委託しましょう。Lintが充実しているという理由で最初に学ばせる言語を選んでもよいのではないかと思うくらいです。*4新人君が$ gem i robocopとしていたのがウケた。*5

手っ取り早いプレOJT、それはハッカソン

OJTにいつ持っていくかという悩みは、教えることを真剣に考えだすと結構悩むところだと思います。プロジェクトに新人をアサインしてもコストばかり増えてその結果教育も疎かになるので、最低限まで育ててからという気持ちになりますが、その最低限はどこかとか迷っている我々をプロジェクトは待ってくれない。

そこで、つきなみかもしれませんが、しれっとハッカソンに連れていきましょう。OJTから、お金の話が消えて教える側のプレッシャーが減るし、その期間も超短期で済むので、かなり気楽OJTできます。残念ながらそこで役に立てなかった新人は、もう少しOffJTが必要なんだなって判断もできるし、会社の計画に影響しない形でやれるので大変良いです。そういうイベントは、ものを作る楽しみを純粋に感じてもらうこともできるので、モチベーションを上げていくのにも役立ちますし、広範な知識が必要になるので、視野を広げるのにも役立ちます。

われわれは会社の若手5人組で2日間開催のハッカソンに行ってきたんですが、上記のような効果が如実に現れ、正直私の研修とかいらないんじゃないかと思ったくらいです。

失敗は宝だけど失敗を用意するのは無駄

また精神論に戻ってきたんですけど、学びになるからと言って失敗を用意するのはとても無駄です。経験者は知っていると思いますが、どんなに準備万端の教育を行っても新人はどんどん失敗してくれます。新人が勝手に躓いた部分とこちらが用意した失敗の両方に対応するのはかなり大変です。むしろ超基本的なつまづきはこっちで潰して、もうちょっとだけ進んだ失敗を勝手にしてもらうのが、のばすコツかなと思っています。

教育的な目的において、勝手に何かを無駄だと判断しない方が良い

エンジニアなので無駄はどんどん排除していくべきですが、何かを習得する上で無駄なことって簡単に判断できないと思うんですね。正直酒を飲みに行くのだって勉強になるわけで、それは、会社でプログラマーをするということは、1人で家にこもってものを作るわけではないということです。何を言いたいかというと、効率が良いとか無駄だとかって判断はスコープを決めてその中でしか考えられないことであり、会社の新人教育はスコープが決められないというのが大きい。せっかくC言語の研修にしたんだからポインタを習得してもらうのが最低限でしょとか言ってそこに集中するのはそれも分かる話なんですけど、別にポインタのプロフェッショナルを新人に期待しているわけでもないということは忘れてはいけない、というような話です。あと、飲みに行きたいです。ただ、お酒が苦手な新人に強要するのは本当に最悪なのでやめましょう。

おまけ

知り合いで社外の技術者が参加しているもくもく会的なところに行ってもらうのは、新人の様子を社外の人に評価してもらう良い機会だと思いました。社内の目だけだとどうしても視野が狭くなってしまうので… ただ、その節は大変ご迷惑をおかけしました。最初からそういう目的で行ってもらったわけではないのでご勘弁ください。その御方も面倒見が良い方なので、よくしてもらったようだし、楽しんでもらえていそうですが、しかし手間は取らせたので、今後新人を派遣するときはご迷惑にならないようにだけ指導をしておく必要がありそうです。

なんだかまとまりがないですけど、こういう学びがあったということで、ひとつよろしくおねがいします。


なんというか、私はもうエンジニアは辞めてしまうだろうなという方向まっしぐらな状況なので、最後にやった仕事でえたものは残しておこうと思いたちこの記事を書きました。

*1:是非、原点(?)回帰して、このスキルチェックのシステムを普及していく方向でやっていってほしいです。

*2:というか答えはどこにも上がっていないはずなのであり、指導する側も自力で正解がだせないといけないです。

*3:WEBの人なんかは、何を言っているかお分かりですね。

*4:そう言えば八王子方面で「面倒見てくれる人が得意な言語が、最初に学ぶべき言語」という話があり、禿同だった。

*5:コピペって大事だよね、って指導しました。