변수는 많고 디폴트 값은 없다

어린이집 등원

by 박정욱

개발자의 세상에서 변수란


프로그래밍에서 '변수'란 값이 바뀔 수 있는 데이터를 담는 상자 같은 것이다. 오늘의 날씨, 사용자의 나이, 계좌 잔고처럼 상황에 따라 달라지는 정보들 말이다. 그리고 '디폴트 값'은 아무것도 정해지지 않았을 때 기본으로 설정되는 값이다. 마치 새로 산 핸드폰에 미리 설정되어 있는 벨소리나 화면 밝기처럼, 사용자가 별도로 조작하지 않아도 작동하는 기준값이다. 개발자는 이 변수들을 예측하고 통제하려 한다. 가능한 모든 경우의 수를 미리 계산해두고, 각각에 맞는 결과를 준비해둔다. A라는 조건이 들어오면 B라는 결과가, C라는 상황이면 D라는 반응이 나오도록 설계한다. 이것이 내가 매일 하는 일이다.


사용자가 로그인 버튼을 누르면 정확히 로그인 화면이 나타나고, 잘못된 비밀번호를 입력하면 "비밀번호가 틀렸습니다"라는 메시지가 뜬다. 온도 센서에서 25도라는 값이 들어오면 에어컨이 작동하고, 35도가 넘으면 경고 알림이 울린다. 모든 것이 예측 가능하고, 통제 가능하며, 논리적이다. 그런데 육아에는 그런 법칙이 통하지 않는다. 아이를 키우면서 뼈저리게 깨달았다. 아이는 내가 설계할 수 있는 시스템이 아니었다.


조건문의 신뢰가 무너지던 순간


개발자에게 가장 기본적인 사고는 이것이다. "정해진 조건을 만족시키면, 원하는 결과가 나온다." 인자 값을 주고, 환경을 구성하고, 흐름을 따라 들어가서 조건을 통과시키면 예측 가능한 출력이 나온다. 그것이 개발의 기본이자 전부였다. 그래서 나는 환경 변수 하나, 데이터 타입 하나에도 집착했다. 결과는 조건에 따라 움직이고, 조건을 완벽하게 설계하면 완벽한 결과를 얻을 수 있다고 믿었다. 코드는 거짓말하지 않았고, 논리는 배신하지 않았다. 1과 1을 더하면 언제나 2가 나왔고, true는 항상 true였다.


수년간 개발자로 살아오면서 나는 이 확실성에 익숙해져 있었다. 버그가 생기면 원인을 찾을 수 있었고, 문제가 발생하면 해결책이 있었다. 개발자 커뮤니티에서 답을 찾거나, 동료와 토론하거나, 밤새 디버깅하면 결국 해결되었다. 모든 것에는 이유가 있었고, 모든 문제에는 답이 있었다. 내가 만든 코드는 내 의도대로 작동했다. 사용자 인터페이스는 내가 설계한 대로 반응했고, 데이터베이스는 내가 요청한 정보를 정확히 돌려주었다. 이런 예측 가능성이 나에게는 일상이었고, 안전지대였다. 그런데 첫째가 태어나고 나서, 내가 알던 세상의 법칙이 송두리째 흔들렸다. 아이는 내 코드가 아니었다. 내가 설계하지 않았고, 내가 통제할 수 없는 존재였다.


매일 아침이 주는 예상치 못한 질문들


등원 준비는 분명 루틴처럼 시작된다. 기상 → 밥 먹이기 → 씻기기 → 옷 입히기 → 머리 묶기 → 등원. 반복문처럼 보이지만, 실제로는 전혀 다른 알고리즘이 매일 실행된다. 같은 코드를 실행하는데 매번 다른 결과가 나오는 신기한 프로그램 같다. 어제까지 잘 먹던 반찬을 오늘은 먹기 싫다며 울고, 입혀놓은 옷을 벗고 한겨울에 반팔과 반바지를 고집한다. 양말은 신기 싫고, 씻는 것은 더욱 싫다고 한다. 양치를 시키는 것은 전쟁이다. 갑자기 색연필을 찾느라 분주해지거나, 언니 신발이 자기 것이라고 주장하며 소리친다. 등원길은 5분 거리가 15분의 여행이 된다. 세상 모든 것에 관심 있고, 지나가던 개미에 시선을 뺏기고, 편의점을 온전히 지나치는 것도 쉽지 않다.


첫째는 평소에는 말을 잘 듣는 편이다. 그래서 더 당황스럽다. 어제까지만 해도 "첫째야, 옷 입자"라고 하면 순순히 따라주던 아이가, 오늘은 갑자기 다른 사람이 된 것처럼 모든 것에 반대한다. 기분이 좋은 날에는 10분 만에 끝나는 등원 준비가, 기분이 안 좋은 날에는 30분도 모자란다. 첫째의 컨디션이 그날 아침의 변수값을 결정하는 핵심 요소다. 그리고 등원길의 편의점은 또 다른 복병이다. 매일 지나는 길인데도 아이들은 마치 처음 보는 것처럼 "어? 편의점이다!"라며 들어가고 싶어 한다. "오늘은 그냥 지나가자"라고 해도 아빠의 말은 상관없다는 듯 냅다 편의점으로 뛰어 들어간다. 때로는 "목 말라"라며 음료수를 사달라고 하거나, "배고파"라며 간식을 요구한다. 5분 거리 등원길에서 편의점 앞에서만 10분을 보내는 날도 있다.


둘째는 또 다른 변수다. 언니가 하는 건 무조건 따라 해야 하고, 언니 것은 무조건 자기 것이어야 한다. 언니가 신발을 신으면 똑같은 신발을 찾고, 없으면 운다. 언니가 가방을 메면 자기도 가방을 메야 하는데, 정작 자기 가방은 싫고 언니 가방을 메겠다고 한다. 이런 상황에서 언니는 자기 물건을 뺏긴다고 울고, 동생은 갖지 못한다고 운다. 이 모든 변수가 하나도 예고되지 않는다. 전날 잠을 얼마나 잤는지, 날씨는 어떤지, 누가 먼저 일어났는지, 심지어 아빠 얼굴을 처음 본 시점인지 아니면 이미 엄마와 놀다가 본 시점인지에 따라 결과가 달라진다. 어제 성공했던 전략이 오늘은 완전히 실패하고, 예상치 못한 곳에서 새로운 문제가 터진다. 내가 설계한 완벽한 아침 루틴은 첫 번째 예외에서 무너져 내렸다. 아니, 예외가 아니라 그것이 일상이었다.


시간의 압박 속에서 마주한 나의 한계


시간이 넉넉할 때는 귀엽다. 비도 안 오는데 비옷을 입겠다는 아이를 보며 다시 갈아입힐 생각으로 웃을 수 있다. 언니가 입으면 동생도 따라한다. 날씨에 맞지 않는 옷을 입은 아이들의 사진을 찍으며 이런 순간들이 나중에는 추억이 될 거라고 생각한다. 하지만 출근 시간이 다가오면 상황은 완전히 달라진다. 나는 서두르게 되고, 아이는 더 느려진다. 마치 내가 급할수록 아이는 의도적으로 더 천천히 움직이는 것처럼 느껴진다. 양말을 신으려다 말고 갑자기 책을 읽기 시작하고, 엘레베이터만 타면 화장실에 가고 싶다고 한다. 내 안의 개발자적 효율성과 아이의 자유로운 시간 감각이 정면충돌한다.


결국 목소리가 올라간다. "빨리 좀 하자", "왜 또 이래", "아휴 제발 좀!" 그 순간 아이의 표정이 굳어지는 걸 본다. 즐겁게 시작된 아침이 갑자기 전쟁터가 되고, 아이는 울기 시작한다. 결국 더 늦은 등원을 하게 된다. 나 역시 아이를 재촉하는 내 모습이 싫어져서 마음이 무거워진다. 회사에 도착해서도 그 여운이 남는다. 아이가 울며 어린이집에 들어가는 모습이 자꾸 떠오르고, 아침에 좀 더 여유롭게 대해줄 걸 하는 후회가 밀려온다. '또 소리를 질렀구나', '아이에게 상처를 줬을까' 하는 자책감이 온종일 따라다닌다. 동시에 다음번의 등원에도 똑같은 상황이 반복될 거라는 예감에 한숨이 나온다.


이런 날이 반복되면서 깨달았다. 아이가 문제가 아니라 내가 변수를 너무 좁게 잡은 설계를 했다. 나는 아직도 육아를 코드 짜듯이 접근하고 있었다. 아이라는 존재를 통제 가능한 함수로 여기고, 입력값만 정확히 주면 원하는 출력이 나올 거라고 착각하고 있었던 것이다. 아빠와의 등원이 쉽지 않아 출근이 좀 더 여유 있는 엄마와 등원하는 경우가 많다. 하지만 아내의 이야기를 들어보면 엄마도 같은 고통을 겪고 있다. 아이들에게는 아빠냐 엄마냐가 중요한 게 아니라, 어른의 계획과 아이들의 리듬이 맞지 않는다는 게 본질적인 문제였다. 육아에서는 누구도 예외가 될 수 없다.


예외 상황이 기본값이 되는 순간


개발에서는 '예외 케이스'를 만든다. 하지만 육아에서는 예외가 예외가 아니다. 예외가 곧 기본이고, 기본이 예외다. 예외가 너무 많으면 시스템 자체가 무의미해진다. 나에게는 완전히 새로운 패러다임이 필요했다. 아이의 기분은 상수가 아니다. 매번 바뀌는 변수이고, 어떤 날은 잘 되던 API가 같은 요청 값에도 에러 코드를 리턴하는 것처럼 예상치 못한 응답을 보내기도 한다. 하지만 그것은 버그가 아니라 원래 그런 구조였다. 내가 시스템을 잘못 이해하고 있었던 것이다.


오은영 선생님의 말 중 인상적인 것이 있다. 말을 안 듣는 것이 아이들의 디폴트값이라는 것이다. 이 말을 처음 들었을 때는 충격이었다. 내가 그동안 '말을 잘 듣는 것'을 기본값으로 설정하고, '말을 안 듣는 것'을 예외상황으로 여겨왔던 것이다. 하지만 실제로는 정반대였다. 말을 잘 듣는 날이 기적이고, 그것은 운이 좋은 케이스일 뿐이다. 아이들에게는 자신의 의견을 표현하고, 세상을 탐험하고, 경계를 시험해보는 것이 자연스러운 행동이다. 어른의 지시를 따르는 것보다는 자신의 호기심을 따르는 것이 본능이다.


그래서 나는 디폴트 설정을 바꿔야 했다. '말을 안 들을 것이다'를 전제로 플로우를 짜야 최소한 내가 무너지지 않는다. 이것을 배워가고 있다. 이것은 체념이 아니라 현실적인 접근이었다. 아이의 본성을 인정하고, 그 안에서 소통하는 방법을 찾는 것이었다. 오늘도 당연히 등원은 쉽지 않을 것을 생각하고, 내가 등원을 준비할 때면 더 일찍 아침을 시작한다. 예상되는 모든 예외상황에 대한 플랜 B, 플랜 C를 미리 준비해둔다. 하지만 그럼에도 불구하고 아이들은 플랜 D를 만들어낸다.


유연함을 배우는 매일들


아이를 컨트롤하려고 하면 화가 난다. 하지만 변수를 인정하고, 그 안에서 유연하게 대처하려고 하면 조금은 덜 지친다. 매일 실패하고, 또 리팩토링하고, 새벽에 혼자 회고하며 다음 날을 준비한다. 이 과정에서 나는 개발자로서 배우지 못했던 새로운 종류의 문제 해결 능력을 기르고 있다.


코드에서는 명확한 에러 메시지가 나온다. "Null Pointer Exception", "Index Out of Bounds", "Syntax Error"처럼 무엇이 잘못되었는지 정확히 알려준다. 하지만 아이가 떼를 쓰는 이유는 명확하지 않다. 친구와 싸웠는 건지, 어린이집에서 무슨 일이 있었는 건지, 단순히 관심을 끌고 싶은 건지, 아니면 그냥 컨디션이 안 좋은 건지 추측해야 한다. 때로는 여러 가지 이유가 복합적으로 작용하기도 하고, 때로는 아이 스스로도 자신의 감정을 정확히 표현하지 못하기도 한다.


그래서 나는 점점 더 섬세한 관찰자가 되어가고 있다. 아이의 표정, 목소리 톤, 몸짓, 평소와 다른 행동 패턴들을 읽어내려고 노력한다. 마치 로그를 분석하듯이 아이의 하루를 되돌아보며, 어떤 상황에서 어떤 반응이 나오는지 패턴을 찾으려 한다. 오늘도 디버깅은 완전하지 않았지만, 시스템은 멈추지 않았다. 그리고 나는 조금씩 깨달아가고 있다. 육아는 완벽한 코드를 짜는 일이 아니라 예측 불가능한 상황에서도 시스템이 돌아가도록 하는 일이다. 때로는 임시방편도 괜찮고, 때로는 완전히 다른 접근법이 필요하다.


아름다운 변수와 함께하는 삶


내일도 나는 같은 조건에서 다른 결과를 마주하며 이 루틴을 시작할 것이다. 하지만 이제는 안다. 완벽한 조건문을 짜려 애쓰는 대신, 아이라는 가장 아름다운 변수와 함께 살아가는 법을 배우고 있다. 개발자로서 나는 늘 확실성을 추구해왔다. 예측 가능한 결과, 통제 가능한 환경, 논리적인 흐름. 하지만 아이들은 나에게 불확실성의 아름다움을 가르쳐주고 있다. 계획에 없던 웃음, 예상치 못한 포옹, 갑작스러운 "아빠 사랑해"라는 말들이 내 하루를 더 풍요롭게 만든다.


가끔은 생각한다. 만약 아이들이 내 코드처럼 완벽하게 예측 가능하다면 어떨까? 매일 같은 시간에 일어나고, 같은 음식을 먹고, 같은 옷을 입고, 말을 잘 듣는다면? 아마도 훨씬 효율적이고 편할 것이다. 하지만 그런 삶에는 놀라움이 없을 것이다. 성장도, 발견도, 감동도 없을 것이다. 어제는 첫째가 갑자기 "아빠, 구름이 솜사탕 같지 않아?"라고 물었다. 등원길에서 편의점 들어가겠다고 떼쓰던 그 아이가, 하늘을 올려다보며 던진 시적인 질문이었다. 그 순간 나는 깨달았다. 아이들의 예측 불가능함이 때로는 이런 선물을 가져다준다.


아이들은 매일 나를 새로운 상황에 노출시킨다. 내가 모르던 나의 인내심, 내가 몰랐던 나의 창의성, 내가 예상하지 못했던 나의 부드러움을 발견하게 한다. 이것은 어떤 코드로도 구현할 수 없는 경험이다. 버그가 아니라 피처(feature)인 셈이다.



이전 01화[프롤로그] 프로젝트에 착수하며