インターネットには様々なプログラミング講座があふれていて、毎日多くの人がプログラミングを学び始めていますが、完遂できるのはごく一部の人だけです。
プログラミングを学ぶ際に、多くの人が時間や活力を浪費するのはなぜでしょうか。なぜ最後までやり遂げられないのでしょうか。
どの講座を頼りにするか迷う
どの講座が自分に合っているか、完璧にマスターできるか、最短で習得できるか、学び始める前に散々迷う人がいます。これがいいのか、それがいいのかと、誰かに聞いてみたりもします。ある人はそれがいい、別の人はあれがいいと言います。そして、学び始めるのを先延ばしにするのです。
ようやくこれと決めても、本当にこれでよかったのかと疑い、また別の人に聞いてみると、今やっているものはあまり良くない、そっちがいい、その言語を学ぶより別のものがいいと言います。色々調べてみると、今はこれが流行っているらしいとか、勉強しようとした言語より高収入の言語があるとか、目移りしまくります。あちらこちらに気を散らせ、ほとんど何もせずに何日も何週間も何ヶ月も過ごすのです。
何も始めず、ちょっとかじってはほとんど進めず、最終的に挫折します。
カリキュラムを組まない
何も知らない初めてのことにカリキュラムを組むのは大変ですが、目標を設定せず何も計画せずに始めても、習得までに時間がかかります。
フロントエンドエンジニアになりたいのであれば、身に付けなければならない技術を調べ、スケジュールを立て、目標に一直線に進まなければなりません。大抵の講座にはカリキュラムがあります。1つを選んで集中します。
そのカリキュラムがもうひとつ信頼に欠けるものだったとしても、気づくのは大分後になってからです。講座の作成者と同等の実力が付いてからです。講座の細部に間違いがあることもありますが、誰でも間違います。前段で言及しましたが、完璧な講座を探すと、挫折します。
道具にこだわりすぎる
MacBook Pro 16インチがなければプログラミングの学習ができない……なんてことはありません。周りの開発者が50万円オーバーのMacを使っているので、同じ環境を整えないとプログラミングの勉強を始められない、ということはありません。
学び始めるのに高価なパソコンは不要です。手持ちのパソコンで十分です。パソコンがなければ、中古の安物でも最初はよいのです。何を習得するかによりますが、Chrome OSでも可能です。学習を進めてそれでは不十分となったときに考えればいいのです(りんごマークをスタバで見せびらかしたいとか、資金があり余っているなら別ですが)。
学習前に高価な機材を揃えるよりも、サブディスプレイを導入して2画面にするほうがずっと勉強がはかどります。
時折、スマートフォンやAndroidタブレットでプログラミングができるのかと質問する人もいます。それは少々厳しいところです。「スキマ時間でスマホ片手に高収入!」というコピーに惹かれ、いいかげんな気持ちで始めても、またたく間に挫折します。
すぐに無理だと諦める
すぐに諦める人はプログラミングに向いていません。というか、どんな仕事にも向いていないかもしれません。自力でなんとか解決しようと試みるのは大切です。
文末のセミコロンが抜けていて気づかないといったことは、学習を始めたばかりのころにはよくあることです。そんなことで意気消沈し諦めていては、何をしてもうまくいきません。
仕組みを理解しようとせずにサンプルコードをコピペで済ますようなことをしていても、プログラミングは身につきません。
クリックするとモーダルが立ち上がるUIを作ろうとして、検索でヒットしたコードをそのままコピー&ペーストすると動作しますが、どのようなプロセスで動作するのか学ばないと、顧客要望での些細な変更対応もできず、苦い思いをするかもしれません。
プログラマーは頭がいいと思っている
プログラマーは必ずしも賢いわけではありません。賢いからプログラミングができるようになるのではありません。「自分は頭が悪いから」「4流大学にしか入れなかったから」「文系だから」プログラミングは難しくてできない、と言うのは、まったくの誤解であり、プログラミングを学ぼうとしたにも関わらず、挑戦せずに挫折を正当化するための言い訳に過ぎません。
経験豊富で優秀なエンジニアでも、何時間も、時には何日も、手を動かさず、ずっとモニターを眺めて、問題の解決方法を考える続けることもあります。
私は数学や物理など理系の科目に興味がなく、学生時代は、哲学、美学、音楽、文学、経済学など、文系の学問を学びました。パソコンに触ったのは30歳を過ぎてからです。
他人と自分とを比較する
習得のペースは人それぞれです。学校の授業で学んでいるのではなければ、全員が同時に同じ講義を受けて同じペースで進むのは良くありません。一度つまずくと、どんどん周りから遅れていき、追いつこうと焦り、自分はできないのだと思って諦め、挫折します。
自分のペースで進めていき、理解できたら次に進めばいいのです。
ただし、3日学習して1週間休み、1日学習して3日休むとか、毎日の習慣としていないのであれば、それは「自分のペース」ではありません。ただサボっているだけです。そうして多くの人が挫折します。
努力しない結果、失敗すると他人のせいにする
過去や現在の自分自身の決断によって、自分の未来が決まります。コードを書くのを中断してスマホを眺めることを繰り返していると、真面目に勉強しなかった未来の結果を、甘んじて引き受けなければなりません。
プログラミングを習得できなかったのは、必ずしもプログラミングスクールの講義がつまらないせいでもありませんし、メンターがやる気を引き出してくれなかったせいでもありません。努力しないことを選択した自分自身の行動が大きな原因となっているのです。
日本社会が安倍政権以降、目立って悪化していっているのは事実で、その煽りでやむを得ず収入を増やさなければならなくなり、プログラミングを学ぼうと思い立ち、なかなか身に着けられず挫折に至っても、政策に関連はしますが政策のせいと決めつけるのは早計です。
ここ10年ほどで経済含め日本社会を一気に醜悪にしたことは政治の責任であり、糾弾して責任を取らせ、損害を賠償させるのが公平、公正な社会であり、正常な社会をつくろうと努力するのが国民国家、民主主義国家に生きる者の義務です。
しかし、たといその状況におかれていても、自分自身が選択したことに関する責任は、自分自身が負わねばなりません。数多くの選択肢からプログラミングの習得を選択し、決断して実行したのは自分です。外的要因と内的要因とを分けて考慮すべきでしょう。
助けを求める方法が間違えている
- ググらないで質問する
- スクールのサポートやメンターにすぐに質問する人がいます。自分で考えず調べもせず、いつまでも反射的に助けを求めてばかりいると、自分ひとりで仕事をしなければならなくなったときに、どう対応してよいかわからず、挫折するのが落ちです。「初心者だから」と言い訳をして甘えてばかりいると、何もなし得ません。
- 質問が大雑把すぎる
- 「教科書どおりにやってみたんですけど動きません」と言われても、質問されたほうはポカンとして「で、何?」となります。相手に意味が通じるか、答えられる質問になっているか、自分の求める答えが得られるか、自分の書いた文章を見直してから質問すべきです。
- 専門用語を覚えない
- 専門用語を覚えないと、検索結果もあまり理解できないでしょう。プログラミングスクールに通って「専門用語を教えてくれなかったからクライアントの言っていることがわからなかった」と文句を言う前に、幼稚園児じゃないんですから、自分で勉強して覚えましょう。
調べられない
あらゆる問題の回答やヒントはインターネットにあります。Google検索をうまく使えないと、学習の進行が大きく遅れます。誰かに質問するときも、Googleに質問するときも、質問の基本は変わりません。Google検索では、人に尋ねる際の文章からキーワードを抽出し、検索します。
「エラーが出るんですけどどうすればいいですか?」と質問しても、意味がわからないので誰も答えられません。「パソコンが動かないんですけど」と質問しても、状況をもっと詳しく説明しろと返されるだけです。
よく考えて質問文を作成します。検索エンジンに対しても同じです。ただ、右も左も分からないときは、要領を得ない質問をするのも仕方ありません。他人に通じる言葉を話しているかどうか確認してから質問するように心がけていれば、そのうち慣れます。いつまでたっても訊き返されるようだと、いずれ相手にされなくなります。プログラミングでなくとも同じです。
プログラミングは基本英語がベースで、情報量は圧倒的に英語が勝ります。検索するときに日本語だけでは足りない場合もあります。Google検索の設定を英語にして英文の検索結果を引き出します。
完璧に理解しようとする
学習を進めていると、何度も壁にぶち当たるはずです。壁を突破できるようになるべきですが、そのために、すべての用語や文法を100%暗記しなければならないということはありません。最初から完璧に拘って進めると、全然先に進まず、躓くタイミングが一層増え、やる気が削がれていき、いずれ挫折します。
少しの学習で仕事を始めてしまう
逆に、まったくの未経験から1週間学習しただけでプロとして仕事を始めてしまうのは、早すぎます。「1週間」という期間が問題なのではなく、少し学んだだけで、できるようになったと思い込み、自分はプロだと勘違いして、自信過剰になるのがいけません。
謙虚さがないと、挫折します。
どの程度の技量で仕事ができるようになるかにこだわる
プログラミングの分野は日々アップデートされていますので、常に新しい技術を追いかけていないと仕事ができません。学び続けないとなりません。一定量学んだら、身につけた技能で引退まで仕事ができることはあり得ません。学びに終わりはないのです。学び続けられない人は、挫折します。
逆に、まだまだ学び足りない、だからまだ仕事ができない、今の実力だと不安で不安で仕方がないと、異様なまでに不安がる人もいます。仕事で失敗するのを恐れているわけです。そこまで恐怖に支配されていると、不安をコントロールする術を学んで解消する努力をしない限り、プログラミングは楽しくならないでしょう。
あるいは、学習が進まないことの言い訳を延々と考えているだけかもしれません。こうなるともう、プログラミングから距離を置くべきでしょう。人生には様々な道があります。他の道を選んだほうが幸せになれます。
例題だけを練習する
大抵の教材では、学んだことを適用する例題が示されます。forループについて学び、例題や練習問題をし、次にforeachループを学び始めます。そして、教材にある練習問題だけをこなして満足してしまいます。
それでは身につきません。学んだことを様々な問題に適用するよう努めなければなりません。自分の頭でアイデアを練り、どういう場面に適用できるかを考え、練習します。
コードをほとんど書かずに暗記で終わらせる
プログラミングは歴史を学ぶようには学べません。歴史を学ぶときは、歴史的出来事を覚え、次に分析し、歴史像や歴史観を構築します。学びには、「浅い」学びと「深い」学びがあります。歴史の学習は、浅い学びを行った後に深い学びを行うという手順を踏みます。学校での授業はたいていそのように行います。浅い学びで獲得した知識を深い学びで発展させていきます。
プログラミングはそうはいきません。すべての理論を覚えたあとに、それを応用するという手順では上手くいきません。上手く学べないと、挫折します。
プログラミング学習では、ひとつ構文のルールを覚え、同時にその構文を応用しなければなりません。暗記と応用とを同時に行わなければなりません。
プログラムを読んで分解して理解することはできるけれども、自分でコードを書くことができないとなると、深い学習が不足していることになります。アルゴリズムに従ってコーディングはできるけれども、アルゴリズムを作り出すことができないとなると、深い学習が不足しています。
知識ばかり積み上げても、コードを書くことができないので、挫折します。
コードを書くときにだけ考える
コードを書くときにも考えますが、そのときにだけ考えればよいのではありません。どういうコードを書けばよいのか考えてから書かねばなりません。コーディングの前に自分の考えをUMLやワイヤーフレームに書くこともあります。
通常は、アルゴリズムをつくってからコーディングします。
簡単な例を示します。以下の集合AとBの共通部分(A ∩ B)をPHPで出力したいとします。
A = {1, 2, 3, a, b, c}
B = {2, 3, 4, b, c, d}
AとBをそれぞれ配列
$a
、
$b
で定義し、
-
$a
と$b
に同一の値が存在する場合にその値を配列$c
として格納する - あるいは、
$c
に$a
と$b
を格納し、重複する値を取り除く - などなど…
そして
$c
を出力すればよさそうということになります。
問題解決のアルゴリズムを考えたところで、コーディングします。
配列
$a
、
$b
は以下のように。
$a = [1, 2, 3, 'a', 'b', 'c']; $b = [2, 3, 4, 'b', 'c', 'd'];
前者の、同一の値が存在する場合は、例えば以下のように書けるでしょう。
function arrayIntersection(array $a, array $b) { $c = []; foreach ($a as $val) { if (in_array($val, $b, true)) { $c[] = $val; } } return $c; }
後者の、重複値を取り除く場合は、例えば以下のように書けます。
function arrayIntersection(array $a, array $b) { $c = []; foreach ($a as $val) { $b[] = $val; } $c = array_unique($b); return $c; }
最後に出力。
var_dump(arrayIntersection($a, $b));
集合は、高校数学で学ぶもので、難しくはありません。集合は離散数学の一部であり、離散数学は計算機科学(コンピューターサイエンス)の基礎ですので、概要を知っておくと、プログラミングの理解が深まりますし、習得も容易になります。
言ってみれば、コードを書くということは、コンピューターと対話することです。プログラミングを学ぶことは、コンピューターと対話する方法を学ぶということです。
最後に
これから先もますますエンジニアの需要は高まります。完全に需要が勝っています。需要があるからプログラミングを習得しようという目標は間違えてはいません。人によってはそれが強力なモチベーションになる場合もあります。
ソフトウェア開発で長くキャリアを積んでいき、高収入のポジションに就くのが目標になる人もいます。ある程度の経験を積んで、自分自身のプロジェクト立ち上げを目標とするのも、モチベーションになります。人それぞれです。
しかし、こういった目標が合わない人もいます。気が乗らなかったり、目標を達成しても達成感が得られなかったり、モチベーションが上がらない場合は、目標が間違えていると言えます。目標の再検討が必要です。
もっと大局観から、自分がどのような人間になりたいかと考えてみるのもよいでしょう。人生において、プログラミングはどのようなものであるかのイメージを持つのもよいかもしれません。
モチベーションを保つには、当初の目標を絶えず思い出し、それが間違えていたら修正し、常に忘れないでいることです。