Computational Design & Creative Coding
Q. 안녕하세요 NJ님 저는 건축학과 학생입니다. 코딩(GH Python)을 본격적으로 공부하려고 하는데 필요한 수학이 어느 정도나 될까요?
코딩을 본격적으로 공부하려고 하는데,
필요한 수학이 어느 정도 될까요?
많이 알면 당연히 도움이 되겠죠? 하지만, 수학을 잘한다고 해서, 반드시 프로그래밍을 잘하는 건 아닙니다. 유리할 뿐이죠.
사칙연산만 할 수 있다 하더라도, 충분히 코딩 공부를 시작할 수 있죠. 건축학과 학생이라고 하셨는데, 중, 고등학교 때 배운 수학으로도 충분히 하고도 남습니다. 또한 프로그래밍을 하다가 관심사가 정해지면 따로 보충해서 채워나가는 방법도 있습니다. 제가 그렇게 했었어요.
건축을 하셨다면 아마도 2D나 3D 소프트웨어에 익숙하실 것 같은데, 그 감으로도 충분히 시작할 수 있어요.일반적으로 코딩을 하면, 화면에 결과물로 숫자를 출력하는 게 대부분인데, 크리에이티브 코딩 혹은 컴퓨테이셔널 디자인 같은 경우는, 화면에 무언가가 그리며 피드백이 즉각 나타나기 때문에 좀 더 재미있게 공부할 수 있죠!
프로그래밍은 단순한 수학적 사고보다 좀 더 다양한 사고력을 필요로 해요. 만약 수학이 상대적으로 모자라면, 다른 논리력을 키움으로서 상호 보완할 수 있고, 그렇게 계속 반복하다 보면 부족한 부분도 채워지는 것을 경험할 수 있어요. 제가 그랬어요.
질문의 대한 저의 개인적인 답변은 위와 같고요. 일반적인 생각을 나누면, 아래와 같이 정리될 수 있을 것 같아요.
수학력?
수학을 잘한다? 즉 수학 점수가 좋다는 개념, 즉 학교 교육 시스템에서 정해진 시간에, 정해진 문제 유형들을 기계적으로 잘 풀어낸다고 가정을 해 보면, 그 사람이 프로그래밍을 할 때, 수학을 잘 활용할 수 있다는 것은 절대 아니네요. 이건 제가 가르쳐 보고 느낀 거예요. 사실 프로그램의 흐름은 수체계를 이용해 데이터의 계산과 흐름을 조정하고 구현하는 것은 다른 이야기예요. 궁극적으로, 중고등학교 때 공부했던 수학과 조화를 이루면서 프로그래밍을 할 수 있는 실력을 발휘할 수 있는 정도까지 올라가면 정말 이상적인 단계겠죠 하지만 시간이 필요하죠.
도메인? 전공?
수학에 대한 싶은 이해는, 프로그래밍 공부를 시작하는 단계에서는 상관없겠지만, 적용하고자 하는 영역에 따라 달라질 수 있겠죠. 데이터 사이언스와 같은 통계나, 물리, 데이터베이스 등등의 다양한 전공에 따라 요구되는 수학의 깊이와 의존성이 분명한 차이를 보일 수 있겠죠. 하지만 건축 혹은 크리에이티브 코딩의 경우에는 좌표계의 이해와 간단한 벡터 혹은 메트릭스 계산 정도로 많은 것들을 할 수 있어요. 이 상황에서 수학은 충분조건은 아니라고 생각합니다. 즉 수학을 잘하기만 하면 코딩을 잘할 수 있다가 아니라, 수학을 그 다지 잘 못하더라도, 코딩은 잘할 수 있다로 볼 수 있어요. 왜냐하면, 질문자의 경우 GH Python의 경우 수학 및 지오메트리의 많은 부분들이 라이브러리 형태로 제공되고 있어서, 그것들을 연결하고 응용하는 차원의 코딩이기 때문에 그래요. 물론 깊게 들어가면 그에 상응하는 깊이의 수학을 이해하셔야겠죠. 하지만, 처음 코딩을 배울 때만큼 어렵지는 않을 거예요. 프로그래밍에 익숙해질수록 수학적 알고리즘의 구현은 상대적으로 쉬워진다고 느낄 거예요(노파심에 말하는데 깊이에 따라 달라요). 가령, 선택(Selection algorithm) 보로노이(Voronoi), 패킹(Packing), 지오메트리(Geometry) 관련, 그래프(Graph)등등등 등등의 알고리즘이 있죠..
논리력?
어떤 의미로 보면, 국어실력?, 다른 관점으로는 논리력이 더 중요하게 느껴 기지도 해요. 결국 현실의 복잡한 문제나 디자인 문제들을 소프트웨어로 해결을 한다고 생각해보면, 문제들의 단계를 나누고 분리하고 순서를 정해서 단순한 형태로 문제들을 서술하고 연결하는 것이 결국 프로그래밍의 큰 틀이라고 볼 수 있고, 각각의 구현 단계에서 디테일들을 수학적, 즉 산술이 가능한 부분으로 치환시킨다고 보면 이해가 좀 쉽지 않을까 해요. 결국 복잡 미묘하게 얽혀있는 상태를 이해, 분해해서 언어로 풀 수 있다면, 혹은 시각 언어인 다이어그램으로 표현할 수 있다고 본다면, 그것을 조금 엄밀하게 서술한 것이 프로그래밍이라고 볼 수 있어요. 가령 의사 코드(슈도 코드, pseudocode)와 UML 다이어그램을 그 예로 들 수 있어요.
추상력?
즉, 추상화인데, 제가 이해하는 추상의 일반적인 개념은, 노이즈가 많은 복잡한 현실 혹은 현상에서 가공하고자 하는 대상의 핵심과 본질을 축약하고, 간략화하여 다룰 수 있는 형태로 압축, 단순화시켜 표현 혹은 가공(계산)할 수 있는 엄밀한 형태로 만드는 것이라고 생각해요. 쉽게 설명하면,
프로그래밍을 하시다 보면 단순한 함수를 만드는 것을 넘어, 클래스(class)와 디자인 패턴 같이 좀 더 큰 흐름이나 소프트웨어 아키텍처를 구현할 때, 수학보다는 이러한 사고력이 더 요구되죠.
의지력?
다시 질문으로 돌아오면, 사실 프로그램을 공부할 때, 수학력이 문제 되는 것보다, 현실적으로는 99% 넘게, 의지력이 더 문제가 돼요. 현재 내 상황에서 잘하고 못하고는 중요하지 않아요, 왜? 보완하고 배우면 끝나는 문제니 까요. 중요한 건 그것을 할 수 있는 의지가 있냐가 더 중요해요. 이건 100% 제가 학생들을 가르치면서 받은 피드백이에요. 그냥 코딩의 문법이 익숙하지 않고, 수학적 표기와 흐름이 눈에 안 들어올 뿐이에요. 그냥 경험하지 못한 것들에 대한 부 자연스러움, 불편함이죠. 제가 영어 공부할 때 그랬어요. 언어적 센스나 사고력의 문제가 아니라 그냥 문법과 단어를 모르니 눈에 안 들어오는 거 에요. 만약 제가 언어적 직관력이 엄청 좋은 사람이라고 가정을 하더라도, 그 실력을 발휘할 기회 조차 없게 되는 것 이죠. 국어를 엄청 잘한다고 한다면, 영어도 잘해야 정상이겠죠. 그런데, 그냥 시작도 못하고 끝나게 되는 셈이죠. 이 단락의 마지막은, 무려 수학의 28%나 이해하고 있었던, 폰 노이만의 말을 빌려 마무리할게요.
“수학은 이해하는 것이 아니다. 그저 익숙해질 뿐”,
이 말에 대한 저의 정리는, 우리가 이해했다 하는 것들도 어떤 의미에서는 그 사고와 패턴에 익숙해진다고 생각해요. 즉 수학을 잘하고 못하고는, 내가 충분히 그것에 익숙해졌나? 그만한 시간을 노출시켰나? 그것에 충분히 동화됐나? 의 문제로 볼 수 있다는 것이죠.
수련
코딩도 컴퓨터의 언어를 조합여의 의미를 만드는 것이고, 수학도 수체계와 그에 따른 연산으로 의미 있는 계산을 하는 거고, 국어와 영어도 단어를 문법에 맞게 조합함으로 어떤 논리를 구현하는 의미로 본다면, 결국 내가 얼마나 익숙해지고 자연스럽게 말이 되게 구현할 수 있냐의 이야기라고 생각해요. 태권도를 할 때, 농구를 할 때, 다리를 어떻게 움직여야지 고민 안 하죠? 그냥 그 상황이 되면 그렇게 몸이 알아서 나가는 것이죠. 어떤 의미로 보면 코딩 공부도 언어의 일종으로서, 반복을 통해 체화되고, 자연스럽게 그러한 문법과 로직으로 생각하고 구현할 수 있는 게 되는 거죠.
수학적 사고력
코딩 혹은 프로그램을 계속하다 보면, 어떤 단순한 수학의 문제풀이와 구현을 넘고, 프로그래밍 언어들의 문법을 넘어, 결국 어떤 데이터들을 다룰 생태계를 구축을 하게 되죠. 앞서 설명한 논리력, 추상력, 사고력들이 산술 체계라는 엄밀성을 바탕으로 수학적 기호로 정리하고 표현하는 능력으로 귀결될 수 있다고 생각해요. 즉 어느 한 요소로 판단될 수 없고, 뒤집어 보면, 부족하면 다른 부분들로 채울 수 있고, 꾸준한 노출과 경험 그리고 실수를 통한 배움으로 결국에는 상향 평준화가 되겠죠. 즉 컴퓨테이셔널 팅킹은 오케스트라의 연주로 빗 대어 볼 수 있어요. 어느 한 가지 악기로 판단되는 것이 아니라, 결국 종합적인 사고력의 협력으로 어떻게 컴퓨터를 효율적으로 일을 시킬 수 있냐로 종합적으로 판단되겠죠.
( ( ( 수학력 + 논리력 + 추상력 ) X 수학적 사고력 ) ^ 의지력 ) = 코딩 실력
요약하면
(1) 사칙 연산을 할 수 있다면, 코딩을 시작함에 있어서 전혀 문제 되지 않는다.
(2) 특별히, 건축과 같은 크리에이티브 코딩(Creative Coding)의 경우에는 더더욱 그러하고, 오히려 디자인 단계를 어떻게 추상화할 것인가? 가 더 중요하다.
(3) 그중 제일 핵심은, 충분한 시간을 노출했냐? 충분히 동화됐냐? 의 문제이다. 내가 힘들면 남도 힘들고, 그 평균을 넘어야 실력이라는 의미가 생긴다.
(4) 노출을 꾸준히 하려면, 다음의 질문에 답을 해야 한다. "내가 왜 코딩을 해야 하는가?" 정말 확실한 이유가 있는가? 그 시간을 다른 것에 투자하는 게 낫지 않은가? 주저 없이 답할 수 있는가? 어떠한 부정적인 말로 가로막더라도, 그 벽을 부수고, 상대방을 납득시키며, 나갈 수 있는가? 결과적으로 이 기술과 경험이 나에게 장착이 된다면, 내가 원하는 미래를 그릴 수 있는가? 정말 확신이 있는가?
이러한 긍정적인 사이클을 돌릴 수 있는 동기가 중요하다. 왜냐면, 무언가를 시작하고 유지하려면 정말 말도 안 되게 많은 에너지가 필요하다. 나의 경험상 그 에너지는, 어떠한 답답한 상황에도 스스로를 완벽하게 속이고, 꾸준히 유지할 수 있는 동기에서 오기 때문이다. 영포자로서 수포자로서 20대 후반에 영어와 수학을 시작해서, 미국에서 대학원을 졸업하고 소프트웨어 엔지니어로 이직을 하기까지 엄청난 에너지를 쏟아부었다. 에너지를 유지하기 위해, 위의 질문들과 상기시키면서 그것을 해야만 하는 동기를 잊지 않으려 노력했었다. 로켓을 일정 궤도에 올리기 위한 에너지 공급의 문제이다. 사실 이미 많은 자료와 예제와 공부자료들이 존재하고, 그것을 내 껏으로 만들 때 필요되는 에너지의 문제이다.
사실 주변에서 많이 받았던 질문인데, 생각을 정리해서 공유할 기회를 주셔서 질문자께 감사합니다. 저는 사실 수포자였어요 정말 수포자 이런 이야기하면 아무도 안 믿는데, 수학은 초등학교 5학년 때, 분수의 덧셈 뺄셈에서 포기하고, 20대 중반이 되어서 시작한 케이스이죠. 하지만 동기가 부여 대고, 단순히 문제를 맞히는 재미를 넘어, 즉, 내가 풀고자 하는 문제 혹은 구현하고자 하는 디자인을 수학의 언어를 빌려한다는 우하함이 수학을 나이 들어 공부할 수 있는 동기였어요. 특별히 저는 코딩으로 수학을 공부해서, 대한민국 특유의 중고등학교의 수학의 틀보다 좀 더 자유롭고 수학의 관점을 가질 수 있었다고 주장하기도 하죠.
10번 100번 1000번 반복해도 안 되는 게 당연한 거예요. 남들은 금방 한 거 같죠? 뒤에서 미리미리 해 뒀거나, 아니면 불공평하게 타고 난 사람들이죠, 뭐 재능적 금수저인 거죠... 때문에, 가진 것이 없는 우리는, 다른 무기를 장착해야 하는데, 안되더라도 절때 당황하지 않고 될 때까지 하는 자세! 그냥 그 과정에 동화되면 결과는, 때가 되면 결과는 곧 나타나요!
파이팅!!
이남주
Revision 2020/4/29