これまで約1年間、コンピュータサイエンス(CS)を学んできました。今は転職活動中で、このCSの学びが自分の強みになると感じています。ただ、CSの知識や考え方は表面からは見えにくいものでもあるので、「自分が何を学び、どう成長したのか」を文章にまとめようと思いました。また、少しでも誰かの参考になればと思い、この投稿を書くことにしました。僕自身も、まだまだ学びの途中です。
利用した主な教材
-
モノづくりC言語塾
https://monozukuri-c.com/ -
CS50(Harvard)
https://www.edx.org/learn/computer-science/harvard-university-cs50-s-introduction-to-computer-science -
Recursion
https://recursionist.io/
CSを学ぶ前の自分
正直なところ、CSを学ぶ前は「プログラミング言語が違えば、できることもまったく違う」と思っていました。Macを使って開発していたけど、「Linuxって学ぶ必要あるの?」と思うレベルで、OSやコンピュータの仕組みへの理解はほぼゼロでした。
実はその頃にも、PHPでWebアプリをゼロから作った経験があり、そのときは試行錯誤しながら自分でコードを書いて完成させました。
一方で、Laravelなどのフレームワークを使った開発では、公式ドキュメントやネットの記事を頼りに、「とりあえず動くものを作る」進め方になりがちで、仕組みを深く理解しないまま使っていたことも多かったです。
もちろん、フレームワークの内部をすべて理解しなくても使えるのがその便利さの本質であり、それ自体は悪いことではないと思っています。
ただ僕の場合は、「なぜこう書くのか?」「裏側では何が起きているのか?」といった部分を理解できていないと、どこか引っかかるような感覚が残っていました。
だからこそ、表面的な書き方だけではなく、その背後にある仕組みや原理=本質を学んでおけば、他のフレームワークや別の言語にも柔軟に対応できるはずだという確信がありました。
そういった土台を築く学びとして、CSの基礎をしっかり理解しておきたい、という思いが自然と強くなっていきました。
コンピュータの仕組みとデータの本質
CSを学ぶ中で、まず驚いたのはコンピュータの基本的な仕組みです。すべての情報は0と1のビット列で表現され、その0と1は電圧の高低によって表現されている。たったそれだけの仕組みで、文字や絵文字、画像や音声など多種多様なデータを表現しているということに感動しました。
例えば、CS50のある課題では、画像ファイルのデータを読み取り、数値を操作して画像を反転させるプログラムをC言語で作成しました。データが実際にどう構造化されていて、どのように変換されるのかを手を動かして実感できました。
データ構造とアルゴリズムの理解
次に出会ったのが、抽象化されたデータ構造です。配列のように連続的なデータと、ポインタで非連続に繋がる連結リストの違いを学び、自分で実装していく中で直感的な理解が深まりました。
また、アルゴリズムと計算量に関しても、「なぜこの処理は遅いのか」「なぜこの構造は高速なのか」を理論的に説明できるようになり、状況に応じた適切なデータの使い分けができるようになってきました。
こうした学びから、「言語が変わっても、裏で扱っているデータの本質は同じ」ということに気づけたのは大きな転換点でした。たとえばPythonではすべてがオブジェクトで、インスタンスを生成して柔軟にデータを操作できます。一方JavaScriptもクラス構文はあるものの、実際はプロトタイプベースのオブジェクト指向で、既存のオブジェクトを参照して構造を構築していきます。
データがどう表現され、どう操作されるかの「イメージ」が頭の中で描けるようになったことで、新しい言語にもスムーズに適応できるようになりました。
OSの理解
OSについても同様です。学ぶ前は「そもそもOSって何をしてるの?」というレベルでした。Linuxサーバーが多く使われていることや、バックエンド開発者がその上でプログラムを動かしているということも意識していませんでした。
でもCSを学ぶことで、ファイル操作やネットワーク通信、メモリ管理といった機能はすべてOSが提供していることを理解しました。OSの抽象化のおかげで、僕たちはプログラムから直接ハードウェアを意識せずに開発できるんですよね。
実際に自作のサーバーを作ったり、ファイル操作プログラムを開発してみたりすることで、OSとのやり取りの理解が一気に深まりました。今では例えば「nginxとPHPは別プロセスだから、連携にはプロセス間通信が必要」といった構造が自然とイメージできるようになりました。PHPで echo
すると標準出力に文字列が出て、それがnginx側に送られる。この流れを構造的に理解できるようになったのもCSを学んだからこそです。
現在取り組んでいること
現在は、バックエンド開発を中心に、データベースを使ったシステム設計や実装を行っています。フレームワークを使わずに自作することで、アーキテクチャや設計思想への理解を深めています。
セッション管理、JWT認証、ウェブセキュリティ、ミドルウェア、MVCアーキテクチャ、依存性の注入、OOPのデザインパターンなど、バックエンドエンジニアに必要な知識・技術を体系的に学んでいます。
教材ごとの学びと感想
-
モノづくりC言語塾:ポインタの概念がとてもわかりやすく説明されており、このサイトで学んだおかげでポインタに苦手意識を持たずに入門できました。
-
CS50:配列と連結リストの違いなど、データ構造に対する理解が深まりました。課題は正解が提示されず、自分で考えてコードを書く必要があるため、思考力も鍛えられました。
-
Recursion:最も多く使い、今も学び続けている教材です。元Metaの方が設計しており、CS50に負けないほど実践的で、「自分の頭で考えること」を大切にした設計になっています。静的サイト・動的サイト・API実装・サーバー開発など、幅広いプロジェクトを通して、OS、アルゴリズム、データ構造、Web開発まで深く学べる最高の教材だと思います。
最後に
CSを学ぶことで、データの構造や流れをイメージしながら開発できるようになったことが、何よりの成長だと感じています。AIが発達し、誰でもプログラミングできる時代が近づいている中で、あえて「なぜそう動くのか」を理解しようとする姿勢は、間違いなく自分の武器になると信じています。
学び続ける中で、もっと深く、もっと柔軟に開発ができるようになることが今の目標です。