미국에서 소프트웨어 엔지니어 취업을 준비를 하면서 제일 많이 공을 들였던 것이 Technical Interview이다. 원하는 잡 포지션을 얻느냐 마느냐 하는 것이 주어진 기술적 질문에 적절한 답을 하고 상황에 요구되는 알고리즘과 데이터 구조를 보여주는 것으로 대부분 결정된다고 해도 과언이 아니다.

테크니컬 인터뷰의 본 게임에 들어가기 전에 워밍업으로 많이 주어지는 질문 중 가장 빈도가 높고 기본이 되는 질문이 객체지향 프로그래밍 (Object-Oriented Programming) 개념에 관한 것이다. 의외로 상당히 오랜 시간을 프로그래밍에 투자한 사람도 이 개념들을 설명해 보라고 하면 쉽게 대답하지 못하는 경우가 많다. 본인이 인터뷰를 진행하던 중에도 상당히 높은 빈도로 객체지향 개념에 대해서 질문을 받았는데 그 때 본인은 객체 지향에 대한 개념과 영어 설명은 달달 외우고 다녔기 때문에 인터뷰에 있어서는 크게 어려움이 없었다. 지금 현재 일하고 있는 델에서는 처음 잡 인터뷰 때 객체 지향 질문에 대한 답을 꽤 자세히 잘 설명해서 그 때 인터뷰를 담당했었던 Jeff에게 꽤 좋은 인상을 남겼던 것으로 기억하고 있다.  기억이 가물가물 하지만 Inheritance와 Polymorphism에 대해서 질문을 했는데 잘 아는 개념이라서 어려움 없이 설명을 했다. 그러자 그가 상당히 많은 소프트웨어 엔지니어 포지션 지원자들이 이 질문에 대답을 제대로 하지 못한다고 해서 조금 놀란 적이 있다.

다음 예제를 가지고 자신이 얼마나 객체지향(OOP)에 대해서 이해하고 있는지 점검해보자.

다음 리스트에서 몇 개를 설명할 수 있는지 체크해보자. (그리고 영어로 몇 개를 설명할 수 있는지 생각해보자)

Object-Oriented Programming Concept

1. class, object (and the difference between the two)
2. instantiation
3. method (as opposed to, say, a C function)
4. virtual method, pure virtual method
5. abstract class
6. class/static method
7. static/class initializer
8. constructor
9. destructor/finalizer
10. superclass or base class
11. subclass or derived class
12. inheritance
13. encapsulation
14. polymorphism (without resorting to examples)
15. multiple inheritance (and give an example)
16. delegation
17. composition/aggregation
18. interface / abstract class
19. interface/protocol (and different from abstract class)
20. method overriding
21. method overloading (and difference from overriding)
22. is-a versus has-a relationships (with examples)
23. method signatures (what’s included in one)
24. method visibility (e.g. public/private/other)

그리고 프로그래밍에 대한 기본적인 이해를 묻는 문제도 나오게 된다. 가끔 미국에서 소프트웨어 엔지니어가 되기 위해서는 어떤 언어를 공부해야 되는지에 대해서 질문을 받곤 하는데 본인의 경험에 비추어 보아 C/C++, Java 정도의 언어만 마스터 해 놓는다면 왠만한 미국 대기업 인터뷰를 할 때는 문제가 없다는 생각이다. 대부분의 잡 인터뷰에서 어떤 언어를 기본으로 할지 물었는데 본인은 그래도 둘 중에 자신이 있는 C/C++를 보통 골라서 인터뷰를 했었다. 하지만 어떤 경우에는 선택이 없는 경우도 생기고 (예를 들면 Job Description에 자바 소프트웨어 엔지니어를 뽑는다면 분명 자바 언어로 인터뷰를 준비해야 될 것이다) 두 언어의 차이점을 묻는 질문을 받게 될 수도 있으니 두 언어 모두 어느 정도 깊게 공부해놓기 바란다. 본인이 인터뷰를 봤던 회사 중에서 특정 언어가 이미 정해져 있었던 경우는 다음과 같았다.

마이크로소프트: C/C++ (왜 자바를 안 쓰는지는 금방 아실 것이다!)
아마존: Java (웹 서비스에 기반을 두기 때문에 C/C++보다는 Java를 더 많이 쓰는 것은 당연할 것이다)
Intuit: Java (이 회사도 웹 기반 서비스를 많이 제공하고 있기 때문에 본인에게 선택권이 없이 Java를 정했던 기억이 있다)

대부분의 IT기업에서 왜 이 두 언어에 비중을 두는지는 다음과 같은 이유일 것이다.

1. Computer Science 혹은 Computer Engineer을 공부했다면 C/C++과 Java는 절대 피해갈 수 없는 프로그래밍 언어가 될 것이다. 분명 학교에서 배운 적이 있고 개발팀에서 가장 빈번하게 쓰이는 언어들이므로 이에 대한 이해력을 테스트한다면 지원자들을 걸러내는데 좋은 기준으로 작용할 수 있을 것이다.

2. C/C++과 Java에 대한 이해가 선행되어 있을 경우 다른 언어는 쉽게 접근할 수 있다. 요즘은 많은 다양한 프로그래밍 언어가 있어서 Python을 쓰는 곳도 있고, C#을 주로 쓰는 곳도 있다. 하지만 C/C++과 Java를 잘 이해하고 있을 경우 확실히 다른 언어들은 쉽게 빠르게 배울 수 있다. 문법 구조와 쓰임은 다르지만 프로그래밍 언어의 기본적인 사항은 공통으로 가지고 있는 경우가 많기 때문이다.

다음 질문들에 답할 수 있는지 생각해보자. (그리고 영어로 설명할 수 있는지)

1. What does “volatile” mean?
2. What does “static” mean?
3. In C++, what is the same one as Java’s “final” keyword?
4. What is “explicit” keyword in C++?
5. What is “mutable”?
6. What is default constructor in C++?
7. What is namespace?
8. What is iterator?
9. What are prefix and postfix?
10. What is memory leak?
11. What are similarity and difference between C++ and Java?
12. What is garbage collection?
13. What is friend class in C++?
14. What are the pros and cons of array and linked list?

이러한 맛보기 문제가 끝나면 이제 실전 문제가 나오게 된다. 실전 문제는 미국의 많은 IT 대기업에서 자료구조(Data Structure) 혹은 알고리즘(Algorithm)에 대한 이해를 묻는다. 본인도 기억을 해보면 Array, Linked List, Tree, Graph 등에 대한 응용 문제를 받고 이 문제를 해결하기 위해 간단한 코딩을 보여주면서 해결 방법을 설명했던 기억이 난다. 조금 극단적으로 얘기를 해보자면 굳이 Computer Science / Computer Engineering을 전공하지 않더라도 자료구조와 알고리즘을 공부하고 어느 정도 프로그래밍 경험이 있다면 대부분의 문제를 풀 수 있을 것이라 생각한다. 하지만 여기 나오는 문제들이 많은 사고와 이해력을 요구하기 때문에 절대로 쉽게 생각해서는 안된다.

(Visited 932 times, 1 visits today)
Share This