코드 리뷰에서 '이건 안 됩니다'라고 말하기의 어려움

코드 리뷰에서 '이건 안 됩니다'라고 말하기의 어려움

코드 리뷰에서 '이건 안 됩니다'라고 말하기의 어려움 시작은 슬랙 알림 아침 10시. 슬랙 알림이 울렸다. "김 개발님, PR 올렸습니다~ 확인 부탁드려요!" 이모티콘까지 붙어있다. 귀엽다. 하지만 나는 안다. 저 PR을 열면 내 30분이 사라진다는 걸. 커피 한 모금 마시고 깃허브를 켰다.파일 하나에 500줄 첫 줄부터 한숨이 나왔다. public class UserService { // 500줄의 메서드들... }500줄이 한 파일에 있다. 메서드 하나가 100줄이다. if문이 5단 중첩이다. 작동은 한다. 테스트도 통과한다. 효율적이기까지 하다. 하지만 읽을 수가 없다. 나는 스크롤을 내리며 생각했다. "이거 어떻게 말하지?" 후배는 2년차다. 나름 열심히 한다. 야근도 마다 않는다. 근데 코드가 이렇다. 직책이 있으면 쉽다. "팀장 지시사항입니다" 하면 끝이다. 근데 나는 그냥 선임이다. 사실상 테크 리드인데 직책이 없다. 연봉도 별로 안 높다. "이건 안 됩니다" 라고 말할 권한이 애매하다. 댓글 창 앞에서 10분 커서가 댓글 입력창에서 깜빡인다. 뭐라고 쓸까. "이 코드는 가독성이 떨어집니다" - 너무 딱딱하다. "메서드를 좀 더 나눠주시면..." - 너무 약하다. "이렇게 하면 나중에 유지보수가..." - 잔소리 같다. 결국 이렇게 썼다. "수고하셨습니다. 몇 가지 제안 드립니다." 제안. 안전한 단어다. 명령이 아니다. 거절 가능하다.그리고 댓글을 달기 시작했다. "이 메서드가 100줄이 넘어서 한눈에 파악하기 어려울 것 같습니다. 책임별로 나눠보면 어떨까요?" "if 중첩이 깊어서 읽기 어렵습니다. Early return 패턴을 고려해보시면..." "변수명이 a, b, c로 되어있어서 의도를 파악하기 어렵습니다." 댓글 7개를 달았다. 20분이 걸렸다. 말투를 신경 썼다. "하세요" 대신 "하면 어떨까요". "틀렸습니다" 대신 "어려울 것 같습니다". 제출 버튼을 누르기 전에 다시 읽었다. 기분 나쁘게 들리지 않나. 너무 약하게 들리지 않나. 5분 더 고민했다. 그리고 제출을 눌렀다. 30분 뒤의 답장 "아 그렇군요! 그럼 이렇게 수정하면 될까요?" 답장이 빨랐다. 기분 나쁘지 않은 것 같다. 다행이다. 근데 수정본을 보니 별로 안 바뀌었다. 메서드 이름만 바꿨다. 구조는 그대로다. 여전히 100줄이다. "음... 제가 말씀드린 건 구조를 나누는 거였는데요." 이렇게 쓰려다 지웠다. 너무 직접적이다. "좋습니다! 다만 메서드 길이도 함께 조정하면 더 좋을 것 같아요." 또 제안이다. 명령이 아니다. "아 네! 그럼 어떻게 나누는 게 좋을까요?" 질문이 왔다. 이제 내가 예시를 보여줘야 한다.브랜치를 따서 직접 수정했다. 30분이 걸렸다. 500줄을 5개 클래스로 나눴다. 메서드는 20줄 이내로 줄였다. 변수명을 의미 있게 바꿨다. "이런 식으로 나누면 각 클래스의 책임이 명확해집니다." 커밋을 푸시하고 링크를 보냈다. "오 이해했습니다! 감사합니다!" 이모티콘 3개가 붙었다. 1시간이 지났다. 내 일은 못 했다. 직책 없는 테크 리드의 딜레마 팀장이 있긴 하다. 근데 팀장은 코드를 안 본다. 관리만 한다. 회의만 한다. 실제 기술 결정은 내가 한다. 아키텍처도 내가 짠다. 코드 리뷰도 내가 한다. 근데 직책은 없다. 명함에 "선임 연구원"이라고 적혀있다. 연구는 안 하는데. 월급은 6500이다. 동기들은 7천 넘게 받는다고 한다. "직책 주면 안 되냐"고 팀장한테 물었다. "위에서 아직 승인이 안 났어요. 조금만 기다리세요." 1년째 기다리는 중이다. 직책이 없으니까 말하기가 애매하다. "이건 안 됩니다"라고 딱 잘라 말할 수 없다. 권한이 없다. 그래서 항상 "제안"한다. "부탁"한다. "의견"을 낸다. 피곤하다. 점심시간의 고민 점심은 김치찌개집에 갔다. 사장님이 이름을 안다. "개발님 오셨어요~" 단골이다. 주 3회는 온다. 김치찌개를 먹으면서 생각했다. '내가 너무 약하게 말하나?' '아니면 적당한 건가?' '다른 회사 시니어들은 어떻게 하지?' 스택오버플로우에 비슷한 질문이 있었다. "How to give code review feedback without sounding harsh?" 답변들을 읽었다."Be specific and objective" "Focus on the code, not the person" "Suggest alternatives instead of just criticizing"다 알고 있다. 근데 한국 회사에서는 다르다. 위계가 있다. 눈치가 있다. 분위기가 있다. "이 코드는 SOLID 원칙을 위반합니다"라고 말하면 학술 논문이다. "형, 이거 좀 이상한 것 같은데요"라고 말해야 먹힌다. 근데 나는 형도 아니고 팀장도 아니다. 그냥 선임이다. 밥을 다 먹고 사무실로 돌아왔다. 슬랙에 알림이 7개다. 오후 3시, 두 번째 PR 또 알림이 왔다. "김 개발님, PR 수정했습니다!" 열어봤다. 여전히 별로다. 클래스를 나누긴 했는데 책임 분리가 안 됐다. 그냥 줄 수만 줄였다. 또 댓글을 달아야 한다. 커서가 깜빡인다. 뭐라고 쓸까. "이건 여전히 개선이 필요할 것 같습니다" - 너무 애매하다. "제가 보여드린 예시와 조금 다른 것 같아요" - 비교하는 것 같다. "다시 한 번 수정 부탁드립니다" - 짜증난 것 같다. 5분 고민했다. 그리고 이렇게 썼다. "방향은 좋습니다! 다만 클래스 간 의존성을 조금 더 정리하면 좋을 것 같아요. 각 클래스가 하나의 책임만 가지도록 해보시겠어요?" 또 제안이다. 칭찬 먼저 하고 제안한다. 샌드위치 피드백이다. 좋은 말 - 개선점 - 좋은 말. 근데 빵이 너무 얇다. 속이 뻔히 보인다. 회의 중에도 생각남 4시에 주간 회의가 있다. 기획자가 발표한다. "이번 기능은 간단합니다." 간단하다는 말이 나오면 복잡한 거다. 팀장이 묻는다. "개발 기간 얼마나 걸릴까요?" 나를 본다. "2주 정도 필요할 것 같습니다." "1주면 안 될까요?" "백엔드 구조를 새로 짜야 해서..." "기존 코드 활용하면 되지 않나요?" 기존 코드가 엉망이라서 못 쓴다. 리팩토링 필요하다. 근데 말할 수 없다. "기존 코드가 엉망입니다"라고 하면 누구 책임이냐고 물어본다. 내 책임이다. 내가 리뷰했으니까. "...최대한 단축해보겠습니다." 회의가 끝나고 자리로 돌아왔다. 슬랙에 또 알림이다. "김 개발님, 이해가 잘 안 가서요. 잠깐 설명 부탁드려요." 일어나서 후배 자리로 갔다. 설명하는 20분 "여기 이 부분이요." 후배가 화면을 가리킨다. "이걸 왜 나눠야 하는지 모르겠어요." 내가 작성한 예시 코드를 보고 있다. "지금은 UserService가 너무 많은 일을 하잖아." "네." "사용자 조회, 생성, 수정, 삭제, 권한 체크, 알림 발송까지." "네." "나중에 알림 로직만 바꾸고 싶으면?" "...UserService를 수정하면 되는데요?" "그럼 사용자 조회 기능도 영향받을 수 있어." "아..." "그래서 책임을 나누는 거야. 알림은 NotificationService로." "아 그렇구나!" 이해했다는 표정이다. 20분이 걸렸다. PR 댓글로는 5분이면 쓸 내용이다. 근데 직접 설명하면 20분이다. 자리로 돌아왔다. 시간을 봤다. 5시다. 오늘 내 코드는 한 줄도 못 썼다. 퇴근길 지하철에서 6시에 퇴근했다. 지하철에 앉아서 폰을 봤다. 유튜브에 추천 영상이 떴다. "시니어 개발자가 코드 리뷰하는 법" 봤다. 외국 개발자가 나온다. 영어로 말한다. "Be direct but kind." "Explain why, not just what." "It's about the code, not the coder." 다 맞는 말이다. 근데 저 사람은 직책이 있을 거다. Senior Engineer라고 명함에 적혀있을 거다. 나는 선임 연구원이다. 연구 안 하는. 댓글을 봤다. "우리 팀장은 그냥 '이거 왜 이렇게 짰어?' 하고 끝남 ㅋㅋ" "권한 없으면 말 안 먹힘. 그냥 포기." 공감이 됐다. 집에 와서 7시에 집에 도착했다. 아내가 야근이다. 라면을 끓였다. 신라면에 계란 1개. 먹으면서 슬랙을 봤다. 습관이다. "김 개발님 감사합니다! 이해했어요!" 후배가 메시지를 보냈다. 기분이 좋았다. 잠깐. 그리고 다음 메시지가 왔다. "그런데 이 부분은 원래대로 해도 될까요? 지금 방식이 더 익숙해서요." 한숨이 나왔다. 익숙하다는 건 핑계다. 바꾸기 귀찮다는 소리다. 댓글을 쓰려다 멈췄다. '또 설득해야 하나?' '그냥 놔둘까?' '나중에 문제 생기면 내가 고치면 되지.' 근데 그게 계속 쌓인다. 레거시가 된다. 결국 이렇게 답했다. "일단 현재 방식으로 머지하시고, 다음 스프린트 때 리팩토링 태스크로 잡읍시다." 타협이다. 읽음 표시가 떴다. 답은 없다. 아마 다음 스프린트 때도 우선순위 밀린다. 밤 10시, 침대에서 넷플릭스를 틀었다. 근데 집중이 안 된다. '내가 너무 약하게 말하나?' '직책이 있으면 다를까?' '다른 회사로 이직하면 나아질까?' 생각만 했다. 이직하려면 코테 준비해야 한다. 알고리즘 공부해야 한다. 피곤하다. 주말에 하자. 주말은 늦잠 자고 치킨 먹는 날이다. 폰을 내려놨다. 잠이 안 온다. 슬랙 알림이 또 울릴까봐 무음으로 해뒀다. 근데 자꾸 폰을 본다. 습관이다. 알림은 없다. 다행이다. 아내가 11시에 들어왔다. "오늘 어땠어?" "그냥 그랬어. 너는?" "디자인 수정 요청 5번 받았어." "힘들었네." "너도?" "응." 더 말하지 않았다. 둘 다 피곤하다. 다음날 아침 9시에 출근했다. 커피를 뽑았다. 아이스 아메리카노. 자리에 앉아서 슬랙을 켰다. 알림 3개다. 첫 번째: "김 개발님, 새 PR 올렸습니다~" 두 번째: "급한데 리뷰 부탁드려요!" 세 번째: "이번엔 잘한 것 같아요 ㅎㅎ" 깃허브를 켰다. 또 500줄이다. 커피를 한 모금 마셨다. 댓글 입력창을 열었다. 커서가 깜빡인다. "수고하셨습니다. 몇 가지 제안 드립니다." 오늘도 제안한다. 명령이 아니다. 직책이 생길 때까지. 아니면 이직할 때까지.직책 없는 테크 리드는 오늘도 제안한다. 조심스럽게.

테크 리드인데 직책이 없는 개발자의 슬픈 현실

테크 리드인데 직책이 없는 개발자의 슬픈 현실

테크 리드인데 직책이 없는 개발자의 슬픈 현실 월요일 아침 9시. 출근해서 첫 번째 할 일은 슬랙 확인이다. 주말에 올라온 PR이 3개. 후배들이 기다리고 있다. 내가 안 보면 머지가 안 된다. 그들은 나를 기술 리드라고 부르고, 난 그렇게 행동한다. 근데 직책은? 개발자. 그냥. 개발자. 커피를 마신다. 첫 번째다. 아 그거요, 하면서 PR을 본다. 주니어가 짠 코드다. 구조가 이상하다. 리팩토링이 필요하다. 근데 내가 코드를 다시 짜줄 수는 없으니까 "이 부분에서 의존성이 뭔지 생각해봐요"라고 댓글을 단다. 그게 메멘토링이다. 멘토링이 아니라 메멘토링. 내 시간을 쪼개서 하는. 3년 다음에 이직한 친구는 시니어 개발자다. 직책도 있고 연봉도 7천대라고 했다. 나? 6500만원. 올해도 200만원 인상되고 끝.업무 현황: 나는 누구인가 사실 나는 테크 리드다. 팀의 기술 방향을 정한다. 새 프레임워크 도입할 때 나한테 물어본다. 레거시 코드 얘기 나올 때 다들 날 쳐다본다. 마이그레이션 프로젝트? 내가 계획 짠다. 아키텍처 리뷰? 내 책임이다. 그런데 직책은 개발자다. 팀 회의에서 내 발언이 '의견'이 아니라 '지시'로 들린다는 걸 안다. 근데 공식적으로는 선임이 아니니까 누가 책임질 건 애매하다. "그렇게 했어요"라고 하면 "그거 누가 결정했어?"라고 물어본다. 나다. 내가 했다. 근데 나는 개발자고 선임은 아니고. 후배 성과평가? 내가 쓴다. 근데 평가 논의할 때 나는 반영만 된다. 경영진은 직급이 뭐라고 물어본다. 아, 개발자다. 그럼 의견만 듣겠습니다. 라고 한다. 의견만. 페이 밴드는? 개발자 페이 밴드다. 시니어 밴드까지 가려면 1년이 더 필요하다고 HR이 말했다. 그 1년 동안 나는 테크 리드고 지금과 같이 일한다. 이게 3년이다. 커피를 마신다. 두 번째다. 토요일의 업무 "김개발님, 이거 어떻게 생각해요?" 토요일 오후 2시. 쉬는 날인데 슬랙이 울린다. 선임 개발자다. 새 프로젝트 기획이 나왔대. 아키텍처 검토 해달래. 내가 봐야 한다. 안 보면 월요일에 틀린 방향으로 간다. 3명이 틀린 길을 1주일 간다. 그럼 사이클 터진다. 그럼 내 일이 거기서 끝나지 않는다. 주말 오후 2시에 설계 문서를 본다. 칠판을 꺼낸다. 아니 모니터 앞에 앉는다. 생각한다. 펜을 돌린다. 1시간 후 슬랙에 장문의 메시지를 쓴다. "데이터베이스 스키마는 이렇게 가고, 캐시 레이어는 Redis로..." 장황하게 쓴다. 근데 꼭 필요한 내용이다. 없으면 틀린다. 선임: "역시 김개발님이네요. 감사합니다." 감사합니다. 그 말이다. 월급에 포함되지 않는 일이 한 번씩 감사합니다로 끝난다. 그래도 필요하니까 한다. 아내는 뭐해, 라고 묻지 않는다. 나도 답하지 않는다. 토요일이라는 걸 둘 다 잊는다.면접 준비할 마음 이직할 거야? 하는 질문 많다. 동기들 톡방에도 올라온다. "요즘 대기업 시니어 연봉 9천대라던데?" 나도 봤다. 2달마다 본다. 그리고 다시 슬랙을 켠다. 이직할 마음이 있다. 진짜 있다. 그런데 마음이 없다. 면접을 봐야 한다. 포트폴리오를 정리해야 한다. 깃허브를 봐야 한다. 사이드 프로젝트를 하나 띄워야 한다. 혹은 과거 프로젝트를 정리해야 한다. 그걸 할 에너지가 없다. 일과가 끝나면 넷플릭스를 킨다. 뭘 보든 상관없다. 그냥 킨다. 생각을 안 하려고. 주말에 일어나서 면접을 준비할까, 할 생각을 하다가 라면을 끓인다. 라면을 먹으면서 자기 전까지 폰을 본다. 페이스북에서 동기들 사진을 본다. 근데 게시물에 좋아요는 안 누른다. 그리고 월요일 오전 9시가 된다. 아 그거요. 후배를 가르친다는 게 "이 부분에서 왜 싱글톤 패턴을 썼어요?" 새로 온 후배다. 2년차. 내가 물어본다. 그러면 그 질문이 시작이다. 그 질문 하나로 30분이 간다. 나는 가르쳐야 한다. 안 가르치면 내일 다시 틀린다. 모레도 틀린다. 그럼 내가 고친다. 시간이 2배가 된다. 그래서 가르친다. 설명한다. 왜 싱글톤이 문제인지. 스레드 안전성이 뭔지. 테스트 불가능성이 뭔지. 그럼 대안이 뭔지. 후배가 이해했다. "아, 그렇군요. 감사합니다." 30분이 사라졌다. 내 일은 30분 밀렸다. 그 30분은 퇴근 후에 한다. 근데 이게 계속 반복되니까 하루에 2시간이 간다. 5일이니까 10시간이 간다. 한 주에 10시간. 한 달이면 40시간. 그게 내 시간이다. "선임 개발자니까 이 정도는 당연하지" 라고 누구도 말하지 않는다. 근데 그렇게 생각한다. 월급에 후배 교육비가 포함되나? 아니다. 근데 포함된다. 매달 40시간. 월급을 시급으로 나누면 얼마지. 계산은 안 해도 알 수 있다. 담배 피는 척하고 베란다에 나간다. 생각한다. 뭘? 아무것도. 그냥 5분을 버린다.'간단하죠?'의 무게 기획자가 온다. 회의실에 10명이 앉아 있다. 나를 포함해서. "이거 사실 간단하니까 한 3일이면 되겠죠?" 간단하면 너가 해. 내가 말하진 않는다. 그냥 생각한다. 입으로는 "어, 알겠습니다"라고 한다. 간단하다. 정말 간단하다. 단순하게 따지면. 버튼을 누르면 데이터가 저장되게 하면 된다. 그게 간단한 거다. 기획자 입장에선. 그런데 데이터 검증은? 권한 체크는? 동시성 문제는? 롤백은? 로깅은? 모니터링은? 테스트는? 3일이 10일이 된다. 10일이 끝나면 QA에서 버그를 찾는다. 3일치 버그를. 왜냐면 3일에 되게 하려고 했으니까. 야간에 고친다. 기획자는 "역시 세밀하네요"라고 한다. 세밀해서가 아니라 기본을 했을 뿐인데. 근데 이게 반복되니까 의심한다. 내가 느린 걸까? 다른 회사의 개발자들은 3일에 하나? 아니다. 나는 안다. 다들 이렇다. 근데 말 안 할 뿐이다. 그래서 회의실에서 "네, 간단하겠습니다"라고 한다. 나오면서 한숨 쉬고, 책상에 앉아서 모니터를 봐도 계획서가 눈에 안 들어온다. 펜을 돌린다. 회의가 끝난 지 1시간이 지났는데도 펜을 돌린다. 레거시와의 전쟁 "이거 왜 이렇게 짜놨어?" 3년 전 코드다. 내가 짠 게 아니다. 그 전 선임이 짠 거다. 그런데 그 선임은 회사에 없다. 구조가 이상하다. 디자인 패턴이라고 할 수 없다. 그냥... 동작한다. 그게 전부다. 고쳐야 한다. 근데 안 고친다. 왜? 시간이 없다. 새 기능을 해야 하고, PR 리뷰를 해야 하고, 후배를 봐야 하고, 토요일 오후의 아키텍처 설계를 해야 한다. 레거시는 여기에 있다. 계속 동작한다. 버그는 가끔 난다. 그럼 패치한다. 근본은 못 본다. 3년 후배가 와서 묻는다. "이거 왜 이렇게 짜놨어요?" 내가 답한다. "아, 그거요..." 나도 모른다고 할 수도 있다. 근데 말하지 않는다. 왜냐면 나는 시니어 개발자처럼 일하니까 알아야 한다고 생각한다. 그래서 "비즈니스 요구사항이 이랬거든요"라고 말한다. 거짓이 아니다. 근데 전부도 아니다. 밤 11시. 배포 전 마지막 체크다. 레거시 코드를 본다. 여전히 이상하다. 근데 동작한다. 배포한다. 집에 가는 길에 "언젠가 고쳐야지"라고 생각한다. 근데 그 날은 안 온다. 슬랙 알림, 나의 적 알림 음소거. 늘 켜져 있다. 주말인데도. 저녁 8시인데도. 밤 11시인데도. 음소거 상태로. 빨간 숫자가 쌓인다. 1, 5, 12, 27. 27개의 알림. 다 나한테다. 아니 일부는 전사 공지다. 그래도 20개 이상은 내 책임이다. 기획이 변했다. 리뷰 요청이 3개 왔다. 후배가 막혔다고 한다. 선임이 의견을 물었다. 그리고 또 뭔가. 이게 밤 11시 30분의 내 상황이다. 주말 오후라고 생각할 때도 그렇다. 슬랙이 울릴까봐 음소거에서 볼륨을 내렸다가 다시 음소거로 한다. 확인할까봐. 확인하면 일한다. 일하고 싶지 않다. 근데 일 생각이 나 이상하게 괜찮다. 자는 것보다. 그래서 음소거를 푼다. 알림을 본다. 30분이 일로 간다. 그리고 또 음소거를 한다. 근데 마음은 음소거가 안 된다. 아내와의 저녁 "오늘 뭐했어?" 8시 반. 저녁 시간이다. "일했어. 후배 코드 리뷰하고." "토요일인데?" "응." 대화가 끝난다. 아내도 야근한 날이 많다. UI 디자이너. 리뷰가 많다. 근데 코드 리뷰는 내 몫이다. 내가 아니면 못 본다. "내일은 쉴 거야?" "배포일인데..." "또?" 네. 또다. 라면을 끓인다. 아내는 회사 일로 정신없다. 나도 회사 일로 정신없다. 근데 라면은 끓인다. 어제도 라면이었나? 모르겠다. 기억이 안 난다. 아내가 소파에 누웠다. 노트북 위에. 나도 소파에 누웠다. 폰 위에. 같은 공간에 있는데 다른 세상에 있다. 이게 저녁이다. 밤 10시가 되면 자야 한다. 내일 아침은 7시 반에 일어난다. 그리고 또 커피. 동기들과의 거리 "너 시니어 됐어?" 카톡에서 묻는다. 3년 전 후배다. 지금은 내 동료가 아니다. 다른 회사다. "아직." "3년인데?" "응." 뭐라고 설명할까? 테크 리드인데 직책이 없다고? 그럼 왜 안 옮기냐고 물을 게 뻔하다. 나도 그 대답을 못 한다. "연봉도 못 올렸어?" "200만원." "어? 나는 1년에 600만원 올랐는데?" 모르겠다. 그 친구는 이직했다. 시니어로. 6개월 만에 연봉이 8천대가 됐다고 했다. 근데 야근이 많댔다. 번아웃 위험이라고도 했다. 그리고 3개월 후에는 연락이 없었다. 근데 내가 덜 바쁜 건가? 아니다. 내가 더 바쁘다. 근데 시니어로 안 불린다. 후배들 앞에서는 테크 리드처럼 행동하고 경영진 앞에서는 개발자다. 둘 다 아니고 둘 다다. 연락을 받은 지 3시간 후에 답한다. "화이팅." 그게 다다. 오늘도 커피 세 번째 커피를 마신다. 오후 3시. 어제 아침에 일어난 지 24시간도 안 됐는데 벌써 세 번째다. 첫 번째는 출근 직후. 깨어나기 위해. 두 번째는 회의 전. 정신 차리기 위해. 세 번째는 지금. 이유는 없다. 그냥 마신다. 커피가 없으면 이 업무가 안 된다. 근데 커피가 있어도 된다. 모순이다. 근데 마신다. 펜을 돌린다. 모니터를 본다. 코드를 본다. 문제가 있다. 해결해야 한다. 내일도 같은 일을 한다. 모레도. 그 다음날도. 그리고 어느 날 슬랙에서 "김개발님 시니어 됐대요"라는 말이 나올 거다. 근데 그때도 일은 같다.내일은 좀 나아지겠지. 아마도.

사이드 프로젝트 3번 접은 개발자가 배운 것

사이드 프로젝트 3번 접은 개발자가 배운 것

사이드 프로젝트 3번 접은 개발자가 배운 것 출근했다. 월요일이다. 슬랙을 켰다. 금요일부터 쌓인 메시지 47개. 레거시 시스템 버그, 배포 관련 문의, 후배 코드 리뷰. 일단 무시하고 커피를 마신다. 첫 번째다. 어제 밤, 침대에서 다시 생각했다. 사이드 프로젝트 얘기다. 정확히는 사이드 프로젝트 '접은 걸' 생각했다. 3번 접었다. 3번 다. 회사 일 외에 뭔가 만들고 싶은 게 없는 게 아니다. 문제는 그게 아니다. 시작하고 2주 뒤 현실이 와서 꺾여버린다. 아내가 "너 또 안 할 거다"라고 할 때, 그게 가장 싫다. 왜냐하면 맞으니까.프로젝트 1번: 주식 앱 (1주일 반 버틴 것) 작년 2월이었다. 회사에서 Redis 사용 경험이 필요했다. 그러면 사이드로 만들면서 배우자고 생각했다. 주제는 주식이었다. 실시간 시세를 캐싱하고, 사용자 포트폴리오를 추적하고, 매매 알림을 주는 앱. "이번엔 다르다"고 다짐했다. 첫 주말은 열정이었다. ERD를 그렸다. API 설계했다. Redis 아키텍처도 다 구상했다. GitHub에 저장소까지 만들었다. 커밋 메시지는 "initial commit: stock tracking app with real-time cache strategy". 멋있었다. 월요일이 왔다. 회사에서 Redis 관련 긴급 버그가 터졌다. 프로덕션 캐시 일관성 문제. 밤 10시까지 붙들었다. 화요일은 출근해서 그 문제를 추적했다. 수요일엔 후배가 물어봤다. "시니어, 이 쿼리 왜 느려요?" 30분을 설명했다. 목요일에 사이드 프로젝트를 다시 봤다. 코드가 낡아 보였다. 뭔가 잘못된 느낌. Redis 설정을 다시 봤다. 생각을 정리하려고 또 다른 설계를 했다. 금요일엔 아무것도 못 했다. 주말엔 침대. 월요일에 GitHub에 들어갔다가 나왔다. 더 이상 하기 싫었다.프로젝트 2번: 개인 블로그 플랫폼 (10일) 4월이었다. 트위터에서 개발자들이 개인 블로그 갖는 게 중요하다고 했다. 그러면 플랫폼을 만들자고 생각했다. Medium 같은 서비스. 마크다운 에디터, 태그 시스템, 댓글, SEO 최적화. 대단했다. "이번엔 정말 다르다"고 했다. 진짜 다를 줄 알았다. 첫 3일은 정말 빨랐다. Spring Boot 프로젝트 세팅, JPA 엔티티 설계, 마크다운 파싱 라이브러리 통합. 생각보다 쉬웠다. "아, 이게 진짜 가능하겠네"라고 생각했다. 그 생각이 문제였다. 4일차: 마크다운 렌더링에서 보안 이슈가 보였다. XSS 방지. 10가지 경우의 수를 고민했다. 하나 구현했다. 나머지 9개는 다음에 하기로. 5일차: 데이터베이스 마이그레이션을 생각했다. 유저가 블로그 이동할 때 데이터를 어떻게 옮길까. 너무 복잡했다. 다음 버전에 미뤘다. 6일차: 아내가 물어봤다. "블로그 만들어?" "응, 만들고 있어." "언제 오픈?" 그 순간 마음이 내려앉았다. 언제냐고. 모르잖아. 7일차: 코드를 다시 봤다. 마크다운 파싱 로직이 마음에 안 들었다. 전부 다시 짰다. 사실 필요 없었다. 8일차: 8일차에 뭘 했는지 모른다. GitHub 커밋 기록도 없다. 9일차: GitHub에 들어갔다가 나왔다. 10일차: 프로젝트를 삭제했다. 아니, 삭제 안 했고 그냥 방치했다. 지금도 있다. Private 저장소로. 패배의 증거.프로젝트 3번: 자동화 도구 (2주) 7월이었다. 회사에서 매번 배포할 때마다 같은 작업을 반복했다. 체크리스트 확인, 데이터베이스 마이그레이션 스크립트 검증, 알림 전송. 3번 접은 개발자가 배웠어야 할 것: 작은 게 최고다. 근데 이번엔 작게 시작했다. 진짜. 배포 자동화 도구. CLI 하나면 끝. 아무것도 웹 없이. 아무것도 복잡하게 없이. 단순함. 첫 주: 전부 다 했다. Python으로 CLI 도구. 8시간 안에 뼈대 완성. 회사에서 써봤다. 먹혔다. 동료들이 물어봤다. "이거 언제 만들었어?" "어제 밤." "진짜?" 뿌듯했다. 둘째 주: 추가 기능을 생각했다. 롤백 기능, 배포 로그 기록, 실패했을 때 자동 알림. 한 가지씩 추가하다 보니까 복잡해졌다. 코드가 길어졌다. 테스트 케이스도 많아야 했다. 처음 간단함은 어디갔나. 그러던 와중에, 회사에서 새로운 배포 시스템 도입 공지가 났다. 외부 솔루션. 3개월 뒤면 우리 도구 필요 없어진다. 그걸 봤을 때, 손에서 힘이 빠졌다. 왜 하고 있지. 이 느낌 또 왔다. GitHub에 들어갔다가 나왔다. 3번 다다.배운 것들 (솔직하게) 교훈 같은 건 안 가르칠 거다. 인터넷에 넘쳐난다. "작게 시작하세요", "꾸준함이 중요합니다" 같은 거. 그런 건 다 알고 있었다. 근데 못 했다. 첫 번째: 완성 중독이 있다는 것. 프로젝트를 시작하면 '다 만들어서 공개해야지'가 머릿속 기본값이 된다. 그렇게 되면 나머지 모든 것들은 완성도가 낮으면 공개 못 한다고 생각한다. 주식 앱도 그랬다. "아직 알고리즘이 부족하니까", "UI가 못생겼으니까". 이유는 많다. 근데 공개 안 하면 뭐가 다른가. 그냥 개인 폴더에서 썩는 거다. 그게 낫나. 두 번째: 번아웃이 일찍 온다는 것. 회사에서 7시간 일하고, 퇴근 후 2시간을 사이드 프로젝트에 쓴다고 하자. 그럼 뇌는 코딩만 12시간 한다는 거다. 주말엔? 더 하고 싶은 마음이 안 생긴다. 그냥 침대가 끌린다. 근데 계속 자책한다. "왜 못 하지. 다들 하는데." 다들 안 한다. 그냥 SNS에서 자랑하는 사람들만 보인다. 세 번째: 공동작업이 없으면 쉽게 포기한다는 것. 회사 프로젝트는 스팩 변경되면 짜증나도 한다. 왜냐면 누군가 기다리니까. 근데 사이드 프로젝트는? 오직 자기만을 위한 거. 오직 자기만이 유일한 스테이크홀더다. 자기 마음만 중요하면 사실 중요한 게 아니다. 스스로에겐 자비롭기 쉽다. 네 번째: 진짜 만들고 싶은 건 따로 있다는 것. 3개 프로젝트 다 "이거 배우고 싶어서" 또는 "포트폴리오 될 것 같아서" 시작했다. 정말 그 앱이 필요해서가 아니었다. 내가 주식을 몰라서가 아니라 Redis를 배우고 싶어서. 블로깅이 하고 싶어서가 아니라 마크다운 파싱이 하고 싶어서. 이건 말이 안 된다. 뭔가를 잘 만들려면 그걸 정말 원해야 한다.지금 지금은 뭘 하고 있나. 사이드 프로젝트? 안 한다. 필요 없다고 생각했나. 아니다. 밤 10시에 누워 있으면서 생각한다. 앱 만드는 거. 블로그 쓰는 거. 뭔가를 만드는 거. 근데 아침이 되면 출근한다. 회사에선 할 게 많다. 퇴근하면 피곤하다. 주말엔 쉰다. 이게 계획된 결과인가. 아니다. 그냥 그런 거다. 에너지 관리의 실패. 혹은 진짜 필요 없는 걸 만들려고 했던 거고, 그래서 자연스럽게 포기된 거다. 그럼 이제 뭘 해야 하나. 아내가 말했다. "넌 회사 일로 충분히 바빠. 왜 더 해." 맞다고 생각했다. 근데 자책은 계속 된다. 왜인지는 모르겠다. 아마도 개발자라는 직업이 계속 뭔가 배우고 빌드해야 한다고 강요하는 것 같다. 그게 나쁜 건 아니다. 근데 그게 회사에서 충분하다면, 사이드는 뭐 하는 거지. 최근에 생각을 바꿨다. 사이드 프로젝트는 재미 없으면 버린다. 배우기 위해서가 아니라, 그냥 만드는 게 재미있어야 한다. 근데 일단 3번 실패한 개발자 입장에선, 4번째를 어떻게 믿고 시작하나. 그게 문제다.근데 뭔가 배운 건 있다 프로젝트를 접으면서 배운 코드들은 남았다. Redis 아키텍처 방식, 마크다운 파싱 로직, Python CLI 도구 구조. 그건 버려진 게 아니다. 회사에서 쓸 때 나온다. "아, 저 방식 어디서 봤는데" 하면서. 아, 그렇구나. 사이드 프로젝트가 완성돼야 의미 있는 게 아니다. 배운 것들이 다른 데서 쓰일 때 의미가 있는 거다. 그럼 3번 접은 게 완전 손해는 아니네. 다만, 시간이 아까운 건 사실이다. 4개월이 그냥 사라졌다. 대신 뭘 배웠나면, 배웠다는 것 자체를 증명하기 힘들다. 코드도 없고, 완성된 앱도 없다. 그냥 "배웠어"라고 말할 수밖에. 근데 그게 현실이다. 개발자의 삶은 많은 부분이 그렇다. 배웠는지 모르고, 못 했는지 안 했는지도 모른다. 그냥 계속한다. 정해진 시간에 출근해서, 정해진 일을 하고, 퇴근한다. 사이드 프로젝트는 그걸 벗어나려는 시도다. 하지만 결국 마찬가지다. 번아웃이 올 때까지 한다. 그리고 멈춘다. 다음 번엔 다를 거라고 생각하면서. 이건 교훈이 아니다. 그냥 현실이다.커피를 마신다. 두 번째다. 회사에선 지금 배포 준비 중이다. 우리 팀이 만든 기능이 나간다. 후배가 물어봤다. "프로덕션에서 Redis 캐시 문제 없을까요?" 내가 답했다. "몰라. 나가고 봐." 아, 그거 사이드에서 배웠던 거다. 문제는 나가야 본다.[IMAGE_4] [IMAGE_5]결국 다음 사이드 프로젝트도 접할 것 같다.

대학 동기들 단톡방: 1년에 한 번 보는 우리의 현재

대학 동기들 단톡방: 1년에 한 번 보는 우리의 현재

대학 동기들 단톡방: 1년에 한 번 보는 우리의 현재 스탠프만 남기는 채팅창 단톡방 알림. 어제 온 거 같은데 이제 봤다. '안녕하세요 ^^' 누구지? 이름이 안 띄어 있다. 멤버 목록을 본다. 13명. 왜 13명이지? 졸업 당시엔 11명이었는데. 아, 누군가의 남편. 아니면 여자친구. 이제 그 정도 사이가 됐구나. 'ㅇㅈㅇㅇ님이 입장했습니다.' '어어어 환영한다 형!!' 이 문장 뒤에 슬랙 이모지가 3개 따라붙는다. 너희도 개발자네. 그 느낌 안다. 회사에서 슬랙에 이모지 스팸하는 그 문화. 여기까진 따라온 거다. 대학 때는 달랐다. 2020년. 코로나 이전. 우리는 학년 올라가면서 자연스럽게 모였다. 학식, 도서관 앞 벤치, 밤새 과제 하는 호실. 2시간마다 카톡으로 '뭐해?' 쓰고, 1분 안에 답장 왔다. 지금은 이거다. 스탠프.'언제 봐?'만 오고 가다 단톡방 검색. 지난 6개월. '언제 봐?' '진짜 봐야겠다' '시간 되면 봐요!' '언제 모여?' '다음 달?' '그 다음 달?' 이 대사들만 15개. 실제로 만난 적? 없다. 작년 명절. 누군가가 '내려간다' 했다. 아, 그때 한 명 봤나? 아니. 그건 전전년도다. 우리는 시간이 없다. 모두가. 금요일 밤. 그게 유일한 기회다. 근데 누구는 배포를 해야 한다고 했다. 누구는 주말에 고쳐야 할 버그가 있다고. 누구는 신입이라 휴가를 못 낸다고. '다음에 진짜 봐' 다음은 언제지? 리더보드를 본다. 채팅 횟수로 순위를 매기는 개발자들만의 오만한 작은 게임이 우리에게도 있었나? 없다. 근데 누가 말을 많이 하는지 본다. 'ㅇㅇ' - 어제 온 스탠프 3개 'ㅈㅇ' - 한 달 전 '안녕' 'ㅎㅅ' - 3개월 전 '요즘 뭐해' 스탠프만 남기는 애들도 있다. 이제 감정 표현도 패킹하는 거네. 최적화. 우리가 배운 게 단톡방까지 왔다. 회사에서 9시부터 6시까지 벨이 9시에 울린다. 9시가 아니라 8시 50분에 나가기 시작한다. '출근한다' 이 한 단어를 누구에게 건넬까? 아내? 아내도 같은 시간에 나간다. 엄마? 엄마는 딸은 신경 쓰고 아들은 알아서 한다고 생각한다. 대학 동기? 아, 그들도 지금 자신의 회사에서 로그인하고 있을 거다. 2023년. 우리는 학교를 나왔다. 그 다음부터가 다항식이었다. 누군가는 대기업 들어갔다. 근데 스트레스 받다가 작년에 스타트업 갔다. 단톡방에 '이직했어요'라고만 적었다. 누군가는 프리랜서가 됐다. '자유롭다'고 했는데, 3개월 뒤에는 '부스러기처럼 산다'고 했다. 누군가는 공무원 된다고 했는데 지금도 시험 치고 있다. 나? 난 동기들보다 좀 더 일찍 들어갔다. 지금 테크 리드다. 직책은 아니지만.공통분모는 한 가지 더 이상 공통분모가 없다. 학교 있을 때 공통분모는 뭐였나. 과제. 시험. 축제. 밥 먹을 때 갈 식당. 서로의 로맨틱한 관심사. 프로젝트 팀. 동아리. 다 외부 강제였다. 제도가 우릴 한곳에 모았다. 지금 공통분모는? "우린 다 개발자야." 그게 다다. 근데 그 안에서도 나뉜다. 프론트엔드 vs 백엔드. Java vs JavaScript. 대기업 vs 스타트업. 계약직 vs 정규직. 우리가 대학에 갔을 때 배운 게 뭔지 생각해본다. 자료구조? 알고리즘? 네트워크? 잘못 배웠다. 우리가 배워야 했던 건 이거다. '떨어져 나가는 방법'. 그래도 가끔 미안한 마음 '형 생일 축하해!' 단톡방에 올라온다. 누가 사실 봤을까? 한 3명. 알람 설정 안 했으니까. 'ㅇㅇ님이 이모지를 보냈습니다' 이모지면 충분하다. 충분해야 한다. 근데 왜 미안한 마음이 생길까. 마치 우리가 함께 늙어가는 게 아니라 각자 다른 타임라인으로 살아가고 있다는 생각이 들 때. 한 명은 서울에서 일하고, 한 명은 경주로 내려가고, 한 명은 리모트다. 한 명은 결혼했다. 한 명은 결혼할 생각이 없다. 한 명은 고민 중이다. 한 명은 승진했다. 한 명은 계약 끝났다. 한 명은 유학 간다고 했는데 아직 가지 않았다. 우린 같은 시간에 태어났다. 같은 학교에 갔다. 근데 시간이 더 이상 같지 않다. 네트워크 에러다. 패킷이 너무 멀리 떨어져 있다. '언제 봐?' 그 이후 어제 카톡이 울렸다. '모임 가능한 사람?' 이 문장이 올 때마다 우리의 심장이 철렁 내려간다. '언제?' '이번 달 25일?' 계산한다. 이번 달. 지금 8월이니까. 8월 25일은? 금요일이다. 그 금요일에 배포가 있나? 없나? 구글 캘린더를 본다. 팀 회의. 스프린트 플래닝. 1:1 미팅. 백로그 정제. '그 날 좀 바쁠 거 같은데...' 누군가는 이미 같은 답을 보냈다. '다음 달?' 대화는 여기서 끝난다. 다음 달은 다음 달이니까. 지금은 생각하지 않는다.그런데도 누구는 왔다 작년 가을. 누군가는 정말 왔다. 단톡방에 사진 올렸다. 우리가 다니던 학교. 정문 앞. '돌아왔다' 그 사진 밑에 반응이 확 달라붙었다. '오오오!!' '어디?? 갈께!!' '너 미쳤나? 왜 와??' 반가운 거였다. 정말로. 그 사람은 미국 출장 갔다가 서울 들었다고 했다. 이틀밖에 없다고 했다. 우리는 만났다. 진짜로. 밥 먹으면서 5년을 말했다. 5시간에 5년을 압축했다. 누가 떠나갔고, 누가 들어갔고, 누가 계속 같은 자리 있고, 누가 변했고, 누가 안 변했고. 그리고 그 사람이 떠날 때 우리는 일렬로 버스 정거장까지 따라갔다. 아무말도 하지 않고. 버스가 떠났다. 그 다음 날 단톡방에 사진이 올라왔다. 비행기 창밖이었다. '또 언제 봐?' 아, 그거요 아, 그거요. 시간이 없어서가 아니다. 시간은 있다. 부족하지 않다. 우리가 두려워하는 건 다른 거다. 만나면 뭘 말해야 하지? 하는 두려움. 회사 얘기만 할 수도 없고. 그 얘기 하면 한 명은 스트레스 받고, 한 명은 자존심 상하고. 연봉이 나올까봐. 직급이 나올까봐. 결혼 얘기가 나올까봐. 아이 얘기가 나올까봐. 전월세 얘기가 나올까봐. 부모님이 아직 돈 달라고 하냐는 얘기가 나올까봐. 우린 모두가 어쨌든 조금씩 불안하다. 그래서 스탠프만 남긴다. 스탠프는 거짓말을 하지 않는다. 미소. 엄지. 불꽃. 더 이상 말할 게 없으니까. 근데 나는 가끔 생각해 만약 우리가 아직도 같은 학교에 있었다면? 과제 같이 하고, 밥 같이 먹고, 밤 10시에 갑자기 누구 기숙사로 모였을 거다. 그런데 우린 여기 있다. 나는 서울에서, 누군가는 대구에서, 누군가는 싱가포르에서, 누군가는 여전히 "취직할 거예요"라고 말하고 있고. 단톡방은 여전히 켜져 있다. 알림은 여전히 울린다. 근데 우린 누구도 댓글을 달지 않는다. 웃음이라도 표현하고 싶을 땐 스탠프를 남긴다. 이게 우리 세대의 우정인가? 아니면 이게 수도권 백엔드 개발자들의 현실인가? 아마도 둘 다. 내일도 같은 알림 내일도 같은 시간에 알림이 울릴 거다. 혹은 주말에. 누군가가 '요즘 뭐해?'라고 쓸 거다. 난 커피를 마시면서 생각할 거다. 뭐라고 답해야 할까? '일해요' 이것만 쓸 거다. 스탠프 하나 붙이고. '다음에 봐' 이렇게 닫을 거다.언제 봐? 모르겠다. 모두가 바쁘니까.

명절에만 내려가는 지방의 부모님 근황

명절에만 내려가는 지방의 부모님 근황

명절에만 내려가는 부모님 전화는 미루고, 죄책감은 쌓이고 부모님 전화번호. 화면에 떠 있다. 콜. 콜. 받아야 한다. 알고 있다. 손가락이 안 움직인다. '뭐라고 말하지?' 일이 많다고? 그건 이미 알고 계신다. 잠은 잘 잤냐고? 하루에 4시간 정도. 밥은? 라면. 화면이 꺼진다. 응답 안 함. 딩동. 카톡 오셨다. 엄마다. "아들, 괜찮아? 요즘 바쁜지?" 어제 생각났을 거다. 아무 이유 없이.연 2회의 약속 명절. 설과 추석. 딱 2번. "내려올 때 뭐 먹고 싶어?" "그냥 집밥이 좋아요." "에이, 뭘 자꾸 그래. 소고기 구워줄게." 기차표를 끊는다. 4시간. 지방행 기차 안. 옆 자리 할머니가 도시락을 먹는다. 냄새가 좋다. 집이 생각난다. 부모님이 역에 나와 계신다. 엄마 머리가 좀 더 희어졌나. 아빠 등이 굽었나. 작년엔 이렇지 않았는데. '언제 봤더라?' 반년 전. 그 사이에 부모님은 또 반년을 사셨다. 밥상이 차려진다. 아내는 없다. 일이 있다고 했다. 엄마는 알겠다고 하셨다. "일이 많긴 해?" "네. 많습니다." "그래도 밥은 잘 먹어야 해." "네." "고등학교 때부터 밥 못 먹더니 여전하네." 웃음이 나온다. 엄마가 반찬을 또 담아주신다. 시간이 이렇게 빨리 흐르나. 3일이 다가 온다 설날 아침이 거의 다 됐다. 아침 5시. 엄마가 일어나신다. 아빠도. "언제 올라가?" "오후 기차 탈게요." "그래? 일이 많긴 해." 모두가 알고 있다. 내가 떠난다는 걸. 밥을 다시 먹는다. 엄마가 만든 밥. "요거랑 이것도 싸줄게. 기차에서 먹어." 비닐봉지를 줄 번이. 집이 들어있다. 기차역에서. 엄마가 운다. 슬쩍. "또 언제 와?" "추석에요. 6개월만." "그래. 잘 있어. 밥 잘 먹고." 기차가 움직인다. 창밖이 흐릿해진다. 엄마가 손을 흔드신다. 보인다. 보이지 않을 때까지.전화를 받는 이유들 집에 와서 슬랙이 울린다. 배포 브랜치 충돌. 누가 merge 받았어? 일로 돌아온다. 전화는 또 미룬다. 그런데 밤 11시쯤이다. 엄마 전화. "아들, 뭐 해?" "그냥 일이 좀..." "아, 그래. 잠깐만. 아빠 말씀 있으신대." 아빠 목소리. "응? 잘 있냐?" "네, 잘 있습니다." "요즘 회사는?" "그냥 그렇습니다." 얘기할 게 없다. 아빠도 아는데. "그래. 밥은 잘 먹고." "네." 엄마가 다시 받으신다. "오빠네 카톡 봤어? 요즘 애들이..." 듣는다. 일은 손에 있지만 듣는다. 이게 전화의 정체다. 뭔가 중요한 얘기가 있어서가 아니다. 그냥 목소리가 듣고 싶은 거다. "알았어요, 엄마." "그래. 잘 자고." 끊는다. 슬랙 메시지는 여전히 파란색으로 깜빡인다.죄책감은 내 것 전화를 자주 못한다. 이건 사실이다. 일이 많아서? 피곤해서? 뭐라고 변명할 수도 있다. 근데 다 핑계다. 아내도 엄마한테 자주 전화한다. '뭐 해?' '밥 먹어?' 그 정도. 그런데 난 못 한다. 뭐라고 얘기할지 모르는 게 아니다. 말하는 게 어색해서다. 부모님을 사랑한다고 말하지 못한다. (너무 어색하잖아.) 그냥 밥 먹으라고 한다. 밥이 답이라고 생각하는 것처럼. 부모님도 안다. 명절에 만나서 쓸데없는 얘기 하고 가는 게 전부라는 걸. 그래도 기다린다. 명절을. 명절의 다른 의미 기차표를 끊는다. 달력을 본다. 내 삶에 이 날들이 표시된다. 빨간 날. 명절은 일을 멈추는 날이다. 슬랙을 끈다. 배포를 연기한다. 긴급 버그도 내일이다. 대신 밥을 먹는다. 엄마 손으로 만든. 아빠가 신문을 본다. 엄마가 밥을 담는다. 나는 먹는다. 시간이 멈춘다. 아니, 멈추지 않는다. 그냥 느껴진다. "밥 더 먹어." "고마워요." "뭐 감사해. 엄마 손으로 하는 게 얼마나 남으려고." 며칠이 끝난다. 떠난다. "추석에 또 봐." 그때까지 살아야 한다. 부모님도. 나도. 6개월. 그 사이에 또 뭐가 나이가 들겠지. 전화를 하지 않아도 안다. 부모님은 내 일이 많다는 걸. 내 삶이 바쁘다는 걸. 그래도 기다린다. 내 목소리를. 자주 전화하지 못한다. 명절 때만 내려간다. 그게 전부다.명절 후 기차 안. 창밖은 점점 도시가 된다.