뒤로가기
성장은 계단형이다

July 12, 2023

essaycareer

입사 후 처음 6개월은 매일이 성장이었다. Git을 처음 써보고, React 컴포넌트를 처음 만들고, PR을 처음 올리고, 코드 리뷰를 처음 받고. 매주 "이번 주에 이런 걸 새로 알았다"고 말할 수 있었다. 회사 가는 게 재미있었다. 새로운 걸 배우는 속도가 체감될 정도로 빨랐으니까. 월요일이 싫지 않았다. 출근하면 배울 게 있었다.

그러다가 어느 순간 멈춘 것 같은 느낌이 왔다.

정체기라는 늪#

대략 입사 8개월 차쯤이었다. 매일 하는 일이 비슷해졌다. 컴포넌트 만들고, API 연결하고, 스타일링하고, 코드 리뷰 받고. 스프린트가 시작되면 JIRA 티켓을 가져와서 처리하고, 스프린트가 끝나면 회고하고, 다음 스프린트가 시작된다. 새로 배우는 건 없고 반복만 하는 느낌. 회사에서 시키는 일은 할 수 있는데, 그렇다고 실력이 느는 것 같지는 않았다.

이때가 제일 힘들었던 것 같다. 성장하고 있다는 느낌이 사라지면 일이 그냥 노동이 된다. 아침에 일어나서 "오늘도 같은 일이겠지" 하는 생각. 코드를 치는데 뭔가 기계적인 느낌. 복붙에 가까운 작업이 많아지고, 도전적인 이슈는 시니어한테 가고, 나한테 오는 건 "여기 텍스트 변경해주세요", "이 페이지에 필터 추가해주세요" 같은 것들. 물론 이것도 필요한 일이지만, 성장하고 있다는 실감이 없었다.

주변에 말하기도 애매했다. "일이 힘들어"는 아니었고, "일이 재미없어"도 정확하지 않았다. 그냥 "제자리인 것 같아"라는 감각. 이걸 이해해주는 사람이 많지 않았다. "그래도 월급 받잖아"라는 말이 돌아올 뿐이었다.

TIL을 쓰려고 해도 쓸 게 없는 날이 늘어났다. "오늘 배운 것: 없음." 이런 날이 일주일에 3-4번이었다. 그러면 자연스럽게 "나는 왜 성장을 안 하지?"라는 질문이 따라온다.

계단을 발견한 순간#

정체기가 한 3개월 정도 지속됐다. 그러다가 팀에서 새 프로젝트가 시작됐다. 기존 레거시 페이지를 Next.js App Router로 마이그레이션하는 작업이었다. Server Component 개념이 처음이었고, 기존 클라이언트 사이드 상태 관리 로직을 서버 쪽으로 옮기는 게 처음에는 감이 안 잡혔다. "서버에서 렌더링하는데 useState를 못 쓴다고? 그러면 인터랙션은 어떻게 하지?"

근데 막상 부딪히니까, 정체기 동안 반복했던 기본기가 발휘됐다. 컴포넌트 설계 패턴이 손에 익어 있었다. 100번 넘게 만들어본 리스트 컴포넌트, 폼 컴포넌트, 모달 컴포넌트. 데이터 페칭 흐름도 감으로 알았다. useEffect 안에서 API 호출하고, 로딩/에러/데이터 상태 관리하는 패턴이 자동으로 나왔다. 에러 핸들링도 여러 번 겪어봤으니까 "이 경우엔 이렇게 처리해야지"가 바로 떠올랐다.

새로운 개념인 Server Component를 흡수하는 속도가 예전보다 훨씬 빨랐다. 기본기가 탄탄하니까, 새 개념이 기존 지식 위에 얹어지는 느낌이었다. 정체기처럼 느껴졌던 그 시간이 사실은 기본기를 다지는 시간이었던 거다.

일주일 만에 서버 컴포넌트 패턴이 익숙해졌고, 2주 만에 다른 팀원한테 설명할 수 있게 됐다. 3주째에는 팀 내 가이드 문서를 썼다. 이때 처음으로 "아, 성장이 계단형이구나" 하는 걸 몸으로 느꼈다. 평평한 구간이 한참 이어지다가, 갑자기 올라가는 순간이 오는 거다.

두 번째 정체기#

한 번 경험했으니까 다음은 좀 편할 줄 알았는데, 아니었다. 두 번째 정체기는 좀 다른 형태로 왔다.

기술적으로는 꽤 다양한 걸 할 수 있게 됐다. React, Next.js, TypeScript, 상태 관리, CSS-in-JS, 테스팅. 근데 "깊이"가 없다는 느낌이 들었다. 이것저것 할 줄은 아는데, 뭔가 하나를 깊게 파고들었다는 확신이 없었다. 시니어한테 질문을 받으면 "대충은 아는데 정확히는 모르겠어요"라는 대답이 많아졌다.

React의 reconciliation 알고리즘이 정확히 어떻게 돌아가는지. 브라우저 렌더링 파이프라인에서 reflow가 언제 발생하는지. 번들러가 tree shaking을 어떻게 하는지. V8 엔진이 JavaScript를 어떤 단계로 처리하는지. 겉핥기로만 알고 있었다. 면접에서 물어보면 한 문장은 대답하겠는데, "더 자세히 설명해보세요"라고 하면 말문이 막힐 수준.

이 정체기는 더 길었다. 한 4-5개월. 회사 일은 잘 돌아가는데 개인적인 성장감은 제로에 가까웠다. 일은 할 수 있지만 배우는 건 없는 상태. 이게 생각보다 고통스럽다.

정체기에 한 것들#

첫 번째 정체기 때는 그냥 버텼다. 특별히 한 건 없고, 시간이 지나다 보니 새 프로젝트를 만났다. 운이었다. 두 번째는 운에 맡기지 않고 조금 다르게 접근했다.

일단 깊이가 없다고 느끼는 주제를 하나 골랐다. 브라우저 렌더링. 이걸 제대로 이해하면 프론트엔드 성능 최적화의 근간이 되니까. 출퇴근 시간에 관련 아티클을 읽었다. MDN 문서를 영어로 읽고, 크롬 DevTools 퍼포먼스 탭으로 실제 프로젝트를 프로파일링해봤다. web.dev의 Core Web Vitals 문서를 처음부터 끝까지 읽었다.

체감 성장은 없었다. 한 달 동안. 그냥 "읽었다"는 사실만 남았지, 실력이 는 느낌은 없었다. 정보가 머릿속에 들어오긴 하는데, 그게 실력으로 전환되는 느낌이 아니었다. 솔직히 이때 그만두고 싶었다. "이거 해봤자 뭐가 달라지나" 하는 생각. 퇴근 후에 힘들게 공부하는데 아무런 보상이 없는 느낌.

그런데 어느 날 팀 미팅에서 성능 이슈 논의가 나왔다. 특정 페이지가 느리다는 CS가 들어왔는데, 시니어가 "레이아웃 쉬프트가 문제일 수 있다"고 했을 때 내가 바로 알아들었다. 예전이면 "레이아웃 쉬프트가 뭐였지?" 하고 검색했을 텐데, CLS가 뭔지, 어떤 CSS 속성이 reflow를 유발하는지가 머리에 있었다. 거기서 내가 직접 DevTools 퍼포먼스 탭을 열고, Layout Shift 이벤트를 찾아서, 원인이 이미지 로딩 후 사이즈 변경이라는 걸 밝혔다. widthheight 속성을 명시하고 aspect-ratio를 추가하는 PR을 올렸다.

시니어가 "오 잘 찾았네"라고 했을 때, 그 한 달이 헛되지 않았다는 걸 느꼈다. 또 계단을 하나 올라간 거다.

선형을 기대하면 괴롭다#

돌이켜보면, 정체기가 괴로운 이유는 성장이 선형일 거라는 기대 때문이었다. 매일 조금씩, 꾸준히, 우상향. 그래프로 그리면 대각선. 유튜브나 블로그에서 "매일 1% 성장하면 1년 후에 37배"라는 말을 많이 하는데, 현실은 그렇지 않았다.

현실은 한참 평평하다가 갑자기 올라가고, 또 평평하다가 갑자기 올라가는 계단이었다. 평평한 구간에 있을 때는 "나만 멈춰 있나?" 싶은데, 사실은 올라갈 준비를 하고 있는 거다. 그 준비라는 게 반복, 독서, 삽질, 실패 같은 눈에 안 보이는 것들이라서, 진행 중인지 멈춘 건지 구분이 안 된다. 다만 그걸 그 순간에 알기는 어렵다. 지나고 나서야 "아, 그때 쌓고 있었구나" 하고 깨닫는다.

지금 세 번째 정체기인 것 같다. 설계와 아키텍처 쪽. 코드 레벨에서는 어느 정도 자신이 생겼는데, 프로젝트 전체를 어떻게 구조화할지에 대해서는 아직 감이 없다. 시니어가 "이 기능은 이 레이어에 두는 게 맞다"고 할 때, 이유를 설명해달라고 하면 답이 "경험상"이다. 그 "경험상"을 쌓는 중인데, 언제 계단이 올라갈지는 모르겠다.

모르겠으니까 그냥 계속 한다. 지금까지 두 번 올라갔으니까, 세 번째도 올 거라는 희망이 있다. 희망이라기보다는, 경험에 기반한 기대라고 하는 게 맞겠다. 이번에도 어느 날 갑자기 "아, 이래서 이렇게 설계하는 거구나" 하는 순간이 올 거라고 믿는다. 근거는 없다. 다만 전에 두 번 그랬으니까.

가끔 주니어 개발자 커뮤니티에서 "요즘 성장하는 느낌이 안 들어요"라는 글을 본다. 댓글에 "이것저것 해보세요", "사이드 프로젝트 하세요" 같은 조언이 달리는데, 그것보다는 "원래 그렇다"고 말해주고 싶다. 정체기는 실력이 멈춘 게 아니라, 다음 계단을 준비하는 시간이다. 체감이 안 되서 괴로운 거지, 실제로는 무언가가 쌓이고 있다. 적어도 내 경험은 그랬다.