개발은 수학이랑은 조금 달라요.
나는 고등학생 때 문과를 선택했다. 지금은 IT 회사에서 개발을 하고 있다.
이 두 문장 사이에 있었던 고민과 일을 몇 편의 글로 풀어보려고 한다.
처음으로 개발에 발을 들이면서 겪었던 시행착오는 수학 공부와 비슷할 것이라는 나의 생각이었다.
수학을 배울 때는 개념을 먼저 이해하고, 개념이 이해되면 문제를 푼다. 나는 프로그래밍 공부도 이와 마찬가지라고 생각했다. 그런데 이 개념이라는 것이 도무지 와닿지 않는다는 것이 문제였다. 읽거나 들을 때는 그런가 보다 했던 것들이 다시 생각해보면 무슨 말인지 모르겠는 것이다. 이런저런 개념이 애초에 왜 필요한 건지, 뭐가 더 좋아졌다는 건지, 그게 어떻게 가능한지, 실질적으로는 뭘 의미하는 건지 끝없는 물음표만 이어졌다. 개념을 이해해야 다음을 넘어갈 수 있는데 개념 자체가 뜬구름처럼 느껴지니 답답했다.
나중에야 깨달은 것은 수학과 달리 개념이 완벽하게 이해가 가지 않아도 일단 문제를 풀다 보면 갑자기 '유레카!' 하며 이해가 가는 순간이 온다는 것이었다. 처음에는 완전히 이해가 가지 않은 채 코드를 치는 것이 마치 문제집의 해설지를 그대로 베끼는 것처럼 찜찜한 마음이 들었다. 제대로 공부하는 것 같지가 않았다. 그러나 '완벽한 이해 후 실습'에 대한 집착을 버리자 더 빠르고 쉽게 학습할 수 있었다. 책이나 강의에서 나온 설명을 어느 정도만 이해한 채 직접 타이핑하고 이런저런 시도를 통해 부딪혀 가다 보면 그 지식이 내 것이 되는 경험을 할 수 있었다. 때로는 일단 하고 봐야 하고, 그것이 잔꾀나 요령이 아니라 학습의 한 방법임을 더 빨리 알았더라면 덜 고생했을 것이다.
예를 들어 처음으로 자바를 배우면서 public static void main(String[] args) 메서드에 System.out.print("Hello World")를 작성한다고 해보자. 이것 하나만으로 뇌는 과부하가 온다. public이 뭐지? static이 뭐지? void는 뭐지? main 메서드 말고 다른 메서드에 쓰면 안 되는 건가? 메서드를 호출할 때 같이 보내는 변수가 () 안에 들어간다는데 나는 아무 변수도 보낸 적이 없는데? 애초에 main도 호출한 적이 없는데? 궁금한 것이 넘치겠지만 이 단계에서는 그냥 '메서드에 무언가를 입력했더니, 입력한 대로 동작하는구나.' 정도만 알고 넘어가면 된다. 어차피 나중에 차차 알게 된다.
또 다른 예를 들어 웹앱서버(WAS)를 처음 배운다고 가정해보자. 갑자기 근본忠이 되어 버린다. 근본적으로 웹이 뭐지? 앱이 뭐지? 서버는 뭐지? 이게 내부적으로 어떻게 동작한다는 거지? 웹앱서버가 있는데 웹서버는 왜 또 따로 두는 거지? 알던 것도 모르겠고, 원래 몰랐던 것은 더 모르겠다. 물론 나중에는 대답할 수 있어야겠지만, 이 모든 것을 알아야만 톰캣을 깔 수 있는 것은 아니다. 하다 보면 자연스럽게 터득하는 것들도 있고, 그때는 들어도 모르겠던 것이 실습을 하고 다시 들으면 알겠는 것들도 있다.
개발에 처음 도전하고자 하는 사람들에게 조심스럽게 하고 싶은 조언은, '막힐 때는 일단 그런가 보다 하고 넘어가고 나중에 다시 돌아와서 보자.'는 것이다. 이해가 갈 때까지 안 넘어가려고 하면 아무 데도 갈 수가 없다. 혹은 막히는 부분에서 계속해서 파고들다 보면 뭘 알려다가 여기까지 왔는지 모를 정도로 길을 잃는다. 그러니 한 번에 다 이해하려는 조급함을 내려놓고 여유를 가지는 것이 중요하다.
나는 이런 점에서 프로그래밍이 외국어를 배우는 것과 비슷하다고 생각한다. 초급 외국어 수준인 내가 배운 문법 체계 안에서 이해가 가지 않는 문장을 발견하고는 한다. 고급 문법까지 알고 나면 문법적으로 이해가 되는 문장이다. 이 문장 하나를 해석하려고 지금 나의 수준에 맞지 않는 고급 문법 체계까지 배우는 것은 나를 지치게 만들 뿐이다. 그럴 때는 '이런 용례도 있구나.'하고 그냥 받아들이고, 그 문장을 말하거나 들을 줄 알면 되는 것이다. 나중에 차차 수준이 올라가면서 '이런 문법이 있어 가능했던 문장이구나.'를 이해하면 된다.