独学で0からプログラミングを始めて、成り上がるためには

# 独学でもプログラミングスキルを身につけることは可能

「自分のアイデアを形にしたい！！」
「自由に働けて面白そう！！」
「お金たくさんもらえそう！！」
「なんか面白そう」
動機は何であれ、新しく何かを始めることはとてもワクワクして素晴らしい経験だと思います。
ですが、やる気こそあるものの、何をやったらいいかわからず、出だしから苦戦する（or 選択を間違える）人にたくさん遭遇してきました。

僕は、21歳くらいの頃に始めてコードを書き出し、そこから数年間今もエンジニアとして仕事をしています。
大学の学部は経済学部でしたし、数学（算数？）は子供の頃に早期引退したし、就職活動もしていないので、プログラミングに関して教育を受けたりすることは一切ありませんでした。

そんな僕でも、起業してプロダクトを作ってリリースしたり、フリーランスエンジニアとして案件をいただきながら、それを生業として１人で生きたりしてこれたので、同じ様に何もない状態で、もがいている方々の助けになればめっちゃハッピーです。

（※0からwebエンジニアとしてレベルアップしていく方々を想定しています。）

# エンジニアとして戦っていくために必要なスキル
結論、算数ができて、ググる力があればある程度のところまでは成長することができます。

## ググる力の大切さ
基本的に、初期やろうとしてることの答えは絶対にググればでてきます。
そして、始めたばかりでも、数年立っても、このググるという行為は一生続きます。（もしかしたら、googleがなくなって、検索エンジンとかの概念もなくなって、違う形で僕たちに解決策を教えてくれる未来が来たらイイね！）

なので、このググり力はとってもとっても大切です。

### １発で解がでなくても諦めない気合が必要
自分が解決したい課題に対して、一発で解を出せる = 課題が明確なので、最初のうちはうまく行かないです。
知ってたら調べなくても解決できるし、過去の経験則から最速で答えにたどり着くことができます。

結局、答えへの最速のたどり着き方を知らないだけなので、数をこなせば絶対に答えへの到達スピードは上がります。

### ググり力を上げるために必要なことは気合
わかるまで、ひたすら調べる、もがく経験が今に生きていると痛感します。
数をこなして、自分の中で最速に答えにたどり着く感覚を習得しましょう。

結局は、課題の因数分解です。１つわからないことがある裏にたくさんのわからないことが潜んでいます。

そして、ほしい解答がピンポイントで一発で出てくるケースばかりでなく、組み合わせによって導き出される解もあります。

とにかくググりましょう。わかるまで諦めずにググりましょう。

## 英語アレルギーの克服
解決したい課題によりますが、英語読まないと答えにたどり着くまでに10倍以上の時間がかかるケースはめちゃくちゃあります。
目の前に答えがあるのに言語の壁で引き返すのはまじで時間の無駄なので、英語の文章を読みましょう。
といっても、外国語を読むのがストレスな人は、英語がわからなくても読める方法を探しましょう。

google翻訳が年々賢くなっているので、大抵の文章は日本語で読むことが出来ます。chrome拡張でgoogle翻訳を入れておきましょう。



# プログラミングやり始めた頃あるある
## 受け身の学習の負のサイクルに入る
とりあえず、やる気は充分にあって「なんでもいいからやりたい！でもなにやればいいかわかんない！」状態になった時に陥ってしまう負のサイクル

## よくある例１ ひたすらプログラムを解説している動画を見続ける
厳密に言うと、「何も考えずにダラダラと動画を見続けて、やってる感だけ得て満足すること」が良くないということです。

インプットは大切です。
ですが、実際に手を動かして、使わなければどそこで見たり聞いたりしたことはどうせ忘れます。
なので、体系的なことだけ学んでさっさと手を動かした方が良いです。

わかんないことだらけな状態で、アウトプットをするのはとても恐怖だけど、そこを乗り越えた先に快感があるので、さらっと頭にぶち込んで、すぐに何かをやり始めましょう。

## よくある例2 とりあえずプログラミングスクールに通う
これも、厳密に言うと、「ゴールから逆算せずに、他人任せの脳内状態でスタートすること（の一例として、ノールックとりあえずスクール入学）」が良くない

決してプログラミングスクールを全否定しているわけではなく、
「まず自分はどうなりたいのか」
「そのために、そこにいって何を得るのか」
「他の学習方法と比較して、なぜそれなのか」
等徹底的に調べ上げてからの方が良いです。

「それがわかんないから行くんだよバカ！！！」
と述べる人もたくさんいますが、ググったり、twitter眺める等してればある程度の方向性は誰でも定める事ができます。こんだけ情報が溢れている時代なので。

「エンジニアとして入りたい会社がある」
「フリーランスとして、案件を受けて一人で生活したい」
「起業して、facebookみたいな会社を作りたい」
「社内のエンジニアと心を通わせたい」
「生活をハックして、豊かにしたい」

なんでもいいから、始めようと思った動機やきっかけがあるはずです。そこに最速でたどり着くには何が必要か自分の頭で整理して考えてみましょう。　

そして、結局エンジニアとしてやっていく上で、自分で調べて自分なりの仮説をもって、自分で行動していく力がとても大切になり、楽しい部分でもあります。最初から他人にそれを投げるのは、エンジニアとしての幸福度を自分から下げにいっているようなものです。

### この負のサイクルはマジで危険
基本的に、何かを学びきって終わりということはなくて、むしろ続々と出てくる新しい概念をいかにうまく使うかというところがとても大切なので早めに脱すべき。それが苦痛だった場合は、一生苦痛になるので、辞めたほうが良いです。


## とにかく何がわかんないのか、わからない
最初はわかんないことだらけなのは当たり前だと思います。
そして、わからないことの裏に更に大量のわからないことが潜んでいて、脳内がバグり始めます。

### 解決方法は「わからないことを許容する」こと
良い時代になりました。
その物事を100理解していなくとも、実装を進めることが出来る便利な世の中です。
なので、迷ったら
「まあ細かい事はしらんけどこーやったら動くのか」
でガンガン進んでいきましょう。

とにかくすべてを理解（暗記）してから次に進もうとすると一生終わらないので、学校のテスト勉強的な感覚は捨てて、最速で自分が形にしたいものを形にするアクションを取り続けましょう。



# サクサク進めるためには
とにかく、「わからないことを許容して、前に進み続けましょう」

色々な人が学習して、成長していく過程を見てきましたが、
わからないことを徹底的に調べるよりも、「ほえー、まあこうなったらこうなるのか」とガンガン進んでいくタイプの方が学習スピードが明らかに早かったです。気になることがあったらメモっておいて、一段落ついた時に調べてみましょう。
全体が見えた上で、細かいところを調べていくとすっきりと最速で腑に落ちます。

## そもそも、今僕たちが開発してる環境は、わからなくても前に進むことが出来る
実際にwebサービスを開発するときにも、何かを0から一人で作りあげることなんてほとんどありません。
（例）フレームワーク、クラウド・ホスティングサービス、便利なライブラリたち。。。
常に巨大な先人の肩に乗っかって開発をしています。
車輪の再発明をする必要はなく、必要なものがあったら誰かが作ったやつを使って、それをカスタマイズするなり組み合わせたりして開発を進めていきます。

言語だってそうです。色々なものがありますが、人間様が理解しやすいように歩み寄ってきてくれています。

とにかく、更地から家を作れと言う条件ではなく、すでにある家を持ってきて改造したり、他人の家のデザインをそのまま丸コピして、えいっと自分のものにも出来る便利な時代です。
しかも今後それはもっと加速します。

## とにかく、自分の目的達成したら次に進むを繰り替えす。深追いしないこと
具体例として、あるゲームがあるとして
課題: キャラクターを右に移動したい
解決策: コントローラのスティックを右に倒すとキャラクターが右に移動する


goodな進み方 → お、右に倒したら右に移動するのか。じゃあ上に倒したらどうなるかな
badな進み方 → な、コントローラを右に倒すとキャラクターが右に移動するんだ？中の仕組みはどうなってるのだ？右に移動したら、その信号はどこに！？！？！？

ちなみに、ここではbadとしたけど、この知的探究心はとても大切です。ただ、それを繰り返していると一生ゴールにたどり着けずに挫折する未来が見えるので、大枠から理解して、どんどん低い次元のものへと意識を集中させるのが最速で進む方法です。


# 手を動かして、なんとなく理解するまでのステップ
1. 一旦文法とかはガン無視。どうやってやるかよりも、その世界はどうなっていて、なにが出来るのかを把握する
2. twitterを真似て作ってみる
3. twitterを作るためには何が必要かを列挙する
4. 上で列挙したものを学習する
5. フロントエンドを書いてみる
6. サーバーサイドを書いてみる
7. サービスを公開する

## 一旦文法とかはガン無視。どうやってやるかよりも、その世界はどうなっていて、なにが出来るのかを把握する
ルールもわからない、何が楽しいのかもできるのかもわからないといった状態で、条件分岐とかループとか教えられても、「だからなに？」となりますよね。

なので、まずは普遍的な部分を体系的に学びましょう。とりあえず、今から始めることのルールを確認するといった感じです。
これは、既存のよく使うサービスが動いている仕組みさえ理解できればokです。(追って、記事にまとめます)
とりあえず、**ググりましょう**
「ウェブサイト　動いている　仕組み」とかで適当に。
ググれば、今見ているこのサイトもどうやってできているかさらっと書いてあります。

## twitterを真似て作ってみる
フロントエンド、サーバーサイド、データベース等これから必要になる最低知識の全てが詰まっています。

## twitterを作るためには何が必要かを列挙する
twitterを作る上で、自分にどのような知識が必要かを列挙して、学習しましょう。

## 上で列挙したものをさらっと学習する
言語、フレームワークを学ぶのには、[Progate](https://prog-8.com/)がおすすめです。（僕はProgateとは一切関係有りませんが、初学者の時にこのサービスには大変お世話になりました。）
わかりやすい説明も有り、実際に動かしながら学習することができます。

あとは、youtubeで検索してダラダラみたり、ググったりとにかく*さらっと*学習しましょう

## フロントエンドを書いてみる
ここまできても、フロント？？サーバー？？と困惑する。なぜならアウトプットしていないからです。
一気にいくよりも、まずは目に見える部分から動かして楽しんでいきましょう。

## サーバーサイドを書いてみる
ここまでくると、ユーザのデータってどこにあるの？？どうやって保存しているの、何が表示されているの？どうやって送っているの？？というところにたどり着くので、 やってみましょう。

## サービスを公開する
せっかく作ったので公開してみましょう。（サービス名をtwitterとかにして公開すると、ただの盗人なので、オリジナル風に変えてからやりましょうww）
ここで、公開できればインフラや、ネットワークの知識が身につくのでがんばってやりきりましょう。

# 自分でサービスを作って、公開
何でも良いです。簡単なものを作りましょう。
（どこか入社したい企業がある場合は、そこで使われている技術を調べてそれを使ってみましょう。企業の採用ページみれば一発でわかると思います。）

# 業務レベルで使えるようにするための次のステップ
さて、自分１人でなにか作れて公開するところまでいけたので、もう仕事として始めちゃいましょう。
主に３つの分岐があると思います

- 会社に入社
- フリーランス
- 起業する

## 会社に入社
### メリット

- 1番手っ取り早い選択肢
- なにか困ったことがあったら、周りに聞ける人がいる
- 会社の金で実務レベルで勉強することが可能

### デメリット

- 聞ける人がいない（or忙しい）、質問に答えてくれない等の環境にぶちあたったら最悪。運要素ある。
- 会社によっては、モダンではない環境での開発を強いられる。

## フリーランス
### メリット

- うまくやればそこそこ儲かる
- 絶対にやらなければならない環境に追い込まれるので、意地でも結果は出せる
- 必死こいてやってると自然と金と知識が蓄積する

### デメリット

- スキルは低いので、まじで体力と根性が必要
- 交渉や見積もりもなれていないと、自ら炎上プロジェクトを作り出すことになる
- 最初はプライベートが一切なくなる（その覚悟でやったほうが爆速で伸びる）
- そもそも、相手のレベル感もわからない個人にまるっとなにかをお願いする時点で、お客様に何らかの闇はある

### 仕事のとり方
#### クラウドソーシング系のサービスは極力使わない
一定の実績がないと仕事をとれない仕組みなので、受注効率が悪いです。
そして、安い＆納期短い＆注文多いの三拍子揃った案件が多い印象です。

#### 誰でも良いのでコンタクトをとって、うそをついてでも、案件を取る。
これがベストです。知り合いがいない人は知り合いを作って、いる人は血眼になって、仕事をくれる人を探しましょう。
ビジネス系のマッチングアプリ等を使うのも有効ですね。

そして仕事を取るために、自分はいかにできるかを誇張しましょう。売り込みましょう。
できれば結構ブラックな、中規模サービスの案件まるっと個人にお願い系が良いです。ある程度のまとまったお金と経験が身につきます。

#### 知り合いの案件を手伝わせてもらう
知りあいにフリーランスのエンジニアがいる場合は有効ですね。
なんでもいいので、どんなに安くても良いので、手伝わせてもらいましょう。
交渉もないし、責任を追うこともない（知人の信頼を失う可能性はある）ので、気軽に教わりながら、経験を積むというのもありです。

#### 副業サービスを使う
とりあえず、ググって片っ端から登録してみましょう。（[副業サービスの例](https://offers.jp/a/08928c7e9b0030a735fb9796698b8baf02f0245805f2c411419813fa4fe1b11d)）

とにかく、実力がないうちはコミット量とポテンシャルでアピールするのが有効です。
企業側の目線に立ってみても、いきなりほぼ未経験の人を迎え入れるのはそれなりのリスクを伴うので、ライトな関わり方から始めて、お互い気が合えば「本格的にお願いします」とした方がみんな幸せになると思います。

また、働くこちら側の目線でも、自分の上司に当たる人物によって、今後の成長速度が大きく変わってくるので、どういった現場でどのような人がいて等全て確認できるメリットがありますね。



または、会社員×副業で案件を受けて、色々なところから吸収して爆速で成長するっていうのも良い方法ですね。（その代わりプライベートが一切なくなる）

## 起業する
農家やるにしても、銭湯経営するにしても、なにするにしても、ソフトウェアを形にできるスキルは活かせます。
なにより、「ゴミでもいいから何かを形にできる」というのは素晴らしいスキルです。
とりあえず。アイデアがある場合は走り始めてみて、最強の技術者と出会うべくがんばりましょう。
技術者とbizdevは分離して戦争になることが多々ありますが、本来は手を取り合うべきで、技術者目線だと
「少しでもこちらのことを理解しようとしてるんだな」ということが受け取れると、それだけで力になりたくなります。
それを満たすために必要なスキルは身につけたはずです。


# 結論
結論、**やってみて楽しいと感じたら続けるべきだし、つまらなくて苦痛ならやめるべき**です。世界をみたら笑顔で狂ったようにコードを書き続ける変態だらけなので、結局好きには勝らない領域です。

ただ、わからないことがわかるようになった時、自分の書いたコードで誰かに感謝された時等本当に楽しいポイントはたくさんあります。
そして、エンジニアを求めている企業はこの世にたくさんあり、できるようになるとそれなりにお金も貰えて、自分の力でのし上がっていけるので、天職だと思います。
入り方は何であれ、1人でも多くの人がプログラミングを楽しんで、人生が豊かになったら最高です。

# 謝罪
手を動かして、なんとなく理解するまでのステップでつまづいてしまう人が多いので、そこの詳細を記述したいのですが、文章量と体力の都合上で近日必ず別コンテンツであげようと思います。
端折ってすみませんでした！