プログラマーワナビー(プログラマーを仕事にしたいと思っている人)は多いらしい。
しかし、プログラマーってのはある意味で特殊な仕事なので、一般人からしたら「いったい何から勉強すればいいのか?」がわからないと思う。参考書買ってコツコツ勉強したからといってプログラミングが身につくわけではない。
あと、ドラマや映画なんかでは「天才的な数学的能力を持ったヤツが高速でキーボードを叩く」ってのが、プログラマーのステレオタイプとして描かれたりする。
実際のプログラミングの作業は、そういうのとは全然違う。
この記事では、まだプログラミングをよくわかってない人に向けて、「プログラマーにとっては常識だが、一般人や初心者からすればわかりにくいこと」を解説していく。ある程度プログラミングの実力がある人は一切読まなくていいぞ。
プログラミング(IT関連の技術)の勉強法がわからない人や、これからプログラマーになりたいとなんとなくでも思ってる人は、参考にしていってくれ!

目次
多くの人がプログラミング学習について勘違いをしている
小学校でも「プログラミング教育」が必修化されて、カリキュラムに導入されるそうじゃないか。実務的なプログラミングを学ぶんじゃなくて、「プログラミングに必要な論理的思考」を磨くためのプログラミング教育らしいけど、モノになるかは疑問だ。
後で詳しく述べていくが、プログラミングってのは本質的に学校教育とは相性が悪い分野なんだ。「教科書的なインプット」や「論理的思考力を鍛える」作業をこなしても、プログラミングができるようになるとは限らない。学生のうちは、手堅い数学や英語をちゃんとやったほうがいいと思うぜ。
別に小学校からプログラミングを教えることに意味がないと主張しているわけではない。ただ、仕事で使えるレベルのプログラミングを身につけるためには、「学校教育」的なものとは別の学び方をする必要があるんだ。

プログラミングをする上で最も大事なこと
プログラミングをやる上で最も大切なのは、「調べて、完成させる(動くものを作る)」ことだ。
「学ぶ」よりも、「動かす」ことがとにかく大事!この感覚は、プログラミングをある程度やってみた人でないと理解しにくいかもしれない。
- 体系的な知識を座学で学ぶ
- ドリルなどで反復練習をする
- テストをやって身についているかどうか確認する
みたいな、学校の勉強と同じやり方は、プログラミングを身につけようとする上では、あまり効率的とは言えない。
それよりも、少なくとも初心者の段階では、「とにかく動くものを作ってみる」ことが最も重要になる。
実はあまり効率的ではないプログラミングの勉強法
より詳しく説明していく。
プログラミングを身につけたいと考えている初心者は
- 覚えたい言語の参考書などの書籍を買う
- プログラミング言語の記法を覚える
- 参考書についているサンプルプログラムを写経する
- サンプルプログラムを、何も参考にせずとも最初から組み立てられるまで反復練習する
といったやり方でプログラミングを学ぼうとしがちだが、これは学校のお勉強が得意だった人によくあるパターンで、間違った学習法だ。
この方法が万人にとって最悪なわけではない。プログラミングやITのことがまったくわからない初心者からすれば、こういう練習をある程度こなすことには意味があるだろう。慣れ親しんだ学校教育の延長で知識を身につけることができるので、勉強しやすいというメリットもある。
しかしそれでも、上の方法は、プログラミング学習としてはあまり良いものではない。やらないよりはやったほうが全然いいんだけど、プログラミングの本質的な能力が身につくわけではない。

推奨されるプログラミングの身につけ方
プログラミングができるようになりたい人がやるべきなのは
- まずは(無理やりにでも)作りたいと思うものを決める
- なんとかしてそれを完成させる
以上。
拍子抜けするかもしれないが、これだけだ。
技術そのものを勉強しようとするのではなく、作りたいものを決めて、その目的に向かって必要なことを調べたり身につけたりしていくことが大事。
プログラミングとは手段なので、何かを一生懸命作ろうとする過程で自然と身につく。「プログラミングそれ自体をそれ自体として学ぶ」のは難しいので、「作りたいものを作ってみる」というのが、王道のプログラミング学習法だ。そもそも今のプログラミングで使われている技術はそれほど体系的なものではなく、トレンドによって変化していく。Wordやexcelなどのソフトの仕様が本質的と言えないように、rubyやpythonなどの言語も本質的ではない。
だからこそ、プログラミング界隈では、「自主性」や「公開しているプロダクト」に重きを置く風潮があるんだ。
作りたいものが無い人はどうすればいいのか?
とは言え、「プログラマーにはなりたいけど特に作りたいものとかねえよ!」って思うヤツは少なくないだろう。
プログラマーという生き方には憧れるけど、特に作りたいプロダクトや興味のある技術分野はないって人。これはむしろ真っ当な感性だと思う。プログラマー界隈にはそういう姿勢を冷笑する人もいるが、作りたいものが無いけれど良い待遇を求めてプログラマーを目指すのは何も間違ってないぞ。
プログラマーは給料や待遇の良い職業だし、技術に興味はないけど良い労働条件を目指してプログラミングを身につけるというは何もおかしくない。技術に関しても、やってるうちに興味のある対象が見つかる場合がほとんどだ。あと、まったくITに興味がない状態からプログラミングを身につけたからこそ見えてくる視点もあって、そういうのは意外と社会で働く上で役に立つ。
しかしながら、「作りたいもの」が明確にあるほうが、プログラミングを身につけやすいことは間違いない。何かを作るために新しい技術を身につけるのはマジでキツい作業に耐えなければいけないので、モチベーションが高いほうが成功しやすい。
俺が言いたいのは、「作りたいものが見つからないならプログラマーになれない」というわけではないということ。世の中には成果物に対して何の興味も持っていないプログラマーだってたくさんいる。
プログラミングを最初にマスターする上では、「作りたいもの」を持っていると有利なのは事実だ。プログラマー目指してるけど特に作りたいものが無い人は、「みんなから評価されそうなものを作る」とか「誰かの役に立ちそうなものを作る」というモチベーションを無理にでも立ち上げて、とにかく「作りたいもの」を最初に決めよう。
「お勉強」に時間をかけてはいけない
一般的にプログラミングを学習するときは、「if文」「for文」「変数」「配列」「クラス」などの概念が出てきて、その使い方を確認するところから始まる。これは確かに重要なのだけど、ここの部分を何度もやったり書き方を覚えたりしても、プログラミングができるようにはならない。
「なぜクラスやインスタンスの仕組みがあるのか?」というのは、実際に自分のやりたいことにそれを使ってみて、そのありがたさを実感するまでは、全然ピンと来ないものだからだ。「技術」それ自体をそれ自体として学ぶのは難しいし、ほとんどの場合は無為な作業になる。
あと、学校のテストとは違うのだから、「書き方」をしっかり覚えるみたいな勉強はまったくやらなくていい。どうやって書けばいいのかわからないときは、ドキュメントや手元の参考書をすぐに見ればいいだけで、詳細な記法を長期記憶する必要は一切ない。むしろわからないときにサッと調べる能力のほうがずっと重要。
少なくとも初心者のうちは、プログラミングにおける「お勉強」の部分はサラッと流して、なるべく早く「作ろうとしている対象」に向き合おう。

対象を知ることがけっこう重要
これは結構ないがしろにされていることなのだけど、作ろうとしている対象に関する知識は、実はかなり重要だ。
例えば、「スマホアプリ」を作りたいのであれば、「スマホアプリとは一体どのようなもので、どうやってインストールされ、どうやって使われて、どのようなアプリが人気なのか」といった、その対象に対する知識がたくさんあるほど良い。
プログラミング言語自体は、細かい仕様などで注意すべきことはあるけど、そんなに難しいことはない。
ただし、「ウェブ」や「アプリ」や「ゲーム」といった、作ろうとする対象それ自体が、一筋縄ではいかなかったりする。
まあここらへんは、実際にプログラミングで何かを作ろうとしていく中で身についていくので、あんまり重く考えなくていい。
簡単に言えば、「ツイッターを使ったことない人が、ツイッターのコピーアプリを作ることはできない」ということだ。ツイッターみたいな機能のウェブアプリケーションを作ってみようとする場合、まずはツイッターがどういう動きをしているのか理解できる、ウェブやSNSに関する知識が必要なんだ。
ゲームなんかの場合も、自分の作りたいゲームと似ているゲームがどういう動き方をしているのか理解するところから始めるべきだろう。
当たり前だが、よく知っているもののほうが作りやすいし、まったく知らないものは仮にプログラミング能力が高くても作れない。
具体的に何をすればいいのか?
ここまで読んでも「じゃあ具体的に何をやればいいんだよ!?」と思う人がいるかもしれない。
ゲームとかは作る対象としてわかりやすいんだけど、ゲームにまったく興味がない人も多いだろうから、ここでは「スマホアプリを作ってみる」という目標をとりあえず立てることにする。
自分のスマホがiPhoneなら「iOSアプリ」、Androidなら「Androidアプリ」を作るのが無難だろう。
それでは、「iOSアプリを作ってApple Storeにリリースする」という目標に決める。
まず初心者が最初に何をすればいいかと言うと
- 「iPhoneアプリ 作り方」
- 「iOSアプリ 制作 初心者」
- 「iOSアプリ リリース 方法」
といったワードでGoogle検索し、ページを上から読んで、自分にとって必要な知識を集めていく。途中で出てくる「Xcode」「Swift」などの単語で気になることがあれば、そのつどググって調べよう。
プログラミングの基本中の基本は、コードを書くことではなく、ググって調べることだ。
iPhoneアプリといったメジャーな領域なら、日本語で検索しても十分な情報が出てくるだろう。(プログラミングには数学よりも英語が大事というのは、単純に英語でググれたほうがアクセスできる情報が増えるからだ。)
「for文」の書き方なんかも、わからなくなったら「Swift for文 書き方」などとググればすぐに出てくる。少なくとも初心者のうちは覚える必要は一切ないので、全部調べながら解決しよう!
そもそもコードを書き始める前に、「自分のパソコンにiOSアプリを開発する環境を用意する」という最初のハードルを超えなければいけない。初心者にとっては、「環境設定」の時点でかなり難しさを感じるはずだ。というより、「環境設定」という最初の大きな難関さえクリアできたのであれば、根気よくやればアプリのリリースまでいける素質は間違いなくある。
やっていく途中で、「どうしても体系的な知識が必要だ」と感じたなら、その時点で参考書などの書籍に手を出そう。最初から本を買って頭から読んでいくのではなく、あくまで作りたいものを想定した上で、必要な知識を身につけるために読む。
「どういうアプリを作るか」だが、大抵は調べたりしていく中で方向性が定まってくる。もちろんいきなり大したものは作れないだろう。ただ、「初心者である自分の技術力で可能な中で、なるべく評価されそうなものを作る」という姿勢がすごく大事。これができていないと、技術力はやたら高くても搾取されるだけのプログラマーになってしまう。
やっているうちに、必ず、色んな問題が起こる。例えば、iOSのアプリはWindowsのパソコンからは作りにくいかもしれない。WindowsのパソコンとiPhoneを使っている人なら起こりうる問題だろう。このような問題に対して
- 目標をAndroidアプリの開発に切り替え、中古で安いAndroidのスマホを買う
- WindowsのパソコンでもiPhoneアプリを開発できる環境を揃える
- Macのパソコンを買う
などといったアプローチが考えられるのだが、アプリを開発してると、こういった些末な問題に何度も突き当たる。それを「解決」するための明確な答えはない。一つ一つが些末なものだから、すっきりするような解答もなく、誰かに聞けば解決するというわけではない。自分で調べて考えなければならない。答えのない問題を、試行錯誤して「解決」することこそが、プログラミングの本質的な力だ。
つまり、最初から環境がしっかり整備されている学校教育とは別種のものなのだ。プログラミングは環境に追従するのではなく、環境そのものを変化させる破壊的な力を持っている。だからこそプログラミングができる人間は力を持つ。その力を手に入れるためには、まずは何らかの成果物を自分の手で形にしてみるしかない。

プログラマーにとって最も重要なこと
日本には、学校教育的なものの延長上でプログラミングの仕事をするという、地獄のような職場が存在する。そこでは、仕事の途中にインターネットを自由に使うことが許されず、技術力の無いプログラマーたちが過酷なブラック労働で消耗させられていると言う。いわゆる「IT土方」と呼ばれるような世界だ。
俺はそのすべてを否定するわけではない。そのようなやり方でしか作れないシステムだってあるのだろう。しかし、そういう職場で働くために、今から新しくプログラミングを身につけるのはやめたほうがいい。
新しくプログラミングを学ぶ人には、「プログラミングには環境を更新し、問題を解決する力がある」ということを意識してもらいたい。
やらなければいけないことが明確に示されていて、そのための環境が用意された場所での仕事は、楽かもしれないが、「刺身の上にたんぽぽを乗せる仕事」とほとんど変わらない。
自分で問題を設定するスキルと、その問題を解決するために頭を使えるスキルが、プログラマーには致命的に重要だ。
- 最適な目標を設定できる
- 目標達成のために必要なことを自分で調べることができる
- それを動かす(完成させる)までに生じる様々な問題を自分の力で解決できる
美しいコードの書き方や、言語やマシンに対する知識より、「動く」という結果を作り出せることが、プログラマーにとっては重要。
体系的な知識を順番に学んでいくことはは、学校での勉強が得意な人からすれば心地よいかもしれない。しかし、それができることと、「動かす」までに試行錯誤する能力は、別のものだ。
プログラマーの仕事の大部分は、些末な問題に苦しみ、色々と調べながらその解決策を見つけ出す作業だ。それなりに給料を稼げるプログラマーになりたいのであれば、この訓練は避けては通れない。

アウトプットが評価される文化は確実にある
プログラマー界隈には、間違いなく、学歴や年齢や働いた年数よりも、アウトプットしたものが評価される傾向にある。なぜなら、そこそこプログラミングができる人は、本記事で述べてきたことをちゃんとわかっているからだ。そして、「完成させた」経験のある人間がどれだけ貴重かも、それなりのレベルの人なら理解している。
だから、職歴のない初心者(ワナビー)がエンジニアとして良いところに就職したいなら、やるべきことはシンプルで、「自分で完成させたプロダクトを公開すること」だ。
アプリやゲームをリリースする必要はなく、「GitHub」にでも上げておけば十分だろう。今はプログラマー全然足りてないし、おそらくこれからますます足りなくなるので、「書ける」人の需要は絶対にある。
当然だが、プログラマーが就職するのに転職エージェントや派遣会社なんて使う必要がない。Wantedlyとかのウェブサービスでもいいし、下手したらTwitterからでもかなり良い給料もらえるところに入れる。
仮に学歴や職歴がなかったとしても、ある程度のプロダクトを世間に公開していて、まったく就職先が見つからないなんてことはまずないだろう。

プログラマーになりたい初心者はまずは作ってみろ!
長くなったからもう一度重要なことをまとめると、
該当する技術を学んでから作るものを決めるよりも、最初に作るものを決めてから必要なスキルをそのつど調べて身につけていけ。
ってことだ。
もちろん世の中には一人の力では完成させることができないプロダクトはたくさんある。
SE(システムエンジニア)が大まかな設計をして、IT土方が必死に組み上げる、という形でしか作ることのできないものだってきっとあるのだろう。
一口にプログラマーといっても、システム、WEB、アプリ、インフラ、ゲームなど、それぞれやり方が違ったりする。
ただ、少なくとも言えるのは、今からプログラマーとして働きたい初心者がやるべきなのは、「とにかく何か作ってみる」ことだ。それが王道中の王道であり、ここに異論のある人は少ないと思う。
一度プロダクトを完成させて公開してみると、今までとは違った景色が見えるようになるし、こういう初心者用の記事を長々と読んでしまうこともなくなるはずだ。
お前がまともなプログラマーになれることを願ってるぜ。頑張ってくれ!
なお、具体的な勉強法の指南が必要な人のために、以下の記事を書いた。
この記事の内容が納得できた人は、ぜひこちらのほうも読んでみてほしい。プログラマーを目指す人にとって有益な情報になっていると思う。
今まで読んだ中で一番しっくりきました。