Introduction

알파고가 전 세계에 충격을 준 이후로 코딩을 배우겠다는 사람들이 우후죽순 늘어났다.

이미 상위권 대학들의 컴퓨터과학 관련 학과들의 입결은 자교 전화기를 넘어 하위권 의대를 넘보는 수준까지 왔고

네이버, 카카오 등 이미 중견급에 있던 IT 벤쳐들은 대기업이 되어 수 많은 사람들이 PS에 매달리게 했다.

 

사실 알파고 이전에도 프로그래밍에 도전하는 사람들은 많았다.

C로 시작하느니, 자바로 시작하느니 (나는 Visual Basic - .NET 아니다. - 으로 시작했다.) 부터 시작해서, 학원을 다녀야 하느니 독학으로도 충분하다느니 갑론을박하는 내용은 참 유구한 전통을 가진 떡밥들이다.

 

그렇게 C로, 자바로 뛰어드는 사람들의 대부분은 공통점을 가지고 있다.

다들 야심차게 윤성우씨의 열혈 C나 아니면 다른 입문서들을 사다가 열심히 공부하는 듯 하다가

어느 순간 대규모로 걸러져 일부는 포기하고 일부는 C보다 쉽다고 여겨지는 Java나 다른 고급 언어로 빠져나간다.

 

어 "어느 순간" 이란, 배열과, 구조체, 포인터를 말한다.

 

Array, Structure, and The Pointer

사실 배열과 구조체는 다른 고급언어에서도 사용하고 있는 개념이니 그렇다 치더라도, 포인터는 참 뭐라 하기 어렵다.

포인터 자체는 그냥 좀 특별한 의미를 지니는 정수 값 가지고 있는 변수 (혹은 상수)다. 따라서 unsigned int와 다를 바가 없음에도(32비트 기준) 불구하고 별도로 이름이 붙어 특별취급 받는데는 이유가 있다. 바로 메모리 상의 주소를 다루기 때문이다.

 

컴퓨터는 구동되는 시점부터 작동을 멈출 때 까지 처리에 필요한 거의 모든 정보들을 RAM에 저장한다. 이들 정보의 위치는 주소(Address)라는 이름이 붙어 식별된다. 포인터는 이 주소를 담고 있는 객체(즉, 그 주소를 가리킨다.)이며 그 특성상 컴퓨터에게 상당한 영향력을 행사할 수 있는 것이다.

 

즉, 사람들이 포인터를 어려워하는 이유는 컴퓨터가 어떻게 작동하고 있는지에 대한 이해의 부족과, C라는 언어를 다루는 것의 미숙함에서 비롯된다. 포인터에 관한 내용만으로 책 한권이 나올 정도로 포인터의 활용성은 상상을 초월하며, C 뿐만이 아니라 C++에서도 포인터는 사용되기 때문에 수 많은 버그들이 이 포인터 때문에 일어나는 것임을 생각해보면 얼마나 제대로 된 자료를 가지고 제대로 공부해야 하는지는 말 할 필요도 없을 것이다.

 

Latina and Assembly

기계어 정도면 충분하지 않나? 

     - John von Neumann [1]

 

1965년 이전 가톨릭은 어느 나라건 상관 없이 모든 종교 행사에서 라틴어를 사용했다. 경전들도 라틴어로 된 판본을 사용하는게 원칙이었지만 1962년부터 3년간 개최된 제 2 바티칸 공의회에서 현지 언어를 사용할 수 있도록 허가됐다. 야훼와 예수의 말씀을 더 많은 사람들이 이해하고 깨달음을 얻을 수 있도록 한 것이다.

 

우리가 사용하는 컴퓨터 시스템은 1945년 존 폰 노이만이 First Draft of a Report on the EDVAC에서 제시한 폰 노이만 아키텍쳐를 따른다. 이 아키텍쳐를 설계한 폰 노이만은 기계어로 프로그램 작성이 가능했던 사람 중 하나였던데다, 그 당시 프로그램이라고 해봐야 단순한 계산 그 이상도 이하도 아니었으니 적어도 그에게 있어서는 다른 고수준 언어가 필요 없었을 것이다.

 

하지만 모든 사람들이 그 처럼 천재는 아니기 때문에 FORTRAN, Assembly 등의 언어가 쏟아져나오기 시작했고 그 이후 수 많은 프로그래머들이 탄생했으며 우리가 아는 지금의 세상이 만들어졌음은 두말할 필요도 없을 것이다.

 

The Priests and The Programmers

가톨릭 사제는 야훼와 예수의 말씀에 대해 누구보다도 잘 이해하고 있어야 하며 관할 구역의 신도들의 사정 또한 그 누구보다도 잘 파악하고 있어야 할 의무를 가진다. 이것은 아가페라는 가톨릭의 기본 이념을 구현하고자 하는 노력에서 비롯한다. 따라서 사제들은 가톨릭 경전들에 대한 거의 완전한 이해를 요구받으며 그 과정에서 라틴어의 학습은 필수인 것이다.

 

이러한 점에서 비추어 봤을 때 프로그래머들도 마찬가지다. 컴퓨터의 동작에 대해 누구보다도 잘 이해하고 있어야 함과 동시에 사용자의 요구사항을 정확하게 이해하고 구현해내야 한다. 따라서 학교마다 다르지만 정규 컴퓨터과학 교육과정에는 자료구조, 컴퓨터구조, 운영체제, 소프트웨어 공학 네 과목이 반드시 들어가있다.

 

나는 소프트웨어 개발이라는 영역에 진입하려는 사람들에게 항상 이렇게 말한다. 사람같이 생각하지 말라고. 이것은 수 많은 사람들이 좌절을 겪는 포인터라는 부분을 뚫고 나가기 위한 아주 기본 수칙중 하나라고 생각한다.

 

하지만 이 글을 쓰다보니 하나 더 추가해야 할 것 같은 생각이 들었다. 그 누구보다도 더 사람같이 생각하라고.

 

혼자 사용할 프로그램 만들어서 깃헙에 소스 올려놓고 자기만족 하는 것과 다른 사용자로부터 요구사항을 파악하고 구현하는것은 꽤나 거리가 멀다. 이것은 곧 기술적인 면과 커뮤니케이션적인 면을 둘 다 잘 해내야 한다는 이야기이다.

 

사용자는 어느 것이 되고, 어느 것이 안되는지에 대해서만 알고 싶어한다. 데이터베이스가 어쩌니, 어디 어느 구조가 잘못되었다느니 하는 것은 전혀 궁금하지 않다. 나를 포함한 초보 개발자들이 단일 책임 원칙이니, 캡슐화니 하는 등의 이야기는 곧잘 떠들어 대면서, 정작 현실에서 이런 개념을 적용하는 것에 대해서는 약한 경우가 많아 실수를 저지르게 된다는 것이다.

 

Conclusion

오늘도 전세계의 개발자들은 사용자들의 요구사항을 바탕으로 쓰기 편하고 효율적인 프로그램을 작성하기 위해 노력한다. 사용자에게 최소한의 이해만을 요구하며 사용자의 요구를 만족시켜야 한다.

 

그러니 우리는 모두 사제가 되어야 한다. 그 누구보다도 컴퓨터처럼 생각하며, 그 누구보다도 사람처럼 생각하도록,

그렇게 하도록 노력하자.

 

Post Script

일부 문장에서 불편함을 느낄 종교인들에게는 미안한 일이지만 나는 무신론자다.

 

종교랑은 담을 쌓은 사람이지만 그렇게 적대적이지도 않으며 이러한 점을 고려하여 최대한 중립적인 문장을 쓰려고 노력하였으니 양해해 주었으면 한다.

 

+

 

글 참 잘 쓰기 어렵다. 분명 이런저런 생각을 잘 정리했다고 생각했는데 쓰는데도 오래 걸렸고 그렇게 깔끔해 보이지도 않는다. 나중에 계속 읽어보면서 다듬어봐야지.

 

끝.

 

References

[1] Nell B. Dale, John Lewis,  "Computer Science Illuminated(2006)", 211p, Jones and Bartlett.