ここはクソみたいなインターネッツですね

逆にクソじゃないインターネッツってどこ

プログラミング講師が考える、プログラミング学習に必要な資質と講師側の規範、また教育というものについて

 真新しいスーツに身を包む方々が目立つ季節となりました。私の下にも新卒の方が2名程つくことが決まり、久しぶりにできる後輩というものへの接し方に関する不安、彼らを一人前に育て上げなければならないという責任の重さから、柄にもなく非常に緊張しています。しかしこれは良い機会であると前向きに捉え、このタイミングで今一度後輩や教育というものに関する私の考えをまとめておきたいと思います。

 まずはじめに自己紹介をしておくと、私はCODED@というプログラミング講座団体を立ち上げ、講師としてプログラミング講座を実施しております。

 私たちの講座は二日間の短期的な講座であることが特徴です。webサービスの基本的な動き方の説明から、実際にハンズオンでapache,PHP,MySQL,HTMLを利用してtodoリストを動かしてみるところまで体験ができます。プログラミング未経験者、初学者をメインターゲットとしております。実績として、就活生向けのイベントやIT企業の内定者研修として実施させて頂いております。

 企業様や様々な方のご協力のおかげで、今では受講生はのべ50人以上にもなり、それなりに知見やデータが溜まってまいりました。二日間という極僅かな時間にもかかわらず、プログラミング能力やプログラム的思考能力が伸びる方となかなか伸び悩む方というのがだんだんとみえて参りました。

 今回は私なりに感じたプログラミングに必要な資質と、プログラミングを教える際の注意点をいくつかまとめておきたいと思います。尚、現在も所属している企業で内定者研修を行っている最中です。

プログラミング学習に必要な資質

 教育による成長というものは、教える側教わる側双方の要素が複雑に絡み合っているものです。本章では受講者側にフォーカスしていきたいと思います。

 些か乱暴な分け方かとは思いますが、私の経験から伸びる受講生と伸び悩む受講生の間にある違いについて大きく分類します。

  1. 意欲と目的
  2. 好奇心の豊富さ
  3. 献身の精神
  4. 楽しめるかどうか

1. 意欲と目的

 いきなり身もふたもない話ですが、やはり意欲のある受講生とそうでない受講生では差が生まれます。意欲とは何か、というと「習得したい」という思いです。私の団体は基本的には受講希望者を募って講座を実施しています。つまり積極的に参加して下さる方が集まっていると言えます。にも関わらず、受講生の意欲には差があります。昨今、世の中ではBTC人材というビジネス、テクノロジー、クリエティブ分野に横断的な知識を持つ人材が求められていますが、やはりそのような人材をを育てる、あるいはそのような人材になる、ということは非常に難しいことです。

 何より、未経験からプログラミングを学びたいという方は大抵「一般常識としてちょっと触ってみたい」、「なんとなくやった方がいい気がする」というふんわりとした動機から受講されます。確かに現代社会においてITリテラシーは必要ですし、役に立つ場面も多いことでしょう。しかしやはり、何のために技術を学ぶのかという目的を明確に持っている人とそうでない人では食らいつく力が違います。

 強い意欲と目的意識のある受講生には様々な方がいました。目的もそれぞれ違っていて、とても興味深いのです。エンジニアになりたい、作りたいサービスがある、入りたい会社がある、ハッカーに強い憧れがあるなど分かりやすい目的に始まり、就活に失敗したのでスキルを付けなければ生きる術がないと考えていた方、家業のIT化や効率化を推進することで実績を得て、お兄さんから家督の座を奪いたいという方など、中々差し迫った事情をお持ちの方もいらっしゃいました。

 私は精神論や根性論はあまり好きではないのですが、意欲というものはその維持が可能な限り大変に人間の才能を伸ばす要素であることは間違いありません。そして、意欲というものは明確な目的があってこそ生まれるものであるということもまた間違いないことでしょう。しかし私の努力不足故に申し訳ないところではありますが、残念ながら、やる気がある方が必ずしも伸びるというわけではありませんでした。そちらは次の要素に関わるお話です。

2. 好奇心の豊富さ

 知的好奇心の強い方というのは、凄いです。3を教えるだけで10以上のことを自走的に学びます。彼らに言わせれば「じゃあこうしたらどうなるんだろう?」という問いを立てて実践することでより理解が深まり、達成感を感じるそうです。

 私なんかは学生時代はまともに勉強をしておりませんでしたが、きっと彼らはそうやってずっと勉学に励んできたのでしょう。やらされているのではなく、自分で仮説立てから検証までを自発的に行うのです。私たちの講座では練習問題を用意してあるのですが、彼らはより発展的な応用問題を自身で作り、それに挑戦しようとします。そして、詰まっても決して答えを訊こうとはしないのです。ここからここまでは理解できていて、ここでどのような技法を用いればいいのかだけがわからない。それをそのまま教えるのではなく、ヒントをくれと要求してくるのです。メンティとしての才能がそもそもあるのです。

 こういった受講者には、敢えてあまり手をかけないようにしています。日本の教育による悪影響なのかどうかは分かりませんが、彼らは我々に干渉されることを嫌います。自身がおかしな仮説を立てているかもしれないから見られるのが恥ずかしいとか、勝手に進むことはいけないことというふうに考えているのでしょうか。

 何にせよ、意欲や目的はさほど明確でないのに、自由にやらせておくだけで勝手に成長していく受講生も一定数いるのです。これは一種の才能であると私は思います。誤解のないように申し上げておきますが、これはプログラミングにおいて才能が必要であるという話ではありません。学習という領域において、メンティとしての才能、言い換えるならば衝動とさえいえる彼らの好奇心は大変に有効な才能であり、おそらく彼らはどんな分野の学習でもその才能を発揮できるでしょう。

3. 献身の精神

 また、5,6人以上の受講生に教えていると大抵1人は献身的な学習方法を取る方が居ます。周りの遅れている方を率先的にフォローし、フォローをするリソースを空けるために先の単元をどんどん吸収していく方です。私たちもなるべく噛み砕いた説明を用意するよう心掛けているのですが、私たちが気付かないようなところに引っかかってしまう方がいたりします。献身的な方は、そうした人々を助け、また本人も人に教えることで知識の定着を得ていきます。人に教えるという方法は非常に有効な学習方法です。言語化することで知識は整理され、教えていく中で不足している知識が明確になり、次に何を掘り下げるべきなのか、と自身の状況を俯瞰できるようになる上に、その知識が必要とされる背景、文脈を捉えてから学習をするという非常に理想的な知識の定着フローを自然と踏めるようになるのです。

 こうした学習方法を自然にとれる受講生がいると、私たちとしては教えるのが非常に楽です。しかし一方で、このような方はその当人しか伸びず、他者の成長を阻害してしまうという事態を起こす危険を孕んでいます。

 このような学習方法を取れる方が他の受講生に教えること自体は献身的で素晴らしいことです。しかしその当人がメンターとしての行動指針をしっかりと確立しているとは限りません。私たちの講座ではメンタリングとティーチングを織り交ぜています。必要な知識を与え、そこから先はなるべく受講生の主体性を引き出し講座の着地点を変化させていく手法を取っています。その方針のなかで、他の受講生に対し親切心からすぐに答えを教えてしまう受講生がいると、他の受講生に「考えさせる」という重要なタームを経験させることができなくなってしまいます。

 これは後述致しますが、場をうまくコントロールして、受講生全員が主体的に学び、また偏りなく補い教え合うような環境を作り出すということが私たちの課題となります。これはとても難しいことです。そして、私たちにとって、常に改善を怠ってはいけない重要な価値のコアになる部分でもあります。

4. 楽しめるかどうか

 以上全ての特徴を集約する大前提として、「楽しめるかどうか」という要素は重要です。また、上述したように人によって楽しさを感じる観点は違います。プログラミング自体を楽しいと感じる方や、新しい知識を得ること自体にポジティブな姿勢を保てる方、出来ないことがだんだんとわかっていくその達成感に楽しみを覚える方。たくさんの楽しみ方の形があります。当然、そのような楽しみ方の多様性を私たちは否定しません。理想となる楽しみ方、理想となる成長というものを押し付けるつもりは決してないのです。

 受講生の方々が、それぞれの楽しみ方でプログラミング、あるいは大きな言い方をすれば「知らないことに触れる」ということに前向きに取り組めるかどうか。それが何より重要な要素です。

講師側が気をつけなければいけないこと

 先述した通り、教育(この言葉は何か上から目線のようで恐縮ですが)における成長は教育者と被教育者の相互関係の中で生まれる双方向的なものです。なればこそ、教える側である私たちは受講者の方々の意欲、楽しさ、献身を促進するような寄り添い方を強く意識しなければなりません。本章では、少ないながらも私がプログラミング講座を開いてきた中で内面化してきた教育者としての規範をいくつかお話ししたいと思います。

why、に納得感のある答えを用意する

 プログラミング初学者は「なぜこれを作るのか」というところに対する納得感を得られないことで学習意欲を減退させてしまうことがよくあります。現在行なっている社内研修でも同様のことが起こりかけました。それは、function(関数)についての項目を講義している際のことです。

 「プログラミングをしていると、同じ処理を繰り返し使いたくなる時があります」という説明の元でfunctionの構文や使い方について解説をしたのですが、「繰り返し使いたくなる時」という具体的状況の想像が初学者にとっては困難なのです。特に私たちが行なっている研修は二日間という短期間のパッケージであるため、可能な限り学習項目を少なく簡略化しており、確かに繰り返し使うような処理はほとんど出てきません。私の場合、実務経験に基づく例を挙げて納得して頂こうと試みているのですが、しかし十分に納得をして頂けない場合も当然ながら御座います。この点については、日々教材と紹介実例のアップデートを行い改善していかなければならないと考えています。

わからないことは罪でないことを先に断言しておく

 これは当然のことですが、未経験者や初学者がプログラミングを学ぶということは、わからないことを突きつけられ続けるということです。私たちの義務は、受講者のわからなさの輪郭や原因を明確にし、理解のブレイクスルーポイントを的確に見抜き手助けをすることです。ですから、「わからない」ことに対して受講生に罪を感じさせることは愚の骨頂であるといえます。新しい領域に挑戦しようとしている人間にとって、わからないことが多いのは当然のことです。その為、自身でしっかりと考えた上でもわからないことがあれば、何度でも同じ質問をしてくださいと宣言しています。

 現在、入社研修の一環として講座を開催しています。その中で、新卒の方々に「同じことを質問するな」であるとか「先輩の時間を使うことはコストである」とか、そういった思想が刷り込まれていることが少なからず見受けられます。その刷り込みは一方では正しい論理です。私もエンジニアの端くれですから、無駄なことをするのは悪であると考えています。しかし、この場合ではどうでしょうか。この講座が真の意味で無駄となるのは「受講生が何も得ず研修を終える」という状況に他なりません。つまり、この場では私のリソースを最大限活用し、貪欲に知識を得ることこそが彼らの義務なのです。私たちはこのことをしっかりと理解し、言葉遣い、表情、雰囲気作りなど様々なやりかたでこの考えを受講生と共有できるよう心掛けなければなりません。

自分で考えさせる仕組みをつくる

 受講生の資質の部分でも触れましたが、知的好奇心の強い受講生は伸びやすいという経験的認識が御座います。そしてそれは当然受講生の資質だけの問題ではありません。私たちは受講生の好奇心を何らかの仕組みによって刺激し、彼らの自走性をより促進させることが可能なはずなのです。

 私の場合はまたまだ試行錯誤の段階ではありますが、受講生に要件定義に関するグループワークをしてもらうタームを講座に組み込んでいます。目的は2点あります。1点目は、最終成果物を受講生に再定義させることで実際の作り方を俯瞰、想像しやすくする点。2点目は、受講生自身に成果物の開発を「自分ごと」として認識させる点です。過去の講座では、このグループワーク内で追加機能や追加要件などを出してきた受講生らが居ました。時間制限のあるなかで機能を追加することはなかなか彼らにとってハードではあったかと思います。しかし自らの意思で作ろうと決めたことで、彼らの積極性は明らかにガラッと変わりました。

 その受講生たちは私が何も言わずともグループを二つに割り、分業制をとりました。チーム開発の手法を自らこの段階で生み出したという訳です。これには驚かされました。あるグループはこの機能、あるグループはこの機能、というふうに工程を分割し、統合の際はお互いに作った機能とロジックについて解説を行う。そこでロジックの正当性について議論が起こり、またより効率的な条件分岐の書き方などを共有していました。一つの理想的な開発チームがそこにはありました。この受講生らは学生でしたが、社会人ですらこのようなフローをしっかりと実践できているチームは少なく、非常に感銘を受けました。

ティーチングとメンタリングを使い分ける

 短期間の講座であると、どうしてもティーチングに寄ってしまいます。しかしより効率的な学習を推進するためには、メンタリングの手法がやはり有効であると私は考えています。ティーチングとメンタリングの違いを簡単な喩えで言うと、初めて自転車に乗る子供に対する教え方の違いが相応しいでしょう。乱暴に定義しますが、自転車の乗り方を言葉で伝えあとは乗ってみれば乗れるようになるとするのがティーチングです。対して、メンタリングは子供が自転車に乗りたいというその気持ちを促進し、乗り方を自ら学び取る手助けをします。子供が転んで挫けそうになった時には「前より随分乗れているよ」と前向きな気持ちに転向させ、転ぶ恐怖を感じてしまっているならばその恐怖を取り除く等の支援をします。効率的な練習法を提示し、当人の経験と気づきを重要視するのです。

 少々重複しますが、人間は自身で経験したことを基盤に成長するのです。人から教えられることや社会のセオリーから学ぶものは、確かに必要な知識として私達の中に蓄積されていきます。しかしその知識がどの程度内面化されるかというのはまた別の話です。私はその内面化の鍵は自発的な経験であると考えています。訳もわからず人に与えられた課題をこなすより、自身で論理から組み立て設定した課題を解決するほうが、より大きな達成感を得られることは自明と言えるでしょう。

 この点は講師としては非常に難しいところです。あまりに受講生任せになってしまっては怠慢であるとみられてしまいます。何より、さっさと答えを教えることの方が私たちにとってはずっと簡単なことですから、時間的制約や体力の観点からそちらに流されてしまいそうになることも多々あります。しかし、私たちがプログラミング講座を開催しているのは決して私たちのためではありません。受講してくださる方の人生を、選択肢を、可能性を、私たちにできる範囲で拡張したいという理念に基づいて開催しています。ですから、私たちは自分が楽であるとか大変であるとか、そういったことを講座の場で判断軸としてはならないのです。完璧にその思いを遵守することは難しいことです。しかし私たちはその思いを念頭に置いて、常に意識と講座内容の改善を重ねていかなければなりません。人にものを教えるということは、また私たち自身も常に学び続けなければならないということです。

おわりに

 長々と書いて参りましたが、受講生が伸びるかどうかの分かれ目における責任の比重は講師側に傾くと私は考えています。上に挙げたように、受講生の資質もまた重要であることに変わりはないのですが、しかし資質が一切ないと感じさせる受講生を私は1人も見たことがありません。プログラミングを楽しめるか楽しめないかという違いは確かに人によるところがありますが、一見楽しめていないように見える人でも「この方はエンジニアに向いているなあ」と思わせる閃きや論理性を表出させることがあります。そういった方が楽しめていないのは、プログラミングの楽しさを私が充分に伝えられなかったせいだと考えています。殆どの場合、彼らの責任ではなく、私の責任なのです。

 人にものを教えることはとても難しいです。しかしだからこそとても面白いことでもあるのです。これから後輩を持つ方、教育に携わっている方、どうか相手を一方的に責めるのではなく、信頼、尊敬、謙虚の念を持って接して下さい。人を即座に断じてしまうことはあなたにとっても大きな損失となります。私は、そのような傲慢な姿勢をとっていたことがあり、取り返しのつかない失敗も経験しました。どうか、みなさんは私のようにならないで下さい。