회사 인터뷰를 보자. 개발자의 경우 하루정도 인터뷰 한다. 한국에서는 여러 명의 면접관이 한 명의 지원자를 앉혀 놓고 여러가지 질문을 하며 동시에 관찰을 한다.

미국은 일대일로 면접을 진행한다. 지원자로서는 한국에서는 한 시간 정도의 인터뷰만 잘 넘기면 된다. 미국은 그게 안된다

중략

인터뷰의 핵심은 문제 해결 능력이다. 문제를 전개하고 정의하고 협의하고 풀어나가는 능력이다.
한국에서 개인적으로 인터뷰할 기회가 생기면

"숫자 3개를 정렬" 하는 문제를 낸다.

아무 질문없이 문제를 그대로 풀어오면 빵점이다. 문제 자체를 정의하지도 않은 상태에서 자기 멋대로 풀어온 것이다. 이런 스타일의 개발자는 회사에서 가장 큰 문제아다.

지원자가 문제를 미리 알고 있다고 해도 아무 상관 없다. 어차피 일 년 동안 풀어도 못푸는 문제이기 때문이다. 지금까지 이 문제에서 필자의 기준에 합격한 국내 개발자는 거의 없었다. 어차피 국내에서는 실리콘밸리 수준의 문제 해결 능력을 가지고 있기가 어렵기 때문에 기대하지도 않는다. 기준에 모자라더라도 그 중에서 상대적으로 나은 개발자를 뽑을 수 밖에 없다. 이 문제를 풀 때 프로그래밍 언어는 상관하지 않는다. 시험에서 연필로 쓰나 볼펜으로 쓰나 상관하지 않는 것이나 같다. 언어 프로그래밍 능력은 금방 배울 수 있는 것이기 때문이다. 객체지향을 이해하는 것이 중요한 것이지 C++이나 Java 같은 언어를 잘 알아야 하는 것은 아니다.



먼저 국내 개발자들의 예를 보자.
그냥 3개 숫자 정렬하는 소스코드를 막 쓰기 시작한다.
물론 자기가 가장 자신있는 프로그래밍 언어를 사용한다. 나를 어떻게 생각하는 지 모르겠는데 내가 그걸 몰라서 풀어보라고 할 리는 없다. 즉 물어보는 사람의 의도를 파악해 보려는 생각은 하지도 않고 늘 정해진 문제를 풀 듯이 그냥 알고리듬 생각해 내기에 바쁘다. 숫자 3개 정렬하는 알고리듬이 복잡해야 얼마나 복잡하겠는가? 삼척동자도 다 아는 것이다. 바로 국내 교육의 병폐가 여기서 확연히 드러나는 것이다. 필자는 국내 회사에 가서 개발자들과 일을 할 때도 이런 문제가 보통 심각한 문제가 아니라는 것을 느낀다.

문제를 해결하기 위해 필요한 전제조건이 문제를 찾아내고 정확히 정의하는 능력이다. 이 능력은 학원가서 배울 수 있는 것도 아니고 주입식 위주의 교육 환경에서 쌓여온 무의식의 축적이기 때문에 장기적인 교육환경의 변화를 필요로 한다. 하여튼 국내 교육의 결과로 그런 능력은 없다 치고 알고리듬이라도 제대로 쓰면 가장 기본적인 논리력은 인정해 준다. 그런데 이것도 헤매지 않고 적어내는 사람도 많지 않다.

필자가 풀라고 한 "3개 숫자의 정렬"이란 문장으로서 문제가 확실히 정의되었다고 보는가? 아직도 그렇게 생각한다면 국내 소프트웨어 업계가 성숙하지 않았다는 구체적인 증거이다. 그럼 실리콘밸리의 회사의 인터뷰에서 벌어지는 대화를 시뮬레이션 해보자.


면접관: 숫자 3개 정렬하는 문제를 풀어보세요
지원자: 숫자 3개만 정렬할 것인가요? 4개, 5개, 혹은 많은 숫자를 정렬할 필요가 있나요?
면접관: 나중에는 숫자가 늘어날 겁니다.
지원자: 오름차 순, 내림차 순을 선택할 필요가 있나요?
면접관: 예
지원자: 숫자가 정수인가요, 실수인가요?
면점관: 두 가지를 다 사용합니다.
지원자: 정수일 경우 최대와 최소범위가 무엇인지요?
면접관: 최대가 큽니다. 30자리 숫자 입니다. 최고는 마이너스로 10자리 정도 됩니다.
지원자: 실수일 경우는 어떤가요?
면접관: 소수점 이하 20자리 까지 정확해야 합니다.
지원자: 이 프로그램이 독립적인 프로그램인가요? Function으로 제공해야 합니까?
면접자: 둘 다 필요합니다.
지원자: 어떤 응용프로그램이 사용하려고 하는 건가요?
면접관: 우주 관제 센터에서 사용할 것입니다.
지원자: 이 프로그램을 사용할 운영환경이 무엇입니까?
면접자: IBM 메인프레임 입니다.
지원자: 이 프로그램을 얼마나 자주 호출합니까?
면접자: 1초에 1억번 정도 호출됩니다.
지원자: 속도 때문에 소숫점 20자리를 계산하기는 불가능 할 것 같습니다.
면접자: 메모리는 충분히 늘릴 수 있으니까 어떤 알고리듬을 써야 속도가 가장 빠를까요?
지원자: 일단은 O(N log N) 인 알고리듬이 빠르겠지만 정렬해야 하는 숫자가 천 개, 만 개가 될 것이 아니라면 별 차이는 없으니까 중요한 것은 Function을 부를 때 숫자가 30자리나 되니까 parameter로 넘기지 말고 pointer로 넘기거나 Global 변수로 접근 하는 것이 어떨까요?
면접관: 그렇게 하면 객체지형적인 측면에서 어떤 문제가 있을까요?
.............



지금까지 보았지만 이 문제 정의는 아직 끝나려면 멀었다. 이런 대화가 1시간을 진행된다고 생각해 보자. 지원자가 가지고 있는 모든 지식이 나타난다. 국내 개발자들에게 풀라고 하면 그냥 답 적어내겠다고 하는 것과는 워낙 접근 방법이 다르니 비교할 수 조차 없다. 이런 인터뷰를 여러 명하고 하루 종일 하면 실력이 다 드러난다. 다른 면접관하고 얘기를 하면 또 완전히 다른 방향으로 간다. 그래서 문제를 안다고 해도 미리 공부해 갈 수도 없다. 사실은 대화 중에 면접관도 많은 것을 배운다. 지원자에게 많이 배울수록 감동받고 "저 사람은 꼭 고용해야 합니다" 라는 평가서를 적을 것이다. 이런 상호존중이 바로 회사에서 가장 중요한 것이다. 그룹으로 협업하면서 문제를 해결하는 능력인 것이다. 실리콘밸리의 개발자들은 이런 식의 사고방식이 익숙해져 있기 때문에 추상적인 문제가 주어져도 협업하면서 구체적으로 정의하며 문제를 해결해 나간다. 어차피 벼락치기 한다고 인터뷰 준비가 될 것도 아니기 때문에 평소 실력으로 편안하게 인터뷰에 임하면 된다.



이런 인터뷰 과정을 거쳐 입사를 하게 되면 한국 회사에서는 상상도 하지 못할 일이 다음날 벌어진다. 실제 업무를 하는 것이다. 교육은 없다. 필자가 대학 졸업 때부터 많은 미국 회사를 다녔지만 교육을 시킨 회사는 하나도 없었다. 그 다음날 부터 일을 시키는 것이다. 문제 해결 능력이 있는 사람들을 뽑았다면 당연히 자기가 해결해야 할 문제를 발견하고 정의하고 해결할 수가 있어야 한다. 물론 그러기 위한 기본적인 기반시스템은 갖추고 있어야 하는 것은 회사의 책임이다. 국내회사는 이런 기본 시스템도 갖추고 있지 않은 것이 산 넘어 산이다. 또 다른 방대한 주제이므로 여기서는 넘어간다. 그래서 국내 소프트웨어 개발자들의 화려한 이력서가 아무런 의미가 없다. 사상누각인 것이다. 대부분의 이력서에는 많은 프로그래밍 언어, 플랫폼, 방법론, UML같은 도구를 자랑스럽게 적어 놓는다. 미국 회사 인터뷰때는 그런 것은 별로 보지도 않는다. 다 보조적인 도구에 불과한 것 뿐이다


- dc official App