読者です 読者をやめる 読者になる 読者になる

paiza開発日誌

paiza(http://paiza.jp)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

プログラミング学習を始めた人が、すぐに挫折してしまわないための解決策

ITエンジニアのキャリア プログラミング初心者 プログラミング学習

f:id:paiza:20151028103537j:plain
Photo by PROTheGiantVermin
こんにちは。可知です。

最近はプログラミング学習に注目する人が増えていますが、プログラミングを学ぶためには様々なハードルがあり、独学で始めたけど挫折してしまった……という人も多いと思います。

先日、このブログに掲載された「プログラミングの勉強を始めたときに、文系が挫折しやすい7つのポイント」も、大変注目を集めました。

paiza.hatenablog.com

私も、BASICで「10 PRINT "12345";」みたいなプログラムを書いてから、かれこれ30年以上たちまして、いまだに心が折れてばかりで、たいしたプログラムが書けません(ycatch (Yutaka Catch) · GitHub)。

どうしてプログラミング学習というのは、ハードルが高くなってしまいがちなのでしょうか?プログラミングを習得するのに、挫折しないで済む方法はないのでしょうか?

そこで今回は、プログラミング学習で挫折しない方法について調査して、いくつかのパターンに整理してみました。

[目次]

・なぜ、プログラミング学習は心が折れるのか
・心が折れない解決策を正攻法で考える
・目標:プロフェッショナルを目指すか、目指さないか
・プログラミング学習のスタート地点
・プログラミングを独学で学ぶ
・独学の利点と欠点
・プログラミングを独学以外で学ぶ
・プログラミング学習のマインドセット
・本当に必要なプログラミング学習の手法

■なぜ、プログラミング学習は心が折れるのか

ではなぜ、プログラミング学習は、こんなにも心が折れやすいのでしょうか。

それには、大きく3つの理由があると思います。

1.全体像がつかみにくい

まずは、プログラミングの全体像がつかみにくいこと。日常からかけ離れた専門用語や新しい概念が次々と出てきて、コンピュータとプログラミング言語の仕組みやバッドノウハウを、それなりに飲み込む必要があるのです。たとえば、「=」で右から左に代入するとか、データ型とかポインタとか。いや、この説明も、これからプログラミングを学習しようとしている人や、すでに心が折れている人には、何がなんだか、さっぱりわからないかもしれません。このような理不尽な知識をさほど抵抗なく飲み込める人でないと、古典的なプログラミングの学習方法では、ついつい心が折れてしまいます。

2.身につけるのに時間がかかる

そして、2番目の理由は、このようなコンピュータとプログラミングの背景知識を含めて、プログラミングを身につけるには、かなり時間がかかるということ。一説によると、どんなものでもプロフェッショナルになるためには、およそ1万時間かける必要があるということです。フロリダ州立大学のK.アンダース・エリクソンが提唱した「1万時間の法則」です。

この法則は、プログラミングにも当てはまりそうな気がします。1万時間というと、1日8時間やったとして1250日。年間300日をプログラミングに費やしたとして、4.16年かかります。プログラミング学習だけで、これだけの時間をかけるのではなく、プログラマーとして仕事をしながら経験値を積み上げていくのだとしても、使える人材になるまでに、かなりの時間がかかります。この1万時間の法則は諸説あり「まあまあ良い」レベルになるなら20時間とも言われています(一万時間の法則は嘘 20時間で一人前のスキルを習得するコツ - ログミー)。それでも、やはりかなりの時間が必要です。

3.モチベーション維持が難しい

3番目の理由は、このような長期間に渡って学習する環境やモチベーションを維持することが難しいということ。時間がかかるということは、その途中で心が折れる機会も結構出てきます。

このように考えてみると、プログラミングの入門の段階で、理不尽な専門用語の嵐に臆することなくコードを書くことができた人じゃないと、そもそもプログラミングで心が折れるのは当たり前な気もしてきました。

最近では、子供たちにプログラミングを身に着けてもらうため、専門用語や新しい概念をできるだけ減らし、Scratchなどのビジュアルプログラミング言語を利用するといった取り組みも行われていますが、これでは満足できないという人もいるでしょう。

■心が折れない解決策を正攻法で考える

f:id:paiza:20151028110003j:plain
Photo by Sofi
では、心が折れないプログラミング学習は、いったいどのように取り組めば良いのでしょうか。学問に王道なし。こういう難しい課題は、やはり正攻法で考えるしかありません。

実際にやるかどうかは別として、まともに解決するならどうするか、一度、考えてみましょう。

さてさて、それなりに高度な課題をやっつけるとき、戦略的に取り組みには、

1.目標を明確にする
2.スタート地点を把握する

という2つのが重要です。そこから、どんな方法で1万時間を維持するのか作戦を立てるのです。

プログラミング学習について、アドバイスをしてくれるブログ記事も多数ありますが、実は、この目標と対象者が記事によって違っています。自分と目標にあった記事を選ぶ必要があるのです。

■目標:プロフェッショナルを目指すか、目指さないか

どんなものでも同じですが、最初に確認するのは「何を目標にするか」です。つまり、どんなゴールをイメージしているのか。これが、人によって意外と違います。プログラミングの学習を始める場合、一番の違いは、プロとしてプログラマーになるか、ならないかという点でしょう。

◆プロフェッショナルを目指さないパターン

プロフェッショナルのプログラマーを目指さないパターンは、次のように結構いろいろあります。

・プログラミングに憧れている
営業や事務の人が、これから役に立ちそうなスキルとして、プログラミングに興味を持っているという感じですが、具体的にこんなものを作りたいとは思っていない感じです。

・作ってみたいプログラムがある
ゲームやWebサービススマホアプリなどを実際に作ってみたいといった、具体的に作りたいプログラムのイメージを持っているパターンです。自分の関わっている業務や研究を改善したいというように、半径5メートルの問題で必要になるプログラミングもあります。

・プログラミングを理解しておきたい
業務に関連した知識として、プログラミングを理解しておきたいという人たちもいます。IT/Web企業の営業やデザイナ・マネジメントの人は、自社のビジネスのために、どのようにプログラムが開発されるのか理解したり体験しておくと役に立ちます。

・自社サービスのプロトタイプ開発
最近流行のスタートアップ企業などでは、自社の起業のネタを実現するため、起業家が自分で開発するという場合も増えてきています。

このように、プロフェッショナルなプログラマーを目指さないけれど、プログラミングをやってみたい、身に付けてみたいという人たちは、たくさんいます。

プロフェッショナルにならないのであれば、実は、自分でプログラミングを覚えなくても、課題が解決できる場合も少なくありません。作ってみたいプログラムがある場合、既存のツールを組み合わせたり、パッケージソフトを使ったり、外注でシステム開発したりすれば済んでしまうこともあるでしょう。ゲーム作りなどは、Unityツクールシリーズのような作成ツールを覚えるほうが簡単でしょう。Webサービスを作りたいという場合も、SEOやマーケティングや顧客サービスを理解するほうが重要かも知れません。

プログラミングを学習する目的が、ゲームデザイナーになりたいという場合、そもそもその職業の定義や範囲が変化しかかっているかも知れません(課金・結婚・マネタイズが変えた時代の波 とある「ゲームデザイナーの死」 - Togetterまとめ)。

◆プロフェッショナルを目指すパターン

さて、プロフェッショナルのプログラマーを目指すというように目標が明確な場合は、どんなプログラムを作る人になりたいのかが重要です。ゲーム開発業界と、販売管理システムのような業界は、まったく別物です。家電のように、ハードウェアに近いレベルのプログラミングが求められる企業もあります。大学や研究機関で、コンピューターを使ったシミュレーションをしたいといったアカデミックな世界もあります。目標とするプログラマーの技術レベルによっても、学習の進め方が違ってくるでしょう。

もちろん、プログラマーとして就職したいと思っているけど、どんなプログラムを作りたいか分からないという人もいるでしょう。

◆目標がはっきりしないパターン

そして当然ですが、プログラマーになりたいのか、なりたくないのか、明確なイメージを持っていない人もいるでしょう。プログラミングの学習を始める前、プログラミングの全体像をわかっていない時に、"目標を持とう!"といっても無理な話です。

その場合も「目標を持っていない」ことを自覚することは重要です。なぜなら、目標が不明確な人に、具体的なアドバイスをしても意味がないからです。そもそも、目標が不明確なら、挫折なんかしないような気もしますし、それは、それで良いと思います。そういう場合は、興味がある領域について、まずは気軽に体験してみるのが良いんじゃないでしょうか。

■プログラミング学習のスタート地点

f:id:paiza:20151028110544j:plain
Photo by Michael Veltman
もうひとつ、何かを始めるときに確認しなければならないのは、自分自身のスタート地点です。自身の適性やスキル・環境・これまでの経歴といった、現在の状況を再度チェックしましょう。

たぶん、プログラミングの学習に興味を持つ人には、こんなふうに幅があると思います。

・社会人(IT/Web企業、それ以外)
・大学/高専(IT系、IT以外の工学・理系、文系)
・高校生(普通科、工業科)
・小中学生

その中で、具体的には次のような違いがあります。たとえば、大学や高専であれば、IT系とIT以外の工学・理系もありますし、文系でも、比較的数字を扱う機会の多い経営学や数学・哲学と、それ以外では適性がかなり違います。また、社会人であっても、すでにIT/Web企業に務めているのであれば、身近に質問したり、アドバイスしてくれる人がいると思います。今は、そういう企業に勤めていないけど、スキルアップや転職のためにプログラミングを身に着けたいという人もいるでしょう。小中学生であっても、プログラミングに興味を持つのは、理科や科学に興味を示す持つような人が多いのではないでしょうか。

こういった知識と環境によって、プログラミング学習にかける、時間とお金がまったく違ってきます。つまり、どのくらい投資できるのかが異なるのです。また、この後で見ていくようにプログラミング学習の方法でも、主となる対象者が異なっています。自分のたち位置を把握してないと、自分の適性に合った学習方法を選ぶことができません。

■プログラミングを独学で学ぶ

では、プログラミング学習の目標とスタート地点を整理したところで、実際の学習方法について考えてみましょう。

プログラミング学習を始めようとする場合、大きく2つの方法を思い浮かべるのではないでしょうか。これが、一番の違いだといっても良いと思います。それは、独学するか、そうでないかです。

独学とは、コーチを付けたり学校に行くなどせず、何を学習するか自分で考えて、自分のペースで勉強することです。プログラミング学習の場合、手ごろな教材がたくさんあるので、簡単に独学を始めることができます。

たとえば、Nintendo 3DSのプチコンのようなオモチャ感覚のものから、本格的なSNSを作るRailsチュートリアルのような本格的な教材まで、幅広いレベルの教材が簡単に入手できます。Amazonを見れば、ゲーム開発入門のように目標が明確なものから、オライリーブックスのように、そのツールの開発者自身が書いた分厚い解説書まで、膨大な書籍が手に入ります。

◆独学の利点と欠点

独学の利点は、さほどお金がかからない点です。無料で入手できるツールや教材もたくさんありますし、書籍も数千円で購入できます。無料で使える開発ツールも増えてきました。

一方で、独学には、次のような欠点があります。

・些細な点につまずく
・問題があったとき、アドバイスを受けにくい
・何を学習すればいいのか分からない。学習する範囲が狭くなる

お金や時間をかけられず、独学を選ぶ人は少なくないと思いますが、目標を達成するには、これらの欠点を乗り越えて、どうやって1万時間を確保し、モチベーションと環境を維持するのか、といったところがカギになると思います。

■プログラミングを独学以外で学ぶ

では、独学でなく、学校などで学ぶ場合について考えてみましょう。

こちらも、次のように、たくさんの手段があります。

・オンライン学習サービス
・社会人向けスクール
・IT系専門学校
・公的な職業訓練
・大学/大学院
・社会人大学/社会人大学院

最近は、paizaラーニングのようなオンライン教育も増えてきました。有料のオンライン学習サービスの場合、200時間で10万円程度の費用となっています。

リナックスアカデミーやヒューマンアカデミーなど、社会人向けスクールにも、プログラミングのコースがあります。80~150時間の授業で、年間30万円程度の費用がかかります。

デジタルハリウッドやHALのようなIT系専門学校には、システム開発などのクラスがあります。2年間で、200~250万円程度の学費が必要です。

もちろん大学などの高等教育機関もありますし、社会人大学・社会人大学院などにより社会人の受け入れも始まっています。大学の場合、4年間で、国立で215万円程度、私立で500万円程度の学費がかかります。

学校などに通ったり、オンライン学習サービスでもチャットでアドバイスを受けられるのであれば、独学の欠点を解消できます。些細な点でつまづいてもアドバイスが受けられますし、体系的なカリキュラムで幅広い領域を学習できます。特に、大学や専門学校などで、数年間プログラミングを学べば、1万時間のかなりの部分に取り組むことができます。そのあと、プログラマーとして就職すれば、確実に実績を積み上げることができるでしょう。

しかし、欠点もあります。まずは、お金と時間がかかること。数年に渡って大学や専門学校に通うのは、時間もお金もかかります。すでに、社会人になっているなら、そこまでコストをかけるのは、かなり大変でしょう。

それから、もうひとつの欠点は、自分の目標とコースが合致しているか、事前に判断することが難しいという点です。高いお金を払って専門学校に行ったけど挫折したなんて話は、ゴロゴロ転がっています。目標とコースが一致していなければ、勉強が惰性になってしまうこともあるでしょう。

ただし、費用については、補助が受けられる場合があります。公的な職業訓練を行っている「高齢・障害・求職者雇用支援機構」(独立行政法人 高齢・障害・求職者雇用支援機構)にも、プログラミングのコースがあり、交通費や受講手当が支給されるそうです。厚生労働省教育訓練給付制度(教育訓練給付制度について |厚生労働省)も利用できる場合があります。

■プログラミング学習のマインドセット

f:id:paiza:20151028111641j:plain
Photo by Judit Klein
では、このように難しいプログラミング学習を成功させるには、いったいどうすればいいのでしょうか。それには、次のように2つのポイントがあると思います。

ひとつは、目標と自己投資のバランスです。

プログラミングを趣味的にかじってみたいというだけなら、ネット上の無料コンテンツで十分でしょう。世界で活躍できるプログラマーに、数千円の書籍だけでなろうとするのは、相当の適性と自己鍛錬が必要でしょう。

もうひとつ重要なのは、プログラミングを学習するためのマインドセットです。

本来、プログラミングとは、ITによる課題解決です。課題解決能力は、受身で教えてもらおうと思っても身につきません。学校に行ったり、有料のオンライン学習サービスを利用したりすれば、独学の欠点は解消されますが、お客様感覚では、その環境を有効活用できないでしょう。

目指すレベルにも寄りますが、そもそもプログラミングの学習範囲は広く、プロフェッショナルのプログラマーになるためには、フルタイムで数ヶ月から数年の学習期間が必要とされます。そんな期待の新人でも、現場では即戦力になるとは限りません。ジャンルによっては、対象業務に対する知識や経験も必要になるからです。また、IT自体に常に技術革新があり、それを追っかけることも不可欠です。

プログラミングの学習方法についても、心の折れない方法を自分で見つける地頭の良さが必要になるのです。

■本当に必要なプログラミング学習の手法

というように、プログラミング学習のハードルの高さばかり強調しても仕方ありません。

そこで、注目したいのが「反転授業」(反転授業 - Wikipedia)や「アクティブラーニング」と呼ばれる学習手法です。

通常の授業では、学校で講義を聴き、自宅で宿題を解くというパターンが一般的です。これに対して反転学習では、自宅でネット動画などで講義を聴き、学校では先生の指導を受けたり、集団でディスカッションしながら課題に取り組むというものです。

このような取り組みがあれば、プログラミング学習につき物の、腑に落ちない点があっても「それは深く考えなくても良い」というアドバイスをもらうことができます。プログラミングを独学する場合にも、独自に取り込むようにしてみてはどうでしょうか。たとえば、次のような相談サービスやQ&Aサービスが活用すれば、独学でも、指導者によるアドバイスや集団活動を受けられます。

◆相談・コミュニティサービス

◇TimeTicket (タイムチケット) - プログラミング

https://www.timeticket.jp/items/category/search/2

◇ココナラ | IT・プログラミングの相談

http://coconala.com/categories/11

◇pgcolony | プログラミングの師匠や仲間と出会える

https://pgcolony.com/

◆Q&Aサービス

◇スタック・オーバーフロー

http://ja.stackoverflow.com/

◇QA@IT - ITエンジニア向け質問・回答コミュニティ

http://qa.atmarkit.co.jp/

◇teratail【テラテイル】|思考するエンジニアのためのQAプラットフォーム

https://teratail.com/

facebookSNSで、仲間を集めてもいいでしょう。また、paizaラーニングでも、エンジニアに不明点を質問できます。Yahoo知恵袋などの一般向けのQ&Aサービスや2chにも、意外とプログラミングの質問が上がっていることがあります。

さらに、自分の達成度を客観的に測定することも不可欠でしょう。自分の実力も分かりますし、仲間と共通の課題にチャレンジするとき、目標のひとつになるでしょう。そのために、次のようなサービスが利用できます。

◇paiza - 自分のプログラミング力をこっそり腕試しできるサービス

http://paiza.jp/

◇CodeIQ|ITエンジニアのための実務スキル評価サービス

https://codeiq.jp/

◇ITエンジニアのレベルアップに最適!競技プログラミングサイト10選 - paiza開発日誌

paiza.hatenablog.com

また、学生向けにはプログラミングコンテスト(プログラミングコンテストまとめ - NAVER まとめ)なども多数開催されています。

当初の目標を達成するためには、自分の実力をアピールする必要もあるでしょう。特に、プロフェッショナルなプログラマーを目指すなら、履歴書や職務経歴書だけでなく、自分の実力を見せることが近道です。Githubpaiza.IOのようなコード共有サービスを利用したり、Qiitaといったプログラミング知識の共有サービスを使っても良いでしょう。自分でWebサービスを公開することも、かなり効果があります。

このように、相談相手や仲間を確保したり、自分の実力を確認する手段を用意すれば、独学であっても、つまづきやすい点を解消したり、モチベーションを維持することが、比較的容易になると思います。

プログラミング学習というと、ついついインプットの方法を考えてしまいますが、アウトプットやコミュニケーションの方法を変えることで、心が折れにくい方法に変えていけるのではないでしょうか。



paizaではスキルのあるエンジニアがきちんと評価されるようにし、技術を追い続ける事が仕事につながるようにする事で、日本のITエンジニアの地位向上を図っていければと考えています。特にpaizaではWebサービス提供企業などでもとめられる、システム開発力や、テストケースを想定できるかの力(テストコードを書く力)などが問われる問題を出題しています。

テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

また数多くの自社サービス提供企業、webサービス提供企業の求人を掲載しています。

http://paiza.jp