admin write
blogbloglocation loglocation logtag listtag listguest bookguest book
Add to favoritesrss feed

Google Interview

2008/01/25 04:07
아침에 갑자기 옆 자리의 Jian이 자기 오늘 Google Internship 인터뷰가 있다고 전화 좀 써도 되겠느냐고 한다. 상관없다고 했더니 나중에 보니 Speaker phone 해놓고 인터뷰를 진행해서 우연히 인터뷰 진행을 다 들었다.

처음에 자기 누구라고 하고 어떤 질문부터 원하느냐고 물어봤던 거 같다. Jian이 레쥬메에 Logic이 강하다고 썼던지 Logic에 관련해서 물어볼까? 하자 Jian 약간 당황... 특별히 Logic 쪽이 아니라 일반적인 알고리즘에서 어쩌고저쩌고 궁색한 변명...(으로 들림 나한텐) 레쥬메를 쭉 훑으면서 간략히 몇 개 질문하더니

Google: Can you describe your work? 라고 본격적으로 인터뷰에 들어간다.
Jian: 주절주절... Machine Learning... P2P
나: (저 쉐이 나랑 수업들으면서 텀프로젝트 한 거 가지고 지금 박사 첫 주제로 하고 있는데. 문제는 제가 찾고 실제 ML 적용하는 거랑 코딩 핵심 부분은 거의 내가 하고 쩝. 같이 follow up 할래? 할 때 할 걸 그랬나? ㅋㅋ)

대충 한 얘기를 듣고 Jian이 저번에 방문했던 googler 가 자기네 무슨 일이랑 비슷하다고 하면서 구글 뉴스에서 뭐랑 비슷하다고 부가 설명을 붙인다...
나: (음.. 이런 거 괜찮네. 대화가 부드럽군)

그러고는 바로 본격적인 알고리즘 질문에 들어간다.
Google: How would you design an algorithm that reverses a double linked list? 그러면서 Please think out loud so that I can ... 하던데 간단하게 너의 사고 과정을 그대로 따라가 보고 싶다는 거다.
Jian: reverse를 어떻게 정의할래?
얘기를 하는 걸 들어보니 Jian이 흐름을 잘 잡은 것 같다. 그런데 얘기를 하며 발전해가는 과정이 굉장히 자연스럽다. 여러 가지 가정이나 문제에서 정의되지 않은 것들에 대한 얘기부터 시작해서 구체적인 알고리즘까지 발전.

그러고는 각종 에러 케이스나 boundary conditaion, trivial case 등까지 많은 걸 고려한다.
Google: Does it cover every possible case? One of the cases I tried to build on was this. It's truly an error case, but .... 하고는 만약 중간에 어떤 포인터가 어떤 엉뚱한 주소를 가리키고 있다면 어떤 일이 발생하고 그런 경우를 어떻게 처리할 것인가 하고 물어본다.
Jian이 C++ RTTI 관련 이야기를 한다. 내 생각에 여러 라이브러리를 쓰면 pointer validity 테스트를 할 수 있는 매크로나 함수들이 보통 제공되는데 그런 거에 대한 언급이라든지 몇 가지가 더 언급됐으면 더 좋았을 듯한데 잘 얘기하고 끝내는 것 같다.

Google: Do you have any question for me?
Jian: 너 뭐하니?
Google: 자세히는 얘기 못 하고 아주 개략적으로만 얘기해주께.....
Jian Why most of your products are beta?
나: (맞아.. 나도 항상 궁금했었는데)
Google: They are not finished. They are not ready to scale up to the World. For example. gmail can handle millions of users, but not billions of users yet.
Jian: .....
Google: I can't answer the question because HR won't let me.
Jian: How do you evaluate our conversation?
Google: I can't answer the question. The intern coordinator will contact you and give you details.

전체 인터뷰는 한 45분 정도? 여러 가지 이슈들을 잘 풀어내어서 실제 인터뷰는 한 30분 내에 끝났던 거 같고 나머지는 (내가 보기에는) 그냥 잡담 -.-;; 이게 1차고 다른팀에서 2차로 인터뷰를 한 시간 후에 다시 했다.

전에 아래와 같은 인터뷰 관련 동영상을 본 적 있는데 비슷한 것 같다.

Zoe Goldring and Gretchen Ledgard - What is it like to interview at Microsoft? (Video)
Zoe Goldring and Gretchen Ledgard - Riding the Recruiting Shuttle (Video)
Gary Daniels and Evan Goldring - Mock whiteboard problem (Video)

Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/9

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2008/01/25 16:13
    댓글 주소 수정/삭제 댓글
    음. 재미는 있겠는데 정말 장벽은 영어군. ㅡ.ㅡ;;
    영어 공부좀 해야겠다.
  2. 2008/01/26 08:20
    댓글 주소 수정/삭제 댓글
    이런식으로 인터뷰를 하는군.
    최근에 조엘 블로그를 읽으면서 인터뷰관련한 내용을 본적이 있는데...
    거기서 느낀 것을 여기서도 느끼게 되는군...
    내가 인터뷰를 한다면... 대략 난감이랄까...

변수초기화

2008/01/23 14:52

class A {
...
int max_length;
...
void build() {
...
if (length>max_length) max_length=length;
...
}

void check();
};



머리를 벽에 헤딩하고 싶다...

중간 과정에서 어떤 자료 구조의 max_length가 나중에 필요해서 그 걸 만들 때 max_length를 구하게 하는 간단한 코드인데 나중에 check()에서 실제로 자료 구조 다시 돌면서 구한 max length와 죽어라도 안 맞는 것이다. 머냐...어디가 잘못됐지? 꽤 오랜 시간 헤메다 보니 크헐... max_length 가 초기화가 안돼서 생긴 문제였다. check 안에서 체크할 때는 지역 변수로 0으로 초기화하니 올바르게 계산되었고 max_length는 클래스 생성시 나 메쏘드 안에서 초기화를 안해줘서 엄청 큰 쓰레기 값이 들어가서 그 값이 계속 끝까지 남아 있었던 버그... 우후... 내가 죽어야지... 처음 클래스 만들 때 만든 멤버들은 모두 올바르게 초기화를 해줬으면서 중간에 max_length를 추가하면서 그냥 코딩했구나.. Java에서 멤버는 디폴트로 초기화가 0으로 되어서 무의식적으로 그냥 변수만 추가했다고 자위를 해본다.

멤버나 변수 꼭 초기화 합시다!

초기화? 0으로만 하면 되겠지...하고 습관적으로 그렇게 하다가는 큰 코 다친다.

int min_size = 0;
...
min_size = min(size, min_size);

이렇게 초기화를 잘못해줘서 버그 만든 경험도 기억이 난다. 이렇게 구한 min_size값이 대부분 우연히 맞는 값일 경운 나중에 더 골때리게 발견될 것이다. 이거 의외로 만만히 볼 문제가 아니다.

Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/8

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2008/01/25 16:11
    댓글 주소 수정/삭제 댓글
    자위 하지 마라. 너의 덜렁대는 성격이 어디 가겠냐? 자바를 써도 두 번째와 같은 문제를 만들껄? ㅋㅋㅋ

Map class

2008/01/07 07:18
어설픈 C++보다는 Java의 성능이 오히려 뛰어나 전에 놀랐던 기억에 이번 구현할 프로그램에서는 라이브러리 벤치마킹부터 하고 들어가기로 했다. 뭐 한두 시간 안에 해야 할 거니 너무 거창하게 할 순 없고 간단한 Map 클래스 성능 테스트만... 우연히 발견한 Google sparse map과 dense map 클래스, 그리고 STL map 클래스. 한 100,000개 정도의 정수 만 가지고 random build, random probing, 그리고 iteration 으로 대충 테스트 해보았다.

Sparse Map: Insertion TM: 0.09 sec, Search TM: 0.11 sec, Iteration TM: 0 sec
Dense  Map: Insertion TM: 0.03 sec, Search TM: 0.02 sec, Iteration TM: 0.02 sec
STL      Map: Insertion TM: 0.06 sec, Search TM: 0.12 sec, Iteration TM: 0.03 sec
전체 Map iostream으로 save: 0.49 sec
전체 Map C fprintf로 save: 0.11 sec

Sparse map은 매우 memory efficient 하여 한 엔트리당 1`2 bits
Dense map은 빠른 대신 데이터 크기의 2~3배 오버헤드?

google sparse hash distribution의 공식 documentation에 있는 내용과 크게 다르지 않다.
Average over 10000000 iterations

SPARSE_HASH_MAP:
map_grow 665 ns
map_predict/grow 303 ns
map_replace 177 ns
map_fetch 117 ns
map_remove 192 ns
memory used in map_grow 84.3956 Mbytes

DENSE_HASH_MAP:
map_grow 84 ns
map_predict/grow 22 ns
map_replace 18 ns
map_fetch 13 ns
map_remove 23 ns
memory used in map_grow 256.0000 Mbytes

STANDARD HASH_MAP:
map_grow 162 ns
map_predict/grow 107 ns
map_replace 44 ns
map_fetch 22 ns
map_remove 124 ns
memory used in map_grow 204.1643 Mbytes

STANDARD MAP:
map_grow 297 ns
map_predict/grow 282 ns
map_replace 113 ns
map_fetch 113 ns
map_remove 238 ns
memory used in map_grow 236.8081 Mbytes

SGI STL implementaion의 메모리 usage가 dense hash map에 비해
크게 차이 없으므로
전체적인 결과는 일단 dense hash map에 맞춰 구현하되
나중에 다른 구현을 지정할 수 있도록 해야겠다.


Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/4

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

오랜만에 C++ 을 써야 할 거 같아서 이번에 linux에서 좀 더 개발 환경을 잘 셋팅세팅해 볼까 하고 C++이랑 궁합이 잘 맞는 에디터편집기를 조사를 좀 해봤다. 상용이나 여러 플랫폼에서 이용 가능하지 않을 걸 제외하고 나니 대충 남는 게 Vim, Emacs 랑Emacs랑 CDT? 셋팅세팅이 가벼운 걸로 하려고 보니 역시 Vim 인 듯Vim인 듯. 잠시 동안의잠깐의 복습을 통해 보니 역시
  • 마우스에 손을 델 필요가 없는 키보드 별천지의 그 맛
  • linux 환경과의 자연스러운 융화
는 Vi 계열을 따라 올따라올 자가 없는 듯 하다듯하다. 처음엔 WISWYG 계열 에디터편집기를를 오래 쓰던 습관 대로습관대로 커서나 마우스에 자동 손이 가더니 한두 시간 정도의 적응 과정을 거치고 나니 가끔 마우스로 가는 손이 그렇게 무겁게 느껴질 수가 없다. 창 전환 조차도전환조차도 큰 동작처럼 느껴지는 이 게으름의 맛(?)이란! 하지만 고급 기능을 몰라서 인 지몰라서인 지 몇 가지 Eclipse에서 쓰던 기능들이 아쉽다. 뭐 auto completion 기능 같은 것도 내가 사랑하는 기능이기는 하지만 그래. 없어도 뭐. 정말 아쉬운 기능들은
  • refactoring 기능. 예를 들어 변수나 펑션 이름을 바꾼다고 할 때 단순히 텍스트 레벨의 치환이 아닌 context를 인식한 replace 기능은 정말 아쉽다.
  • call hierarchy. 이런 것도 Vim 에서도 찾아 보면찾아보면있을 듯 한데듯한데..
특히 copy & paste, replace 등의 실수로 엄청난 버그들을 숨겨 놓는 경우가 많은 나의 경우엔 Eclipse 리팩토링 기능의 지원은 Vim 의 초간편함을 상쇄하고도 남음이다. 결국 실제 코딩에 들어가서 얼마 안되서 Eclipse C++ plugin인 CDT update... Vim 에도 이런 고급 기능이 지원되는 plugin 어디 없나? 있을 듯도 한데... 쩝.


쓰고나서 맞춤법 검사기를 돌려 봤더니 허걱... NARAINFOTECH 맞춤법 검사기 짱! 우리말 맞춤법 검사 인터넷에서 이렇게 잘 되는 거 처음 봤다. 기념으로 지저분하지만 틀린 맞춤법 표시하는 이 센스 ㅋ

Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/3

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2008/01/04 15:02
    댓글 주소 수정/삭제 댓글
    ㅋㅋㅋ 맞춤법 검사 정말 놀랍지.
    참고로 Eclipse용 Vim Editor plug-in이 있었던 걸로 기억하는데, 약간 돈을 지불해야 했던 것같다. vim을 완벽하게는 지원하지 못해도 화살표키나 마우스 휠로 손이 안가는 것만으로도 상당히 편했던 기억이 있다.

    그리고, vim에선 ctrl-n을 누르면 완벽하진 않지만 나름 auto-complete의 기능을 맛볼 수 있다. 난 typing error를 줄이기 위해 꽤 긴 변수 명이나 클래스 명등은 습관적으로ctrl-n을 누른다.

function pointer tutorial의 첫 단락을 보고 간단한 예제를 만들어 보았습니다.

클래스 A는 fpShout라는 function pointer를 member variable로 가지고 있습니다.

class A{
private:
void (*fpShout)();
public:
A() { fpShout = NULL; };
void setShout(void (*fpFunc)()) { fpShout = fpFunc; };
void Shout()
{
if (fpShout == NULL)
cout << “fpShout is NULL” << endl;
else
fpShout();
};
};

전역으로 ShoutA()와 ShoutB()라는 함수를 선언하고 정의합니다.

void ShoutA() { cout << “A” << endl; };
void ShoutB() { cout << “B” << endl; };

클래스 B는 member variable로 클래스 A를 가지고 있으며  Shout()를 호출하면 자신의 메소드인 ShoutC()를 A에게 세팅하여 A의 Shout()를 호출합니다.

class B
{
private:
static void ShoutC() { cout << “C” << endl; };
A a;
public:
void Shout()
{
a.setShout(&ShoutC);
a.Shout();
};
};

main함수에서는 먼저 fpShout에 아무 것도 할당하지 않은 상태로 A의 인스턴스의 Shout()를 호출하고, 그 후 전역 함수인 ShoutA()와 ShoutB()를 각각 할당한 후 A의 Shout()를 호출합니다. 마지막으로 B의 인스턴스에 대해 Shout()를 호출합니다.

int main()
{
A a;
a.Shout();
a.setShout(&ShoutA);
a.Shout();
a.setShout(&ShoutB);
a.Shout();
B b;
b.Shout();
}

function pointer를 member variable로 가질 경우 먼저 NULL로 설정한 후 항상 NULL 체크를 한 후에 실행될 수 있도록 해야 합니다.

위 code를 컴파일해서 실행해 보면 아래와 같은 결과가 나옵니다.

fpShout is NULL
A
B
C

Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/2

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

C++ Quiz

2007/12/12 14:44
간단한 퀴즈입니다.
cout << "Hello World!" << endl;

C++ 책 1장부터 우리가 사용하는 cout의 정체는 뭘까요?
1) class
2) object
3) function
4) template
5) keyword
6) none of the above
Creative Commons License
태그 C++

트랙백 보낼 주소 :: http://devnuri.com/trackback/1

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절