사실 이 블로그에는 나의 개인적인 이야기를 한번도 적은 적이 없다. 그러다 우연히 이 분의 글 을 보게 되었고, 취업을 준비하며 내가 느꼈던 생각과 경험들을 나 역시 한번 공유하고 싶다는 감정이 격하게 끌어올라 적게 되었다.
휴학
재작년 휴학한 후, 친구가 창업한 스타트업에서 Ruby on Rails로 웹 개발을 처음 시작하였다. 내가 작성한 코드를 통해 웹서비스가 동작한다는 것이 재밌었고, 내가 개발한 웹서비스가 실제로 운영되고 유저들이 사용하는 것을 내 눈으로 볼 수 있다는 것은 나에게 큰 즐거움으로 다가왔다.
하지만 온라인 강의를 보며 독학으로 개발을 하다보니 여러가지 한계점을 느꼈다. 그때마다 내가 계속 이 길을 가도 될까 하는 걱정이 들었고, 전공과 다른 분야에 도전하는 내 모습이 내가 봐도 너무나 위태롭고 불안해보였다.
그래도 내가 정말 좋아하고 잘하고 싶은 분야였기 때문에 포기할 수 없었던 것 같다. 더욱 깊이 배워보고 싶다는 욕심이 계속 커지고 있을 때 우연히 페이스북에서 패스트캠퍼스 에서 운영하는 웹 프로그래밍 스쿨 광고 보게 되었고, 그 강의를 수강하기 위해 서울에 올라오게 되었다.
인턴
그 곳에서 강의 뿐만 아니라 강의 수료 후에 인턴 제의를 받아 3개월동안 "개발자"라는 직책으로 근무하였다. 그 때 현업에서의 경험은 개발을 취미로 할지 직업으로 삼을지 항상 고민해왔던 나에게 확신을 주었다. 인턴으로 근무하며 개발에 대한 자신감도 생겼고, 또 많은 개발자들을 만나며 개발자라는 직업에 대한 동경과 매력을 느낄 수 있었다. 서울에서 보낸 그 시간들은 내 인생의 큰 터닝포인트가 되었다.
전공 공부
작년 4학년으로 복학한 후, 스타트업이 아닌 대기업(여기서 대기업은 스타트업에 비해 상대적으로 인프라가 갖춰진 회사) 개발자로 커리어를 시작하자는 목표를 세웠다. 그때 내 발목을 가장 붙잡았던 건 컴퓨터공학 전공자가 아니라는 점이었다. 내 전공인 전자공학에서도 자료구조, 운영체제, 컴퓨터구조와 같은 기본적인 컴퓨터 관련 수업들이 있었지만, 컴퓨터공학 전공자들과 경쟁하기엔 그것만으론 턱없이 부족했다.
그런 약점을 보완하기 위해 4학년 때는 주로 전공만 공부했고 실제적인 개발은 거의 하지 않았던 것 같다. 이미 전공 졸업학점도 채운 상태였기 때문에 그때부터는 주로 컴퓨터공학과 수업들을 찾아서 들었다. 그 때 들었던 알고리즘 수업은 이제와서 생각해보면 취업을 준비하는 데 있어 정말 큰 도움이 되었던 것 같다.
그 외에 학교 수업으로 부족한 부분은 별도로 개발 서적들을 구매하여 채워나갈 수 있었다.(형이 다니는 회사에서 1년마다 도서비 30만원이 제공된 것은 나에게 큰 축복이었다.)
아래에 내가 공부한 방법들을 분야별로 정리해보았다.
알고리즘
사실 개인적으로 느끼기에 취업의 관점에서는 가장 중요한 과목이 아닐까하는 생각이 든다(코딩 테스트를 통과하지 못하면 면접 기회조차 없으니까..)
대부분의 IT회사나 대기업의 소프트웨어 계열을 지원할 때 가장 먼저 만나게 되는 관문이 바로 코딩 테스트이다. 요즘은 코딩 테스트를 전문적으로 하는 회사들에 외주를 맡겨 온라인 코딩 테스트를 실시하는 IT회사들도 상당히 많은 것 같다.
나는 이전에 한 대기업의 코딩 테스트를 두 번이나 떨어진 경험이 있어 "알고리즘"에 대한 컴플렉스가 마음 깊숙히 자리잡고 있었다. 그 때는 알고리즘에 대한 지식이 전혀 없었기 때문에 공부하는 법조차 몰랐다. 그냥 조금 재밌어 보이는 알고리즘 한 문제를 골라서 혼자서 작정 3~4시간씩 풀어봤던 것 같다.
그러면 결과는 항상 두 가지 중 하나였는데,
- 아예 못 품.
- 겨우 답은 나오지만 결국 시간초과로 인해 오답.
이렇게 포기를 하고 다른 문제를 풀면 또 이 과정이 반복되었다. 그렇게 실력은 항상 제자리였고 발전도 없었다.
제대로 된 공부를 해야겠다는 생각이 들었고, 흔히 종만북이라고 알려진 알고리즘 문제 해결 전략 세트 란 책을 구매하여 지하철을 타고 다닐 때마다 읽었다. 입문자를 위한 책은 아니다 보니 처음 읽을 때는 내용이 어려워 읽기 힘들었다. 하지만 두 번째 읽을 때는 조금씩 깨달음이 온 거 같다.
비록 2권은 거의 읽어보지 못했지만 대회 준비가 아닌 취업 준비를 하는 수준에서는 1권 정도면 충분한 거 같다. 1권 내용의 70퍼센트 이상만 이해한다 해도 왠만한 기업의 코딩 테스트는 다 뚫을 수 있을 수준이라 생각한다. 특히 코딩 테스트에 가장 빈출되는 유형인 동적 계획법(다이나믹 프로그래밍) 파트는 이 책에서 꼭 읽어야 될 부분이다. 또한 이 책에 나오는 모든 코드들이 정말 깔끔하게 짜져 있기 때문에 알고리즘의 코딩 스타일 가이드로 삼아도 좋을 것 같다.
책과 더불어 패스트캠퍼스에서 들었던 최백준 님의 알고리즘 강의와 학교 컴퓨터학부에서 수강했던 알고리즘 수업을 통해 어느정도 개념이 자리잡혔던 것 같다.
그 때부터는 계속 백준 온라인 저지 에서 많은 문제들을 풀어보았다. 주로 다이나믹 프로그래밍, BFS 카테고리에 있는 문제들 중에 정답률이 20 ~ 30%인 문제들만 골라서 풀었다. 또 문제를 풀다가 막혔을 때, 질문을 올리면 많은 고수 분들이 생각보다 빠르게 답변을 달아주셔서 큰 도움을 받을 수 있었다.
자료구조
사실 알고리즘과 자료구조는 뗄래야 뗄 수 없는 분야긴 하지만 앞의 알고리즘은 코딩 테스트와 관련된 공부라면 자료구조는 면접을 준비하는 공부라고 보는 편이 좋을 것 같다.
자료구조를 위한 책을 따로 구매하진 않았고, 주로 프로그래밍 면접 이렇게 준비한다 책에 나와있는 자료구조 빈출 질문들을 보며 준비하였다. 항상 최선인 자료구조는 없으므로 각 자료구조가 가진 장단점을 명확하게 숙지하여 주어진 상황에 적용하는 게 중요한 것 같다. 특히 배열과 연결 리스트의 장단점을 묻는 면접 질문은 어떤 회사에서건 항상 물어보는 단골 질문이다.
운영체제
2학년 때 전자공학에 개설된 운영체제 과목을 들었었다. 그 당시 수업을 들었을 때는 다른 과목들에 비해 개념들이 너무 추상적으로 느껴졌고, 내용이 이해가 잘 되지 않았다. 그렇게 "그래서 운영체제가 뭔데?"하는 의문을 그대로 남긴 채로 수업이 종강되었다.
취업을 준비하기 위해서 다시 한번 제대로 복습해보고 싶다는 생각이 들어 여름방학 1달동안 아는 형과 함께 둘이서 운영체제 스터디를 하였다. 흔히 공룡책으로 유명한 Operating System Concepts 책으로 스터디를 시작하였다. 그러나 한 달이라는 짧은 시간 안에 책에 있는 모든 파트를 스터디할 수 없었고, 그 중 더 중요하다고 생각하는 파트를 몇 개를 선별하여 스터디하였다.
- 프로세스
- 다중 스레드 프로그래밍
- CPU 스케줄링
- 프로세스 동기화
- 교착상태
- 메모리 관리 전략
- 가상 메모리
매주 2번씩 하였고, 그 날 스터디할 파트를 각자 미리 공부해와서 서로에게 설명하는 방식으로 진행하였다. 이렇게 서로에게 설명함으로써 면접 때 답변하는 연습도 할 수 있었고, 또 서로가 이해한 부분이 다르다면 어떤 개념이 맞는지 함께 토론할 수도 있었다.
후에 면접을 다니면서 느꼈지만 이 스터디가 정말 큰 도움이 되었다. 특히 스터디에서 했던 "프로세스 동기화"는 한 면접에서 관련 질문이 나왔을 때 막히지 않고 대답할 수 있었던 원동력이 되었다.
네트워크
네트워크는 따로 공부한 것보다 학교 수업에 치중을 많이 했던 것 같다. 학교에서 들었던 "데이터 통신", "컴퓨터망" 수업은 OSI 7계층에 대한 개념을 잡는데 큰 역할을 했다. 개인적으로 네트워크를 공부할 때는 그림으로 보는 IT 인프라 구조 라는 책을 읽었는데(다 읽진 못했지만), 책에 네트워크에 대한 설명이 쉽고 자세하게 나와있어 개념을 정리하는 데 큰 도움이 되었다.
면접에서 받았던 네트워크 쪽 질문들의 대부분은 OSI 7계층 에 대한 질문이었다. 그만큼 OSI 각 계층 간의 역할과 특징을 명확히 이해하는 것이 네트워크에서 중요한 키포인트인 것 같다. 특히 그 중에서도 자주 물어보는 Transport 계층, Application 계층 을 중점적으로 공부해가는 것이 면접에 있어 큰 도움이 될 것이다.
- Transport 계층: TCP와 UDP의 차이, TCP의 Handshaking 과정 등
- Application 계층: Session/Cookies, HTTPS 등
사용자가 웹브라우저에서 웹사이트에 접속할때 일어나는 과정들을 설명해보라.
와 같은 질문은 면접자의 네트워크에 대한 전반적인 지식들을 모두 체크할 수 있는 정말 좋은 질문이 아닐까 싶다. 대다수의 IT 기업에서 물어보는 단골 질문이기도 하다.
면접
면접 본 회사만 6개 정도되고, 추가적인 면접까지 다 포함하면 면접은 한 10번 정도 봤던 것 같다. 하나의 면접이 끝날때마다 항상 내가 받았던 질문들을 생각나는대로 모두 정리하였다. 그리고 인터넷을 찾아보면서 내가 답변하지 못한 질문들에 대한 답을 적어보았다. 그렇게 정리한 내용들은 다음 면접을 준비하는데 큰 자산이 되었다.
대부분 소프트웨어 직무 면접에서 물어보는 전공 지식들이 비슷하였고, 같은 포트폴리오를 보며 질문하다보니 프로젝트 관련 질문들도 거의 비슷하였다. 그래서 면접을 많이 다닐수록 질문들의 데이터가 쌓이다 보니 준비하기 수월했던 것 같다. 4, 5번째 면접을 갈 때부터는 따로 공부하지 않고 면접 질문들을 정리한 파일만 한번 보고 가는 것으로도 충분했다.
현재
최종적으로 내가 정말 가고 싶었던 IT 기업에 운좋게 취업할 수 있었다. 막상 내가 원하던 회사에 취업되니 기쁜 마음도 들지만 한편으론 불안한 마음도 든다. 이력서와 면접을 진행하며 내가 실제로 가진 실력에 비해 과대평가된 건 아닌가하는 걱정이 생긴다. 함께 입사를 한 동기 중에 개발 실력이 뛰어난 동기들을 보며 가끔씩 내가 왜 뽑혔을까? 하는 의문이 들 때도 있고 심지어 열등감이 느껴질 때도 있다.
하지만 남들이 가지지 못한 나만의 장점이 분명 있다 생각하고 또 그 장점을 좋게 보고 뽑아주셨을 거라 믿고 싶다. 내가 꿈꾸고 있는 수준의 개발자가 되기 위해서는 아직 갈 길이 한참 멀지만, 훌륭한 개발자 분들의 곁에서 끊임없이 성장해나간다면 조금 더 그 목표를 빠르게 이룰 수 있지 않을까 기대해본다.