실무 개발자에게 알고리즘은 덜 중요할까? (2)

김준형
11 min readJun 13, 2017

어떤 분께서 내 글에 대한 반론이 있는 페이스북 글과 OKKY 링크를 Response로 주셔서 생각에 없던 2번째 글을 쓰게 되었다. 좀 신랄하고 장황하게 쓰다보니 행간에 대한 오해가 있거나 진의가 왜곡된 부분들이 있는 것 같지만, 굳이 의미없는 내용들을 모두 정독한 후 조목조목 반박하고 싶지는 않고 … 거짓 정보를 포함하여 간단히 몇 가지만 짚고 넘어가 보려고 한다(그렇다고 짧지는 않다).

  1. 내가 말한 자료구조와 알고리즘은 CS 수업의 그 알고리즘도 포함하고, 화이트보드 인터뷰나 Hackerrank, Leetcode와 같은 Problem Solving도 포함한다.
    우리가 수학을 배우는 이유는 1+1이나 구구단을 배우는 한정된 목적이 아니다. 교과과정에서 내세우는 수학을 배우는 가장 주된 이유는 바로 논리력 함양이다. 자료구조와 알고리즘이 중요한 이유는 바로 코드를 작성할 때 데이터를 어떻게 정의하고 탐색하고 선별하고 가공해야 하는지에 대한 사고력의 근간이기 때문이다. 단순히 트리가 어떻고 퀵소트가 어떻고 하는 것만 배운다고 생각한다면 정말 잘못된 생각이다. 데이터를 어떻게 정의하고 처리할 것인가에 대한 사고방식을 익히는 것이 자료구조와 알고리즘이다.
  2. 그렇다면 나는 왜 첫번째 글에서 그들을 모욕 했을까?
    그것은 그들의 행동이 정말 나쁘다고 생각하기 때문이다(이건 고의성 여부를 떠나 결과론에 입각한 평가이다). 물론 그들이 악당이 아닐 수 있다. 하지만, 심리적 자기방어 기제의 하나로 자료구조와 알고리즘을 폄하하는 것은 사실이다. 그리고 그 현실 왜곡을 가능성 넘치는 주니어들에게 주입하는 우를 범한다.
    이러한 방어 기제의 주요 목적 중 하나는 자기보다 똑똑할지도 모르는 주니어들 앞에서 자존심을 세우기 위함이다. “나는 비록 논리적 사고는 너만큼 뛰어나지 않지만, 너보다 구현은 훨씬 잘해. 그런데 현업에서는 구현이 훨씬 더 중요해. 그러니까 잘난체하며 날 우습게 보지마.”라는 경고를 보내는 것이다. 모든 개발자가 평등하게 알고리즘(1번의 의미)을 잘 할 수는 없다. 그리고 모든 코드가 수리적 효율성을 요구하는 것도 아니다. 하지만, 그렇다고 알고리즘이 덜 중요해 지는 것은 아니다. 어떤 사람들은 ML이나 3D엔진, 코덱 등을 다뤄야 하기에 알고리즘 및 수학과 가까울 수 있고, 어떤 사람들은 앱이나 서비스 프로그래밍을 하면서 피부에 와닿지 않게 느낄 수도 있다.
    우리는 아무도 주니어들이 어떤 가능성을 가지고 어떻게 성장할 수 있는지에 대해 전혀 예측하지 못한다. 지금 모바일앱 UI의 픽셀과 RGB를 조정하는 산업기능요원이 소집해제 후에는 구글에서 ML을 할 수도 있다. 그들이 하는 충고를 전혀 받아들이지 않았다면 말이다. 인생 선배이자 성숙한 성인으로써의 역할은 주니어들이 자신의 한계까지 높이 갈 수 있도록 응원하고 이끌고 밀어주는 것이지 다리를 잡아 끌어 바닥에 주저 앉히는 것이 아니다.
    생각해 보자. 한국어로 말하기/듣기만 잘하면 생활에 문제 없다고 한글 읽기/쓰기는 덜 중요하다고 자신있게 말할 수 있는가? 학교에서는 읽기/쓰기보다는 똑바로 말하는 법에 더 신경써서 애들 졸업시키면 좋겠다는 주장에 수긍할 수 있겠나?
    어른들 말씀에 배움에는 때가 있다고 했다. 앞선 글에서 밝힌 바와 같이 경력이 높아질수록 회사에서의 역할과 기대, 나이와 체력, 부양해야할 가족 때문에 따로 공부하기 쉽지 않다. 그래서 주니어 시절에 더더욱 기본을 탄탄히 해야 한다.
    벽에 부딪혀 힘들어 하는 사람들에게 “괜찮아, 알고리즘 잘 못한다는게 무능한 것도 아니고 부끄러워할 일도 아니야.”라고 하는 사람은 다정한 사람이다. “이거 보면 좀 더 쉬워.”라며 자기가 보던 책 던져주는 사람은 공대생이다. 그리고 더 나아지기 위해 의욕에 불타는 사람들에게 “웃기지말고 구현이나 똑바로 해. 구현도 못하는게 알고리즘 따위로 허세나 부리고 있어.”라고 하며 꺽어버리는 사람은 나쁜 사람이다.
    그들이 정말 성숙하고 똑똑하고 겸손한 사람이라면, “나는 실력이 모자라지만, 존경받는 개발자들은 대부분 자료구조와 알고리즘이 중요하다고 말하니 너도 열심히 공부해서 뛰어난 개발자가 되렴.”이라고 하는게 나의 상식에서는 정상이다. 인터넷에서 잘난체하며, 물어보지도 않았는데 “자료구조 알고리즘 그거 실제로는 별로 안 중요해.”라고 허세떠는 것이 아니고…
    그들이 악당은 아닐 수 있다. 그러나 별로 존경할 가치도 없는 얕은 지식과 경험으로 충고라고 인터넷에서 저런 헛소리 늘어놓는 것은 잘못된 행동이다. 그들은 주니어들에게 커리어를 망칠 수 있는 매우 위험한 신호를 보내고 있다.
  3. 구글의 알고리즘 테스트에 대하여…
    조목조목 반박하지 않겠다고 했지만, 상기 링크한 페이스북 반박글에서 3,4번은 짚고 넘어 가야겠다. 전형적으로 아는게 Zero면서 아는척 하는 글이다. 소프트뱅크벤처스코리아를 포함해서 90억 이상 투자 받고, US 오피스도 있다는 회사의 CTO라는 프로필을 달고 있는 사람이 저런 소리를 하는 것을 보고 현웃 터졌다. 정말 개발자 채용 프로세스에 1도 관심이 없구나라는 것이 부끄럽도록 적나라하게 드러난다. 그리고 이게 아직 우리나라 스타트업 수준인가에 대해 깊은 회의가 들었다.
    이 글을 읽는 분들 중 구글의 알고리즘 인터뷰 방식과 그 의미에 관심이 있다면, 아래 설명이 조금은 도움이 될 것이다.
    구글의 그리고 페이스북과 아마존을 포함한 실리콘밸리의 (지금은 한국에서도 많이 하고 있는) 알고리즘 인터뷰는 절대로 아름다운 알고리즘을 얼마나 외우는지 보는게 아니다. 시중에 코딩인터뷰 책 한권이라도 떠들어 봤다면 저렇게 불쌍할 정도로 무식한 소리는 하지 않았을텐데…
    알고리즘 인터뷰가 시작되면, 면접관은 데이터와 해결해야 할 문제를 포함한 몇 가지 조건들을 준다. 다만, 이 조건들은 대부분 완벽하지 않다. 대부분은 필수 요소 몇 가지가 빠져있으며, 때로는 아무 쓸모없는 조건들이 함께 있을 때도 있다. 이 조건들을 질의응답을 통해 문제 정의 가능한 수준으로 정리해야 한다. 그리고 나면 그 문제를 해결하기 위해 어떤 전략을 사용할 것인지를 설명한다. 면접관과 문제 해결 전략과 솔루션의 공간복잡도 및 시간복잡도 등에 대해 토론한 뒤 정리가 되면 구현을 시작한다. 이 때, 면접관이 내가 생각하지 못한 예외 케이스들을 자꾸 제시해서 코드 수정이 잦아지면 인터뷰는 200% 망했다고 보면 된다. 합격하려면 일반적으로 코드가 한번에 완성되어야 하고, 그렇기 때문에 구현 전에 토론과 함께 주의 깊게 전략을 완성해야 한다. 일반적으로는 그렇게 문제 풀이가 끝나지만, 구글은 종종 해당 문제에서 데이터셋의 스케일이 매우 커졌을 때에 대한 질문을 던진다. 현재 솔루션으로 확장된 데이터 규모에 대응 가능한지, 그렇지 않다면 이유가 무엇인지, 그럼 어떤 방식으로 더 큰 규모의 데이터를 처리할 수 있는지에 대해 솔루션을 요청한다. 이 때, 인터뷰 내용은 구글 내부에서 실제로 처리하는 업무의 인터뷰 버전일 가능성도 있다. 다시 강조하지만, 알고리즘 인터뷰는 절대 당신이 얼마나 아름다운 알고리즘을 외우고 있는지 보려는 것이 아니라 당신의 커뮤니케이션 능력과 논리적 사고력을 보고 싶어하는 것이다.
    Homebrew 개발자가 올린 그 트리소팅은 당시 센세이션이 되어서 나도 풀어보았다(트리를 복사하지 않고 좌우대칭으로 뒤집기였던 것으로 기억한다 — 공간복잡도 O(1), 시간복잡도O(n)). Leetcode에 있던 문제였고, 나정도 하수도 10분만에 종이에 손으로 풀어서 한번에 정답판정 받았다. 그 쉬운 문제를 틀렸다면 탈락이 당연하다. 멍청했다기 보다는 성의가 없었던 것으로 보인다. 그가 유능한 실무자일 수도 있겠지만, 구글은 절대 들어오면 안되는 사람을 거르는 것을 잘하는 사람을 뽑는 것보다 중요하게 생각한다. 즉, Homebrew 개발자가 Tree 문제를 풀지 못해서 탈락한 것은 구글의 인터뷰에 구멍이 있다는 증거가 되지 못한다.
    나에게 더 큰 웃음을 준 것은 그 다음 주장인데, “나는 알고리즘이 그만큼 중요하기 때문이라기보다는 더 나은 대안이 아직 딱히 없기 때문이라고 생각한다. (중략) 알고리즘 테스트는 실제 알고리즘이 정말 중요하기 때문에 일반화 되었다기 보다는 단지 그게 면접 방식으로 제일 효율적인 방법이었기 때문에 일반화된것이 아닌가 하는 가설을 가지고 있다.”라고 말한다. 내가 한국말이 미숙한건지 모르겠지만, 알고리즘 해결 능력이 다른 대안이 없을 정도로 확실하게 인터뷰이의 능력을 보장할 정도로 효율적인 지표라면 결국 평가 가능한 항목 중 개발자에게 가장 중요한 능력이라는 말과 동치가 아닌가? 대안이 없을 정도로 가장 효율적인데 중요하지는 않다? 뭐, 이건 말장난 같으니 이 정도로 넘어가자.
    옛말에 ‘잘 모르면 가만히 있던가…’라는 주옥같은 말씀이 있다. 가설이라니… 그 유머 넘치는 CTO에게 Work Rules(번역판: 구글의 아침은 자유가 시작된다)를 읽어보기를 권해주고 싶다. 구글은 자신들의 알고리즘 평가와 업무의 상관 관계에 대해서 여러번 밝힌 바가 있다.
    구글의 HR은 매우 과학적이고 꼼꼼하게 구성원들의 조건 및 환경(출신학교, 인터뷰 결과와 업무 성과, 추천인의 특성과 합격의 상관 관계)과 업무의 상관관계에 대해 추적한다. 인터뷰 설계도 이와 같이 데이터에 의존한 실험과 보정에 의해 발전시켜 간다.
    구글 HR의 10여년이 넘는 채용 데이터 상으로 알고리즘 인터뷰 결과와 채용 후 업무 성과에는 뚜렷한 연관성이 있으며, 오히려 면접관이 주요 변인으로 작용하기 때문에 면접관의 인터뷰 트레이닝(일반적으로 알고리즘 인터뷰는 일반 개발자가 한다)을 더욱 강화해서 인터뷰 결과와 합격결과를 토대로 채용후 성과의 예측을 강화하는 것이 최근 구글의 행보이다. 즉, 구글의 채용 데이터는 알고리즘 문제 해결 능력이 실제 업무 성과와 직접적으로 관련이 있다는 것을 확신하고 있다.
    또 다른 한가지는 구글은 매년 Codejam을 개최하는데, 개발자의 과거 Codejam 성적과 업무 성과의 관계를 추적해보았다고 한다. 재미있는 것은 1~1000등 사이에서는 순위와 성과 우위에 대한 의미있는 상관성이 없었다고 한다. 그러나 1000등 이상과 1000등 이하 그룹의 업무 성과에 대한 차이는 뚜렷하게 나타났다고 한다. 만약, 1000등 단위로 구간들을 나누어 추적해 본다면, 계단 현상처럼 각 구간별로 비슷한 결론들이 도출될 것으로 기대된다.
    결국 알고리즘 해결 능력이 직접적으로 업무 성과와 관련이 높으며, 이는 세계 최고 수준의 코드 구현을 하는 구글에서 보장하는 것이므로, 코드 구현 능력을 개발하는 것이 자료구조 알고리즘을 이용한 문제 해결 능력보다 중요하다는 주장은 전혀 신뢰할 수 없다.

그 외에 이상한 말들이 많이 보이지만, 이 정도 사실관계도 파악하지 못하는 사람이 정확한 이해를 바탕으로 내 글에 대해 논리적 반박과 비판을 펼쳤다고 보기는 어려울 것 같아 이 정도만 언급한다.

다만, 쐐기를 박고 싶은 것은 알고리즘 해결 능력의 근간은 학술적인 자료구조와 알고리즘이며, 이를 통해 데이터를 체계화하고 효율적으로 처리하는 문제 해결 능력이 길러지므로 결국 학술적인 자료구조와 알고리즘을 학습하는 것 역시 중요하다고 말하고 싶다.

자료구조와 알고리즘이 왜 중요한지, 왜 타인에게 자료구조와 알고리즘이 덜 중요하다고 인터넷에 방송하는 사람들을 비난 하는지, 그 이유를 내 부족한 능력 안에서 최선을 다해 정리한 것 같다. 더이상 쓸 말은 없을 듯 …

두번의 글의 목적은 이 글을 읽게 될 주니어들에게 CS Fundamental이 요구하는 핵심은 우리가 IT를 더 잘 이해하고 빠르고 정확하게 문제를 해결할 수 있는 사고력을 제공하기 위한 것이며, 당장의 눈 앞의 구현에 매달려 자신의 가능성을 닫지 말라는 당부를 하고 싶기 때문이다.

현재의 당신이 10년 뒤 어디에서 어떻게 일하고 있을지는 그 누구도 장담할 수 없다. 그러나 편협한 경험을 근거로 자료구조와 알고리즘이 일반적인 실무와 괴리되어 있다는 주장을 하는 사람들 중 그 반대의 입장에 있는 사람들보다 실무 개발자로 뛰어난 사람들은 내가 겪은 사람들 중 하나도 없었다.

공학이라는 것은 가정과 실험, 결과를 통해 대화해야 하며, 우리는 이미 왜 자료구조와 알고리즘이 우리에게 중요한지에 대해 너무나도 명확한 근거들을 인터넷에서 접할 수 있다. 그러나 이러한 끊임없는 왜곡이 일어나는 이유는 그런 주장을 하는 사람들은 그것이 자신들이 사는 세계가 아니라고 믿고 있기 때문이다. 그리고 여러분도 자신들과 같이 그 세계의 주민이 아니라고 생각하기 때문이기도 하다. 하지만 그것은 여러분을 기만하는 것이다. 여러분은 무한한 가능성을 가지고 있고, 그들보다 더 나은 곳에서 멋진 일들을 할 수 있다. 나는 IT에서의 성취는 비교적 우리의 노력에 정직하게 보답해 준다는 사실을 보증해 주고 싶다.

당장에 그들 말대로 구현에만 매달리다 보면 여러분은 향후 그 어떤 좋은 SW 회사에도 입사할 수 없을 것이다. 좋은 SW 회사들은 알고리즘 인터뷰를 보기 때문이다. 그러나 최소한 인터뷰만을 위해서라도 지금 당장 공부를 시작한다면, 아마 내면에서 어떤 깨달음을 느끼기 시작할 것이다. 그리고 그런 회사에 합격해서 비슷한 관문을 통과한 사람들과 함께 일하며 더 높은 곳으로 전진하다 보면 무엇이 더 중요한지 자신만의 답을 찾을 수 있을 것이다. 어쩌면 “알고리즘은 인터뷰만을 위한 것이고 실무에는 구현 능력이 더 중요해.”라는 결론에 도달할 가능성도 있다. 그렇지만 절대 그렇지 않을 것이라고 확신하며 글을 맺는다.

--

--