목요일, 12월 29, 2011

구글이 프로그래머를 뽑는 법…



Source:
http://zublog.wordpress.com/2011/12/29/%EA%B5%AC%EA%B8%80%EC%9D%B4-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EB%A5%BC-%EB%BD%91%EB%8A%94-%EB%B2%95/

구글이 프로그래머를 뽑는 법…
Posted on 12월 29, 2011
입사하기 전 인터뷰(면접)를 할 때부터 구글은 뭔가 다른 회사라는 것을 알 수 있었습니다. 10년 쯤 전이긴 하지만, 삼성에서 면접을 본 경험이 있었는데 구글의 인터뷰는 이와는 전혀 다른 경험이었습니다. 구글은 들어가기 전부터도 벌써 사람을 정말 공들여 뽑고 잘 키우는 회사라는 생각을 들게 만들었습니다.

[구글이 원하는 인재]

1. 우선 구글은 skillset (기술) 보다는 problem solving ability (문제해결능력)에 더 중점을 두어 사람을 뽑습니다. 예를 들어 구글의 Irvine 사무실에서는 대부분 Java룰 사용하지만 저는 Java를 전혀 못하는데도 인터뷰를 할 수 있었고 인터뷰할 때에는 C/C++에 대한 면접만 봤습니다. 구글에서는 어차피 프로그램언어나 개별적인 기술들(skillset)은 5년마다 새로 배워야 하는 것들이라 이보다는 한가지 언어라도 확실히 이해하고 있는지, problem solving을 할 수 있는 전산학의 기초를 제대로 가지고 있는 지가 더 중요하다고 봅니다.

2. 구글은 전산학의 기초를 아주 중요하게 봅니다. 따라서 가장 중요한 인터뷰 질문들은 마치 학부의 data structure 과목 시험문제와 같습니다.

3. 구글은 코딩도 아주 중요하게 봅니다. 그런데 얼마나 넓게 아느냐보다는 얼마나 깊게 아느냐를 봅니다. 예를 들어 Java의 API를 많이 알고 있는 것보다는 Object Oriented 언어의 기본적인 개념을 얼마나 잘 이해하고 있는지를 봅니다.

[인터뷰 진행 방식]

1. 서류심사: 구글은 합격률이 1% 미만이라 어쩔 수 없이 서류심사에서 95%이상이 걸러 집니다.

2. HR (인사과) 전화 interview: 처음이자 마지막 non-technical interview로 경력 등에 대한 20분정도의 문답을 합니다. 일반적으로 면접때 많이 물어 보는 ‘왜 우리회사에 입사하느냐’/’10년후의 목표는 무엇이냐’ 등등의 질문들도 거의 없고 주로 어떤 일을 했는지, 어떤 경험을 가졌는지, 어떤 일을 하고 싶은지 등을 묻습니다.

3. 전화 인터뷰: 실제로 구글에서 일하는 Software Engineer가 전화면접을 합니다. 보통 2번 정도 하는데 질문은 자기소개 및 한 일들에 대한 것들은 간단하게만 묻고 이후로는 30분이상 data structure 및 programming에 대한 질문을 합니다. 종이와 연필을 가지고 써 가면서 문제를 풀어 대답해야 합니다. 문제는 보통 이런 식입니다 (google로 google interview questions라고 찾아봐도 예가 나옵니다 ^^):

integer operation으로 log를 구현하려면 어떻게 하는가? 이경우 총 연산의 수는?
두개의 sort된 행렬을 merge하려면 어떻게 하는가? 이 경우 complexity는 어떻게 되는가?
C++ class의 static variable은 어떤 의미가 있고 어떻게 쓰이는가?
그런데 예상문제를 열심히 풀어 보는게 어느 정도 도움은 되지만 대입시험처럼 그걸로 합격할 수 있지는 않습니다. 그 이유는 뒤에…

4. On-site 인터뷰: 직접 구글 사무실에 가서 5시간 정도 인터뷰를 합니다. 중간에 인터뷰에 포함 안되는 점심시간이 있지만, 거의 쉴 새 없이 엄청난 체력전으로 치러 집니다. 모든 인터뷰는 technical한 내용만 합니다. 5명의 면접관이 한 명씩 면접실에 들어와 한 사람당 45분가량 인터뷰를 합니다. 인터뷰 내용은 전화면접과 비슷한데 programming의 기초에 대한 질문들을 간단히 물어 보고는 위의 행렬 merge 같은 문제를 냅니다. 문제를 풀면 제시한 해답의 complexity를 물어 보고는 이를 칠판에다 손으로 써서 구현하라고 합니다.

그런데 인터뷰의 핵심은 사실 정답을 맞추느냐를 보는 것이 아니라 문제를 푸는 과정을 보는 것입니다. 처음부터 잘 define되지 않은 문제를 주어 면접자의 문제를 정의하는 능력을 보고 또 면접자가 헤메고 있으면 면접관이 옆에서 도와 주며 푸는 과정을 보고, 해답을 제시하면 이보다 더 optimal한 방법은 없을지 찾아 보라고 합니다. 사실 정답이 하나가 아닌 문제들이기 때문에 이렇게 intensive하게, interactive하게 인터뷰를 하면 면접자의 실력이 드러날 수 밖에 없습니다.

구글은 사실 잘나가는 회사이기 때문에 구글의 philosophy는 긴가민가하는 사람은 안 뽑는게 낫다입니다. 못하는 사람을 뽑는 것보다는 잘하는 사람을 놓치는 게 낫다는 거죠 (사람을 해고하기 가장 좋은 시기는 채용하기 전이라는 격언도 있습니다 ^^). 하지만(!) 면접에서 한 번 떨어 진다고 하더라도 6개월만 지나면 다시 지원할 수 있도록 기회를 열어 주고 또 다시 지원하기를 권합니다. 저도 사실 인터뷰에서 떨어진 경험이 있습니다 ^^;

제 경험으로는 한국의 회사들이 구글처럼 공들여 사람을 뽑지는 않는 것 같습니다. 구글 수준의 엘리트들을 뽑는 것은 아니더라도 기본적인 data structure에 대한 이해가 있는지를 알아 보는 것은 중요하고 또 눈 앞에서 칠판에다가 코딩을 해 보라고 하는 것 역시 아주 중요합니다. (미국의) 작은 회사에서 인터뷰를 해 본 어떤 사람이 스펙이 꽤 좋은 사람 중에서도 아주 기본적인 수열 문제조차도 제대로 코딩하지 못하는 경우를 많이 봤다고 합니다. 물론 이를 위해서는 면접관의 능력 역시 중요하죠. 그래서 구글에서는 면접관에 대한 training 역시 따로 합니다.

물론 한국의 일반적인 소프트웨어 회사가 구글처럼 잘할 것 같은 사람들을 막 떨어 뜨릴 여유가 있는 건 아닐지 모릅니다. 취직하려는 사람은 일자리가 없다지만 뽑는 사람들은 뽑을 만한 사람이 없다니까요. 그래도 인터뷰를 제대로 하는 것은 중요합니다. 그래야 응시생들이 기초를 공부하려 하겠지요. 그렇지만 사실 사람을 잘 뽑는 것만큼 뽑은 사람을 잘 키우는 것도 중요합니다.

[뽑은 이후...]

구글의 좋은 점은 좋은 사람을 뽑은 후에 이들이 잘 성장할 수 있는 기회를 많이 준다는 것입니다. 프로그래밍에 대한 training도 많고 여러가지 교육의 기회를 줍니다. 또 유명한 80-20을 통해 자신이 하고싶은 일에 20%의 시간을 투자할 수 있게 해 줍니다.

제가 한국에 있는 회사에서 작성한 코드를 한 번 본 적이 있습니다. 그런데 코딩에 대한 회사차원의 체계가 전혀 없었고 프로그래머는 아니었어도 전산과 출신 직원이 작성한 코드였지는 간단한 optimization에 대한 이해도 없이.  지금 학교에서의 coding 교육이 어떤지는 잘 모르지만, 사실 깔끔한 코딩은 회사에서 체계적인 교육 및 시스템으로 뒷바침하지 않으면 나오기가 쉽지 않습니다.

한가지 더, 한국은 코딩에 대한 인식이 낮고 또 모든 분야에서 어느 정도 경력이 쌓이면 관리직으로 물러나거나 시스템 디자인에만 관여하는 것이 일반적이라 (개인적으로는 아주 큰 문제라고 생각합니다) 소프트웨어 회사에서 좋은 코드를 만들기 위한 체계적인 노력이 부족합니다. 한국회사에서보다는 미국회사에서 일반적인 미국회사에서보다는 구글에서 60세된 프로그래머를 더 쉽게 찾아 볼 수 있습니다.

앞으로 회사를 다니며 더 많이 배우겠지만… 사람을 공들여 뽑고 또 뽑은 사람에게 발전의 기회를 제공할 때에, 또 전산학의 기초와 좋은 코딩을 중요하게 생각할 때에 좋은 소프트웨어가 나온다는 생각입니다.



-----
Cheers,
June

월요일, 12월 05, 2011

HTTPS github access (repo with Curl)

HTTPS github access (repo with Curl)

Source: http://stackoverflow.com/questions/3777075/https-github-access

[Problem]
HTTPS github access (repo with Curl)
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:

[Summary] (i chose the way)
just set an environment variable to disable SSL verify.
$ export GIT_SSL_NO_VERIFY=true

that's it.

-----
Cheers,
June