진행 중 프로젝트에 새 태스크가 생겼다

둘째가 생기고 난 뒤, 육아는 두 배가 아니라 제곱이 되었다.

by 박정욱

예상된 태스크는 없다. 다만, 나는 익숙했다.


프로젝트 일정이 순조롭게 진행되고 있을 때, 갑자기 할당되는 태스크는 누구에게나 부담이다. 하지만 경험 많은 개발자라면 예상치 못한 태스크야말로 개발의 일상이라는 걸 안다. 그럴 땐 당황하지 않고 현재 작업의 상태를 점검하고 새로 주어진 일을 어디에 끼워 넣을지 판단한다. 마치 레고를 메뉴얼대로 다 맞췄는데 한 조각이 남은 느낌이다. 당장은 맞지 않는 것 같지만 눈을 좁히고 전체를 살펴보면 어딘가에 들어맞는 자리가 있다. 그걸 찾아내는 능력이 시니어 개발자의 힘이다.

업무 우선순위를 재정비하고, 긴급도를 고려해 타임라인을 조율한다. 이미 진행 중인 태스크의 의존성, 데드라인, 리뷰 대기 상태를 고려해 가장 효율적인 동선으로 배열한다. 필요한 경우 일부 작업을 병렬 처리로 전환해 리소스를 최적화하기도 한다. 이 모든 것은 복잡한 연산처럼 보이지만 몸에 밴 습관이 된 개발자에겐 어느새 자연스러운 작업이다. “처리할 수 있다”는 자신감은 오랜 경험에서 온다. 어지러운 칸반보드를 보며 오히려 미소를 짓는 마음. 새로운 태스크도 결국 익숙한 흐름 속에 정리될 것이다. 그렇게 믿고, 개발자는 다음 줄의 코드를 짜기 시작한다.



익숙했던 기능, 그런데 손에 안 잡히는


아이 하나를 키워봤다. 밤중 수유의 고단함, 감정 폭발의 순간들, 기저귀 갈이의 속도전, 아이가 아플 때 증상을 검색하느라 밤을 새운 기억. 그런 시간들을 지나며 나름의 육아 패턴이 생겼다. 그래서 둘째가 생겼을 때 생각했다. “이제는 좀 다를 거야.” 이미 한 번 겪은 로직 아닌가. 코드 복붙만 잘해도 기본 기능은 돌아갈 거라 믿었다. 그런데 아니었다.

같은 시나리오, 다른 반응. 같은 밤중 수유지만, 울음의 패턴이 다르고, 안정을 취하는 방식도 다르다. 첫째는 한번 잠들면 누가 업어가도 모를 정도로 잘 잤지만 둘째는 작은 자극에도 금방 잠에서 깼다. 첫째는 말을 걸면 진정했지만, 둘째는 조용해야 안심한다. 같은 UI, 다른 사용자였다. 심지어 더 나은 버전이 아니라, 완전히 새로운 사용자 흐름이었다.

마치 예전에 고생해서 만들었던 기능이라 쉽게 다시 구현할 수 있을 줄 알았는데, 막상 손을 대니 전혀 손에 잡히지 않는다. 이미 짜놨던 로직이 적용되지 않고, 작은 부분부터 예외 케이스가 튀어나온다. “이건 그때랑 다르다”는 걸 매 순간 체감한다. 단순히 ‘두 번째’라 쉬운 것이 아니라, ‘다른 문제’였던 것이다. 익숙했던 게 오히려 혼란을 부른다. 예상했던 구현 방식은 적용되지 않고, 나는 새로 한 줄 한 줄 다시 써내려가야 한다. 둘째는 내가 만든 코드가 아니라, 완전히 새로운 API를 지닌 존재다.



병렬성의 늪에 빠지다


진짜 어려운 건, 둘째가 첫째와 다르다는 사실이 아니었다. 둘을 동시에 돌본다는 것 자체가 문제였다. 둘째는 낮잠을 자야 하고, 첫째는 간식을 달라고 조르고, 하나를 안아주면, 다른 하나가 “나도 안아줘!” 하며 덤벼든다. 밤에 첫째를 겨우 재우면, 이번엔 둘째가 “아빠랑 더 놀고 싶어” 한다. 동기화 따윈 없고, 인터럽트는 무작위. CPU는 풀로드 상태고, 메모리는 이미 오버플로우다.

문제는 태스크 간 의존성이 없다는 점이다. 둘째가 울어 달래주면 첫째는 질투하고, 첫째를 달래는 사이 둘째는 또 운다. 첫째는 혼내는 와중에 둘째가 재롱을 피워 웃게 만든다. 두 아이는 각자 독립된 사용자(User)인데, 동시에 단일 관리자(Parent)를 요구한다. 멀티스레딩 환경에서 락도 없이 공유 자원을 다루는 셈이다. 게다가 모든 요청은 실시간이다. 대기열? 없다. 큐잉 시스템? 불가능하다. 즉시 반응하지 않으면 사용자 경험(UX)이 급격히 나빠진다.

가끔은 한 아이를 달래며 다른 아이를 멀리서 부를 수밖에 없다. “잠깐만, 이거 갈고 금방 갈게!” 하지만 그 ‘잠깐만’이 지나고 나면, 이미 무언가 망가져 있다. 첫째의 표정, 둘째의 컨디션, 혹은 나 자신의 인내심. 그 모든 게 매 순간 부서지고 재조립된다. 하루를 끝내고 침대에 누우면, 머릿속엔 하루 종일 실행되던 수많은 인터럽트와 실패한 병렬 작업들이 로그처럼 스쳐 지나간다.

이 병렬성은 단순히 처리량의 문제가 아니다. 두 아이가 동시에 나를 필요로 할 때, 나는 어느 하나를 선택해야 한다. 선택받지 못한 쪽의 마음은 곧 상처가 된다. 일의 우선순위처럼 정량화할 수 있는 기준이 없다. 상황은 항상 유동적이고, 감정은 예민하다. 실수는 반복되고, 피드백은 바로 주어진다. 첫째가 문득 묻는다. “아빠, 나보다는 동생이 더 중요해?” 그 말에 나는 아무 대답도 하지 못했다. 병렬성이 무너진 순간이었다.



롤백 없는 실패


개발에서는 테스트 환경에서의 실패는 괜찮다. CI/CD 파이프라인에서 실패하면 알람이 오고 배포를 막는다. 그 파이프라인에서 만들어준 로그를 보고 수정하면 된다. 잘못된 커밋은 리버트할 수 있고, 브랜치를 되돌릴 수 있다. 하지만 육아는 다르다. 여기에는 롤백이 없다. 아이에게 쏟아낸 말, 버럭 질러버린 목소리, 피곤해서 무심히 지나친 순간들. 모두 되돌릴 수 없다. 실수는 바로 기억이 되고, 아이의 감정에 남는다.

특히 둘을 동시에 케어하다 보면, 완성되지 않은 태스크가 중단되는 일이 많다. 첫째와 퍼즐을 맞추다 말고 둘째 기저귀를 갈러 가고, 둘째 양치를 시키다가 첫째의 질문을 듣지 못한다. 그때마다 아이들의 얼굴에 실망이 스친다. 개발 환경에서는 '중단된 세션'을 저장하고 다시 이어서 할 수 있지만, 육아에서는 흐름이 끊기면 다시 복구하기 어렵다. 아이들은 메모리가 아닌 감정으로 기억하니까. 실패는 로그가 아닌 흔적으로 남는다.

그리고 더 무서운 건, 내가 실수했다는 걸 너무 늦게 깨닫는다는 것이다. 그 순간에는 “지금 이게 먼저니까”라고 생각했지만, 나중에 돌아보면 더 중요한 건 아이의 눈빛이었다. 그리고 그 눈빛은 이미 꺼져 있다. 미안하다는 말을 꺼내기도 전에 아이는 등을 돌려버린다. 육아에는 자동 복구도, 에러 메시지도 없다. 오직 침묵과 거리감만이 남는다. 실패는 축적된다. 그 실패들에 자신감이 결여되면서 점차 난 일로 도망을 간다. 그리고 어느 날, 첫째가 묻는다. “아빠는 왜 맨날 일해?” 그 말 한마디에 수많은 실패가 요약된다.



쌓이는 로그


그런데 이런 '로그'라는 개념이 낯설게 느껴질 수도 있다. 쉽게 말하면, 하루 동안 내가 했던 실수나 아쉬운 순간들을 마음속에 저장해 두는 것이다. 개발자들은 프로그램에서 문제가 생기면 로그라는 이 '기록'을 통해 그 문제의 원인을 찾고 고친다. 나 역시 그런 식으로, 오늘 아이에게 너무 큰 소리를 냈던 순간, 질문을 무시했던 장면을 마음속에 적어둔다. 꼭 적지 않아도, 밤이 되면 그 장면들이 떠오른다. 그것이 내 마음속 로그다. 이 글을 작성하는 것도 결국엔 하나의 로그가 된다.

그리고 이 로그는 단순한 후회가 아니라, 다음 날을 바꾸기 위한 단서가 된다. 내일은 같은 실수를 줄이기 위해, 오늘을 복기하는 것이다. 로그는 문제를 찾아내기 위한 기록이자, 변화의 출발점이다. 그러니 실망하지 말자. 로그가 있다는 건, 내가 노력하고 있다는 뜻이니까. 개선은 그런 작은 기록에서부터 시작된다. 로그는 곧 개선의 기록이다.



유저가 둘일 때, UX는 다시 설계해야 한다


한 명의 사용자를 위한 시스템은 명확하다. 요구사항을 이해하고, 그에 맞춰 기능을 제공하면 된다. 그런데 사용자가 둘일 때는 이야기가 달라진다. 첫째는 활동적이고 대화 지향적이다. 함께 놀고, 말하고, 반응받기를 원한다. 반면 둘째는 아직 말도 제대로 못 하고, 울음과 몸짓으로 표현한다. 각자의 UX가 완전히 다르다. 하지만 이 둘은 동시에 같은 공간에서 서비스를 이용한다.

문제는 둘 중 누구에게 포커스를 맞추느냐다. 첫째와 보드게임을 하다가도, 둘째가 울면 모든 흐름이 중단된다. 그러면 첫째는 말한다. “아빠는 동생이 항상 먼저야.” 그 말에는 슬픔과 질투와 체념이 섞여 있다. 이 UX는 실패한 것이다. 좋은 UX란 모든 사용자가 존중받는 경험이어야 한다. 하지만 현실은 자원이 한정되어 있고, 요청은 동시다발적이며, 감정은 즉시 반응한다. 이 시스템에는 더 좋은 설계가 필요하다.

그래서 나는 고민한다. 어떻게 하면 둘 다 만족시킬 수 있을까. 어떤 순간에는 병렬 처리보다 빠른 전환이 필요하고, 어떤 순간에는 예열된 리소스를 써서 선제적으로 대응해야 한다. 예를 들어 둘째가 울기 전에 미리 안아주는 것, 첫째가 혼자 놀고 있을 때 가서 말을 건네는 것. 사소한 디테일이지만, 그것이 전체 사용자 경험을 바꾼다. 육아의 UX는 결국 마음의 인터페이스 설계다. 두 아이의 입장에서 바라보고, 반응하고, 조율하는 것. 완벽할 수는 없지만, 오늘보다 나은 흐름을 찾기 위한 반복 실험이다.



그럼에도, 운영은 계속된다


서비스가 불안정할 때도 운영은 멈추지 않는다. 긴급 패치를 하면서도, 유저의 요청은 들어오고, 트래픽은 멈추지 않는다. 육아도 마찬가지다. 내가 잠을 설쳤든, 감정이 무겁든, 아이들은 나보다 일찍, 아침 7시에 눈을 뜬다. “아빠, 일어나!” 그 한마디에 시스템은 다시 기동된다.

밤새 생각했다. 오늘은 더 나은 운영을 해보자고. 하지만 여전히 변수는 많고, 예기치 못한 상황은 벌어진다. 아이들이 말을 듣지 않고, 자매가 서로 다투고, 끊임없이 칭얼거리며 첫째가 아침부터 칭얼거린다. 그 와중에 회사에서 급한 연락이 오기도 한다. 그런데도 시스템은 돌아가야 한다. 아이들은 기다려주지 않는다. 로그아웃도, 일시정지도 없다. 운영자는 항상 온라인 상태다.

이럴 때 필요한 건 완벽함이 아니라 회복력이다. 무너지지 않고 다시 시작할 수 있는 힘. 오늘의 실패가 내일의 리팩토링이 되도록 만드는 마음. 때론 작은 자동화라도, 반복 작업을 줄여주는 루틴을 만드는 것만으로도 의미가 있다. 예를 들어 아이들 옷을 미리 정리해두거나, 아침 루틴을 그림으로 그려두는 것. 사소하지만, 이 시스템을 지속가능하게 만든다. 운영이란, 매일 반복되는 것 안에서 조금씩 개선점을 찾는 과정이니까.



매일의 운영일지


매일 밤, 나는 운영일지를 쓴다. 누가 보지 않아도, 로그가 저장되지 않아도. 그날의 에러와 수정사항, 예상치 못한 버그, 그리고 아주 작았지만 잘된 점들을 기록한다. “오늘은 화를 내지 않고 기다려줬다.” “첫째와 눈을 마주치고 웃어줬다.” “둘째가 엄마보다 아빠가 좋다고 했다.” 이런 문장들이 나를 지탱한다.

이 운영일지는 완벽하지 않다. 때론 빠뜨리기도 하고, 무력감에 쓰지 못하는 날도 있다. 그래도 이 기록이 있어야 나는 다음 날을 시작할 수 있다. 누적된 경험은 결국 나의 시스템을 바꾼다. 더 나은 설계, 더 빠른 대응, 더 안정적인 서비스. 그것은 거창한 변화가 아니라, 아주 작고 구체적인 반복의 결과다.

아이들은 자란다. 사용자는 계속 변화한다. 시스템도 계속 적응해야 한다. 그 안에서 나는 매일 새로운 태스크를 받고, 다시 일정을 조정하고, 실패하고, 복구하고, 사랑한다. 운영은 계속된다. 그리고 나는 오늘도 이렇게 운영일지를 쓴다.

이전 03화스테이징만 하고 푸시하지 못한 하루