프로그래밍에 대해 질문이랄까? 고민이 있습니다.
cartes드디어 열혈강의 C프로그래밍에 있는 문제들 15과까지 한개 남겨놓고 다 풀었네요.
근데 질문이랄까? 고민이 있습니다.
복잡한 loop나 if문 같은거 짤때 알고리즘이 머릿속에 바로 안들어오고, 종이에 써보면서 약간 시간을 들여야 완전히 이해가 되곤합니다.
다른분들은 어떤가요? 제가 별로 프로그래밍에 소질이 없는거같아서 그런거 같은데, 원래 처음할때는 다 그런건가요?
또 연습문제를 풀때도 해결책이 바로 안떠올라서 종이에 문제를 차례차례 단계적으로 접근해서 푸는 방법으로 해결을 합니다.
프로그래밍에 재능이나 감각이 있는 사람이라면, 문제를 보자마자 해결할수있을것 같기도 한데 다른분들은 어떤가요?
간간히 천재들이 있습니다. 그런 분들을 제하고 나면 대부분의 프로그래머 들은 많은 탈고의 과정을 거쳐서 프로그램을 써내려 갑니다.
문제를 푸는것도 마찬가지 입니다. TDD라고 들어보셨죠? TDD의 핵심은 큰 문제를 작은 문제로 쪼개서 풀자 입니다. 전 2년차 프로그래머 인데 아직도 퀴즈를 풀때 종이에 먼저 적습니다^^
시행착오를 겪는 것이 당연합니다. 제 경험으로는 많이 고민하고 뜯어 고칠수록 좋은 코드가 나오는 것 같아요. 그리고 윗 분께서도 말씀하셨지만 큰 부분부터 접근해서 점점 세밀하게 구현해 나가는 게 가장 좋습니다. Top-down 방식이라고 하나요?
폰노이만 메커니즘 위에서 프로그래밍 할 때, 초보자에게 닥치는 전형적인 어려움입니다. 어려움을 느끼는 이유는 아직까지 폰노이만 기계에 대한 충분한 이해가 없기 때문입니다. 이것은 특별히 공부한다고 느는 것이 아니라 꾸준히 프로그래밍을 하다보면 익숙해집니다.
조금 설명하자면, 폰노이만 기계는 상태를 저장하고 이 상태를 바꾸면서 프로그램이 돌아가게 됩니다. 때문에 코드 특정 부분에서 기계가 현재 어떤 상태를 유지하고 있는 가를 아는지가 가장 중요한 문제가 됩니다.
그래서, 폰노이만 기계에서 프로그래밍을 할 때 사용하는 기본적인 기법중에는 현재 보고있는 코드에서 최소한의 상태만 알면되도록 프로그램을 짜는 쪽으로 발전한 경우가 많이 있습니다.(캡슐화, 모듈화 등) 또, 이러한 기법은 대부분 디버깅과도 깊은 관련이 있습니다.
근본적인 측면에서 보자면 semmal님이 말씀하신 것이 맞겠으나, 단순히 모든 상태를 알고 있다고 해서 알고리즘 문제가 잘 풀리는 건 아닌 것 같습니다. 결국 많은 시행착오를 하면서 써내려가는 것이라고 생각합니다.
주변에 정말 천재같은 친구들 몇몇을 보더라도, 결국 그 시작은 다 하나하나 추적하며 (써내려가든 머릿속으로 생각하든) 이뤄낸 것이고 다만 그것이 일정 수준에 도달하게 되면 마치 라이브러리 함수 불러다 쓰듯이 머릿속에서 간단한 부분들을 쉽게 자동화해 생각하고 여러 방식으로 조합할 수 있게 되어 보다 빠르게 문제를 해결할 수 있는 차이라고 봅니다. (참고로 이 얘긴 IOI 출신인 친구가 해줬습니다..-_-)
자그마한 프로그램에서는 당연히 모든 상태를 모두 알아야하겠지만, 어느정도 규모있는 프로그램에서는 모든 상태를 알 수 없을 뿐더러 알려고 해서도 안됩니다. 다만 알아야하는 상태를 줄이려는 노력은 반드시 해야합니다. 단지, 어느 정도로 줄여야하는 지는 경험에 따른 것이라서 딱히 정할 수가 없는 문제입니다. 상태를 줄이려고 애쓰는 것은 수학에서 추상을 쓰는 이유와 다르지 않습니다. 복잡한 것을 간단하게 만드는 것이죠. 이렇게 복잡한 것을 간단하게 만드는 방법을 깨닫게 되면 점점 프로그래밍이 쉬워지고 재밌어진다고 생각합니다.
정말 좋은 자세를 가지셨다고 생각합니다. 문제를 보고 바로 알고리즘이 떠오른다고 해도 그것이 제대로 완성된 알고리즘이라고 하기에는 부족한 경우가 많습니다. 이런 경우에는 차근차근 종이에 생각을 하며 푼 경우보다도 풀이에 더 오랜 시간이 필요하게 됩니다.
프로그래밍을 많이 하다가보면 문제만 보고도 알고리즘이 생각나는 경우도 있지만 이런 경우는 대부분이 그전에 비슷한 혹은 같은 유형의 문제를 풀어봤기 때문에 경험에 의해서 나오는 경우가 대부분입니다. 이러한 경우라도 지금같은 자세가 필요하다고 생각합니다.