2016년 2월 12일 금요일

쥬니어 개발자의 해외 취업 준비 #9 Highfive 편

역시나 오늘도 따사로운 햇살이 내리쬐는 맑은 날이다. 캘리포니아는 인터뷰를 보기에 최고의 장소이다.

감기도 안걸리고 적당한 온도와 값싸고 질좋은 과일을 마음껏 먹을 수 있다.

뻥 안치고 여기에 와서 먹은 과일의 양이 작년 한해동안 한국에서 먹은 과일 보다 많다.

맑은 날씨, 과일이 풍부한 젖과 꿀이 흐르는 이 도시에
난 회사도 때려쳤고.. 매일 매일 최상의 컨디션을 유지하고 있다.


오늘은 Highfive Technologies (이하 하이파이브)라는 스타트업과의 온라인 테크 인터뷰가 잡혀 있다. 하이파이브는 온라인 컨퍼런스 콜(화상 회의) 서비스를 제공하는 업체로 PC, 모바일 뿐만 아니라 자체 디바이스도 판매하는 듯 했다.




약속한 시간이 되자 전화가 울리고 나는 전화를 받았다.


어, 헤 헬로우? 승화 쏭? 아임 에릭.

하이! 예스 디스이스 승화. 나이스 투 톡투유! (처음에 굉장히 반갑고 밝은 톤으로 인사하는게 좋다)

하.. 하이~ 예~ 어.. 예 나이스 투 톡투유. 하우아유?




(왠걸, 이 인터뷰어는 나보다 더 긴장을 한 거 같다?  왠지 완전 Native는 아닌거 같았다. 그래도 이내 평정심을 찾고 유창하게 인터뷰를 이끌어 나갔다.)


에릭은 리크루터가 알려준 대로 컨퍼런스 콜 앱을 실행하자고 했다.
처음 카산드라라는 리크루터가 나에게 인터뷰 날과 Highfive App을 설치 방법을 메일로 알려줬었다. 메일에는 분명 Guest라는 버튼이 있다고 했는데 아무리 찾아도 그런 버튼이 없었다.
그래서 나와 에릭은 처음에 조금 헤메다가 내가 혹시나 해서 그 위에 있는 임시 아이디를 직접 입력하자 에릭의 얼굴이 보였다.


우린 갑자기 서로의 얼굴이 보이자 어색하게 활짝 웃었다.


예~ 나 니얼굴 보인다. 나 이런 인터뷰는 한번도 해본적 없었는데, 어썸(awesome) 한데?

응~ 그래 이게 우리 솔루션이고 이걸로 인터뷰를 하고 싶었어.

멋지다!


처음 통화를 했을 때 살짝 긴장한 듯했던 에릭은 역시나, 굉장히 젊은 나이의 Asian 이었다.
30대 후반~40대 정도?


처음부터 에릭은 회사 설명을 신나게 하기 시작했다.

우리는 비디오 컨퍼런스 콜 서비스를 제공하는 회사고, 이런 랩탑 말고도 모바일 폰으로도 서비스도 하고. (제품을 보여주며) 이런 제품들도 만들어서 판다.

그러면서 자신의 노트북을 놀려서 TV위의 디바이스를 보여줬다. 자신의 노트북 화면을 그 제품으로 바꾸자 회의실 내부와 에릭의 전신이 보였다.

에릭은 회사의 문화와 자기의 팀에 대해서도 설명했다. 우리는 아주 작은 팀 단위이고 굉장히 신속하게 움직이며, 새로운 프로젝트에 유연하게 대처한다는 등등..


나에게는 인터뷰어가 인터뷰이에게 열심히 회사 솔루션과 회사 문화를 설명을 하는 모습이 굉장히 인상적이었다.  

인터뷰가 전혀 단방향으로 질문을 하고 대답을 하는 자리가 아니라 인터뷰어와 인터뷰이가 서로를 판단하는 자리라는 인상을 받았다.

인터뷰어가 인터뷰이를 선택할 수도 있지만 반대로 인터뷰이도 인터뷰어(회사)를 선택할 수 있다. (오퍼를 주고 싶어도 다른 회사 가버리면 회사는 다른 인재를 찾아야 한다)


그래서 이렇게 열심히 회사를 홍보하는 것이다. 인터뷰 자체가 구직자에게 보여지는 회사의 첫 인상이기 때문이다. (사실 수많은 인재들이 구글이나 페이스북 같은 좋은 직장으로 가려고 하기 때문에, 이곳 스타트업들도 인재를 구하기 힘들긴 하다.)




내가 한국에서 다 망해가는  팹리스 회사에 인터뷰를 한 적이 있었는데, 인터뷰 도중에 임원 한명이 나에게 왜 회사를 2년도 안 다니고 옮기려고 하느냐? 라고 물었다.
그래서 나는 항상 이쪽 분야에 관심이 있었고, 새로운 시도를 하는 것이 좋다고 답변 하였다.

그때 그 임원이 똥씹은 표정으로 하던 말을 잊을 수가 없다.
"그래? 또 한 1~2년 뒤에 회사 옮길거 같은데?"

(뭐여? 내가 2년 정도 일하고 옮기면 안되는 이유라도 있니?)
나는 뭐 자아를 찾기 위한 노력으로 봐달라느니 하는 오글 거리는 대답으로 응수하며 구렁이 같은 인터뷰어를 향해 담 넘어가듯 대답하긴 했지만, 인터뷰 내내 상당히 찝찝했다. 그런 질문 할 시간에 내가 갖고 있는 스킬이나 백그라운드 체크라도 더 하는게 낫지 않았을까?
압박 면접 이랍시고 그렇게 비생산적인 질문을 하는 임원이 이해가 가지 않았다.

그 회사에서 합격 소식을 받았고, 프로젝트가 급하니 3주 이내로 와줄 수 없겠냐는 급한 요청도 받았지만, 나는 가지 않았다.

소개팅에서 "너 왠지 나랑 오래 사귈거 같지 않은데?" 라고 말해 놓고 자기 외로우니까 3주내로 사귈지 말지 대답해 달라고 하면 너랑 만나겠니...


그리고 나에게 그 회사는 가면 안되는 회사로 인식이 굳어졌다.
그리고 주위 사람들에게 열심히 홍보(?) 해 주었다.
그 회사는 앞으로도 괜찮은 엔지니어 구하기 힘들지 싶다.


우리 나라는 회사들 기준으로 모든 것이 평가된다.
근로자는 경력 관리를 잘 해야 하고, 회사에 잘 보여야 하고, 면접에서도 이력서에 빵꾸(백수 시절)가 나면 불리하다. 한번 평판이 안좋아 지면 재 취업이 불리하다는 소리도 있다.
연봉 협상을 할 때는 항상 회사가 유리한 위치에 있고 근로자는 끌려다니는 입장이라고 생각하기 쉽다.

하지만 내 생각은 다르다.

반대로 근로자들 입장에서도 좋은 회사 나쁜 회사에 대한 평가를 한다. 한번 잘못 입소문이 나면 그 회사는 좋은 인력을 채용할 수 없다.
회사와 근로자는 계약서로 맺어진 완전히 평등한 관계 이여야 하고 그러한 관계이다.
회사는 근로자를 자를 권리가 있지만 근로자도 회사를 그만둘 권리가 있다.
절대로 한쪽이 일방적으로 권력을 휘두를 수 있는 갑을 관계가 아니라는 거다.
그런데 한국에서는 이러한 기본적인 문화가 정착되지 못하고 있다.

이곳 캘리포니아에서는 법적으로 그것이 명확하게 규정되어 있다. 그래서 (조금 비인간적인 것 같지만) 회사는 다음날 부터 나오지 말라고 통보할 수도 있다. 대신 근로자도 다음날부터 그만 나오고 싶다고 통보할 수 있다.

적어도 실리콘 밸리는 법적으로는 고용주 피고용주에게 동등한 권리를 보장하고 있다.



다시 인터뷰로 돌아와서..


첫 질문.

스티브, 너는 왜 새로운 일을 하려고 하고, 너가 찾는 새로운 기회는 뭐야?

응, 나는 주로 비디오/오디오를 다루는 디바이스를 만드는 소프트웨어 엔지니어 경력이 있는데, 예전에 일하던 회사는 영상 보안 제조사였어. 거기서 많은 것들을 배웠지만 보안 업계가 조금 보수 적이고 재미가 없지. 그래서 내 기술을 이용해서 뭔가 새롭고 Fun한 것들을 만들고 싶었어.

좋아~ 그렇구나. 예전 회사에서 주로 하던 일들이 뭐야?

주로 임베디드 소프트웨어 어플리케이션을 개발했지. 코어 라이브러리 팀이 비디오 스트리밍을 비롯한 핵심 라이브러리를 개발했지만, 난 그 라이브러리를 이용해서 디바이스 위에 안정적으로 돌아가는 어플리케이션 소프트웨어를 설계하고 개발하고 유지보수 하는 일을 했어. 시스템 소프트웨어와 하드웨어 이슈들도 같이 신경 써야 했고, 커널과 디바이스 드라이버들도 만졌지. 그러니까 SoC 위에 돌아가는 소프트웨어 스택을 전부 책임졌어. 주로  QA팀과 협력하며 버그를 수정하고 세일즈와 고객의 요구사항을 듣고 기능을 추가하기도 했지.


굿, 너가 가장 자신있는 프로그래밍 언어는 뭐야?

머, C/C++ 지. 파이썬도 조금 다룰줄 알고 자바도 하지만 그래도 대부분의 경력이 C/C++ 야.

하하, 나도 그래. 우리같은 사람들은 아무래도 그게 짱이지. 좋아 이번엔 너의 기술적인 의견을 물어볼게.
너가 만약에 카메라를 내장한 어떤 디바이스를 만든다고 하면 어떤 SoC를 선택할거야?

SoC? 흠... 어려운 질문인데, 질문도 이해가 잘 안가고. 나는 이기종 코어로 구현된 SoC 를 쓸거 같아. 어플리케이션 개발에 용이한 범용 OS도 있고 카메라나 하드웨어 코덱을 제어할 수 있는 DSP 나 서브 프로세서들도 있는게 좋을거 같고.

음, 질문을 조금 다르게 해볼게 SoC 를 선택할 때 어떤게 중요한거 같아?

아... 글쎄 나는 소프트웨어 개발 환경이 잘 되어 있는게 중요한거 같아. 물론 성능과 가격도 굉장히 중요하지. 하지만 SDK 같은게 잘 지원이 안되면 개발이 아주 힘들거든..
예전에 있던 회사에서 두 종류의 칩을 사용했는데, 첫번째 칩을 사용할 때, 물론 그 당시엔 가격과 성능이 괜찮았었지만, 벤더가 제대로 된 서포트를 안해줬어. 그래서 커널이나 디바이스 드라이버에 버그도 많았고, 나중에 굉장히 고생했지.
그래서 나는 소프트웨어 개발 환경이 잘 지원되는지가 중요하다고 생각해.

좋아. 만약 운영체제를 선택하면 뭘 사용할거야?

음, 글쎄 물론 리눅스 같은 범용 OS를 사용하면 나는 참 해피하겠지. 개발 환경도 좋고 다양한 오픈 라이브러리도 지원되고. 하지만 나는 RTOS를 선호해. 최근의 RTOS들도 개발 환경이 상당히 좋아졌고, wifi나 카메라 같은 하드웨어 디바이스 드라이버도 잘 지원되지. 가벼운 크기에 강력한 멀티 태스킹 성능이 제공되기 때문에 내 마음대로 태스크 설계를 할 수 있고 아주 작고 가볍고 성능이 좋게 만들수 있어. 난 Non-OS firmware 프로그래밍을 별로 좋아하진 않아.


그렇구나! 좋아 알겠어. 자 이제 코딩 문제를 풀거야. 카산드라가 너한테 링크를 줬지?
링크드 리스트를 구현해봐. 물론 우린 잘 쓸일이 없지만 이건 너의 프로그래밍 능력을 보고 싶어서 그래. 그걸 직접 구현해서, 링크드 리스트의 노드들이 정렬이 되어 있는지 확인하는 API 를 설계하고 구현해줘.

우리는 https://coderpad.io/ 라는 서비스를 사용했다.
최근에 웹 브라우저에 두 클라이언트가 접속해서 동시에 코드를 작성할 수 있는 협업 코딩 서비스 들이 굉장히 많다. 대부분의 코딩 시험은 이걸로 진행이 된다. 선호하는 언어를 선택 하면 자동으로 코드 포맷도 맞춰주고 자동 들여쓰기도 되고, 내 코드를 상대방이 실시간으로 볼 수 있다. 이 서비스는 C++ 코드를 직접 브라우저에서 돌려볼 수도 있다..  서버에서 컴파일 해서 실행 결과를 웹 브라우저에 띄워주나 보다.. 어메이징!

실제 코딩 화면



자, 좋아 돌려볼래?

약간의 문법 오류. 바로 수정후... 결과가 나왔다! (후후) 그리고 코드 설명..



(내가 짠 코드는 아래와 같다.)



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;


class LinkedList {
public:
  LinkedList(int init) : var(init), next(0) {}
  int getVar(){ return var; }
  LinkedList *getNext() { return next; }
  void setNext(LinkedList *next) { this->next = next; }
private:
  int var; // 4 bytes
  LinkedList *next; // 4 bytes
  //
public:  
  bool isSorted(LinkedList *node){ // 1 parameter(4 byte). 
    if(!node) return true; //end of list. it makes sense
    if(this->getVar() < node->getVar()){ //this : a.  node : a.next
      //no problem
      return node->isSorted(node->getNext());
    }
    else{
      //not sorted
      return false;
    }
  }
  
};


// To execute C++, please define "int main()"
int main() {
  //define MAX;
  LinkedList c(3);
  LinkedList b(2); 
  LinkedList a(1); 
  a.setNext(&c);
  c.setNext(&b);
  
  bool isSorted = a.isSorted(a.getNext());
  
  cout << isSorted;
  
  return 0;
}


굿~ 잘했어. 왜 이 코드를 만들때 클래스를 썼는지 설명해 볼래?

응, 링크드 리스트의 각 노드들은 같은 값을 갖고 같은 할 일을 하기 때문에 노드를 클래스로 디자인 해서 각 객체를 표현하기 쉽게 하려고 했어.

음, 좋아. 그럼 이 코드의 문제점.. 아니 이걸 더 효율적으로 만드려면 뭘 해야 할까? 코드를 수정할 필요는 없어. 설명으로 해줘. 예를 들면 우리는 이 코드가 돌아가는 환경이 굉장히 제약 적이라고 가정해 보자. 임베디드 시스템 처럼.

어.. 음 내가 재귀 함수 호출을 이용했는데 사실 그건 호출 될 때 마다 스택에 자꾸 메모리가 올라가서 굉장히 자원 낭비가 심하지.. 사실, 이걸 루프를 돌면서 iterative하게 짰으면 좋았을 거 같아.

오케이 알았어. 자, 이젠 니 코드를 조금 더 객체지향에 좀 더 맞게 수정을 해봐.
(사실 난 처음에 코드를 빨리 짜기 위해 모든 멤버 변수를  public으로 선언하고 직접 접근 했었다)

응, 사실 내가 코드를 간단하게 짜려고 이렇게 했는데.. var 이나 next  포인터들은 사실 encapsulation 이 필요하지. 누군가가 포인터에 직접 접근해서 값을 바꾸면 위험하니까.
(아마 내가 클래스 디자인 할 때 멤버변수를 public으로 선언하는걸 보고 코딩 스타일이 의심스러웠나 보다.)
자, var과 next를 private으로 선언해 주고 그 값을 받아오는 getter함수들을 선언했어. 이제 됐지?


굿.. 그럼 이 코드를 테스트 한다고 할 때 테스트 케이스 커버리지는 어떻게 정해야 할까?

엥, 무슨 소린지 잘 이해가 안가는데... 테스트 케이스 커버리지? 음... 생각을 해보자. 그러니까 이 코드는 재귀 호출을 사용 했고 각 객체는 값과 포인터를 저장하는 변수가 4byte씩 차지를 하지.. 재귀 호출을 할 때마다 포인터 변수가 파라미터로 넘어가니깐 스택에는 매번 12byte를 차지할거야. 하지만 그것 말고도 함수가 스택에 올라갈 때 필요한 각종 세그먼트들, 뭐 잘 기억은 안나는데 아무튼 그런 것들 까지 고려해서 스택 사이즈를 고려해야 할거 같아.
그러면 우리가 한정된 자원에서 이 링크드 리스트를 테스트 할 때 최대 얼마나 많은 노드를 테스트 할 수 있는지 추측할 수 있을거 같아.

좋아. 잘 대답했어. 뭐 테스트를 위한 코드는 작성하지 않아도 돼. 내 생각엔 너가 핵심적인 이야기들은 다 한거 같아.
우리 이제 인터뷰가 끝난거 같고.. 뭐 더 질문할 거 있니?

응, 너네 제품 해외에도 많이 파니?

아직은 북미지역에 집중하고 있어. 그리고 유럽도 약간.. 하지만 몇몇 유저들은 직접 해외에서 구매를 해서 쓰더라고. 그리고 물론 우린 나중에 아시아를 포함한 다른 대륙으로도 확장할거야.


그렇구나~ 이 컨퍼런스 콜은 최대 몇명까지 비디오 채팅을 지원해?

15명까지는 돼. 구글 행아웃 같은건 4명 정도가 한계이고 비디오 퀄리티도 굉장히 낮아지지. 하지만 우린 더 좋은 성능을 보장한다.

나이스 한데? 그래, 이건 굉장히 중요한 질문인데 언제 답변을 들을수 있니?

(웃음) 우리는 채용 프로세스가 굉장히 빨라 아마 a couple of days ? 리크루터가 너에게 연락해 줄거야.

그래 알았어 고마워.

그래 스티브, 너랑 이야기해서 참 즐거웠어. 바이

바이



채팅이 종료된 직후 하이파이브 앱.
인터뷰가 끝나고 지쳤다..



스타트업이라 그런가? 하이파이브와의 면접은 굉장히 즐거웠다.
인터뷰가 아니라 친구와 이야기 하는 그런 느낌적인 느낌? (상대방이 젊은 남자 동양인이라 그런가..ㅋㅋㅋ 중국인일 것이다.)
다른 대기업들 보다도 이런 회사에서 일을 하고 싶다는 생각이 들게 하는 인터뷰였다.







여기서 끝이 아니었다.

이제 점심을 먹고, 2차전을 준비해야 한다.

당장 1시부터 Fitbit 에서 인터뷰 전화가 오기로 했기 때문이다.
이쯤 되면 내가 참 잘팔리나? 하는 오만가지 생각이 들면서 우쭐해진다.
크큭.. (중2병)



1시에 여유롭게 귀에 이어폰을 꽂고 전화를 기다린다.


전화 벨이 울리고 나는 다시 노트 테이킹을 하며 인터뷰어와 대화를 하기 시작했다.

하이, 스엉 화 쏭? 나이스투 밑유. 하우 아유?

오 하이, 나이스투 밑유 투~ 땡큐 포 콜링미

마이 플레쥬어~ 내가 고맙지. 너 우리 회사에 대해 얼마나 잘 알아?

응? 잘 알지~ 나 핏빗 쓰고 있어! 그걸로 매일 운동할때 심박수도 재고 매일 기록하면서 아주 잘 쓰고 있다? (사실 한국에서는 잘 쓰는데 미국엔 갖고오지 않았다..)

음 그렇구나, 회사 자체에 대해서는 잘 모르고?

응.. 어.. 그냥 고객으로서 제품만 알어.

그래 그럼 설명을 해줄게(굳이 회사 소개를 하고싶었나 보다..).. 우린 회사 설립한지 8년됐고, 작년 팔월에 IPO (기업 공개) 했고, 샌프란시스코에 본사가 있어.
근데 말야 스엉화, 나 참 놀란게 너 보스턴.. relocation ..... blar blar.. .

왓? 질문이 이해가 안가는데.. 파든?  무슨 소리야 나 보스턴 안사는데..

아니 아니, 너 보스턴에 지원했잖아. 샌프란시스코에 있는데 보스턴에 지원한게 놀랍다구..

엥.. 내.. 내가 보스톤에 지원했니?

응... 아니야?

어.. 미안 나 샌프란시스코 헤드쿼터에 지원한줄 알았는데.. 미안...

어 괜찮아. 알았어~


왜 항상 두번째 인터뷰는 다 엉망일까?
허탈하다.. Fitbit이 보스턴에도 있는줄 몰랐네... 지원할 때 잘 보고 해야겠다.
어쩐지 연락이 빨리 오더라.