기술면접 후기

질문들

면접 결과 정리

주제 1 커리어

1. 왜 전공과 다른 개발자의 길을 걷게 되었나?

기존 전공과 관련된 업계의 분위기와 맞지 않았습니다. 우연한 기회로 시작했는데 적성에 맞는 듯 하여 재밌게 하고 있습니다. 엉덩이 오래 붙이고 앉아서 고민하고 코드로 씨름하는 것에 자신 있습니다.

2. SW 사관학교 정글은 어떻게 들어가게 되었나?

경험해본 친구의 추천이 있엇습니다. 나도 단기간 집중하여 성장에 몰입한다는 면에서 매력을 느꼇습니다.

3. 개발 공부를 시작한 이후로 가장 힘들었던 챌린지는 무엇인가?

개발 관련 공부가 되있지 않은 상태로 부트캠프에 들어가 살아남는 것 자체가 가장 어렵고 힘든 챌린지였음. 기초부터 가르쳐주는 것이 아니라 전산학과 관련된 내용들이 많다보니 남들에게 당연한 것을 새로 배우고 이해하는 것이 힘들었습니다.


주제 2 알고리즘

1. 이진 탐색 트리에 대해 알고 있는가?

그래프 중 부모와 자식으로 계층 구조를 이루는 것을 트리 구조라고 하는데, 자식을 2개 이하로만 가지는 트리 중 본인 노드 값보다 작은 값은 왼쪽 서브트리에, 큰 값은 오른쪽 서브트리에 있다는 규칙을 만족하는 트리를 binary search tree라고 합니다.

root 얘기도 할걸 그랬다.

2. BST에서 최댓값은 어떻게 구할 수 있는가?

오른쪽 자식을 포함한 오른쪽 서브트리는 노드 자신의 값보다 큰 값들만 있으므로 오른쪽 자식을 따라 내려가다 leaf node를 만나면 최댓값을 구할 수 있습니다.

3. 구조를 변경하지 않고 두번 쨰로 큰 최댓값을 구하는 방법은 무엇인가?

위에서 찾은대로 오른쪽 자식을 따라가다 leaf node를 만나 최댓값을 구하고, 그 최댓값을 가지는 노드의 부모노드가 두번째로 큰 최댓값입니다.

여기서부터 잘못되었다. 사실 모르는 문제이긴 했으나 이런 생각이 들었고, 말하면서도 맞는 말이라고 생각하긴 했다. 다음 꼬리질문에 크게 잘못되었다고 느꼈지만..

4. 방금 답변에서, 최댓값이 leaf node가 아닐 때는 어떨것이라고 생각하는가? 다양한 케이스가 있으니 일반화하여 말할 수 있는가?

최댓값이 왼쪽 자식이 있다면 그 왼쪽 자식이 2번째로 큰 값일 것 같습니다.

(면접관 : 그럼 그 왼쪽 자식이 또 오른쪽 자식을 가진다면요? 일반화 시켜주세요.)

…. 생각할 시간을 주실 수 있나요?

(30초 후)죄송합니다. 모르겠습니다.

내가 3번에서 말한 답은 최댓값을 가지는 노드가 왼쪽 자식이 있을 경우에는 성립이 안된다. 예를 들어 최댓값이 20 인데, 18이라는 왼쪽 자식 노드가 있다고 하면? 그리고 20 노드는 18보다 작아야 한다. 애초에 20을 포함한 서브트리는 자신의 오른쪽 서브트리기 때문이다.

공부해보았는데, 한 문장으로 정의할 수 있는 지 모르겠다. 케이스를 나눠야 하는 것 같은데.. 최댓값노드가 왼쪽 자식을 가진다면 그 왼쪽 서브트리의 최댓값이 두번째로 큰 값이구나! 이제 내 대답이 어디서 잘못됐는지 알 것 같다.

최댓값 본인 노드가 왼쪽 자식이 있다면 그 왼쪽 서브트리의 최댓값이 2번째 값이다.

없다면/ 부모노드가 최댓값이 될 것이다. 면접관님이 말씀하신 일반화라는게 ‘서브트리’라는 개념을 원하셨던 것 같다.


주제 3 기술스택

1. 사용해본 DB가 있는가?

MongoDB를 사용 경험이 있습니다.

2. 포트폴리오로 제출한 프로젝트에서 MongoDB를 사용한 이유는 무엇인가?

MySQL가 MongoDB 중 고민 하였는데, MySQL은 테이블처럼 정형화된 데이터를 받는 것이 적절하다고 공부했고, 우리 게임 데이터는 일관성있지 않기 때문에 MongoDB를 사용하였습니다. 또 Express 를 사용하면 Mongoose로 더 효율적이로 관리할 수 있기 때문입니다.

3. 답변에서 말한 3가지 게임이 모두 내부에서 다양하고 정형화되지 않은 데이터를 생산해내는가?

3가지 게임이 있는데 2가지 게임의 경우 유저의 선택에 따라 다양한 case가 발생할 수 있다보니 그렇습니다.

말도 안되는 소리였다. 나도 내가 뭔소리를 하는지.. SQL과 NoSQL에 대해 알고 있는지 궁금하셨던것 같아서 억지로 짜내다보니 이런 터무니없는 소리가 나온것 같다. 이참에 확실히 알아둬야겠다.

MySQL

  1. 유형: 관계형 데이터베이스 (RDBMS)
  2. 데이터 모델: 테이블 기반의 스키마 구조를 사용합니다. 각 테이블은 열과 행으로 구성되며, 데이터의 관계가 정의됩니다.
  3. 질의 언어: SQL(Structured Query Language)을 사용하여 데이터를 조회, 삽입, 수정, 삭제합니다.
  4. 트랜잭션 지원: ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 지원합니다.
  5. 일관성: 스키마가 정의되어 있으므로 데이터의 일관성이 유지됩니다.
  6. 확장성: 수직 확장이 주로 이루어지며, 수평 확장이 상대적으로 어려울 수 있습니다.

MongoDB

  1. 유형: NoSQL 데이터베이스로, 비관계형 데이터베이스입니다.
  2. 데이터 모델: 문서 지향적 모델을 사용하며, JSON 형태의 데이터를 저장합니다. 고정된 스키마가 없습니다.
  3. 질의 언어: SQL과 다르게, 객체 지향적인 질의 방식을 사용합니다.
  4. 트랜잭션 지원: 최근 버전에서는 다중 문서 트랜잭션을 지원하며, 일부 ACID 특성도 제공합니다.
  5. 유연성: 고정된 스키마가 없으므로, 다양한 형태의 데이터를 유연하게 저장할 수 있습니다.
  6. 확장성: 수평 확장이 쉽게 이루어질 수 있으며, 대규모 데이터를 관리하는 데 유리합니다.

4. 트랜잭션을 사용해본 경험이 있는가?

없습니다.

솔직히 처음 들어봤다..

트랜잭션은 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적인 단위로 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위이다. 하나의 트랜잭션은 커밋(commit) 되거나 롤백이 된다. 이러한 작업들은 모두 함께 성공하거나 실패한다. 즉, 트랜잭션의 모든 연산은 “all or nothing” 이다.


주제 4 네트워크

상황 : 상품을 판매하는 사이트를 제작. 1000명이 접속하고 10개의 노트북이 팔린다. 10명만 살 수 있고, 990명은 살 수 없음을 의미한다.

1. 이 사이트의 API를 어떻게 구현할 지 말하라

설정한 도메인을 입력한 클라이언트가 서버에게 요청을 보내면, 서버는 html을 보내줍니다. 구매와 관련된 요청을 보내면 서버는 요청을 처리하여 응답을 보내고 서버에 현재 상품의 상태를 업데이트합니다.

다 부족하지만 특히 네트워크쪽은 심각한데 물어봐서 털렸다..

2. 구매한 10명을 어떻게 선택할 지, 구매 성공 여부의 기준에 대해 말하라

서버에 현재 남은 갯수를 표시하고 요청이 올때마다 순서대로 업데이트 하면서 처리할 것 같습니다.

3. 답변대로 요청을 시간 순서로 다룬다면, 정확히 동시에 들어온 두 요청은 어떻게 처리할 것인가?

말씀하신대로, 제 답변대로 하면 정확히 동시에 2명이 요청을 보낸다면 문제가 될것 같습니다. 잘 모르겠습니다만 그 유저의 이전 사용 기록이나 다른 데이터를 조회하여 그를 바탕으로 누구에게 구매를 연결할지 결정할 것 같습니다.

코드에 관해 말했어야 했던것 같은데.. 뭐라도 말해야겠다 싶었다.

4. 다수의 인원이 동시에 보낸 상황에서 노트북이 부족하다면 발생하는 문제는 무엇인지 구체적으로 말해달라. 그 해결책은 무엇인가?

남은 상품이 있음에도, 동시에 요청한 다수의 유저가 구매할 수 없다고 처리된다거나 실제 구매처리되지 않았음에도 잘못된 응답으로 구매처리되었다고 보내지는 등 동기화에 문제가 생길것 같습니다.

그냥 짜내서 멀티쓰레드에서 들었던 것들과 유사하게 말했다.. 해결책은 말하지 않았다. 모르기 때문이다.

이 후는 위 상황과 무관한 별개의 질문이다.

5. 유저가 네이버 주소를 입력하면 네이버 홈페이지가 뜨는 과정을 서버와 클라이언트를 포함하여 설명하라.

클라이언트가 도메인을 입력하면 서버에 요청을 보내게 된다. 그럼 서버가 html을 보내준다.

내가 생각해도 너무 허접한 답변인 것같다.

6. 어떻게 누가 어디서든 네이버 주소를 입력하면 같은 화면을 볼 수 있는 것인가?

어디에 어떤 도메인은 어디로 연결된다라고 다 저장을 해야할 것 같긴 한데.. 그걸 다 저장하기엔 물리적으로나 현실적으로 힘들것 같고..

ip가 그 서버의 unique한 id 의 개념이고 도메인이 그 고유한 id에 연결된 것이니 어디에 약속을 저장할 필요 없을 것 같습니다.

사실 이때부터 멘탈이 나가있어서 나도 내가 뭔소리하는지 몰랐다.


주제 5 부트캠프

1. 부트캠프에서 PintOS 기간에 배운 것을 말해달라

주차별로 멀티쓰레드와 프로세서, 유저 프로그램, 가상 메모리, 파일 시스템을 배웠음. 멀티쓰레드와 프로세서는 여러 쓰레드와 프로세서간 공유 자원과 순서를 관리하는 것에 대해 배웠습니다. 유저 프로그램에서는 유저 영역과 커널 영역의 차이에 대해 배우고 유저 영역에 있는 프로그램이 커널 영역에 있는 리소스를 어떻게 다룰 수 있는지 시스템 콜 등에 대해 배웠습니다. 파일 시스템에서는 서브디렉토리 개념 등에 대해 배웠습니다.

가상 메모리와 파일 시스템에 대한 답변이 없거나 짧았다..

2. 어려운 PintOS를 충분한 준비기간 없이 배우게 되었는데 겪은 어려움은 무엇인지, 어떻게 이겨냈는지 말해달라

C 언어로 진행 되었는데, C 언어 자체에 대해서도 많이 낯설었다. 파이썬은 그래도 쉬운 편이라 괜찮았는데 C 언어는 포인터 같은 개념이 너무 어려웠다. 과제 내용자체를 이해하는 것도 어려운 상황에서 코드까지 못읽는 것이 힘들었다. 다른 사람들의 과제를 보고 따라하면서 어떤 코드가 어떤 의미인지를 파악하는데 시간을 많이 썼다. 그래도 나중에는 어느 정도 따라는 할 수 있게 되었다.

3. PintOS에서 가장 기억에 남는 것은 무엇인가?

1주차에 공부한 멀티쓰레드가 기억에 남는다. 복잡하고 어려운 연산을 처리하는 컴퓨터의 프로세서가 동시간에 하나만 처리할 수 있다는 것이 놀라웠고, 스케쥴링 관리 했던 것이 인상에 많이 남았다.

4. 부트캠프 커리큘럼에서 웹서비스와 관련된 내용이 없어보이는데 프로젝트로 웹서비스를 만든 이유는 무엇인가?

이 부트캠프가 코드를 가르쳐주기보단, 전산학에 대해 기초를 익히는 코스라 직접 가르쳐주지 않더라도 스스로 빠르게 익혀서 해내는 것을 요구했다. 애초에 마지막 5주 팀프로젝트 과정 자체가 그런 커리큘럼이다.

5. 웹 서비스를 처음 했다면, 어디서부터 어떻게 시작했는가?

팀원중에 기존 경험이 있는 친구들로부터 많이 배웠고, 어떤 언어를 써야 하는지 어떤 형식을 취해야 하는지 등 기초적인 구조에 대해 공부하는 것부터 시작했다.

후기

두번째 기술면접이었다. 올해 초에 생겨서 작은 스타트업 회사였는데, 감사하게도 면접 기회를 주셔서 볼 수 있었다. 사실 이전 면접은 SW 사관학교 정글의 협력사에서 준 기회였는데, 이번엔 내가 지원한 곳이라 조금 떨리긴 했다. 내가 공부한 부트캠프를 잘 모를 수 있으니 질문이 어떻게 다를까 궁금하긴 했다. 그리고 똥망했다. 갈길 멀다 참.. 열심히 공부하자