면접
Technical Interview의 종류.
-알고리즘, 데이터 구조. (흔하게 물어본다.)
-시스템 디자인 (석-박사는 이런 거 물어본다고 한다.)
-domain specific interview.
-project interview (간단하게 질문함. 어떤 역할을 했고, 어떤 어려움을 겪고 해결했는지 등등)
이력서를 화려하게 쓰는 것도 좋지만, 이력서 한 줄 한 줄을 모두 자신이 책임질 수 있어야한다.
이력서 내용을 모두 자신이 완벽하게 이해하고, 설명할 수 있어야한다.
중요한 건 깊이 있는 몇 개를 자신의 주요 컨셉으로서 적어야 한다. 너무 많이 쓴다고 좋지 않다.
resume(서류 통과)
내용은 짧고 간결하게 강조. 최대한 잘 정렬해야 한다.
Education(내가 무엇을 공부했고), Experience(내가 무엇을 했고 프로젝트 같은 거.)
너무 많은 프로젝트 경험을 쓰면 도대체 뭘 면접관에게 어필하는 건지 불분명하기 때문에 제대로 된 프로젝트 몇 개만 쓰기.(1개도 좋다.)
Resume는 계속 같은 걸 돌려쓰는 것보다, 자신이 원하는 기업에 따라서 resume 양식, 내용을 맞춰주는 게 좋다.
그리고 구글링해서 양식 찾지 않고 만드는 것이 좋다.(강사님은 구글링에서 보이는 양식은 걸렀다고 한다.)
대부분의 회사, 미국 회사는 공채라는 개념이 없다. 커리어, 구직 사이트를 들어가면 어떤 포지션을 뽑고 있다고 공고가 있다.
공고의 최소 조건만 충족하면 지원 가능하다. 선호 조건은 모두 채운 사람은 없으니 자신감을 가져라.
면접 막바지에 "혹시 질문 있으십니까"라고 면접관이 물어봤을 때, 구직 사이트에 올라온 모집 공고를 보고 질문을 짜 보는 게 좋다. 공고에서 어떤 역할, 어떤 능력이 필요하다고 쓰여 있을텐데 이를 읽고 그에 관한 내용을 말하는 건 면접관에게 긍정적인 이미지를 확연하게 보여줄 수 있다. Description을 잘 읽어보고 면접에 들어가도록 하자.
준비 및 리서치
개발자 모임은 도움이 된다. (주니어 개발자를 가르쳐주고 알려주고 싶어한다.) 지인 선배들(타겟 회사에 합격한 선배들)에게 물어보는 것도 좋다.
연습
생각보다 코딩 인터뷰에서 나오는 건 대학에서 배운 것들에 대해서 질문을 한다.(교과목에 대한 이해도가 충분하면 좋다.) 샘플을 찾아서 어떤 방식, 내용이 주로 나오는지 미리 알아오자.
물론, 구글링으로 찾을 수 있는 문제들, 백준과 같은 사이트에 공개된 내용들은 회사에서 Ban해서 동일한 내용으로 면접에 나오지는 않는다. 리트코드나 백준으로 공개된 문제를 풀어보는 것도 좋지만 실전에서는 동일한 유형의 문제는 나오지 않는다는 것을 감안해야한다.
정형화된 문제들을 잘 풀어보고 연습하자. 리더십과 같은 이런 정형화되지 않은 문제들은.. 자신의 역량을 키우자.
코딩 인터뷰는 오프라인으로 하는 회사가 좋다고 한다.(한국에서는 온라인으로 코딩 문제만 나오는 경우가 많다. 외국계 기업 취직은 조금 다른 양상을 보인다.) 면대면으로 코딩하게 된다.
- 면대면 코딩 : 면접관이 제시한 문제를 풀 때, 면접관과 소통하며 문제를 푼다.(면접관이 문제를 푸는 직접적인 힌트를 주지는 않는다. 줘 봤자 가이드라인 정도?).
질문을 받고 대답하면서 코딩 문제를 해결하는 건 쉽지 않다.
구글링, 유튜브를 찾아보다보면 회사 홍보차원에서 인재 확보차원에서 영상을 올려놓는다. 이런 것들을 잘 찾아보는 것도 좋다. EX) Coupang Career, Life at google.
https://www.youtube.com/@coupangcareers4800/videos
Coupang Careers
www.youtube.com
https://www.youtube.com/@LifeatGoogle/videos
Life at Google
Googlers are here to give you the inside scoop on our work, culture, offices, and everything else that makes up life at Google. And we've got you covered with everything you need to know for applying, interviewing, and landing a job at Google! Ready to be
www.youtube.com
코딩 인터뷰
코딩 인터뷰는 정형화 되어 있다. 온라인 코딩테스트로 진행하는 코딩 인터뷰는 강사님께서는 자신에게는 생소해서 면대면 코딩 인터뷰를 알려주셨다.
면대면 코딩 인터뷰가 면접자의 역량을 더 확실하게 파악할 수 있다. 커뮤니케이션 스킬과 코딩 실력을 무엇이 더 중요한지 우열을 가릴 수 없다. 면대면에서 코딩만 가능한 사람은 썩 좋지 않다. 1:1로 인터뷰하면서 코딩문제를 푸는 방식.
면대면 코딩 인터뷰 진행 방식
자기 소개 -> 프로젝트 대화(면접자가 했던 프로젝트 얘기, 팝업 퀴즈 등등)- 면접자의 긴장, 경직된 사고를 풀기 위해 하는 것이라 너무 어렵게 받아들이지 않도록 한다.
-> 코딩 문제 해결
코딩 문제 해결에 대한 면접 과정
Step 1 & 2
- 면접관이 제시한 문제를 다시 한 번 명확하게 얘기해본다. (자신이 이해한 게 맞는지 재차 확인하는 과정으로 면접자가 자신의 커뮤니케이션 능력을 알려주는 좋은 기회이므로 꼭 해야한다.) 예시를 들어서 해주는 것이 좋다.-테스트케이스를 잡는다.
또한, 문제 해결에서 생길 수 있는 예외 처리 같은 것을 질문하는 것도 좋다.
(예시 : "입력을 받을 때 중복으로 들어온 입력은 어떻게 처리합니까?","출력에 대한 방식은 ~~하도록 하면 되겠습니까?")
-리트코드나 백준에서는 문제 내용이 명확하게 제시 되어 있다. 이런 것들은 회사에서 맞닥뜨릴 문제와는 큰 괴리감이 있다. (입력, 출력 이런 것들이 다 완벽하게 제시되지 않는다. 그렇기에 버그가 존재하는 것.) 그렇기 때문에 문제에 대해서 재차 확인하는 과정은 중요하다.
Step 3
- Approach. 문제 접근 방식. 구글에서는 코딩 인터뷰가 45분 주어진다. 하지만 코딩하는 시간은 실상 20분으로 소중하게 시간을 써야한다. Brute Force로 풀고, 어떤 방식으로 다시 최적화해서 풀고, 더 적절한 솔루션을 찾아서 풀고, 이러다 보면은 시간이 촉박하게 된다.
노가다로 풀게 되는 부분은 말로 풀어서 설명하고(의사코드를 사용해서 간략하게 얘기하거나) 바로 문제에 대한 최적의 문제 접근 방식으로 풀어가야 한다.
-문제 해결 방식을 생각할 때, 면접관에게 아무말 없이 갑자기 침묵하면 좋지 않다. 생각할 시간이 필요하다면 면접관에게 "잠시 생각할 시간이 필요합니다. 잠시만 기다려주시겠습니까". 이런 말을 통해서 의사소통을 해야한다. 이것 역시 면접자의 커뮤니케이션 능력을 확인하게 된다.
다음은 내가 짜본 의사소통 예시이다.
면접관 : (문제에 대한 설명.)
면접자 : 그럼 이제 제가 해결해야할 것을 잘 인지했는지 얘기해보겠습니다. 문제는 다음과 같이 ~~(문제 설명)~~이고, 예시를 들자면 ~~(대표적인 예시, 간단한 예시, 가능한 예시 등등)~~이렇겠군요. 혹시 면접관님 문제에 대해서 입력의 범위 값은 어떠하며, 입력은 중복으로 들어옵니까? 문제에서는 중복에 대해서는 일반적으로 하나로 본 것 같아서 여쭙습니다.
면접관 : (설명...)
면접자 : 잘 이해했습니다. 그러면 이제 접근 방식을 생각해보겠습니다. 잠시 시간을 주시겠어요?
면접자 : "브루트포스로 이용하면 풀릴 것 같지만, 시간복잡도가 너무 크기 때문에 좋지는 않을 것 같네요. 잠시만 더 좋은 걸 생각할 시간을 가지겠습니다. ~~~이런 방식이 있고, 점화식이 구해질 수 있으니 다이나믹 프로그래밍을 이용해서 풀어보는 것도 괜찮을 것 같습니다."
면접관 : "다이나믹 프로그래밍을 사용하시는 것도 좋겠네요. 그런데 입력받는 수의 범위가 생각보다 큰데 이런 부분은 어떻게 해결하실 건가요?"
면접자 : "음.. 좌표압축법을 이용해보겠습니다. 먼저, 입력받은 후 최적화시켜서 메모리를 줄이면 좋을 것 같습니다."
면접관 : "좋은 방식이네요. 이제 코딩하셔도 좋을 것 같은데요?"
면접관과 소통하면 최소한 문제 해결 방식의 가이드라인 정도는 얻을 수 있다.(직접적인 힌트 대신 간접적으로 제시해준다.)
이후 여러 의사소통을 한 후에 면접관이 "그럼 이제 코딩해볼까요?"라고 제시하면 다음 단계로 넘어가자. 대망의 코딩.
꼭 얘기 안 하더라도 자신이 충분하다고 생각되면 코딩 시작하자.
Step 4
스텝 1~3까지 명확하고 정확하게 진행을 잘 했다면 실제 코딩은 매우 빠르게 진행된다.
Step 5
마지막 단계이다. 이걸 잘 하느냐, 안 하느냐에 따라 점수가 달라진다.
- 테스트 단계이다. 자신의 코드가 원활하고 버그 없이 잘 수행되는지 면접관에게 검증하는 과정이다. 자신의 소스코드가 입출력 예시가 어떻게 수행되는지 확인, 결과 검증. 좋은 예시를 들어서 설명하는 것도 좋다. 점근식도 잘 얘기해야한다.
면접자 : "코딩이 완료되었습니다. 이제부터 제 코드가 잘 수행되는지 검증해보겠습니다. 먼저 입력을 받아 해쉬 맵에 받아 좌표 압축을 실시하게 됩니다. 다음 for문을 통해서 이뤄지게 될 것입니다. ~~~ 이후 dp함수에서 해쉬 맵을 인자로 받게 되고 ~~ 이런 방식으로 result 값이 반환되어 다음과 같이 출력될 것입니다. ~~~다른 예시를 넣을 경우에는 ~~~ 이런 중복된 수는 ~~. 이상으로 제 코드가 잘 수행되고 있음을 알 수 있습니다."
공부에 관하여.
프로그래밍 언어 정하기.
C를 쓰지 말라고 한다. 클래스와 해시, 연결 리스트 등등 이런 것들이 없다. 따라서 이런 것을 구현하려면 자세하게 알고 코드로 구현할 수 있어야 한다. 파이썬을 강력 추천.
언어 선택 시 자신이 어떤 포지션을 회사에서 맡게 되는지에 따라 기준이 정해지기도 한다. (모바일 특화, 정보보안 특화, 프론트엔드 특화 등등)
언어에서 제공하는 API를 잘 사용할 수 있게 알아두자. 코딩 면접 시 기억이 잘 안 나는 세부사항은 헷갈린다면 솔직하게 얘기하고 사용하도록 하자.(예시 : 면접자 : "insert(),add()이 둘 중 어떤 메소드였는지 이름이 기억이 잘 안 나지만, ~~자료구조에 넣기 위해서 이것을 사용하려고 합니다.")
학교 교과목 공부.
코딩 실력도 중요하지만, 컴퓨터 공학에서 알고 있어야 하는 문제들을 알고 있으면 좋다. 이렇듯이 코딩이 전부는 아니다. 중요한 것들은 많다. (malloc을 구현해보시오. realloc을 구현해보시오. 메모리구조에 대해서 잘 알고 있다면 효율적으로 답변할 수 있다.) 자료구조와 알고리즘만으로 해결되지 않는 게 많다. 물론 공부 시작은 자료구조, 알고리즘이다.
스트링, 어레이 관련 문제, 연결리스트, 트리구조, 해시 테이블 등등 일반적으로 사용하는 방법만 알기보다 컴퓨터 공학적으로 잘 알고 있으면 어떤 variation 및 최적화 문제가 주어지더라도 잘 풀 수 있다.
연습
IDE를 안 쓰는 것이 좋다. 전체를 한꺼번에 볼 수 있는 능력을 길러야 한다. 화이트보드나 A4 용지로 (위의 Step 1 ~5까지 다 아우르도록)문제를 해결해보자. 체계적으로 문제를 풀게되며 무언가를 적는, 쓰는 행위는 집중, 몰입을 쉽게 도와준다.
공부 매체.
1. Cracking the coding interview | 간단한 코딩 인터뷰를 알려줌. |
2. HackerRank | 스텝별로 문제를 제공해주는 서비스. |
3.GeeksforGeeks | 조금 더 깊게 공부하고 싶을 때. |
4.Educative.io | 시스템 디자인 인터뷰가 어떤건지 알 수 있다. |
리트 코드- 유료버전 사용하면 자기 수준 파악할 수 있음.
백준 - 잘 알죠.
pramp - 코딩 인터뷰, 리더십 인터뷰 등등을 연습할 수 있다. 사람들을 매칭해준다. 물론 친구랑 할 수 있다. 자기가 면접관,면접자 둘 다 될 수 있다.