수학에서 [변수]는 수학에서 쓰이는 수식에 따라서 변하는 값을 뜻합니다. <김승태씨의 드무아브르가 들려주는 정규분포 이야기>에서
프로그래밍에서의 [변수]의 뜻과 동일합니다.
절차 지향 프로그래밍 언어에서 함수는 f(x) 와 같습니다. 파라미터로 input을 넣고 output을 return 받아서 알고리즘을 처리하는 것이죠.
객체지향 언어도 크게 다르지 않습니다. 함수, 매소드, 펑션 등으로 불리는 문제 해결의 집합들도 모두 input을 받아서 원하는 output을 뽑아내는 "함수"의 한 종류 입니다.
수학 관련한 설명은 위키피디아가 정석이나 알기 쉽게 설명하는 곳은 "나무위키" 입니다.
그러나 중요하다고 하는 수학이 한편으로는 중요하지 않은 이유는 무엇일까요? 프로그래머는 결국 코드를 짜야 하는데, 수학을 프로그래밍으로 표현하는 기술이 부족하기 때문입니다.
이에, 수학과 프로그래밍 언어를 잇는 책은 The art of computer programming 입니다.
그러나 이 책은 너무 어렵습니다. 또한 실무보다는 학문쪽에 가까워서 회사에서 제품을 만드는 것 보다는 학교에서 공부를 하는데 어울립니다.
그럼, 공부와 제품 창조의 중간에 있으려면 뭘 해야 할까요?
수학과 더불어 프로그래머라면 기초 영어를 해야 합니다. 기초 영어는 "초급"의 뜻이 아닙니다. substructure, basis 의 뜻입니다. 4~5년 전부터 일을 할 때 러시아, 인도, 방글라데시, 미국, 중국 개발자와 일하게 되는 경우가 매우 많아 지기 때문입니다. 식당에서 중국국적 종업원을 보는 것은 어려운 일이 아닙니다. 개발직도 그렇습니다. 우리 고유의 말과 글을 가지고 있지만 변변한 운영체제나 프로그래밍 언어가 없다보니 다른 나라의 속국으로 일해야 하는 경우가 많아졌습니다. 이에 적합한 인력이 되는 것. 이를, 글로벌한 인재가 된다고 표현 합니다.
ㅠㅠ... 울고 넘어 갑니다. 잡담만 너무 적으면 안될 것 같습니다.
+ - * / 의 경우 Addition, Subtraction, Multiplication, Division 입니다. 이들을 Operations 라고 합니다. 이 정도는 아는 영어지만 commutative law, distributive law 를 아는 사람은 많지 않습니다. 그러나 교환 법칙, 분배 법칙은 아는 분이 많습니다.
미국에서 성공하신 많은 분들이 한국의 수학 교육은 정말 대단하다고 하십니다. 그렇습니다. 주입식 교육으로 성공한 것은 "수학" 분야 입니다. 다만 고등학교 때 성공하는 것이 아니라 커서 프로그래머가 되었을 때 대부분 느낍니다.
서울대 출신 프로그래머와 일하다 보면 고등학교 때 배웠던 기초 수학 및 공업 수학등을 잘하고 그것을 응용해서 프로그램을 작성합니다. 더군다나 3D Engine과 같이 고차원적인 부분에서도 수많은 논문들을 참고하지만 정작 프로그래밍으로 표현할 때는 기초 수학의 내용을 응용해서 구현하는 경우를 보았습니다. 게다가 아무나 짤 수 없다는 것도 알고 있습니다.
그래서 저 역시 가장 싫어하던 과목이 수학이었는데 지금은 가장 좋아하는 과목이 되었습니다.
사실, 사람과의 약속에서 출발하기에 다른 학문과는 달리 정확한 학문이기에 싫어했었습니다. 젊은 시절에는 세상사 정확한 맞는 일이 하나도 없었었거든요. 어릴적 우리가 만든 수학기 틀렸기 때문에 달에 갈 수 있었다는 글귀를 어디선가 보았었습니다. 그 때는 그 말을 모르면서도 뭔가 심오한 뜻이 있다고 생각했습니다. 지금은 어렴풋이 알 수 있습니다. CPU 연산에서 실수 연산을 하면 계속해서 오차가 나고, 10진수가 정말 우리 세상을 대변해 주기 적합한 수인가? 라는 두 가지 질문에서 끊임없이 답을 찾다보니 말입니다.
100% 맞다고 하는 수학으로 세상을 보려고 해도 세상을 다 볼 수 없는 인간의 물리적 한계가 있기 때문에 괜찮을 것 같습니다. 저도 공부를 좀 해 보려고 합니다.
10-6 : take 6 away from 10 입니다.
-8 : minus eight 혹은 negative eight 입니다.
10-8 : subsract 8 from 10
10+(-8) : add a negative 8 to a positive 10
10 / 8 : 10 divided by 8
0.333333 에서 3은 cyclic
편하게
20 + 8 : twenty plus eight
10 - 8 : ten minus eight
입니다.
8 / 0 안되지요. Dividing by zero does not make sense.
이 정도 보고, 프로그래밍 어디에 쓰일까 생각해 보면 다음 책을 읽게 됩니다.
수학의 경우 여러 분야가 있지만
이산수학, 수치해석은 프로그래머의 과목으로 생각하고 있습니다.
그러나 제가 생각하는 프로그래밍의 수학 분야는 대수학과 통계학으로 보입니다. 통계학과 수학은 다른 학문이지만 수로 현상을 표현하는 통계학은 수(數) 에서 벗어나지 못합니다.
1. 세다
2. 수
3. 자주
4. 촘촘하다
5. 빠르다
- 다음 사전 (dic.daum.net) 에서
그 중 통계학은 프로그래머가 꼭 해야할 분야라고 생각됩니다.
CPU 자체가 수학을 완벽하게 표현할 수 없는 오류가 내제된 과학의 산물 이기 때문입니다.
100번 잘해주다가 1번 못해주면 나쁜 사람이고,
100번 못해주다가 1번 잘해주면 좋은 사람이라고 생각하면 안되는 것처럼
통계적으로 사랑하면 사랑하는 것이고,
통계적으로 맞다면 맞다는 쪽으로 생각을 하고 시스템을 만드는 마인드도 함께 가질 수 있습니다.
사람 목숨이 달린 임베디드 시스템을 만드는 임베디드 분야 역시 포함 됩니다. 자율 주행 자동차나 엘리베이터 시스템을 만들 때 완벽하다고 생각하지 말고 이중, 삼중으로 시스템의 위험성을 고려하고, 물리적 안전 장치를 두고 생각해야 한다는 것 입니다.
생산관리에서 말하는 6시그마가 100만개중 0.002개의 불량률로 불량률 0 에 도전한다고 배웠던 것 같습니다.
그러나 10억개중 2개의 불량율로 따지고 중국에 놀러간 와이프랑 애기가 탄 자율 주행차가 그 2대 중 한대에 탔다고 생각하면 끔찍합니다.
여기까지 생각이 미치면 통계적인 사고율은 0로 만들기는 불가능하니 사고가 났을 때 회사 책임이 아닌 인식을 주기 위해 취해야할 조치 사항들을 설계하기 바쁩니다. 경제적으로 궁핍하고, 회사에서 돈 받는 설계자라면요.
이 글의 제목처럼 수학이 중요하지만 한편으로 중요하지 않은 이유는 이와 같습니다. 사람을 생각하는 철학이 더 중요하지요. 수학적으로 생각하지 않으면 사회 현상을 수치화 하기 힘듭니다. 수치화 한 수학은 프로그래밍적 사고로 코딩을 해야 합니다. 수학을 통계학과 함께 고려한다면, 꽤 좋은 시스템을 만들 수 있을 것 같습니다.
여러 이야기를 하다가 잡글이 되었지만 향 후 수학 및 통계 관련 글도 올린다는 복선은 잘 깐 것 같습니다.