[단상] leetcode에서 배우는 것들

2021. 4. 17. 04:22과학문명/컴퓨터

이제는 한국 사람들도 많이 알게되었고, 나 역시 자주 참여하는 코딩 대회 사이트로 leetcode 가 있다. 개인적으로는 꽤 초창기에 알게 되었는데 본격적으로 이 사이트들의 코딩 문제를 풀게 된 것은 2020년 가을 부터였다.

사실 Job searching 으로 유명한 linkedin 에서는 이 사이트를 통하여 인터뷰 질문에 대비를 하라고 공식적으로 추천을 하고 있는데, 근래 우연히 한 사이트에서 아래와 같은 기사를 흥미롭게 읽었다.

요약하면, 

1) 알고리듬과 자료 구조의 중요성을 알게 된다.

2) 언제나 나보다 많이 알고 있는 사람이 있다는 것을 깨닫는다.

3) 프로그램을 짤 때 edge-case 에 대한 연습을 할 수 있다.

4) 열심히 하는 것이 재능보다 중요하다는 것을 깨닫는다.

5) 계획을 세우는 것이 Software 개발의 필수적인 부분임을 깨닫는다. 

라는 이야기이다.

이 글을 저자의 말대로 500 문제를 풀고 나서 느낀 것이라니까, (최근에 나역시 500 문제를 넘게 되었고 ) 어느 정도 객관적인 평가가 가능한 자격이라고 믿는다.

사실 위의 이야기는 다소 피상적인 감상이라는 생각이 들었다. 여전히 실제 상황에서는 알고리듬보다 중요한 가치를 지닌 여러가지 지식과 기술들이 필요하고 알고리듬의 고수만이 모든 것을 해결할 수 있는 절대자는 아니다.

단지 (위의 글의 저자와 다르게) 내가 스스로 뼈저리게 느낀 점들은 다음과 같다.

1) (자신이 사용하는) 주 언어에서 제공하는 표준 API에 대하여 깊이 있게 알게 된다.

나 역시 20년 넘게 코딩을 하고 있으면서 (내가 사용하는 주 언어가 자바이든 C이건 간에 상관없이) API를 통해 주어진 표준 함수들을 최대한 이용하려고 하는 태도보다는, 스스로 자주 "새로운 것을 만들려고 하는 경향이 있다"는 것을 대회를 통하여 체감했다. 이는 팀으로 일하는 경우 매우 비 경제적인 결과를 초래할 수 있다.  실제로 내가 최근에 참석했던 한 프로젝트에서는 Javascript 로 한 요구사항을 해결하는 함수를 짜야하는 경우였다. 내가 50 line 에 걸쳐서 나름대로 잘 돌아간다고 자부하던 코드를, 코드 리뷰를 하던 나의 tech lead가 API 에 있는 다른 함수들을 이용해서 10 줄 이내로 과감하게 고치는 것을 옆에서 보고 얼굴이 빨개졌던 기억이 생생하다. 실제로 (대부분의 경우) 성능 차원에서도 내가 만든 함수가 (그 언어에서 제공되는) 표준 함수보다 좋기는 매우 힘들다. 그러한 자기만의 코드는 가독성을 떨어뜨린다.

2) 문제 해결을 위하여 실제로 집중해야 할 목표에 대한 명확한 계획을 세우게 된다.

이 부분은 위의 저자가 말한 5) 번째와는 통하는 부분도 있지만, 보다 넓은 의미에서 집중력을 높일 수 있는 훈련이 된다는 점을 말하고 싶다. 만약 우리가 클라우딩이나 DB 를 다룰 때는 코딩과는 상관없이 네트워크와 같은 여러가지 다른 해결해야 하는 문제들이 발생할 수 있다. 단지 내가 해결하려고 하는 문제가 환경적인 요소인가, 아니면 순수한 코딩의 문제인가를 명확하게 인지를 하고 시작하는 것은 매우 큰 차이가 있다.

3) 언제나 (나와는) 다른 의견에 대한 존중을 배울 수 있다. 

이는 앞의 저자가 언급했던 나보다 많은 지식의 개발자와는 다른 맥락에서 이야기하는 것인데, 만약 코딩 대회의 최고 수준의 개발자를 데려와서 만약 그 혼자서 모든 것을 개발한다면 팀이라는 것은 필요가 없다. 당연히 형상 관리를 위한 git 와 같은 도구도 필요 없을 것이다. 처음에는 어느 정도 모양이 나올 수 있겠지만, 큰 규모의 프로젝트를 그 혼자서 할 수는 없다. 또한 최상위 수준의 개발자 몇 명이 모여서 매일 자신이 옳다고 생각만 한다면 그 프로젝트가 성공적으로 끝나기는 매우 쉽지 않을 것이다.

(개인적으로 나보다 높은 수준의 입상자들에게 끊임없이 배우는 것은 맞지만) 단지 내가 코딩 대회에 참석을 하면서 절실히 배우는 것은, 비록 (이번에는 나보다 성적이 낮은 프로그래머라도) 그/그녀가 나와는 다른 생각과 다른 접근 방법으로 접근하려고 했다면, 그러한 아이디어에서 더 많은 것을 배우고 있다는 것을 알았다. 코딩 대화에 나와서 수많은 guru 를 만난다고 하여 자신을 스스로 낮게 생각할 필요는 없다.

4) 팀 단위 프로젝트를 위한 대화에 도움이 될 수 있다.

이는 앞에서 언급한 '다른 의견'과 맥락을 같이 하는 이야기이긴 한데, 지금 부딪힌 문제에 대해서 현재의 나의 수준으로는 풀기가 힘들고 그 경우는 내가 그 언어의 문법을 몰라서가 아니라 문제를 해결해야 할 때 필요한 "어떤" 아이디어나 "사상"이 없는 경우다. 따라서 다른 사람들의 solution 을 자주 읽어야 하는 경우가 많다. 이러한 훈련이 자주 될 수록 상대가 어떠한 의도나 접근 방법으로 문제를 풀려고 했는지 빠르게 이해하는 스스로를 자주 발견하게 되었다.

실제로 실무에서도 문제 해결을 위해서는, 단순하게 코드가 돌아가는 index 나 문법을 물어야 하는 것이 아니라, 도대체 "왜" 그러한 의도로 접근을 하려고 했는지 스스로에게 질문을 해야하고 실제로 그 관점에서 상대의 코드를 자주 읽어야 하는 경우가 많다. 흥미롭게도 이러한 코딩 훈련이 자주 될 수록 어떤 문제를 해결하려고 하는 어떤 시도를 볼 때 전체의 코드 흐름만 보고도 '아, 이 친구는 이런 의도로 접근을 하려고 했구나' 하는 맥락을 빨리 발견하는 훈련이 될 수 있다.

이는 단순한 인터뷰만을 벗어나 실제로 팀으로 일할 때에는 항상 다른 사람의 코드를 다루어야 하기에 큰 도움이 되는 훈련이될 수 있다고 믿는다.

 

 

towardsdatascience.com/five-things-i-have-learned-after-solving-500-leetcode-questions-b794c152f7a1

 

Five things I have learned after solving 500+ Leetcode questions

Why grinding Leetcode is not so bad

towardsdatascience.com