プログラミングについて何も知らない人間がIT企業の学生インターンに参加できるようになるまで
こんにちは。
内容はタイトルの通りですが、とりあえずこの記事の目的としては以下のことを目指しています。
目的:この記事を読んだ人が独学でプログラミング技術を身に着けて思い描いたものを作れるようになる
「今からプログラミングの勉強を始めたいけど、何からやってどこに向かえばいいのか分からない!」
という人の助けになるようなものができれば幸いです。
始めになぜこんな記事を書こうかと思ったかを書いているので、そんなもの興味ないという人は適せん飛ばしていただければ良いかなと思います。
(書き終わってから気づいたのですが結構本の紹介が多いです。)
この記事の構成は以下の感じです。
つまりプログラミング初めて4年くらいでちょいちょいお金もらえるくらいプログラミング書けるようになるよってことです。
しかし実際は4年もかかりません。
自分は学生生活で遊びまくっていたので、上記の1年は1か月くらいで学べる内容だと思います。
つまり、
出会い→1か月目→2か月目→3か月目→4か月目
と読み替えていただければ良いかと思います。
試行錯誤しながらウネウネしたので4年もかかってしまった訳で、ヤル気あれば1~4か月くらいで下記の内容をさらうことができると思います。
以下の説明では様々な本が登場しますが、「これを読め」という訳ではなく私はこれを読んだというだけで、Webの情報でも良いですし、図書館で似た本を借りて読むとかも良いと思います。その辺は柔軟に。
なぜこんな記事を書いたか
先日、某IT企業のインターンに参加してきました。
インターンの内容はお口チャックされてしまったのですが、とても良い経験ができたので、この経験について何か記事を書きたいなと思っていたところ以下のような記事を見つけました。
ちらちら見ていたのですが、どのキャンプも料金結構高いなぁと思いました。
もちろん人に教えてもらうことによって身に着く良いことはたくさんありますが、独学で学ぶことによって身に着く良いこともたくさんあります。
ということで、今までのプログラミング人生を振り返りつつ、他の人の役に立つ記事でも書こうと思い立ってみました。
以下本編。
プログラミングについて何も知らない人間が
IT企業の学生インターンに参加できるようになるまで
出会い:プログラミングなんてできるのはスーパーハッカーだけでしょ?
冗談抜きでこう思っていました。
私のプログラミングとの初めての出会いは大学の授業でした。(いきなり授業の話かよという感じですが。*1)
当時は「プログラミングなんか絶対できんから、予習とかしないと絶対に卒業できなくなる」という恐怖心から、与えられた参考書を事前に読み進めていました。
ということで、以下の本が人生で初めて出会ったプログラミング技術書です。
私のプログラミング人生はここから(=『たのしいRuby』)始まったと言っても過言ではありません。
そして、この本の内容を全て理解したときに初心者脱出と言っても過言ではないかと思います。
授業で「なんでRubyからやるんだ?」とか愚痴ってた学生もいましたが、今になって思うとRubyから始めたのが非常に良かったのだと思います。
プログラミング最初の一歩は、こうした本を手元に置いてパソコンで実行しながら「あ、なんか動くな。」という感覚をつかむところから始まります。
最初は、やってることの意味とか仕組みとか全然分からず、魔術的な言葉がたくさん出てきて頭沸騰しながら読むことになると思います。
こうしてなんとか最初の数ページを読み、それをパソコンで実行できたとき、プログラマが一番初めに習得するであろう技術を取得できます。
それはパソコン画面に自分の好きな言葉を表示させるという技術です。*2
こうして、スーパーハッカーへと続いていく(?)階段の一段目に立つことができます。*3
この本で学ぶべきこと(=プログラミングの最初の基礎)は
- 変数とは何か
- 文字列と数値の違い
- 配列とハッシュ
- メソッドとは何か
- 各種演算(真偽の計算はとっつきにくいけど重要)
- 条件判断(if文とか)
- 繰り返し(while文とか)
- テキストデータの読み込み方法
の8つくらいかなと思います。
というか正直、当時はここまでしか分かりませんでした。
そんな訳で、基本中の基本を学んだところで次のステップに移ります。
1年目:プログラミングは何か気持ち悪い/Webって何?
考え出すとモヤモヤするプログラミング
プログラミングを学び始めると気持ち悪いと思うことが多いのです。
初心者の場合、とりあえず動くけど何がどうなっているのかさっぱり分からないことがキモいポイントかと思います。
私の場合、原因は「パソコンについて実は意外と知らないこと」にありました。
プログラミングをはじめたい、もしくは始める人というのは意外と「自分は普通の人よりパソコンに詳しい」という思い込みがある場合が多いのではないかと思います。
実はプログラミングを始めるほどにはパソコンに詳しくないという場合が多いのではないでしょうか。
そこで、そのプログラミングに対するモヤモヤした気持ち悪さをじゃっかん解消してくれるのが以下の1冊です。
コンピュータはなぜ動くのか?知っておきたいハードウエア&ソフトウエアの基礎知識?
- 作者: 矢沢久雄,日経ソフトウエア
- 出版社/メーカー: 日経BP社
- 発売日: 2003/06/02
- メディア: 単行本
- 購入: 43人 クリック: 514回
- この商品を含むブログ (61件) を見る
これを一通り読み込むとプログラミングの基礎となるパソコンがどんなものかということがざっくり分かります。
これを踏まえた上で、たのしいRubyの内容を読み返すと結構分かってきます。
クラスって何だよ!
そんでもって、たのしいRubyで幾度となく登場するアヤシイ単語「クラス」。
この「クラス」を理解するためには様々なプログラミング言語で登場する「オブジェクト指向」という結構重要な概念を理解しなくてはならないのですが、これがまったくもって分からかったのでした。
そんなときに、以下の本で雰囲気をつかむことができました。
一通り読むと「クラスという単語の意味」に加えて周辺のありがたい知識も身についてしまいます。
こうして、モヤモヤを解消しながらRubyという言語を知りどんどん仲良くなっていくのです。
個人でWebページを作れる!(脇道だけど後々重要)
プログラミングについてちょっとできるようになると、レンタルサーバーなどを借りて自身のWebページなんかを作ってみたくなるわけです。*4
そのときに学ばなくてはならないのがHTMLとCSSです。
基礎は以下の本で学びました。
実際にホームページを作って公開してみると色々と勉強になります。
また、ついでにインターネットの仕組みも学びたいと思い以下の本を読みながらフムフム言ってました。
ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識
- 作者: 戸根勤,日経NETWORK
- 出版社/メーカー: 日経BP社
- 発売日: 2007/04/12
- メディア: 単行本(ソフトカバー)
- 購入: 31人 クリック: 372回
- この商品を含むブログ (99件) を見る
2年目:プログラミングって数学!?
さて、ここまでで『たのしいRuby』の内容を一通り理解できるようになって「Ruby結構使えるけど?」という状態になります。
Rubyについてもっと学びたいという人は『パーフェクトRuby』なんかを読むのがいいと思います。
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (21件) を見る
英語がOKなら以下の本が超良いです。
Eloquent Ruby (Addison-Wesley Professional Ruby Series)
- 作者: Russ Olsen
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2011/02/11
- メディア: ペーパーバック
- クリック: 3回
- この商品を含むブログを見る
上記の本を読まなくてもここまで来ると結構自信が付きます。
そして、「Ruby結構できるで?」状態のときに出会ったのが『数学ガール 乱択アルゴリズム』です。
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/03/02
- メディア: ペーパーバック
- 購入: 19人 クリック: 779回
- この商品を含むブログ (101件) を見る
この本を読むとプログラミングの奥深い世界がチラっと垣間見えます。
この本を読むことで、アルゴリズム(=ひとまず「プログラムの内容を普段使う言葉で表したもの」としていただければ良いかと思います。)という言葉・概念と出会います。
『数学ガール』で実際に出てくるアルゴリズムをRubyで再現してみたりするととても実力が付きます。
そして、このアルゴリズムって何なのかを知ることによって、プログラムと数学との関連性が見えてきます。
アルゴリズムに関する数学の知識は、プログラミングで高度な処理を行いたいと思った場合に必須の知識になります。
ここらへんで少し実際のプログラムから離れて、
など机上の勉強を挟むと良いかと思います。
この辺の勉強に関する本は挙げるときりがないので、上記の単語でググったりしながら勉強していただければと思います。
以下のサイトなどが参考になると思います。
どこまで学べば良いかと言うと、「自分が完全にギブアップするまで」です。*5
数学の世界は結構難しいので、ある程度学んだらまたプログラミングの世界に戻って来ましょう。
3年目:他のプログラミング言語は方言みたいなもの
Rubyの知識を深める
数学を学んで(学びながらでも)さらにRubyの扱いに慣れていくことになります。
私はここらへんで、データベースとかも学んでおりました。
データベースの知識はプログラミングにとって必須だと思いますので、どこかで学びましょう。今です。
おすすめは『マンガでわかるデータベース』で一通り概要を把握して、『作りながら学ぶRuby入門』に沿ってRubyで実際に作ってみるということです。
ここまでくるとプログラミングを用いてそれなりに立派な何かを作る力が付いています。
そうすると実際に何かを作ってみるのが良いと思います。
プログラミングで何か作る
実際の処理に対して、プログラミング言語には「向き・不向き・できない」があります。
ここで3つくらいの道に分かれることになります。
どれかの道に進んだ後で、別の道を行くというのも可能ですし、そのまま別の道をずっと行くこともあるのかなと思います。
1つはデスクトップアプリケーションの道です。
Rubyはデスクトップアプリケーションを作るのに不向きだと思います。(できなくはないです)
Windowsであれば、確実にC#を学ぶことになります。Macのことはしりません。*6
自分は以下の2冊で勉強しました。
改訂3版 パーフェクトC# (PERFECT SERIES 1)
- 作者: 斎藤友男,醍醐竜一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/05/08
- メディア: 大型本
- この商品を含むブログ (4件) を見る
2つめはWebアプリケーションの道です。
いわゆるCGI(≒サーバーでプログラムを動かす仕組み)を学んでいくことになります。
以下のWebサイトで学ぶのがとても良いかと思います。
Rubyist Magazine - Ruby ビギナーのための CGI 入門 【第 1 回】 初めての CGI プログラム
ここで、レンタルサーバーなどを借りて、実際に公開してみるととても勉強になります。
はじめは、ロリポップ や さくらのレンタルサーバー なんかがおすすめです。
そして、様々な言語でCGIのアプリケーションを作ってみましょう。3つの言語くらいに触れましょう。
ここまで来ると、入門書とかは逆にうっとうしく感じるようになっているかと思います。
あとここまで来ると、他の言語についてはWebで検索しながらプログラミングできるようになっていると思いますので、本に頼ることもあまりなくなってくるかと思います。
パーフェクトPython (PERFECT SERIES 5)
- 作者: Pythonサポーターズ,露木誠,ルイス・イアン,石本敦夫,小田切篤,保坂翔馬,大谷弘喜
- 出版社/メーカー: 技術評論社
- 発売日: 2013/03/05
- メディア: 大型本
- 購入: 1人 クリック: 65回
- この商品を含むブログ (28件) を見る
3つめはスマホアプリケーションの道です。
これは割愛。とりあえず気になる人は「android アプリ 開発 入門」とかで検索すれば良いと思います。*7
こうして他の言語に触れると、「あれ?Rubyで使ってた知識って結構使えね?」という状態になります。
これがポイントです。
様々なプログラミング言語間には、「英語と日本語」ほどの壁はなく、「東京弁と関西弁」くらいの差があるんだということが実感できればかなりレベルアップします。
つまり、用途に合わせて強い武器を選ぶことができるようになるのです。*8
アルゴリズムについて
ここまで来ると前のところで出てきたアルゴリズムが効力を発揮します。
このレベルになると同じことをするのに様々な言語を使うことができるということが分かり、アルゴリズムを元に使用するプログラミング言語を選択することができるようになります。
そうすると、「こんなことをしたい!」という抽象的な処理を実際のプログラムに落とし込むことができるようになってくるのです。
私は、ここまで来るのが長かった…。
4年目:自分は何をやりたいのか
さて、このレベルになると、プログラミングで何か作るという点ではだいたいのことができるようになっています。
なので、何をしたいか、何を作りたいか、ということをはっきりさせるのが重要なのではないかなと思います。
ここからは自分が経験した分野でどんなものがあるのかというのを少し紹介する形にしたいと思います。
こうした分野に目を向けて、それらの技術を組み合わせることで素敵なアプリケーションが開発できると思います。(え?俺が何か作ったかって?え?><)
データマイニング
大量のデータから何か有意義なことを発見しようという分野。
最近ビッグデータとかで流行ってますね。Python使えればだいたいのことはできます。
が、R(という言語)も学んでおきたいところ。
自然言語処理
めちゃくちゃ面白い分野です。
機械に言葉を理解させようという世界感です。
簡単な例だと、迷惑メールの振り分けとか しゃべってコンシェル とかです。
以下の本がおすすめ。
画像処理・認識
人間のように機械に画像を理解させようという感じです。
これまためちゃくちゃ面白い。
紙の文書を読み込んで、PCで扱えるテキストに変換したり、画像中の細胞の数を自動で数えたりできます。
あとは、画像にA君が映ってますとかを自動で判定できるようになります。
情報検索
早い話がgoogleみたいなサイトを作ろうというものです。
ユーザがデータにアクセスするのを支援したりします。
レコメンド
Amazonのこの本を買っている人はこんな本も買っていますというアレです。
最短経路問題
これまたものすごく奥が深い。
電車とかの乗り換えシステムに使われています。
以下の本はマジで面白いです。
その他
たくさんありますが、サーバー関連やマイコンなどのハードウェア関連も学ぶと良いでしょう。今回の記事ではあまり触れていません。
マイコンなど扱うことによって得られる、プログラミングの世界が実世界に影響を与えるという体験はとてもエキサイティングです。
CentOSなどを扱ってみると、OSの世界も広がって楽しいです。
まとめ(最後に)
以下の通りに学びました。これからプログラミングを始めたい人は参考にしていただくと良いかもしれません。
- Rubyやる(別の言語でも良いと思います。)
- パソコンについて知る
- インターネットについて知る
- Rubyを一通りできるようになる(こちらも同様)
- アルゴリズムを学ぶ(周辺の数学も学ぶ)
- 他のプログラミング言語に手を出す
- 自分が何を作りたいかを考える
まあ、実際の私のプログラミング学習はもっとウネウネ曲がりくねったものなのですが、ちょこっと整理して紹介してみました。
では、最後にハッカー魂に火を付ける最高の2冊を紹介して終わりにしたいと思います。
- 作者: ポールグレアム,Paul Graham,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2005/01
- メディア: 単行本
- 購入: 109人 クリック: 4,884回
- この商品を含むブログ (583件) を見る
- 作者: Chad Fowler,でびあんぐる
- 出版社/メーカー: オーム社
- 発売日: 2010/02/26
- メディア: 単行本(ソフトカバー)
- 購入: 24人 クリック: 683回
- この商品を含むブログ (128件) を見る
補足
ホントはRとかMathematica、MATLABなんかについても書きたかったのですが、思いのほか記事が長くなってしまったのでデータ解析系の言語はまたの機会に…。
また、C言語やJavaなど他の言語については記事で触れていないですが、機会があれば学んだ方がいいと思います。
個人的にはLispが変な感じで面白かったです。(詳しくはないけれど。)