最近よくプログラミング未経験の方から、これからエンジニアとしてやっていきたい、もしくはそこまでいかなくても自分でプロダクトを作れるようになりたいけど何からやったらいい?っていう相談を受けるようになってきました。個別に色々話を聞きつつこれやってみたら?っていうリンク送ったりはしてたんですが、その人たちにとっての大まかな地図的な意味でも、(「これ見といて」って自分が楽するためにも、)未経験者の人におすすめする学習教材をまとめてみました。

参考事例

ぼく自身ゼロからエンジニアを育て上げた経験があるわけではないので、先人の事例に学べることは学ぼう、かつこうやって伸びた人がいるんや!っていう本人のモチベーションになったらいいな、ということで紹介します。

リブセンスさん

リブセンスさんの、非エンジニアを1ヶ月でエンジニアに育て上げる話、かなり強烈でしたね。フルコミットでかつ桂さんという突出したメンターがいたからこそできたことだとは思いますが、これからエンジニアを目指す人はぜひ目を通していただくことをおすすめします。

ゆーすけべーさんの弟さん

BoketeのCTOなどで有名なゆーすけべーさんの弟さんが文系職からエンジニアに転身する時の、お兄さんからの贈る言葉です。この記事とわりと趣旨が近いです。

村田自身の経験

ここに並べるのは大変恐縮なのですが、ぼく自身も文系出身でコンピューターサイエンスの知識が全くない状態でプログラミングの世界に入ったので、どういう経験をしてきたかというのは参考程度にはなるだろうというのと、こういうバックグラウンドがあるからこう言いたがんねんなっていうのを知ってもらう意味でも、過去に書いたそれっぽい記事を紹介しておきます。

上記を踏まえて

プログラミングを学んでいく上で一番のエンジンになるのは、やっぱり「自分の書いたコードが動いた!おれ天才!楽しい!」っていう気持ちだと思います。楽しいから続けられるし、新しい技術は新しいおもちゃみたいなもんやし、emacsに設定を加えてはにやにやするし、そういうのが楽しくなくなったらエンジニアやめるし。

なのでこの記事で色々書いていきますが、うへー多すぎってならずに、あくまで「今わかってるだけでこれだけ冒険する島があるで!」みたいに思っていただければ幸いです。そしてその島は無限に増え続けるので、全クリして飽きる日は多分一生来ません。

という大前提の下で、自力でWEBサービス作りたいなら、こういうのをやっていくとある程度高速道路に乗っかれるんちゃうかっていう一つの提案としてご覧ください。

UNIXのコマンド操作

何はともあれ、まず黒い画面に慣れることをおすすめします。とりあえずMacのターミナルでもいいので、黒い画面をどんどん使いましょう。

Vagrantというツールを使ってローカルに仮想環境を構築しておくと、作ったり壊したりしやすくなっておすすめです。Mac本体壊れたら結構めんどいですし。

フォルダ作ったり、ファイルコピーしたり、編集したり、保存したり、zipファイル落としてきたり、落としてきたzipファイルを解凍したり。「unix zip 解凍」みたいな感じでググればだいたいやりたいことは見つかると思います。

ターミナルでコマンドを叩いて、結果をよく見ましょう。成功してる?失敗してる?成功してたらちゃんと解凍したファイルは存在してる?(もちろんその確認もlsコマンドで)

エラーが出てたらひとまず何が言いたいか解読してみましょう。最初は面食らうかもしれませんが、難しい英語は滅多に出てこないのでこわがらずに読みましょう。解決の鍵はエラーメッセージのどこかに眠ってます。

がんばって読んでもわからなければエラーメッセージでググりましょう。出てこなければ誰かに相談しましょう。ぼくも未だにその繰り返しですが、確実にできることは増えていきます。

SPONSERD LINK

HTML・CSS

WEBページを作るための一番ベースになる技術です。WEBアプリは基本的にプログラムでこのHTMLを動的に作るものなので、まずこのHTMLとCSSは理解しておく必要があります。

とりあえずドットインストールで基本をさらって、1つ2つ自分でサイトを作ってみるのがいいかと思います。好きなサイトのクローンをゼロから組み上げてみるのも勉強になります。

プログラミング言語

HTMLとCSSが多少書けるようになったら、早速何かしら動かしてみましょう。言語は何でもいいですが、PHPとかjavascriptはWEBと親和性が高いので作ったHTMLに埋め込みやすいです。

ただまあそれなりのWEBアプリを作るためにって考えたらどれから入ってもそんなに大差ないと思うので、相談されたら個人的趣味でrubyをおすすめしてます。

これもまずはドットインストールで基本をさらっちゃうのがいいと思います。ドットインストール最高。

Git

Gitはバージョン管理ツールの一つです。書いたコードを保存したい時、大胆に書き換えたけどやっぱり戻したい時、他の人と同じファイルを同時並行で編集したい時・・・個人開発でもチーム開発でも活躍する場面はたくさんあるので、早い段階で使えるようになっておくといいと思います。

なかなか使いこなせるようになるまで大変ですが、とりあえず触ってみてなんとなく雰囲気を感じつつ、やりながらちょっとずつ中の仕組みを理解していくのが近道でしょうか。

個人差もあるでしょうし、初めての人がどういう風に学習していくと早いのかはあんまり自信がないところですが、多分こんな順番でやると混乱しにくいかもっていうのを並べてみました。

全部まとめてやるとだいぶ大変なので、とりあえず1個見たら自分の環境で色々いじってみて、よくわからなくなってきたら次のやつ見てとかそういう流れでやるといいかと思います。

この下はもっとあとまわしでもいいんですが、チーム開発する時のブランチをどういう風に管理していくかみたいな方法論も、さらっと目を通しておくといいでしょう。

Webの仕組み

ドットインストールでなんとなく動いたけどこれ裏側どうなってんの?っていうのを知っておくと、同じエラーメッセージを見ても「これはもしかしたらここの話かな」みたいな想像がつきやすくなります。

ゆーすけべーさんの記事で紹介されているこの本、ぼく自身読んだかどうか記憶が定かではないのですが、見た感じこのWEBの仕組みを学ぶにはよさそうな気がします。

あとこちらは3ヶ月以上アプリ作ってからで全然いいと思いますが、ネットワークの仕組みを解説した本で、個人的に実務1〜2年やったぐらいの時に読んで色々わかりやすくて感銘を受けたので紹介しておきます。

データベース

ある程度動くプログラムが書けるようになってくると、情報を保存したくなってきます。ユーザー登録機能を作ろうと思ったら、そのユーザーのメールアドレスとかパスワードとかをどこかに保存しないとログインできないですよね。

とりあえずMySQLが使えればだいたいそれでいけるので、またまたドットインストールで基本をさらいましょう。

「Excelにするとこうやな」みたいなのが脳内でイメージできれば、プログラムから操作する時も「これはきっと裏でこのSQL叩いてんねんな」っていう想像をしながら作れます。(その想像が正しいことを確かめるためにソースを読むのも大事です。)

ちなみに後述するRuby on Railsは、デフォルトでSQLiteというMySQLの軽量版みたいなやつが使われていますが、こちらは必要な時にコマンドをググればいいので改めて勉強するほどでもないかと思います。ぼくはなかなかコマンド覚えられないのでよくググってます。

WEBアプリケーションフレームワーク

本格的なWEBアプリを作るために必要な機能というのはこれまたたくさんあるんですが、これどんなアプリにもだいたい必要やんなっていう機能をまとめてくれているフレームワークがだいたいどの言語にもあります。

フレームワークというだけあって、アプリの作り方自体をある程度規定してしまって、そのお作法に則って作れば無駄な手間なくWEBアプリが作れちゃうというものです。

Rubyの場合は、SinatraとRuby on Railsという大きく2つのメジャーなフレームワークがあります。Sinatraは軽量で自由度高い代わりに自分で書く量が増えるので小規模アプリ向き、Railsはその逆で自由度低い代わりに大規模になってもごちゃごちゃしにくい大規模アプリ向きというイメージです。

一番最初はSinatraで何かしら作って、ブラウザから自分の作ったものが見える!操作できる!というのを体感するのはいいと思います。

ただRailsもチュートリアルやググった時の情報量が充実しているので、いきなりRailsから入ってもそんなに変わらない気はします。

この辺のチュートリアルを終えたら、早速自分が作りたいアプリを作ってみましょう!

チュートリアルの通りに作っていくのと、自分でどう作ればいいかを考えるのとでは間に大きなギャップがあるのでつまずきまくると思いますが、チュートリアルで作ったアプリのここをこう変えたらこうなるかな?とか、こういう画面を足したかったらチュートリアルのここをコピってここだけ変えて・・・とかやっていくとだんだんつかめてくると思います。

公開

作ったアプリを公開する方法はいくらでもあるんですが、外部のサーバーを部分的にレンタルしてそこにアプリを置くのが一般的です。自分のPC上から全世界に公開することもできますが、セキュリティ的に危ないのとPCの電源切ったらサービス使えなくなって不便なのとで普通はやりません。

ドットインストールにもいくつか方法は上がってますが、とりあえずさくっと公開したいならHeroku、Linuxを色々いじって勉強するならさくらVPS、もっと小回り利かせてサーバー立てたり落としたりしたくなってきたらAWSという感じです。

とりあえずHerokuで公開してみて、うまくいったら次の挑戦としてさくらVPSを借りてそこでがちゃがちゃやってみるというのがおすすめです。AWSはまあもっと後でもいいと思います。

セキュリティ

自分のパソコンの中だけで見れるサービスであればあんまり気にする必要はないんですが、全世界に公開する場合は色んな悪いやつの目にもさらされることになります。有名な大企業でもよく情報漏洩のニュースが流れてきますが、WEBサービスを作って公開する以上は他人ごとではありません。

自分のサービスにどういう攻撃ができて、その攻撃でどんな被害があって、それに対してどういう風に穴を塞ぐかというのは知っておく必要があります。

ありとあらゆる攻撃を完全に防ぐのは(公開をやめない限り)無理で、攻撃する隙を探しまくってるやつと、その穴を塞ぐ人たちのいたちごっこが終わることはありません。自分が書いたコードが悪くなくても、使ってるフレームワークや乗っかってるOSに穴があることも珍しくありません。

なんですが、広く知られている攻撃方法とその対策というのはたくさんあって、Railsのようなフレームワークに組み込まれているものも多いので、早めのタイミングで勉強してしまいましょう。

「徳丸本」と呼ばれる、WEB業界のセキュリティの必読本があるので、まずはそこから始めるのがいいと思います。

その他

ある程度コードを書いていくと実感すると思いますが、自分で書いたソースが1か月後には自分で読んでも意味がわからなかったりします。

達人プログラマーを書いたDavid Thomas氏曰く、「いいコードの条件はただ一つ、変更しやすいことだ」とのことですが、コードの読みやすさ、すなわち可読性はこの変更のしやすさの重要なファクターです。

その可読性を上げるための方法論をまとめたこちらの本は、月イチで読み返してもいいぐらいだと思います。

終わりに

ということで、ひとまず自分でWEBサービスを作って公開するまでに必要になりそうな最低限の知識をまとめてみました。

一応独学できる教材を集めましたが、やっぱりわからなくなった時にすぐ聞ける人がいると成長速度は全然違います。聞けば3分で解決することを、自力で調べたら3日かかってもわからんとか全然あります。一緒に仕事する後輩とかには「5分調べてわからんかったら聞いて」って言ってた気がします。

直接聞けるメンターを作るのがベストですが、難しい場合の有料サービスを桂さんのスライドから引用して紹介しておきます。

この記事で少しでもプログラミング人口が増えたら嬉しいですねえ。

追記

  • 2015/09/06 WEBアプリケーションフレームワークのところに「小学生でもわかるRuby on Rails入門」を追加
  • 2015/09/11 Gitのところに「Github-flowを分かりやすく図解してみた」を追加