読者です 読者をやめる 読者になる 読者になる

エロと研究と日々の徒然

プログラミングについて何も知らない人間がIT企業の学生インターンに参加できるようになるまで

こんにちは。

内容はタイトルの通りですが、とりあえずこの記事の目的としては以下のことを目指しています。

目的:この記事を読んだ人が独学でプログラミング技術を身に着けて思い描いたものを作れるようになる

 

「今からプログラミングの勉強を始めたいけど、何からやってどこに向かえばいいのか分からない!」

という人の助けになるようなものができれば幸いです。

 

始めになぜこんな記事を書こうかと思ったかを書いているので、そんなもの興味ないという人は適せん飛ばしていただければ良いかなと思います。

(書き終わってから気づいたのですが結構本の紹介が多いです。)

この記事の構成は以下の感じです。

  1. 出会い:プログラミングになれる
  2. 1年目:プログラミングにモヤモヤする
  3. 2年目:数学を学ぶ
  4. 3年目:バイリンガルトリリンガルプログラマー
  5. 4年目:プログラミングで色々できる

つまりプログラミング初めて4年くらいでちょいちょいお金もらえるくらいプログラミング書けるようになるよってことです。

しかし実際は4年もかかりません。

自分は学生生活で遊びまくっていたので、上記の1年は1か月くらいで学べる内容だと思います。

つまり、

 出会い→1か月目→2か月目→3か月目→4か月目

と読み替えていただければ良いかと思います。

試行錯誤しながらウネウネしたので4年もかかってしまった訳で、ヤル気あれば1~4か月くらいで下記の内容をさらうことができると思います。

 

以下の説明では様々な本が登場しますが、「これを読め」という訳ではなく私はこれを読んだというだけで、Webの情報でも良いですし、図書館で似た本を借りて読むとかも良いと思います。その辺は柔軟に。

 

なぜこんな記事を書いたか

先日、某IT企業のインターンに参加してきました。

インターンの内容はお口チャックされてしまったのですが、とても良い経験ができたので、この経験について何か記事を書きたいなと思っていたところ以下のような記事を見つけました。

ちらちら見ていたのですが、どのキャンプも料金結構高いなぁと思いました。
もちろん人に教えてもらうことによって身に着く良いことはたくさんありますが、独学で学ぶことによって身に着く良いこともたくさんあります。

ということで、今までのプログラミング人生を振り返りつつ、他の人の役に立つ記事でも書こうと思い立ってみました。

 

以下本編。

 

プログラミングについて何も知らない人間が
IT企業の
学生インターンに参加できるようになるまで

 

出会い:プログラミングなんてできるのはスーパーハッカーだけでしょ?

冗談抜きでこう思っていました。

私のプログラミングとの初めての出会いは大学の授業でした。(いきなり授業の話かよという感じですが。*1
当時は「プログラミングなんか絶対できんから、予習とかしないと絶対に卒業できなくなる」という恐怖心から、与えられた参考書を事前に読み進めていました。 

ということで、以下の本が人生で初めて出会ったプログラミング技術書です。

 

たのしいRuby 第4版
 

 

私のプログラミング人生はここから(=『たのしいRuby』)始まったと言っても過言ではありません。

そして、この本の内容を全て理解したときに初心者脱出と言っても過言ではないかと思います。

授業で「なんでRubyからやるんだ?」とか愚痴ってた学生もいましたが、今になって思うとRubyから始めたのが非常に良かったのだと思います

 

プログラミング最初の一歩は、こうした本を手元に置いてパソコンで実行しながら「あ、なんか動くな。」という感覚をつかむところから始まります。

最初は、やってることの意味とか仕組みとか全然分からず、魔術的な言葉がたくさん出てきて頭沸騰しながら読むことになると思います。

 

こうしてなんとか最初の数ページを読み、それをパソコンで実行できたとき、プログラマが一番初めに習得するであろう技術を取得できます。

それはパソコン画面に自分の好きな言葉を表示させるという技術です。*2

こうして、スーパーハッカーへと続いていく(?)階段の一段目に立つことができます。*3

 

この本で学ぶべきこと(=プログラミングの最初の基礎)は

  1. 変数とは何か
  2. 文字列と数値の違い
  3. 配列とハッシュ
  4. メソッドとは何か
  5. 各種演算(真偽の計算はとっつきにくいけど重要)
  6. 条件判断(if文とか)
  7. 繰り返し(while文とか)
  8. テキストデータの読み込み方法

の8つくらいかなと思います。
というか正直、当時はここまでしか分かりませんでした。

そんな訳で、基本中の基本を学んだところで次のステップに移ります。

 

1年目:プログラミングは何か気持ち悪い/Webって何?

考え出すとモヤモヤするプログラミング

プログラミングを学び始めると気持ち悪いと思うことが多いのです。

初心者の場合、とりあえず動くけど何がどうなっているのかさっぱり分からないことがキモいポイントかと思います。

私の場合、原因は「パソコンについて実は意外と知らないこと」にありました。

プログラミングをはじめたい、もしくは始める人というのは意外と「自分は普通の人よりパソコンに詳しい」という思い込みがある場合が多いのではないかと思います。

実はプログラミングを始めるほどにはパソコンに詳しくないという場合が多いのではないでしょうか。

そこで、そのプログラミングに対するモヤモヤした気持ち悪さをじゃっかん解消してくれるのが以下の1冊です。

コンピュータはなぜ動くのか?知っておきたいハードウエア&ソフトウエアの基礎知識?

コンピュータはなぜ動くのか?知っておきたいハードウエア&ソフトウエアの基礎知識?

 

これを一通り読み込むとプログラミングの基礎となるパソコンがどんなものかということがざっくり分かります。

これを踏まえた上で、たのしいRubyの内容を読み返すと結構分かってきます。

クラスって何だよ!

そんでもって、たのしいRubyで幾度となく登場するアヤシイ単語「クラス」。
この「クラス」を理解するためには様々なプログラミング言語で登場する「オブジェクト指向」という結構重要な概念を理解しなくてはならないのですが、これがまったくもって分からかったのでした。

そんなときに、以下の本で雰囲気をつかむことができました。

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

 

 一通り読むと「クラスという単語の意味」に加えて周辺のありがたい知識も身についてしまいます。

こうして、モヤモヤを解消しながらRubyという言語を知りどんどん仲良くなっていくのです。

 

個人でWebページを作れる!(脇道だけど後々重要) 

プログラミングについてちょっとできるようになると、レンタルサーバーなどを借りて自身のWebページなんかを作ってみたくなるわけです。*4

そのときに学ばなくてはならないのがHTMLとCSSです。

基礎は以下の本で学びました。

HTMLとCSSで基礎から学ぶWebデザイン

HTMLとCSSで基礎から学ぶWebデザイン

 

 実際にホームページを作って公開してみると色々と勉強になります。

 

また、ついでにインターネットの仕組みも学びたいと思い以下の本を読みながらフムフム言ってました。

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識

 

 

2年目:プログラミングって数学!?

さて、ここまでで『たのしいRuby』の内容を一通り理解できるようになってRuby結構使えるけど?」という状態になります。 

Rubyについてもっと学びたいという人は『パーフェクトRuby』なんかを読むのがいいと思います。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

 

 

英語がOKなら以下の本が超良いです。

Eloquent Ruby (Addison-Wesley Professional Ruby Series)

Eloquent Ruby (Addison-Wesley Professional Ruby Series)

 

 

上記の本を読まなくてもここまで来ると結構自信が付きます。

そして、「Ruby結構できるで?」状態のときに出会ったのが『数学ガール 乱択アルゴリズム』です。

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール 乱択アルゴリズム (数学ガールシリーズ 4)

 

この本を読むとプログラミングの奥深い世界がチラっと垣間見えます。

この本を読むことで、アルゴリズム(=ひとまず「プログラムの内容を普段使う言葉で表したもの」としていただければ良いかと思います。)という言葉・概念と出会います。
数学ガール』で実際に出てくるアルゴリズムRubyで再現してみたりするととても実力が付きます。

そして、このアルゴリズムって何なのかを知ることによって、プログラムと数学との関連性が見えてきます。

アルゴリズムに関する数学の知識は、プログラミングで高度な処理を行いたいと思った場合に必須の知識になります。

ここらへんで少し実際のプログラムから離れて、

など机上の勉強を挟むと良いかと思います。

この辺の勉強に関する本は挙げるときりがないので、上記の単語でググったりしながら勉強していただければと思います。

以下のサイトなどが参考になると思います。

どこまで学べば良いかと言うと、「自分が完全にギブアップするまで」です。*5

数学の世界は結構難しいので、ある程度学んだらまたプログラミングの世界に戻って来ましょう。

 

3年目:他のプログラミング言語は方言みたいなもの

Rubyの知識を深める

数学を学んで(学びながらでも)さらにRubyの扱いに慣れていくことになります。

私はここらへんで、データベースとかも学んでおりました。
データベースの知識はプログラミングにとって必須だと思いますので、どこかで学びましょう。今です。

おすすめは『マンガでわかるデータベース』で一通り概要を把握して、『作りながら学ぶRuby入門』に沿ってRubyで実際に作ってみるということです。

マンガでわかるデータベース

マンガでわかるデータベース

 

 

作りながら学ぶRuby入門 第2版

作りながら学ぶRuby入門 第2版

 

 

ここまでくるとプログラミングを用いてそれなりに立派な何かを作る力が付いています。

そうすると実際に何かを作ってみるのが良いと思います。

プログラミングで何か作る

実際の処理に対して、プログラミング言語には「向き・不向き・できない」があります。

ここで3つくらいの道に分かれることになります。

どれかの道に進んだ後で、別の道を行くというのも可能ですし、そのまま別の道をずっと行くこともあるのかなと思います。

 

1つはデスクトップアプリケーションの道です。

Rubyはデスクトップアプリケーションを作るのに不向きだと思います。(できなくはないです)
Windowsであれば、確実にC#を学ぶことになります。Macのことはしりません。*6

自分は以下の2冊で勉強しました。

やさしいC# (やさしいシリーズ)

やさしいC# (やさしいシリーズ)

 

 

改訂3版 パーフェクトC# (PERFECT SERIES 1)

改訂3版 パーフェクトC# (PERFECT SERIES 1)

 

 

 

2つめはWebアプリケーションの道です。

いわゆるCGI(≒サーバーでプログラムを動かす仕組み)を学んでいくことになります。
以下のWebサイトで学ぶのがとても良いかと思います。

Rubyist Magazine - Ruby ビギナーのための CGI 入門 【第 1 回】 初めての CGI プログラム

ここで、レンタルサーバーなどを借りて、実際に公開してみるととても勉強になります。
はじめは、ロリポップ や さくらのレンタルサーバー なんかがおすすめです。

 

そして、様々な言語でCGIのアプリケーションを作ってみましょう。3つの言語くらいに触れましょう。

おすすめはPHPPython(、Perl)です。

ここまで来ると、入門書とかは逆にうっとうしく感じるようになっているかと思います。
あとここまで来ると、他の言語についてはWebで検索しながらプログラミングできるようになっていると思いますので、本に頼ることもあまりなくなってくるかと思います。

PHP+MySQLマスターブック

PHP+MySQLマスターブック

 

 

パーフェクトPython (PERFECT SERIES 5)

パーフェクトPython (PERFECT SERIES 5)

 

 

 

3つめはスマホアプリケーションの道です。

これは割愛。とりあえず気になる人は「android アプリ 開発 入門」とかで検索すれば良いと思います。*7

 

 

こうして他の言語に触れると、「あれ?Rubyで使ってた知識って結構使えね?」という状態になります。

これがポイントです。

様々なプログラミング言語間には、「英語と日本語」ほどの壁はなく、「東京弁と関西弁」くらいの差があるんだということが実感できればかなりレベルアップします。

つまり、用途に合わせて強い武器を選ぶことができるようになるのです。*8

 

アルゴリズムについて

ここまで来ると前のところで出てきたアルゴリズムが効力を発揮します。

このレベルになると同じことをするのに様々な言語を使うことができるということが分かり、アルゴリズムを元に使用するプログラミング言語を選択することができるようになります。

そうすると、「こんなことをしたい!」という抽象的な処理を実際のプログラムに落とし込むことができるようになってくるのです。

私は、ここまで来るのが長かった…。

 

4年目:自分は何をやりたいのか

さて、このレベルになると、プログラミングで何か作るという点ではだいたいのことができるようになっています。

なので、何をしたいか、何を作りたいか、ということをはっきりさせるのが重要なのではないかなと思います。

ここからは自分が経験した分野でどんなものがあるのかというのを少し紹介する形にしたいと思います。

こうした分野に目を向けて、それらの技術を組み合わせることで素敵なアプリケーションが開発できると思います。(え?俺が何か作ったかって?え?><)

データマイニング

大量のデータから何か有意義なことを発見しようという分野。

最近ビッグデータとかで流行ってますね。Python使えればだいたいのことはできます。

が、R(という言語)も学んでおきたいところ。

自然言語処理

めちゃくちゃ面白い分野です。
機械に言葉を理解させようという世界感です。

簡単な例だと、迷惑メールの振り分けとか しゃべってコンシェル とかです。

以下の本がおすすめ。

自然言語処理の基礎

自然言語処理の基礎

 

 

言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

 

 

画像処理・認識

人間のように機械に画像を理解させようという感じです。

これまためちゃくちゃ面白い。

紙の文書を読み込んで、PCで扱えるテキストに変換したり、画像中の細胞の数を自動で数えたりできます。
あとは、画像にA君が映ってますとかを自動で判定できるようになります。

デジタル画像処理 (Rで学ぶデータサイエンス 11)

デジタル画像処理 (Rで学ぶデータサイエンス 11)

 

 

情報検索

早い話がgoogleみたいなサイトを作ろうというものです。
ユーザがデータにアクセスするのを支援したりします。

レコメンド

Amazonのこの本を買っている人はこんな本も買っていますというアレです。

最短経路問題

これまたものすごく奥が深い。

電車とかの乗り換えシステムに使われています。

以下の本はマジで面白いです。

巡回セールスマン問題への招待 (シリーズ「現代人の数理」)

巡回セールスマン問題への招待 (シリーズ「現代人の数理」)

 

 

その他

たくさんありますが、サーバー関連やマイコンなどのハードウェア関連も学ぶと良いでしょう。今回の記事ではあまり触れていません。

マイコンなど扱うことによって得られる、プログラミングの世界が実世界に影響を与えるという体験はとてもエキサイティングです。

CentOSなどを扱ってみると、OSの世界も広がって楽しいです。

 

まとめ(最後に)

以下の通りに学びました。これからプログラミングを始めたい人は参考にしていただくと良いかもしれません。

  1. Rubyやる(別の言語でも良いと思います。)
  2. パソコンについて知る
  3. インターネットについて知る
  4. Rubyを一通りできるようになる(こちらも同様)
  5. アルゴリズムを学ぶ(周辺の数学も学ぶ)
  6. 他のプログラミング言語に手を出す
  7. 自分が何を作りたいかを考える

まあ、実際の私のプログラミング学習はもっとウネウネ曲がりくねったものなのですが、ちょこっと整理して紹介してみました。

 

では、最後にハッカー魂に火を付ける最高の2冊を紹介して終わりにしたいと思います。

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

 

 

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

 

 

 

補足

ホントはRとかMathematicaMATLABなんかについても書きたかったのですが、思いのほか記事が長くなってしまったのでデータ解析系の言語はまたの機会に…。

また、C言語Javaなど他の言語については記事で触れていないですが、機会があれば学んだ方がいいと思います。

個人的にはLispが変な感じで面白かったです。(詳しくはないけれど。)

*1:大学の専攻は情報科学ではないので、プログラミングに関しての専門教育は受けていません。

*2:Hello World!

*3:たぶん著名なスーパーハッカー達もここから始めたと思います!想像ですが!笑

*4:お金がない人は FC2ホームページ - 無料ホームページスペース とか無料でできておすすめです。

*5:客観的な目標としては、『パターン認識機械学習』という本がギリギリ読めるくらいかなと思います。

*6:宗教上の理由です。

*7:iOSについては宗教上の()

*8:だいぶ毛色の違う宣言型の言語も学ぶと良いかもしれません。これについてはググってください。