뛰어난 개발자는 ‘일단 작동만 하는 프로그램’이 아니라 ‘제대로 작동하는 프로그램’을 만듭니다. 이들은 자신이 작성한 코드가 어떤 과정을 거쳐 실행되는지 명확하고 자세하게 설명할 수 있습니다. 자신이 개발하고 실행하는 프로그램의 원리를 이해하고 있기 때문에 문제를 맞닥뜨리더라도 어디가 문제인지, 어떻게 해결해야 하는지 빠르게 판단할 수 있습니다. 정보의 질을 판단하는 능력이 있기 때문에 구글링이나 생성형 AI를 통해 습득한 해결 방법도 더 넓은 범위로 이해할 수 있을 것입니다. 붙여 넣을 예제 코드가 없더라도 스스로 디버깅해 문제를 해결할 가능성이 높겠죠.
개발자는 프로그램을 만들기만 하는 직업이 아닙니다. 여러 명의 개발자들이 협업하여 만든 프로그램을 유지보수하고, 문제를 진단해 해결하는 직업이기도 합니다. 따라서 뛰어난 개발자일수록 문제를 정의하고 해결할 수 있어야 합니다. 문제를 정의하고 해결하는 역량은 프로그램의 실행을 제대로 이해하는 것, 어떠한 과정을 거쳐 프로그램이 실행되는지를 설명하는 것부터 시작됩니다.
프로그램의 실행 원리를 자세히 설명하기 위해서는 컴퓨터 과학Computer Science을 이해해야 합니다. 흔히 컴퓨터 과학은 앞글자를 따서 CS라고도 줄여 부릅니다. 사과가 떨어지는 현상을 물리학으로 이해하듯, 프로그램의 작동은 컴퓨터 과학으로 이해할 수 있습니다.
단순히 프로그래밍 언어의 기초 문법이나 프레임워크/라이브러리의 사용법, 메서드의 종류를 암기하는 것만으로는 뛰어난 개발자가 되는 데에 한계가 있습니다. 즉, 단순 프로그래밍 언어의 기초 문법, 프레임워크/라이브러리의 사용법을 넘어 프로그램의 작동 원리를 이해하고 설명하기 위해서는 컴퓨터 과학(CS)에 대한 학습이 필요합니다. 이것이 많은 기업에서 기술 면접 등을 통해 입사지원자의 컴퓨터 과학적 지식을 검증하는 이유입니다.
기술 면접에서는 지원자의 컴퓨터 과학적 지식을 묻는 경우가 많습니다. 가장 먼저 강조하고 싶은 점은 컴퓨터 과학이 단순 키워드 암기 과목이 아니라는 점입니다. 컴퓨터 과학적 지식의 학습 목적은 ‘이해와 적용’에 가깝지, 단순히 키워드를 암기하는 것과는 거리가 있습니다. 마찬가지로 기술 면접의 목적 또한 지원자의 암기력을 테스트하기 위함이 아니라, 실무를 위한 개발의 재료를 얼마나 갖고 있는지를 확인하기 위함입니다.
예를 들어 보겠습니다. 기술 면접에 대비해 다음과 같은 컴퓨터 과학 관련 키워드와 설명을 달달 외워 갔다고 가정해 보겠습니다.
키워드 | 설명 |
프로세스 | 컴퓨터에서 실행되고 있는 컴퓨터 프로그램 |
HTTP | HTML을 비롯해 정보를 주고받을 수 있는 프로토콜 |
CPU | 명령어를 인출하고 실행할 수 있는 컴퓨터 부품 |
… | … |
혹은 다음과 같은 예상 질문과 답변을 그대로 외워 갔다고도 생각해 보겠습니다.
예상 질문 | 답변 |
트리 자료구조란 무엇인가요? | 그래프의 일종으로, 한 노드에서 시작해 다른 정점들을 순회하여 자기 자신에게 돌아오는 순환이 없는 연결 그래프입니다. |
TCP와 IP의 차이는 무엇인가요? | TCP 프로토콜은 신뢰성과 무결성을 보장하는 전송 계층 프로토콜이고, IP 프로토콜은 패킷을 목적지로 전송하기 위한 네트워크 계층 프로토콜입니다. |
프로세스와 스레드의 차이는 무엇인가요? | 프로세스는 운영체제에게 자원을 할당받는 작업의 단위이고, 스레드는 프로세스를 이루는 실행 흐름의 단위를 말합니다. |
… | … |
그러나 막상 기술 면접에서는 다음과 같이 출제될 수 있습니다. 실제로 기술 면접에서 출제됐던 문항을 변형한 질문입니다.
Q. 웹 브라우저에 ‘https://minchul.net’을 입력하고 웹 페이지가 구현되기까지의 과정을 설명해 보세요.
혹은 다음과 같이 키워드를 변형해 출제될 수도 있습니다. 얼마든지 새로운 형태로 질문할 수 있죠.
Q. 트리의 모든 노드를 순회하는 방법을 설명해 보세요.
Q. 이 기능을 멀티스레드로 구현한 것과 멀티프로세스로 구현하는 것에는 어떤 차이가 있나요?
출제 키워드나 예상 답변을 그대로 암기했다면 이런 변형 질문들에 제대로 답변하기 어려울 것입니다. 한 번 답변했더라도 꼬리 질문이 이어진다면 모든 경우의 수를 대비하기가 어렵겠죠.
실무에서 발생하는 문제를 해결할 때도 마찬가지입니다. 운용하던 서버가 갑자기 작동하지 않거나 특정 지점에서 성능이 저하됐을 때, 잘 연결되던 네트워크가 끊어졌을 때는 어떻게 문제를 해결할 수 있을까요? 사용자로부터 받아들인 수많은 정보를 저장하고 다뤄야 할 때, 어떤 형태로 저장해야 최적의 성능을 낼 수 있을까요? 문제를 명확하게 정의해 해결에 필요한 컴퓨터 과학적 지식들을 떠올리고 활용할 수 있다면 차근차근 해결해 나갈 수 있습니다.
‘컴퓨터 과학은 단순 암기 과목이 아니며, 프로그램의 실행 원리를 이해하는 것이 곧 실무의 문제 해결에도 도움을 줄 수 있다’는 말을 잘 곱씹어 보면 ‘개발 실무를 위한 컴퓨터 과학’과 ‘기술 면접을 위한 컴퓨터 과학’이 다르지 않다는 것을 알 수 있습니다. 개발에 필요한 컴퓨터 과학이 따로 있고, 기술 면접 대비를 위한 컴퓨터 과학이 따로 있는 것이 아니라는 의미입니다.
위 콘텐츠는 『이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접』의 내용을 재구성하여 작성하였습니다.
최신 콘텐츠