Cはじめました

 最近、C言語を勉強しはじめました。

 今までは、Rails→Android→iOSと、とにかく「ものを作る」ための技術を身につけようとしてきた。なにか作りたいアプリやWebサ〜ビスのアイデアがあって、それをカタチにするために必要な技術を学んできたという感じ。プログラミングを始めて2年間くらいはそんな感じでプログラミングを身につけてた。

 「何かを実現するために必要なことを必要なだけ学んでいく」という方法は非常に効率がいいように思えるけど、最近はこのやり方に限界を感じるようになってきた。iPhoneアプリを作りたい→じゃあまずはObjective-Cを勉強しよう、という程度であれば、ちょっとググれば目的に対してどんな技術が必要かすぐにわかると思う。

 だけど、もっと高度なトピック、例えばレスポンスタイムをもっと短くしたいとか、安全なアプリケーションを作りたいとか、メンテナンスを簡単にしたいとか、そういう目的に対してどんな技術が必要なのか具体的にイメージすることが僕にはできない。「目的に対して必要な技術を学ぼう」という方針だと、その必要性をイメージできない技術は習得しないことになるし、イメージできる範囲での技術では必ずしも目的を達成できないと思う。

 その目的を達成するために何が必要かちゃんとイメージできるようになるには、大まかな全体像を理解する必要があると思ってる。例えば、OSの仕組みとか、ネットワークの仕組みとか。そういうのが理解できてないと、イメージできる範囲での局所的な解しか思い浮かばなくなると思う。

 ここでようやく冒頭に戻れるんだけど、そういうことをぼんやり思うようになり、最近、C言語を勉強しはじめました。LinuxもC言語で開発されていると聞くし、RubyだってC言語で開発されていると聞く。apacheとかそういう普段お世話になってるソフトウェアも(たぶん)C言語で開発されてるんだろう。OSとかネットワークとか、そういう基本的な部分って概念的な説明ばかりでなかなか理解できない。実際にC言語で開発されているのであれば、C言語を勉強することでコードによってより具体的に理解することができるんじゃないかと思った。C言語を勉強しはじめた理由はそこらへんにあって、要するに基本的な概念を概念としてではなく具体的なコードとして理解するためにある。

 最近はこの本を読んで、C言語を勉強しつつ、HTTPサーバーを作ったりしてる。

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

 抽象的な概念が実はただの整数にすぎなかったり、単純な仕組みだったということがなんとなく分かってきた。とてもおもしろい。これが終わったら、OSをもっと理解するためにこの本を読んでOS作ってみたいとか思ってる。

30日でできる! OS自作入門
30日でできる! OS自作入門

30日でできる! OS自作入門

 帰宅後に2時間くらい勉強する時間を作って、継続的にコツコツと基本を理解するようにしたい。