커리어··7 min read

5년 차 개발자의 커리어 터닝포인트

평범한 개발자가 시니어라고 불리기까지, 결정적이었던 세 순간

시니어라는 이름이 어색하다

5년 차가 되니 어느새 "시니어 개발자"라는 직함이 붙었다. 명함에 Senior가 찍혀 나왔을 때, 솔직히 어색했다. 매일 모르는 게 나오고, 삽질하고, 가끔 바보 같은 버그를 만든다. undefined 체크를 빼먹어서 프로덕션에서 에러 터진 게 지난주다.

그래도 돌이켜보면 방향이 바뀐 순간들이 있었다. 계획해서 온 건 아니다. 예상치 못한 상황에서 도망치지 않았을 때 성장이 일어났다.

아무도 안 하려던 레거시를 맡았다

2년 차 때, jQuery와 PHP로 짜인 10년 된 코드를 자원해서 맡았다. 주석은 거의 없고, 변수명이 a, b, tmp1. 파일 하나가 3000줄 넘는 경우도 있었다. 왜 자원했냐고 물으면, 솔직히 주니어라 선택권이 없었기도 했다.

근데 이 경험이 나를 완전히 바꿨다. 남이 짠 코드를 읽는 능력이 폭발적으로 늘었다. 더 중요한 건 "왜 이렇게 짰을까"를 고민하면서 설계 감각이 생겼다는 거다. 10년 전에는 그게 최선이었을 수 있다. 그때의 제약 조건, 기술 수준, 팀 규모를 고려하면 이해가 됐다.

레거시에는 역사가 담겨 있다. 그 역사를 이해하면, 새 코드를 짤 때 "5년 후에 다른 사람이 이 코드를 보면 이해할 수 있을까?"를 자연스럽게 생각하게 된다.

(근데 솔직히 처음 3개월은 코드 읽는 게 고역이었다. 퇴근하면 머리가 아팠다.)

금요일 밤 7시에 장애가 터졌다

3년 차, 결제 시스템이 먹통이 됐다. 분당 수십 건의 결제 실패가 발생하고, CS팀에서 전화가 쏟아지고 있었다. 시니어 두 명이 연락이 안 되는 상황에서 내가 제일 먼저 로그를 봤다. 손이 떨렸다.

APM 대시보드를 보니 DB 커넥션이 풀 한도를 다 차지하고 있었다. 2시간 동안 식은땀 흘리면서 원인을 찾았다. 최근 배포에서 트랜잭션 커밋을 누락한 코드가 커넥션을 잡아먹고 있었다. 임시로 커넥션 풀 사이즈를 늘리고 문제 코드를 롤백했다.

(그 2시간 동안 손이 떨려서 타이핑 미스가 진짜 많았다. 긴급 상황에서 오타 내는 것도 스트레스다.)

주말 내내 근본 해결책을 마련해서 월요일에 배포했다. 그 하루가 3년치 성장을 압축한 것 같았다. 이후로 장애 대응에 자신감이 붙었고, 로그 읽는 법, 모니터링 지표 해석하는 법, 빠르게 원인 좁히는 법을 체득했다. 팀에서 "장애 나면 일단 이 친구한테 연락해"라는 위치가 됐다.

멘토링이 나를 더 성장시켰다

4년 차에 처음 신입 멘토가 됐다. "내가 남을 가르칠 수준인가?" 싶었다. 3년 전에 브랜치 날리던 사람이 남을 가르친다니.

근데 멘티 질문에 답하려고 개념을 다시 정리하면서, 내가 얼마나 얕게 이해하고 있었는지 깨달았다. 클로저를 설명하는데 막혔다. "쓸 줄은 아는데 설명은 못하는" 상태. MDN을 다시 읽고, 예시 코드를 만들면서 비로소 진짜 이해하게 됐다.

가르치는 것이 가장 좋은 학습이라는 말이 빈말이 아니었다. 멘토링 1년 하면서 오히려 내 기초가 탄탄해졌다.

시니어와 주니어의 차이

5년 돌아보니 차이는 코딩 실력이 아니다. 문제 앞에서 당황하지 않고 체계적으로 접근하는 능력, 불확실한 상황에서 결정을 내리는 능력, 팀원을 성장시키는 능력.

코드는 주니어도 잘 짤 수 있다. 최신 프레임워크를 빠르게 배우는 건 오히려 주니어가 나을 수도 있다. 근데 "어떤 코드를 짜야 하는지", "이 기술 부채를 언제 갚아야 하는지"를 판단하는 건 경험에서 나온다.

아직도 매주 삽질한다

지난주에도 Kubernetes 설정에서 2시간을 날렸고, 어제는 TypeScript 제네릭 제약 조건을 잘못 써서 30분을 헤맸다. 그저께는 CSS Grid 속성 하나 때문에 삽질했다. 5년 차라고 다 아는 게 아니다.

달라진 건 모르는 걸 마주했을 때의 태도다. "이것도 모르면 어쩌지"에서 "또 하나 배우겠구나"로.

커리어의 터닝포인트는 계획해서 오는 게 아니었다. 레거시를 떠안은 것, 장애를 홀로 대응한 것, 후배를 멘토링한 것. 전부 불편한 상황이었다.

관련 글