이번 포스팅에서는 안드로이드 개발자로서 세번째 이직을 하며 느낀 점과 면접 질문을 복기합니다.
이직을 준비하시는 분들께 조금이나마 도움이 되면 좋겠습니다.
멀고도 험한 이직의 길…
이직을 결심하게 된 사유
이직을 결심하게 된 계기는 여러가지가 있었지만 그것은 그저 계기일 뿐이고 근본적인 이유는 스스로에게 있었습니다. 솔직히 말하면 예전부터 이름있는 큰 기업에 가고 싶다는 열망이 이전부터 있었습니다. 그럼에도 절 필요로 해주신 분들이 계셨기 때문에 최선을 다해서 회사 업무에 모든 것을 쏟아부었습니다. 그러나 어느 순간부터 여러가지 계기로 그 균형이 깨져가면서 결국 원래부터 가고 싶었던 큰 기업을 목표로 도전하게 되었습니다. 그 당시에는 거의 우울증마냥 무기력하고 절망적어서 이직이란 목표로 우울감을 극복하려고 노력했는데 그 과정에서 주변을 잘 살피지 못한 부분은 후회로 남습니다.
전략 수립
단순히 가면 좋고 아님 말고
가 아니라 반드시 이직해야만 했습니다. 그것도 평행이동이 아닌 한단계 더 성장해서 이직해야 했기 때문에 전략수립이 필요했습니다. 그래서 멘토와 여러 주변 지인분들을 만나서 여러가지 고민상담도 받고 정보와 조언을 받아가면서 전략을 세워나갔습니다.
첫번째로 할 일은 우선 내가 어떤 회사를 가고 싶은지
를 결정해야 했습니다. 그리고 그 대답으로 큰 기업에 가고 싶다는 결정을 내릴 수 있었습니다. 그래서 세운 전략은 다음과 같습니다.
- 이력서와 경력기술서 작성 후 멘토에게 첨삭 받기
- 꼭 가고 싶은 회사를 지원하기 전에 몸풀기로 면접 먼저 보기
- 몸풀기 이후 가고 싶은 회사부터 순차적으로 지원하기
- 거의 동시에 지원하되 과제와 코딩테스트 일정이 겹치지 않도록 일정 조정
기업별 면접 분위기
이번 과정에서 느낀점은 회사에 따라 질문하는 영역이 많이 차이가 난다는 것이었습니다. 주로 지원자가 많지 않거나 사람이 급한 곳일수록 고맥락의 질문이 많았습니다. 반대로 지원자가 많을 것 같은 회사일수록 고맥락에서 저맥락까지 다양하게 물어본다는 점이었습니다. 전반적으로는 안드로이드 기술 트렌드(RxJava, MVVM, 클린아키텍처, 코루틴, Dagger 등)에 대한 질문이 가장 많았던 것 같습니다.
또 큰 기업일수록 채용 과정이 잘 정형화 되어 매끄럽게 진행되지만 전체적인 과정이 꽤 오래걸리는 경우도 많았습니다. 그에 반해 규모와 상관 없이 최근 트렌드에 민감한 기업들이 오히려 채용에 더 많은 시간과 노력을 기울이는 느낌을 받았습니다. 면접시간도 길고, 면접자에 대해 더 많이 조사하고, 새로운 방식의 테스트를 도입하는 경우도 있었습니다.
좋은 인상을 받은 면접의 특징
- 지원자에 대한 배려 (휴식시간, 채용과정의 피드백)
- 면접관의 준비된 태도
- 지원자의 이력서, 경력기술서의 꼼꼼한 사전 검토
아쉬운 인상을 받은 면접의 특징
- 인사팀에서 수신불가능한 전화번호로 연락
- 같이 일할 사람이 면접관으로 나오지 않음
- 출제의도가 불분명한 과제 출제
과제의 출제의도를 물어보니 예전에 퇴사한 사람이 출제했던 과제
라는 대답을 들을 땐 정말 황당해서 할말을 잃었습니다. 면접을 통해 이미지가 더 좋아진 회사가 있는 반면 더 나빠진 회사도 있었습니다. 그래서 채용 과정과 면접관은 회사의 얼굴
이라는 말을 다시금 새기는 계기가 되었습니다.
코딩테스트 VS 사전과제
개인 적인 통계를 내어봤더니 다음과 같습니다.
절반 이상은 코딩테스트, 사전과제를 보고 일부 라이브 코딩을 진행하는 기업도 있었습니다.
1/4정도의 회사는 코딩테스트와 사전과제 중 어느쪽도 진행하지 않았습니다.
받았던 면접 질문들
아마 이 부분이 가장 궁금하셨으리라 생각됩니다.
면접 복기를 하며 정리했던 면접 질문들을 정리합니다.
면접에 대한 대답은 직접 찾아가며 학습해보시기를 권장드립니다.
기업 이름을 밝히지 않기 위해 알파벳을 순서대로 적었습니다.
알파벳은 실제 이름의 이니셜이 아니며 전혀 관계 없습니다.
A회사
- 업종: 모빌리티
- 지원채널 : 사람인
- 프로세스 : 코딩테스트 -> 실무면접
코딩테스트에서 언어를 지정해주는데 5문제 중 3문제는 Java, 1문제는 Javascript, 1문제는 SQL 이었습니다. 코딩테스트의 난이도는 높지 않았지만 오랜만에 Java와 Javascript로 풀어야 한다는 점에서 좀 당황스럽긴 해도 어찌저찌 풀어서 면접까지 진행할 수 있었습니다. 당황스러웠던 점은 사람인의 지원공고에 나온 회사이름과 실제 회사의 이름이 달라서 기업 사전조사에서 엉뚱한 기업을 조사를 해가는 실수가 있었습니다. 면접은 평이했던 것으로 기억합니다.
- 우리 회사 서비스 사용해본 적 있나요?
- 본인의 그동안 담당했던 업무와 프로젝트를 소개해주세요.
- 퇴사를 결정하게 된 이유를 소개해주세요.
- 기획상 아이디어를 내서 반영한 사례가 있다면 소개해주세요.
- 어려움을 극복한 사례를 소개해주세요.
B회사
- 업종 : 패션
- 지원채널 : 원티드
- 프로세스 : 기술 면접 (라이브 코딩테스트) -> 임원 면접
개인적으로는 채용 과정에서 가장 인상이 좋았던 회사입니다. 코딩테스트나 사전과제가 없는 대신 면접에서 실시간으로 정답이 명확하지 않은 추상적인 기술질문을 던지고 대답을 듣는 과정이 있었습니다. 아마도 이런 과정을 통해 문제를 어떻게 접근하고 해결책을 고민하는지 그리고 안드로이드 개발자로서의 경험치를 확인하는 것 같았는데 굉장히 신선했습니다. 또한 이력서를 꼼꼼히 읽고 깃헙이나 기술블로그를 확인하는 등 지원자를 파악하기 위해 사전에 많은 준비를 한 것을 느낄 수 있었습니다. 면접 자체도 2시간정도 걸렸는데 면접 중간에 쉬는시간도 주고 분위기도 차분하고 매끄럽게 잘 진행되어서 지원자에 대한 배려가 많이 느껴졌습니다. 추가적으로 요즘 말하는 목적조직의 느낌이 강했는데 컬쳐를 굉장히 중요시 하는 느낌이었습니다. 결과는 아쉬웠지만 해당 기업에 대한 이미지도 좋아지고 개인적으로도 좋은 경험이었습니다.
- 각각 다른 화면에서 (썸네일 화면, 목록화면, 상세화면)에서 동일한 ‘좋아요’버튼의 상태를 동기화하려면 어떻게 해야할까요?
- RxJava에서 flatMap과 switchMap의 차이가 무엇인가요?
- 100000px x 100000px 사이즈의 이미지를 업로드 한다면 어떻게 해야할까요?
- 클린아키텍처를 반드시 사용해야하는 이유가 있다면 무엇일까요?
- 기획단계 또는 기획 리뷰 등에서 아이디어를 제안한 경험이 있다면 소개해주세요.
- 영상 관련 기능 개발에 혹시 경험 또는 관심이 있다면 소개해주세요.
- 팀원과의 갈등상황에서 어떻게 갈등을 해결해나가시나요?
- 코드리뷰할 때 중점적으로 보는 것은 어떤것인가요?
C회사
- 업종 : 번역/학습
- 지원채널 : 원티드
- 프로세스 : 사전과제 -> 기술 면접 -> 임원 면접
몇 안되는 대면 면접으로 진행한 기업이었습니다. 회사의 규모, 기술스택이나 분위기가 이전 회사와 가장 비슷한 기업이었습니다. 채용 과정 전반에 HR이 굉장히 공을 들인다는 느낌을 받을 수 있었습니다. 면접 과정에서도 HR이 흐름을 잘 이끌어주고 분위기도 매끄럽게 진행해주었습니다. 사전 과제로는 간단한 API 통신으로 목록을 조회하는 앱 개발을 3일 이내에 개발하는 평범한 과제였습니다.
- 자기소개 부탁드립니다.
- 학습하는 방법과 주로 정보를 얻는 채널이 어디인지 소개해주세요.
- 이직하는 계기가 무엇인가요?
- 원하는 회사의 모습을 소개해주세요.
- 본인 성격과 성향을 자유롭게 소개해주세요. (개발이 아니어도 좋습니다.)
- 클린아키텍처가 무엇인지 설명해주세요.
- 사전과제를 어떻게 개발했는지 전체적으로 소개해주세요.
- 개발자가 된 이유와 그 중에 안드로이드 개발을 선택한 이유를 소개해주세요.
- 멘토 혹은 롤모델이 있다면 소개해주세요.
- 우리 회사 서비스를 써보셨나요? 써보셨다면 어땠는지 이야기해주세요.
- Fragment의 lifecycleOwner로 this, view.lifecycleOwner의 차이를 설명해주세요.
- ViewModel을 사용할 때 화면회전하면 어떻게되나요? 왜 그렇게 될까요?
- 메모리릭을 방지하는 방법을 소개해주세요.
- 선언형프로그래밍이 무엇인가요?
- sealed class와 enum가 컴파일되었을 때 어떤 차이가 있을까요?
- abstract class와 interface의 차이를 설명해주세요.
- Glide 라이브러리가 내부적으로 어떻게 구현되어 있는지 확인해보신 적 있으신가요?
- 용량이 아주 큰 대용량 이미지를 업로드할 때 어떻게 해야할까요?
- BDD와 TDD의 차이를 아시나요?
- UnitTest에서 사용하는 용어들 mock, spy, stub, STU 의 각각의 차이를 설명해주세요.
- 단위테스트, 인수테스트, 통합테스트, UI테스트의 차이를 설명해주세요.
- private 함수 테스트한다면 어떻게 해야할까요?
- 멀티스레드로 개발할 때 어떻게 개발해야 할까요?
- 코드리뷰는 주로 어떻게 하시나요?
D회사
- 업종 : 커뮤니케이션
- 지원채널 : 자체 채용 사이트
- 프로세스 : 코딩테스트 -> 기술 면접 -> 임원 면접 -> 레퍼런스 체크
기대가 큰 회사였던 만큼 부담이 엄청 컸던 곳 입니다. 사실 코딩테스트가 그럽게 어렵지도 않았는데 중간에 멘탈이 무너져서 코딩테스트를 망쳤습니다. 망연자실해서 사실상 포기하고 있었는데 다행히 코딩테스트 합격 통보를 받고 긴가민가한 상태로 면접이 진행되었습니다. 면접 질문은 꽤나 난이도가 있었는데 다행히도 그나마 잘 아는 질문 위주로 나왔던 것 같습니다. 개인적으로도 중요하게 여기는 부분들에 대한 질문들이 많아서 회사에 대한 이미지도 좋았고 이후 면접 복기하는 과정에서도 도움이 많이 되었습니다. 독특한 점은 레퍼런스 체크가 있어서 이전 회사 직장동료 두분과 전전회사 직장동료 두분에게 도움을 받아 레퍼런스 체크를 진행하였고 이 과정에서도 꽤나 시간이 소요되어 전체적인 채용 과정이 굉장히 오래 걸린 편이었습니다.
- 이전 회사에서의 담당 업무와 포지션을 자세히 소개해주세요.(팀 규모, 담당 프로젝트, kotlin 비중 등)
- 클린아키텍처를 사용한 이유가 무엇인가요?
- Intent는 왜 사용하는 걸까요?
- Parcelable이 무엇인지 어떻게 사용하는 설명할 수 있나요?
- 코루틴과 RxJava를 비교해 주세요.
- Application Context Vs Activity context 차이점을 설명해주세요
- 만약에 application context와 activity context를 static 멤버가 들고 있으면 각각 어떻게 될까요?
- MVC, MVP, MVVM, MVI 각각을 비교해주세요.
- Java에서 checked exception을 왜 Kotlin에서는 사용하지 않았을까요?
- Exception과 Error, Throwable의 차이를 설명해주세요.
- dalvic과 ART 차이점을 설명할 수 있나요?
- Immutable 객체를 사용할 때의 장단점을 설명해주세요.
- HashMap vs HashSet 어떻게 다르고 각각을 어떨 때 사용하나요?
- ANR이 언제 왜 발생하는지 설명할 수 있나요? 발생한 사례가 있나요?
- FCM 푸시 사용해 본 적이 있나요?
- GC가 무엇인지, 어떻게 동작하는 지 설명할 수 있나요?
- Dagger를 사용해 본적이 있나요?
- git merge와 rebase의 차이와 각각을 언제 사용하나요?
- 지원동기를 말씀해주세요.
- SDK 개발과 서비스 개발에서의 어떤 차이가 있었나요?
- SDK 개발 시 모앱의 라이브러리 버전이 다를 때 해결 방법을 소개해주세요.
- 직전 회사에서 퇴사하는 이유가 무엇일까요?
- 꼭 피하고 싶은 회사의 조건이 있다면?
- 다른 개발자와의 갈등을 어떻게 해결하시나요?
- 현재 관심갖고 있는 기술은 어떤 것이 있나요?
E회사
- 업종 : 엔터테인먼트
- 지원채널 : 자체 채용 사이트
- 프로세스 : 사전면접 -> 기술면접 -> 임원면접
면접 전형이 특이해서 어느 회사인지 눈치 빠른분들은 아실 수도 있을 것 같습니다. 코딩테스트나 사전과제가 없는 대신 화상통화로 20분간 사전면접을 보고 이후 1:1로 1시간씩 3번에 걸쳐 기술면접을 진행하였습니다. 사전면접도, 기술면접도 굉장히 수준 높은 질문들이 오갔고 3시간에 걸친 기술면접때는 진이 다 빠져버렸습니다. 심지어 기술 면접 중간에 라이브코딩으로 간단한 코딩테스트를 진행했습니다. 심지어 두번째 면접관은 자신 없는 부분만 계속 질문해서 이후 면접 복기하는데 ‘왜 이렇게 한심하게 대답했지’하고 많이 후회가 남는 면접이었습니다. 그리고 굉장히 끈질기게 깊은 질문을 하는 점이 굉장히 어려웠습니다. 가령 예를 들면 HTTTPS vs HTTP의 차이
는 어느 회사든 나올법한 질문이지만 그 대답에 이어 그럼 그 SSL Handshaking이 어떻게 진행되는지도 설명 가능할까요?
하는 식으로 한단계 더 깊은 질문들을 이어나가는 방식으로 난이도가 높아 굉장히 곤혹스러웠습니다.
- 이미지 라이브러리 사용해본 경험을 소개해주세요.
- 이미지 라이브러리를 직접 만들어본다면 메모리관리를 어떻게 해야할까요?
- 커스텀뷰 구현해본 적 있다면 방법과 경험을 소개해주세요.
- View 그려지는 라이프사이클을 설명해주세요.
- Touch가 부모/자식으로 이어지는 순서가 어떻게 될까요?
- 디자인패턴 사용해본 경험 있다면 소개해주세요.
- HTTTPS vs HTTP의 차이를 설명해주세요.
- HTTPS SSL 핸드쉐이킹 플로우를 설명해보세요.
- dp의 개념을 설명해보세요
- dp를 사용하면 모든 디바이스에서 동일한 크기로 보여지나요?
- pending intent가 무엇인지 소개해주세요.
- width, measured width의 차이가 무엇인가요?
- RxJava에서 Observable, Flowable 차이가 무엇인가요?
- RxJava에서 Flowable은 어떻게 사용하는 것인가요?
- RxJava에서 merge, concat, zip 차이를 설명해주세요.
- 코루틴을 사용해보셨나요?
- 여러개의 비동기를 동시에 처리해서 결과를 한꺼번에 보여주려면 어떻게 해야할까요?
- 액티비티가 무엇인가요?
- 프래그먼트는 무엇인가요?
- 프래그먼트 매니저와 트랜잭션이 어떻게 동작하는지 설명해주세요.
- intent가 무엇인가요?
- 모바일 앱의 화면 가로로 돌리면 무슨일이 일어나는지 설명해주세요.
- AAC LiveData와 ViewModel 이 무엇인지 설명해주세요.
- VidwModel이 아닌곳에서도 LiveData를 사용할 수 있나요?
- List를 shuffle하는 방법을 설명해주세요. (라이브코딩)
- 제네릭은 무엇인가요 언제 사용하나요?
- GC의 동작원리와 WeakedReference를 설명해주세요.
- WeakedReference는 GC가 돌 때 반드시 메모리에서 해제가 되나요?
- 클린아키텍처가 무엇인가요?
- 최근에 들은 컨퍼런스는 무엇인가요?
- 트러블슈팅사례를 소개해주세요.
- SurfaceView와 TextureView를 각각 소개해주세요.
- kotlin에서 String.contains()의 시간 복잡도가 어떻게 되나요? 이것을 O(logN) 으로 해결할 방법이 있을까요?
- ConstraintLayout의 장점과 RelativeLayout과의 차이를 설명해주세요.
- 안드로이드 비동기 플로우를 구현할 수 있는 방법들을 소개해주세요.
- WorkManager가 무엇인지 소개해주실 수 있나요?
- ViewBinding과 Databinding의 차이를 설명해주세요.
- Data binding 의 단점이 무엇인가요?
- 프래그먼트를 왜 사용하나요? 화면이 하나일때도 프래그먼트를 사용하는 이유가 무엇일까요?
- Jetpack Room 을 소개해주세요
- git-flow를 설명해주세요
- BDD와 TDD의 차이를 설명할 수 있나요?
- TDD를 할 때 사용한 프레임워크가 있나요?
- 사용해본 Jetpack 라이브러리를 소개해주세요.
- Navigation Component 트러블슈팅 사례를 소개해주세요.
- 화면전환 되었을 때 프래그먼트가 어떻게 되는지 설명할 수 있나요?
- 전환된 프래그먼트에서 다시 돌아올 때 결과(Result)를 어떻게 넘겨주었나요?
- 메모리 해제됐을 때 데이터 어떻게 관리했는지, 저장하려면 어떻게 해야하는지 소개해주세요.
- 스타일, 테마 관리 (AppCompat, Material, System 차이)
- 팀원과의 갈등을 어떻게 해결했는지 소개해주세요.
- ArrayList가 JVM에서 어떻게 내부 구현되어있는지 소개해주실 수 있나요?
- Java와 비교했을 때 Kotlin의 장점을 소개해주세요.
- Kotlin Java 상호운용에서 유의할 점이 있다면 설명해주세요.
- Dagger DI vs Koin ServiceLoader 차이를 설명해주세요.
- ViewModel의 Lifecycle Owner 를 무엇을 사용하나요?
- LiveData의 setValue vs postValue의 차이를 설명할 수 있나요?
- MainThread에서 postValue 호출하면 바로 표시가 되나요?
F회사
- 업종 : 소셜커머스
- 지원채널 : 원티드
- 프로세스 : 앱 사전과제 -> 실무 면접 -> 임원 면접
사전과제로 일주일간 간단한 앱 하나를 개발하는 과제를 받았습니다. 간단한 API 통신으로 목록을 조회와 몇가지 기능을 포함한 앱 개발을 개발하는 과제였습니다. 면접에서는 주로 평이한 안드로이드 기술 관련 질문들이 많이 나왔습니다. 이전에 진행했던 면접 복기 덕분에 무난하게 대답할 수 있었던 것 같습니다. 다만 회사의 상황이 저하고는 맞지 않아서 실무 면접으로 끝났습니다.
- 혹시 어떤 회사로의 이직을 원하시나요? 원하는 회사의 모습을 설명해주세요.
- 담당한 프로젝트/업무 소개해 주세요
- MVVM 패턴의 장단점을 설명해주세요.
- 클린아키텍처를 적용하면서 어떤 장단점이 있었나요?
- RxJava Observable, Maybe, Single, Completable 의 차이를 설명해주세요.
- 클린아키텍처에서 고수준, 저수준이 어떤 것인시 설명해 주실 수 있나요?
- 클린코드의 SOLID 원칙에서 D가 의미하는 것이 무엇인가요?
- 사용해본 디자인패턴을 소개해주세요.
- 기억에 남는 트러블슈팅 사례를 소개해주세요.
- Looper, Handler 가 각각 어떤 의미인지 설명해주세요.
- Activity 간에 데이터 주고받는 방법을 설명해주세요.
- Constraint Layout 장단점을 설명해주세요.
- 안드로이드 액티비티에서 상태/값을 저장하고 싶을때 어떻게 하나요? (onSavedInstance)
- 화면회전 일어날 때 데이터 보존하려면 어떻게 해야할까요?
- Bundle이 무엇인가요?
- 함수형 언어에서 객체를 Immutable 하게 다뤄야 하는 이유
- ANR 언제 왜 발생했나요? 발생한 사례가 있나요?
- Android targetApi를 19 에서 22로 올린다고 한다면 어떻게 대비해야 할까요?
지원 결과
결론적으로 이력서 최종본을 다 쓰고 최종합격 통보를 받기까지 두달이 걸렸습니다. 여기에 적지 않은 회사도 6곳이 더 있지만 면접 질문이 중복되는 경우가 많아서 생략했습니다. 사실 이번에 붙은 회사보다 떨어진 회사가 더 많았습니다. 핏이 안맞는 경우도 있었고 실력이 부족했던 경우도 많았고 면접은 잘 봤는데 찔러보기라 생각했는지 떨어진 회사도 있었습니다. 사실 예상했던 결과에도 실망하기도 하고 또 그 와중에 합격한 곳이 있으면 기뻐서 정말 일희일비하면서 체력적으로도 감정적으로도 고된 기간이었습니다.
아무튼 결론적으로는 다행히도 원하던 회사에 합격할 수 있었습니다.
저는 스스로가 운이 좋았다
라고 생각하는데 원하는 회사가 가진 능력을 잘 봐주었고, 부족한 부분은 관대하게 넘어가 주었기 때문입니다. 현재는 만족해하면서 좋은 동료들과 함께 열심히 회사에 적응하려고 노력하고 있습니다. 새로운 곳에서 더 많은 성장의 기회를 통해 앞으로도 꾸준히 성장하는 개발자가 되고 싶습니다.