2024-07-08 내부 구현을 열어보며, 아이처럼 배우기

2024-07-08
  • Article

1. 동심에 대해 생각하기

이 이야기를 어떻게 시작하면 좋을지를 조금 고민하다가, 이런 문장으로 운을 띄워보려 한다.

“동심을 잃지 않고 아이처럼 배우기. 그것을 어떻게 지속할 수 있을지를 고민하기.”

처음 개발 블로그를 만들던 시절, 훗날 동심에 관한 이야기를 개발 블로그에 적게 될 줄은 몰랐을 것이다. 하지만 나는 앞으로 점점 더 많은 ‘동심’과 ‘즐거움’에 대한 이야기를 하게 될 것만 같다. 하지만 동심이란 과연 무엇일까?

올해 초, M님과의 커피챗 자리에서 당시 나의 고민을 이야기 한 적이 있다. 한 1년 조금 넘게 오픈소스 프로젝트들의 내부 구현들, 예를 들면 ReactNext.js, Tanstack Query, Yarn 같은 것들의 Github 레포지토리를 들락거리며 책에서는 가르쳐주지 않는 많은 것들을 배웠는데, 앞으로는 어떤 것들을 해나가야 다음 단계로 갈 수 있을지 모르겠다는 내용이었다.

정답이 없는 이야기임에도 M님은 성심껏 대답을 해주셨는데, 대략 1) 종택님이 생각하는 뛰어난 개발자는 무엇이라고 생각하는지 2) 막연히 오픈소스를 뜯어보기 보다는 왜 그걸 해야 하는지에 대해 자문해보는 게 어떻겠냐 같은 내용이었던 것 같다.

사실 그 즈음 회사에서 굉장히 바쁘게 만들고 있던 새 제품에 몰두하느라 더 이상의 고민을 이어나가지는 못했다. 어떻게 하면 기능을 빠르게 추가하면서도 프로젝트를 안정적으로 유지보수 할 수 있는 구조를 만들 수 있을까 골몰하느라 다른 주제로 고민할 정신적인 여유가 없었다.

폭풍 같은 시간이 흘러가고 약간 쿨다운 하는 시점에서 문득 돌아보니 내 안에서 ‘성장에 대한 강박’의 흔적을 발견할 수 있었다.

2. 유레카!

커리어에 대한 고민으로 위코드에서의 마지막 시간이 다가오고 있음을 직감하고 있던 21년 중순 쯤, D님과의 대화에서 얻은 단서들로 당시의 나로써는 커다란 성장의 엔진을 달게 되었다.

부끄러운(사실은 지금은 별로 안 부끄러운) 이야기이지만 당시 나는 프론트엔드 개발자로서 온전한 개발 프로세스를 경험해보지 못한 상태였기 때문에 온전한 1인분의 개발자가 되기 위한 ‘성장의 공식’에 대단히 목이 말라있던 상황이었다. 몇몇 자바스크립트 책을 읽거나 <리팩터링> 같은 책도 읽어봤지만 이걸 한다고 해서 나의 이유 모를 갑갑함이 해결될 것 같지는 않았다.

그 때 D님이 해줬던 얘기 중, Yarn에 문제가 있는거 같으면 Yarn Github에 들어가서 코드를 보고 문제를 파악한 뒤, 업스트림에 문제가 있으면 이슈를 리포트하고 PR을 올린다는 이야기가 당시 내게는 세 가지 이유에서 너무도 충격적인 이야기로 다가왔다.

  • Yarn이 자바스크립트로 만들어진 프로젝트였어? (대충격)

  • 그걸 고쳐서 PR로 올려서 업무 상 겪은 문제를 해결한다고?

  • Github 들어가서 코드만 읽을 수 있으면 라이브러리들의 마법들을 (이론상) 죄다 알아낼 수 있다고?

특히 세 번째 생각이 머릿속에서 종처럼 울렸던 기억이 난다. 곧장 실행으로 옮기지는 못했지만 여러 차례 시도해본 끝에 이제는 심드렁하게 Github에 들어가서 코드를 열어보는 개발자가 될 수 있었다. 22년도 쯤엔 React Query를, 23년도 여름부터 반년 정도를 Next.js 레포지토리와 트위터를 들락거리는데 들이부어 RSC의 마법이 어떻게 가능한 것인지를 열심히 정리하기도 했다. 올해는 직접 React 내부를 들여다보고 그간 Hydration에 대해 잘못 알고 있던 내용들을 바로 잡기도 했다.

아직 대단한 컨트리뷰트는 못했지만 자잘한 수정(react.dev, react-awesome-query-builder, swr, swr-site)과 컨트리뷰트 각(react.dev, overlay-kit, 요즘은 orval)을 열심히 보며 지내고 있다.

여러 프로젝트의 코드를 들여다보면서 그간 몰랐던 많은 사실들을 알게 되었다. 무엇보다도 어딘가에서 정리해놓은 2차 자료를 기반으로 판단하기보다 내가 직접 들여다보고 눈으로 확인한 바를 기반으로 의사결정할 수 있었기에 기술자로서 자신감을 얻을 수 있었던 것이 가장 큰 변화였다.

하지만 내 실력은 여전히 부족한 것만 같았다. 이 사실들을 안다고 해서 좋은 개발자가 될 수 있을 거란 보장은 없었다. 뭔가 놓치고 있다는 생각에 휩싸이기 시작했다. 성장의 공식이 무너지기 시작한 그게 바로 23년 말, 올해 초까지의 일이었다. 이 이야기의 시점은 다시 지금으로 돌아온다.

3. 성장의 공식에는 유효기간이 있다

지금 생각해보면 당시 내게 필요했던 것은 좀 더 개발자로서 직접적인 성공 경험이었던 것 같다. 이를테면 어떠한 프로젝트를 맡아 바닥부터 깔끔하게 쌓아올리고 유지보수 해나가는 경험 같은 것.

타이밍 좋게도 올해 회사에서 정확히 그 일을 하며 좋은 결과를 얻을 수 있었다. 이제는 내가 적어도 비즈니스 로직을 이상하게 짜서 고통 받을 일은 없지 않겠다는 근거 있는 자신감, 새로운 프로젝트를 시작한다고 했을 때 서툴지만 나만의 Best Practice라 부를 만한 무언가 또한 얻을 수 있었다.

이 프로젝트를 하면서 나는 꽤나 자주 힘들었지만, 그 이상의 즐거움을 느꼈다. 이런 일기를 남기기도 했다.

누차 말하지만 나는 항상 생존의 문제 속에서 쫓기듯 커리어를 밟아왔다. 불안은 줄었지만 쫓기는 건 여전하다. 그래도 최근에는 전반적으로 다른 느낌 속에 살고 있다.

오늘의 내가 꼭 풀어야 하는 문제들을 과거의 성실했던 나 덕분에 하루하루 간신히 풀어내고 있다. 아주 까치발로 간신히. 저 스크린샷 한 장 속 PR 들을 올바른 방식으로 만들어 내기 위해 얼마나 많은 시간 노력하고, 굽이길을 거치고, 그 경험들을 잊지 않기 위해 경험해왔는지 모른다.

정면 돌파가 유일한 구원이라고 생각한다. 일을 시작하고 나서 나는 언제나 나였다고 생각한다. 나의 이유와 나의 생존 방식과 나의 만족과 나의 행복의 기준을 의심하지 말고 지키며 하루하루 흘러갈 뿐이다. 언제나 그렇듯.

그리고 또 미래 언제 쯤의 도움이 될지도 모를, D+1355일이었던 하루 또한 잘 마쳤다. 이제는 꽤 멀리 갈 수 있을 것만 같다. 그런 자신감이 생겼다.

이 날은 회사 프로젝트에 코드 제네레이터를 붙이려다 라이브러리에서 객체 프로퍼티를 카멜 케이스로 변환하는 기능을 온전히 지원하지 않아서 ts-morph를 활용해 직접 구현했던 에피소드가 있었다. 코드 제네레이터를 쓸 수 있었던 덕분에 프로젝트를 빠르게 진행할 수 있었고, 이를 위해 관련 라이브러리들의 Github을 수도 없이 들락거렸다.

앞에서 성장의 공식이 무너지니 어쩌니 했지만 사실 내가 성장함에 따라 내가 풀어야 하는 문제가 변화했을 따름이었다. 풀어야 하는 문제는 변하는데 과거의 공식만 들이대면 오답이 나올 수 밖에 없는 것이다.

나도 무의식적으로 이 사실을 깨닫고 있었는지, 근 1년 정도는 ‘좋은 추상화란 무엇일까’ 라는 질문을 풀기 위해 노력을 기울이고 있다. 최근 내가 나 자신에게 쥐어준 새로운 성장의 공식이다.

4. 낙타에서 사자로, 그리고 아이까지

따져보면 개발만큼 수지타산이 남는 장사가 없다. 일을 하면서도 항상 배움의 기회가 널려 있다는 점에서 그러하다. 처음 개발을 배울 때 나는 정말 아이처럼 기뻐했던 기억이 난다.

화면 상단에서 몬스터들이 비처럼 쏟아지고 키보드로 용사를 움직여서 해치우는 게임을 만들었는데, 조건문과 반복문만 가지고서 이런 걸 만들 수 있다는게 놀라워 까무라칠 지경이었다. 그날 인스타 스토리에 동영상으로 캡쳐되어 올라갔음은 물론이다.

니체는 <차라투스트라는 이렇게 말했다>에서 낙타와, 사자와, 아이에 대해서 이야기 한다. 내가 정확히 설명할 자신은 없어서 GPT에게 물어봤다.

니체의 철학에서 “낙타에서 아이까지”는 그의 저서 “차라투스트라는 이렇게 말했다”(Also sprach Zarathustra)에서 등장하는 유명한 비유입니다. 이는 인간의 정신이 세 가지 변신을 거친다는 내용으로, 각각 낙타, 사자, 아이로 상징됩니다.

  1. 낙타: 순종과 무거운 짐을 지는 존재. 낙타는 사회의 규범과 도덕, 전통 등을 무조건적으로 받아들이고 이를 짊어지고 가는 존재를 의미합니다. 이는 사회의 기대와 규범을 수용하고 따르는 단계를 상징합니다.

  2. 사자: 반항과 자유를 추구하는 존재. 사자는 낙타가 짊어진 짐과 규범을 거부하고, 새로운 자유를 쟁취하기 위해 싸우는 단계를 상징합니다. 이는 기존의 가치를 부정하고, 새로운 자아를 찾으려는 의지를 의미합니다. 사자는 “나는 원한다”라고 선언하며, “너는 해야 한다”라는 용의 상징과 싸웁니다.

  3. 아이: 천진난만함과 창조적인 존재. 아이는 완전한 창조성과 새로운 시작을 의미합니다. 이는 기존의 모든 규범과 가치를 초월하고, 자기 자신만의 새로운 가치를 창조하는 단계를 상징합니다. 아이는 새로운 가능성과 순수한 창조의 정신을 나타냅니다.

그간 낙타에서 사자로 나아가기 위해 많은 노력을 기울이고, 고군분투 해왔던 것만 같다. 하지만 역설적이게도 가장 중요한 것은 ‘과정을 즐기는 것’이 아니었나 생각이 드는 요즘이다.

사실 나는 성장하기 위해 오픈소스 프로젝트들의 내부 구현을 살펴보지 않았던 것 같다. 사실의 사실은 ‘이 마법 같은 일들이 어떻게 일어나는지 알고 싶다’는 것이 진짜 이유였고, 그래서 처음으로 React Query의 내부 구현을 이해하는 데 성공했을 때 온몸에 전율이 흘렀던 것 같다.

말하자면 두 가지의 읽기가 있습니다. 하나는 지금 여기에서의 읽기입니다. 교과서를 읽고, 참고서를 읽고, 자기계발서를 읽고, 주식이나 부동산 투자에 관한 책을 읽고, 육아나 요리에 대한 책을 읽고, 교양을 위해 가벼운 사회학 서적이나 대중심리학 서적을 읽고, 취미에 관한 책을 읽고.. 이것들은 우리를 바깥으로 데려가지 않고, 담을 넘도록 하지 않고 오히려 지금 이곳에 단단히 발붙이게 합니다. 이것을 ‘한낮의 읽기’라고 해두죠.

그렇지 않은 책, 다른 책, 그러니까 어떤 소설이나 시, 그리고 어떤 종류의 철학이나 이론처럼 우리를 어딘가 다른 곳으로 이끌어가는 책들이 있습니다. 이것이 바로 식수가 말하는 읽기죠. 저는 이걸 ‘가장 어두운 순간에 읽기’ ‘한밤의 읽기’라고 부르고 싶어요. 밤에 읽어서가 아니라, 지금-여기를 ‘몰래’ ‘밤으로 바꾸는’ 읽기니까요.

금정연, <한밤의 읽기> 124p

그러니까 우리에게는 그런 읽기도 필요하다는 거죠. 몰래 읽는 책. 단순히 남 보기 부끄러운 책이라서 몰래 읽는 게 아니라, 식수가 말하는 것처럼 세상으로부터 우리를 감춘다는 의미에서 몰래 읽는 책. 몰래 읽기. 전혀 자율적이지 않은 야간 자율 학습 시간에 어떤 고등학생을 지루한 교실에서 긴자 뒷골목 한 귀퉁이에 있는 작은 바 ‘초전도 나이트클럽’으로 데려다주는 읽기. 어린 시절, 엄마가 그만 불 끄고 자라고 하는데도 뒷이야기가 너무 궁금한 나머지 불빛이 새어나가지 않도록 이불을 뒤집어쓰고 손전등에 의지해서 읽는, 그렇게라도 읽을 수밖에 없는 읽기.

금정연, <한밤의 읽기> 124p

일 이외의 이유로 코드를 작성하지 않은지 오래된 것 같다. 나를 온전히 즐겁게 하는, 과정으로서의 즐거움을 되찾기 위해 아이처럼 배울 수 있는 마음이란 무엇인지 다시 한번 곱씹어보고 싶다.

최근 ‘주말 중 최소 2시간은 반드시 의무가 아닌 순수한 탐구 시간으로 활용해보자’ 라는 프로젝트를 시작했고, 실은 React internal을 들여다 본 내용을 살짝 덧붙이고 싶었는데 분량 조절 실패로 다른 글에서 따로 다뤄야 할거 같다 ㅎㅎ 아무튼 간에 이 시도를 통해 나름의 단서를 찾을 수 있기를 바라며 글을 줄여본다.

Profile picture

saengmotmi

'내가 원하는 건 문학이 아닌 기쁨이다.'