프로그래머의 뇌

앞으로 십 수년간은 개발 공부를 해야 할 처지에 놓여버렸다. 오랫동안 반복 할 일이라면 효율적으로 처리해야 하지 않겠는가? 이 책은 학습법에 대한 고민을 타파해보기 위해 읽었다. 공부 잘 하는 사람들이 자신의 노하우를 전수해주는 책들은 별 도움이 못 될 것 같았다. 그보다는 원론적으로 접근해보고 싶었다. 학습을 할 때 내 머릿속에서는 어떤 일이 발생할까. 왜 항상 내 두뇌는 다른사람들의 것 보다 조금 모질라 보일까. 이런 것들이 학습법 개선에 있어서의 출발점이라 믿는다. 그리고 지반을 튼튼하게 다져주는 기본기 연마는 언제나 옳다.
저자는 이 책에 나오는 내용을 알기 전까지만 해도 복잡한 논문, 낯선 코드를 충분히 소화하지 못하는 자신에게 답답함을 느꼈다고 말한다. 하지만 이제는 '뇌가 큰 인지 부하를 겪고 있군'이라고 담담하게 얘기하고, 유연하게 대처할 수 있게 되었다고 한다. 나 또한 저자와 똑같이 답답함을 느꼈고, 이제는 자존감을 깎는 자책 없이 의연하게 대처할 수 있을 것 같다. 위와 같은 태도 하나만 얻어감으로도 이 책을 읽은 건 굉장한 수확이 아닐까.
코드 잘 읽기
1.코딩 중 겪는 혼란에 대한 (인지적) 이해
낯선 코드를 읽을 때 겪는 혼란의 세 가지 유형
지식의 부족
2 2 2 2 2 T n
-
위 코드는 APL 언어로 쓰였다.
-
T에 대한
지식knowledge이 없는 개발자는 위 코드가 혼란스럽게 느껴진다.
정보의 부족
public class BinaryCalculator{
public static void main(Integer n){
System.out.println(Integer.toBinaryString(n));
}} -
자바로 쓰인 위 코드는 BinaryCalculator라는 클래스명과 toBinaryString이라는 메서드명을 통해 어느정도 기능을 유추할 수 있다.
-
그러나 해당 메서드의 정확한 내부 동작에 대한
정보Information를 획득하기 전까지는 정확히 어떤 동작이 이루어질 지 단언할 수 없다.
처리 능력의 부족
LET N2 = ABS (INT(N))
LET B$ = ""
FOR N1 = N2 TO 0 STEP 0
LET N2 = INT(N1 / 2)
LET B$ = STR$ (N1 - N2 * 2) + B$
LET N1 = N2
NEXT N1
PRINT B$ -
베이직으로 쓰인 위 코드를 이해하기 위해서는 계속해서 변경되는 변수의 값을 추적하며 코드를 읽어나가야 한다.
-
처리 능력processing power에 부하가 걸리면 혼란이 발생한다.
인간의 인지 과정
-
정보는
감각 기억 공간sensory memory(일종의 입출력 버퍼)을 거쳐서 STM에 다다른다. -
STM(Short Term Memory)정보를 기억. -
Working Memory(작업 기억 공간)정보를 처리. -
LTM(Long Term Memory)
정보 -> 감각 기억 공간 -> STM -> Working memeory<->LTM
-
LTM기억하는 내용을 반영구적으로 저장하는 곳이다. HDD와 유사하다. -
STM은 정보 수집 중 일시적으로 정보를 저장하는 곳이다. 새로이 유입되는 다른 정보에 의해 기존 정보가 빈번하게 잊혀진다. (캐시 or 메인 메모리) -
STM에 저장된 정보는 30초라는 아주 짧은 시간 유지되었다가 이후 LTM에 저장되거나 잊힌다. -
Working memory는 사고할 때 사용되는 영역이다. 머릿속에서 코드를 컴파일하고 실행한다 (트레이싱). 프로세서와 유사하다. -
Working memory, STM에는 2개에서 6개 사이의 정보밖에 저장하지 못한다.
혼란과 관련된 인지 과정
- 지식의 부족 = LTM의 문제
- 정보의 부족 = STM의 문제
- 처리 능력의 부족 = Working Memory의 문제
2.코드를 읽을 때 두뇌에서는 무슨 일이 일어나는가?
-
연구에 의하면 개발자는 업무 중 60%의 시간을 코드 '작성'이 아닌 '이해'에 사용한다.
-
정보를 기억할 때 STM은 크기에 대한 제약을 극복하기 위해 LTM과 협업한다.
청크chunk : 단위로 묶는 것의 위력
-
체스 말의 위치를 체스 전문가들이 일반인들보다 더 잘 기억해낼 수 있는 이유는 체스 전문가들의 STM 용량이 더 크기 때문이 아니다.
-
LTM에서 시실리언 오프닝이라는 청크를 가져오면 하나의 STM 기억 공간으로도 많은 정보를 처리할 수 있게된다.
-
관련된 정보를 묶어서 효율적으로 관리하는 것이 청크다.
두뇌가 뛰어난 사람이 코드나 체스의 위치를 잘 기억한다기 보다는 LTM에 관련 지식이 많이 쌓여 있어서 정보를 청크 단위로 묶을 줄 아는 사람이 잘 기억한다.
청크로 묶을 수 있는 코드 작성법
-
디자인 패턴을 활용할 것.
-
코드에 대한 사전 정보를 제공하는 고수준 주석문을 활용할 것.
-
코드 내 표식beacon을 활용할 것. (유용한 정보를 제공하는 적절한 변수/함수 네이밍)
3.기억되는 지식과 잊혀지는 지식
업무 중단이 미치는 나쁜 영향
- 연구에 따르면 코딩 도중 작업이 중단되면 다시 그 업무로 돌아가는 데 약 15분이 소요된다.
플래시카드를 이용한 학습법
-
앞 면에는 문제를 정의하고 뒷 면에 정답을 적기.
-
앞 면에는 프롬프트, 정답을 기억해 낼 수 있도록 요청하는 질문, 단어 혹은 문법을 적어서 정답 도출을 유도한다.
효율적인 기억법
-
무엇인가 읽고 들어서 STM에 저장된 정보는 이후 LTM으로 옮겨진다.
-
LTM의 정보는 한 시간 이내에 50%가 휘발되고, 이틀 후에는 25%만이 잔여한다.
-
두뇌의 기억은 폴더 HDD의 폴더 구조처럼 계층화 된 것이 아니고, 여러 정보들이 얽히고 얽힌 네트워크 구조와 유사하다.
-
망각 곡선에 대한 연구는 반복 학습 시 어느 정도의 간격을 두는 게 가장 효과적인지에 대한 가이드를 제공한다.
-
50개의 단어를 2주,4주,6주,8주 간격으로 13회 혹은 26회씩 반복하여 학습한 후 1년,2년,3년, 5년 후 테스트하는 실험 결과 8주의 간격을 두고 26회 반복한 경우가 효율이 제일 좋았다.
-
즉, 오랫동안 학습한 만큼 더 오래 기억한다. 더 많은 시간을 학습해야 한다는 것이 아니라 더 오랜 간격을 두고 학습해야 함을 의미한다.
기억을 강화하는 두 가지 테크닉, 인출과 정교화
-
인출retrieval: 적극적으로 무언가를 기억해보려고 애쓰는 것. -
정교화elaboration: 기존 기억에 새로운 지식을 적극적으로 연결시키는 것.
^822cd8 -
무언가를 능동적으로 기억하려고 하는 행위가 기억을 강화한다.
-
LTM에 저장된 정보를 잘 인출해오는 것이 중요하다.
스키마타
-
우리 두뇌에서 기억은 다른 기억과 사실에 연관되는 일종의 네트워크 형태다.
-
스키마schema혹은스키마타schemata: 사고나 생각이 서로 관련되어 조직된 방식 -
새 정보를 학습할 때 정보는 LTM에 저장되기 전 먼저 스키마의 형태로 만들어진다.
-
이미 존재하고 있는 스키마에 잘 맞는 형태의 정보일수록 더 쉽게 융화되고 기억된다.
인지 부하
-
Working memory는 2개 ~ 6개까지만 기억할 수 있다. 한번에 처리할 수 있는 이 허용치를 넘어서면
인지 부하cognitive load, 혹은과부하 overload가 발생한다. -
작업 중 인지 부하를 줄이기 위해 각고의 노력을 쏟아야 한다. 리팩터링을 통해 코드를 읽기 쉽게 만들고, 각종 기록 혹은 상태표나 그래프에 의존하여 작업해야 한다.
