見出し画像

プログラミングをどう学べばいいか?スクールへ通うべきか?

プログラミングの学習方法を教えて欲しい」「プログラミングスクールへ通うべきか」などのプログラミング学習に関するご相談を多く頂きます。

プログラミングはスクールや教材、学ぶ機会も多くなっていますが、スキル習得に対して悩みを抱えている方は多くいらっしゃいます。

みんなサボっている訳では無い

ご相談を頂いた方の学習状況を聞くと、サボっている訳では無く、むしろ真剣に取り組んでいる方が多いです。※もちろん中には理解せずにコピペで乗り切ってしまった方もいらっしゃいましたが、、、

ではなぜ実力が伴っている感覚が得られないのか?

スクールに通うことをご検討されている方は、通う前に立ち止まって考えるきっかけとして。同じ悩みに苦しんでいる方はこれからのアクションプランとして。

プログラミング学習というものについて考え、何をしていけばいいかを見つけていきましょう。

プログラミングは何が難しい?

まずプログラミングの学習において、どこが難しいのかを考えてみます。難しさのポイントを知ることで学習のアプローチを見つけていきます。

引用:プログラミング技術習得のための学習過程の提案 : 大学生による小学生を対象としたプログラミング指導

この実験は2009年に行われた基礎的なプログラミング技術を身に付けた大学生が小学生を対象にプログラミングを噛み砕いて指導するというものです。

・実験を通して見えたプログラミングの難しさとは?
指導にあたった大学生が感じた難しさは大きく2つに分類されます。

①プログラミング学習の特殊性
例えば「プログラムの回答は1つではない」、「小学生の発想を活かしながらがら、プログラムを作ることが難しい」といったものです。

②指導自体に関する理由
「どのような助言が適切かが不透明」と言うような実態把握や助言(指導)の程度や態度といったものです。

・プログラミング学習の特殊性を理解する
②指導自体に関する理由については、指導者のスキルに依存する部分です。
例えば、プログラミングの知見の深さやコーチングスキルなどです。
これらは、プログラミングに限らず、指導にあたるもの全てが該当するものになりますので、プログラミング特有のものではなさそうです。

①プログラミング学習の特殊性を知ることで、プログラミングの難しさを理解し対策を取ることができそうです。

では、プログラミング学習の特殊性を考えていきましょう。

プログラミング学習の特殊性とは?

プログラミング学習の特殊性は大きく3つあります。

・ゴールとプロセスの設計を行う必要がある
・プログラミングの回答は1つでは無い
・発想や長所を活かした学習が必要

特殊性①:ゴールとプロセスの設計を行う必要がある

ゴールとプロセスとは何か?なぜ必要なのか?を考えていく上ではプログラミングスクールと予備校の違いを考えていくとわかりやすいです。

・プログラミングスクールと予備校は同じ?
予備校に通った経験がある方は、同じ感覚でプログラミングスクールを検討している方も多いです。結論から言うと、予備校とプログラミングスクールは全く異なります。
その違いを理解するとゴールとプロセス設定の必要性を把握しやすくなります。まずは予備校で勉強を学ぶというシチュエーションを考えてみます。

・予備校は明確なゴールが設定されている
予備校には「受験で合格する」という定量的なゴールが設定されています。
定量的なゴールをビジネスではKGI (Key Goal Indicator)と呼びます。以降、KGIと表します。

・予備校はプロセスがわかりやすい
次に予備校のKGIを達成するために必要なプロセスは非常にわかりやすいです。
例えば、数学で〜点取るなどの定量的なプロセスです。この定量的なプロセスの指標をビジネスではKPI (Key Performance Indicator)と呼びます。以降、KPIと表します。

・予備校ではKGI、KPIを設定してくれる
予備校ではKGIとKPIを設定してくれます。KGIとKPIを用意してくれるということは、そこに向けたアクションをひたすら実行すれば良いという構造になっているということです。※もちろんアクションを自分でアップデートしていく必要はありますが。

続いて、プログラミングスクールでプログラミングを学ぶというシチュエーションを考えてみます。

・KGIはスクールの卒業?技術力の向上?
当然スクールの卒業ではありません。そして、技術力の向上でもありません。それは卒業後に得たいものです。
スクールに入ること、そこで得た技術力はあくまでもKPIであり手段です。設定すべきは卒業後に何を得たいのか?何のためプログラミングを身につけるか?というものをKGIに設定する必要があります。

・KPIの設定はできない?
プログラミング学習においてスキルを定量的に測ることは難しいので、KPI設定はできないのでしょうか?
当然そんなことはありません。KGIから逆算・分解していくことでKPIは設定することができます。
KPIの設定を行わないと、自分の進捗が把握できず、モチベーションの維持を難しくさせます。

・KGI、KPIの設定はプログラミングスクールが行ってくれる?
これらのKGIやKPIはプログラミングスクールが設定してくれません。
なぜならKGIはスクール卒業後に得たいものであるためスクールの責任範疇では無いからです。
KPIはKGIから逆算・分解して設定する必要があるので、こちらもスクールでは行いません。自分自身で設定し、日々アップデートをかけていく必要があります。

・KGI、KPIの設定は具体的にどうやればいいのか?
KGIとKPIの具体的な設定方法については、文章量が多くなってしまうので、noteのリアクション次第で書くかどうか決めさせて下さい。。。


特殊性②:プログラミングの回答は1つでは無い

続いての特殊性はプログラミングの回答は1つでは無いということです。
既に学習を開始されている方は実感されている方も多いかもしれませんが、書き方1つとっても様々な方法があり、サービス全体の構築ともなれば方法論は千差万別です。

プログラミングを学び始めた初期に当たる壁として「この方法でいいのか?という疑心暗鬼になってしまう」というものがあります。

前提として、プログラミングの方法論に絶対の正解はありません。
もちろん効率的な方法、保守性・拡張性を担保する方法、可読性を高める方法などの定形のパターンも存在していますが、これが絶対的に正しいという方法はありません。

とはいえ、スポーツのフォームのように自分にあった方法を探すという訳でもありません。

プログラミングは常に手段であり、目的は別にあります。その目的に応じて時々で優先順位を決めて方法論を選定していく必要があります。

開発を行うシチュエーションでは様々な前提条件に影響を受けます。
例えば、
・期限がタイトである
・使える予算が決まっている
・人材が限られている
などです

このような前提条件を踏まえて、その時々に最適であろう方法を考え、決め、行動していく必要があります。
この一連の中で方法を選定するというスキルが醸成されていきます。

そのためには方法論を知っているだけでは不十分です。
多くの方が方法論を選定するスキルが醸成させることができず、スクールに通ったがいまいち実力が伴っている感覚が無いという原因になっているのではないかと思っています。

プログラミングスクールで身に付くのは「方法論を知っている」もしくは「方法論を調べることができる」というスキルです。
当然、方法を選定していくためには、知っている・調べることができるということは必須です。

方法論を知るための学習をインプットによる学習と呼んでいます。
初期のインプットによる学習は主に2つのことが重要です。
・知識のベースを作ること
・インプットする方法(調べ方など)を習得すること

特に「インプットする方法(調べ方など)を習得すること」を見つけることが非常に重要です。このスキルを身に付けることで、自走していくための手助けになります。

もう少しインプットによる学習について考えてみます。
インプットという言葉から、書籍を読む・動画を見る・講義を聞くなどの手を動かさない学習をイメージされるかもしれません。

しかし実際には、スクールで提供されている課題を実装する、カリキュラムを実装するなどの実際に手を動かして行うものもインプットによる学習です。

なぜ、課題を実装することがインプットによる学習なのかというと、「方法を選定するスキル」は様々な前提条件に左右される中で考え、決め、行動していく中で成長します。
カリキュラムや課題という前提条件に差が出ない環境では、「考える」「決める」が欠如してしまい、結果としてこのスキルは身に付きづらくなってしまっているようです。

では、方法を選定できるスキルはどのようにして習得していくのかというとアウトプットによる学習が必要になります。

アウトプットによる学習において有効なものは「自分でサービスを作る」ということです。
また、その際にあえて前提条件を作るチャレンジを加えると、より良い効果を生みます。

例えば、
あえてサーバーを有料のものを使ってみる
あえて期限をタイトに設定してみる
あえて他の人と連携して開発してみる
などです

身銭を切る、期限を設定するなどを行うことで臨場感を上げ、前提条件を意図的に作りだしてサービスを作ってみることがおすすめです。

アウトプットを行っていくことで、自分で打ち手(課題解決プラン)を考え、決め、行動するというループが生まれます。この試行回数を増やしていくことで、方法論を選定できるスキルが醸成されていきます。

・アウトプット学習の開始は早ければ早いほど良い
インプットからアウトプットへ学習をシフトさせるていくタイミングについては多くの方はまだサービスを作れる自信が無いという理由で後回しになりがちです。
しかし、アウトプットシフトはできるだけ早期のタイミングで行っていくことが重要です。

なぜなら、アウトプットシフトを起こすことでインプットの質が上がる効果があるからです 。

アウトプットを意識しているとインプットしている際に自動的に情報の優先順位付けが走り、必要な情報が無意識に収集されるようになります。

「ポルシェを購入することを検討し始めると、街で走っているポルシェが増える」という話があります。
これは、「脳は意識したものしか見えない」「意識をしだすと無意識に情報の優先順位を付け替え、今まで見なかったものが見えるようになる」という良い例です。

この特性を活かし、サービスを作る(アウトプット)を意識することで、インプットによる学習の質を上げていくことができます。

ではどんなサービスを作ればいいのか、サービスでは何を意識したらいいのかなどの具体的な方法論についてはまた別のnoteでお伝えできればと思います。

特殊性③:発想や長所を活かした学習が必要

最後は発想や長所を活かした学習が必要という特殊性です。

プログラミングはあくまで手段です。何のための手段か?それは発想を具体化するための手段です。

プログラミングのスキルをどれだけ学習しても、発想が無ければ意味がありません。
学習を始めた当初は「こんなものを作りたい」「これを実現したい」という思いがあっても、スキルの習得に手一杯になり、いつしか目的を見失ってしまうことがあります。

スキルの習得と発想・アイディアを磨き、プランニングしていくことは並列して行っていく必要があります。

発想やアイディアを磨いていくためには、長所を活かすことが有効です。
長所とは、例えば現在の業務知識や経験などがわかりやすいです。

日々行っている業務の中にどうエンジニア思考を入れていくかという考え方がでれば、日々の業務の中でも磨き込んでいく機会が増えていきますし、差別化にも繋がります。

プログラミングという具体化する力を身に着けつつ、何を具体化したいのかということも日々考えていくことが重要になります。


プログラミング学習に向き合っていくために

ここまでプログラミング学習の特殊性から難しさ、それに対するアクションを考えてきました。まとめていきます。

ゴールとプロセスの設定に対しては、KGIとKPIを設定していくことを行います。ここが最も重要です。

そして、プログラミングの回答は1つでは無いという特殊性に対してはインプット学習と平行してアウトプット学習を実施していきましょう。

最後にプログラミングスキルの向上と同時に、自分の知識・経験をより磨き、その中にエンジニアリング観点を盛り込んでいく感覚を掴んでいきましょう。

結局プログラミングスクールに通うべきなのか?

ここまで読んで頂いた方は、既にご自身で判断ができるようになっているかと思いますが、個人的な考えとしては、まずはKGIとKPIの設定を行い、自分でインプットとアウトプットの学習を進めてみて、
その学習工程において、より一層のインプット学習が必要と感じた際に、スクールに通うことを検討することをおすすめします。

繰り返しになりますがプログラミン学習は、アウトプットを意識してインプットをしていく必要があるKGIを見失わないということが非常に重要になりますので、客観的に自分を見つめる鳥の目と、細部・各論を実行する虫の目を行き来することを強く意識していきましょう。

最後に

最後までお読み頂きありがとうございました。

KGIやKPIの設定、サービスの作り方などの具体的な各論はこの中ではお伝えできなかったのですが、大きな考え方の骨子についてはご理解頂ければ幸いです。

プログラミングや開発を行っていくことは、本当に本当に楽しいものです。

苦しい部分もありますし、しっかり考えてやらなければいけないものもありますが、何よりも楽しんで好奇心を持って進んでいく事が大事なのでは無いかと思います。

重ね重ね、最後までお読み頂きありがとうございました。

もし少しでもお役立ちできたのであれば幸いです。

引き続き、皆さんのプログラミング学習が楽しく、実りが多いものになることを応援・サポートしていきたいと思います。

最後によろしければ、イイネ、シェア、サポートなどなどリアクション頂けますと幸いです。ありがとうございました。



エンジニア学習、サービスグロース、ビジネスについての考えを発信しています。 👉 https://twitter.com/ogaaryo