varエンジニアブログ

株式会社varのエンジニアブログです。IT初心者から中級者までが楽しめる内容を投稿しております。

USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。
それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」
ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んで見てください。

では、タイトルにもある通り「USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話」を時系列に沿ってしていこうと思います。

これからフリーランスを目指す方、 IT企業に入社を考えているあなたが 自分を重ねながら読んで頂けると楽しめると思います。

序章 なぜこの記事を書こうと思ったのか

フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。

しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。

これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、現在は企業研修やIT塾で数多くの受講生を指導している。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」 私が出した答えは、「量産型エンジニアか否か」である。

今のフリーランス市場には、量産型エンジニアが溢れている!! ここでの量産型エンジニアの定義は以下の通りである。

量産型エンジニアとは、比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。結果として、フリーランスとして活動してもブラック企業案件しか回ってこず、スキルもつかず、思ってたよりも過酷な生活を強いられる。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。

第1章 IT歴0-2ヶ月

「そうだ。フリーランスエンジニアになろう。」 「給料も高いし、フリーランスを目指そう!」

そんな理由からITの世界に身を投げたあなたは最初に何をすべきか?プログラミング言語を学ぶ?IT塾に通う?参考書を買う?

違う!!!

まずは、タイピングだ。これを聞いて、「そんなんできる」と思った人はこの部分を飛ばしてくれて構わない。私が最初にしたことは、オンラインタイピングゲーム寿司打でタイピングすることだった。

当たり前の話だが、タイピングの遅いやつは仕事が遅い。ブラインドタッチができないやつは、話にならない。エンジニアは1日に数万文字を打つこともある。タイピングは絶対に早くないといけない。タイピングもできないのにプログラミングの勉強をしている人は愚の骨頂である。サッカーで例えるならば、リフティングもできないのにシュートの仕方を学んでいるようなものだ。そんなんではいつまで経っても身につかない。

ブラインドタッチができるまでは、参考書を買う必要もない。ブラインドタッチできることがエンジニアとしての超最低レベルだ。

ちなみに、私は「毎日3時間」寿司打をした。1ヶ月半経ったころにはブラインドタッチができるようになっていた。これができない人は、ITは諦めよう。IT以外にもたくさんの仕事はある。わざわざ自分が苦手な領域で戦う必要はないだろう。IT以外にもたくさんの仕事はある。今になって思うが、1日3時間もする必要はなかった。1日1時間もすれば十分だと思う。

タイピングができるようになったら次になにをするか?

次は、プログラミング学習だ。

私はC言語を学んだ。近年は、PythonのようなC言語よりも勉強しやすい言語があるからそちらをおすすめする。(私は当時、Pythonなど知らなかった、それくらい情弱だった。)

なぜ、真っ先にプログラミング言語を勉強するかというと、成長のためにこれが手っ取り早いからだ。最初のうちは、ただの英語の羅列で、何も頭に入ってこない。コードを読んでも何が書いてるか全くわからない。だが、それでいい。毎日プログラミングを勉強して、わからないことが1つずつわかるようになってはじめITの楽しさがわかるようになってくる。学習すべき内容が途方もないほど多くあるように感じて、挫折してしまいそうになったことも何度もある。というか毎日挫折しそうになる。

ここで、この段階にあるあなたに一言、伝えたいことがある。

「あなたにセンスがないわけじゃない」

いきなり失礼なことを言うな!と思うかもしれないが、本当にそう感じる瞬間があなたにもきっとくる。「自分はセンスがない・向いていない」と感じたことのあるエンジニアが大半なのではないか?ちなみに、私は毎日感じている。できる人を見るほど自分の才能のなさに嫌になってしまう。

でも大丈夫。誰しもそうやって成長してきたということを強く伝えたい。そうやって、C言語の本が読み終わるくらいになったときに私は1つの決断をした。「そうだ。MacBookを買おう!」たいそうな理由はない。かっこいいから。エンジニアはみんな持ってるイメージだから。そんな理由で私は電気屋さんに行った。

今になって思うが、この決断は間違っていなかった。本気でエンジニアを目指したいあなたは今すぐMacBookを買ったほうがいい。理由はいつかわかる。信じてくれ。MacBookを手にした私は、感動した。なんと動きが軽いんだ。当時の私は意味もわからずメモリやストレージの増量したカスタム版を購入していた。これもまた今になって思うが、とりあえず高いものを買ったほうがいい。「やる気がでる」からだ。この時期は、これくらいの理由で十分なのである。

さて、こんなことをしているうちに2ヶ月が過ぎた。

第2章 IT歴3-6ヶ月

この頃には、少しずつプログラミングができるようになってきた。超簡単なプログラムなら自分で作れるようになってきた。さて、次に何をやるか。

答えは、「Linux

Linuxがわからない人はまず「Linux とは」でググるとよい。なぜ、私がLinuxに行き着いたかというと「プログラミング 初心者」でググるとそういうことをどこかの誰かが言っていたからだ。間違いない。Linuxシステムをある程度理解することがエンジニアのスタートラインに立つための次のステップだ。

意外とこの部分が抜けている人もいる。講師をしていて思うが、Linuxを理解できている人は成長速度が全く違う。どこの企業とは言わないが、Linuxコマンドもろくに使えない中堅社員が多い所の研修は本当に骨が折れる。IT企業に就職しといてLinuxコマンドも知らないようでは終わりである。さっさとやめてしまえとすら思う。そんな人のために「Linux標準教科書」というものがある。無料でダウンロードできるので、これを読むことをおすすめする。

Linuxシステムを理解するのは容易ではない。少なくとも2ヶ月はかかる。しかもある程度わかるくらいのレベルにしかなれない。完全に理解するのは稀有の天才でなければきっと難しいだろう。だが、ある程度理解することが大事だ。そしてこの頃からおすすめするのはネットワークに関する参考書を読むことだ。

特に「TCP/IPモデル」というものを理解することは非常に大切である。

今まで見てきた多くのエンジニアでネットワークに関する知識を身につけている人はほとんどいなかった。一流エンジニアになるためにまずはネットワークの知識を身に着けるべきだと私は思う。エンジニアが増えている現在、希少性を身につけることは大切だろう。

さて、こうしているうちに半年がすぎた。半年も続けられたら、あとはどうにかなる。だが、私の経験上、60%の人は半年も続かない。この記事を読んでいるあなたも60%の確率で半年しないうちに挫折する。じゃあ、どうすれば、モチベーションが保てるかについては、下のほうに書いておく。

第3章 IT歴7-12ヶ月

何事もまずは半年である。これくらいになってくるとネットにある記事を見ると半分くらいのことはわかるようになってくる。嘘だ。正確には、3割くらいだ。。。

さて、このレベルまでは多くの人が今述べたようなことをしていればあなたも到達できるだろう。では、ここから何が必要かを考えよう。私の答えは、

  • 基本的な技術を深く理解する
  • 自分で何か大きなプログラムを組む

この二つを実行することだ。まずは、「基本的な技術を深く理解する」に関して説明する。ここが本記事でもっとも大事だから注意して読んでほしい。もう一度言う、ここが一番大事だ。この時期まで本気で頑張った人は、毎日大量の情報量に触れてきたと思うその中で「ある程度理解できた」というものもあれば「なんかよくわからない」と言ったものが必ずあるはずだ。

この期間では、「なんかよくわからない」ことを「ある程度理解できた」のフェーズまで持っていくことが重要なのである。

この機会を失うとあなたはきっと生涯理解せずに過ごすだろう。なぜ、ここまで私がこれを推すのか説明しよう。

ITの世界を全て理解するには、途方もない知識量が必要である。「全プログラミング言語の全文法を覚え、全プロトコルを理解する。」こんなことは絶対に無理だ。

しかし、プログラミングやプロトコルには、「基礎概念」が存在する。

Linuxやネットワークを理解することを私が薦める理由は、これらを学ぶことでITの世界の「基礎概念」を学べるからである。これらを理解すると、新しい知識に触れた際の理解の速さが大幅に向上する。高校時代の数学などでもよく言われていたが、「基礎力を鍛える」ことはITの世界においても大切なのである。したがって、私は初心者が「Ruby on rails」などのフレームワークをいきなり学習することはおすすめしない。確かに、即戦力になるしコーディング力を急激に高めることが可能である。しかし、これで成功するのは本当に能力のある人間だけである。

よくあるプログラミングスクールでは、カリキュラムの都合上このフレームワークをメインで教えることがどうしても多くなってしまう。別にスクールを悪く言うつもりはない。ただ、スクールだけでは理論上、あまりに不十分なのだ。だから、スクールに通えば一人前になれると考えているあなたはとても危険だと言っているのだ。小手先のテクニックだけを学んだ中途半端なエンジニア(量産型エンジニア)の誕生である。

私が講師をしている中でよく見る駆け出しエンジニアは「Railsできます」「Spring Frameworkできます」と言う人たちばかりだ。しかし、実際に会話をしていると基礎的なLinuxコマンドを知らなかったり、ネットワークなどの知識を欠いている人がほとんとであった。

これでは、「量産型のエンジニア」になってしまう。

真に稼げるエンジニアは、残り10%が知らないような知識を知っている必要があるから重宝されるのだ。

あなたには、ぜひそうなってほしい。 では、次に「自分で何か大きなプログラムを組む」ということだ。これは、非常にいい経験になる。これに関しては、2ヶ月程度の期間で完成できるようなものにするとよい。「要件定義」「システム設計」「コーディング」「保守」この一連の流れを自分1人ですることにより実際の開発現場で分業されていることを全て体験できる。そして、このタイミングで初めて、自分の好きなプログラミング言語を見極めるべきだ。

最初の1ヶ月目にC言語Pythonを勉強したかもしれないがそんなものは忘れてしまって構わない自分が作るアプリはどの言語で設計するべきか調査し、 その言語を1から学習するくらいの勢いで開発を進めることが大事なのだ。ちなみに、私は当時、卒業研究だったこともあり45日間、毎日13時間開発に勤しんだ。必ず期限内に完成させなければいけない恐怖と少しずつ完成に近づいていく楽しさの両面を味わえたのはいい機会だったのかもしれない。

この結果、私は手のひらの皮がむけ、ストレスで皮膚病を発症したのは、今となっては笑い話である。この過程を経た方は、もう安心していい。十分1人で学習できるレベルになってくる。ここから、無鉄砲に参考書に手をだしたり、塾に通ったりする必要はない。それでもなお、塾に通いたい方は私に連絡してくれ。

第4章 IT歴1年1-6ヶ月

この時期からおすすめすることは、

業務としてITに触れることだ。

断言するが、1年間しっかりと学習した人間は会社の中でなんとなくITを学んでいる人よりも間違いなく強い。すでに、フリーランスとして生きていく力のある人もいるだろう。おすすめするのは、ベンチャー企業のエンジニアである。社員として契約を結ぶのではなく、契約社員かアルバイトをおすすめする。まだ社員としてその会社で長く働くには勿体無い。

時給1000円程度の給料をもらいながら、勉強しながら働くことが望ましい。 特に、最近では、週末ワーカーのような副業を支援するエージェントがたくさんある。ぜひ、調べてみてほしい。

さて、企業で副業することが決まったあなたがすることは1つだけだ。 それは、その企業でもっとも優秀なエンジニアの真似をすることだ。

その人が使っているエディターの種類、使っているアプリ普段の情報収集の仕方、シェルの種類など全てを真似ることをおすすめする。

私の経験上、どんな企業にも1人はGoogleクラスのエンジニアが存在する。

Googleの社員と仕事をすることは難しいがGoogleクラスの人間と仕事をすることはそんなに難しいことではない。その人の全てを吸収した上で、半年から1年ほど働いてみることがあなたを最高に成長させる機会となる。すると、優秀なエンジニアの何が優秀か、気づくことになるだろう。単純に頭がいい?経験が長い?ちがう。

優秀なエンジニアの優秀さは、基礎概念への理解の高さそしてググり力の高さにある。

基礎概念の大切さは、先ほど説明したからググり力に関して説明しよう。ググり力とは、「Google検索で何かを調べる力」だ。正確には、「あなたが何かに困ったとき、自分の欲しい情報に早くたどり着ける能力」これがググり力だ。優秀なエンジニアほど、ここが優れている。海外のサイトやいろんなところから的確に自分のほしい情報を取捨選択している。

あなたもきっとこれからエンジニアとして何万回とググることになるだろう。その一回一回のスピードをあげることが成長の速さに繋がると私は信じている。

では、どうすればググり力が成長できるだろうか。Mac ユーザー限定だが、アプリを紹介しておこう。(別に私は、ここの受け売りではない)

「Alfred」と呼ばれるランチャーアプリだ。ランチャーアプリって何?はほっておいて、とにかくMacユーザーはインストールしたほうがいい。検索の概念が変わる最高のアプリだ。詳しい使い方は割愛する。ちなみに、私はとあるベンチャー企業で約10ヶ月アルバイトをしていた。Web開発だったため、ここでフレームワークSQLを学んだ。優秀なエンジニアに多くを教わる一方で勉強しながらお金が発生する最高の期間だった。

私はアルバイトで10ヶ月働いた後、別会社でなんと時給が2万円になった。

もちろん、これに関しては再現性がある訳ではない。たまたま私が恵まれたと考えるのが一般的である。しかし、こういうパターンがあることもあるというのは、夢があっていいではないか?

第5章 IT歴1年7-12ヶ月

1年半ほどしっかりと勉強すると、基礎的な知識、実務経験はそれなりに身に付く。では、次に何をすべきだろうか。ここからは、情報収集力が一番の肝である。

では、どうやって情報を収集するか?。これに関しては、RSSと呼ばれる機能やTwitter を利用するのがいいと思うのだが、やはりこれに関しても最も効率的なのは、優秀なエンジニアの真似をするということだ。

この世界で活動していたあなたは、有名エンジニアの一人や二人を知っているだろう。そんな人たちが発信する情報や、同じ職場の同僚と情報を収集しあうことが大切である。この業界では、間違いなく、情報の質が成長にかかせない。

そして、絶えず行うのが基礎概念の復習である。ここあたりから、「なぜその技術が作られたか」について考えるといい。具体的に言うと、例えば、なぜIPアドレスMacアドレスという2つのものが存在するのか?などを考えて欲しい。全ての技術は、必要だから作られたのである。知識だけを学習するのではなく、その背景を考えると理解が深まる。

そして、「言語化」を意識して欲しい。IPアドレスってなんとなくわかるけど、自分の言葉では仕組みを説明できないというのは好ましくない。言語化できないことは、理解していないことと同じである。

この先たくさんの技術に触れていくと思うが、ほとんどの技術はすでにある技術の複合版または、ちょっと変えた版である。つまり、基礎概念がすべてわかっていれば、「大半の新しい技術は、実はたいして新しくない」のだ。

第6章 2年目からのあなた

2年間、1つのことをやりきったあなたは、もう一流エンジニアになっているだろう。安心して、いろんな案件をもらってきていい。

だが、道のりはまだほど遠い。上位10%になるのには簡単だが、ここから9%、8%となるにはさらに3年、5年とかかってくる。私は、上位10%に入っている自信はあるが所詮その程度だ。世の中にはすごい人たちがたくさんいる。今日もそんな人たちの真似をしながら1日を過ごしている。

お金が稼ぎたいのならば、すぐにフリーランスになることをおすすめする。2年間頑張れたあなたならすぐにいい案件が見つかるだろう。基礎概念がしっかりわかっており、それなりにプログラミングができるエンジニアの単価はあなたが思ってるよりも高い。20代でも十分月30-60万くらいは余裕で稼げる。こんなのでお金が貰えるのか?と思うくらいには高い。だが、何回も言うが2年間勉学を続けられる人はさほど多くない。

ここからは、フリーランスの先輩としてアドバイスさせてもらおう。稼げるかどうかは、能力が高いというよりもどの案件を引き受けるかにかかっている。高給で簡単な仕事というのはいくらでもあるがそれを見つけるのが非常に難しい。では、ここからあなたはどうするべきだろうか。いい案件を見つけるため、成長するため、何をすべきであろうか。

答えは、「人脈」を作ることだ。

当たり前のことだが、ビジネスの世界では、人脈が何より大切だ。フリーランスというのは、いわば1人社長である。自分で自分を売り出していくためにも営業活動はしておくべきだろう。自慢ではないが、私は今まで転職エージェントを一回も使ったことがない。全て、知人の紹介で仕事を取ってきた。みんながみんなこれができるとは限らないが、ある程度IT業界の知人を作ることも大切だろう。

さらには、どの分野で働きにいくのか考えることも大事だ。多くの人がいるフロントエンジニアなのか、やや難易度の高いバックエンドエンジニアなのか、それともネイティブアプリエンジニアなのか、インフラエンジニアなのか、などなど、一言でエンジニアと言ってもたくさんの種類がある。

私のおすすめは、セキュリティの分野と講師業だ。

セキュリティは希少性という観点から非常におすすめできる。これからの時代、多くのものがIoTでインターネットに結ばれるようになるとセキュリティエンジニアの需要が高まってくるだろう。そして、講師業に関しては、ある程度の実績があり人前で堂々と話せるのならばおすすめする。

第7章 まとめ

ここまで読んで頂いたあなたには最後もう少しお付き合いいただこう。

ひとまず、おめでとう。と伝えておく。90%の駆け出しエンジニアは、この記事を見かけてもここまで読んでくれすらしない。彼らは、役立つ情報かどうかの判定すらもできないということだ。私は、この記事に自信を持っている。他のどの記事よりも役にたつ真実を記述していると自負している。

そんな私の記事をここまで読めたあなたはある程度の才能はあると私は思う。おめでとう。

最初にも述べたが、私はフリーランスとして活動する一方で企業研修やIT塾の講師をさせてもらっている。そんな中、私がもっとも感じているのは「基礎概念」への理解の低さだ。ほとんどの生徒が「基礎概念」をおろそかにしている。

これだけ、量産型エンジニアが生産されるのも基礎概念を理解していないがためのことなのだろうと納得するレベルである。

ITの世界にはあまりにも多くの情報が溢れている。次から次に新しい技術が発表され、昨日まで動いたプログラムがversionの変化のために急に動かなくなるといったことすらある。このような移り変わりの早い世界で、全てのことを理解することは可能か?先ほども述べたが答えは、圧倒的にNOだ。

そんなものは、どんな天才でもできないと断言できる。では、どうするか?基礎的な技術を深く理解することが必要なのだ。

とあるGAFAの面接では自社のサービスを展開しているにも関わらずそれに関わる知識よりも、ネットワークやLinuxに関する基本的な知識を聞いてくる。

このことからもわかるように基礎知識は圧倒的に大切なのである。

では、なぜ「基礎概念」がおろそかになるのだろうか?おそらく、ITを勉強し始めた時に体系的にしっかりと学習しなかったからである。

中途半端な知識のままシステムエンジニアとしての道に進んでしまい、気がつけば後戻りできないようになっているのだ。

プログラミングスクールが悪いなんて言うつもりはない。各スクールの方々は努力してカリキュラムを整備しようとしている。だが、今の量産型エンジニアが増えている理由の一つの要因としてスクールの影響があることは事実だろう。

よって、あなたがすることは、スクールで学ぶことを最大限活かすためにスクールでは教わらないITの基礎概念を「自分で」学ぶことなのだ。

量産型エンジニアではなく、真に稼げる良質なエンジニアを共に目指そう。 技術的・メンタル面で相談/質問したいことがあれば、Line@のほうから連絡してくれて構わない。

Line@では以下のようなことを発信している。(2020年12月時点:登録者数750名)

  • おすすめのプログラミング言語
  • 初心者がやりがちな意味のない勉強法
  • おすすめの優良記事
  • 簡単な質問対応

特に、質問対応に関しては、利用しない手はないと思う。プログラミングスクールのメンターなどとは違い、大企業のIT研修を行なっている人に対して無料で質問ができる機会などきっとここ以外にない。1人1人対応しているため、返信に時間がかかるかもしれないが、きっとあなたの良き相談相手になれるだろう。下のリンクから登録してみてくれ。

landing.lineml.jp

最後に、一言まとめとして残して終わりとする。長い文章を読んでくれてありがとう。

基礎概念への理解を追求せよ

おまけ(モチベーションの保ち方)

勉強するモチベーションが続かない。

という人のためにとっておきの秘訣を授けておく。それは、課金することだ。スクールでもudemyでもProgateでもなんでもいい。課金すると人はお金を回収するために必死になって勉強する。無料でももちろん勉強はできる。しかし、課金した教材はもちろん無料のものよりクオリティは高いし、自分の勉強のモチベーションにもなる。

教材に課金したところで、毎月せいぜい数千-数万円単位のものだろう。2年後、あなたが月50万稼ぐつもりなら、一瞬でもとがとれる。たかが数千円を節約して、あなたの成長機会と成長意欲を失わないでほしい。

landing.lineml.jp