사이드 이펙트

by 박정욱

의도하지 않은 흔적들


개발을 하다보면 단순히 버튼의 위치만 바꾸려고 했는데, 갑자기 전혀 다른 페이지의 레이아웃이 무너져버리는 일이 비일비재하다. 이것을 우리는 '사이드 이펙트(Side Effect)'라고 부른다. 함수나 코드가 본래 의도한 결과 외에 예상치 못한 다른 영향을 미치는 현상을 말하는데, 개발자들이 가장 두려워하는 순간 중 하나다. 전역 변수를 건드렸더니 전혀 상관없어 보이던 기능이 오작동하고, 데이터베이스에서 하나의 값을 바꿨더니 연쇄적으로 여러 테이블의 관계가 깨져버리는 일들이 그것이다.


그래서 우리는 이런 사이드 이펙트를 방어하기 위해 온갖 노력을 기울인다. 테스트 코드를 꼼꼼히 작성해서 변경 사항이 다른 부분에 미칠 영향을 미리 확인하고, 각 기능을 최대한 독립적으로 설계해서 서로 간섭하지 않도록 만든다. 순수 함수라는 개념을 지향하며, 입력값이 같으면 항상 같은 결과를 내놓고 외부에 아무런 영향을 주지 않는 코드를 작성하려 애쓴다. 하지만 현실의 프로그램은 완벽하게 독립적일 수 없고, 언제나 예상치 못한 사이드 이펙트가 숨어 있다.



아이의 마음에 남겨진 예외처리들


육아를 하면서 나는 개발 현장에서보다 훨씬 더 많은 사이드 이펙트를 마주하게 된다. 첫째에게 좋은 아빠가 되려고 했던 모든 행동들이 둘째에게는 전혀 다른 의미로 해석되어 상처가 되기도 한다. 언니에게 "너는 언니니까 참아야 해"라고 말했던 것이 동생에게는 "나는 사랑받지 못하는 존재"라는 메시지로 전달되는 것을 목격하게 된다. 아이들을 위해 한 선택이 아내에게는 또 다른 부담이 되어 부부 관계에 균열을 만들어내기도 한다.


첫째가 수학 학습지를 하는데 어려워해서 차근차근 설명해주었다. 내 의도는 순수했다. 아이가 이해할 때까지 인내심을 갖고 도와주는 것, 그 이상도 그 이하도 아니었다. 하지만 옆에서 지켜보던 네 살 둘째는 전혀 다른 감정을 느꼈다. 아빠가 언니에게만 관심을 쏟고 있다는 외로움이 그 아이의 마음 어딘가에 조용히 축적되고 있었던 것이다. 개발에서라면 이런 상황을 방지하기 위해 함수의 스코프를 명확히 분리하고, 전역 변수 사용을 최소화하며, 각 모듈 간의 의존성을 철저히 관리했을 텐데, 육아에서는 그런 격리가 불가능하다.


그 마음은 곧 자신에게 관심을 쏟으라는 의미로 행동한다. 그리고 그 행동은 보통 사건, 사고로 이뤄진다. 단순히 실수하거나 의도치 않음이라기 보다 아빠의 관심을 끌기 위해 이불을 어지럽히거나 물을 쏟는 행동을 하게 된다. 나는 오랜 시간이 걸려 이 것들이 내 행동이 만들어낸 사이드 이펙트를 깨달았다. 아이의 요청은 "나도 언니처럼 아빠의 관심을 받고 싶다"는 절절한 신호였고, "나도 사랑받을 자격이 있다"는 확인을 구하는 몸짓이었다. 내가 의도하지 않았던 곳에서, 예상하지 못했던 방식으로, 아이의 마음에 새로운 요구사항이 생성되어 있었던 것이다.



테스트할 수 없는 관계의 복잡성


개발에서 사이드 이펙트를 관리하는 가장 확실한 방법은 테스트다. 유닛 테스트, 통합 테스트, e2e 테스트를 통해 코드의 변경이 다른 부분에 미치는 영향을 미리 확인하고 검증한다. 하지만 육아에서는 이런 테스트가 불가능하다. 아이의 마음은 복잡한 관계의 그물망 속에서 실시간으로 변화하고, 한 번의 말이나 행동이 어떤 결과를 낳을지 미리 알 수 없다.


아내와의 관계도 마찬가지다. 아이들과 놀아주려고 주말에 집에 있었던 것이, 아내에게는 "집안일은 나 혼자 하라는 뜻"으로 해석되어 갈등의 씨앗이 되기도 한다. 첫째의 학습을 챙기느라 둘째와의 시간이 줄어들고, 둘째와 놀아주느라 아내와의 대화 시간이 부족해진다. 가족이라는 시스템 안에서 모든 관계는 서로 연결되어 있고, 한 곳에서의 변화는 반드시 다른 곳에 예상치 못한 파급효과를 만들어낸다.


아이가 자신의 책상과 이불 청소를 열심히 했고 난 아이에게 잘했다는 의미로 유투브를 틀어줬다. 그리고 말도 "너가 잘 했으니 상의 의미로 보여주는거야" 라고 말했다. 그러고 며칠 뒤 둘째가 열심히 인형을 정리하고 나에게 열심히 청소했다고 자랑했다. 나는 격하게 칭찬하였지만 잠시 뒤 줄째는 갑자기 투정을 부리고 아무 이유 없이 짜증냈다. 첫째는 그 의도를 명확히 이해했었지만 둘째는 청소하면 유투브 영상을 볼 수 있다는 잘못된 학습으로 이어진 것이었다. 이것이 바로 육아에서 마주하는 사이드 이펙트의 복잡함이다.



버그 없는 사랑의 불가능성


개발에서는 버그 없는 완벽한 코드를 지향한다. 함수형 프로그래밍의 순수 함수처럼, 외부에 영향을 주지 않으면서도 예측 가능한 결과를 내놓는 것이 이상적이다. 하지만 육아는 정반대다. 사랑은 본질적으로 사이드 이펙트를 동반한다. 아이를 사랑한다는 것은 그 아이의 존재가 나의 모든 것을 변화시킨다는 뜻이고, 내가 하는 모든 행동이 아이에게 의도치 않은 영향을 미칠 수밖에 없다는 현실을 받아들이는 것이다.


어느 날 저녁, 일곱 살 첫째가 "아빠, 나 때문에 동생이 울면 왜 나한테 화내요?"라고 물었다. 순간 가슴이 철렁했다. 나는 단지 네 살 둘째를 달래려고 했을 뿐인데, 첫째는 그것을 자신에 대한 비난으로 받아들이고 있었던 것이다. 둘째를 보호하려던 나의 행동이 첫째에게는 "너는 동생보다 덜 중요하다"는 메시지로 전달되었고, 그 아이의 마음 어딘가에 조용한 상처가 남겨지고 있었던 것이다. 참 어렵다. 특히 외동으로 자란 나에게는 자매라는 관계를 사이드 이펙트없이 해결하리란 너무 어렵다.


코드에서는 사이드 이펙트를 최소화하려고 노력하지만, 육아에서는 오히려 그 사이드 이펙트들을 인정하고 받아들이는 것이 중요하다는 생각이 들었다. 완벽한 부모가 되려고 하는 것보다, 불완전한 사랑이 만들어내는 예측 불가능한 결과들을 함께 감당해나가는 것이 진짜 육아인지도 모른다. 아이들도 결국은 그런 불완전함 속에서 자라나며, 완벽하지 않은 사랑을 통해 인간다운 관계를 배워나가는 것이니까.



디버깅할 수 없는 마음


개발에서 버그가 발생하면 우리는 디버깅을 한다. 로그를 찍어보고, 단계별로 코드를 실행해보며, 어디서 문제가 발생했는지 추적한다. 문제의 원인을 찾아내면 해결책도 명확해진다. 하지만 아이의 마음은 디버깅할 수 없다. 왜 갑자기 짜증을 내는지, 언제부터 말을 안 듣기 시작했는지, 그 근본 원인을 찾기란 쉽지 않다. 그리고 잘 말해주지도 않는다. 사실 스스로가 자신이 왜 짜증을 내는지 알고 있는지도 모르겠다.


며칠 전 둘째가 갑자기 밤에 자다가 울면서 깼다. "엄마가 어디 갔어?"라고 물으며 불안해했는데, 엄마는 바로 옆에서 자고 있었다. 아이를 달래면서 나는 계속 생각했다. 언제부터 이 아이가 이런 분리불안을 느끼기 시작했을까? 내가 무심코 했던 어떤 말이나 행동이 이 아이의 마음에 불안이라는 예외 상황을 만들어낸 것은 아닐까? 하지만 아무리 생각해봐도 명확한 원인을 찾을 수 없었다. 육아에서는 콘솔창에 에러 메시지가 뜨지 않는다. 아이의 마음속에서 무엇이 잘못되었는지 정확히 알 수 있는 방법은 없다.


개발에서라면 이런 상황에서 롤백을 했을 것이다. 문제가 생긴 코드를 이전 상태로 되돌리고, 다시 천천히 안전하게 수정해나가는 것이다. 하지만 육아에서는 롤백이 불가능하다. 이미 아이의 마음에 새겨진 경험들을 되돌릴 수는 없고, 시간을 거슬러 올라가 다시 할 수도 없다. 그저 현재의 상황을 받아들이고, 앞으로 더 조심스럽게 접근할 수밖에 없다. 때로는 내가 저질렀을지도 모르는 실수의 결과를 평생 안고 살아가야 한다는 무거운 책임감이 어깨를 짓누른다.



예외 상황 속에서 배우는 것들


그런데 이상한 일이다. 개발에서는 사이드 이펙트를 최대한 피하려고 노력하지만, 육아에서는 오히려 그 사이드 이펙트들이 때로는 아름다운 순간을 만들어내기도 한다. 첫째를 혼내려고 했던 엄격한 목소리가 우연히 둘째에게는 "아빠가 나를 보호해주고 있다"는 안정감으로 전달되기도 하고, 아이들을 재우려고 부른 자장가가 아내에게는 오랜만에 듣는 따뜻한 선물이 되기도 한다.


첫째가 코로나에 걸렸을 때의 일이다. 아이를 돌보느라 며칠간 회사 일을 제대로 못했고, 이어서 나와 아내도 코로나에 걸렸다. 둘 다 고열이 있음에도 불구하고 밤새 간병하느라 피곤해서 평소보다 말수가 줄어들었다. 심지어 아내는 둘째 임신 중이어서 해열제조차 먹을 수 없이 스스로의 면역력으로 견뎌야 했다. 나도 오한과 몸살로 힘들지만 움직여야 했다. 아마 평소 같았으면 짜증을 엄청 냈을 것이다. 그런데 오히려 그 시간 동안 우리 가족은 더 가까워졌다. 자신도 아프면서 지친 나를 도와주려는 아내의 세심한 배려를 새삼 느꼈다. 내가 의도했던 것은 단순히 아픈 아이를 돌보는 것이었는데, 그 과정에서 가족 전체가 서로를 더 깊이 이해하게 되는 예상치 못한 사이드 이펙트가 발생한 것이다.



의존성 관리의 미학


개발에서 가장 중요한 것 중 하나는 의존성 관리다. 어떤 모듈이 다른 모듈에 의존하고 있는지 명확히 파악하고, 그 관계를 최대한 단순하게 유지하려고 노력한다. 하지만 가족이라는 시스템에서는 모든 구성원이 서로에게 복잡하게 의존하고 있고, 그 관계를 단순화할 수도, 완전히 독립시킬 수도 없다. 첫째의 감정은 둘째의 감정에 영향을 주고, 둘째의 행동은 다시 부부관계에 영향을 미치며, 부부의 관계는 또다시 아이들의 안정감에 직접적인 영향을 준다.


아내와 말다툼이 있었던 적이 있다. 별것 아닌 일이었지만 서로 목소리가 높아졌고, 우리는 그것이 아이들에게 영향가지 않도록 조심했다고 생각했다. 하지만 다음 날 아침 첫째가 평소와 달리 조심스럽게 행동하는 것을 보면서, 아이들이 이미 우리의 미묘한 변화를 감지하고 있었다는 것을 알 수 있었다. 부모의 관계라는 기반 시스템에 발생한 작은 오류가, 아이들의 행동 패턴에까지 영향을 미치고 있었던 것이다. 이것이 바로 가족이라는 복잡한 의존성 구조에서 벌어지는 사이드 이펙트의 현실이다.


육아에서는 완벽한 의존성 관리가 불가능하다면, 차라리 그 복잡한 관계들을 인정하고 포용하는 것이 더 현명할지도 모른다. 개발에서 추구하는 모듈화와 독립성이 아니라, 서로가 서로에게 영향을 주고받으면서도 전체적으로는 조화로운 시스템을 만들어가는 것이 가족의 진정한 모습일 것이다. 완벽하게 예측 가능한 관계보다는, 예상치 못한 순간들 속에서도 서로를 신뢰하고 사랑할 수 있는 관계가 더 아름다운 것이 아닐까.