'CS 전공지식'이란 무엇일까? 'CS'란 'Computer Science'를 말하며, 보통 디자인 패턴, 운영체제, 데이터베이스 자료 구조 등이 포함된다. 분량도 매우 방대하다. 이러한 CS 전공지식을 좀 더 효율적으로 학습할 수 있는 방법을 『면접을 위한 CS 전공지식 노트』에서 소개한다.
작가님 소개를 부탁드립니다.
AI핀테크 스타트업, 어비스의 리드 개발자이자 설립자이고, 대한민국 최고의 핀테크 서비스를 만들고 있는 개발자 주홍철입니다. 대표적인 프로젝트로는 대한민국 공항, 공군에 설치되어 쓰이고 있는 실시간 모니터링 시스템을 개발했습니다. 『면접을 위한 CS 전공지식 노트』, 『실시간 모니터링 시스템을 만들며 정복하는 MEVN』을 집필했고, 인프런에서 '10주 완성 C++ 코딩테스트', 'CS 지식의 정석'을 강의하고 있습니다. 또한, 구독자 2700명인 <큰돌의 터전> 유튜브 채널도 운영하고 있습니다.
『면접을 위한 CS 전공지식 노트』 를 쓰신 계기가 궁금합니다.
면접을 보다 보면 면접관들이 CS 지식에 관한 질문을 많이 합니다. CS 지식이란 컴퓨터 공학적 지식을 말하는데요. 디자인 패턴, 자료 구조, 데이터베이스, 운영체제, 네트워크를 아우르는 지식을 말합니다. 이런 지식은 개발자가 비즈니스 로직을 구축하는 데 있어서 기초가 되는 상식이에요. IT 회사도 이런 점을 아는 만큼 CS 지식에 관한 질문을 많이 하더라고요. 그런데 이런 걸 한 번에 알려주는 책이 없었어요.
제 경우에는 컴퓨터 공학 전공자들이 보는 전공 서적 몇 개를 전부 외웠고, 관련 강의도 전부 듣고 모두 외워서 준비했어요. 그렇게 해서 합격은 했는데, 너무 힘들었던 경험이었어요. 그래서 저와 같은 이런 힘겨움을 다른 분들도 '취업 준비생일 때 겪지 않을까?'라는 생각이 들었고, 조금이라도 도움이 되고 싶어 이 책을 집필하게 되었습니다.
요즘 개발자 취업 시 면접 동향은 어떠한가요?
신입은 확실히 탄탄한 CS 지식이 있는지, 알고리즘을 잘하는지를 물어보고, 경력은 프로젝트 위주로 질문하되, 조금 더 깊은 수준의 내용도 함께 질문하곤 합니다. 여기서 조금 더 깊은 수준의 질문이란 다음과 같은 질문을 뜻해요. 조금 어렵게 느껴질 수 있겠지만, '아, 이런 식으로 꼬리에 꼬리를 무는 식으로 나오는구나'라고 정도로만 이해해주세요.
'MongoDB'의 특징은 무엇인가요?
NoSQL로 사용할 수 있는 DB이며 3.2 버전 이상부터는 와이어드타이거 엔진을 쓰며 읽기, 쓰기 기능 등을 향상시켰습니다. 'aggregate' 등이 되며 도큐먼트를 만들 때 12바이트의 유니크한 아이디가 생성되는 것이 특징입니다. 또, 'MongoDB'는 'ObjectID'라는 기본 키가 주어지는 것이 특징이죠.
그렇다면 이 아이디는 몇 바이트로 이루어져 있고, 어떻게 구성되어 있나요?
12바이트의 유니크한 아이디이며 4바이트의 타임 값, 5바이트의 랜덤 값, 3바이트의 랜덤 값으로부터 증가되는 카운트 값으로 구성되어 있습니다.
MongoDB로 리플리카셋을 구축한다고 했을 때, 서버가 몇 대 이상 필요한가요?
일단 MongoDB에서 리플리카셋을 구축할 때 보통 세 개 이상의 서버로 하는 것이 일반적입니다. 한 개의 마스터 노드, 두 개 이상의 세컨더리 노드로 쓰니까요. 이때 서버 개수가 부족할 때 서버 1대를 2대처럼 만드는 것이 있는데, 이는 좋지 않습니다. 왜냐하면 MongoDB의 메모리 버퍼 풀 같은 경우 서버 내의 메모리 50%를 차지하기 때문에, 2대로 만들면 부하가 발생했을 때 대응을 못 할 확률이 높기 때문입니다.
만약, 2대의 서버와 스펙이 낮은 서버 1대가 있다면 아비터 노드도 고려해볼 만합니다. 아비터는 별도로 사용자의 데이터를 보관하거나 처리하지 않아 높은 사양의 하드웨어를 필요로 하지 않기 때문에 비용이 낮습니다. 스펙이 낮은 서버 하나를 아비터 노드로 만들고 이를 통해 프라이머리 선출에 참여하는 용도로만 쓰면 됩니다.
코딩 테스트 동향은 어떠한가요?
제가 사실 오랫동안 코딩 테스트 과외와 강의를 진행했습니다. 지금은 그러한 경험을 토대로 인프런에서 'C++ 10주 완성 코딩 테스트'라는 강의도 진행하고 있고, 그래서 이 부분을 잘 안다고 개인적으로는 자신합니다. 보통 "기출 문제를 중심으로 코딩 테스트를 준비해라."는 말을 많이들 하는데요. 개인적으로는 맞지 않다고 생각합니다. 사실 L사를 제외하고는 어떤 문제가 나올지 아무도 모릅니다. L사는 코딩 테스트에 우리는 '구현'만 낸다고 공언을 했고, 지금까지 쭉 구현만 내고 있어서 해당 기업의 코딩 테스트는 구현만 계속 공부하면 합격합니다.
그러나 IT 취준생이라면 한 회사에만 지원하는 경우는 거의 없을 겁니다. 보통은 네카라쿠배 모두 지원하거든요. 그렇기 때문에 이 많은 회사의 코딩 테스트 유형을 준비해야 하는데, 저는 이 회사들의 코딩 테스트 유형은 '랜덤'이라고 생각해요. '과거의 사례들, BFS, DFS 등이 나온다.'라고 해서 BFS만 준비하다가는 갑자기 DP가 나올 수 있거든요. 그렇기 때문에 '코딩 테스트에 자주 나오는 유형+나올 만한 유형'을 기반으로 전체적으로 학습하는 게 중요하다고 생각해요.
개발자가 성장하려면 어떻게 해야 할까요?
개인적으로는 알고리즘을 배우고 다양한 언어를 배워야 한다고 생각합니다. 제가 프로그래밍 실력이 늘었다고 느꼈던 때가 바로 알고리즘을 배우기 시작했던 시기였던 것 같아요. 그때까지는 그저 '모듈화', 'immutable', 'lint' 정도만 잘하면 좋은 코드라고 생각했는데, 알고리즘을 배우고 난 이후에는 생각이 달라졌거든요. 내가 짠 코드의 시간 복잡도나 공간 복잡도가 보이고, 이 코드가 효율적인지 비효율적인지가 보이면서, 코드를 조금 더 잘 짜게 된 것 같습니다. 그리고 저는 자바스크립트 언어만 좋아해서 다른 언어를 배우지 않으려고 했는데, C++나 JAVA 같은 컴파일 언어를 배우면서 한 단계 더 성장했다고 생각합니다.
비전공자가 노력하면 원하는 회사에 취업할 수 있을까요?
저 또한 비전공자입니다. 꾸준히 노력하다 보면 충분히 가능합니다. 제가 증명하잖아요. 화이팅!
처음 프로그래밍을 배운다면 어떻게 하는 게 좋을까요?
C 또는 C++를 공부하는 걸 추천합니다. 그리고 코딩 테스트를 3개월 정도 준비하세요. 그 이후에 프로젝트를 하면서 알고리즘을 하루에 1~2문제씩 풀면서 감을 유지하세요. 이렇게 하면 됩니다. 프로젝트는 본인이 하고 싶은 프로젝트를 하는 게 좋습니다. '아, 세상에 이런 게 있으면 좋을 것 같아!'라고 생각하는 것들을 만들어 보시면 됩니다. 만약 시간이 부족하다면 백엔드, 프런트엔드와 같은 영역을 정한 다음, 거기에 맞는 프로젝트를 하시고, 시간이 여유가 있다면 여러 영역의 프로젝트를 모두 해보고 그중 원하는 영역의 개발자가 되시면 됩니다. 어렵다고, 막연하다고 생각하지 마시고 일단 도전해보세요!
*주홍철 AI 핀테크 스타트업, 어비스의 리드 개발자이자 설립자이다. 이전에는 네이버의 로그 플랫폼 쪽에서 일했으며, 대한민국 공항, 공군에서 쓰는 실시간 모니터링 시스템을 만들었다. 국방부 등에서 군 SW 발전에 기여한 공로로 참모총장상, 사령관상, 단장상을 수상했으며, 카카오 프런트엔드 챌린지 6위, 스타트업 해커톤 1위, 백준 알고리즘 상위 1%의 실력을 보유하고 있다. |
추천기사
‘대한민국 No.1 문화웹진’ 예스24 채널예스
출판사 제공
출판사에서 제공한 자료로 작성한 기사입니다. <채널예스>에만 보내주시는 자료를 토대로 합니다.