푸딩캠프 이야기
스터디 캠프 2기, 3기 시작
지난 주 OT를 마치고, 드디어 이번 주부터 본격 스터디를 시작했어요. 먼저 시작을 끊은 건 3기였는데요. 2시간이 부족하다고 느낄만큼 빼곡한 스터디를 치렀던 것 같습니다. 3기는 코드 작성하는 게 필요한 스터디여서 페어 프로그래밍을 스터디에서 하는데요. 아직 서로를 잘 알지 못하고 페어 프로그래밍 경험이 부족한 분도 있지만, 이번에 경험했으니 다음 2회차에선 더 경쾌하게 진행하실 것 같아요. 아참, 스터디하는 책은 “프레임워크 없는 프론트엔드 개발”이에요.
2기 스터디는 “소프트웨어 엔지니어 가이드북” 책을 함께 학습해요. 깊은 이해와 숙지를 바탕으로 토론과 토의에 참여하는 의도로 스터디 진행 방식을 설계했는데요. 잘 이뤄지길 기대하고 있어요.
4기도 머지 않아 모집하는데요. 관심 있는 분은 뉴스레터를 주목해주세요!
토이스토리 1기 2차 프로젝트 마지막 개발 주간
토이스토리 1기의 여정도 어느 덧 종반을 향하고 있어요. 이번 주에 2차 프로젝트 개발을 마치고, 운영을 앞두고 있거든요. 두 개 프로젝트가 곧 선보이는데, 출시하면 뉴스레터로 소식 전해드릴게요.
개발자를 위한 실천적 학습법
앞서 우리는 학습이 이뤄지는 원리, 그리고 효과와 효율이 좋은 학습법을 알아보았습니다. 하지만 이것만으로는 구체적으로 어떻게 자신의 일에 활용해야 할지 다소 막연하거나 막막하다고 생각할 것 같습니다. 이번 편부터는 다양한 환경에서 어떻게 학습하면 좋을지 실천적 방법을 예로 들며 살펴보겠습니다.
1. 바람직한 어려움(Desirable Difficulties) 활용하기
(1) 코드 에디터 활용 난이도 올리기
Bjork의 바람직한 어려움(Desirable Difficulties) 개념에 따르면, 인지적 부담이 약간 증가한 환경에서 학습하면 기억력이 강화됩니다. 사용해보지 않은 코드 에디터의 단축키를 사용하면 초기엔 불편하지만, 뇌가 이를 중요한 과제로 인식하고 신경망을 단단히 구축하지요. 또는 사용해보지 않은 코드 에디터의 기능을 찾아서 같은 문제를 색다르게 풀어보는 것도 한 방법입니다.
요는 제한된 자원 환경에서 개발을 하는 것입니다. 이처럼 일부러 약간 어렵게 만들기는 나중에 더욱 빠르고 정확한 코드 작업을 가능하게 한다. 이런 방법은 중장기적으로는 코드 에디터의 활용도 향상으로 효율과 생산성이 증가하는 부가 효과도 있습니다.
(2) 테스트 코드로 리팩토링하기
지금까지 테스트 코드를 안 썼다면, 기존에 잘 돌아가는 코드 베이스를 가져와 테스트 코드를 작성하며 리팩토링하는 방법도 바람직한 어려움을 활용하는 것입니다. 테스트 코드를 처음 작성하는 건 번거롭고, 테스팅과 관련된 API나 테스트 프레임워크에 익숙해지는 데 인지적 부하가 듭니다. 테스트 코드 작성이 처음이면 어디서부터 시작해야 할지, 무엇에 대한 테스트 코드를 작성할지 막막하며, 기존 구현체가 테스트 코드를 작성하기 까다롭게 결합도가 높거나 복잡도가 높으면 더욱 더 막막하고 어렵습니다.
테스트 코드는 인지적 부하를 일으키는 것 뿐만 아니라 시험 효과(Test-enhanced learning) 효과를 불러일으켜 기억을 강화하는 데 효과적입니다(Roediger & Karpicke, 2006; Brown, Roediger & McDaniel, 2014). 그리고 제대로 작성한 것인지 문제가 있는지에 대한 피드백을 빠르게 받기 때문에 학습 효과가 큽니다. 또한, 테스트 코드는 리팩토링을 하는 데 있어서도 실용적, 그리고 심리적으로 안전감을 줍니다.
2. 인출 연습(Retrieval Practice)과 시험 효과(Test-Enhanced Learning)
헨리 로디거(Henry L. Roediger III)와 제프리 카피케(Jeffrey D. Karpicke)의 연구에 따르면, 단순히 자료를 반복해서 읽는 것보다 머릿속에서 정보를 꺼내려 노력하는 인출 연습이 장기 기억 형성에 훨씬 효과적입니다.
(1) 기억해내는 데 집중하기
문서 없이 코드 구현해보는 건 인출하려 노력하는 방법 중 하나입니다. 새로 학습한 API나 메서드를, 코드 에디터의 자동완성이나 문서, 인공지능 도움 없이 자신의 기억을 되살려 작성해봅니다. 완벽하지 않아도 괜찮아요. 이 과정에서 일어나는 부하가 뇌로 하여금 해당 정보를 더 강력하게 연결하게 합니다. 중요한 것은 기억에서 힘겹게 떠올려 글을 내 언어로 작성하는 게 핵심입니다.
(2) 시험 문제 직접 만들기
자기 질문(Self-Questioning)과 문제 출제는 자신에게 시험을 내는 효과를 냅니다. “지금 내가 배운 알고리즘을 다른 자료구조에 적용할 수 있을까?”와 같은 질문을 스스로에게 던지고 답해보세요. 문제를 스스로 만들어 보는 과정 또한 메타인지와 인출 연습을 크게 강화합니다. 왜냐하면 출제를 내고 그 문제를 푸는 과정에서 나만의 사고방식으로 개념을 재구성하게 되어 기억과 인출 효과가 커지기 때문입니다.
이런 학습 방법은 단순한 인출을 넘어 새로운 형태로 지식을 재구성하는 고차원적 활동입니다(Dunlosky et al., 2013). 이 과정은 메타인지를 높이고, 자신이 모르는 부분을 식별하여 전략을 조정하게 만듭니다. 또한 드웩(Dweck, 2006)의 ‘성장 마인드셋(Growth Mindset)’ 개념에 비추어보면, 어렵고 새로운 도전을 회피하지 않고 문제를 창출하는 태도는 학습자의 능력이 고정된 것이 아니라 발전 가능한 것임을 스스로 인정하는 방향으로 이끕니다.
3. 교차 학습: 다중 스택으로 프로젝트 진행하기
의도적 변동(교차/변화 학습)하는 방법으로, 학습을 목적으로 하는 상황에서 한 가지 언어와 프레임워크로만 프로젝트를 만들지 말고, 일부 모듈은 다른 언어/프레임워크로 교체하거나, 같은 기능을 두 환경에서 구현해보는 방법입니다.
이 방법 초반엔 맥락 전환으로 학습 효과가 떨어진다고 느낄 가능성이 큽니다. 하지만 다양한 맥락에서 비슷한 문제를 해결함으로써 각 도구나 직군이 어떻게 연결되는지, 패러다임 차이가 무엇인지 더 잘 이해하게 됩니다. 대비되기 때문이죠. 게다가 이 위기를 넘기고 나면 기억과 개념이 더 단단해지고, 새로운 기술이나 개념을 학습할 때 부담이 줄어들 것입니다(Bjork & Bjork, 2011; Cepeda et al., 2008).
4. 메타인지(Metacognition)와 피드백(Feedback)
(1) 메타인지
존 던로스키(John Dunlosky) 등의 연구에 따르면, 메타인지는 “내가 무엇을 알고 무엇을 모르는지”를 파악하고, 학습 전략을 조정하는 능력입니다. 이는 연습으로 능력을 향상시킬 수 있는데, 자기 점검 루틴을 갖추는 게 유용합니다. 가령, 새로운 라이브러리를 학습한 뒤, “이 라이브러리를 언제, 왜 쓰는지?”, “이해가 덜 된 부분은 어디인지?”를 적어보세요. 머리 속에서만 생각하지 말고 종이에 적어보는 것이 낫습니다. 그렇게 적어낸 취약한 부분은 시간 간격을 두고 다시 인출 연습하는 식으로 학습 전략을 수정합니다.
(2) 지연된 피드백
자기 점검과 학습 전략 조정하는 데 있어서 피드백은 학습 방향을 보정하는 데 필수적이지요. 피드백은 적시에(timely) 이뤄지는 것이 중요한데, 이 경우엔 지연된 피드백(delayed feedback)이 필요합니다. 짧게는 하루, 되도록이면 며칠이나 일주일 정도 간격으로 다시 보고, 스스로 리뷰한 다음 동료에게 코드 리뷰를 받는 등 피드백을 받아보세요. 이 지연된 피드백은 기억을 재활성화하고 장기 기억에 유리한 통합을 촉진합니다.
5. 성장 마인드셋(Growth Mindset)과 의도적 연습(Deliberate Practice)
캐롤 드웩(Carol S. Dweck)의 성장 마인드셋 개념과 앤절라 더크워스(Angela Duckworth)의 '그릿(Grit)' 연구, 그리고 칼 에릭슨(K. Anders Ericsson)의 의도적 연습 연구는 개발자로서 장기적으로 높은 숙련도를 달성하는 데 필수적입니다.
제가 입문자에게 종종 하는 얘기 중 하나는 오류 메시지를 부정적으로 받아들이지 말고, 내게 컴퓨터가 주는 피드백이라고 받아들이라는 것입니다. 오류가 난다는 것은 내가 지금 다루는 도구를 만든 개발자의 예측 범위 안에서 우리가 실수했다는 뜻입니다. 뭔가를 시도했더니 오류가 사라지는 게 아니라 새로운 오류가 났다면 어떤 방향으로든 진전이 있다는 뜻입니다. 변화가 발생했으니까요! 그런 시행착오 과정을 거치며 더 깊이 배운다고 여겨보세요.
그러한 성장 마음가짐은 인지적 자극이 커지는 효과를 낳습니다. 그리고 그런 마음가짐을 토대로 점진적으로 난이도를 올려가는 의도적 연습을 하면 인지 자극이 일어나는 정도의 인지 부하가 일어나 더 능숙해지고 기억 강도도 증가합니다.
6. 학습 내용 발표하기
학습한 것을 남에게 설명하거나 설명하는 글을 작성하는 건 의도적 인출 연습과 정교화(elaboration) 효과를 유발합니다(Brown, Roediger & McDaniel, 2014). 학습 잔료를 보지 않고 나만의 언어로 개념을 풀어내면 뇌는 해당 정보를 깊이 가공하고 재구성합니다.
혼자 학습을 하더라도 학습한 것을 사내 문서 공간에 남에게 설명하듯에 작성해보세요. 또는 스터디를 한다면 발표하는 세션을 마련해 조원이 돌아가며 자신이 이해한 것을 자신의 언어로 발표해보세요. 학습한 것을 나열해 기술하는 게 아니라 내 콘텐츠로 내 생각을 주장하고 설명해보세요.
7. 짧은 시한을 두고 기능 구현하기 (타임어택)
바람직한 압박(Desirable Difficulty)은 의도적 연습과도 관련된 것입니다. 예로 일부러 제한시간을 두어 기능을 구현해보는 걸 들 수 있죠. 대개는 문서를 읽고 시간 제한 없이 코드를 작성하며 구현해갑니다. 이를 “30분 안에 이 API 종단점(endpoint)을 구현하겠어”식으로 시간 제한을 두고 작업하는 겁니다. 꼭 제한 시간 안에 해결하지 못하더라도 괜찮습니다. 이런 제한 시간 압박은 노르에피네프린이 촉진되어 뇌가 집중력을 끌어올리는 효과를 촉발합니다. 뽀모도로 타이머도 이것의 일종이지요.
단기적으로는 불편하고 부담스럽지만, 만성 스트레스가 되지 않는 선에서 압박 상황에 스스로를 놓으면 집중력 있게 그리고 더 기억에 남는 연습이 될 것입니다. 그런 단기적 스트레스는 인지적 각성이 강화되어 뇌로 하여금 “이 문제는 중요하다”는 신호로 받기 때문이지요(Ericsson 등(1993)의 의도적 연습(Deliberate Practice) 이론).
의견을 남겨주세요