CS基礎、情報系卒なのに再入門:失われた4年を取り戻す

情報系卒、CS基礎不足の告白

学生時代、自分はそこそこ「デキる」学生だと思い込んでいた。CS(コンピュータサイエンス)の基礎がどれほど重要かも知らず、ただ単位を取ることだけに必死だったくせに。

専攻の授業もそれなりに受けていたし、学内のハッカソンやプログラミングコンテストで入賞した経験もあった。同期がコンパイルエラーで頭を抱えている横で、知ったかぶりのアドバイスをして優越感に浸ったりもした。だが、今だからこそ白状しよう。当時僕が作った成果物は、単なる「お遊び」レベルだった。

まともなデータベース(DB)連携が難しくて、テキストファイル(.txt)にデータをカンマ区切り(CSV)で保存して誤魔化したり、OSレベルの制御が必要なRaspberry Piの代わりに、コピペで動くArduinoで適当に済ませたりしていた。表面上それっぽく動く結果を見て教授たちは褒めてくれたし、僕はそれが本当の実力だと勘違いしていた。

丸暗記で乗り切った面接、それが悲劇の始まり

しかし、就職活動という荒波に放り出された瞬間、その根拠のない自信は粉々に砕け散った。書類選考落ちの連続。コンテスト入賞という「ガクチカ(学生時代に力を入れたこと)」は、僕のスカスカなCS基礎力を隠す役には立たなかった。

不安が押し寄せるほど、僕は上辺だけの知識を増やすことに執着した。理解は二の次で、面接を通過するための模範解答を機械のように丸暗記した。QiitaやZennにある「エンジニア面接頻出質問100選」が僕の教科書だった。

面接官に「TCPとUDPの違いは?」と聞かれれば、僕は自動販売機のように即答した。「TCPはコネクション型で信頼性を保証しますが遅く、UDPはコネクションレス型で速いですが信頼性が低いです」。

正直なところ、パケットが何なのか、3ウェイ・ハンドシェイクが裏でどう動いているのかなんて、これっぽっちも分かっていなかった。だが皮肉なことに、その機械的な暗記力のおかげで面接官を欺き、それなりの評価を得て内定を勝ち取ってしまった。僕はそれを幸運だと思った。それが、4年分のツケを一気に払わされる悲劇の始まりだとも知らずに。

暗記で手に入れた内定パスポートは、実務という巨人の前では無力だった。

ベンチャー企業のフルスタック・サバイバル

僕が入社したのは少人数の開発チームだった。そこには「フロントエンド」や「バックエンド」といった親切な境界線なんて存在しなかった。

入社初日から、津波のように押し寄せる技術スタックの前に立たされた。JavaかJavaScript、どちらか一つが得意ならなんとかなると思っていた。だが現実は、Linux SSHターミナルの黒い画面、正体不明のDockerコンテナ、GitLabのCI/CDパイプライン、そしてSpring BootにVue.js、Redisまで…。学生時代に「後でやろう」と先送りにしたり、「これはインフラ担当の仕事だ」と無視していた技術たちが、四方八方から僕を襲ってきた。

面接でスラスラと暗唱した知識は、実務では何の役にも立たなかった。いや、正確に言えば「適用の仕方」を知らなかったのだ。デプロイしたDockerコンテナがなぜ頻繁に落ちるのか(OOM)、Redisがなぜメモリを食いつぶすのかを理解するには、面接用に丸暗記したあのCS基礎知識が、本当に、切実に必要だったからだ。

砂の上に建てた城

結局、僕は手当たり次第にコードをコピペ(Ctrl+C, V)する「コピペエンジニア」に成り下がっていた。機能はどうにか動いたが、なぜ動いているのかは分からなかった。

  • CORS Error:なぜブラウザはサーバーのレスポンスを拒否するのか?(HTTPヘッダーへの無知)
  • OOM (Out Of Memory):なぜ順調だったサーバーが突然死ぬのか?(メモリリークとGCへの無知)
  • Connection Refused:ローカルでは動くのになぜデプロイすると繋がらないのか?(ポートフォワーディングとファイアウォールへの無知)

フレームワークが提供する便利さの裏に隠された原理を知らないから、トラブルが起きても解決する能力がない。CS基礎という地盤が緩い土地の上に、流行りのフレームワークという派手な建材で、危なっかしい城を建てていたのだ。

原理を知らぬまま積み上げた技術は、小さな波でも崩れる砂上の楼閣と同じだ。

Re: Booting、再び原点へ

だから僕は、もう一度最初に戻ることにした。今すぐに派手なポートフォリオをもう一つ増やすことよりも、「コンピュータは一体どうやって僕のコードを理解し、実行しているのか」という本質的な問いを解決する方が先決だと感じたからだ。

このブログは、卒業証書だけ持っている情報系出身者が、再び底辺からCS基礎を積み上げていく熾烈な「復習(Re: Booting)」の記録だ。単にLinuxコマンド集やDockerのインストール手順を羅列するつもりはない。代わりに、次のような問いを投げかけ、答えを探す過程を記していこうと思う。

  • Language & OS:Javaのコードがコンパイルされ、CPUに届くまでに何が起きているのか?
  • Network:アドレスバーにEnterを叩いたとき、パケットはどんな旅をするのか?
  • Virtualization:僕のノートPCとデータセンターのサーバーは何が違い、なぜ仮想化が必要なのか?
  • DevOps:書いたコードをどうやって安全かつ自動的にデプロイするのか?
最下層の基礎から始まり、アーキテクチャへと拡張するRe: Bootingロードマップ。

Localhostを超えて

最終目標は、Linux、Docker、CI/CD、そしてAWSなどのクラウド環境まで、自分の手で直接構築し制御できるようになることだ。Localhostという安全な温室を抜け出し、荒々しい本番環境(Production)という野生でも生き残れるエンジニアになる過程を見守ってほしい。

過去の僕のように「大学で習ったはずだけど、記憶にないです」と言ってしまう人たちへ。この記録が「ああ、あの時教授が言っていたのは、こういう意味だったのか!」と膝を打つ(腑に落ちる)、小さな道しるべになることを願っている。

コメントする