2021. 4. 19. 01:12ㆍ과학문명/컴퓨터
XOR / AND 연산자 문제를 다시 풀어본 후
아침에 어제 밤 대회에 참석하여 풀지 못한 XOR과 관련된 4번 문제를 다시 천천히 풀어보고 많은 생각을 하게 되었다.
특히 가끔 기회가 있을 때마다 고등학생들의 수학을 가르치면서 (초등학생 때 배워야 하는 더하기/곱하기의 교환/결합 법칙을 잘 모르는 학생들에게) 교만하지 않았나 하는 반성도 했다. 내가 짠 코드가 O(N * N)의 속도로 for-loop 의 순환을 돌면서 메모리 초과와 TLE(Time Limit Exceeded)에 걸려서 결국은 대회가 끝나고 다른 사람의 코드들을 분석하면서 나의 실수와 부족한 점들을 찾았다.
어제 대회 직후에는 reduce / xor 과 같은 간단한 함수를 못 찾아서 놓쳤다고 생각했는데, 오늘 아침에서야 reduce 를 사용하지 못했던 것은.. reduce 함수의 존재를 몰라서가 아니라...AND 와 XOR 연산자의 교환/결합 법칙이 성립하는 것을 뼈저리게 깨닫지 못했기 때문이었다는 것을 깨달았다.
처음 시작하는 사람들은 어떻게 "어려운 새로운 지식"에 접근해야 하는가
사실 이 이야기는 우리가 어떻게 "어려운 새로운 지식에 접근해야 하는가" 하는 보다 원론적인 문제라는 생각이 들었다.
어제 새벽 한 시 가까이 리뷰가 끝나면서, 마지막에 코드 리뷰를 같이 한 H 라는 분이 "나와 친구 Y가 문제를 많이 풀고 있으니까...당분간은 따라잡기 힘들겠다"는 말씀을 하였다. 그 소회를 듣고 무언가 더 부언을 하고 싶었는데... 아침에 4번 문제를 풀면서 그에 대한 답변이 정리가 된 듯하다.
결론적으로 볼 때는 반/반 인 듯 하다.
사실 그렇게 많다고 느껴지지는 않지만, (Y 라는 친구와 그 동안 대화하고 같이 검토하면서 깨닫고) 서로 주고 받은 지식과 경험의 양이 적은 양도 절대 아니다. 만약 어떤 사람이 나와 Y가 경험한 모든 시행 착오를 (아무런 멘토없이) 직접 스스로 경험하면서 해쳐나가야 한다면... 실제로 우리가 경험한 시간만큼 많이 걸리거나, 많은 좌절을 겪을 확률이 매우 높다.
알고리듬을 배우면서 한국 개발자들과 대화한 기억들
내가 본격적으로 알고리듬 문제들을 풀기 시작한 것은 2016년 정도로 기억된다. 그 당시 나는 혼자서 수없이 대회 참석을 하면서 문제들을 풀었는데 거의 향상되지 않는 답답함과 한계를 느꼈다. 그래서 지금은 카카오 톡으로 옮긴 (당시 LG 에서 수석 개발자로 있던) L 이라는 분을 대회 사이트에서 연락처를 찾아 몇 번 전화까지 하며 방법을 자문을 받았었다. 사실 그때 막연하게 어떻게 해야하는지 어둠 속에서 희미한 불빛 같은 것을 느꼈다.
그리고 비슷한 시기에, 내가 한국에서 근무했던 삼성 SDS의 친했던 후배 K와 대화를 하면서 느낀 것이기도 하다. 그 친구는 한국에서 세간에 좋다는 SKY 대학 중 S 대 전산과를 나와서 같은 회사에서 지금 수석 개발자로서 생활하고 있다.
그 친구와 한참을 이야기하면서 그 회사도 이런 코딩 실력에 대한 중요성이 대두되어 회사 내 시험도 보고, 교육도 시켜주고 하는데 (본인도 S대 전산과를 나왔지만) 사내 자격 시험은 몇 번 떨어지고 1년 만에 필요한 성적만으로 통과했다고 한다. 그리고 대학도 나오지 않았다고 하는 '흔히들 고수라고 하는' 한 외래 강사가 강의하는 알고리듬 대회에서 사용하는 기술 세미나를 참석한 적이 있다고 한다. 그 후배의 기억은 "무언가 생각하는 것이 완전히 다른 부류의 사람" 같았다는 것이었다.
실제로 매우 겸손하면서 또한 성실하고 뛰어난 개발자인 그 친구의 이야기는 매우 음미해서 들을만 한 이야기였다.
스스로 완전 초보로 시작한 알고리듬 지식들
사실 놀랍게도 내가 근래 모임에서 스스로 세미나 발표를 한 DP 문제 중 LCS(Longest Common Subsequence) 는 2016년, 그러니까 5년 전 내가 혼자서 알고리듬을 공부하면서 노트정리까지 했던 것을 최근 발표 준비를 하면서 알게되었다. 솔직하게 하나도 기억에 나지 않았다. 기억 나지 않는 정도가 아니라 오히려 시간 낭비하고 있었다는 것을 깨달았다.
모든 지식은 그 지식을 습득하기 위한 훈련 방법이 있다. 언어와 수학, 음악, 그림 그리기 모두에 대하여 수많은 사람들이 시행착오를 겪은 훈련 방법을 무시하면 그는 그 모든 사람들이 실패한 경험을 모두 몸으로 경험해야 할 각오를 해야 한다. 그렇게 해서 배울 수 있다면 다행이지만, 그것은 운도 따라야 한다.
물론 수영을 배우기 위해 수많은 입문서를 읽는 것이 나중에 배우면서 간적접인 도움이 될 수는 있겠지만, 수영을 배우기 위해서는 물 속에 뛰어들어서, 물 안에서 느끼는 수많은 느낌 속에서 보완을 해나가는 것 밖에는 왕도가 없다. 내가 말하고 싶은 것은 처음 접할 때 느끼는 두려움과 혼동, 그리고 어떻게 시작할 지 조차 모르는 불안감 마저도 배워야 하는 부분이다.
다른 사람을 통해 배울 수 밖에 없는 부분
계속해서 효과적인 훈련 방법에 대해서 이야기해보자.
내가 지금까지 연습하고 깨달은 지식 중, 가령 예를 들어 설명하면 (Trie 를 통해서 풀어야 효과적인) 문제들을 바라보는 직관과 핵심적인 논리들은 의외로 많지 않다. 하지만, 정말 그것을 글로 쓰면 몇 페이지가 되고, 다시 그것을 읽는 사람들은 다시 나의 글을 읽고 나의 의도를 파악하고 따라오는 지난하고 '지겨운' 과정을 거칠 확률이 크다. (그런 의미에서 나는 시간이 지날 수록 책의 가치에 대한 반신반의 한다)
하지만 내가 정확하게 아는 알고리듬 부분 중 (그것이 Trie 든, BFS, Priority Queue 이든, DP 영역이건 간에) 다른 분이 헤매고 있다면, 내가 헤맸던 시간의 2-30% 내에서 내가 아는 핵심적인 부분들을 연습시켜줄 수 있다.
이것은 비단 나만 해당하는 것이 아니라, 명확하게 아는 선임자와 같이 일을 하는 후임자들이 처한 상황이기도 하다. (물론 별 것 아닌 지식을 감추는 선임자의 까다로운 성격이나, 너무나 쉽게만 배우려고 하는 후임자의 태도들은 다른 문제이기는 하다.)
그래서 가장 효율적인 방법은 (먼저 경험한 사람과 따라오는 사람들이 비교적 원만한 태도의 자세를 갖추었다고 가정할 때) 결국 확실하게 먼저 경험해서 아는 사람과 자주 대화하는 것이다.
어제도 4 문제 중 2문제를 풀고 나머지는 Priority Queue 와 XOR 문제에 대한 요구사항을 이야기하면서, Stable Sort 에 대한 이야기까지 주제가 넓혀졌는데 전혀 이러한 문제를 시도하지 않았던 H 라는 분은 이 3가지 모두에 대한 감을 명확하게 잡았다는 느낌을 받았다. 아마도 이런 지식의 질과 양은 절대 학교 교실에서 배울 수 있는 것이 아니다.
따라오는 사람은 결국 선임자를 추월할 수 밖에 없다. 단지 필요한 것은 결심이다.
아마도 내가 H 분의 이야기를 듣고 말하고 싶은 것은 바로 이 부분이다. 아마도 다른 것에 관심이 있으면 당분간은 시간이 걸린다. 하지만 일단 결심을 하고 자주 대화에 참여하다보면 우리가 경험한 모든 시행착오와 Best Practice 의 경험을 전해 받는 것은 단지 "시간 문제"이다.
하지만 보다 근본적인 문제는 .. 그러한 것을 같이 공유할 수 있는 사람이 주위에 널려 있지 않다. 그리고 그들과 시간이 맞을 수 있는 것도 잠깐이다. 이러한 면에서 볼 때 인생의 가장 중요한 부분은 타이밍이고 그것은 "운"의 영역인 듯 싶다.
'과학문명 > 컴퓨터' 카테고리의 다른 글
[단상] leetcode에서 배우는 것들 (0) | 2021.04.17 |
---|---|
[단상]Dynamic Programming 에 대하여 (0) | 2021.01.30 |
[문제] 3가지 조건을 만족하는 문자열 변경 (0) | 2021.01.27 |
[문제후기] leetcode-1647 (0) | 2020.11.08 |
Fenwick 알고리듬(3) (0) | 2020.09.18 |