내가 생각하는 프로그래밍 커리큘럼 - 파이썬을 중심으로
어떻게 공부해야 하는지, 무엇을 해야 하는지는 공부를 하는 모든 사람들에게 막막하고 어려운 일이라 생각한다. 나또한 그랬고, 그때문에 안 그래도 되는 길을 돌아가거나 고생을 사서 한 부분도 많이 있었다. 돌아보면 이 모든 것들이 경험치가 되어주었긴 했지만, 그래도 가이드라인이 있다면 내가 가고자 하는 방향에 맞는 계획을 세울 수 있지 않을까 싶다. 최근 퇴직을 했는데, 하고자 하는 일인 1인 개발로 먹고살 정도 수익을 내는 것은 단기간에는 어려울 것이기 때문에 (배운게 도둑질이라고) 프로그래밍 과외를 하기 위한 준비를 하고 있다. 그 과정에서 자연스럽게 커리큘럼을 어떻게 할 것이며, 이미 시장에 적잖이 있는 다른 강사들에 대비해 내가 가진 강점과 특징이 무엇이 있을 지 생각하게 되었고, 생각을 정리할 겸 이 글을 적고 있다.
프로그래밍을 배운다는 것
프로그래밍을 배운다는 것에는 여러 가지 의미가 담겨 있다. 크게 새 언어를 배워 그 언어 문법을 이해하고 사용하는 기술과 이 언어를 이용해 문제를 해결하기 위한 프로그램을 만드는 활용, 이 프로그램을 만들기 위해 문제를 정의하고 모델링하는 논리 이렇게 3개로 나누어 볼 수 있다고 생각한다. 사실 프로그래밍의 본질은 기술보다는 논리에 있다고 생각하고, 언어는 단지 도구에 불과하다고 생각한다. 그래서 코더와 프로그래머를 엄격하게 구분하는 사람들도 있다 . 만일 언어가 단순 도구가 아니라 논리를 지배하는 더 고차원적인 것이었다면 필요에 따라 기술 스택을 맘대로 갈아타고 새 언어나 툴이 나올 때마다 누구나 달려들어 써볼 수도 없었을 것이다.
그러면 이 도구에 불과한 언어를 얼마나 배워야 할 것인가? 그건 전적으로 공부하는 사람의 목표에 달려있다고 본다. 먼저 (주로 어린 학생들처럼) 프로그래밍을 배우기 위해 프로그래밍을 배우는 사람들에게는 기술적인 부분이면 충분하다고 본다. 보통 이런 목적을 가지고 있는 사람들은 프로그래밍을 배워서 무언가를 하겠다는 것보다는 프로그래밍을 배우는 것 자체에 의미를 두고 있기 때문에 프로그래밍 언어를 배우면서 컴퓨터처럼 생각하고 내가 생각하는 것을 명확하게 코드로 만들어내는 것으로 소기의 목적을 거의 달성할 수 있을 것이다. 파이썬을 예로 든다면 입문서 한 권 정도를 보고 안에 있는 내용을 2/3정도 이해하면 충분할 것이라 생각한다. 뭐 다 몰라도 모든 언어에서 가장 중요하다고 생각하는 if, for 두 개만 확실히 이해하고 있으면 된다고 생각하는데, 사실 이것만 있으면 어떻게든 내가 원하는 것을 다 만들어낼 수 있다.
나아가 실제로 내 일상이나 업무에 프로그래밍 기술을 적용해 효율성을 높이고 자동화를 하고자 하는 사람들에게는 단지 언어와 문법을 아는 것으로는 충분하지 않고, 이걸로 어떻게 완성된 프로그램을 만들어서 필요한 곳에서 사용할 것인지에 대한 고민이 추가로 필요하다. 이 과정에서 새로운 패키지를 배워 사용해야 하는 경우도 있고, 프로그램이 잘 작동할 수 있는 환경을 구축하기 위해 프로그래밍 언어가 아닌 다른 것(예를 들면 컴퓨터 시스템 구조라거나)을 배워야 하는 경우도 있다. 여기에서는 검색 기술이나 고급 프로그래밍 스킬보다는 인내심과 꺾이지 않는 마음이 필요한데, 뭘 보더라도 처음보는 거고 뭘 하더라도 생각대로 한 번에 잘 되지 않을 것이기 때문이다. 예를 들어 매일 여러 부서에서 올라오는 엑셀 파일을 취합해 보고용으로 정리된 자료를 뽑아내는 것을 자동화하고 싶다면 엑셀을 읽고 쓰는 패키지를 찾아야 하고, 그 중에 내가 원하는 기능을 잘 지원하는 것을 골라 설치, 사용해야 한다. 이 툴에서 제공하는 방식에 따라 엑셀 파일을 다루는 방법을 배워야 하고, 어쩌면 파일 경로 길이나 한글, 특수문자 등으로 인한 곤란함을 겪을 수도 있다. 사실 요즘 이런건 AI 한테 시키면 워낙 기본 틀을 잘 짜줘서 프로그래밍 공부하는 시간에 지피티랑 씨름하는게 더 생산성이 높을 가능성도 있다. 하지만 이렇게 AI 랑 씨름을 하려면 이 다음에 이야기할 능력이 중요해지는데...
내가 만들어서 나만 쓰고 말 게 아니라 다른 사람이 쓰는 것까지 생각하고 있다면 그게 얼마나 많은 사람이 쓰건 일종의 직업 개발자를 하겠다고 선언한 것이라 봐도 좋을 것 같다. 여기에서는 굳이 언어나 도구가 장벽이 되기보다는 문제 상황을 깔끔하게 정의하고 프로그램으로 만들 수 있게 모델링하는 것이 능력을 가른다고 생각한다. 내가 개발을 해오면서 결국 점점 필요해지는 게 결국 질문하는 능력, 상황을 정리하는 능력, 문제의 범위를 한정하고 정의하는 능력이었다. 예를 들어 chat GPT 등을 이용해 코딩을 한다고 치자. AI는 내가 알고 있는 것들을 모르기 때문에 모든 것을 다 알려줘야 하는데, 그러기 위해서는 지금 내 상황과 해결하고자 하는 문제를 명확하게 정의, 정리하는 것이 필요하다. 그러지 않으면 AI 가 마음대로 코드를 만들어 원하는 결과에 도달할 수 없기 때문이다. 실제로도 개발자는 키보드를 열심히 두드릴 때보다 팔짱끼고 앉아서 멍하니 있는 것처럼 보일 때가 더 열심히 일하는 중인 경우가 많은데 (물론 실제로 팔짱끼고 앉아서 멍하니 있는 경우도 종종 있다) 대개의 경우 해결해야 하는 문제에 대한 정의와 해결을 위한 구조를 머릿속으로 설계중인 경우일 것이다. 사실 프로그래밍을 배워서 얻을 수 있는 궁극적인 열매는 이것이라고 생각하는데, 그리고 사실 이건 굳이 프로그래밍을 배우지 않아도 얻을 수 있는 스킬이라고 보기는 하는데 (예를 들어 수학) 아무래도 좀 더 내 손으로 직접 결과를 만들고 눈으로 볼 수 있는 쪽이 효과나 동기부여 차원에서 도움이 많이 되기 때문에 프로그래밍을 통해 문제 정의와 모델링 능력을 기르는 것도 좋다고 생각한다.
그래서 무엇을 어떻게 배울 것인가?
사설이 길었는데, 그래서 파이썬 커리큘럼은 어떻게 가져가면 좋을까? 위에서 말한 것과 같이 3단계 정도로 나눠볼 수 있을 것 같다. 난 파이썬을 주로 해서 먹고살았던 사람이니 파이썬을 기준으로 설명해보겠다. 다른 언어는 언어가 가지는 특성때문에 더 배워야 하는 것들이 있을 수 있다. 또한 아래에 있는 커리큘럼은 절대적으로 선형적이지 않다. 아무리 작은 프로그램을 만든다 해도 결국 문제를 정의하고 모델링할 수 있어야 하기 때문에.
Opening
제일 처음에는 언어의 문법을 익히는 데 중점을 둔다. 아래 있는 학습목표(?) 를 다 이해하고 활용할 수 있으면 될 것 같다.
- 내 개발 환경(windows, mac OS X, *nix 등) 에서 파이썬을 설치하고 인터프리터를 실행해 역사적인 "Hello World!" 를 출력해본다.
- 변수를 사용해 기본적인 계산을 해보고 문자열을 다루는 방법을 안다.
- 조건문, 반복문을 활용해 로직을 작성할 수 있다. 이 과정에서 python 의 들여쓰기 등 문법에 익숙해진다.
- 반복 사용되는 코드를 함수로 묶어 재사용할 수 있다.
- 파이썬에서 자주 쓰이는 축약(comprehension) 등의 기술을 이용해 파이썬스러운(pythonic) 코드를 읽고 작성할 수 있다.
- (optional) OOP 기초에 대해 이해하고 클래스 등을 사용해 프로그램을 작성할 수 있다.
- OOP 가 뭐 그렇게 어려운 건 아니긴 한데, 이건 약간 문법에서 벗어난 내용이라 optional 로 두었다. 물론 OOP 를 위한 문법도 배워야 하기는 하다만.
Middlegame
그 다음으로는 배운 기술을 이용해 원하는 기능을 만들어내는 것을 반복해 성공하는 것이 필요하다. 다양한 상황을 만나면서 배운 기술을 적용하는건 결국 연습이 좀 필요한 부분이니까. 그러면서 문제 정의/해결 능력이 길러지기도 하고.
- virtualenv 에 대해 이해하고 프로그램별로 독립된 개발환경을 준비할 수 있다. (pyenv, poetry 뭐든 좋다.)
- 하고자 하는 작업을 잘 할 수 있는 패키지를 찾아 이를 설치하고 내 코드 내에서 사용할 수 있다.
- 지금까지 배운 기술을 활용해 가독성 있고 깔끔한, 곧 유지보수 가능한 프로그램을 작성한다.
Endgame
이어서 더 많은 기술을 사용하면서 점점 더 추상적인 작업을 해나가야 한다. 이쯤 되면 데이터의 구조나 흐름에 많은 공을 들이게 되고, 이것이 결과물의 품질과 유지보수/확장성에 영향을 주게 된다.
- 현실에 존재하는 문제 또는 만들어야 하는 기능을 명확하게 정의할 수 있다.
- 이 안에는 문제의 범위, 가능한 입출력의 경우, 예외 케이스와 이에 대한 처리 등이 들어간다.
- 가능하면 테스트 코드를 작성하면 좋다.
- 데이터가 어디에서 들어와서 어디에서 처리되고 어디로 반환되는지 정리하고, 이를 로직과 연관지을 수 있다.
- 이 안에는 데이터의 저장 구조와 API를 어떻게 설계하고 연결하는 지에 대한 부분이 들어가 있다.
마치며
사실 가르치는 입장에서는 어떤 명확한 커리큘럼이 있고 그걸 반복하는게 편하긴 한데, 나는 가능하면 배우는 사람에게 가장 알맞은 범위와 방식을 조율해 이에 맞게 수업을 하는 것이 가장 좋다고 생각한다. 아마 이 과정이 힘들고 불필요하게 느껴질 수 있겠지만, 목표와 구체적인 골이 있어야 가르치는 사람도 배우는 사람도 방향을 잃지 않고 필요한 것을 얻어갈 수 있기 때문에 난 이게 제일 중요한 과정이고 꼭 필요한 단계라 생각한다. 만약 프로그래밍을 공부하고 싶은 사람이 이 글을 봤을 때 "아 난 이렇게 공부하면 되겠구나" 를 확실히 알 수 있는 사람이 그리 많지 않을 수도 있다. 또는 내가 위에 예시로 적은 커리큘럼(?) 에 반대하는 사람도 있을 것이고. 비겁하게도 반박 시 내 말이 다 틀렸음을 마지막 disclaimer 로 남겨보려 한다 ㅋㅋ
붙이는 글
혹시 파이썬 공부를 해보고 싶거나 파이썬으로 내 삶을 조금 더 편하게 만들어보고자 하는 사람, 그냥 이 사람은 무슨 생각을 하는지 궁금한 사람은 언제든 연락주시면 언제든 즐겁게 커피챗을 할 수 있습니다. 커피는 제가 삽니다.