いかにしてコンピューターを学ぶか(まだ途中)

農学部出身 IT エンジニアが地道にコンピューターを勉強してます。

26歳になってしまったけど、地道にコンピューターについて学んでいく

 農学部を卒業してIT業界に入り、3年半が経ちました。新卒で入った中堅のプライム案件を扱うSIerで、.NETのWindowsFormとOracleを使った販売管理システムのSEとして3年間働き、現在の会社ではサポートエンジニアを務めています。情報工学はもちろん、数学や物理のバックグラウンドもなく、特に頭の良さやプログラミングのセンスが光るわけでもない人間なわけですが、やはりせっかくITの仕事をしている以上、ちゃんと専門家になりたいなあという思いが年々強くなっています。今は地道にCPUやOSについて勉強をしている最中です。

おそらく、特にバックグラウンドもなくIT業界に入ってきたものの、IT技術の深いところへ興味が出てしまい、コンピュータの仕組みが本気で知りたいとか、仮想化エンジンを自作したいとか、TCP/IP実装したいとか、そう思うようになる人が一定数居るんじゃないかと思います。私もその一人で、なんとか独学で理解を深め、その過程を記録を残したいなあと考えました。実際にやると大体どのくらい勉強に時間がかかるのだとか、そもそも自分が学びたいと思っているレベルのことは独学可能なのかとか、そういう判断材料にしてもらえるようなブログを作りたいなあと思った次第です。

今回はそんなブログの第一回目として、私のバックグラウンドと現在の立ち位置についてお話したい、、つまるところ自己紹介をしていきたいと思います。

 新卒未経験でとりあえず足を踏み入れたIT業界

研究室や大学にもよるかもしれませんが、基本的に農学部ではプログラミングなんて扱うことが皆無ですので、私もほぼ未経験でIT業界に入りました。入った理由としては、たまたま受けて受かったからです。自分がIT技術者として専門性の高いポジションを目指すというイメージもなく、ジェネラリストとしての能力が求められる業務系SEという職種で仕事を探していました。ところが新卒で入社して以来、私はIT技術全般に対する関心が非常に高くなっていきました。

最初の頃はプログラミングが楽しいなあくらいで、業務外でホームページや簡単なWEBサービスのようなものを作ったりして遊ぶ程度でした。しかし次第にTCP/IPやデータベースのアーキテクチャなどに興味を持つようになり、いろんな本を買い漁ってはわかったようなわからないような感覚で、休日に喫茶店でウンウン言いながら技術書を読み漁るようになりました。

気がつけば社内でもちょっと認知される技術マニア枠に収まっており、同期からは一目置かれるようになっていました。とはいえ基本的にコミュニケーション能力が高くなかったので、自ら志願して積極的に対人業務をこなしたものの、とにかく下手くそであまり有能な社員とは言えなかったように思います。

学べば学ぶほどOSとはなんぞやという疑念が湧く

 仕事で活かせるかはともかく技術もぐりは続けていました。まずそこそこ詳しくなったのはTCP/IPとHTTPで、よく使われるプロトコルの仕様について理解するようになり、ネットワークの設計やパケット解析も出来るようになりました。データベースはSQLチューニングが得意になり、特にOracleのログ周りの仕組みなどにもある程度詳しくなりました。

データベースやTCP/IPに対して実用的なレベルで理解が進んだあたりで、もっと深く潜るべきかとも思いましたが、そもそもコンピュータの仕組みを知りたいと強く思うようになりました。TCP/IPやデータベースもアプリケーションによって制御されており、そのアプリケーション制御の大本はOSだからです。そういった思いから、”コンピューターはなぜ動くのか”や”Linuxのしくみ”などの本や、関連する情報をググりまくったのですが、結局のところ深く潜るにはハードウェアに対する理解が必要となり、データ構造やアルゴリズムなどの知識も必要だということがわかりました。

OS自体はもちろん、この頃からはLinuxに強い興味が湧くようになりましたが、C言語が全くわからないのと、Linuxというもの自体の規模が多すぎて、何から追うべきか困惑し始めます。そもそも仕事ではWindowsしか扱ったことがないですし、OSについて講義を受けたこともありません。その結果出た結論として、C言語アセンブラ)→CPU関連→OS理論・実装→初期UnixLinux という順番で追ってみよう結論でした。

目標と今の進捗

 ひとまずC言語は一通り勉強しました。並行して、趣味用言語としてGo言語がお気に入りになったのが、私のアイコンの理由になります。今はCPUについて勉強している最中です。"CPUの創り方"という名著を熟読しています。これを読み終えて理解した段階で、"組み込みOS自作入門"と" コンピュータシステムの理論と実装"を読み比べながらOSもぐりを進める予定です。今の仕事ではLinuxを使うようになったので、並行してLinuxシステムコールのレイヤからちょっとずつ潜っている最中です。

目標としては、3年後くらいまでにLinuxの全体像がコードレベルで理解でき、できればTCP/IPを簡易に実装できるレベルに到達できていればいいなと思います。だいぶ長い時間がかかりそうですが、地道にやるしかなさそうですね。

 

きっと似たような事を考えて、挫折しそうになりながら続けている方もいると思います。お互い頑張りましょう。