2年くらい本気でプログラミングしてわかったこと

社会に出てから9年目です。
プログラマとして就職して、SE、管理職となりました。
そこから本気でエンジニアとしてやっていきたくなり、
2年くらい土日のほとんどをプログラミングに使いました。（現在進行系でもある）
そこでエンジニアとして成長するために必要だとわかったことをまとめておきます。

## 目次
- 2年くらいでやったこと
- 1年くらい本気でやれば一通りはなめられる。
- 歴史を調べる
- 基礎を固める。
- 深くもぐる
- 自分が楽しいことをやる

## 2年くらいでやったこと

まず私が2年くらいでやった(ている）ことです。

- 言語
	- Ruby
	- Elixir
- WAF
	- Padrino(Ruby)
	- Rails(Ruby)
	- Grape(Ruby)
- Front
	- CoffeeScript
	- React.js
- インフラ
	- AWS
		- EC2
		- ELB
		- S3
		- RDS(Oracle,MySQL)
		- Route53
		- IAM
	- td-agent(Fluentd)
	- ElasticSearch
	- Kibana
- 構成管理
	- Chef
	- Itamae
- デプロイ
	- capistrano
- Webサーバー
	- Rack
	- Unicorn
	- Nginx
- ローカル開発
	- Vagrant
	- Docker
	- otto
- Editor
	- Vim
- NoSQL
	- Redis
- 触ったけど・・・
	- iOS
	- Objective-C
	- Swift
	- Go
- 読んだ本
	- [httpの教科書](http://www.amazon.co.jp/HTTP%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%8A%E9%87%8E-%E5%AE%A3/dp/479812625X)
	- [Webエンジニアが知っておきたいインフラの基本 ~インフラの設計から構成、監視、チューニングまで](http://www.amazon.co.jp/Web%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E6%9C%AC-~%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%8B%E3%82%89%E6%A7%8B%E6%88%90%E3%80%81%E7%9B%A3%E8%A6%96%E3%80%81%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7~-%E9%A6%AC%E5%A0%B4-%E4%BF%8A%E5%BD%B0/dp/4839953554/ref=pd_sim_14_35?ie=UTF8&dpID=51%2BYTLRuB7L&dpSrc=sims&preST=_AC_UL160_SR113%2C160_&refRID=0ACHW90TQ0RQB4CRZ91D)
	- [Web API: The Good Parts](http://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864/ref=sr_1_4?s=books&ie=UTF8&qid=1459058942&sr=1-4&keywords=Rest)
	- [初めてのRuby](http://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AERuby-Yugui/dp/4873113679/ref=pd_sim_14_8?ie=UTF8&dpID=51BI%2BoUtJCL&dpSrc=sims&preST=_AC_UL160_SR119%2C160_&refRID=17MQSXGACJRXDT509JKT)
	- [パーフェクトRuby](http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Ruby-PERFECT-SERIES-6-Ruby%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/4774158798/ref=pd_sim_14_81?ie=UTF8&dpID=51K0jUf%2BiEL&dpSrc=sims&preST=_AC_UL160_SR126%2C160_&refRID=1A15XXCZ8ASV4FXD4APC)
	- [ハッカーと画家 コンピュータ時代の創造者たち](http://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%A8%E7%94%BB%E5%AE%B6-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E6%99%82%E4%BB%A3%E3%81%AE%E5%89%B5%E9%80%A0%E8%80%85%E3%81%9F%E3%81%A1-%E3%83%9D%E3%83%BC%E3%83%AB-%E3%82%B0%E3%83%AC%E3%82%A2%E3%83%A0/dp/4274065979/ref=pd_sim_14_85?ie=UTF8&dpID=511SV9NXW2L&dpSrc=sims&preST=_AC_UL160_SR113%2C160_&refRID=187BWGAYWP9VHAZ5BXAE)
	- [Team Geek ―Googleのギークたちはいかにしてチームを作るのか](http://www.amazon.co.jp/Team-Geek-%E2%80%95Google%E3%81%AE%E3%82%AE%E3%83%BC%E3%82%AF%E3%81%9F%E3%81%A1%E3%81%AF%E3%81%84%E3%81%8B%E3%81%AB%E3%81%97%E3%81%A6%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AE%E3%81%8B-Brian-Fitzpatrick/dp/4873116309/ref=pd_sim_14_3?ie=UTF8&dpID=41SlY0zvpKL&dpSrc=sims&preST=_AC_UL160_SR113%2C160_&refRID=1DED09Q6BJVYM4TW2N96)
	- [UNIXという考え方―その設計思想と哲学](http://www.amazon.co.jp/UNIX%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9%E2%80%95%E3%81%9D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3%E3%81%A8%E5%93%B2%E5%AD%A6-Mike-Gancarz/dp/4274064069/ref=pd_sim_14_2?ie=UTF8&dpID=518ME653H3L&dpSrc=sims&preST=_AC_UL160_SR112%2C160_&refRID=1DED09Q6BJVYM4TW2N96)
	- [How Google Works (ハウ・グーグル・ワークス) ―私たちの働き方とマネジメント](http://www.amazon.co.jp/How-Google-Works-%E3%83%8F%E3%82%A6%E3%83%BB%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E3%83%BB%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9-%E2%80%95%E7%A7%81%E3%81%9F%E3%81%A1%E3%81%AE%E5%83%8D%E3%81%8D%E6%96%B9%E3%81%A8%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88/dp/4532319552/ref=pd_sim_14_93?ie=UTF8&dpID=41wP3LRm7QL&dpSrc=sims&preST=_AC_UL160_SR112%2C160_&refRID=1DED09Q6BJVYM4TW2N96)
	- [コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方](http://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Noam-Nisan/dp/4873117127)
		- 途中です。

読んだ本に関しては他にもありますが、良かった本を載せています。
すでに経験のあった分野は書いていません。(jQueryとかシェルとかSQLとかJavaとかPHPとか）

## 1年くらい本気でやれば一通りはなめられる。

プログラミングを真面目にやり始めたときに感じたことは
技術の幅が広すぎて何に手を付けてもわからないことが出てくるという状況でした。

例えばRailsをやろうと思った場合に、必要な技術要素、知識が非常に多くあります。

Linuxコマンド、Ruby、Database(MySQL,Oracle,PostgreSQL)、SQL、Git、javascript(coffee)、
html、slim or erb or haml、migration、assets、REST、CSRFなどの脆弱性、

初心者がいきなり手を付けても非常に厳しいと思います。
ですが逆に言えば、Railsをきっかけに上記の技術を掘り下げて、Web開発の一通りの知識を学ぶことが出来ます。
一歩ずつ基礎を積み重ねるより茨の道ですが、私はこの方法をとっていました。（他の方法がよくわからなかった。）
RailsはWeb開発の難しいところ、面倒なところを規約にすることで簡単に作れるようになっています。
どういった問題があり、それをRailsがどう解決しているのか？という視点でRailsを学ぶと非常にいいと思います。

そういった視点を踏まえてRailsの機能が一通り使えるようになれば、新人としては優秀な部類になれると思います。

ただ、なめただけでは本当に上辺だけの知識になります。
一通り、薄っぺらい板を貼ったところから穴を掘っていく必要があります。
どこに穴を掘るか？を一通りやった中で自分がやりたい分野を見つけ掘り下げるといいと思います。

## 歴史を調べる

Railsの部分でも少し触れましたが、
今使用されている技術は、何らかの問題がありそれを解決するために生まれ、
それが必要だと思われたから使われています。（同じ問題を解決しようとしている技術は多く存在し、残っているものは選ばれた技術です。）
技術の歴史を調べ、どんな問題があり、どう解決されてきたのか。
それらを理解することで技術を見る力が付きます。

技術の進歩の流れば非常に早く新しいフレームワーク、言語などはどんどん出てきます。
それら技術に対し、振り回されていれば時間を無駄に消費してしまいます。

新しい技術が出てきたときには、それが解決しようとしている問題を考えましょう。
解決しようとしている問題がわかればその技術をどう使えばいいのか、
何に対して使えばいいのかがわかります。
それらを積み重ねていけば技術選定が出来るようになると思っています。

例えば以下の記事はすごく良い記事で勉強になります。
[2015年までにWebのフロントエンドが辿ってきた道](http://qiita.com/joe-re/items/3b6730eb90dbeb2f8272)

Qiitaではこのように歴史をまとめてくれる人が稀にいるので自分の興味が薄い分野でも見ておくといいと思います。

## 基礎を固める。

私は昔の上司に基礎がないと言われていました。
基礎とは何なのか？
何をやれば基礎が出来るといえるのか？
それがやっとわかってきました。

私の考える基礎とは、
コンピュータがどのように作られているか、どのように動いているか
その上でプログラムはどう作られ、どう動いているのか、
プログラムはコンピュータのリソースをどう使っているのか。
それらに加えてTCP/IP、http等のプロトコルの仕組み、歴史だと思います。

いま存在しているすべての技術はこれらの上に成り立っています。
これらの技術は進化こそしているもののほぼ変わっていません。
ここをおさえて、今の技術を学ぶことで
今ある問題点、それらが今後どう解決されていこうとしているかがわかります。
これも技術を見る目が養われます。

## 深くもぐる

一通りなめました。
歴史を調べました。
基礎もやりました。
次に何をやりましょう。

有名なフレームワークやライブラリを読みましょう。
更に言えば自分でそれらに足りない部分を考え作ることが出来れば最高だと思います。
（私もがんばっていますがまだまだダメです。）


## 自分が楽しいことをやる

プログラミング楽しいですか？
[新人プログラマ向け・スキル向上のための具体的なアプローチと考え方](http://blog.jnito.com/entry/2016/03/22/083055#プログラマとしてスキルを上げるための前提条件)
上記記事の意見に完全に同意です。

今後の人生40年以上やっていけるくらい好きなのかな。
私もよく考えます。
エンジニアとしてのキャリアをどう構築していこうかな。
でも一つだけ決めていることは技術力で切り開いていこうということです。

学ぶことが無限にあるのがこの職の辛いところでもあり楽しいところだと思います。
マンガとかゲームとか楽しいことって終わっちゃいますよね。
でもプログラミングは終わらないんです。
これが楽しめたら最高じゃないですか？