“프로그래밍 입문하려는데 어떤 언어로 시작해야 좋습니까?”
이런 질문을 자주 본다. 최근 교양으로서의 프로그래밍이 주목받기 때문인 것 같다. 그런데 저런 질문이 나오는 상황이 프로그래밍 입문의 시작으로서는 불길한 게 아닌가 싶다. 프로그래밍에 자연스럽게 입문해서 오랫동안 취미로 혹은 나아가 직업으로 삼는 분들의 경우를 보면 프로그래밍을 하려고 입문하는 것이 아니라 어떤 특정한 프로그램을 만드는 게 목표였을 뿐, 프로그래밍 자체에 처음부터 흥미가 있는 경우는 적기 때문이다.
처음에는 단순히 워크래프트 III의 맵에 복잡한 규칙을 활용해보고 싶다거나 개인 웹사이트의 게시판에서 사용자 계정 옆에 사진이 뜨게 하고 싶었을 뿐인데 그걸 하려면 튜링 완전한 언어(그게 통상의 평문 코드든 스크래치 스타일의 그래피컬 코드든)를 다뤄야 했기 때문에 수단으로 어쩌다 배우게 되는 것이다.
그런 식으로 프로그래밍에 입문하는 것이 성공할 개연성이 높은 이유가 무엇일까? 아마도 저절로 목표 지향적 학습을 하게 되기 때문이 아닐까? 또 목표를 어떻게든 달성한 다음에 얻는 교훈이 굉장히 많고 특히 입문 초기에는 그것이 정말 귀중한데, 목표 지향적인 학습을 하지 않을 경우 첫 완성품을 만들기까지 시간이 너무 오래 걸리는 경우도 허다하다. 무엇을 만드려고 하는 공부가 아니기 때문에 어떤 완성품이 없이 책만 읽어나가는 경우도 많다.
그래서는 실제 코딩을 해봐야 익힐 수 있는 프로그래밍의 가장 중요한 부분들, 가령 디버깅을 하기 위해 변인을 통제하는 방법이나 디버깅을 할 때 원인의 후보 범위를 좁혀나가는 방법, 처음 보는 오류와 마주했을 때 다른 사람의 트러블슈팅 경험을 검색하여 자신의 경우에 적용해보는 방법, 프로그램을 완성하는데 필요한 부분 문제(subproblems)를 나의 노력을 최소화하여 푸는 방법(라이브러리 활용) 등을 익힐 기회가 별로 없다.
또한 문제를 풀 때 우선 순위를 결정하는 것과 같이 프로그래밍의 고유의 문제는 아니지만 꼭 필요한 요령을 배울 수 있는 기회도 놓친다. 그런 요령은 뭘 하든 필요하지만 그렇다고 뭘 해도 배울 수 있는 요령인 것은 또 아니다. 게다가 우선 순위 결정을 못하면 프로그래밍을 능숙하게 해낼 수 없는 정도가 아니라 프로그래밍을 거의 할 수 없기도 하다.
우선 순위를 결정을 물 밑에서 해야 하는 대부분의 다른 활동과 달리 목표 지향적 프로그래밍은 우선 순위 결정을 명시적·의시적으로 훤히 드러나게 하게 마련이다. 의식적 결정의 반복은 반복 숙달의 왕도이기도 하다. 그런데 ‘어쨌든 프로그래밍을 배운다’와 같이 추상적 목표 아래서 우선 순위 결정을 의식적으로 할 기회가 있을까?
처음으로 돌아와서,
“프로그래밍 입문하려는데 어떤 언어로 시작해야 좋습니까?”
프로그래밍에 성공적으로 입문하는 사람들은 대체로 입문용 언어를 결정하는 과정을 거치지 않는다. 이미 결정되어 있기에 그것은 자발적 결정이라기 보다는 주어진 제약 조건을 인식하는 것에 더 가깝다. RPG 게임을 만들고 싶고 나는 프로그래밍을 모른다, 그렇다면 가능한 선택지는 ‘RPG 메이킹’ 같은 것이다. 게시판에 대댓글 기능을 만들고 싶은데 내가 설치한 게시판은 제로보드다, 그럼 가능한 선택지는 PHP뿐이다.
그런 질문에 대답해야 하는 상황은 내가 프로그래밍을 통해 하고 싶은 일이 아직 구체적으로 없는 경우이다. 반면 구체적이고 단기적인 목표가 있는 경우에는 프로그래밍 언어를 결정해야 할 때 다르게 질문한다. 이를테면,
“제가 ○○를 만드려고 하는데요.”
원문: 洪民憙 블로그