본문 바로가기
면접 후기

콘솔 클라이언트 개발 기술 면접 후기

by woohyeon 2020. 7. 30.
반응형

얼마 전에 ㅂㅌㄱㄹㅇㄷ를 개발한 회사의 인턴쉽에 지원했는데 운좋게 서류에 합격하고 테스트도 통과해서 기술 면접을 보러갔다. 회사는 되게 깔끔하고 쾌적하고 자유로운 분위기였다. 첫 기술 면접이라 떨렸는데 면접보는 공간도 그렇고 분위기도 그렇고 좀 오픈되어 있는 느낌이라 그나마 덜 긴장됨.  

면접 전에 가장 걱정되었던 부분은 해당 게임에 대한 경험이 거의 없는 것과 게임 개발에 대한 경험이 없는 것이었다. 게임 개발 경험이 있으면 좋지만 뭐 신입은 기초 탄탄하게 더 중요하다 하길래 그나마 덜 걱정되긴 했다. 필기 테스트도 거의 C++, 전산학 지식을 묻는 것이어서 좀 더 안심됐고.. 근데 분명히 해당 게임을 많이 해보지도 좋아하지도 않는데 지원한 이유를 물어볼 것 같았다.

어쨌든 처음에 인터뷰 시작하고 간단하게 자기소개 후에 본격적인 질문들이 들어왔다.

면접은 나 포함 2명이고 면접관은 3분이셨다. 면접은 대략 1시간 진행한 듯함.

첫 질문은 빌드가 무엇인지에 대해 설명해보라고 하셨다. 예상하지 못했던 질문이지만.. 역시 간과하기 쉬운 기본적인 질문을 한다는 걸 깨달은 순간.

그때는 빌드(build)라는 것이 대충 어떤 느낌인진 알지만 정확한 정의는 알지 못했다. 우선 나는 이렇게 설명함.

우리가 고급 언어로 코드를 작성하면 컴파일이라는 과정을 통해 여러 소스 코드들이 기계어로 번역이 된다. 그리고 링크라는 과정을 통해 번역된 코드들을 서로 연결(link)시켜서 하나의 파일로 만든다. 이러한 과정을 빌드라고 한다.   

생각보다 잘 설명해서 스스로 다행이라고 최면을 걸었음. 끝나고 찾아보니 다행히 말했던 것과 비슷하게 컴파일과 링크 과정을 합쳐서 빌드라고 한다고 함. 근데 컴파일 후 생성되는 오브젝트 파일이라던지 실행 파일이라던지 이런 상세한 내용은 설명하지 못해 아쉬웠음. 

내가 빌드를 설명하면서 고급 언어라는 걸 언급해서 그런지 다음 질문에 고급언어와 저급언어를 나누는 개인적인 기준이 있냐고 물어보심.

내가 알기론 고급언어 저급언어는 비교하는 대상에 따라 다르기 때문에 상대적이라 생각했음. 예를 들어 C는 자바에 비해선 저급 언어인데, 기계어나 어셈블리에 비해선 고급 언어임. 그래도 보통 기계어랑 어셈블리가 더 lower 하니까 기계에 좀 더 친숙한 기계어랑 어셈블리가 저급 언어, 나머지 C/C++, C#, 자바, 파이썬 등이 고급 언어라고 했음.  

 

여기부턴 질문 순서가 생각나지 않아 무작위로 작성함.

사실 질문들이 거의 운영체제에 대한 질문이었음.  90%가 운영체제에 대한 질문

 

[운영체제가 사용하는 메모리 영역에 대해서 설명해주세요.]

이게 보니까 공격적으로 물어봐도 바로바로 자신있게 나오는 지식이 있고, 여유있게 1분 정도 생각해봐야 답변을 할 수 있는 지식이 있음. 그런데 면접 때는 생각해보고 대답할 수가 없으니까 이럴 땐 좀 당황하게 됨. 

우선 나는 메모리 영역은 크게 운영체제가 사용하는 영역과 사용자가 사용하는 영역으로 나뉜다 했음. 운영체제 영역은 뭐 커널 관련된 데이터가 존재하고, 사용자 영역에 대해 설명해야 되는데 흔히 말하는 4영역(스택,힙,데이터,코드)이 여기에 해당되는게 맞는지 헷갈렸음. 좀 여유있게 생각해보면 음 사용자 메모리 공간은 CPU가 실행할 사용자 프로그램들이 올라와 프로세스인 상태로 존재하고, 각 프로세스는 4영역을 개별로 가진다. 이렇게 생각할 수 있는데 이게 바로바로 안 떠올라서 당황해서 얼버무렸던 것 같음. 사실 뭐라 답 했는지 기억도 잘 나지 않는다. 여기서 좀 마이너스가 됐겠고...

 

[프로세스가 사용하는 메모리 영역과 스레드가 사용하는 메모리 영역의 차이점]

이 질문도 사실 외운게 아니라 머릿속으로 코드를 하나 떠올리고 프로세스는 각 프로그램을 의미하니까 4영역 모두 독립적으로 가질 것이고, 스레드는 프로그램 내의 여러개의 흐름이니까 코드,힙,데이터 영역은 공유하고 각 스레드가 실행하는 지역 공간, 즉 스택 영역은 독립적으로 메모리를 가진다. 이렇게 생각을 했어야 됐는데.. 바로바로 떠오르는 대답이 아니었음. 프로세스는 바로 대답을 할 수 있었지만 스레드가 스택 영역을 독립적으로 가진다는 게 머릿속에서 1초만에 이해가 되진 않고 코드를 떠올리며 이해를 했어야 됐음. 여튼 이 문제도 정확히 뭐라고 답했는지 기억이 안남. 그런데 이 질문은 확실히 내가 스레드 사용 경험이 부족했던 문제도 있음.

 

[라운드 로빈 알고리즘에 대해서 설명해주세요. (사용하는 이유, 멀티 스레드 환경에서의 필요성)]

운영체제의 스케줄링 정책에 대해 포스팅을 했었는데.. 이때 각 정책의 정확한 내용이 기억나지 않았음. 그래서 나는 라운드 로빈.. 정확히 기억이 나지 않지만, 레디큐에 스레드들이 대기하다가 CPU 할당시간이 끝나면 레디큐의 맨뒤로 이동해서 순환적으로 CPU를 사용한다고 했음. 근데 내가 질문을 잘못 이해했는지 면접관분이 그건 그냥 이 알고리즘의 동작 방식이고, 운영체제가 이러한 방식을 사용하는 이유에 대해 설명해달라고 하셨음. 

이때 머릿속으로 생각은 했는데, 내가 원하는 표현이 입밖으로 안나와서 몇초동안 계속 답을 못하고 어버버거려서 내 자신이 너무 답답했음. 정확히 기억은 안나지만 대략 여러 스레드가 하나의 CPU를 사용하기 때문에 잘못하면 하나의 스레드가 CPU를 독점할 수 있는 상황이 생긴다. 그러면 나머지 스레드는 무한히 기다려야 한다. 때문에 이러한 상황을 방지하기 위해 이러한 알고리즘을 사용한다. 이런식으로 애매하게 답함..

모범답안은 멀티 스레드 환경에서 하나의 스레드가 CPU를 독점하는 상황과 다른 스레드가 실행되지 못하고 무한정 기다리는 '기아' 현상을 막기 위해 각 스레드에 적절한 CPU 사용 시간을 부여하여 모든 스레드가 순환적으로 실행되도록 하는 것.

이라고 생각한다.   

 

[컴퓨터에 존재하는 메모리들의 액세스 속도 설명]

간단하게 CPU에 존재하는 캐시와 주기억장치(RAM), 하드디스크와 같은 보조기억장치를 먼저 설명하고, 그에 따라 CPU에 가장 가깝고 가장 빠르지만 용량이 가장 적은 캐시, 캐시보다 느리지만 크기는 더 큰 메인 메모리, 가장 느리지만 가장 용량이 많은 하드디스크와 같은 보조기억장치가 있다. 이 정도로 설명했음.

 

[context switching 설명]

초반 질문에서 프로세스와 스레드가 사용하는 메모리 영역의 차이에 대해 제대로 답변하지 못한걸 만회하기 위해.. 대략적인 개념을 설명하고 프로세스와 스레드의 context switching 차이까지도 설명했음.

우선 이 개념은 여러 프로세스 또는 여러 스레드가 존재하는 환경에서 하나의 프로세스(스레드)만 실행되는데, 실행 중인 프로세스의 CPU 할당 시간이 끝나면 해당 프로세스를 중지시키고 다음 프로세스를 실행해야 한다. 따라서 실행 중이던 프로세스의 데이터(종료지점 등)들을 백업해두고, 다음 프로세스의 데이터를 불러오는 작업이 필요하다. 이처럼 프로세스의 데이터를 백업하고 불러오는 작업을 context switching이라 한다. 추가로 프로세스는 4개의 모든 영역이 독립적이라 저정하고 불러오는데 필요한 데이터가 많다. 반면 스레드는 3개의 영역을 공유하기 때문에 나머지 영역만 백업하고 불러오면 된다. 따라서 스레드는 프로세스 간의 context switching보다 더 적은 소요 시간을 가진다 라고 설명했음  

 

[rvalue와 lvalue에 대해 설명]

한 분이 내 블로그 포스팅 중 어떤 글을 언급하시면서 rvalue와 lvalue의 차이를 설명해달라고 하심. 간단하게 그냥 rvalue는 상수와 문자열 리터럴과 같은 주소가 없고, 해당 라인을 벗어나면 사라지는 임시 값이라고 설명했고, lvalue는 해당 라인을 벗어나도 사라지지 않으며 주소를 가진 변수라고 설명함.

 

생각나는 기술 질문은 여기까지고 나머지는 개인적인 질문들.

[블로그를 언제부터 시작했는지, 왜 하게 되었는지]

대학교 때 현장실습에서 웹개발을 하면서 구글링을 많이 하다보니 많은 개발자들이 기술 블로그를 운영하더라, 또한 개발 도중에 발생한 오류 및 해결 방법, 내용 정리 등 나만의 공간에 올리면 좋을 것 같다. 또한 실제로 해보니 공부에 대한 의욕도 많이 생기고 꾸준하게 발전할 수 있었던 것 같다. 이런식으로 설명함.

 

[클라이언트 개발을 지망하는 분들은 보통 대학생 때 그래픽 공부나 엔진 공부나 게임 개발을 해보던데, 왜 안하셨었는지?]

이 질문은 확실히 찔리는 질문이었다.. 어떻게 대답해도 그냥 변명처럼 보일 것 같아서 그냥 솔직하게 말함.

다른 사람들처럼 처음부터 게임 개발을 생각하지 않았고, 이리저리 방황하면서 정확한 직무를 정하지 못하다가 C++을 제대로 배우기 시작하면서, C++의 특성인 성능 최적화 등에 흥미를 느꼈다. 물론 게임을 좋아하기도 하고. 그런데 게임 개발은 C++과 컴퓨터 구조, 운영체제 등 기초가 많이 중요하다. 그러나 자소서에 썼다시피 대학교 3학년정도부터 개발에 흥미를 느끼고 제대로 된 공부를 하기 시작했다. 하지만 재학 중엔 뒤늦게 학교 수업, 현장 실습 등에 몰두하느라 개인 공부를 할 시간이 만만치 않았고, 매일매일 미친듯이 공부하다보니 졸업을 했다. 겨우 어느정도 기초가 되었다 생각했고, 이제야 그래픽 관련 공부를 하기 시작했다. (하지만 기초없이 게임 관련공부를 했다면 더 힘들었을지도 모를 것 같다. 따라서 후회는 하지 않는다.)

괄호친 말은 하지 않았는데 저거까지 했으면 좋았을텐데...

 

[자사 게임 많이 해보셨는지? 안 좋아하는데 왜 지원하셨는지? ]

아마 채용 공고의 지원 사항에 써 있었을거다. 해당 게임 많이 해보신 분이라고. 그래서 물어본 것 같은데 나는 다양한 게임을 해봤고 게임을 좋아하기 때문에 게임을 파악하고 배우는 것은 자신있다 시간문제다. 라고 답변했다. 하지만 면접관분들 입장에선 그럼 그냥 굳이 이 회사가 아니여도 될 것 같은데.. 그냥 회사 크기만 보고 지원한 것 같다는 느낌이 드는건 사실이다 라고하셨다.

하지만 나는 이렇게 생각한다. 좋아하는 게임, 많이 해본 게임을 만든 회사에 지원하면 금상첨화지만, 반드시 이 조건을 만족하긴 힘들다고 생각한다.. 난 그냥 게임 자체를 좋아하고, 내가 개발 해보고 싶은 게임, 내가 충분히 성장할 수 있을지, 어느정도 대우와 복지가 괜찮은지(그만큼 내가 실력이 되어야겠지만..) 이러한 조건을 만족하면 그냥 지원한다. 그냥 내가 성장할 수 있는 괜찮은 회사에서 열심히 기술을 배우고 싶을 뿐. (개처럼 일할 수 있음)

물론 해당 회사의 게임에 대해 어느정도 알고 가는 건 예의라 생각하기 때문에 플레이는 몇 번 해봤다. 그리고 합격하면 꾸준히 플레이하면서 개발하는데 문제가 없도록 할 자신이 있다. 

기억나는 질문은 여기까지. 떨어질 것 같다고 예상은 했지만 조금의 기대가 있었다. 일주일정도 후에 결과가 나왔는데 탈락.. 예상은 했지만 아쉬웠다. 

그런데 확실히 첫 기술 면접이였어서 그런지 떨린 것도 있지만, 부족한 점도 많다는 게 느껴지긴 한다..  




댓글