Programming Is Not Math.

프로그래밍은 수학이 아닙니다.

Dongwoo Ha
13 min readSep 15, 2014

처음 이 아티클 제목을 보았을 때, 수학의 중요성의 강조하는 반어적 표현이구나 생각 했습니다. 하지만, 글쓴이 Sarah Mei는 자신의 일과 경험들을 바탕으로, 제목 그대로 프로그래밍은 수학이 아니고, 수학보다는 언어가 프로그래밍에서의 중요한 요소라는 주장을 펼칩니다.

프로그래밍과 언어의 관계, 그리고 그 중요성을 강조하는 처음 접해보는 글이라, 궁금증을 가지고 신중하게 읽었던 것 같네요.☺

전 수학도 좋고, 언어도 좋습니다. 그냥 즐기면서 프로그래밍을 할 수 있는 마음과 필요하면 부족한 부분을 그때그때 채우면서 즐기면 된다고 생각하는데…여러분들의 생각은 어떠신가요?

때로는 원문을 읽을때가 더 이해가 잘 되는 부분이 있으니 참고 하시기 바랍니다.☺

공룡이 지구를 걸어다니고, 인터넷이 없었던 오랜 전 시절, 제가 프로그래밍을 배울 때 수학을 잘한다면, 프로그래밍 또한 잘 할 것이라는 생각이 있었습니다.저는 어릴 때 수학을 잘했었습니만, 아마도 수학을 좋아하지 않았기 때문에 아무도 프로그래밍쪽으로 나를 이끌어주지 않았나봅니다.뜻하지는 않았지만, 대학시절 프로그래밍 수업이 제 스케줄에 딱 맞았기 때문에 프로그래밍을 시작하게 되었습니다.

제 첫번째 프로그래밍 언어는 “Formula Translation”의 약어인 포트란(Fortran) 이었습니다. 이름에서 예상 할 수 있듯이, 수업에서의 프로젝트는 아래 그림에서 보는것처럼, 사각형을 사용하여 곡선 아래 면적을 추정하는 흥미로운 일이었습니다.

포트란으로 리만의 합을 구하는것은 여러분들이 할 수 있는 수학 지향적인 프로그래밍의 소개입니다.

저는 그것을 매우 좋아했습니다.

같은 학기에 저의 첫번째 일본어 수업을 듣고 있었습니다.한학기가 끝나갈 무렵, 프로그래밍이 너무 좋아서 저의 전공을 컴퓨터 과학으로 바꾸기 결심했습니다.나는 이 두 과목의 유사함을 어떻게 느끼는지를 잠시 생각했었습니다. 이 두 경우는 나에게 하나의 문화로 다가와서, 어떤것도 이해할 수도, 느낄 수도 없었습니다.

나는 의사소통메커니즘을 학습하는 시간동안, 편안한 감정을 느끼기에 충분한 문화적 지식을 습득하기 위해서도 노력했습니다.

그러나 나는(그리고 모두가) 알고 있었습니다. 프로그래밍은 수학과 같다는 사실을요. 그래서 확실한 것은, 제가 수학을 잘 했기 때문에 포트란도 잘 할 수 있었다는것입니다.

이제, 거의 20년이 지났네요.

생각을 바꾸었습니다.(I’ve Changed my mind.)

졸업을 하고 소프트웨어 엔지니어가 되었을 때, 개발자 작업의 대부분은 기껏해야 중학교 수학을 필요로 한다는 것을 알게되었습니다. 나는 화이트보드 인터뷰를 하기위해 수학을 조금 이나마 유지햇습니다. 하지만 일에있어서는 컴퓨터와 다른 사람들과 커뮤니케이션하는 나의 능력이 훨씬 더 중요했습니다.

그 당시에 나의 일은 예외라고 생각했었습니다. 확실히 대부분의 프로그래밍은 좀 더 수학과 관련있었습니다. 하지만, 난 그냥..음.. 그런 일들을 본 적이 없습니다. 심지어 구인란에서도요. 그리고 내 친구들 누구도 그것들을 가진것을 본 적이 없습니다. 뭐, 그럴수도 있지요.

일을한지 10년이 지난 이후, 나는 여가시간에 프로그램이 처음인 사람들을 가르치는 일을 시작했습니다. 루비 온 레일즈(Ruby on Rails)라는 웹 프로그래밍 프레임워크를 가르쳤습니다. 사람들은 그들의 웹사이트를 어떻게 만드는지를 배우기 원하기에 저를 찾아왔습니다. 이러한 동기 때문에 교과과정에는 사실상 수학은 없었습니다.

그리고 이것은 결국 나를 위해 한 일이었습니다. 내가 본 학생(모두 성인)들은 다양한 배경에서 왔습니다. 수학적인 배경을 가진 사람들은 물론 잘 했지만, 깊이 있는 언어 배경을 가진사람들은 더 잘했습니다. 나는 이 호기심있는 결과를 고등학교에서 이와 유사한 교과과정을 가르치면서 한번 더 볼 수 있었습니다. 두 나라의 말을 하는 아이들은 종종 모국어만을 하는 아이들보다 좀 더 쉽게 프로그래밍을 했습니다.

대학시절, 나의 일, 친구들의 일, 그리고 교육에 대해서 생각하다 마침내 프로그래밍은 수학이 아니다는 것을 알아 냈습니다.

프로그래밍은 언어입니다. (Programming is Language.)

특히나 프로그램을 배우는 일은 수학문제를 다루는것보다 새로운 언어를 배우는것과 더 비슷합니다. 그리고 오늘날 업계에서의 프로그래밍 경험은 수학보다는 언어에 대한것입니다.

그리고 왜 누구도 이런 생각을 하지 않았을까하는 생각을 두번째로 했습니다. 왜 우리는 아직도 수학능력이 프로그래밍 가능한 능력을 나타내고, 언어능력은 정치학쪽으로 간다고 생각할까요?

글쎄요, 자신이 없음을 느낄때 저는 보통 “공식적인” 의견을 찾아 봅니다. 그래서 관련된 학술연구를 보았습니다.

WTF 학계(WTF ACADEMIA.)

절대적인것을 발견한것은 없지만, 찾은 자료들로 깜짝 놀랐습니다. 컴퓨터 과학 교육자업계 종사자들의 많은 의견들을 찾을 수 있었습니다. 아마도 학계에서 수학과 프로그래밍 사이의 관계는 그것이 연구를 확인할 가치가 없는것과 같이 명백한 진리로 간주됩니다.

원래 존재하는 연구자료가 아니라, 검색조건을 기반으로 찾은 가능성있는 자료입니다. 만약 여러분이 관련 논문을 알고 있다면 알려 주시기 바랍니다.

데이터가 없는 경우에는, 적어도 사람들이 이 주제에 대해 나눈 대화를 검토 하였습니다. 사람들이 좋은 개발자가 되기 위해선 수학을 잘해야 한다는것을 주장할 때 흔히 말하는 몇가지가 여기에 있습니다.

일반적으로 세 가지 범주로 분류 됩니다.

1 . 좋은 프로그래머가 되기 위해서 수학을 필요가 있습니다.

2 . 프로그래밍에 필요한 기술을 얻기 위해 수학을 배울 필요가 있습니다.

3 . 프로그래밍의 많은 부분이 여전히 수학입니다.

하나씩 살펴보겠습니다.

1. 수학을 알 필요가 있습니다. (1. You need to know math…)

1A. 컴퓨터과학은 수학에서 유래하기 때문입니다.

이것은 사실입니다. 학술적으로 말하자면, 대부분의 컴퓨터 과학부문은 수학부분으로부터 그 계보를 이어옵니다. 많은 컴퓨터과학 또한 여전히 어느정도 수학에 깊은 관계가 있습니다. 틀림없습니다.

그러나, 많은 다른 사람들이 컴퓨터과학은 프로그래밍이 아니라고 언급합니다. 대부분의 CS 학교에서 명시적인 목적은 학생들이 CS학습의 부산물로 프로그래밍을 배울 수 있다는 것입니다. 프로그래밍 자체는 일종의 연습과 같이 약간 재미없어 보이지만, 판단은 여러분들에게 맡깁니다.

대조적으로 오늘날의 실제 개발 작업의 경우에는 프로그래밍과 커뮤니케이션, 이 중요한 두가지 기술이 필요합니다. 그래서 CS를 하는 동안에는 여전히 수학과 강한 유대관계를 가지고, CS와 프로그래밍 사이에는 빈약한 유대관계를 가집니다. 여러분은 수학영역이 컴퓨터 과학의 성공을 위해 필요하다고 말할 수 있습니다. 하지만 개발자의 성공을 위해 반드이 필요하다고는 말할 수 없습니다.

1B. 수학적인 기초없이는 단지 프로그래밍의 겉으로 드러나는 표면만을 이해할 수 있기 때문입니다.

여기에 일반적인 변화가 있습니다. CS 단계 없이는 실질적으로 아무것도 만들수 없습니다. 하하! 웃긴 일이죠? 모험을 즐기는 자본가는 말하지 마세요! 그들은 어떠한 자격도 없이 수백명의 사람들에게 실제 돈을주면서 모래언덕 도로 아래에서 소프트웨어 프로젝트를 구축하는 것과 같습니다. 사실, 그들의 그런 행동은 자주 일어납니다. 대학 중퇴 출신의 천재 프로그래머가 실리콘벨리에서의 성공의 전형입니다. 그리고 금전적으로 그들의 전략은 280에서 테슬라의 함대가 어떤 징후가 된것 처 럼, 그들을 위해 일하는 것처럼 보입니다.

다시 여기 현실 세계로 돌아와서, 나는 공식적인 자격과 이해의 깊이 사이에 조금의 관계가 있다는것을 발견하였습니다. 예를들어, 화이트보드 인터뷰의 주요한 big-O 표기법을 고려하십시오.

만약 여러분이 학교에서 동적방법 수업을 들었다면, big-O표기법이 현실세계에서 꽤나 의미를 가지고 있다는 것을 알 것입니다. 말하자면, 임의의 데이터 집합에서 알고리즘이 어떻게 돌아가는지는 중요하지 않습니다. 중요한것은 당신의 데이터가 어떻게 돌아가는지 하는 점입니다. 임의의 데이터의 O(n**2) 알고리즘의 시간은 여러분의 특별한 데이터위에서도 그 시간은 달라지지 않습니다. 따라서 좀 더 빠른 알고리즘 O(nlogn)도 여러분이 제공할 데이터와는 상관이 없습니다.

이것을 모델링하는 흥미있는 수학적인 방법이 있지만, 충분히 이상하게도, 화이트보드 인터뷰를 통해 CS 학위를 가진 사람들은 결코 많은 관심을 보이지 않습니다. 참, 이해가 안되네요.

여러분이 실제로 성공적인 개발자가 되기 위해 수학을 알 필요가 없다면, 수학을 배우는데 충분히 노력하는 방법이 맞다고 생각할 수 있을까요?

2. 수학을 배울 필요가 있습니다. (2. You need to learn math…)

2A. 여러분이 프로그래밍을 잘 하기위해 필요한, 추상적인 문제해결을 가르쳐 줍니다.

추상적으로 생각하는 것은 모든 개발자가 연마해야할 필요가 있는, 절대적으로 필요한 기술입니다. 사실 어떤 사람들은 코드안의 컨셉을 위해 추상의 적절한 레벨을 찾는것은 소프트웨어의 어려운 문제중의 핵심이라고 말하곤 합니다.

수학공부를 통해서 추상적인 사고를 배울 수 있는 것은 전적으로 사실입니다. 작년에 GoGaRuCo 회의에서 다니엘라 웰리츠라는 수학에 경험이 있는 개발자는, 프로그래밍은 수학에서의 증명과 비슷하다는 주제의 한 매혹적인 이야기를 했습니다. 이 주제에 관심이 있다면 주시해 보기를 추천합니다.

어쨋든, 추상적인 사고를 배우기 위해 수학적인 방법만 있는 것은 아닙니다. 새로운 인간의 언어를 배우는 것은 추상적 사고를 개발하는 또 다른 방법입니다. 모국어로 표현불가능한 문자 그대로의 개념을 이해하는것은 굉장히 추상적입니다. 제2 외국어를 배울 때, 높은 수준의 추상화를 기반으로 개념들을 재정의하는 방법은 수학적으로 생각하는법을 배울 때 재정의하는 것과 구조적으로 매우 유사합니다.

그래서, 수학이 추상화에 관해 배우는 한가지 방법이긴 하지만, 유일한 방법은 아닌것입니다.

2B. 프로그래밍은 논리의 수학적 개념을 기반으로 합니다.

실제로 프로그래밍은 논리와 종종 관계가 있습니다. 하지만 이같은 논리적인 개념들도 우리 인간의 언어에 포함되어있습니다.

수학은 우리가 매일 사용하는 문장을 구성하고, 다른 사람과 의사소통하는 개념을 단순히 형식화 한 것 입니다. 최고의 작가와 연설가는 그것들을 이해 할 수 있고, 인간의 언어로 다른사람들이 평가하기 쉬운 논리적인 문장을 구성 할 수 있습니다. 심지어 그들은 때때로 사람들의 마음을 바뀌게도 합니다.

수학 논리는 우리가 이미 알고있는 개념의 표시이며, 개념입니다. 이것이 오히려 표기법 보다 중요합니다.

그래서, 개발자가 되기 위해서는 수학을 필요가 없습니다. 개발을 잘 하기 위해서 수학을 배울 필요가 없습니다. 잠시만요! 아직 남은 얘기들이 있습니다.

3. 개발 일의 대부분에 수학을 이용합니다. (3. My developer job uses plenty of math!)

물론 사람들은 여전히 수학을 수행하는 프로그래밍을 사용합니다. 하지만 프로그래밍 자체는 더이상 수학이 아닙니다.

심지어 비 수학 지향언어에서의 일부 응용 프로그램에서도 수학은 유용하게 사용됩니다. 그리고 포트란은 물론, 수학 지향적인 모든 언어에서 이전에 언급한 바와같이 사용됩니다. 그리고 헤스켈과 같은 대부분의 학술 언어는 이제 일부 업계 개발자들 사이에서 인기를 얻고 있습니다.

하지만, 이러한 규칙을 증명하는데는 예외가 있습니다. 만약 작거나 축소되어지는 집합의 프로그래밍 어플리케이션이 수학을 필요로 하는경우, 너무 많은 수학이 요구되기 때문에 그것을 할 여러분 자신의 언어로 선을 긋습니다. 게다가 무거운 수학인 요즈음에는 중요하지 않은 전문분야가 분명합니다.

그리고 여러분들이 수학의 어떤것을 하기위해 코드를 작성하는 경우에도, 아마 언어를 잘 하지 않는 한 수학도 잘 할 수 없습니다. 오늘날 팀에서 일하는 가장 좋은 개발자들은 그들의 코드로 다른 사람들과 직접, 어떻게 의사소통 할지를 알며 잘하고 있습니다. 내가 가장 좋아하는 프로그래밍 책 중에서 이런 구절이 있습니다. “프로그램은 사람이 읽을 수 있도록 쓰여져야만 한다. 그리고 기계는 실행하기위한 부수적인 것만을 위한 것이다.”

장기적으로 봅시다.(The long view)

만약 프로그래밍이 언어와 비슷하다면, 왜 우리는 -개발자들은- 이미 이 정신적 조정을 하지 않았을까요? 왜 수학을 잘하면 프로그래밍을 잘 한다는 생각이 매우 강하게 유지될까요?

지난 세기에 프로그래밍이 막 시작 될 때, 우리는 미사일의 궤적을 계산하고, 비밀 메시지를 해독하는 등의 높은 수학 문제를 해결하는데 그것을 사용했었습니다. 그 시점에 프로그래밍을 하기 위해서는 수학을 잘 해야만 했었습니다.

도구같이 쓰이는 프로그래밍 언어는 특히나 수학적인 문제들을 해결하기 위해서 설계되었습니다. 왜냐하면, 사람들은 그것들에 돈을 지출 할만한 가치가 있다고 생각했기 때문입니다. 컴퓨터는 수학을 하기위해 존재했었습니다.

시간이 지나면서 다른 많은 요인들 때문에 컴퓨터가 무엇인지에 대한 사회적 개념은 진화하고 있습니다. 이 질문을 생각할 때, 요즘 우리는 문제를 해결하거나, 지루한 일을 편리하게 만드는 것, 돈을 버는 것과 같은 높은 수준의 개념에서 생각합니다. 이러한 높은 수준의 목표들은 때때로 수학적인 하위 목표를 포함 할 뿐만 아니라, 사용의 용이성, 연결성 및 인터페이스 같은것 들을 포함합니다. 기본적으로 요약 될 수 있는 문제는 “골치아픈 사람과 그들의 또다른 골치아픈 사람과의 관계” 입니다.

이와같은 이유로 프로그래밍이 여전히 수학적인 문제들을 위해 쓰이고 있지만, 현대 사회에서는 좀 더 많은 복잡한 문제들에 자주 쓰이고 있습니다. 이 변화는 90년대에 본격적으로 가속화되어 꽤 빨리 일어났습니다. 그리고 20년 후인 오늘날 우리는 수학 지향적인 프로그래밍 일들이 확실히 소수임을 알 수 있습니다.

그것은 느리게 변화하는 학계가 아직 따라가지 못하는데 의미가 있습니다. 그리고 오늘날 수석 개발자인 프로그래머, 이전 관리자들이 발전을 이룰 때, 이것은 아직 사실이 아니었습니다. 그래서 당연히 그들의 성공의 길이 그들의 수학적인 관점처럼 보인다 생각합니다.

좌절하지 마세요.(Don’t Panic)

여러분들은 여전히 기존의 길을 걸어간다면 성공 할 수 있습니다. 수학을 잘한다면 아마 프로그래밍도 잘 할 수 있습니다.

하지만, 우리 산업의 급속한 발전은 수학능력이 더이상 잠재적인 개발 기술의 유일한 척도임을 의미하지 않습니다. 사실 수학은 산업이 어디로 가야하는지 그들이 이제까지 주어진 것보다 아마 더 약한 척도를 나타내고 있습니다. 지도자 여러분 부탁이예요. 우리에게 이제 언어를 사랑하는 사람을 보내주세요. 우리는 그들에게 세상을 바꿀 수 있는 도구를 제공하겠습니다.

--

--