Showing Posts From

명의

개발팀은 '나'입니다: 한 명의 개발자가 모든 기술 스택을 통째로 담당하면 생기는 일

개발팀은 '나'입니다: 한 명의 개발자가 모든 기술 스택을 통째로 담당하면 생기는 일

개발팀은 '나'입니다 풀스택, 그 달콤하고 위험한 말 대표님이 면접 때 했던 말이 있다. "개발팀은 풀스택으로 구성할 거예요. 비용도 절감되고, 유연성도 있고. 다행히 당신이 React도, Node.js도, AWS도 다룰 수 있으니까." 그렇게 시작됐다. 나 혼자가 곧 개발팀이 되는 악몽. 세상에 풀스택 개발자는 많다. 근데 "풀스택이니까 다 해줄 수 있겠네"라고 생각하는 대표는 특이한 종류의 희귀동물이다. 처음엔 괜찮다고 생각했다. 자유롭다. 누가 간섭하지 않는다. 내가 하고 싶은 기술 스택으로 서비스를 만들 수 있다. React 쓰고 싶으면 쓴다. Node.js 쓰고 싶으면 쓴다. AWS 아키텍처도 내 맘대로다. 하지만 3개월 후. 아이디어가 나온다. "이 기능, 프론트에서 바로 처리할 수 있게 해줄 수 있어?" 끝나지 않는 요청. React. 라우팅 로직 추가. 상태 관리 수정. 컴포넌트 분리. 근데 API가 아직 안 나왔다. "API는?" 오늘 만든다고 했으니까. Node.js. Express 라우터 4개 추가. 데이터 유효성 검사 로직. 에러 핸들링. 근데 DB 스키마를 먼저 확인해야 한다. PostgreSQL에 테이블이 있나? 마이그레이션을 해야 하나? PostgreSQL. 기존 테이블 수정. 새 칼럼 추가. 인덱스 생성. 마이그레이션 스크립트 작성. 어제 데이터는 어떻게 처리하지? 데이터 정합성 체크. Docker. 로컬 개발 환경에서는 잘 되는데 운영 서버에서 왜 안 되지? 이미지 다시 빌드. 볼륨 마운팅 설정 재확인. AWS. S3에 파일 업로드? CloudFront 캐시 무효화? RDS 스토리지 거의 찼다고? 우린 아직 초기 스타트업인데. 프리티어는 이미 끝났고. Figma. 아 맞다, 기획팀이 없다. 대표가 그린 스케치를 보고 "이게 뭔데?" 하다가 기획자처럼 일한다. Figma 열어서 와이어프레임 그린다. 그리고 그 와이어프레임대로 코딩한다. 디자인시스템은? 없다. 한 시간이 지났다. 기능 하나가 끝났다. 기획자는 없다. 디자이너는 없다. QA는 없다. DevOps는 없다. 데이터베이스 관리자는 없다. 다 나다.하루의 흐름 (왜 이렇게 길까) 10시 출근. 아니, 이건 출근이 아니라 사무실 도착이다. 슬랙을 본다. 새벽에 온 메시지 23개. "이거 확인해주세요", "버그 났어요", "이거 언제까지 돼요?", "시간 있으시면 이것도". 대표님의 "좋은 아침입니다 :) 이것만 꼭"로 시작된 메시지들. 밤새 자지 못했다. 어제 배포 후 장애가 났으니까. 새벽 2시까지 버그 추적했다. DNS 캐싱 이슈였다. 역시 AWS다. 기획자가 요청사항 정리를 해달란다. 기획팀이 없으니까 개발자인 내가 한다. 스프레드시트 열어서 "이 요청들 우선순위 어떻게 해요?" 라고 물어본다. 대표 답장은 3시간 후. 오전 11시. 드디어 코딩을 시작한다. 프론트. 상품 목록 페이지 레이아웃이 이상하다. "왜 이렇게 나와요?" 라고 본부장이 물어본다. 아, 이건 백엔드 API가 데이터를 이상하게 준 거다. API 가서 체크한다. API. 조회 로직을 다시 본다. 쿼리가 복잡하다. PostgreSQL에서 직접 실행해본다. 근데 이상하다. 데이터가 중복으로 나온다. 조인 로직을 다시 짠다. 이번엔 뭐가 빠졌다. 서브쿼리를 추가한다. 점심 12시 30분. 밥을 먹으면서 AWS 콘솔을 본다. 이번 달 비용 추세를 본다. 또 올랐다. 왜 EC2가 이렇게 비싼 거야? RDS도 스토리지 비용이 장난 아니다. 프리티어를 벗어난 지 8개월. 스타트업 자금은 런웨이가 6개월 남았다고 했는데. 오후 1시. 대표가 온다. "이거 좀 봐주시겠어요? 경쟁사가 이렇게 했는데, 우리도 이렇게 할 수 있어?" 화면을 보여준다. 자동 추천 기능이다. "네, 할 수 있지만 시간이 걸릴 텐데요." "오늘 중으로 할 수 있어? 내일 투자자한테 보여주고 싶어." 오늘은 이미 할 일이 8개 있다. 근데 "오늘 중으로"라는 말을 들으면 할 수 없다는 건 없다. 그냥 밤새면 된다. "네, 해보겠습니다." 오후 2시부터 저녁 6시까지 4시간. Node.js에서 추천 로직을 짠다. 머신러닝은 아니고 단순 카테고리 기반 추천이다. 근데 한 번에 잘 안 되니까 여러 번 수정한다. PostgreSQL 쿼리도 최적화한다. SELECT 문이 점점 길어진다. 오후 6시. React에서 추천 섹션 UI를 만든다. 대표가 준 스크린샷을 보고 Figma에 그린 후 코딩한다. 컴포넌트는 재사용할 수 있게. 상태 관리는 Redux로. 캐싱은? 나중에 하자. 오후 8시. 밥을 먹지 않았다. 컵라면을 먹는다. 모니터 앞에서. 저녁 9시. 배포한다. Docker 이미지 빌드. AWS ECR에 푸시. ECS 서비스 업데이트. 롤아웃 안정성 설정 확인. 뭔가 느렸다. 이미지가 너무 크나? 역시 npm 의존성 문제다. 저녁 10시. QA를 누가 하나? 나다. 직접 기능을 테스트한다. 이 상품이 왜 추천돼? 저 상품은 왜 안 나와? 기준이 맞나? 다시 로직을 본다. 수정. 저녁 11시. 배포. 다시. 밤 12시. 대표에게 "완료됐습니다" 메시지. 스크린샷 2개 첨부. "오! 대박! 완벽한데요? 이거 내일 투자자한테 보여줄게. 고마워요!" 좋다. 내 일이 쓸모가 있다는 걸 느낀다. 근데 피곤하다. 밤 1시. 이제 어제 미루던 일을 한다. 리팩토링. 기술 부채 정리. 근데 시간이 없다. 새벽 2시. 자야 한다. 내일도 있으니까. 새벽 2시 30분. 여전히 깨어있다. 코드 리뷰를 받은 적이 없어서 내 코드가 맞는지 모른다. 다시 본다. 괜찮은 것 같은데? 아니면 이게 나쁜 건가? 모르겠다. 새벽 3시. 자러 간다. 새벽 4시. 휴... 또 뭔가 터진 거 같다. 슬랙 알림음. "서버 응답이 이상해요!" 일어난다. 노트북을 든다. 기술 부채는 눈덩이다 처음 3개월은 빨랐다. React 컴포넌트도 깔끔했다. API도 체계적이었다. PostgreSQL 마이그레이션도 계획적이었다. 하지만 요청이 늘었다. 시간이 줄었다. 기획도 변했다. React는 이제 상태 관리가 엉망이다. Redux 스토어에 뭐가 들었는지 모른다. Props drilling도 많다. 컴포넌트는 500줄짜리가 여럿 있다. 분리해야 하는데 시간이 없다. 새로운 기능을 먼저 추가해야 한다. Node.js는? API가 겹친다. 같은 데이터를 조회하는 엔드포인트가 3개다. 왜 3개나 있는지 기억이 안 난다. 지워도 되나? 뭐가 쓰나? 모른다. 그냥 둔다. PostgreSQL. 마이그레이션 스크립트가 10개 쌓여있다. 언제 적용했는지 모른다. 데이터가 정합하나? 체크해본 적이 없다. 인덱스가 있나? 슬로우 쿼리? 모른다. AWS RDS 성능 인사이트를 보면 경고등이 켜져 있다. "데이터베이스 로드가 높습니다." 뭐 어떻게 하라는 건지. Docker. 로컬에서는 도는데 서버에선 왜 안 돼? 환경 변수 때문인가? 볼륨 마운팅? 메모리 리미트? 복잡하다. AWS. 다양한 서비스를 쓰고 있는데 왜 이렇게 비싼가. 비용 최적화를 해야 하는데 어디서 시작해야 할지 모른다. Reserved Instance? 스팟 인스턴스? 자동 스케일링? 일단 대기만 한다. Figma. 디자인이 왜 계속 바뀌지? 사람마다 기대하는 디자인이 다르다. 코딩해놨는데 "이거 아닌데요" 하면 다시 한다. 코드리뷰는? 없다. 누가 해주나. 내가 짠 코드가 맞는지 틀린지 모른다. 그냥 잘 도는 것 같으니까 넘어간다. 나중에 문제가 터진다. 테스트 코드? 없다. 자동화 테스트? 없다. 수동 테스트만 한다. 배포 전에 "이거 제대로 도나?" 손가락 꼽으면서 기도한다. 기술 부채는 이렇게 쌓인다. 한 장의 종이처럼. 시간이 지나갈수록 두꺼워진다. 얇을 때 치워야 하는데, 계속 새로운 기능을 추가해야 하니까 못 본다. 어느 순간 눈덩이가 된다. 굴러간다. 멈출 수 없다.혼자라는 것의 위험성 개발자가 여럿이면 코드리뷰를 한다. 내가 짠 코드가 이상한지 정상인지 누군가 본다. 버그는 일찍 잡힌다. 나는 그게 없다. 어제 PostgreSQL 쿼리를 짰다. N+1 문제가 있었나? 조인을 좀 더 효율적으로 할 수 있었나? 누가 봐주지 않으니까 모른다. 그냥 도는 것 같으니까 배포한다. 4일 후. 성능이 떨어졌다. 응답 시간이 5초다. "왜 이렇게 느려요?" 라고 대표가 묻는다. 쿼리를 다시 본다. "아, 이거 좀 비효율적이네." 수정한다. 2초로 내려간다. 좋다. 근데 이걸 처음부터 안 했어야 했다. 휴가를 못 간다. 서비스가 터질까봐. 장애 알림이 올까봐. 휴가를 가도 핸드폰을 손에서 놓지 못한다. 슬랙을 계속 본다. "괜찮나?", "에러는 없나?". 여행지에서 5명이 묵는 에어비앤비에서 혼자 노트북을 켠다. 부다페스트에 갔을 때. 발리에 갔을 때. 그 때도. 회사에서 배우려는 기술이 있다. 새로운 프레임워크. 데이터베이스 최적화. 아키텍처 디자인 패턴. 공부하고 싶다. 근데 언제 하나? 유튜브에서 강의를 찾는다. 책을 산다. 읽는다. 한 장이면 졸린다. 피곤해서. 멘토가 없다. 내가 짠 아키텍처가 맞나? 의견을 나눌 사람이 없다. 대표는 기술을 모른다. 동료 개발자도 없다. 혼자 판단한다. 그리고 나중에 후회한다. "이건 이렇게 했어야 했는데." 면접을 본다. 새 개발자를 뽑아야 한다. 6개월째 공석이다. 근데 누가 면접을 본다? 나. 이력서를 읽고, 전화면접을 하고, 기술면접을 한다. 시간이 없는데. 채용공고를 내도 반응이 없다. 혼자 개발 중인 스타트업. "앞으로도 혼자겠겠네요" 라고 생각하는 개발자들이 많다. 실제로 그럴 거다. 그러면 내가 더 많이 한다. 혼자니까. 야근 문화도, 기술 선택도, 모든 게 이미 정해져 있다 11시에 출근한다. 원래는 9시였는데, 새벽 2시까지 일하니까 11시 출근을 하기로 했다. 하지만 정한 건 말일 뿐이다. 화상회의가 10시에 있으면 10시에 나간다. 장애가 밤 3시에 터지면 3시에 일어난다. 야근 문화? 없다. 문화라는 건 선택의 여지가 있을 때 말이다. 나는 할 일이 많으니까 자동으로 야근한다. 주말도 마찬가지다. "쉬세요!" 라고 대표가 말한다. 신경 써줘서 고맙지만, 쉴 수 없다. 장애가 터질까봐. 서비스가 느려질까봐. 일요일 밤 11시에 슬랙 알림이 울리면? 노트북을 든다. 그것뿐이다. 기술 선택도 내가 한다. React? 당연히. 나는 React를 잘 안다. 새로운 프레임워크를 배울 시간이 없다. Node.js? 당연히. JavaScript를 하나의 언어로 통일하면 편하다. 누군가 이견을 제시할 사람이 없으니까. PostgreSQL? "왜 이거 골랐어?" 라고 물어볼 사람이 없다. 그냥 관계형 DB가 필요하니까 PostgreSQL. 이 선택들이 맞나? 모른다. 더 좋은 대안이 있나? 있을 수 있다. 근데 배울 시간이 없다. 그냥 현재 스택으로 계속 간다. 기술 부채처럼 아키텍처 부채도 쌓인다. 스타트업이니까 빠르게 움직여야 한다. 그건 맞다. 근데 "빠르게 = 나 혼자 다 한다"는 방정식이 언제부턴가 생겼다. 대표와 나. 둘 다 이 방정식을 받아들였다. 누가 먼저 제안한 건지는 모르겠다. 어쨌든 지금은 이렇게 돌아간다. 연봉 4800만원, 그리고 스톡옵션 0.5% 연봉을 협상했을 때, 나는 이 모든 일을 할 줄 몰랐다. "풀스택이니까 연봉을 4800으로 제시할게요." 시장 가격은 5500에서 6500 사이였다. 나는 1000 이상을 내려줬다. 스타트업이니까. 초기 기업이니까. 그리고 주식 0.5%를 받기로 했다. 주식의 가치를 계산해봤다. 회사의 현재 평가액이 50억이라고 치자. 0.5%는 2500만원이다. 근데 지금은 의미가 없다. 상장하거나 인수될 때 의미가 생긴다. 그 확률이 얼마나 될까? 스타트업의 10%만 성공한다고 한다. 우린 어느 쪽일까? 연봉 4800에서 세금 떼고 나면 3600 정도다. 서울 월세 80만원, 생활비 150만원, 통신비, 보험. 남는 게 얼마나 될까? 많지 않다. 동기들은 어디 가 있을까? 대기업 분석가: 연봉 6500, 보너스 있음, 의료보험 완벽, 퇴직금, 휴가 자유로움. 네이버 개발자: 연봉 6800, 자유로운 휴가, 기술 커뮤니티 활발, 코드리뷰 문화 있음. 당신 회사 개발자: 연봉 5800, 딱 11시간 근무, 장애 지원팀 있음. 나? 연봉 4800, 24시간 온콜, 코드리뷰 없음, 휴가 못 감. 아직 3년 경력인데. 근데 떠날 수가 없다. 왜냐하면 서비스가 터질 것 같으니까. 내가 떠나면 누가 하나? 대표도 코딩을 안 하고, 다른 개발자도 없다. 책임감이 있는 건지, 아니면 그냥 정신없는 건지 모르겠다.내일은 어떻게 될까 사직서를 작성했다. 세 번이나. "안녕하세요. 개인적 사유로 사직을 신청합니다." 지우고 다시 저장했다. 세 번이나. 떠나면 뭐가 될까? 처음 한 달은 좋을 것 같다. 쉴 수 있으니까. 책도 읽고, 영화도 보고, 연애도 해보고. 두 번째 달. 불안하다. 이 회사 또 망했나? 알림을 켠다. 뉴스를 본다. 뭐가 나왔나? 세 번째 달. 후회한다. "내가 떠난 후 어떻게 됐을까?" 궁금하다. 동료들에게 연락한다. "어떻게 되고 있어요?" 결국 이직할 거다. 근데 이 회사는? 역설적으로, 나 때문에 서비스가 잘 도는 거다. 내가 모든 기술 스택을 이해하고, 버그를 빨리 잡고, 기능을 빨리 추가한다. 효율적이다. 대표 입장에선. 근데 나한테는 지옥이다. 이걸 어떻게 해결할까? 개발자를 더 뽑는다. 그럼 교육에 시간이 걸린다. 기존 코드를 설명해야 한다. 온보딩 과정. 그 시간에 새로운 기능은 더디다. 대표는 불만족한다. 아니면 내가 더 견딘다. 내년도, 그 다음 해도. 언제까지? 몰라. 혹은 영리하게 한다. 문서화한다. 아키텍처를 정리한다. 코드를 정리한다. 점진적으로 다른 개발자가 들어올 준비를 한다. 그럼 시간이 걸린다. 하지만 결국 그게 맞다. 근데 할 시간이 없다. 주 5일 중 4.5일을 버그 수정하고 기능 추가하는데 쓴다. 나머지 0.5일은 AWS 비용 확인하고, 배포 설정 확인하고, 슬랙 처리하는데 간다. 문서화할 시간은 없다. 악순환이다. 오늘 저녁도 야근할 거다. 내일도. 모레도. 언제쯤 변할까? 아마도 다음 중 하나:회사가 자금 부족으로 망한다. 나의 건강이 악화된다. 새로운 개발자가 들어온다. 내가 사직한다.어느 것이 먼저 올까? 요즘 따라 건강검진 결과가 자꾸 떠오른다. "스트레스 지수: 높음" "수면 부족: 주의" "혈압: 약간 높음" 30살도 안 됐는데. 이게 평생 이렇게 갈까? 아니다. 언젠가는 바뀔 거다. 분명히. 하지만 오늘은 아니다. 오늘도 야근한다.내일은 좀 나아지겠지. 아마도.