# プログラミングについて何を学ぶべきか
2017 / 12 / 08
## 背景
プログラミングとそれに付随する技術について,(無駄に)10年ぐらいのキャリアがあるので書いておきます.ポエムです.
## プログラミングについて学ぶべきこと
とりあえず思いついたものを書き出してみます.
* メモリ管理・ポインタ
* アルゴリズム
* データ構造
* プログラミングパラダイム
* ラムダ計算
* マクロ
* 型理論
* 所有権
* ライフタイム
## いかに学ぶか
プログラミングを学ぶ方法について考えてみます.
その前に,プログラミングを学ぼうとしている人間は大雑把に2つに分けられますね.
1. 作りたいものがあって,プログラミングを学びたい
2.プログラミングは学びたいが,特に作りたいものが無い
前者は目的のために技術を学びたい人.後者は技術が先行してる人.
技術先行型の人でも,細分化すればさらに以下の2通りに分かれます.
2-1. プログラミングかっこいい!楽しい!
2-2. 漠然とした憧れ.なんかお金になりそう
学ぶべきこと,学び方を知るには,大体自分がどのグループに属するか考える必要があります.
僕の場合は1に該当したので,数年間は上で書いた事柄についてあまり意識せずにプログラミングをやってきました.
1と2-1に該当する人はおそらく意欲的に取り組めるはずなので,自己管理と検索が上手く出来れば,すぐに一定のレベルに辿り着けると思います.
2-2に該当する人は,いち早く大目標となるものを見つけてください.そして1か2-1のグループに入ってください.
大目標として,著名なエンジニアだったり,ナンカスゴイソフトウェアあたりを定めると良さそうな気がします.
Twitterとかでフォローしておくと良いインセンティブになるでしょう.
その人が普段どんな言語を書いているのか,どんなことを考えているのか,何を作る人なのかを知ることで,自ずと小目標も定まるはずです.
さて,ここから本題の「いかに学ぶか」という話に入っていきます.
### 「作りたいものがあって,プログラミングを学びたい」人へ
まず目的を達成出来そうな近道を探すべきです.
学び始めにあたって特に問題となるプログラミング言語のチョイスにおいては,フレームワークなどを基準に選ぶと良いと思います.
フレームワークは,ある特定の種類のシステムを開発するための汎用的な機能や枠組みを提供するものです.
ゲーム開発であれば,以下のような選択肢が思いつきます.
* Unity -> C#
* Cocos2d-x -> C++
* Webブラウザ -> JS
* HSP
これらは参考書やWebページが充実しているため,かなり早い段階で動くものを作れるでしょう.
基本的には入門サイトなどを見ながら,実際に手を動かして使い方に慣れ,自分の作りたいものを作っていく流れになると思います.
参考書よりはWebサイトの方が情報が新しいことが多いので,そちらをオススメします.
しかし,実際に上のような順番で進めても,自分の作りたいものが作れるとは限りません.
幾度と無く続くトライアンドエラーには対処出来ても,使っている道具の制限や限界には対応出来ません.
これが俗に言う(言わない)第一の障壁です.
ここまで辿り着くと,他の技術について学ぼうという意識が芽生え始めると思います.
実際,僕が辿ったのはこの道です.
観測範囲が狭いので局所最適解かもしれませんが,とりあえずこの通りに辿ってみると次が見えてくるでしょう.
次のステップについては書きません.まずここまで辿り着いてください.
### 「プログラミングは学びたいが,特に作りたいものが無い」
こういうタイプの人は直感で良いと思った言語なりを選んで学ぶと良いと思います.
とにかく色んな言語に触れてみるのも面白いのでオススメです.
自分はこのタイプが始まりでは無かったので序盤のアドバイスはあまり出来ませんが,以下のことをやってみると良いのではないでしょうか.
* 競技プログラミング(AtCoderとか)
* 普段の作業の自動化
* よく使う類のツールの自作
* ゲーム開発
* サーバアプリケーション開発
* プログラミング言語処理系開発
特に作りたいものが無くてもプログラミング自体を楽しめるなら,色んなことを経験してレベルを上げるのがベターだと思われます.
とりあえず1つの言語をストレス無く書けるようになるのが第一関門でしょう.
## 「プログラミングについて学ぶべきこと」はいつ学ぶべきか
基本的には必要になってからで大丈夫です.
場合によってはきちんと学ばなくても雰囲気で使えるかもしれないので,必須というわけではありません.
僕がこれらを学ぶべきと言っているのは,考え方を学ぶことで良い影響があるから,という程度のことです.
実際,必要ない人にとっては必要ないし,必要な人には必要なものです.
エンジニアを名乗りたい人は知る必要がありそうですが...
## 他に何を学ぶべきか
書くのがだるくなって来たので箇条書きです.
* 英語 ... 最新の情報はだいたい英語.日本語だと若干古い情報を掴まされます
* 解析学・線形代数・統計学・最適化数学 ... 機械学習とかやるなら必要です
* 一階述語論理 ... 型理論とかに絡んできます
* 圏論 ... 一部のプログラミング言語の熱狂的ファンなら...
* 代数学 ... アルゴリズムに絡んできます
* UI/UX デザイン … アプリ開発者とかWebフロントエンドの人なら意識すべきです
* 物理 ... 物理演算したいならやっておくと良いです
## 反省
勢いで書いたので文章がまとまってない気がします.