벌써 8년전 일이네요. 석사시절 구글에 지원했었는데, 총 6번 정도 단계를 거쳤었습니다.
이력서보내고, 전화로 두 번(한번은 한국인, 한번은 외국인), 그리고 구글 코리아에서 한국인 엔지니어와 기술 면접,
그리고 나서 구글 본사에서 4명의 엔지니어가 와서 각각 다른 분야로 기술 면접, 그리고 세르게이 브린 전화면접까지...
이건 당시 한국인 엔지니어와 기술면접봤던 내용입니다.
-----------------------------------------
구글 면접은 14차정도까지 본다고 면접 본 사람들이 그러더라.. 정말 잘 준비를 해가면 10차쯤에서 빠이빠이 한다더라구.. 그래서 뭐.. 떨어지면 말지뭐~ 하는 심정으로 가볍게 갔어.
구글 코리아는 아셈타워에 있어. 20일 14:00에 약속이 잡혔는데 약 20분정도 일찍 도착해서 기다렸고. 곧이어 면접볼 사람이 등장.
30대 초반의 남자였는데 구글 본사에서 근무하다가 구글코리아가 생기면서 이쪽으로 왔다고 하더라구.
가장 먼저 내 이력을 얘기 하면서 상당히 프로젝트 경험이 많다면서 연구실에서 다 했냐고 묻더라. 그래서 멤버십에 대한 얘기를 해주면서 멤버십에서 프로젝트도 해보고 대회도 나가고 연구실에서도 프로젝트 하고 학비벌려고 아르바이트도 하다보니 이렇게 됐습니다~ 라고 했어.
멤버십 얘기를 하면서 그럼 삼성에 가야 하는거 아니냐는거 아직은 그런 제약은 없다고 답변했지. 곧이어 하드웨어 경력을 들면서 우리는 소프트웨어에 주력한다는걸 늘 그래왔듯이(항상 듣는 질문이거든)난 "하드웨어와 소프트웨어가 구분되어진다고 생각하지 않는다. 네트웍을 공부한다고 치면 네트웍만 잘해선 절대 S급이 될 수 없다. 네트웍을 중심으로 컴퓨터 구조도 잘 알아야하고 운영체제 특성도 줄줄꿰고 있어야 하고 프로그램을 잘 짜기 위해선 소프트웨어 공학도 필요하고.. 각 하드웨어가 갖는 특성도 알아야 한다고 생각한다. 지금처럼 학생신분일 경우엔 이런 소위 말하는 외도를 경험해볼 수 있는 가장 좋은 기회라고 생각한다. 나는 학교와 멤버십으로 생활을 이분화해서 학교에선 주력분야인 CS에 주력했고 멤버십에서는 하드웨어에 주력하면서 다방면에 걸쳐 공부할 수 있는 좋은 기회가 되었다. 또한 하드웨어를 해보면서 느낀건데 하드웨어나 소프트웨어나 별반 다르지 않았다. 하드웨어 또한 프로그램을 필수적이며 플랫폼만 PC에서 다른 장비로 바뀐것이지 문제를 해결해나가는 과정은 동일하다. "
그리고 나서 내가 따로 준비한 이력서를 보다가, ALTERA 상장을 보면서 이게뭐냐고 묻더라. 작년에 FPGA설계 대회 나가서 입상했었다고 답했고 내가 만든 작품(역시 PPT한장에 스크린샷을 담았고 구동 동영상을 준비해갔다)을 소개를 하면서 "이 작품은 마이크로 소프트웨어의 My Life Bits, 노키아의 Life Blog같은 서비스를 SoC화 하여 나온 작품으로 카메라에서 담겨지는 이미지 센서와 각종 환경정보를 저장장치에 담아서 나중에 개인 블랙박스처럼 되는것이다"고 설명했지. 그러니깐 이어서 그럼 메모리 때문에 고생을 많이 했네요~ 라고 묻는걸... 이어서 MP3플레이어 설명으로 갔3
"예.. 메모리 및 Sync때문에 고생을 했습니다. 그런데 정말 메모리 때문에 고생한 프로젝트는 이 MP3입니다. (사진을 보여주면서) 이 작품은 인터넷으로 MP3 방송 청취머신입니다. 여기에 쓰인 메모리는 총 32KB였는데(여기서 면접관이 놀램..)이 안에서 TCP스택을 올리고 프로세스 스케쥴링을 하고 버퍼링까지하게됐습니다. 128Kbps로 인코딩된 데이터는 1초 재생을 위해서 약 16KB의 데이터가 필요한데, 이 시스템에서 메모리를 끝까지 쥐어짜면 대략 20KB의 메모리만을 사용할 수 있습니다. 그 안에서 끊김없이 재생하는것이 포인트였습니다."
면접관 : "우리쪽 분야를 지원하게 된 동기가 뭐예요?"
나 : "대학원에 있기 전에 제가 제일 재밌었던 분야가 파일 처리였습니다. 학부 과정에서 10단계의 과제를 수행했는데 처음엔 간단한 검색, 정렬에서 나중엔 삽입 삭제 인덱싱 등 다양한 분야가 나왔는데 정말 재밌었습니다. 지금은 대학원 연구실에서 모바일 기반에서 상황인지 미들웨어를 전공하고 있는데 학부때 흥미를 살려서 Ad-hoc기반에서 파일 시스템에 대해 공부하고 있습니다."
면접관 : "혹시 GFS라고 아세요? 구글 파일 시스템이라고 하는데.."
나 : "글쎄요 처음들어보는데.."
면접관 : "GFS 논문을 찾아서 읽어보시면 도움이 될껍니다. "
나 : "아~ 감사합니다. 안그래도 연구에 어려움이 많아서 논문을 쓰고 나서 리뷰어가 주는 리뷰를 토대로 연구를 진행하고 있었습니다. 감사합니다."고 감사의 표시~
면접관 : "프로젝트를 하면 보통 혼자서 합니까? 아니면 팀을 이루어서 합니까"
나 : "아르바이트의 경우는 혼자서 하는 경우가 많으며 다른 프로젝트는 팀을 이뤄서 진행합니다. 아직 경험이 그렇게 많지 않아서 가장 인원이 많았던 프로젝트는 네명정도였으며 제가 가장 선호하는 팀원은 세명입니다. 가장 컨트럴도 잘되고.. "
파일 시스템 얘기가 나오자... 뭔가 공감이 가는 듯한 눈치였3... 이윽고 그 어렵다던 구글 알고리즘 면접 시작..!!!
그 전에 경험은 많지만 그냥 학교에서 해보는것과 상품화 과제는 완전 다른 세상이라고 생각한다고 했지... 가장 최근에 했던 기술총괄 프로젝트를 얘기 해주면서 막 뭐라 얘기 하고..
면접관 : "저기 그럼말예요. 7자리 숫자를 갖는 전화번호 데이터가 있다고 칩시다. 그럼 1000000 ~ 9999999 까지의 숫자가 있을 수 있는데 이걸 가장쉽게 소트를 하려면 어떻게 해야겠습니까.."
그냥 아무 정렬이나 말하는건 한국식 대답이고... 정렬 알고리즘을 사용하게 된 이유도 말해줘야 한다.
나 : "자리수가 동일한 경우라면 래딕스 소트가 가장 적합할 것 같습니다. 최하위 비트를 검사하여 0 과 1을 분리 하고- 이 경우는 Insertion소트가 가장 적합하겠습니다- 상위 비트까지 쭉 나열하면 검색이 됩니다."
대충 맞다는 눈치인듯..
면접관 : "자 그럼 말이예요. 이 중에서 100만개의 데이터를 뽑아냈을 경우 대략 4메가의 용량이 필요합니다. 이를 2MB밖에 사용할 수 없는 머신에서 검색을 한다면 어떻게 하겠어요?"
파일처리 시간에 머지소트를 써서 비슷하게 해봤다.
나 : "비슷한 고민을 해본적이 있는데 당시에는 2MB를 풀로 쓸 순 없을테니 1MB씩 파일에서 뽑아서 메모리에서 정렬한 후 디스크에 쓰고 이 작업을 4회 반복하여 총 4개의 파일을 생성한 후 각 파일에서 가장 위엣놈만 뽑아서 머지 소트를 하여 아웃풋 파일에 기록하면 됩니다." 라고 자신있게 말했다.
그러나 면접관은 얼굴을 찌푸리며.. 이 방법이 일반적이긴 한데 이렇게 되면 읽어오면서 100만번 파일에 나눠서 쓰면서 100만번 아웃풋 파일에 쓰면서 100만번 총 300만번.. 3*O(n)의 시간이 걸리네요. 더 효율적인 방법은 없을까요? 라고 하더라. 그러면서 힌트를 주는데 전화번호 데이터는 유니크 하며 데이터는 7자리로 고정되어있다는것에 착안을 하세요.
한참 생각후에 답을 얘기 했다.
나 : "흠.. 100만비트의 데이터를 준비한 후에 파일에서 하나씩 읽어서 그 위치에 해당하는 비트를 마스크 씌우면 한번의 Access로 해결이 될 것 같습니다." 라고답변하자 이제야 맞다는 눈치.
면접관 : "예~ 맞습니다. 100만비트면 1.2메가 정도의 메모리를 잡아먹으며 나머지 0.8메가는 남는공간이니 거기에 파일을 좀 갖고 있으면 됩니다."
휴~~ 하고 다음으로 넘어감....
면접관은 갑자기 칠판에 문제를 쓰기 시작하더라. 그 말로만 듣던 칠판에 코드 써서 검사한다는 그 면접.. ㅠ.ㅠ
칠판에 이렇게 썼어.
7 8 9 10 11 13 1 2 4 5 6
int find(const char * arr, int size, int v)
{
}
의 배열이 있습니다. 원랜 정렬된 배열인데 Circular Array처럼 되어있어서 한쪽이 끊어진 형태를 갖고 있다. 여기서 어떤 수가 있는지 검색할 수 있는 가장 효율적인방법을 찾아보는 문제였다.
나 : "정렬된 데이터니깐 Insertion Sort후에 바이너리 서치를 하는것이 좋을 것 같습니다."
라고 말한 직후에
나 : "아.. 아닙니다. 이 경우 정렬에 n 검사에 log(n)이 필요한데 그러면 그냥 Sequential서치가 나을 것 같군요.."
다들 생각해봐..어 덯게 할지... ㅋㅋㅋㅋ
잠시후에
나 : "이렇게 하면 되겠습니다. 배열의 중간 지점을 잡은후에 0번 데이터와 마지막 데이터를 비교하여 연속된 부분과 연속되지 않은 부분을 판별하여 연속된 부분에 대해선 바이너리 서치를 수행하고 연속되지 않은 부분은 다시 재귀 호출을 이용합니다 "
면접관 : "그럼 코드를 작성해보세요"
속으로 무슨 올드&뉴 찍는 기분이 들었다.
칠판에 코드를 손으로 쓰기 시작..
int pivot = size / 2;
if(size == 1)
{
if(arr[o] == v)
return 1;
else
return 0;
}
if(arr[pivot] > arr[0])
{
if(bsearch(arr, size, v))
return 1;
else
find(&arr[pivot + 1], size/2, v);
}
else
{
if(bsearch(&arr[pivot + 1], size/2, v))
return 1;
else
find(arr, size/2, v);
}
요렇게 썼다. 그랬더니 면접관 대답은 않고 노트북에 막 쓰기 시작한다. 나 중간에 뻘쭘해져서..
나 : "저~~ 정답은 뭔가요?"
면접관 : "맞췄습니다..."
나 : "아~~"
면접관 : "이걸 받아적어야 합니다."
나 : "개발세발 적었는데 괜찮아요?"
면접관 : "괜찮습니다. "
나 : "오래만에 머리란걸 썼더니 꽤 힘드네요.. ㅜ.ㅜ "
면접관 : "역시 경험이 많은 분이네요. 여러명에게 테스트를 해봤는데 학교에서 공부만 했던 사람은 손도 못대고 그냥 집에 갔었거든요."
면접관 : 뭐 물어보고 싶은거 있어요?
그래서 궁금했던거 몇가지 물어봤다. 이 면접을 통과하면 몇 단계를 더 거쳐야 하는지.. 그리고 영어인터뷰를 준비해야 하는지.. 구글 로고가 찍힌 명함 한장 달라고 말했고.. ^^;
몇가지 얘길 들었는데
1. 구글은 절대 외주를 안준다. 심지어 도서관 책 복사하는 로봇의 경우도 구글에서 처음부터 만들었다. 웹서버의 경우도 구글에서 메인보드 디자인부터 운영체제 까지 전부 만들었다.
2. 구글은 직급이 없다. 소프트웨어 엔지니어는 99.9%가 모두 직함이소프트웨어 엔지니어다. 그래서 다들 누구누구님도 아닌 이름을 부른다.
3. 한국엔 R&D센터가 있는게 아니며 현재는 세일즈 오피스만이 있다.
명함한장 받고 돌아왔지.. 느낌은 그럭저럭 좋았고..
대다나다......