CS 기초가 부족한 전공자의 고백
학교 다닐 때 나는 내가 꽤 잘난 줄 알았다. CS 기초가 얼마나 중요한지도 모른 채, 그저 학점 따기에만 급급했으면서 말이다.
나름 전공 수업도 열심히 들었고, 교내 프로그래밍 경진대회나 캡스톤 디자인 대회에서 수상한 경력도 있었다. 동기들이 코드 에러로 끙끙댈 때 옆에서 훈수를 두며 우월감을 느끼기도 했다. 하지만 지금 와서 고백하건대, 그때 내가 만든 결과물은 애들 장난 수준이었다.
제대로 된 데이터베이스(DB)를 연동하는 게 어려워서 메모장(.txt) 파일에 데이터를 콤마(,)로 찍어서 저장했고, 운영체제 레벨의 제어가 필요한 라즈베리파이 대신 코드 몇 줄만 넣으면 돌아가는 아두이노로 대충 떼웠다. 겉보기에만 그럴싸하게 돌아가는 결과물을 보고 교수님들은 칭찬했고, 나는 그게 진짜 내 실력인 양 착각했다.
암기로 뚫어낸 면접, 그것이 비극의 시작이었다
하지만 취업 시장에 던져지자마자 그 근거 없는 자신감은 산산조각 났다. 서류 탈락의 연속이었다. 경진대회 수상이라는 타이틀은 내 부실한 CS 기초 실력을 가려주지 못했다.
불안감이 엄습할수록 나는 허례 지식을 늘리는 데 집착했다. 이해는 뒷전이고 면접을 통과하기 위한 모범 답안을 기계처럼 외웠다. 기술 블로그에서 긁어온 ‘면접 예상 질문 100선’이 내 교과서였다.
면접관이 묻는 “TCP와 UDP의 차이가 뭔가요?”라는 질문에 나는 자판기처럼 대답했다. “TCP는 연결형이고 신뢰성을 보장하지만 느리고, UDP는 비연결형이고 빠르지만 신뢰성이 낮습니다.”
사실 나는 패킷이 뭔지, 3-way handshaking이 실제로 어떻게 일어나는지 전혀 몰랐다. 하지만 아이러니하게도 그 기계적인 암기력 덕분에 면접관들을 속이고 꽤 괜찮은 점수를 받아 취업에 성공했다. 나는 그게 행운인 줄 알았다. 그것이 4년 치 업보를 한꺼번에 맞게 될 비극의 시작인 줄도 모른 채 말이다.

소규모 팀의 풀스택 생존기
내가 들어간 곳은 소규모 팀이었다. 그곳에는 ‘프론트엔드’나 ‘백엔드’ 같은 친절한 구분 따위는 없었다.
입사 첫날부터 나는 쓰나미처럼 밀려오는 기술 스택 앞에 서야 했다. 나는 자바나 자바스크립트 중 하나만 잘하면 될 줄 알았다. 하지만 현실은 리눅스 SSH 터미널의 검은 화면, 정체를 알 수 없는 Docker 컨테이너, GitLab CI/CD 파이프라인, 그리고 Spring Boot와 Vue.js, Redis까지… 내가 학창 시절 “나중에 해야지” 하고 미뤄뒀거나 “이건 몰라도 돼”라고 무시했던 기술들이 사방에서 나를 공격해 왔다.
면접 때 줄줄 읊었던 그 지식들은 실무에서 아무런 쓸모가 없었다. 아니, 정확히 말하면 ‘적용’할 줄을 몰랐다. 내가 띄운 도커 컨테이너가 왜 자꾸 죽는지(OOM), 레디스는 왜 메모리를 갉아먹는지 이해하려면, 내가 면접용으로 암기했던 그 CS 기초 지식이 진짜로 필요했기 때문이다.
모래 위에 쌓은 성
결국 나는 닥치는 대로 코드를 복사해서 붙여넣기(Ctrl+C, V)하는 ‘복붙 개발자’가 되어 있었다. 기능은 어찌어찌 돌아갔지만, 왜 돌아가는지는 몰랐다.
- CORS Error: 왜 내 브라우저는 서버의 응답을 거부할까? (HTTP 헤더에 대한 무지)
- OOM (Out Of Memory): 왜 잘 돌아가던 서버가 갑자기 죽을까? (메모리 누수와 GC에 대한 무지)
- Connection Refused: 로컬에선 되는데 왜 배포만 하면 안 될까? (포트 포워딩과 방화벽에 대한 무지)
프레임워크가 제공하는 편리함 뒤에 숨겨진 원리를 모르니, 문제가 생기면 해결할 능력이 없었다. CS 기초가 부실한 땅 위에 화려한 프레임워크로 위태로운 성을 쌓고 있었던 것이다.

Re: Booting, 다시 시작점으로
그래서 나는 다시 처음으로 돌아가기로 했다. 지금 당장 화려한 포트폴리오를 하나 더 만드는 것보다, ‘컴퓨터가 도대체 내 코드를 어떻게 이해하고 실행하는가’라는 본질적인 질문을 해결하는 것이 더 급하다고 느꼈기 때문이다.
이 블로그는 졸업장만 있는 전공자가 다시 밑바닥부터 CS 기초를 쌓아 올리는 치열한 복기의 기록이다. 단순히 리눅스 명령어 모음이나 도커 설치법을 나열하지는 않을 것이다. 대신 다음과 같은 질문들을 던지고 답을 찾아가는 과정을 담으려 한다.
- Language & OS: 자바 코드가 컴파일되어 CPU에 닿기까지 어떤 일이 벌어지는가?
- Network: 주소창에 엔터를 쳤을 때 패킷은 어떤 경로로 여행하는가?
- Virtualization: 내 노트북과 서버실의 컴퓨터는 무엇이 다르며, 왜 가상화가 필요한가?
- DevOps: 내가 짠 코드를 어떻게 안전하고 자동으로 배포할 것인가?

localhost를 넘어서
최종 목표는 리눅스, 도커, CI/CD, 그리고 클라우드 환경까지 내 손으로 직접 구축하고 제어하는 것이다. localhost라는 안전한 온실을 벗어나, 거친 야생의 서버 환경에서도 살아남을 수 있는 엔지니어가 되는 과정을 지켜봐 주기 바란다.
과거의 나처럼 ‘학교에서 배웠는데 기억이 안 나요’라고 말하는 분들에게, 이 기록이 ‘아, 그때 교수님이 했던 말이 바로 이 뜻이었구나!’라고 무릎을 치게 만드는 작은 이정표가 되길 바란다.