Programming

개발자 면접 단골 질문 파헤치기 1탄 ['해답은 여러가지가 있겠지만']

xxxCobee 2018. 10. 28. 08:00

나를 포함한 모든 개발자준비생(?) 혹은 개발자들은 신입이던 경력 이직이던 인터뷰를 보게 된다.

면접관들이 개발자를 채용할 때 중요하게 생각하는게 뭘지 곰곰히 생각해 보면, 내가 갑이 되서 내 돈주고 얘를 쓸껀데 괜찮은 앤지 알아보려면 뭐를 물어볼거 같은가?

이게 내가 생각하는 기본적인 인터뷰 준비의 골조다.


나라면 이 사람의 장점이 뭘까? 정말 잘하는 것이 뭘까? 를 가장 우선순위에 두고 질문 할 것 같았다.

어짜피 회사에서의 개발은 팀워크고, 맡은 분야에서 두각을 나타내 주기만 하면 되는 문제기 때문이다. (정말 아주아주 큰~~ 결점이 있지 않다는 가정하에..)

나라면 어떤 문제든 상관없이 주어진 질문에 꼬리를 물고, 꼬리를 무는 질문을 할 것 같다. 실제로도 이런식으로 많이 당했다(?). 이 방법이 그 사람이 얼마나 개발자로써 어떤 무언가를 깊게 파 보았는지, 성향이나 성격, 개발 스타일, 접근 방식, 대화 방법 등등, 여러가지를 파악할 수 있는 꽤나 괜찮은 방법이기 때문인 것 같다.(여담이지만 실제로 소개팅을 할 때, 상대방의 여러가지 모습을 보고 싶으면 이런식으로 물어봐도 효과있다. 이건 내가 정말 경험하고 듣고 보고 씹고 뜯고 맛보고 즐기고 해봤던거다)

예를 들면, 


"Get과 Post 방식의 차이점을 아세요?"

"Get은 주로 웹브라우저에서 서버에 데이터 요청을 할 때 사용하구요, Post는 반면에 웹브라우저가 서버에 데이터를 보내기 위해 사용합니다."

"실제로 사용 해 보셨나요?"

"네, 간단한 블로그에 구현해 봤습니다"

"그럼 실질적인 보안성의 차이는 어떻던가요?"

"어... Get을 할때는 쿼리가 노출되서 보안에 취약하고, Post는 프레임워크 자체적인 보안 validation을 거치기 때문에 좀 더 안전한 것 같습니다."

"그럼 어떻게 보완할 수 있을까요?"


뭐 대략 이런식이다.

결국, 굳이 정답이 아니더라도 '나는 어떤 문제를 해결하는데 있어서, 혹은 새로운 개념을 익히는데 있어서 이만큼 깊게 궁금하고 알려고 노력해 봤다' 라는 인식을 심어줄 수 있다면 긍정적인 답변이였다고 생각한다. (열심히 고민하며 대답하는걸 보여주는 것도 하나의 긍정적인 지표가 되지 않을까) 어짜피 답은 구글에 대부분 있거든. 내가 개인적으로 아는 분의 말씀을 따르자면, 구글과 스택오버플로우만 있으면 왠만한 문제는 모두 해결할 수 있다고 할 정도니까.


서론이 너무 길었는데, 각설하고 인터뷰 때 가장 중요한 핵심은(어렵고, 중요하고, 준비하기도 빡세고) 자료구조와 알고리즘이다. 알고리즘은 좀 더 코딩테스트에 가깝지만, 자료구조는 정말 면접의 핵심이다. 그 외에 여러 운영체제, 소프트웨어, DB, 네트워크 등등의 질문들도 밑반찬처럼 따라 오겠지만 결국 개발자는 뭔가 만드는 사람이고, 기본적인 뭔가를 만들어 내려면 각 구조를 지칭하는 특정 명칭은 모르더라도 개념에 대한 이해는 필수라고 생각한다.


말 그대로 단골 질문들, 내가 경험했던 것들과 구글링을 통해 수집한 주관적인 리스트들을 그냥 생각나는 대로 쭉 적어볼 생각이다. 




Q1. SQL이 뭔가요?

- 데이터베이스용 쿼리 언어인데, 쉽게 말해서 데이터베이스에 접근할 수 있는 언어다.


Q2. RDBMS와 NoSQL의 차이를 설명해 보세요.

- RDBMS(관계형 DB)는 데이터를 유연하게 쿼리할 수 있지만, 상대적으로 쿼리 비용이 높고, 트래픽이 많을땐 확장성이 떨어집니다. NoSQL은 몇가지 방법으로 데이터를 효율적으로 다루지만, 그 외에는 쿼리 비용이 높고 속도가 느립니다.


Q3. ORM이 뭔가요?

- 객체와 데이터베이스를 중간에서 맵핑하는 것입니다. 주로 프레임워크에서 유저가 직접 SQL을 작성하지 않고 프레임워크 ORM을 통해 보다 명확하고 편리하게 개발 할 수 있습니다.


Q4. DBMS는 뭔가요?

- 효율적이고 체계적으로 데이터를 관리하는 시스템이라고 보면 됩니다. 


Q5. 프레임워크는 뭔가요?

- 개발을 편리하게 할 수 있도록 여러 인터페이스들과 클래스들을 합쳐서 만든 것입니다. 프레임워크를 통해 개발을 하면 좀 더 빠르고 편리하게 개발 할 수 있고, 흔히 말하는 DRY(dont repeat yourself)를 지킬 수 있습니다. (그렇지만 창의적인 개발을 위해서는 프레임워크를 깊게 이해하고 추가적인 인터페이스도 개발 할 수 있어야 한다고 생각합니다.)


Q6. 오버라이딩은 무엇인가요?

- 한마디로 표현하면 덮어쓰는 것입니다. 상속 받은 함수를 재정의 하는것입니다.


Q7. 객체지향프로그래밍이 뭔가요?

- 절차지향, 즉 순차적으로 동작하는 프로그래밍과는 다르게 각 데이터를 객체로 취급하여 객체간의 관계와 동작들을 통해 프로그래밍 하는것입니다. 큰 문제를 작은 문제들로 쪼개어서 해결 후, 그 해답들을 통해 큰 문제를 해결하는 이른바 '상향식 프로그래밍' 이라고도 할 수 있다. 대표적으로 Java, C++, 파이썬이나 루비 등이 있다.


Q8. 세션(session)과 쿠키(cookie)에 대해 아시나요?

- 세션은 기본적으로 서버에 저장되고 쿠키는 클라이언트 PC 등에 저장된다. 그러다 보니 세션이 보안성에서 쿠키보다 우수하다. 그렇지만 쿠키와 세션을 둘 다 적재적소에 섞어서 사용하는 이유는 서버의 메모리 문제와 관련이 있다. 세션은 특정 웹사이트에서 방문자가 머무는 동안의 상태를 유지하기 위해 사용되고, 대개 브라우저를 종료하거나 서버에서 삭제 시 유효성이 만료된다. 쿠키는 사용자의 정보들을 담은 임시 파일로써, 웹서버에서 쿠키를 통해 클라이언트에 대한 정보를 파악하게 된다.


Q9. TCP와 UDP를 이해하고 있나요?

출처: http://ddiri01.tistory.com/28

- TCP 통신 

 TCP(Transmission Control Protocol)는 인터넷에서 가장 흔하게 그리고 많이 쓰이는 프로토콜 방식이다. 그 이유는 TCP통신은 error correction이라는게 존재하는데 말 그대로 에러를 다시 잡아주는 것이다. 서버에서 클라이언트에게 어떤 정보를 보냈다고 하자! 그러면 클라이언트는 서버가 보낸 정보를 제대로 받았는지, 확인해주는 메세지를 다시 서버에게 돌려주고, 클라이언트가 제대로 받지 못했을 경우엔 resend를 서버에 요청 할 수 있다. 그러면 loss된 데이터를 다시 클라이언트에게 보낼 수 있는 것이다. 이런 방법들을 flow control이라고 하며, 오리지널 데이터를 로스 하지 않고 받을 수 있게 한다. 즉, guaranteed delivery!

 - UDP 통신 

 UDP(User Datagram Protocol)는 인터넷에서 또 많이 쓰이는 프로토콜인데 그 사용처는 tcp 통신과는 다르다. tcp통신과의 가장 큰 차이는 단방향 통신이라는것! 서버가 클라이언트에게 혹은 클라이언트가 서버에게! error correction이 없고, 무조건 보내는 쪽에선 던지기만 하고 받는 쪽에선 받기만 한다. 그러다가 데이터 로스가 중간에서 발생하면 어쩌냐? 무시한다. 그냥 던지고 받는거다 ! 이렇게 되면 장점은 TCP통신 보다는 훨씬 빠른 전송을 보여주게 된다.

Q10. 앞으로 생각날 때 마다 업데이트 해 보도록 하자.


To be Continue