인지과학에 기반한 프로그래머의 기본기 훈련

숲사람·2022년 7월 15일
6

개발생각

목록 보기
1/6
post-thumbnail

목차
1. 기본기 훈련에 대하여
2. 멘타트 훈련
3. 프로그래밍 기본기 훈련에 대한 인지과학적 고려사항들
4. 결론 및 요약

1. 기본기 훈련에 대하여


축구선수의 일상을 채우는것은 화려하고 짜릿한 경기가 아니다. 그들의 삶의 대부분은 단순하고, 지루하며 고통이 동반되는 반복적인 기초 훈련으로 채워진다. 아무리 많은 이론지식과 전술 이해도로 무장하더라도, 필드에서의 기본기가 뒷받침되지 않은 선수는 실제 경기에서 강할 수 없다. 실전에서 실력은 결국 지식이 아니라 몸을 쓰는 플레이로 나타나기 때문이다. 만약 어떤 선수가 경기중 골대 코 앞에서 패스를 받아 인사이드로 슛을 했는데, 후지산 대폭발 슛(공이 허공으로 날라감)을 했다고 하자. 이것은 그 선수가 기본기 훈련이 안되어있다는 뜻이기도 하다. 패스를 받아 인사이드로 슛을할때는 다리와 지면이 수직이 유지 되어야하는데, 이것이 실전에서 무리없이 수행되기 위해서는 평소에 무수히 많은 훈련이 필요하기 때문이다. 실전은 훈련상황과 다르게 인지적인 부담이 추가 된다. 그럴때는 머리로 생각하고 몸을 움직이는게 아니라 인지력을 최대한 사용하지 않고 몸이 자동반응하도록 만들어야한다. 그래야 실수가 줄어들고, 인지력이라는 한정된 자원을 더 필요한곳 중요한곳에 투입할 수 있다. 기본기 훈련의 목적은 실전에서 이런 인지부담을 최소로 만드는데 있다. 손흥민이 어릴때부터 지금까지 하루 슛팅 1000개를 꾸준히 연습하는 이유. 피아니스트 임윤찬이 하루 연습시간이 그냥 쓰러질때 까지라고 밝힌 이유이다.

세계 최고 수준을 가진 전문가도 이렇게 아직도 훈련과 연습을 하는데, 지구 어느 변방의 한 구석에 있는 프로그래머인 나는 지금까지 어떤 훈련을 해왔는지 생각해보면 참 부끄럽다. 사실 나도 예전부터 고민해보긴 했다. 소프트웨어 개발이라는 직업을 가진 사람으로써 더 좋은 코더, 프로그래머가 되기 위해, 그리고 더 나아가 좋은 스프트웨어 엔지니어가 되기 위해 할 수 있는 기본기 훈련은 없을까? 하지만 여러가지 조건들이 프로그래머에겐 기본기 훈련이 존재하지 않는다고 결론짓게 만들었다. 코딩을 시작 하기위해서는 PC 필요하다. 컴파일러나 인터프리터가 필요하다. 등등 시작을 위해 넘어야할 문턱이, 그냥 악기 집어서 바로 스케일(음계)연습하는것과는 너무 다르게 복잡하다. 그리고 그걸 넘어서 프로그래머에게 훈련을 위한 단순하고 반복적인 작업이 과연 존재할까? 코드를 작성하는 일은 너무 복잡하기 때문이다. 하지만 나는 최근 반년간 코딩 테스트 준비와 알고리즘 문제풀이 연습을 하면서 그런생각들이 많이 바뀌게 되었다. 운동이나 악기 연주와 다르게 훈련의 요소를 설계하는데에 어려움이 있는것은 사실이지만 그렇다고 훈련프로그램을 만들지 못할 것도 없다는걸 깨달았다.

먼저 기본기 훈련이 무엇인지 정의 내려보자. 어떤 태스크가 기본기 훈련이 될 수 있을까? 내가 생각하는 그 조건은 다음과 같다.

  • 단순하고 명료할것.
  • 의미있는 최소단위일것.
  • 반복 훈련이 가능할것.
  • 그 태스크를 시작하기 까지의 비용이 낮을것.

이런 조건이 충족이 되어야만 훈련이 수월할 것이고, 어느정도 훈련이 되면 기계적으로 튀어나올수 있게 될것이다. 프로그래머 각자 자신에 맞는 기본훈련 프로그램을 갖는다면 얼마나 좋을까? 이 글은 개개인 별로 그 프로그램을 어떻게 하면 만들수 있을지, 인지과학적 측면에서 고려해야할 사항은 무엇인지에 대한 고찰이다. 마지막으로 기본기 훈련은 축구 전술같은 이론 지식이나, 도메인 지식을 쌓는것과는 그 결이 다르다. CS지식, 도메인 지식과 같은 이론에 대한 내용은 이 글에서 다루지 않는다. 프로그래머가 결국 하는일은 코딩이다. 소프트웨어 엔지니어링 관점에서 소프트웨어 엔지니어에게는 코딩 그 이상의 역할과 능력이 요구되긴 한다. 하지만 실전에서 몸을 쓰는일, 즉 코딩이 가장 중요한 역량인것은 자명하다. 나는 프로그래머의 기본기 훈련 대상은 이론 지식보다는 순수한 코딩스킬과 관련있는 것이라고 결론지었다(그렇다고 이론과 도메인 지식이 뒷받침 없이 코딩만 잘하면 된다는뜻은 당연히 아니다. 중요한 것은 밸런스다). 모든 일은 가장 단순한것들의 조합이다. 어떤한 기술을 익히고 단련하기 위해서는, 그것을 더욱 단순한 동작으로 쪼개고 반복적으로 연마해야 일정한 수준에 닿을 수 있다. 우리는 그렇게 훈련된 사람을 전문가라고 부른다.

2. 멘타트 훈련

코딩테스트용 문제풀이 훈련이 프로그래머의 기본기 훈련이 될 수 있는 이유.


나는 거의 10년차 소프트웨어 개발자다. 돌이켜보면 그동안 코딩 스킬보다는 거의 도메인 지식을 쌓는데만 열중했던것 같다. 내가 속한 분야(시스템프로그래밍/리눅스커널/임베디드)가 그러한 지식을 많이 요구하는것도 사실이지만, 결국 프로그래머는 코드로 소통하는데 정작 코딩스킬을 향상시키는데에는 상대적으로 소홀했던것 같다. 그리고 현업의 문제와 꽤 동떨어져 있는 코딩테스트용 문제를 잘푸는 능력이 그리 중요하지 않다고 생각 하기도 했었다(공채 출신에, 연차가 수년이상인 개발자들은 공감할수있지 않을까싶다?). 그런채로 시간이 흘러 세상은 코딩테스트의 중요성이 점차 커지는데, 내 소프트웨어 개발자로써 자신감은 점차 하락하는것을 느꼈다. 이대로 놔두었다가는 커리어에 문제가 생길것같은 공포감도 생겼다. 안되겠다 싶어 무작정 Leetcode 문제를 풀기시작했다. 처음에 해시테이블 카테고리의 easy 문제를 내리 50여개를 풀었다. 과거에 어떤 폰스크리닝에서 해시테이블에한 질문에 제대로 답변하지 못했던적이 있었는데, 여전히 실행하지않고 그것에 별관심을 두고있지않은 내모습에 항상 일종의 부채의식을 가지고 있었기 때문이다. 이렇게 나름 꾸준히, 가능하면 매일 문제를 풀었다. 이 루틴의 이름을 SF소설 DUNE에 나오는 멘타트 훈련이라고 지었다. 시작한지 7개월 정도 지났는데 이 경험이 그동안의 코딩테스트에 대한 입장과 생각들을 180도 바꾸었다. 코딩테스트 문제풀이 연습은 프로그래머로써 기초적 자질을 향상시키는데 도움이 많이 되는 훌륭한 도구인것 같다. 물론 국내에서 점차 고시화 되는 있는 코딩테스트 열풍, 채용시 개발자의 역량을 오직 코딩테스트 pass/fail 로만 스크리닝 하는게 과연 적절한지에 대해서는 아직 문제의식을 가지고 있다. 이에 대한 생각은 기회가 되면 따로 정리하고 싶다. (그리고 부끄럽지만 내 멘타트 훈련 기록을 공유해본다.)

온라인 저지사이트를 통한 코딩테스트 훈련은 운동선수나 악기 연주자의 훈련처럼 기본기 훈련의 조건들을 어느정도 갖추고 있다. 일단 코딩을 시작하기 위한 비용이 상대적으로 작다. 컴퓨터에 IDE나 에디터, 컴파일러, 인터프리터, 런타임 실행환경 따위가 필요하지 않다. 그냥 브라우저 하나만 있으면 된다. 문제가 유형별로있어서 비슷한 문제를 반복해서 훈련할 수 있다. 작성하는 코드의 단위가 상대적으로 작다. Leetcode같은 경우는 입출력에 대한 코드는 따로 작성할 필요없이 핵심적인 로직 함수만 구현하게 되어있다. 보다 기본 훈련의 단위에 집중할 수 있는 구조다. 그리고 온라인 저지사이트는 주어지는 입출력 예제도 손쉽게 테스트해볼 수 있다. 그리고 풀어봤던 문제들을 반복적으로 훈련해볼 수 있다. 기량을 향상시키고 싶은 유형별로 난이도별로 정렬해서 반복훈련할 수 있다. 이 과정에서 코딩 스킬의 기초라고 할수 있는 능력들이 향상된다. 그리고 코딩을 위한 문턱이라는게 굳이 온라인 사이트를 이용하지 않더라도 개인이 환경을 어떻게 셋팅하느냐에 따라서 충분히 낮출 수 있는 여지가 많다. 코딩테스트 훈련이 주는 장점은 어떤 지식 보다는 어떤 감각들이 향상되는것 같다.

  • 어떤 논리적인 구조를 코드로 구현하는 감각
  • 사용하는 프로그래밍 언어의 문법과 표현에 대한 감각
  • 소스코드의 구조와 유형에 대한 감각
  • 시간/공간 복잡도를 고려하는 코딩 감각
  • 효율적 자료구조를 설계하고 적절한 알고리즘을 선택할 수 있는 감각
  • 타인의 코드를 읽는 감각
  • 기본적인 문제 해결 스킬과 사고방식에 대한 감각

이런 감각들을 키우는것은 현업에서도 도움이 안될래야 안될수가 없는 능력들이다. 실제 현업에서 프로그램을 설계하거나 만들때 설계측면에서 도움이 많이되는게 확실히 느껴진다. 점차 시간복잡도 측면, 그리고 효율적 자료구조 측면을 훈련한대로 습관적으로 고려하며 코딩하게 되는것 같다. 코딩테스트 문제에서 작성했던 소스코드들, 자료구조/알고리즘 등을 현업에서 직접 사용하는 경우는 거의없거나 많지 않다. 하지만 그 훈련 과정에서 개선된 감각들이 현업의 프로그램을 작성하거나 설계할때 사용되는게 느껴진다.

코딩테스트 문제 풀이 훈련은 프로그래머의 가장 강력한 기본기 훈련중 하나가 될수 있다고 생각한다. 코딩테스트용 문제풀이 훈련은 태스크를 단순하게 쪼개고 반복적으로 수행할 수 있다는 측면에서 충분히 축구선수나 연주자들의 기본 훈련이 될 수 있다. 알고리즘이란 결국 반복문과 분기문의 조합으로 구성되어있다. 서로다른 문제 해결을 위한 알고리즘이라도 종종 그 패턴이 유사할때가 있다. 이 유사한 패턴을 여러번 반복해서 작성하다보면 충분히 익힌 어떤 구조들은 인지부하가 거의 걸리지 않은 채로 작성이 가능하다. 나의 경우 최근에 링크드 리스트의 맨 마지막 노드로 이동하는 코드를 꽤 많이 작성해봐서 그런지 크게 고민하지 않고 거의 자동으로 튀어나온다(for (node = head; node->next != NULL; node = node->next);).

추가로 코딩테스트 연습은 심지어 커뮤니케이션과 협업 능력을 향상시킬 수도 있다. 적어도 실리콘밸리 기업의 채용문화에서 코딩테스트는 문제를 주고 단순하게 풀었는지/못풀었는지로 평가하지 않는다. 가장 첫번째 테크니컬 면접부터 면접관이 함께하고, 코딩은 채점 사이트가아닌 화이트보드에 한다. 면접관은 문제를 주고 인터뷰이는 그 문제의 추가 고려사항 제약조건, 그리고 문제가 정확히 무엇을 의미하는지 질문을통해 파악해 나간다. 그리고 이런저런 솔루션과 시간/공간 복잡도에 대해 면접관과 토의하고 더 나은 해결책을 함께 모색한다. 그리고 솔루션이 결정되면 그제서야 화이트보드에 코딩을 시작한다. 어떠한 사고과정을 거쳐서 코드를 작성하고 있는지 끊임없이 생각을 이야기해가며 코딩해야한다. 막히는것이 있다면 이야기하고 필요하다면 힌트도 받는다. 이런 일련의 과정들을 보면 코딩테스트 면접이라기 보다는 일종의 토론 면접에 더 가깝다. 면접관은 인터뷰이를 심판하기 위해 그자리에 있지 않으며 인터뷰이가 더 문제를 잘 해결할수 있도록 도움을 주는 역할을 수행한다. 따라서 코딩테스트는 단순하게 문제를 잘푸는 능력 하나만 보는게 절대 아니다. 약 1시간의 시간동안 코딩스킬, 커뮤니케이션 능력, 설계, 협업능력 등을 파악하는 시간인것이다. 만약 이런 면접을 염두하고 코딩테스트 훈련을한다면 자연스럽게 개발자의 커뮤니케이션과 협업에 대한 감각도 향상시킬 수 있을것이다. (나는 개발자 역량중 커뮤니케이션 능력을 대단히 중요하다고 생각하는 편인데, 이에대한 생각은 다른글을 통해 정리할 예정이다.)

3. 프로그래밍 기본기 훈련에 대한 인지과학적 고려사항들


지금까지 내 멘타트 훈련은 체계적이지 않고 즉흥적이었던것 같다. 훈련 방식을 선택할때 과학적 근거에 기반하기 보다는 직감에 기반했다. 현대의 운동선수들은 모두 과학적 훈련에 기반한 프로그램을 수행하는데, 더 과학적으로 훈련해야할것같은 코딩 훈련은 오히려 그렇지 못했다. 그러다 최근 <프로그래머의 뇌>라는 훌륭한 책을 만났다. 인지부하라는 관점에서 뇌 과학적 이론, 학습전략, 프로그래밍에 대한 통찰이 담겨있다. 이 책을 한 줄로 요약하자면 "인지부하를 방지하는(최소로 하는) 프로그래밍 및 훈련방법" 이다. 감사하게도 여기서 내 코딩훈련에 응용해볼수있는 수많은 요소를 찾았다. 그리고 그동안의 내 훈련방식의 문제들이 파악되었으며, 개선시킬수 있는 포인드들을 알게 되었다. 이전에 내가 하던 멘타트 훈련 방식은 그냥 문제를 풀고 블로그에 정리해서 올리고 또 다른문제로 넘어가는 식이었다. 이 방식은 여러가지 문제가 있었다.

프로그래밍 훈련의 최종 목적은 실전에서 인지부하가 최소로 걸리도록 만드는데 있다. 인지부하란 무엇일까, 인지부하를 어떻게하면 관리할 수 있을까? 우리 뇌의 기억은 어떠한 구조로 이루어져 있다. 인지부하는 그 기억의 메커니즘을 비효율적으로 사용할때 발생한다. 우선 기억의 구조와 메커니즘에 대해 알아보자. 책에서 소개하는 내용을 정리해보면 다음과 같다. 기억의 메커니즘은 세종류가 있는데 코딩시 이 영역들이 서로다르게 작용한다. 첫번째는 STM(단기 기억, Short Term Memory)이고 두번째는 LTM(장기 기억, Long Term Memory), 세번째는 작업 기억(Working Memory)이다. 코드 분석을 할때 이 기억의 메커니즘이 어떻게 동작하는지 예를 들어보자. 먼저 코드를 읽을때 해당언어의 문법에 대한 지식이 없다면 해석할수가 없다. 문법에 대한 처리는 LTM(장기기억)이 담당한다. 주로 지식적으로 익히고 기억하는 대상들이다. 그 뒤에 코드 내에서 존재하는 변수명, 키워드, 자료구조 등은 STM에 일시적으로 저장된다. 이때 대부분의 사람은 STM에 저장될 수 있는 최대 갯수가 2~6개라고 한다. 그리고 실제 사고 과정은 작업기억 영역에서 일어난다. STM이 정보를 기억 하는것이라면, 작업기억 공간의 역할은 정보를 처리하는 것이다. 생각이나, 아이디어, 해결, 이해 등은 작업기억공간에서 일어난다. 가령 코드를 읽으면서 뇌에서 컴파일하고 실행하는 과정(트레이싱)등은 작업기억 공간에서 일어난다. STM과 마찬가지로, 이 작업기억 공간도 크기가 한정되어있다(한번에 2~6개). 그래서 이것이 가득차게 되면 인지부하가 발생한다. 작업 기억공간이 가득차게 되면 정보를 처리하는데 상당한 어려움을 겪게 된다. 그러니까 평상시에 잘풀수있는 문제도 시험장이나 면접장에서 면접관 앞에서 풀려고 한다면, 여러가지 상황적 조건들이 STM과 작업기억 공간을 차지할것이고, 결국 인지부하를 더 크게 느끼게 되는것이다. 따라서 코딩 테스트의 훈련 목적은 인지적인 자원(STM과 작업기억)을 최대한 사용하지 않고 코딩할 수 있도록 만드는 방식이 되어야할 것이다. 그래야 실전에서 인지부하를 최소화 할 수 있다.

인지부하가 최소화되는 코딩을 위해서는 사전에 알고있는 지식(LTM에 저장되어있는)도 중요하다. LTM에 저장된 지식이 많을수록, 그리고 그것을 적절하게 잘 인출할 수록, STM을 적게 사용할 수 있다. 가령 위에서 살펴보았던 링크드리스트의 마지막노드로 이동하는 코드를 생각해보자. 만약 이 코드의 구조가 익숙치 않다면 처음부터 인지적인 과정, 생각을 통해 떠올리며 코드를 작성해야한다. 노드를 next로 이동하는 방법, 반복문의 종료조건, 반복문의 형식, 변수이름 등을 고심하게 될 것이다. 그러면 STM이 3개 이상 차지되어 버리고 작업기억 공간도 더 사용하게 될 것이다. 하지만 이 내용이 한꺼번에 LTM에 기록되어 있었다면 STM은 딱 하나만 차지되고, 작업기억 공간도 더 적게 사용될 것이다. 사용 가능한 인지적 자원을 절약한것이다. 이렇게 기억을 단위로 묶는것은 청킹(chunking)이라고 책에서 소개한다. 코딩을할때 인지부담을 줄일수 있는 핵심적인 개념이자 전략중 하나다. 따라서 코딩시 최대한 LTM을 잘 활용해 코드의 구조를 청킹하고, STM 사용을 줄이는것이 인지부하는 줄 일 수 있는 효과적인 방법이라고 할 수 있다.

책은 프로그래밍 실력은 인지능력이 아닌 경험과 기억에 달려있다고 설명한다. 그리고 그 근거를 여러 연구와 실험으로 소개한다. 나는 이 부분이 다소 충격적이었는데, 그동안 내 코딩훈련에 대한 접근을 근본부터 수정할 필요성을 느꼈기 때문이다. 지금까지 나는 문제를 많이 풀다 보면 인지능력이 향상되어 새로운 문제를 만났을때 더 잘 풀수 있게 될것이라고 기대했다. 그리고 그렇게 수개월동안 문제를 풀었다. 하지만 책은 그렇지 않다고 설명한다. 인지능력은 의외로 관련이 없으며 과거의 경험. 즉 유사한 유형의 문제를 풀거나 유사한 구조의 코드를 작성해봤던/읽어봤던 경험이 있고, 그것을 잘 기억하고 있는지에 따라서 새로운 문제를 만났을때 더 잘 풀수 있다는 것이다. 두뇌는 익숙한 문제를 해결하는것이 더 쉽기 때문이다. 새로운 문제 라는것도 따지고 보면 패턴이 있고 어떤 카테고리로 분류될 수가 있으니, 내 직관도 이 책의 주장에 쉽게 설득당할 수 있었다. 전문가는 문제를 해결할때 인지력이 아니라 순간적인 기억력에 크게 의존하는것으로 조사되었다고 한다. 익숙한 문제를 해결하는게 아니라 재현하는 것이다. 따라서 전략을 수정해야한다. 무작정 더 많은 문제를 푸는게 아니라, 더 많은 문제를 기억하는 것으로. 그리고 인지과정을 개선하는 훈련이 아니라, 어떻게 LTM에 잘 저장하고 추후에 인출할 수 있을지 그 방법을 모색 해야한다. 그리고 코딩테스트 문제 풀이를 떠나서 일반적인 프로그래밍을 잘 하기위해서도 인지능력을 키우는것 보다, 코딩의 경험을 더 많이 하거나 그것들을 잘 기억하는게 더 중요할 것이다. 코딩테스트를 이런 관점에서 새롭정의 해보자. 코딩테스트는 문제를 해결하기 위해 필요한 전략들을 LTM에서 인출하기 위한 싸움이다. 따라서 문제를 열심히 풀어보는것으로 그치는게 아니라, 사후에 반드시 다른 사람들의 풀이와 해결방법들을 추가로 살펴보아야 한다. 이것은 선택이 아닌 필수다.

앞에서 기억인출이라는 용어를 썼는데, 대단히 중요한 개념이기에 소개하려한다. 기억을 저장하는 것 보다 더 중요한것은 기억을 인출하는 것이다. 책에 따르면 기억을 저장하는것과 인출하는것은 다르다. 뇌 과학이 완전히 밝혀내지는 못했지만 기억은 뇌에 한번 기록되면 영원히 저장된다고 하는 주장도 있다고 한다. 따라서 우리가 훈련하고 개진해야하는것은 LTM에 기억을 저장하는 능력보다, 추후에 적절한 기억을 더 잘 꺼내는 능력일것이다. 갑자기 개인적인 고백이지만, 나는 뇌의 능력중에 기억력이 최대 약점이라고 생각한다. 그리고 이 책을 읽고 기억중에서 내가 개선해야할 구체적인 대상을 확실히 파악할 수 있었다. 나는 기억을 인출하는데 다소 어려움을 느끼는것같다. 그 이유는 어릴때부터 훈련이 안되었기 때문인것 같다. 무언가 배우고 이해하고 기억에 집어 넣는것은 정말 좋아했지만, 그것을 나중에 떠올리는 것을 상대적으로 싫어했다. 그래서 시험이라는 제도를 경멸했는데 아마 내면의 방어기제가 작동한것은 아닐까 싶다. 시험을 보는것은 어떻게 보면 기억을 인출하는 훈련과 같다. 이 책을 읽고 외우고 시험치는게 그렇게 나쁜게 아니었다는 생각이 들었다. 이런 내용을 고등학교때 알았었다면 내 인생의 궤적이 조금 달라지지 않았을까? ;) 어쨋든, 이 기억인출 문제는 어떻게 해결할 수 있을까? 어떻게 하면 기억인출을 강화할 수 있을까? 책에서 소개된 방법은 간단하다. 무언가를 떠올리려고 노력하는 것만으로도 기억인출을 강화할 수 있다고 한다! 따라서 어제 풀어본 문제와 해결방식을 아침에 한번 떠올려보는 것이다. 자주 잊어버려 매번 검색했던 내용을 구글에 치기전에 잠시 떠올려보는 것이다. 실제 기억이 떠오르지 않더라도 이렇게 노력을 기울이는것만으로도 기억 인출이 강화된다고 한다! 이 사실을 배운뒤부터 아침마다 어제풀어본 문제들을 떠올려보기 시작했다. 확실히 도움이 되는것이 느껴진다. 하지만 이것만으로는 부족할 것같아, 특정 주기로 기억을 리마인트 하던지, 여러가지 방안을 궁리해봐야 할것같다.

마지막으로 LTM을 강화하는 방법을 살펴보자. LTM은 두가지 종류가 있다. 암시적 기억과 명시적 기억이다. 암시적 기억은 자전거를 타는것과 같이 운동능력이나 의식하지 않고 발휘될 수 있는 기술에 대한 기억이다. 명시적 기억은 우리가 경험이나 학습을 통해 명시적으로 알게된 기억을 말한다. 책에서는 각각의 기억을 개선할 수 있는 전략들이 소개된다. 이 두가지 기억을 강화할 수 있다면 프로그래밍과 문제해결시 발생하는 인지부하를 더욱 줄일 수 있을것이다. 암시적 기억훈련은 자동화 훈련이다. 이를 코딩에 적용해보면 알고리즘이나 자료구조 혹은 코드의 구조나 패턴을 단순하게 쪼개서, 익힐 때까지 반복해서 작성하는것이다. 말그대로 100번 코드를 작성하는 방식인데, 의외로 효과가 있다고 한다. 암시적 기억 강화는 꾸준한 연습을 통해 만들어진다. 이것이 장착이 되면 기억에 의존하고 추론을 전혀 사용하지 않고도 문제를 해결할 수 있다. STM과 작업기억 공간을 아낄 수 있는것이다. 두번째로 명시적기억 강화를 위한 두가지 전략이 있다. 하나는 플래시카드를 사용하는것이다. 나머지 하나는 타인의 코드와 해설에서 배우는 것이다. 이는 위에서 설명했던 내용이다. 문제를 어떻게 풀어야할지 모르는데 3~4시간씩 붙들고 있는것보다. 풀이를 읽고 해설을 통해서 문제를 이해하는게 더 효과적인 방법일 수 있다. 요약하면 암시적 기억 강화를 위해서는 자동화 훈련, 명시적 기억 강화를 위해서는 플래시카드 혹은 타인의 코드와 해설을 연구하는것이다. 마지막으로 무언가를 외울때 중요한 사항은 간격을 길게 두고 반복하는것이다. 이는 연구를 통해 증명된 사실이다. 암기횟수가 같다면 짧은간격보다 긴 간격으로 오랫동안 암기하는것이 더 LTM에 효과적으로 저장된다고 한다. 그리고 그 주기는 초기에는 짧게 시간이 지날수록 길게 설계하면 더 효과적이다.

강화 대상단순복잡
암시적 기억자동화 훈련(단순화한 대상을 반복 훈련)
명시적 기억플래시 카드(인출 강도 훈련)풀이된 예제 (타인의 코드, 해설을 의도적으로 연구)

4. 결론 및 요약


  • 프로그래머도 다른 전문 직업인 처럼 기본기 훈련이 필요하다.
  • 기본기 훈련의 목적은 실전에서 인지부하를 최소로 하는데 있다.
  • 개인에 맞게 프로그램화한 코딩테스트 문제풀이 연습은, 프로그래머의 기초역량 향상을 위한 기본기 훈련으로 꽤 적합하다.
  • 코딩테스트 문제풀이 연습을 프로그램화 할때 인지과학에 기반한 전략들을 적극적으로 활용할 필요가 있다.
  • 프로그래밍 문제 해결 능력은 인지능력이 아니라 기억과 경험의 양과, 기억을 인출할수 있는 능력에 달려있다.
  • 기억의 메커니즘은 STM/LTM/작업기억이 있는데, 인지부하를 최소화 하기위해서는, 최대한 LTM을 사용(청킹 활용)하고, STM과 작업기억을 최소로 사용해야한다.
  • 코딩을 위한 LTM을 강화하기 위해서 자동화훈련(암시적 기억 강화) 그리고 플래시 카드와 풀이,해설 연구(명시적 기억 강화)를 활용할 수 있다.

프로그래밍 훈련에 대해 대단히 장황하게 떠들었는데, 사실은 오해할까봐 두렵다. 나는 코딩테스트에 있어서 만큼 내 실력 대학생 시절부터 꾸준히 문제를 풀었던 신입 개발자의 털끝도 못미칠거라고 생각한다. 그래도 다행인것은 나는 이 일을 좋아한다. 지금 보다 더 잘하고 싶다. 그런 동기가 있기 때문에 올바른 훈련의 방향성을 가지고 오랜기간 꾸준히 훈련하다보면 언젠가는 나도 잘하게 될 날이 올거라 기대한다. 마지막으로 최종 목표는 내게 맞는 그리고 필요한 훈련 프로그램을 만드는것이다. 아직은 구상에 머물러 있지만 한가지 아이디어는 각가의 프로그래밍 요소(자료구조,알고리즘,코드구조)의 내가 숙지해야할 기본적인 동작들을 미리 리스트업해 놓고 그것을 계속 반복해서 작성해보는 연습을 하는것이다. 일종의 자동화 훈련이다. 이것을 돕는 간단한 프로그램을 만들어도 좋을것같다. 급 생각 해본 예시 이지만 배열의 인덱싱을 훈련하고 싶다면 아래와 같이 단순화된 기본 동작들을 미리 만들어 놓고. 실제 코드로 구현하는 훈련을 하는것이다. 이를 주기적으로 반복 훈련하여 자동화가 되면, 실전에서 코딩시 비슷한 구조를 작성해야할때 인지적 부담이 적게 들것이다.

0에서 배열의 끝까지 출력
1 에서 10 출력
10 에서 1 출력
0 에서 10 출력
10 에서 0 출력
0 에서 배열의 마지막 직전까지 출력
3-8 출력
짝수출력
홀수출력
3의 배수 출력
1,3,2,4... 순서로 출력
등등등...

References


profile
기록 & 정리 아카이브용

2개의 댓글

comment-user-thumbnail
2023년 8월 9일

너무 공감 되면서도 스스로를 돌아보게 해주는 글입니다. 책부터 사러 갑니다.

1개의 답글