Goodbye, Clean Code? 형식과 내용에 대해서. 그리고 복잡도에 대해서.
2020 / 01 / 19
내용은 근본적으로는 어떠한 실체, spiritual할 수도 있고요, 사상일 수도 있는데, 이것이 형식으로 발현이 되요. 그래서 흔히, 우리는 문화를 반드시 스타일(=형식)을 통해서 이해하게 되어 있어요. 그 안에 philosophy(=내용)을 탐구하게 되는 거죠.
문제는 뭐냐면, 처음에 이런 것들이 갖추어 질 때는 사람들이 philosophy와 형식 두 가지를 다 알게 되어 있어요. 첫 사람들은. 그것이 만들어지는 과정을 보았기 때문에. 그런데 이것이 조금만 시간이 지나면? 형식만 남고! 내용이 잊혀져요. 아세요? 그래서 문화는 되게 이상한 방식으로 고착화돼요.
여러분들 결혼식장 가면 양복 입은 아빠 옆에 한복 입은 엄마가 있는 것 아시죠. 아무렇지 않죠? 되게 이상한 거 아세요? 그런게 바로 문화에요. 형식이 고착화되면 당연하게 여겨요.
- 한명수 상무, <우아한형제들 디자인 왜WHY> 강의중에서.
2018년 10월 15일 우아한형제들에 입사했다. 신규입사자 교육영상중에서 지금까지도 기억에 남는 것은 단연코 한명수 상무님의 강의다. 문화의 형식과 내용에 대한 강의였고, 많은 업체들이 우아한형제들을 따라하려고 해도 제대로 따라하지 못하는 이유를 설명했다.
핵심은, '문화는 형식과 내용으로 이루어져 있고, 문화의 초기 구성원들은 형식과 내용 모두를 알고 있지만, 이 외의 사람들은 형식밖에 느끼지 못한다'는 것이다. 문화는 필연적으로 형식을 통해 느낄 수밖에 없고, 내용을 파악하기 위해선 '왜WHY'를 통해 탐구해야만 한다.
문화는 형식과 내용으로 이루어짐.
- 형식 : Pattern, Style.
- 내용 : Philosophy, Contents, Story, Why.
내용은 형식에 가려져있다.
문화를 형성한 초기 구성원들은 philosophy를 알지만, 문화가 정착되고 나면 겉에서 보이는 style만 남게된다. 내용이 잊혀진다.
사진 공부는 '사진의 형식과 내용'을 만들고 담는 공부라고 할 수 있습니다. 형식은 내용을 담는 그릇이고, 내용은 형식에 담기는 어떤 것입니다. 예를 들어 수박은 수박 알맹이를 담습니다. 물론 호박은 호박 알맹이를 담지요. 수박의 모양은 형식이고 수박의 알맹이는 내용입니다. 호박도 그렇지요. 이렇듯 형식과 내용은 분리하기 어렵습니다. ⟪사진에 관하여On Photography⟫(1977)을 쓴 수전 손택Susan Sontag도 "형식은 내용의 일종이고 내용은 형식의 한 측면"이라고 말했습니다.
이 주장이 옳다고 보면, 형식과 내용은 떼려야 뗄 수 없습니다. 그렇다고 형식이 곧 내용은 아닙니다. 형식은 모든 존재하는 요소나 그 이행 과정을 통합하여 일정한 존재, 일정한 과정으로 만드는 것입니다. 내용은 그 안에 통합되어 있는 어떤 것입니다. 이는 곧 어떤 것도 형식과 내용 없이는 존재할 수 없음을 의미합니다.
그렇다면 여러분이 찍는 사진은 바로 형식이자 곧 내용이라고 말할 수 있습니다. 그러나 불행하게도 사진을 찍는답시고 죽도록 앞 세대가 남기고 간 '형식'만 흉내 냅니다. 더더욱 안타까운 일은 형식에 일련의 내용이 담긴다는 사실을 깨닫지 못하는 것입니다.
실험이 끝나버린 앞 세대의 형식만 흉내 내다가 몇십 년을 투자하고도 사라진 아마추어 사진가가 부지기수인 이유는 바로 여기에 있습니다. 정작 그들은 자신이 무엇을 했는지 모릅니다. 오히려 선배가 한 일을 이어서 했음을 자랑으로 여깁니다. 그럼 어떻게 새로운 사진이 등장할 수 있겠습니까? 정말 안타깝습니다.
- 김홍의, 형식과 내용, <사진 잘 찍는 법>, 2019, 김영사, p17-18
그러므로 너희는 가서 이 세상 모든 사람들을 내 제자로 삼아 아버지와 아들과 성령의 이름으로 그들에게 세례를 베풀고 내가 너희에게 명한 모든 것을 지키도록 가르쳐라. 내가 세상 끝날까지 항상 너희와 함께 있겠다.
- 마태복음 28장 19-20절, 공동번역.
예수님이 기독교인에게 내린 지상명령은 복음전파다. 예수님이 구원자 되신다는 기쁜 소식을 바쁜 현대인에게 전하기 위해, 개신교에서는 성경을 요약한 사영리를 발명했다. 사영리의 결론은: 예수 믿고 구원받은 당신은 하나님의 사랑을 받고 영생을 누리는 축복을 얻었습니다.
이제 영생을 누리는 축복을 얻었으니 죽을 날만 기다리며 잘 먹고 잘 살면 된다. 매주 교회에 출석하면서, 구원을 다시 확인하고 기뻐하면서 살면 된다.
복음의 형식만 알면 이렇게 오해하기 딱 좋다. 사후 세계를 위한 티켓 정도로 복음을 생각하게 되는 것이다. 니체는 이것을 일찌감치 알았다. 그는 <차라투스트라는 이렇게 말했다>에서 "지상과 삶을 부정하고 영원한 생명을 위해 지금의 삶을 죽이라고 하는 자들"을 죽음의 설교자라고 냉소적으로 비판한다. 계속해서 천국 복음만 되새김질 하고, 사후 세계에 얽매여 현실에 소홀한 사람들을 나는 예수님의 가르침을 실천하고 있다고 생각하지 못하겠다. 천국 복음만 설교하는 목회자들, 천국만 기대하는 기독교인들은 내게 광신도로 보인다.
내가 감히 파악한 복음의 내용은 다음과 같다: "너희들 천국 가는 것은 내(예수)가 다 해결했으니, 너희는 사후 세계 걱정 말고 현실에서 내 가르침을 실천할 수 있도록 치열하게 살아라. 현실에 집중해서, 내 가르침을 실천하면서 치열하게 살아라."
예수님은 구원의 문제를 종교지도자들의 손에서 뺏어와 단번에 해결하고 피지배자들에게 자유를 주셨다. 사후 세계에 대한 걱정을 끝내버리고, 현실에 집중할 힘을 주셨다. 자유를 주시고 힘을 주셨다.
물론 우리 하나님은 형식에 머물러 있는 사람들까지도 품으시리라(embrace)고 믿어 의심치 않는다.
내가 어렸을 때에는 어린이의 말을 하고 어린이의 생각을 하고 어린이의 판단을 했습니다. 그러나 어른이 되어서는 어렸을 때의 것들을 버렸습니다.
- 고린토인들에게 보낸 첫째 편지 13장 11절, 공동번역
리덕스의 창시자 댄 아브라모프의 Goodbye, Clean Code라는 글이 화제다. 자극적인 제목 때문에, 글이 전파되면서 마치 댄 아브라모프가 로버트 C. 마틴의 클린 코드를 완전히 부정한 것 마냥 왜곡해서 이해한 사람들이 종종 보인다. 글 내용을 직접 읽지 않으면 당연히 오해할 것이고, 글을 읽더라도 제목 때문에 오독하기 쉽다.
글에서는 본인의 경험을 통해 '클린 코드'에 따른 리팩토링이 오히려 문제 해결을 힘들게 만든 상황을 설명한다. 핵심은 끝의 세 문단에 있다.
Coding is a journey. Think how far you came from your first line of code to where you are now. I reckon it was a joy to see for the first time how extracting a function or refactoring a class can make convoluted code simple. If you find pride in your craft, it is tempting to pursue cleanliness in code. Do it for a while.
코딩은 하나의 여정입니다. 처음 코드를 작성했을 때부터 지금에 이르기까지 얼마나 긴 여정이었는지 한번 생각해보세요. 함수를 추출하거나 클래스를 리팩토링해서 복잡한 코드를 간단하게 만들 수 있다는 것을 알게 될 것이고, 이 방법을 처음 알게 되면 즐거울 것이라 생각합니다. 자신의 기술에 자부심을 가지면, 코드의 깔끔함을 추구하려는 유혹을 느낄 것입니다. 한동안 그렇게 하세요.But don’t stop there. Don’t be a clean code zealot. Clean code is not a goal. It’s an attempt to make some sense out of the immense complexity of systems we’re dealing with. It’s a defense mechanism when you’re not yet sure how a change would affect the codebase but you need guidance in a sea of unknowns.
하지만 그곳에 안주하지 마세요. 클린 코드의 광신도가 되지 마세요. 클린 코드는 목표가 아닙니다. 단지 우리가 감당해야 할 시스템의 거대한 복잡도를 이해하기 위한 시도일 뿐입니다. 클린 코드는 요구사항의 변경이 코드베이스에 어떤 영향을 끼칠지 알 수 없는 상황임에도 불구하고 길잡이가 필요할 때 사용하는 방어기제입니다.Let clean code guide you. Then let it go.
클린 코드를 길잡이로 삼으세요. 그리고 놓아주세요.
- Dan Abramov, <Goodbye, Clean Code>
형식을 통해 내용을 파악 한다. 클린 코드를 통해 복잡도를 관리하는 형식을 배울 수 있다. 그러나 클린 코드라는 형식에만 집착하고 내용을 파악하지 못한다면 광신도로 남을 뿐이다. "앞 세대의 형식만 흉내 내다가 몇십 년을 투자하고도 사라"질 수 있다. 클린 코드는 형식일 뿐이고, 이를 통해 우리가 알아야 하는 내용은 복잡도를 상대하는 기술이다 (디자인 패턴에 대한 비판도 이 흐름에서 벗어나지 않는다).
형식을 복제하는 시기도 필요하다. 형식을 제대로 알아야 내용을 파악할 수 있기 때문에. 그러나 그 곳에 남아 광신도가 되는 것에 그치지 말고 더 아래로 내려가자. 근본으로 가기 위해서 우리는 '왜WHY'라고 질문해야 한다. 공학에서는 그 질문의 끝에 복잡도가 있다.