プログラミングを3か月でマスターする方法

#初めに
プログラミングスクールなどで3か月で1人前のプログラマに！みたいな宣伝文句があります。実際に約3か月（100日）でプログラムを本当にマスターすることができるのか？その道筋を考えてみることにします。

プログラムをマスターしたいとのことで真剣に頑張ってもらうことにしましょう。3か月ちょっとで100日なので休みなく毎日10時間ということで100日×10時間頑張ってもらうことにします。

1. プログラミング言語の理解(20日)
2. プログラム設計(3日）
3. DBの理解(7日)
4. Networkの理解(10日)
5. WEBのフロントエンド(10日)
6. 各アプリケーション(10日)
7. クラウドの理解(20日)
8. Git(7日)
8. DevOps(3日)
9. AI(10日)


#オブジェクト指向のプログラムをマスターする
言語はC++、C#、Java、Python、Ruby、Swift、Kotlin、Rust、GoなどなどいろいろありますがC#でいってみましょう。


#C#(20日）
プログラミングの基礎概念を学び、各種の構文をマスターする必要があります。
・変数、条件分岐、繰り返し、メソッド(1日)
・メモリ(2日)
・ガベージコレクション(1日)
・各種構文(10日)
・ライブラリの理解(1日)
・正規表現(1日)
・スレッド(4日)

##変数、型(2時間)
まずは変数についてマスターしてもらいます。コンソールアプリを作り、変数の使い方を学びます。
また型についても知識を増やしていきます。Int32、Stringに始まり、Boolean,Double,Decimal,DateTime,TimeSpan,Guidあたりを理解します。

##条件分岐(2時間)
if、switchについて学びます。if-else if-elseを使えるようになり、switchとbreak, default,後で学ぶ例外を投げるなどを理解します。
またBoolean型、各種の演算子(&&,||など）の使い方を理解します。

##繰り返し構文(2時間)
while,for,foreachの構文を理解し、書けるようにマスターします。またそれぞれの違いと使いどころについても理解をしましょう。

##メソッド(4時間)
メソッドの書き方をマスターします。メソッドの引数、戻り値についても使えるようになりましょう。またオーバーロード、戻り値のタプルなどの使い方もマスターします。1日で変数、条件分岐、繰り返し構文、メソッドはマスターです！

##スタックメモリ、ヒープメモリ(2日）
変数やクラスのインスタンスがどのようにメモリを使用しているか理解します。変数宣言とメソッドコールによるスタックメモリの使われ方、参照型のヒープメモリの使われ方、Stringの不変性、配列の各要素のメモリ上のレイアウト、クラスのメソッドテーブルと継承時のメモリレイアウトなどをマスターします。学び始めて3日目にしてなかなかの難易度ですね！

##ガベージコレクション(1日）
ガベージコレクションについて理解を深めます。世代によるメモリ管理、参照があるかの検証、LOH、ファイナライザなどの動作を理解し、ハイパフォーマンスなプログラムが組めるようにしっかりと理解を深めましょう。昨日まででメモリの仕組みについて学んだのできっと簡単に理解できるはずです（笑）

##各種構文(10日)
学ぶべき構文を順番にマスターします。1個あたり2時間-10時間くらいで意味を理解し、構文が書けるようになりましょう。

###初日
class, struct
accessor(public, private, internal, protected)
property(getter, setter,Auto property, property initializer)
method (static, overload, override, abstract)
###2日目
Inheritance (virtual abstract)
Interface
try-catch-finally
###3日目
Generics
Nullable
Partial Type
Partial Method
###4日目
Extension Method
Lambda Expression
Object Initializer
Anonymous Type
###5日目
LINQ
null conditional operator
###6日目
dynamic, reflection
Partial method
option parameter
###7日目
async,await
nameof
exception filter
###8日目
Tuple
Type switch
local function
###9日目
Expression Tree
Span<T>
###10日目
il code

大量の構文がありますが書き方を覚え、使いどころを覚えてもらいます。なかなかの鬼畜スケジュールですが頑張ってもらいます（笑）

##ライブラリの理解(1日)
代表的なクラスライブラリについて使い方をマスターします。1項目当たり1時間程度でマスターし、いつでもどこでも使えるようになりましょう。
String,Int32,DateTime
Dictionary<TKey, TValue>,List<T>,Array
SqlConnection,SqlCommand...Entity Framework
Task<T>
ORMapper
HttpClient
HtmlAgilityPack,AngleSharp
File
Stream

#正規表現(1日）
Regexクラスを使った正規表現をマスターします。よく使う正規表現について全て理解してもらいます。頑張ってついていきましょう。


##スレッド(4日）
マルチスレッドプログラミングをマスターします。
・Monitorクラス、lock構文
・InterLockedクラス
・System.Collections.Concurrent名前空間
・Consumer/Producerパターン
・Join/Forkパターン
・Worker Threadパターン
1日あたり1個ちょっとくらいについて動作について理解し、実際にコードが書けるようになりましょう。マルチスレッドはなかなか難関ですが頑張りましょう。

#デザインパターン(3日)
とりあえずGoFのデザインパターンを2日で理解します。
Strategy
Template Method
Factory
Bridge
Builder
Singleton
Observer
Composite
Iterator
他

オブジェクト指向で重要な設計パターンについて学びます。1個1時間半くらいで完全に概念を理解し、実際にコードを書けるようになりましょう。
カプセル化
単一責任の原則
オープン/クローズドの原則
リスコフの置換原則
インターフェース分離の原則
依存関係逆転の原則

3日でこれらの設計パターンを理解するのは相当頭を回転させる必要がありますが、100日でマスターするためにはこのスピードで行く必要があります。頑張りましょう！

#DB(7日)
さてここからは分野を変えてDBについて勉強します。DBの各オブジェクト（Server, Database, Permission, Table, Column, View, StoredProcedure, StoredFunction, Constraint, PK, FK, Value)について理解し、SQLの構文に精通し、正規化の概念を理解してテーブル設計ができるようになる必要があります。

##正規化(3日）
正規化の概念について理解を深めます。
・第1正規系
・第2正規系
・第3正規系
・BC（ボイスコッド）正規系
・第4正規系
・第5正規系
・第6正規系
・主キー
・外部キー
・関数従属性
・部分関数従属
・推移的関数従属

ECサイト、掲示板サイト、タスク管理システム、オークションサイト、Q&Aサイトを実際に課題として正規化されたテーブル設計ができるようになりましょう。3日でマスターします。鬼畜スケジュールですが時間がありません！歯を食いしばってついていきましょう！！！

##トランザクションとロックヒント(1日)
トランザクションの概念（原子性、一貫性、独立性、永続性）について理解を深めます。ロックヒント、エスカレーション、ロックの解放のタイミングを理解し適切なトランザクションがかけられるように知識を深めます。

##インデックス(1日)
インデックスとクエリオプティマイザの動作について理解を深め、JOINの内部動作（Merge Join, Hash Join, Nested Loop）などについて理解し、最適なインデックスが設計できるように学びます。

##各種構文(2日)
DBを操作するSQLの構文を2日でマスターします。DDLに1日、DMLに1日の内訳です。

###DDL(1日)
Data Definition Languageについて1日でマスターします。
Table (Create,Alter,Drop) -- Column(PK,FK,Null,Constraint)
Stored Procedure
Stored Function
Constraint(PK, FK...etc)
View
User Defined Types
Table Value Parameter


###DML(1日)
Data Manipulation Languageについて下記の構文を1個あたり1時間くらいで理解し、書けるようになっていきましょう。
insert,update,delete
select
where
orderby
group by, Max,Min,Avg,Count
join
union
subquery
CTE
Row_Number,Lead,Lag,Rank,Dense_Rank,
文字列操作の関数
日付操作の関数
他

構文は書き方を覚えるだけなのでこの2日は一休みできそうですね（迫真）


#ネットワーク(10日)
DBをマスターしたところで次はネットワーク通信を構成する基本的な概念について理解し、実際にコードを書いたりツールで分析できるようになりましょう。また代表的なプロトコルがどのような仕様で通信するのか理解を深めましょう。

##TCP/IP(2日)
マスタリングTCP/IPを購入し1日で読破します。2日目に実際にFiddlerやWireSharkで通信を解析し、どのように通信が行われているか自分で確認して完璧に理解します。1日で読破し、翌日にツールをマスターという鬼畜スケジュールですが、時間が無いんです。頑張りましょう！！！

##Request,Reponse(1日)
WEBアプリケーションなどではリクエストとレスポンスという概念でデータのやり取りを行っています。C#のSocketクラスやTcpListnerクラスを使用して実際に自分でコーディングし、サーバーサイドプログラミングができるようになりましょう。余裕があればサーバーのリスナーで受信したリクエストをマルチスレッドで処理できるように実装をしてみましょう。C#はマスター済みだしマルチスレッドもやったことあるので簡単ですね（真剣）

##DNS(1日)
IPアドレスの名前解決について理解します。C#でDNSプロトコルを実装し、実際に通信を行ってドメインからIPアドレスを取得できるプログラムを書きましょう。

##HTTP(3日)
HTTPについて理解します。ヘッダーとボディ、HTTP Method、レスポンスコード、クッキー、認証、XMLHttpRequestによるAJAXなどについて3日で理解し、JavaScriptとサーバーサイドの言語で実際にHTTPのやり取りを実装できるようになりましょう。

##OAuth(1日)
OAuth認証について理解します。Facebook、Google、TwitterなどのAPIでOAuth認証を使用した認証を行うWEBアプリを実際に実装してみましょう。

##SMTP,POP3,IMAP,MIME,FTP(2日)
メールのプロトコルとMIME、FTPについて2日で理解しましょう。様々なプロトコルに触れることで、プロトコルの意味するものが何なのか理解できるようになります。

#WEBのフロントエンド(10日)
さて次はフロントです。HTML,CSS,JavaScript,TypeScript,フロントのフレームワークについて10日でマスターします。

##HTML(1日）
HTMLについて学びます。全ての構文とstyleについて1日で学びましょう。

##CSS(2日)
CSSのセレクタ、各種の構文を2日でマスターします。

##JavaScript(3日)
C#の理解を元に基本的な構文を1日でマスターし、AJAXやDOMの扱い方について2日目でマスターし、流行りのフロントエンドフレームワークを3日目でマスターします。

##TypeScript(1日）
よりタイプセーフな書き方ができるTypeScriptの構文全てを1日でマスターします。

##Vue.js(3日)
Binding,Routing,Templateなどを3日でマスターし、使いこなせるようになりましょう。

この10日は構文を覚えて使うことが中心なのでちょっとした休憩みたいなものですね。英気を蓄えこの後に備えます。


#アプリケーション(10日)
各種のアプリケーションを組めるように実習します。

##コンソール(1日）
コンソールアプリケーションを組んでみます。Console.ReadLine,Console.WriteLineを駆使してユーザーとやり取りできるアプリケーションを組めるようにスキルを身につけましょう。必要があればHttpClient、AngleSharp、DBとの連携もできるように知識を身につけましょう。

##WPF(3日）
Xamlについて理解します。Binding,Converter,ObservableCollection,PropertyChangedなどについて理解を深め使いこなせるようにします。
MVVMパターンをマスターし、高品質なWPFアプリケーションを組めるようになりましょう。

##Webアプリ(3日)
MVCパターンについて理解します。通常のGETリクエストに対してRazorビューでHTMLを返却してページを表示できるようになります。またJavaScriptからのAPI呼び出しに対するAPIを作成できるようになりましょう。

##モバイルアプリ(3日)
Xamarinを勉強しiOS,Androidのアプリを作れるようになります。基本的なXamlの書き方、モバイル特有のXamlをマスターし、端末固有の機能（GPS,カメラなど）を使いこなせるよう知識を身につけます。


#クラウド(20日)
時代はクラウドということでクラウドの各サービスの概要を理解し、実際に使えるようになりましょう。もうあまり日数がありません。1日1個のペースで全ての機能を理解して使えるようになりましょう。

##App Service(1日）
WEBサイトを構築できるようになりましょう。DevOpsからのデプロイ、スロット、自動スケールアップなど各機能を理解してマスターしましょう。

##Azure Function
サーバーレスについてメリットを理解し、実際にコードを書けるようになりましょう。Durable Functionsなどへの理解も深め、高度な活用方法が出来るようになりましょう。

##SQL Database
SQLデータベースを構築し、インデックスの推奨機能、自動スケールアップ、冗長性の確保、バックアップ、エラスティックプールなどについて理解を深め、完全に活用できるようになりましょう。

##BigQuery
SQLとの違いを理解し、適切に活用できるようにマスターしましょう。

##Notification Hubs
モバイルへの通知を出来るようになりましょう。

##Redis
キャッシュの設計と活用でハイパフォーマンスなアプリケーションが組めるようになりましょう。

##SignalR
WebSocketを利用した双方向通信について理解を深め、実際にサーバーサイドとクライアントサイドの実装ができるようになりましょう。

#Git(7日）
ソースコード管理のGitについて7日でマスターします。1日1個ずつ概念を理解し、適切に使いこなせるようになりましょう。
・Commit,Push,Pull
・Branch
・Merge
・Repository
・Sync
・Fork,Pull Request
・Stashなどその他のコマンド


#DevOps（3日）
継続的にサービスを進化させるためのDevOpsについて学びましょう。代表的なサービスについて1日1個でマスターしていきます。

##CI/CD
GitHub Actionsを1日で理解し、使いこなせるようになりましょう。

##Swap
ブルーグリーンデプロイメントについてその仕組みを理解し、活用できるようになりましょう。

##Selenium
UIテストフレームワークを活用して自動テストを作成し、アップデート時にデグレードが起きないようにリグレッションテストを行えるスキルを身につけましょう。

#AI(10日)
AIについて7日で理解します。Pythonを1日でマスターし、代表的なAI手法について1日1個ずつ理解をして、実際にPythonでコードが書けるようになりましょう。
・Python
・Machine Learning
・Deep Learning
・画像・動画認識
・言語解析
・クラス分類・クラスタリング
・回帰と予測
・異常検知
・強化学習


#まとめ
いかがでしたか？私は10年以上プログラミングをしてますが、正直このペースで理解しろと言われたらちょっと…。

理解度のレベルとしては
・概念を理解する
・調べながらなら書ける
・何も見ずに書ける（多少時間がかかる）
・何も見ずにすらすらと書ける
・何も見ずに他人にホワイトボードで教えられる
という段階があります。この記事の各知識を他人にすらすら説明できるようになるにはもっと時間が必要だと思います。おそらく10倍程の時間が必要で、それだけの時間をかけて実際に何度も手を動かせば調べながらではなく短い時間で実際にコードが書けるようになり適切な使いどころも理解できるようになる感覚はあります。

100日×10時間＝1000時間で10倍すると1万時間となります。スポーツの世界などでよく言われる「1万時間の法則」はあながち間違いでもないなと感じました。
https://www.gqjapan.jp/culture/sports/20160803/the-truth-of-the-10000-hour-rule
ただ1万時間を書けるだけではダメで常に多少の負荷がある状態で1万時間の学習が必要です。それぞれの知識へのより高いレベルの理解を目指して1万時間の時間をかけることが大事でしょう。3か月×10倍なので約3年間、週1回休みくらいで毎日10時間プログラムについて時間をかけると1万時間くらい、確かにそのくらいやれば上位5%くらいには入れそうな気がしますね！

会社の新人研修などで「研修期間が長い！もうちょっと短くできないのか？」とか「WEBできるならネットワークも似た感じじゃないの？同じITだし。」とかよくわからないことを上司が言ってきたらこれを見せてください。少しは役に立つかもしれません。


##おまけ
この記事では基本的な事項を書きましたが、もう少し中級者・上級者向けの記事も書いております。良かったらこちらも見てみてください。
[タスク管理を作ってみた　～初級からレベルアップするためのツールとサービスたち～](https://qiita.com/higty/items/598716cb160b61b1ddb0)
[パフォーマンス向上で知っておくべきコンピューターサイエンスの基礎知識とその実践](https://qiita.com/higty/items/306eebe988af39ba775d)
[WEBアプリケーションのパフォーマンスをUPするために知っておくべき技術と知識](https://qiita.com/higty/items/b021c1d379d94b55de47)
[C#で世界最速のMapperライブラリを作ってみた（AutoMapperなどよりも3倍-10倍ほど高速）](https://qiita.com/higty/items/30267dd386d7cd6e5a93)
[プログラマのための機能のUIデザイン](https://qiita.com/higty/items/788cae32a8726d8baa82)
[世界で通用するエンジニアになるための高度な技術記事（英語）](https://qiita.com/higty/items/f1f981719b1a59b9e020)