未経験者からプログラミング習得までのプログラミング学習カリキュラム


現在、プログラミング未経験者をエンジニアに就職サポートまでしているスクールで講師をしています。
今までの講師としての経験から考えた現時点でベストだと思うプログラミング学習カリキュラム、及び学習方法を書き残しておきます。

私がいるスクールでは現状は大体ここに書いてある感じで進めてます。
エンジニアに就職したい人、プログラミングスクールを検討している人、スクールはいかないけどプログラミングを学びたい人などへの参考になればと思います。

ちなみに、ここでいうプログラミング習得は、
1人の力で簡単なWebアプリケーションを1から作成できるレベルとします。
そのくらいの技術が身に付けば、未経験からエンジニアへの転職もしやすくなるかと思います。


## プログラミング習得の速さ

本題に入る前に、プログラミングの習得の速さについて書いておきます。
当然のことですが、プログラミングの習得のスピードは人によって差があります。
私の経験上、習得のスピードは以下の式で決まります。

**プログラミングへの興味 × モチベーションの高さ × 基礎学力**

### プログラミングへの興味
これがおそらく一番大事です。興味があるかどうかで、学習した内容の吸収度合いが大幅に変わります。
中学高校で6年間英語を勉強しても英語ができるようにならないのはほとんどの人が中学高校の時に英語に興味がないからでしょう。
プログラミングも同様で、興味がなければどれだけ時間をかけても習得のスピードは遅いです。
なので、プログラミングには興味がないけれど、給与がよいからエンジニアになりたい、という気持ちでプログラミングを学習するのはやめた方がよいでしょう。

### モチベーションの高さ
学習を継続できるかどうかに大きくかかわります。「こんなエンジニアになりたい」「エンジニアになってこういうことをしたい」「こんなシステムを作りたい」というような明確な目標があるとモチベーションを維持しやすいです。

### 基礎学力
ここでいう基礎学力は「国語」「数学」「英語」です。国語といっても古文とか漢文とかはあまり関係なく、必要なのは読解力と語彙力です。
高校レベルの国語、数学、英語ができていれば、プログラミングの基礎を理解するのはさほど難しくないでしょう。逆に中学レベルの国語、数学、英語があやしいという人はプログラミングができるようになるまでは相当時間がかかると思ってください。


この「プログラミングへの興味」「モチベーションの高さ」「基礎学力」の3つの要素が習得のスピードに影響します。


## 1日の学習の流れ

ここでは1日8時間学習することを想定した1日の流れを紹介します。

①　09：00～09：30　タイピング練習（e-typing）
②　09：30～10：00　頭の体操（ナンプレ）
③　10：00～12：00　プログラミング学習
④　12：00～13：00　休憩
⑤　13：00～13：30　タイピング練習（寿司打）
⑥　13：30～14：00　頭の体操（ルービックキューブ）
⑦　14：00～17：30　プログラミング学習
⑧　17：30～18：00　振り返り


### タイピング練習（①、⑤）
ご存知だと思いますが、プログラミングはPCで作業します。
PCの操作に慣れていれば学習効率も上がります。
逆に慣れていないと、学習効率が悪い上に一つ一つの操作がストレスになってモチベーションも下がります。
そんなわけでタイピングスキルは真っ先に習得しておきましょう。

目安としては、
・[e-typing](https://www.e-typing.ne.jp/)でA以上
・[寿司打](http://typingx0.net/sushida/)の5000円コースでプラス2000円以上
のスコアがコンスタントに出るくらいであれば①、⑤、は省略してもいいでしょう。

タイピング以前にパソコン操作全般が苦手という人は、
お使いのOS（WindowsかMac）の入門書を1冊購入して読むことをお勧めします。

### 頭の体操（②、⑥）
プログラミングは知識ももちろん重要ですが、それと同じくらいロジカルに考える力が重要です。
ロジカルに考えることが苦手という人は、ナンプレやルービックキューブのような、
頭を使うパズルゲームを毎日実施して頭を柔らかくしましょう。
スマホのアプリなどでそういうゲームを探すのも良いかと思います。
数学が得意だったり、パズルゲームが好きで得意、という人はこの部分省略可です。

### 振り返り（⑧）
学習を終えたら20～30分で振り返りの時間を作りましょう。
具体的には、

・その日に学習したテーマ
・学習したことの詳細
・理解したこと
・理解できなかったこととその原因分析
・質問したいこと
・その日の感想

などを文章で書き残していきましょう。
復習になって記憶の定着率が上がりますし、文章でアウトプットすることで理解が深まります。

### プログラミング学習（③、⑦）
実際にプログラミングを学習します。
細かいカリキュラムは下に書くとして、実施していることとしては、

・動画教材による学習
・テキスト教材による学習
・個別指導での不明点の解消
・演習の実施とソースコードレビュー
・理解力確認テスト

などです。


## プログラミング学習のカリキュラム

プログラミング学習のカリキュラムの流れは以下のようになります。

・Webサイト
・情報処理
・プログラミング言語
・DB
・フレームワーク
・クラウド

### Webサイト
Webサイトの作成する際に必要となる以下の技術を学びます。

・HTML（Webサイトを作成する技術）
・CSS（Webサイトのレイアウトを整える技術）
・JavaScript（Webサイトに動きを与える技術）
・jQuert（JavaScriptを簡単に書けるライブラリ）
・Git（バージョン管理システム）

JavaScript・jQueryはこの段階では概要の理解だけで構いません。
JavaScriptもプログラミング言語の一つですが、プログラミング言語は別の言語で学ぶため、この段階では概要を理解し、コピペでやりたいことが実現できれば十分です。ハードルが高ければ飛ばしてしまっても構いません。

これらの学習を終えたら、自分が作成したいWebアプリケーションを考え、HTML、CSS、JavaScriptを使用してWebサイトを作成します。
その際、Gitを使ってバージョン管理を行います。
また、完成したWebサイトのソースは「GitHub」にアップし、「GitHub Pages」で公開してWeb上で見れるようにします。


### 情報処理
本格的にプログラミングの学習に入る前に、情報処理の大事な分野について、ITパスポートレベルでいいのでザっと学習しておきます。

・進数
・ハードウェア
・ソフトウェア
・OS
・ネットワーク
・セキュリティ

一つ一つ深掘りするときりがないので、エンジニアになったらそれぞれ必要な分野を本格的に学習してください。

### プログラミング言語
プログラミング言語は、Webアプリケーションの作成が可能な言語が学習します。例えば以下のような言語があります。
・PHP
・Java
・Ruby
・Python

私のいるスクールでは現状はJava（の基礎からJSP・サーブレットまで）を教えています。
オブジェクト指向を学ぶのに適しており、他の言語を学ぶときにも比較的スムーズに入れるであろうという点からJavaを教えていますが、この中では難易度高めのため、独学でやるならあまりお勧めはしません。
ぶっちゃけどの言語から学んでもいいと思っていますが、独学でやるならPHPかRubyが難易度的には無難かと思います。

### DB
データベースに関することを学習します。
・DB概要
・SQL
・データベース設計（主に正規化）
・DBとプログラミング言語の連携

データベースと言っても様々な製品があって、
・OracleDB
・SQL Server
・DB2
・PostgreSQL
・MySQL

などがあります。
私のいるスクールでは無償で利用できるPostgreSQLを使用しています。
SQLの基本を学ぶという観点ではどれでも大差ありませんが、
言語との連携など色々考えるとJavaやRubyを学ぶならPostgreSQLが無難かなと思います。
PHPを学習する場合はMySQLの方が良いかもです。


### フレームワーク
プログラミング言語とデータベースの基礎が身に付いたら、開発を効率化するフレームワークについて学習します。
うちのスクールでは言語としてJavaを学習するため、Javaで現在主流なフレームワークであるSpringを学びます。
それぞれ自分が学ぶ言語におけるもっとも主流なフレームワークを学習すればよいと思います。
RubyならRuby on Rails、PHPならLaravelあたりでしょうか。


### Webアプリケーション
フレームワークまでの学習を終えたらWebアプリケーションを作成します。
Webサイトを学習した段階で作成したサイトに、プログラムとデータベース（できればフレームワークも）を組み込み、Webアプリケーションとして完成させます。
どんなWebアプリケーションでも構いませんが、最低でも
・ユーザー登録・削除
・ログイン・ログアウト
・主要サービスにおけるデータのCRUD（登録・検索・更新・削除）
の機能は組み込みたいところです。
JavaScriptも積極的に使用し、クライアント側の制御や動きも充実させていきます。

完成したら、ソースはGitHubにアップします。
また、合わせてプログラムの仕様書とDB設計の仕様書（ER図、テーブル定義書）も作成してアップします。

### クラウド
完成したWebアプリケーションは、クラウド上にアップしてインターネット上から利用できる形にします。
時間とお金に余裕があるなら、Linuxについて基礎を学習します。
その後、AWS、またはAzure上でLinuxサーバーを構築し、その中で作成したWebアプリが利用できるようにします。

Linuxサーバー構築のハードルが高いようであれば、
Herokuを利用して、PaaS環境にWebアプリをアップ（デプロイ）します。


ここまで出来れば、それなりにプログラミングが身に付いたと言えるのではないでしょうか。


## 学習教材
スクールとか通わない人ように学習用のコンテンツもいくつか紹介。

・Progate
手を動かしながら学べるプログラミング学習サービス。

・ドットインストール
3分動画でプログラミングの基礎が学べるサービス。
HTML、CSS、JavaScriptなど、Web系のコンテンツが豊富。

・Udemy
動画コンテンツでの学習サービス。

・書籍
書籍は各分野でたくさんあるので、AmazonのレビューとかSNSとか参考にして自分に合いそうなやつを探してください。個人的にはWeb関連、プログラミング言語、SQLの分野でそれぞれ1冊は入門書読むことをお勧めします。

## 日々の習慣
最後に、本気でエンジニアを目指すなら身に付けておくと良い習慣について

### 何でもすぐに調べる
エンジニアにとっては検索力は非常に重要です。普段から気になったことや、知らない用語が出たらすぐに調べましょう。
調べる癖をつけつつ、検索力を上げましょう。

### ショートカットキーを探す
タイピングの練習は上に書きましたが、PCの操作を速くするにはそれだけでは不十分です。
作業を速くするためには、ショートカットキーの活用は必要不可欠です。
OSで利用できるショートカットキーや、普段からよく使用するツールでのショートカットキーは普段から調べながら使えるものを増やしておきましょう。

### IT関連の記事を読む
ITmedia、CodeZineなど、IT・プログラミングに関する情報を提供しているメディアをチェックして、気になった記事に目を通しておくと良いでしょう。
タイトルだけ眺めて知らない単語をチェックしていくだけでも、かなり知識が付いていくはずです。

---
以上です。
これからさらに改善案があれば随時更新していこうと思います。