自分は2年前にプログラミングを始めました。
ブログを始めたのもちょうど2年前、その時はブログでマネタイズすること必死でSEOを極めたりしていたけど、いくら毎日一記事書いて検索結果で1位獲得しても、お金を稼げるだけで自分の出来ることがスケールすることもないな、と思い、可能性を広げるためにプログラミングを始めたのがきっかけ。
ブログに関しては、その時自分のかなりのリソースをかけていて、マネタイズという意味では成果が多少出たものの、一人で目標を達成するためにブログを書き続ける孤独感だったりに耐えられず、やめたという負の経緯があります。
どうせ作るなら、ブログじゃなくて大きいWEBサービスを作って、もっとマネタイズの幅を広げたい!くらいの動機だったでしょうか。
そこから、ドットインストール、Progate、海外のW3Schools Online Web Tutorialsなどを活用してコードを書き始めるようになりました。
さらにそれから2年ちょっとして、今プログラミングでWEBサービスではそれなりのものが作れるようになって来たので、自分なりのプログラミングの知識を還元できればと思ってこのプログラミングの勉強法に関する記事を書きます。
正直な話、2年でこの程度かというレベルの実力しかあげられませんでした。同じくらいにプログラミングを始めた人でも、優秀な人はライブストリーミングやら、メディアを作り短期間で企業にバイアウトなどもしているので。
この記事は自分がプログラミングを習得するために試行錯誤した中で、今振り返って反省の糧として書き残しているので、今プログラミングを一生懸命勉強している人に同じ轍を踏まないように参考にしてもらえればと思います。
今振り返ってプログラミング学習で後悔していること
大学はプログラミングが関係ない学部で、最初は趣味程度かなと始めたプログラミングで、ここまで自分のリソースの大半を注いだという訳ではないのですが、やはり当時に戻れれば最短距離で実力をつけたかったなーと思います。
一番最初の苦痛から逃げ出さなければよかった
何事も始める時が一番苦痛で結果が出ないと苦しいですが、プログラミングの苦しさは随一だと思います。
いくら調べど自分の中で知識の整合性が取れない悲しさ。プログラミングって覚えることが多すぎて、最初の頃はオーバーワークになりガチなのですが、何も考えずに盲目的に乗り切るべきだったです。
果たして前に進んでいるのだろうか、今のこの独学の勉強法で正しいのだろうか。しっかりとしたWEBサービスを自分は作れるようになるのだろうか。
特に独学でプログラミングを学ぶとなると、不安・迷いはつきものですがそれを吹っ切って進むことが大切だったなと。今だったら盲目的に本を読みまくって知識を入れて、コードを書きます。今は自分もそうしています。
学習の初期段階の置ける成長曲線は、大きく分けると上の2種に分類できますが、`独学のプログラミング勉強が描く曲線は明らかに後者です。
逆に、ある程度プログラミングがわかってくると、新しいことを勉強するにしても自分の既存の知識だけである程度予測が立つようになる。これはおそらくこういう動作原理なんだなっていう仮説が立てられるようになる。
プログラミングが習熟してくればするほど、この予測や仮説の制度が上がってくるのでそのぶんプログラミングの学習速度が加速します。
端的に言えば、
何も知らない人が初めてRubyを習得するのと、RubyもPythonもGoもJavaもScalaもJavaScriptもHaskellもかける人が学ぶSwiftでは、学習にかかるコストが全然違うってことなんです。
だから、プログラミングを勉強し始めた人はこの特性を理解して、確実に上に上がっていることを理解して欲しいです。指数関数は単調増加関数ですから。
周りがコードをかけて当たり前の環境に行けばよかった
今であれば、周りにコードをかける人がいる環境は当たり前ですが、プログラミングを学んだ当初は、当然一人ぼっち。
自分が初めてエンジニアになった環境でも、エンジニアは業務委託の人一人しかいませんでした。その場所でコードを書いていても、身につかないんですよね。
1. ウンウン無駄に考えて、時間を溶かしてしまう。
2. 考えても最良の解が得られず、問題解決が後回しになってしまう。
で結局成果も出ないし、実力も身につかないです。
悩むと考えるは違うということですが、プログラミングにおいては、必要以上に悩む時間が多い人の成長速度は、めちゃできる人のそばにいてグイグイ成長している人の成長速度と比較したらゼロ近似できるくらい、無用な長物です。
理論物理学だって、その体系を学ばなかったらいくら考えても現在の物理学の最先端にまで思考が行き届く人はいません。仮に5000年生きていたとしても。
車輪の再発明ではないですが、プログラミングを最適に学ぶには経験のある人からユースケースに即した最適な実装方法を学ぶのが、最短距離にしてかつ苦しまずにすみます。
周りに質問に答えてくれる人をそばにおく
これが僕の中の後悔で一番大きいものです。
学生であれば一番てっとり早いのは、
ある程度プログラミングができる人であれば、OSS(オープンソースソフトウェア)の開発をするのが良いかなと思っています。自分はまだOSSの開発のレベルには至ってないですが、今年中にRuby on RailsとVue.jsというJavaScriptのフレームワークの開発を行うことが目標です。
プログラミングの勉強の要は、読書によることも多い
自分はマックスで月間20万円以上、技術書に費やしました。最初はhtml,cssの本、次にJavaScriptやJquery、Rubyの本、Railsの本を購入し、レベルが上がってくるとオブジェクト志向の本や、Rubyのメタプログラミングの本、実際にサービスをデプロイしてみたくなるとネットワークの本、AWS、インフラ関係の本、またそれとは別に、SoftwareDesignやWEB DB pressの定期購読など・・・
買いたい本はとにかく買う姿勢でいました。
本田圭佑氏も最近投資の必要性を語っていましたが、フィジカルトレーニングだと思って毎日勉強しています。
すでに完成されているハイレベルなコードに触れる
独学でプログラミングの勉強をしているエンジニアや、プログラミングのスクール出たばかりのエンジニアが必ずぶつかる壁が、実際のプロダクトとは全くかけ離れたレベルの自分の成果物をみて唖然とします。
それはしょうがないです。
実際にWEBサービスとして世の中に出されているものは、数多くのマーケッター、デザイナーエンジニアが総力を合わせて何度もPDCAを回してできた現時点での最高の成果物、であり、独学でプログラミングを勉強した初心者が1日や2日でちょこっと作ったものを超えられるはずがないです。
だからそれをあたり前と捉える。
むしろ、その最高の成果物を自分で触れ、自分のものプロジェクトに入ることで視座がめちゃくちゃ上がります。
アウトプットをどんどんすればよかった
アウトプットの形式は問わないので、自分が学んだことをどんどん発信することをすればよかったと思いました。
プログラミングを学んだ当初は知識が体系化されていなくて、情報をまとめてブログを書くってのはすごく難しいのですが、Qiitaであったり身近な人の質問に答えるだったり何らかのアウトプットをすればよかったと思います。
アウトプットの手段は問わないですが、自分の知識を外に出すことが重要です。これにより、自分の中でもインプットが加速しますから。
良質なインプットは良質なアウトプットを産みだし、良質なアウトプットはインプットを加速させます。
コードリーディングをもっとすればよかった
やればよかったことは無限にあるんですが、特にプログラミングの勉強法としてコードリーディングはやればよかったと思いました。
独学でプログラミングを勉強するとしても、業務レベルやWEB業界のスタンダードレベルの開発をするにはかなりのギャップがあります。
githubを活用すれば、良質なソースコードを読むことができます。
railsそのもののコードはruby力を鍛えるのにかなり実力が身につくと思います。
gitlabを導入している企業も多いですが、これもソースコードが公開されているのので、独学で勉強している人でも読むことができます。
最初から大きな理想を描き続けない
こういうサービスを自分で作りたいな〜とか思うのは大事なこと。
ですが、それを1ヶ月や2ヶ月で作れるとは思わない方が良いです。そういう人は大抵、プログラミングが地道な作業と多くの知識を土台として良いサービスができている事実を知った瞬間。挫折するので。
プログラミングの勉強法でよかったこと
隙間時間にものをどんどん作った。
これからも続けていきたい習慣で一番上にくるのが、時間がなくても自分のプロダクトを作り続けること。プログラミングの良い勉強法のように思えないですが、初心者が独学でプログラミングを習得するのに一番の近道です。
自分はスモールスケールでも自分が作りたいものを作って、デプロイまで行える人を尊敬しています。
インターン先ですごいプログラマーを何人もみて来ましたが、気軽に新しいアプリケーションを自力で編み出している。
Railsであれば、どれだけの頻度でrails newのコマンドを叩いているかが、将来大きな差になってきます。
最初のプログラミング言語でRubyを選択してよかった
これは本当によかったことです。WEBサービスのアプリケーションのフレームワークとして、Ruby on Railsを選択したことも非常によかったと思っています。
自分はまずRuby on Railsを独学で習得したのですが、これにより職場の選択肢が急激に広がりました。
特にWEB系のプログラマーになるんであれば、Rubyは定番だと思った方が良いです。Java, Go, Scalaなどもありますが、一番最初の言語として習得するにはハードルがいささか高いような気がします。
Ruby は何と言っても手軽なのが取り柄なので、初心者でもRailsでscaffoledとうコマンドを使えば、WEBアプリケーションが作成できます。
簡単なアプリケーションを作れることは侮れないです。モチベになる。自分のやれることが広がるイメージが持てることは、本当に大事なことです。
Javaの小難しい本を読んでプログラミングの勉強を挫折した人は、もう一度RubyとRailsを使って再度挑戦して欲しいです。
既存の実力に満足して楽をしないこと
特に独学の場合ですが、プログラミングの勉強を始めた当初はわからないことだらけで、何事も学びになるのですが、だんだんと好きなようにWEBアプリケーションが作れるようになって来ます。
その時フリーランスとして自分の実力で楽に作れるようなアプリケーションばかり作成していると実力が伸びなみます。
自分はその組織の中で一番できないやつになる!を肝に命じて、とにかくできないことを優先してやっていました。
ポジティブな理由でエンジニアリングをしている
エンジニアリングをしている個人的な理由はどうこういう必要性はありますが、自分はプログラミング自体が好きである人の方が成長速度が早いように感じます。
プログラミング自体が好きでなくても、サービスを作ってユーザーに価値を届けること、技術を身につける過程が楽しい、エンジニアリングで物事を効率化したい!
色々理由はありますが、そこにポジティブな理由を身につけられるといいかなと。
初心者にオススメの参考書
最後に、ようやく自分も初心者のゾーンを抜けて来たと思うので、僭越ながらオススメの参考書をオススメします!冒頭の理由からも、自分が所有していて本当にオススメと思った本しか紹介しません。独学でプログラミングを勉強しようとしている人にもオススメの本を紹介します。
定番中の定番 リーダブルコード
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (138件) を見る
WEBエンジニア界隈の人なら必ず1度は読んでいると思われる名著。自分は今まで3社で働きましたが、全ての会社の本棚に格納されていました。
メソッドの命名方法から読みやすいコードとは、エンジニアの生産性に関わることまで、エンジニアのバイブルとなる本と何度も紹介されました。プログラミングの知識がなくても読める内容となっているため、独学でプログラミングを勉強している人にとって一番最初に読んで欲しい参考書です。
リーダブルコードよりも具体的ながら深い内容!何度も読み直したいプリンシプルオブプログラミング
プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則
- 作者: 上田勲
- 出版社/メーカー: 秀和システム
- 発売日: 2017/04/27
- メディア: Kindle版
- この商品を含むブログを見る
先述のリーダブルコードよりも内容が具体的になっており、非常に読みやすい本です。リーダブルコードと異なり、コードレベルでのユースケースと紐づけられていないので、ある程度プログラミングに慣れていないと難しいと感じるかもしれません。しかし内容は網羅的で、プロのエンジニアとしてどういう風にコードに接しているのかがわかるので、独学でプログラミングを学んでいる人にはオススメの参考書です。
HTTPやWEBの仕組みなど低レイヤーの知識が網羅的に身につく
Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術
- 作者: 渋川よしき
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
結局WEBってHTTPリクエストをサーバーに送って、レスポンスを受け取ってブラウザで表示しているよね。くらいの理解があれば読める本。HTTPのプロトコルの詳細や、本来ステートレスなHTTPがどうにユーザーを認識しているのか、みたいなところがわかるようになります。本の後半でHTTP/2の説明もありますが、ここまで詳しいのは現状だとこの本だけでしょう。
WEBの仕組みについて知りたいならオススメです。
- 作者: 竹下隆史,村山公保,荒井透,苅田幸雄
- 出版社/メーカー: オーム社
- 発売日: 2012/02/25
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 34回
- この商品を含むブログ (37件) を見る
TCP/IPのプロトコルが詳細に説明されています。
新しいRubyの定番
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る
つい最近発売された本!購入してサクッとみたくらいですが、従来のパーフェクトシリーズよりも網羅的でわかりやすいです。Rubyの言語仕様について一通り学びたい人にオススメです。
Rubyは言語構造が複雑で学べば学ぶほど深い言語です。
WEBのセキュリティなどを網羅的に学べる
体系的に学ぶ 安全なWebアプリケーションの作り方[固定版] 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2013/08/14
- メディア: Kindle版
- この商品を含むブログを見る
XSS, CSRF, SQLインジェクションってどんな脅威か説明できますか?Railsの内部でどう防いでいるか説明できますか?っていう面倒臭いけど大事な問いに対して回答を用意してくれている本です。なる早ではないですが、時間がある時に読んでおいて損はない参考書です。
メタプログラミングRuby
メタプログラミングの極意がわかる本。例えば、Railsのコードを書くだけでなく、Ruby on Rails自体のソースコードを読む時に真価を発揮してくれます。
普段何気なく使っているActiveRecordは、データベースのカラムと紐づいたメソッドをrailsの起動時に動的に作ってくれています。この本を読んで自分の中で咀嚼することで、その動きを説明できるようになります。
Rubyの仕組み
Rubyのしくみ -Ruby Under a Microscope-
- 作者: Pat Shaughnessy,島田浩二,角谷信太郎
- 出版社/メーカー: オーム社
- 発売日: 2014/11/29
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
Rubyの言語仕様について。あまり知られていない本ですが、C言語で作られているRubyがどういう仕様になっているかがわかります。
独学に良いと紹介されたことがある本
まだ読みきれてないですが、過去Qiitaで紹介されていたり知り合いずてに聞いた本を紹介します。
ビックデータと書いてありますが、実際のユースケースが100例ほど紹介されておりSQLの実務力が上がりそう。
- 作者: ジョー・セルコ,Joe Celko,ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2007/11/02
- メディア: 大型本
- 購入: 18人 クリック: 335回
- この商品を含むブログ (27件) を見る
過去サマーインターンで行った時に、天才エンジニアと称される人から紹介された本
オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)
- 作者: アラン・シャロウェイ,ジェームズ・R・トロット,村上雅章
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
よく見かけるオブジェクト指向の本
オブジェクト指向設計実践ガイド ?Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方
- 作者: Sandi Metz
- 出版社/メーカー: 技術評論社
- 発売日: 2016/09/02
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
Rubyのコードベースでオブジェクト指向が理解できる。翻訳のせいでかなり読みにくい文章になっているので注意
プログラミングの勉強はどの道を進んでも結局重要
将来的にエンジニアになる気がないよ!って思う人も、プログラミングをやっていて損はないかと思います。
大学の実験結果を解析する時、xecelでちょこっとマクロを組んだり、データをRubyに流し込んで解析をするみたいなこともできるようになります。
営業でメルアポすることになった時、メール送信するスクリプト組んで一定時間に自動送信したり〜とかプログラミングができるようにもなります。
いきなりプログラミングを自分のものにするのは難しいですが、少しづつコードを書く習慣をつくことで、時間はかかっても自分の力になるので、この記事が少しでもプログラミングの勉強をしているみなさんの参考になれば幸いです。