プログラムを始めるときの勉強方法

# はじめに
自分がプログラミングを始めた10年ぐらい前にはプログラミング言語の本を買って読みながら本に書いてあるサンプルのコードを書くといういわゆる写経と呼ばれるものがデフォルトでした。
それと比べて今はソースが公開されていたり勉強用の動画など色々選択肢が増えたので、改めてプログラムの勉強について自分なりの方法を考えてまとめました。
これからプログラミングをしたい人やどんなプログラミングの勉強をすれば良いのかわからない人が参考にしてもらえたらうれしいなと思います。

# 勉強手順
いきなり勉強の手順を記載していきます。詳しいことは後で記載しますので何となく雰囲気をつかんでもらえたらと思います。
ここで一つ言いたいことはアルゴリズムやデザインパターンは、少なくともプログラムで簡単なアプリが作れるようになってからの方が良いので先に言語の勉強をした方が良いと思います。

1. 自分の学習の傾向を考える
2. 1の結果、積み立て型の考えのときの学習
 1. チュートリアルや動画を元に勉強する
 2. チュートリアルや動画の意味が分からないときはさらに細かく分解して、そのチュートリアルや動画を元に勉強する
 3. 公式のチュートリアルプロジェクトと同じ機能のものを自分なりに作る
 4. 作ったものとお手本にしたものを見比べて、相違点を元に勉強する 
3. 1の結果、分解型の考えのときの学習
 1. 公式にある複合的な要素のあるプロジェクトをそのまま実行できる環境を作る
 2. 1のソースを上から1行ごとに処理を変更して実行結果の相違を見てみる
 3. 2の処理の意味を調べてコメントに説明を記載する
 4. 全ての行にコメントをつけられたら上からコメントとソースを見る
 5. 1と同じ機能のものを答えを見ずに作成する
 6. お手本にしたものを見比べて、相違点を元に勉強する 
   
図にすると次のような感じです。実にシンプルです。

![スタート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481713/f10084be-22a7-016b-123b-7417c538857c.png)


# 勉強手順詳細
## 自分の学習の傾向を考える
プログラミングの勉強の前に自分の学習の傾向を考えてみます。勉強に入る前に難しいことを考えてしまうとやる気が伏せてしまうので、考えると言っても小難しいことをする気はありませんし難しいことをしてはいけないと思います。

### 自分の学習の傾向を考える例
例を先に上げた方がわかりやすいと思うので先に例を挙げます。例の説明は次でするので、ここではふーん程度に見てもらえればと思います。

1. 「ページ機能のある表のWeb画面」と「FlaskのREST API」を実装するときに調べる順番をイメージする
2. 「Web画面のページ機能」で調べた後に「Web画面の表」を調べる
3. 2のときは「積み立て型の学習」だとわかります

### 自分の学習の傾向を考える例の説明
#### 1. 「ページ機能のある表のWeb画面」と「FlaskのREST API」を実装するときに調べる順番をイメージする
1は「AなBのやりかた」や「AとBのやりかた」のような複合的な要素を自分ならどう調べるかを考えています。今回は2つしか書いていないですがもっとたくさんのパターンを考えてみると、より良く自分の考え方が見えてくると思います。
例ではプログラミングの内容で記載しましたが、自分の考え方なのでプログラミングでなくても全然問題ないです。たとえば、「折り紙で兜と鎧をつくる」など複合的な要素があるものを調べるものを考えれば良いです。

#### 2. 「Web画面のページ機能」で調べた後に「Web画面の表」を調べる
例では問題を分解して、分解した内容を順々に調べています。その調査方法に従って、新しく学習するときは一番小さい単位からコツコツ学んでいき、徐々に学んでいく内容を増やして、最終的には学んだ小さいものを組み合わせて大きなプログラムを作る方が考えに沿っているはずです。

#### 3. 2のときは「積み立て型の学習」だとわかります
2でも記載しましたが、小さいものを組み立てて知識をつけるので2の場合は「積み立て型の学習」だとわかります。また、小さいものから学んでいく流れから一切勉強方法がわからないという人もこちらの方が良いと思います。
一方で「ページ機能のあるWeb画面」をそのまま調べる場合は、まず作りたいものの全体像から調べていることから、答えから逆算して細かい部分の理解につながる考え方が沿っているはずです。また、こういう調べ方をする人は。まず結果を求めているので説明や知識のみの調査を十全にしてから実物を作るというよりは、最初に実物があってそれを変更して理解を深める方が良いと思います。


## 積み立て型の考えのときの学習
### チュートリアルや勉強動画を元に勉強する
積み立て方の考えの学習は小さいものから学んでいくので、本や公式のチュートリアルや勉強動画などを見ながら説明にあるコードを作成して学んでいきます。
ただ、学びたいものチュートリアルを見ても分からないことや勉強動画がないなどの場合は、手を動かすのをやめて分からなくても良いので一度軽くチュートリアルや動画を見ます。それにより、使われ方の共通点などからわかないことの理解ができたり、分からないことの分からない点がはっきりすることがあるので分解して学ぶときに助けになります。

#### チュートリアルと勉強動画の勉強順番
順番としてはチュートリアルを最初に見て、理解できないときは勉強動画を見るほうが良いと思います。勉強動画は丁寧なのですが丁寧すぎてテンポが悪いのでチュートリアルがわかるときは純粋にチュートリアルをした方が時間的にも自身の学習ペース的にも良いです。

### チュートリアルや動画の意味が分からないときはさらに細かく分解して、そのチュートリアルや動画を元に勉強する
学びたいものの勉強が出来なかったので、細かく分解してそれぞれについてチュートリアルや勉強動画を見て、手を動かしながら学んでいきます。
例えば、Flaskを学びたいけどチュートリアルが良くわからない場合は、Flaskのチュートリアル通りのコードを書くのをやめて一通りチュートリアルを読み、Python・Html・JavaScript・CSSに分解してそれぞれのチュートリアルを学んでからFlaskを再度学びます。

### 公式にあるチュートリアルのプロジェクトと同じ機能のものを自分なりに作る
### お手本にしたものを見比べて、相違点を元に勉強する 
ここまでで学びたいものの雰囲気や簡単なアプリを例を見ながら作れるようになっていると思います。次は手を動かすことをメインにした学習になります。
公式のチュートリアルやGitHubなどコードが公開されているものと同じような機能を持ったコードを、例にしたものを見ずに作成します。作成した後に見比べてその違いから自身のコードの悪い点を学んでいきます。


## 分解型の学習
### 公式にある複合的な要素のあるプロジェクトをそのまま実行できる環境を作る
### 1のソースを上から1行ごとに処理を変更して実行結果の相違を見てみる
### 2の意味を調べてコメントに説明を記載する
分解型の学習の時は全体像から細かく学んでいくので、まずは公式にある複合的な要素のあるプロジェクトをローカルで実行できる環境を作成します。環境ができたら、そのプロジェクトのソースを上から順に処理を変更して実行結果の相違から処理の意味を憶測した後に、調べてコメントに処理の内容を記載していきます。

### 全ての行にコメントをつけられたら上からコメントとソースを見る
全ての行にコメントをつけられたらコメントとソースを読み、処理の流れを理解します。ここで気を付けてほしいことはソースの流れを理解するのではなく、処理の流れを理解する点です。例えば、FlaskならばPython -> Html -> JavaScript -> Pythonの順にコメントとソースを見ながら理解を深めます。

### 1と同じ機能のものを答えを見ずに作成する
### お手本にしたものを見比べて、相違点を元に勉強する 
ここまでで、例にしたプロジェクトの理解ができたためプロジェクトを見ないで自分なりに同じプロジェクトを作成します。作成後はお手本を見ながら自信のコードの悪い点を学んでいきます。


# 終わりに
今回は、プログラムの勉強について考えたことをまとめてみました。究極的に手を動かさないと身にならないため最終的にはコードを作るに落ち着きました。
ここでは最初にプログラムを勉強する人を対象にしているのでアルゴリズムやデザインパターンを取り上げてないですが、この2つを知っていると知らないとでは雲泥の差があるので言語の勉強が出来たら次に勉強をすることをお勧めします。