技術を教える技術
勉強会で登壇したり講師をやったり、という立場でなくとも、会社で働いていれば OJT などで新人エンジニアに何かを教える機会がある方も多いのではないでしょうか。
この記事では、自分が新入研修などで初学者に技術を教える時に、自分も相手も幸せになれるよう気をつけていることを箇条書きで書いてみたいと思います。
ゴールは「自ら学べる」ようになることだと意識する
「自分が教えて、相手は覚える」ではなく、相手が自ら学んで自ら成長してくれる状態をなにより目指すと良いでしょう。
先輩社員のみなさんならきっと実感している通り、ソフトウェア開発のための勉強に終わりはありません。つまり、たとえ自分が「教える」立場だからと言って、全てを理解した上でその全てを相手に教えることは不可能です。
しかし、いざ自分が OJT のトレーナーになって新入社員を教育するとなると、「自分の知識を少しでも多く伝えなきゃ」という意識で「教えて」しまい、教えるのも教わるのも大変になるパターンは少なくありません。
「あれも、これも、必要な知識だから伝えなきゃ」と、端から端まで詰め込み式で相手に知識を伝えてしまうと、相手はそれを「覚える」ことに精一杯になってしまい、場合によっては「勉強とは教えてもらうことだ」と相手が認識してしまい、結局トレーナーが教えなければ何も学べない、教わっていないことはできない、という人材に育ってしまうリスクが発生します。
そんな事態を回避するために、まずは「自分が教えるべきは『最初の一歩』と『学び方』である」ことを意識すると良いでしょう。
新人研修などで多くの初学者が陥る問題に、「どこから手を付ければ良いのか分からない」「何をすれば先輩社員みたいになれるのか想像もできない」という悩みがあります。初学者にとっては全てが初めて知る内容で、すでに仕事をしている先輩社員の知識や経験が自分とどのくらい離れているのか想像もできないことが理由で生まれる、ごく自然な悩みだと思います。
それを解決するために先輩社員ができるのは、上に書いた通り「最初の一歩」と「学び方」を教えることです。とっかかりを作り、先に進む道を示し、ただしそこを進むのは相手に任せてみましょう。その際、その先に待っている面白い世界もチラ見せすることで、相手の「自ら学ぼう」とする意欲を引き出すと良いでしょう。
「とっかかりを作って、先に進む道を示す」方法は次の項目で、「その先に待っている面白い世界もチラ見せする」方法はその次で説明します。
相手が自分で学べるようになれば、教える側の仕事はその学んだ内容を軽くチェックして軌道修正するだけです。1から10まで教えて疲弊するのではなく、勝手に育っていく後輩を楽しく眺められるようになるでしょう。
厳密すぎる説明をしない。ただしその説明が「厳密でない」ことを伝える
ソフトウェア開発者は厳密な定義や理解を好みます。曖昧な理解や厳密でない説明には「まさかりを投げる」習慣も存在します。
確かに、厳密な理解はその技術を適切に扱う上でとても重要です。絶対的な正解のないソフトウェア開発の世界では、正確な理解が根拠になければ最適解にたどり着けないことも多いでしょう。
しかし、教育の視点で考えてみると、その厳密な理解を初学者に求めることが果たして効果的か、ということは一度立ち止まってよく考えてみる必要があります。
たとえば 1 から 7 までをすでに知っている人が残りの 3 を理解しようとする場合と違い、1 すらも知らない初学者が 10 を理解するのは圧倒的に負担が大きくなります。厳密な理解の前提となる知識すら持っていなければ、いくら「正しい」説明をしたところでその中の 1 を理解することも難しいでしょう。
人は新しいものを学んだとき、すでに持っている知識に紐付ける形でそれを理解しようとします。つまり、何にも紐付けられない知識を定着させることは困難です。
すでにある知識に紐づける形で少しずつ段階を踏んで説明を厳密なものにしていくことは、前提知識の少ない初学者が学習する上で必要なステップと言えるでしょう。
ソフトウェア開発の技術ではよく「おまじない」が登場しますが、それが言葉の通り「おまじない」であることはまずありえません。
最初は「おまじない」としてスルーしつつ、何を理解したときにそれが「おまじない」ではなくなるのか、それを伝えることで、1 から 2 に、2 から 3 に、少しずつ理解を深めてる道筋を示してあげるのが、教える側の仕事と言えるでしょう。
その技術のメリットを伝える
何か新しい技術を説明するとき、その技術が「何であるか」を伝える前に「何のための技術なのか」を伝えると良いでしょう。
例えば Flutter について説明するのであれば、伝えるべきは「Flutter は Google が作ったマルチプラットフォーム対応の UI ツールキットである。言語は Dart である。」ではなく、「Flutter を使えば iOS アプリも Android アプリもひとつのコードで作れるぞ!」です。
当然、この説明だけで Flutter というものを正確に理解することはできません。
しかし、「Flutter を学んでみよう」という意欲をかき立てることはできます。
人は「何のために」その技術が存在するかを理解するまでは、何に使うのか、何のメリットがあって自分はそれを覚えようとしているのかが分からず、ただ書かれていることや教わったことを「覚える」ことにエネルギーを消費してしまいます。
たとえ頑張ってそれを覚えたとしても、その技術が使える場面でそれを思い出せるかは微妙です。使い所を理解していなければ、いざ目前に現れた使い所に気づくことができないからです。誰かから指摘されて初めて、「ああ、あれってここで使うやつなんだ」となるでしょう。
ソフトウェア開発者として一番効率良く学習できるのは、自分がその技術に興味を持ち、自分の意思で学習している時です。
ある程度知識と経験が身についた開発者であればその技術が「何であるか」を聞けば「ということはこんな時に使えそうだ」がイメージできますが、初学者にはそこまでの連想は難しいでしょう。
そう考えると、教える側の仕事は「何のための技術なのか」を伝えることで相手に興味を持ってもらうことなのではないかと思います。
まとめ
新人研修を含め、講師という仕事をしていて心掛けてることは他にもいろいろありますが、まずは効率的な教え方でお互いが幸せになるために最も大事だと思っていることを 3 つほど並べてみました。
いずれにしても、「先輩社員による教育が全て」にならないように、また相手が自分自身を教育する習慣と技術が身に付くように、という考え方をベースにすることが大事だと考えています。
学習する意欲があり、具体的な方法を知っていて、困った時は相談できる先輩がいる環境であれば、たとえ自分が全てを教えなくとも、相手は自ら学習し自ら理解を深められます。それは教える側の精神的、物理的な負担を軽減することにも繋がるでしょう。
端から端まで全てを教えるのではなく、内容を絞って伝え方を工夫することで、教育コストを下げつつ効率良く教育できるチームを作れるのではないかと思います。
Discussion
良いですね。
教育ですごい迷ってたので助かります。