토요일, 4월 23, 2022

[B급 프로그래머] 내가 지금껏 봤던 최고의 엔지니어링 면접은?

최근에 코테(코딩 테스트)가 많은 회사에서 선택이 아닌 필수가 되면서 피로도도 높아지고 난이도고 올라가고 머리도 아프고 무용론까지 제기되는 상황이다. 코딩 테스트 자체는 기초적인 실력을 평가하는 과정에서 나쁘지는 않다고 생각하지만 문제와 답이 정해져있고 풀이 방법도 어느 정도 정형화되어있기에 변별력을 유지하기 위해 어쩔 수 없이 까다로워질 수 밖에 없는 상황이다(이러다 DP(Dynamic Programming, 동적 계획법)가 1번 문제로 등장할지도 모르겠다는 생각을... ㅠㅠ). 솔직히 DP가 코테 문제로 나온다고 해서 현업에서 바로 DP를 적용할 기회가 얼마나 될지는 정말 잘 모르겠다. 컴퓨터 성능이 좋으니 그냥 단순 무식하게 순차적으로 계산하거나 아니면 병렬로 돌려버리는 편이 오히려 더 빠를 수도 있으니 말이다.

그래서 개인적인 생각으로는 코테만으로 모든 것을 평가하는 대신 조금 더 실전에 가까운 문제를 출제하면 어떨까 하는 생각이 든다. 아마 처음으로 입사해서 작성한 프로그램은 다들 기억에 생생할 것이다. 나의 경우에는 스크립트 언어를 해석하는 가상 머신을 특정 프로그램에서 분리한 다음에 다른 프로그램에 사용할 수 있게 모듈화하고 여기에 SQL 관련 새로운 외부 명령을 추가하는 일이었다. 우여곡절 끝에(진행되는 이야기를 풀면 무척 재미있지만, 라떼가 될까봐 여기서 중략) 완성했는데, 이렇게 대다수 현업 업무들이 기존에 있던 뭔가를 추려내고 수정하고 확장하는 행위와 연관이 있으므로 인터뷰 문제도 이런 식이면 현실과 무척 유사할 것이다. 물론 너무 특정 분야에 밀접하거나 현업 문제를 바로 들고오면 신입 사원들이 불리해지는 문제점이 있기에 이를 어떻게 조율할지가 관건이다.

그런데 최근에 The best engineering interview question I’ve ever gotten, Part 1라는 글을 읽게 되었는데, 면접 문제가 바로 오픈소스 캐시 소프트웨어인 memcahced에 특정 명령어를 하나 추가하는 것이다. 정확한 문제는 다음 설명을 보자:

Via its incr and decr commands, memcached provides a built-in way to atomically add to a number. But it doesn’t provide other arithmetic operations; in particular, there is no “atomic multiply by ” operation. Your programming challenge: Add a mult command to memcached.

간단하게 요약하자면, 위 면접 문제는 3시간 동안 memcached에 원자적인 mult 명령을 추가하는 것이다! 그냥 맨 땅에 해딩하는 것이 아니라 memcached에서 기존에 원자적인 증감(incr과 decr)이 있기 때문에 이를 토대로 확장하면 된다. 즉, 현업에서 하는 일과 상당히 유사해진다.

이어지는 글인 The best engineering interview question I’ve ever gotten, Part 2를 보면 어떻게 문제를 풀어나가야 하는지 기술적으로 차근차근 설명한다(길지는 않으므로 한 번 읽어보면 재미있을 것이다). 또한 면접자들의 성향을 분석한 결과를 다음과 같이 세 가지로 나눈다.

  • 유형 1: 더하기가 있으니 반복하면 곱하기가 되겠네요! 이미 incr이 있으니 이걸 여러 번 부르는 루틴을 만들어서... 그리고는 토끼굴로 빠져서 결국 문제를 풀지 못한다
  • 유형 2: 더하기가 있으니 기존 incr을 복사해서 붙여넣고 곱하기가 동작하게 바꾸면 되겠네요! 어떻게든 문제를 푼다.
  • 최고의 후보자: 단순히 동작하는 데 만족하지 않고 포매팅을 맞추고 단위 테스트를 추가하고 설계 결정을 다시 한번 살펴보는 등 제출한 내용을 다듬는 데 시간을 투자한다

이렇게 면접자들의 유형을 나눌 수 있기 때문에 이런 유형의 인터뷰가 좋기도 하지만, 마지막 결론 부분에서 이런 인터뷰가 좋은 이유를 추가로 기술한다.

"저는 이런 프로그래밍 도전을 좋아합니다. 왜냐하면 현업에서 겪은 실제 프로그래밍의 축소판이기 때문입니다. 대규모 코드베이스를 유지 관리할 때 완전히 이해하지 못하는 코드 경로, 불필요하다고 느끼는 관용구, 그리고 기반을 구축하기 어렵게 느껴질 수 있는 대량의 코드가 항상 존재하기 마련입니다."

여러분들도 현업에서 사용 중인 오픈소스 코드에서 이렇게 수정하거나 확장하는 문제를 만들어내어 풀 수 있겠는가? 한 번 도전해보기 바란다. 그리고 잘 되면 한 번 면접에 적용해보면 좋겠다.

EOB

댓글 없음:

댓글 쓰기