2025년 1월 1일, 새해 첫날에 푸딩캠프의 뉴스레터를 발송하니 기분이 묘합니다. 12월은 도둑맞은 것처럼 금방 지나간 것 같거든요. 새해, 좋은 일 가득하고 건강하시길 기원합니다!
새로운 언어를 배우는 좋은 방법: 실전 프로젝트로 시작하기
1단계. 기초 문법 학습과 동시에 토이 프로젝트 착수
1단계에서는 먼저 Python 개발 환경을 간단히 설정하고, 토이 프로젝트를 기획합니다. 깔끔하게 정돈된 개발 환경을 구성하기 보다는 Hello World 출력에 주안점을 두는 게 좋습니다. 하지만, 이 단계에서 Hello, world!를 출력하는 수준에서 그치지 말고, 실제로 사용할만한 유틸리티나 충분히 익숙해서 구현 자체엔 무리하는 기분이 들지 않는 토이 프로젝트를 만들기를 권장합니다. 예를 들어, 뉴스를 웹에서 수집해보거나 CLI 유틸리티처럼 실무에 응용할 수 있는 주제를 정해보는 것입니다. 혹은 계산기처럼 자료 구조와 알고리즘 등을 연습하면서도 구현할 요소는 별로 없는 것도 좋습니다.
프로젝트는 먼저 의사 코드를 작성해보는 것도 좋습니다. 이는 프로젝트를 보다 구체적으로 개괄하면서도 낯선 프로그래밍 언어(Python)를 학습하는 것에 좀 더 작업 기억을 할애하는 데 도움이 됩니다. 새로이 기초 문법을 접할 때마다 의사 코드를 해당 문법으로 변환하기 때문에 학습 진도와 방향을 가늠하기 좋습니다.
이렇게 토이 프로젝트를 1단계부터 시작하는 이유는, 사람 뇌가 실제 문제를 해결하려 할 때 인지 부하가 크게 걸리면서 학습 효과가 높아지기 때문입니다. 처음부터 프로젝트는 무리 아니냐는 걱정이 들 수도 있겠지만, 오히려 가볍게라도 프로젝트를 발주(着手)해두면 스스로 목표가 생기고, 중간에 어떤 개념을 학습해야 할 때 동기가 높아집니다.
변수, 자료형, 조건문, 반복문, 함수 등 기초 문법을 가볍게 훑고 나면, 책에 있는 예제만 그대로 따라 해보는 것에 그치지 말고, 프로젝트와 직접 연계할 수 있는 작은 시도를 해보는 것이 좋습니다. 되도록 라이브러리를 사용하는 건 지양하되, 라이브러리를 써야 한다면 학습 대상을 지나치게 추상화한 것은 피하길 권장합니다. 이는 언어를 깊이 이해하기 위해서라기 보다는 익숙해져서 손에 체화시키는 과정에 필수적인 반복 과정이 생략되지 않도록 하고자 함입니다. 대신 학습 주제와 그다지 관련 없는 것이라면 괜찮습니다. 가령, JSON parser 를 구현하는 게 아닌 이상 JSON 라이브러리를 쓰는 게 학습에 더 효율적일 것입니다.
2단계. 프로젝트 기능 확대와 바람직한 어려움 증폭
2단계에는 1단계 때 만들어둔 프로젝트의 골격을 더 발전시키면서, Python의 주요 기능(자료구조, 라이브러리 활용 등)을 사용해봅니다. 예를 들어, 뉴스 헤드라인 스크래핑을 주제로 했다면, 이제는 크롤링한 텍스트를 분석해서 빈도수 통계를 내거나, 특정 조건에 따라 텍스트를 필터링하는 기능을 만들어볼 수 있습니다. 또는 API로 받아온 데이터를 화면에 깔끔하게 출력하거나, DB에 저장하는 방식을 시도해보는 것이지요.
이 단계에서 핵심은 좀 더 불편하고 낯선 라이브러리나 기능을 시도한다는 점입니다. 사람은 잘 아는 것을 반복할 때 학습된 만족감을 쉽게 얻지만, 그 상태는 실은 학습한 느낌에 속은 것일지도 모릅니다. 반대로, 생전 처음 들어보는 라이브러리(BeautifulSoup, pandas, SQLAlchemy 등)를 프로젝트에 붙여보려 할 때, 구글링과 공식 문서, 예제 코드를 뒤져야 하고, 갖가지 오류를 만나게 됩니다. 이런 바람직한 어려움은 장기 기억 형성에 엄청난 자극제가 됩니다.
A.I.을 이용하는 경우, 답을 직접적으로 받기 보다는 문제를 풀거나 학습 방향을 찾는 힌트로 활용하는 게 좋습니다. 또는 이해한 것을 프롬프트한 후 놓치고 있는 것을 찾아달라고 요청하거나 문제를 출제해달라고 활용하는 걸 권장합니다.
또한 2단계부터는 교차 학습을 의도적으로 섞어볼 수 있습니다. 예를 들어, 데이터를 처리할 때 Python만 쓰지 말고, R이나 SQL도 살짝 써보거나, 웹 프론트엔드쪽 코드를 잠깐 구경해보는 것이죠. 그러면 Python에서는 리스트와 딕셔너리로 이렇게 간단하게 처리하는데, 다른 언어에선 어떠한지 비교하고 차이점을 이해하며 특징을 대비해서 보게 되고, 그 결과 Python 문법과 방식이 더 각인됩니다. 마치 대비 효과처럼요. 이게 맥락 전환(Context Switching)으로 인지 부하를 높여 학습 효과를 올리는 교차 학습의 장점입니다.
2단계 말에는 프로젝트를 통해 겪은 오류나 궁금증을 자신만의 학습 노트에 정리해두고, 이 중 “내가 틀렸던 부분”, “성능이 안 나오는 부분” 등을 골라 스스로 작은 시험(문제 출제)을 만들어보면 좋습니다. 예컨대, “파일에서 텍스트를 불러온 뒤, 단어별로 줄 세워 출력하는 함수를 오프라인 환경에서 10분 만에 짜볼까?” 같은 자가 시험이죠. 이 짧은 시험이야말로 인출 연습과 시험 효과를 극대화하는 도구입니다.
3단계. 인출 연습 심화와 리팩토링, 협업 체험
3단계에는, 2단계까지 만든 프로젝트를 좀 더 다듬고, 기능을 재구조화(리팩토링)해보면서 코드 품질과 테스트 코드를 작성하면 좋습니다. 대체로 입문 단계 학습자는 테스트 코드 작성을 기피하거나 어려워합니다. 하지만 바로 그 지점이 또 하나의 바람직한 어려움입니다. 테스트 코드를 작성해보려면, 예제 코드나 튜토리얼을 뒤져야 하고, pytest나 unittest 같은 프레임워크를 새로 배우게 되며, 그 과정에서 내 함수들이 어떻게 만들어졌나,를 다시 한 번 곱씹게 됩니다.
이렇게 리팩토링과 테스트를 거치면서, 인출 연습을 한 번 더 촘촘하게 해볼 필요가 있습니다. 2단계에 만들었던 코드나, 학습 노트에 적어두었던 문법, 라이브러리를 기계적으로 복사해 붙이지 말고, 다시 한 번 머릿속 기억을 먼저 끄집어내어 코딩을 시도해보는 거죠. 가령, requests 쓰는 방법이 잘 생각 안 나서 오류가 난다면, 그 순간이야말로 이제 자료를 참조해서 수정하는 과정을 기록하고, 그 기록이 뇌에 깊이 박히는 학습 과정이 됩니다.
3단계에는 다른 사람과 협업하는 경험도 작게나마 해보면 효과적입니다. 스터디 모임이라면 서로 코드를 교환해서 리뷰를 해본다거나, GitHub PR을 주고받는 간단한 방식도 좋습니다. 이때 지연된 피드백 기법을 사용해 코드를 작성한 지 며칠 뒤 피드백을 받도록 일정 조정을 해보면, 학습자가 망각이 살짝 진행된 상태에서 다시 코드를 들여다보게 되어 장기 기억 강화에 유리합니다.
대개 3단계에서는 무엇을 더 학습할지, 무엇을 나중에 학습할지 가늠이 되므로, 학습할 주제를 활용해 프로젝트를 계속 개발하고 개선해나가는 게 좋습니다.
4단계. 최종 기능 완성, 발표와 후속 피드백으로 학습 고도화
마지막 4단계는, 1단계에 시작한 토이 프로젝트를 가능한 선에서 완결해보고, 다른 사람에게 직접 시연하거나 설명하는 시간을 갖습니다. 이를 통해 내가 만든 프로젝트가 어느 정도로 유용한지, 아직 헷갈리는 부분은 무엇인지를 최종 점검하게 됩니다. 예컨대, 크롤링 및 분석을 해서 얻은 결과를 시각화하거나, 웹 UI를 덧씌우고 간단히 접속해보는 등 파이썬으로 할 수 있는 확장 시도를 해볼 수 있습니다.
이 시점에서 발표 과정을 꼭 권장합니다. 왜냐하면 다른 사람에게 시연하고 설명할 때, 자신의 뇌에서 그동안 배웠던 개념과 코드를 재구성해 말로 풀어야 하기 때문입니다. 이때가 바로 인출 연습과 정교화(elaboration)가 극적으로 일어나는 순간입니다. 누군가 질문을 던지면, “아, 저 부분은 이렇게 처리했는데, 구조상 이런 장점이 있고 이런 단점이 있더라” 같은 식으로 자신도 몰랐던 사유 과정을 더 깊이 하게 됩니다.
발표 이후에는 다시 한 번 지연된 피드백을 활용해, 발표가 끝난 뒤 1주쯤 뒤에 온라인상에서 “그 뒤 프로젝트나 코드를 사용해본 사람 있나요?”, “저 부분은 최종적으로 이렇게 고쳤더니 해결됐습니다” 같은 식의 간단한 리뷰 모임을 추가로 갖습니다. 그러면 학습자 입장에서는 이미 끝났다고 생각한 프로젝트를 다시 들여다보는 과정을 통해, 장기 기억의 재고정(Reconsolidation)이 일어납니다.
의견을 남겨주세요