超入門　プログラミング勉強法

#１　はじめに
「超入門　プログラミング勉強法」について紹介します。

この内容は、プログラミングのモチベが続かない、挫折してしまうという時にどうやったら挫折しないで、モチベを継続させて勉強できるのかについて紹介する記事です。

#プログラミングが続かない理由
個人的には

* 環境構築ができない
* プログラミングの師匠が見つからない
* モチベが続かず、３日坊主になる
* (オンライン教材、入門書、応用書、公式ドキュメントの)何から勉強すればいいのか分からない
* 何の言語を勉強すればいいのか分からない。
* 基礎(例：配列、基本構造、選択構造、反復構造、例外処理、オブジェクト指向、コレクション、DB連携、Web APIの使い方etc)を理解した先に何をすればいいのか分からない。

沢山の理由がありますし、実際にこの中で自分が経験したことがあったり、友人からも相談を受けたことがあります。
今回は、あまり多いと飽きるので３点に絞って紹介します。

今回紹介する内容は、以下の３点です。

1. モチベが続かず、3日坊主になる
2. 何から勉強すれば良いのか分からない。
3. 基礎を理解した先に何をすればいいのか分からない。

#モチベが続かず、3日坊主になる
###◯原因

1. プログラミングを何のためにするのか明確になっていない
2. いつまでに何をするかの期限が区切っていない
3. なぜか心が折れてしまう

１は、自分が高校２年生の時にエクセルでプログラミングができるのかーと知り、VBAを学習していた時に、何のために学んでいるんだろういう目的意識が弱かったため、学習スピードが遅かったという経験があり悩んだ時期がありました。
また、知っている方の中ではせっかくプログラミングを始めたのに、を勉強したものの「稼ぎたいから」や「イケてる」からという抽象的なものであり、つまらなくなりやめてしまうという人がいました。
2は、単純で、学校の夏休みの宿題なんかを思い浮かべて欲しいのですが、どうせ、最終日に宿題をすればいいやーって実質期限を切らずに、ノープランで宿題をやってしまうとどうせやらなくてもいいだろうとなりますよね。
同様でプログラミングの学習も、これやりたい、あれやりたいって決めても期限を設けなければ、どうせ後でやればいいだろうとなってしまいやらなくなります。
３は、何か新しく物事を始めるときって、車がエンジンをかけてからしばらく加速しないのと同様に、莫大なエネルギーを使います。
辛く、全然覚えられない状況が続いてそれに耐えられなくてモチベの減少に繋がります。
###◯解決策
**1の解決策：明確な目的を立て紙に書く**
これは、プログラミングを学習した先にどういう自分になっていたいかやどんなサービスを作りたいのかというのを紙に書き出し、いつでも見返せるようにするということが大事です。
例１：家でも職場でもコードを書き続け、x万人以上の役に立てるサービスを作り続ける自分になる
例２：TwitterやFacebookのような世界中の人々のコミュニケーションのハードルを下げ円滑にするプラットフォームを作成する。
モチベが下がったときに見返すと、目的を達成するために頑張ろうという気持ちになりモチベが続きやすくなります。また、目的という自分の芯があるため、わりかしブレずに学習を続けられます。

**2の解決策：目的に対して細かな小さな目標を立てそれに対して期限を設定**
先程の、例1の目標に対し、小さな目標として下記のように小さな期限を設定していきます。

* 2017年3月12日までに◯◯のオブジェクト指向完全に理解
* 2017年4月20日までに◯◯の言語仕様を最低3人にアウトプット
* 2017年10月13日までにクイズゲームを作り、友人5人に遊んでもらう

期限が区切られているので、いかに期日までに目標を達成するかに脳がシフトするのでやる気が継続します。

**3の解決策：自分にご褒美を設定したり、自分を褒める。**
挫けてしまいそうになった時、自分にご褒美や自分のを褒めるのが大事です。
褒める基準がわからない場合は、

* 「１時間プログラミングの勉強した。偉いな俺」
* 「今日は、変数を理解した。１日１個ずつ理解したら、１年で３６５個理解できる。才能あるかもしれない。」

勉強した事自体や、昨日よりも覚えることがあったレベルでいいので褒めてあげてください。前向きになりモチベが上がります。
後は、ご褒美はハーゲンダッツを個人的には推します。

#何から勉強すれば良いのか分からない
###◯原因
1.勉強できる教材が多すぎる
2.イメージが湧きづらい
１は、ありがたいことに、オンライン教材や、技術書、公式ドキュメントにありふれています。
自分の場合は、読書が趣味なので時間はかかるものの割と技術書読んでいるのでわりかし勉強できます。
しかし、中には、何から勉強すればいいのか分からずに、プログラミングに取り掛かることができない方がいました。
２は、入門書はとてもわかりやすいのですが、一番最初だと入門書とはいえ新しく学ぶことなので、なかなかイメージが膨らまなかったりして心が折れてしまうケースを聞いたことがあります。
###◯解決策
１、２の解決策：Progate有料１ヶ月→入門書１、２冊→応用書１冊、公式ドキュメント
何で、Progateなのかという感じですが

* 環境構築がいらない
* すぐに結果が出たり、掲示板などを作るため実際イメージが湧きやすい
* 基礎の基礎が理解できる
* ゲーム感覚で楽しめる。

などなど初心者に適してると実際に触ってみて思いました。
それで、私も一時期Progateにとてつもなくハマった時期があり、256LVまで気づいたらレベルが上がりました。
しかし、あくまで、入門者向けや、新しい言語のイメージをつける時に効果があると感じているので、やりすぎた感はありました笑
<img width="1680" alt="スクリーンショット 2018-12-15 16.04.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/299197/da4655a2-7a95-4259-7d98-e58e24f7efe2.png">
オススメの技術書を聞かれることが多いので、せっかくなので１つだけ紹介します。
鉄板中の鉄板の本ですが、リーダブルコードです。
実際に、プログラミングをする時はチーム開発が基本なので、誰が見ても理解しやすいコードを書くかが重要です。
例えば、わかりやすい例をあげると

* Aさんが社内用のアプリを作った→Aさんが退職してしまった。→社長にAさんが作成した社内アプリの機能を拡張してほしいと要望を受け、Bさんが機能拡張をすることになった。

そうなった時に、下記のようなソースコードをAさんが作ったとしたら、BさんがAさんが作ったソースコードを拡張していくときが大変ですよね。

* 変数やメソッドの命名が抽象的すぎてわかりにくい
* インデントがぐちゃぐちゃ
* コメントの意図が分からない
* ネストが深い

リーダブルコードではプログラミングをする上での命名規則やコードを書く際の考え方を解説しているのでオススメです。
ただ、初心者には少し難しい内容になっている部分もあるので、入門書を何冊か読んでから読んでみるのもいいのかなーと感じます。
https://www.oreilly.co.jp/books/9784873115658/

#基礎を理解した先に何をすればいいのか分からない
###◯原因

1. 自分が勉強していたプログラミング言語が何ができるのかが本当の意味で知らない
2. 制作物を作っていない。

実際に私が高校１年生の時に悩んでいたことで、COBOLという事務処理系の銀行で、使われることが多いとても古い言語を学習した時期がありました。
その時に基本的な知識の習得はできましたが、結局COBOLの学習をした先に何ができるのだろうと思った時期があり、COBOLへの学習意欲が消滅しました。

また、弟や友人からプログラミングって勉強した後に何をすればいいのーって質問や相談を受けたことがあったりするので、悩んでいる人が多い印象を受けます。

###◯解決策
#### **実際に制作物を作る**
まず、制作物を作るぞと決めた段階で言語、フレームワーク、サーバー等はどうするのかを決めることになります。
そのため、必然的にそれらの技術の勉強をするようになります。

何の言語から勉強すればいいか分からないの解決にも繋がります。
怒られそうですが、プログラミングはあくまで目的ではなくてシステムを作るための手段です。
例えば、ラーメンを食べる時にスプーンを使わない、ゼリーを食べる時に箸を使わないのと同様に、iPhoneアプリ開発にPHPは使用しないですし、Webアプリ開発にSwiftは使用しないはずです。
そのため、作りたい制作物が適している言語、フレームワークを選んで作っていくのがいいと思いです。
作ってみて環境構築ができない、４０４エラーで画面遷移しない、500エラー連発、JSファイルが読み込まない、DBにinsertした文字列が文字化けしているなどなど、多くの問題に直面します。
それらを１つずつ乗り越えていくことによって成長につながります。
だからこそ、実際に制作物を作ることは大事です。
ただ、何を作ればいいかわからないという方もいると思うので何個か例を挙げます

* ログインログアウトが可能な掲示板
* 擬似的な商品の一覧を見たり、商品在庫、売り上げなどを管理するシステム
* クイズゲーム
* オセロゲーム
* Twitter、Insrtagramっぽいやつをローカル環境で構築

#まとめ
###◯プログラミングの明確な目的を立て紙に書く
###◯Progate有料1ヶ月→入門書→応用書
###◯実際に制作物を作る