개발자에게 함수는 질서의 언어다. 일정한 인자를 넣으면, 정해진 로직을 통해 예상한 값을 돌려주는 안정적인 구조. 입력이 같으면 출력도 같다, 그게 순수함수의 매력이다. 부작용 없이 깔끔한 로직. 그래서 우리는 언제나 return이 있는 라인에 집중한다. 그 한 줄은 개발자의 자존심이자 위안이다. 복잡한 로직을 통과해 결국 값 하나를 내놓는 그 결론. 가장 많은 버그를 야기하기도 하고 가장 논리 정연하기도 한 구문이다.
하지만 육아는 다르다. 전혀 다르다. 오늘 아이가 좋아하던 바나나가, 내일은 "냄새 나서 싫어"가 된다. 어제는 스스로 양치하더니, 오늘은 치약이 마음에 안 든다고 소리를 지른다. 같은 입력을 넣어도, 결과는 랜덤. 분명히 똑같이 했는데 왜 오늘은 화를 내는 걸까. 로직을 아무리 되짚어도 재현되지 않는다. 테스트 케이스는 통과하지 못하고, 디버깅은 끝이 없다.
육아는 시작부터 많은 것을 요구한다. 시간, 체력, 감정, 경제력. 모든 리소스를 투입해야 하는데, 리턴값은 종종 예측불가거나 지연된다. 밤새 안아주고, 낮엔 기어 다니는 아이를 쫓아다니며 등허리가 부서진다. 그럼에도 함수는 멈추지 않는다. 휴식 없는 호출. 리소스를 소진하면서도 계속 돌아간다. 아무리 최적화를 해도, 반복문은 줄지 않는다.
주말도 예외는 아니다. 오히려 호출 횟수가 더 많다. "이거 해줘!" "저거도 해줘!" "왜 안 돼?"라는 메시지는 대기열에 쌓이고, 나는 동시 처리도 안 되는 단일 스레드로 이 모든 걸 응답해야 한다. 가끔은 나도 멈추고 싶다. 그런데 중단하면 에러가 난다. 아이는 울고, 나는 더 지친다. 결국 다시 함수가 호출된다. 희생이 디폴트값이란 걸 이제야 깨닫는다.
"이거 치우고 이거 놀자!" 아이에게 이렇게 말한 건, 일관적인 UX 플로우 설계였다. 이전 상태를 정리하고 다음 상태로 넘어가는 안정적인 흐름. 그러나 현실에서는 "아니야! 둘 다 할 거야!"라는 응답이 돌아온다. 분명 if문도 넣었고, 예외 처리도 했는데. 코드 상으론 분명 문제없는데, 실사용자(아이)는 납득하지 않는다. 결국 나는 장난감 위에 앉아 있고, 아이는 신나게 그 위에 또 장난감을 쌓는다.
몇 번이고 새로 시도한다. 분류 시스템도 제안해보고, 함께 정리하는 놀이처럼 만들어도 본다. 효과는 잠깐뿐이다. 시스템 메시지로 "이건 여기에 넣는 거야"라고 안내해도, 아이는 무시한다. 분류 기준이 이해되지 않은 것인지, 무시당한 것인지 구분조차 어렵다. 어느 순간 아이는 다른 장난감으로 이동하고, 나는 홀로 정리하다 지쳐서 멈춘다. 설계 의도는 있었지만, 사용자는 그런 의도와 상관없이 행동한다. 반복문 속에서 결국 나만 제자리를 맴돈다. 테스트 커버리지를 높여도 실패율은 줄어들지 않는다. 이쯤 되면 함수가 아니라 함정이다.
저녁. 김이 모락모락 나는 국에, 반찬까지 예쁘게 담아 냈다. UX 고려했고, 시각 디자인도 챙겼다. 한 숟가락 한 숟가락마다 마음을 담았고, 채소를 곱게 다져서 보기 좋게 했고, 영양소까지 고려해 레이아웃을 구성했다. 그런데 아이는 고개를 젓는다. "이거 말고 간식 줘." 이건 마치 로그인 페이지에서 비밀번호를 5번 틀린 뒤, "이 사이트 못 쓰겠어" 하고 나가버리는 것과 같다. 나는 설명한다. "밥 먹어야 간식도 먹지." 조건문을 설정했으나, 아이는 "조건문 무시()"를 호출한다. 울기 시작하면 반복문 진입. 밥은 점점 식고, 나의 인내심도 점점 식는다. 결국 오늘도 먹인 건 밥이 아니라 감정이었다. 재료의 온도는 내려가고, 집안의 분위기 온도도 내려간다. 그 와중에 아이는 밥 위에 간식인 과자를 올려놓고 새로운 조합을 시도한다. 이건 테스트가 아니라 해킹이다.
이벤트 핸들링도 실패한다. 숟가락을 손에 쥐여줘도 바닥에 던지고, 말로 유도해도 무반응. 기능이 구현된 것 같은데 실행되지 않는다. 이쯤 되면 로직보다 감정 상태가 더 중요한 변수라는 걸 인정하게 된다. 결국 내가 굴복한다. “한 입만 먹자…” 하는 목소리가 절박하다. 그 순간 아이가 한 숟가락을 뜨면, 나는 ‘성공’이라고 착각한다. 하지만 다음 끼니에서 또 같은 상황이 반복된다. 함수는 돌아가지만, 로직은 완성되지 않는다.
육아는 순수함수가 아니다. 인풋도 불안정하고, 로직도 복잡하고, 예외 상황은 끝이 없다. 가끔은 내 감정 상태가 글로벌 변수처럼 여기저기 영향을 준다. 재사용성은 낮고, 유지보수는 어렵다. 무엇보다 이 함수는 처음부터 비용이 크다. 내 수면 시간과 자유 시간, 심지어 자존감까지 쓰인다. 그런데도 매일 새로 호출되는 이유는 뭘까? 바로 이 마지막 줄 때문이다.
return 행복;
희생이 많았던 하루도, 예상대로 흘러가지 않았던 순간도, 되돌아보면 웃음 짓게 된다. 그건 결과값 때문이 아니라, 아이가 있기 때문이다. 그리고 그 아이가 날 웃게 한다. 그건 어떤 테스트 코드로도 증명되지 않지만, 내 안에서 가장 명확하게 증명되는 값이다. 오늘도 실수투성이였지만, 잠든 아이 얼굴을 보며 나는 안다. 이 함수는 실패가 아니라, 반복 호출되는 성장이다. 그리고 결국 그 끝엔 늘 한 줄이 남는다.
return 행복;