본문 바로가기
관리자

Bravo My Life/Books

프로그래머의 뇌-펠리너 헤르만스 지음, 차건회 옮김, 제이펍

728x90
반응형

코드인지 실패 원인: 기억의 크기 제한

 

기본 개념

  • 지식의 부족 = Long Term Memory(LTM)의 문제
  • 정보의 부족 = Short Term Memory(STM)의 문제
  • 처리 능력의 부족 = Working Memory(WM)의 문제

LTM과 STM에서 찾아온 정보를 WM에서 조합하고 인지한다.

 

 

LTM을 활용한 차이

더흐로트의 실험 외 다른 사례들에서, 기억을 잘하는 사람들은 LTM을 활용하여 STM을 구성한다. 예를 들어 체스 고급자는 체스판의 말들이 놓인 위치를 기억할 때, 시실리언 오프닝이라는 체스의 정석 포맷에서 각 말들이 얼마나 이동했는지를 분석한다. 이러면 LTM에 저장된 원래 위치에 더해 이동한 위치가 STM을 활용하여 표시되기 때문에 체스 초급자들이 단순히 STM만 이용하여 말의 위치를 기억할 때보다 유리하다. 체스 규칙과 상관없이 완전히 무작위로 말들을 섞어놓으면 초급자와 고급자간 기억력의 차이는 없다. 프로그래밍도 익숙한 언어와 코드를 기반으로 할 때 훨씬 더 잘 인식되고 기억된다.

 

STM은 4-6개 단어 수준이다.

 

코드에서는 디자인 패턴이 체스의 오프닝과 같은 역할을 한다. 한 실험에 따르면 익숙한 패턴으로 짜진 코드를 수정하는데 걸리는 시간이 유의미하게 줄어들었다.

 

 

주석문

단위적으로 생각하는 청킹(chunking)에 유리한 방식은 고수준의 주석문을 다는 것이다. '주어진 이진 트리를 중위 순회'는 도움이 될 수 있으나, 'i++ 다음에 i를 1만큼 증가' 라는 주석은 오히려 청킹 작업에 부담이 된다.

 

 

영상 기억 공간(iconic memory)

사람들에게 한 줄에 4개씩 3줄로 적혀있는 알파벳을 0.05초만 보여주고 일부를 기억하는지 물어봐도 75% 확률로 무작위 열이나 행의 글자를 기억한다. 이것은 STM의 용량보다 많다. STM에서 처리 전, 감각적인 기억에 의해 일단 영상 기억 공간에 저장된다.

 

 


 

문법 빠르게 배우기

 

정보를 효율적으로 저장하는 방법

짧은 기간에 많은 학습을 통해 저장하는 것보다, 적은 학습이더라도 꾸준히 장기간에 걸쳐하는 학습이 장기 기억에 유리하다.

 

 

 

기억 인출 강도 높이기

인출 강도는 반복적 학습으로 기억이 저장되는 저장 강도와는 다른 개념이다. 어떤 기억을 떠올리려고 애쓰는 것만으로도 기억을 인출하는 강도가 강해진다. 문법을 떠올릴려고 노력하는 인출을 의도적으로 행하지 않고 인터넷 검색에만 의존하다보면 뇌는 인출의 필요성을 못 느껴서 인출 강도가 떨어진다. 인출 강도가 낮으면 외우는 대신 찾아보려고 하는 악순환이 이어진다.

 

 

다른 정보와 연결되어있을 때 기억하기 쉽다

A. 5, 12, 91, 54, 102

B. 1, 3, 63, 127, 15, 31

 

둘 중 더 기억하기 쉬운 정보는 B이다. 이진수에서 1씩만 빼면 된다.

 

 


 

코드를 깊이있게 이해하기

 

변수 역할

코드의 내용에 대해 추론할 때 중심적인 역할은 변수가 한다. 적절한 변수명은 표식(beacon)으로 사용될 수 있고, 코드를 깊이 이해하는데 도움이 될 수 있다.

 

이스턴 핀란드 대학교의 요르마 샤야니에미(Jorma Sajaniemi) 교수는 다음 11개 역할로 대부분의 변수를 설명할 수 있다고 설명한다.

 

  • 고정값(fixed value): 초기화를 통해 할당된 후 변하지 않는 값
  • 스테퍼(stepper): 루프를 실행하며 단계적으로 변하는 값
  • 플래그(flag): 무엇인가 발생했거나 어떤 경우에 해당하는지를 나타내는 변수. is_set, is_available 등이 있다.
  • 워커(walker): 스테퍼와 유사하게 자료구조를 순회하는데 사용. 다만, 스택이나 트리 같은 구조를 순회하며 미리 정해지지 않은 값을 가진다. 루프가 순회하면서 워커의 값이 달라질 수 있다. linked list에 새로운 값을 추가할 위치를 찾거나, 이진 트리에서 사용되는 검색 인덱스가 대표적인 예이다.
  • 최근값 보유자(most recent holder): 가장 최근에 변경된 값을 갖는 변수. 가령 한 줄씩 읽어들일 때 line=file.readline()에서 line이 이에 해당할 수 있다.
  • 목적값 보유자(most wanted holder): 찾고자 하는 값 혹은 발견된 값 중에서 찾고자하는 조건에 부합하는 값을 갖는 변수. 최소값, 최대값, 어떤 조건을 만족하는 첫 번째 값 등이 대표적인 예이다.
  • 모집자(gatherer): 데이터를 모으거나 어떤 연산을 수행하여 얻은 값. sum=0, for문을 돌려 sum을 재할당할 때 sum 값이 모집자의 역할을 한다.
  • 컨테이너(container): 값을 추가하거나 삭제할 수 있는 자료구조. 리스트, 배열, 스택, 트리 등에 대한 변수가 컨테이너다.
  • 추적자(follower): 이전 값 혹은 다음 값을 저장하기 위해 만드는 변수. 포인터나 이진 트리에서 이전에 방문한 원소의 인덱스가 이에 해당한다.
  • 조직자(organizer): 변수의 값을 변환한 결과가 되는 변수. 예를 들어 주어진 리스트를 정렬한 결과를 따로 들고 있는 변수를 만들어둬야할 때, 그 결과 리스트가 조직자가 된다.
  • 임시(temporary): 잠시만 사용하기 위한 변수

 

코드를 잘 읽는 방법

프로그래밍은 수학, 과학 능력이 기본이 된다고 이해하는 경우도 있다. 물론 이런 능력들이 프로그래밍을 하는데 도움을 주는 것은 맞지만, 프로그래밍에 가장 큰 영향을 미치는 능력은 언어 능력인 것으로 연구되었다. fMRI, 뇌전도(ElectroEncephaloGram) 장치를 이용해서 실험을 해본 결과이다. 따라서 텍스트를 잘 이해하는 능력을 함양하면 코드를 읽는데 도움이 될 것임을 알 수 있다. 텍스트를 이해하는데 활용할 수 있는 대표적인 전략은 다음과 같다.

 

  • 활성화: 관련된 것들을 적극적으로 생각해서 이미 가지고 있는 지식을 활성화하는 것
  • 모니터링: 텍스트를 읽으면서 자신이 이해한 것, 이해하지 못한 것을 관찰하고 기록하는 것
  • 중요도 결정: 텍스트에서 어느 부분이 중요한지 결정하는 것
  • 추론: 텍스트에서 명시적으로 주어지지 않은 사실을 유추하는 것
  • 시각화: 깊이있는 이해를 위해 텍스트에 대한 도표를 만드는 것
  • 질문: 텍스트에 대해 질문하는 것
  • 요약: 텍스트를 짧게 요약하는 것

 


 

실수하지 않는 방법

 

 

지식의 전이에 대한 오해

보통 체스는 논리적인 추론 기술, 기억력과 일반 지능을 높여줄 것이라고 믿는다. 하지만 많은 연구에서 체스가 다른 영역의 일을 하는데 별로 도움이 되지 않는다는 것을 입증했다. 체스에 대한 이런 사실은 프로그래밍에도 해당된다. 프로그래밍을 배움으로써 논리적인 추론에 대한 기술을 얻거나 일반적인 지능을 증가시킬 것이라고 생각한다. 그러나 프로그래밍의 효과를 연구한 몇몇 연구를 보면 거의 효고ㅘ가 없다는 것을 보여준다.

728x90
반응형