본문 바로가기
살아가는 이야기/책 이야기

프로그래머의 뇌 - 펠리너 헤르만스

by JR2 2023. 5. 14.

읽은 기간 : 22.10.22 토 (아직 덜 읽음)

만족도 : ⭐⭐⭐⭐

 

이 책은 프로그래머가 코드를 읽을 때 뇌에서 발생하는 현상들을 설명해놓은 책이다.

예시 코드가 많아서 그것을 읽고 있는 내 뇌의 작동원리를 잘 설명해준다.

특히 Long Term Memory, Short Term Memory가 코드를 읽을 때 어떻게 적용되는지 잘 나타나있다.

 

코드가 초래하는 세 가지 종류의 혼란

누군가의 코드를 읽을 때 여러가지의 혼란이 발생한다.

그 혼란은 대부분 이 세 가지 종류에 속해있다.

  1. 지식의 부족
  2. 정보의 부족
  3. 처리 능력의 부족

 

1. 지식의 부족

2 2 2 2 2 T n

이 코드를 살펴보자. 도대체 어떤 동작을 하는 것인지 이해가 되지 않는다.

이는 APL로 된 코드이고 숫자 n을 2진수로 변경하는 코드이다.

APL을 모르기 때문에 코드를 읽을 수 없다.

즉, 지식의 부족으로 인한 혼란이다.

 

2. 정보의 부족

public class BinaryCalculator {
	public static void main(Integer n) {
		System.out.println(Integer.toBinaryString(n));
	}
}

이 프로그램이 어떤 일을 하는지 메서드 이름으로 유추할 수는 있겠지만, 이 메서드가 구체적으로 어떤 일을 수행하는지 이해하려면 메서드의 내부를 더 살펴봐야한다. 따라서 이 코드에서 발생하는 혼란의 원인은 정보가 부족하다는 점이다.

 

3. 처리 능력의 부족

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$

이러한 코드는 변수에 임시로 저장되는 값을 모두 기억하고 있어야 하는데, 우리의 기억력이 이를 따라가지 못한다. 따라서 코드 옆에 결과를 적어놓거나 하는 방법을 써야한다.

 

신속한 코드 분석

연구에 의하면 프로그래머의 시간 중 거의 60%를 코드를 작성하는데 쓰는게 아니라 이해하는데 사용한다고 한다. 따라서 정확도를 유지하면서 코드를 빨리 이해하도록 향상한다면 프로그래밍 기술이 크게 개선되는 셈이다.

코드를 읽을 때에는 LTM과 STM을 동시에 이용한다.

예를들어 삽입정렬을 구현한 코드가 있다고 해보자.

이를 완전히 기억해보라고 했을 때, LTM의 도움을 받아 보다 쉽게 기억할 수 있을 것이다.

 

그런데 이번에는 동작을 알 수 없는 코드를 전부 기억해보라고 했을 때, STM만을 이용해야하기 때문에 앞선 예시보다 어려울 것이다.

게다가 STM에는 정해진 용량이 있다. 사람마다 다르겠지만 연구에 의하면 2~6개 사이로 1바이트가 채 되지 않는다고 한다. 게다가 STM은 30초를 넘지 못한다. 그런데 인간이 이렇게 많은 일들을 한다니 기적이 아닐까?

 

청크로 기억의 크기 제한을 극복하기

더흐로트의 실험이 있었다. 전문가와 평균적인 사람들의 두 그룹으로 나누고 체스 말의 위치를 복기하도록 했다. 이 실험에서 전문가 그룹이 더 잘 기억했다.

하지만 체스의 말을 경기 중 일어날 수 있는 위치가 아닌 완전히 무작위로 배치했을 때에는 전문가 그룹과 일반인의 복기 능력이 큰 차이가 있지 않았다.

전문가들이 무의식적으로 쓴 방법이 바로 청크이다. 전문가들을 말의 위치들을 자신의 과거 경험과 연결 시키는 등 하나의 청크로 묶어서 인식하였다.

 

어려우니까 하나의 예시를 더 보자.

이 문장을 5초간 본 후 복기해보자.

얼마나 잘 기억하였는가?

abk mrtpi gbar

 

이 문장은 어떠한가?

위의 문장보다는 훨씬 외우기 쉬울 것이다. 하지만 이것도 5초안에 외우기는 어렵다.

cat loves cake

 

이번 문장은 어떤가?

앞의 두 문장보다 훨씬 쉬울 것이다.

여러개의 문자를 한 단위로 묶어서 ‘cat’, ‘loves’, ‘cake’로 기억했기 때문이다.

앞의 두 예제에서는 기억해야할 항목이 STM의 한도를 넘었다.

 

전문가는 초보자보다 코드를 더 잘 기억한다

앞선 맥락과 마찬가지로 전문가는 본인의 LTM을 활용해 코드를 하나의 chunk 단위로 묶는 능력이 있다.

누군가 나보다 코드를 읽는 능력이 뛰어나다면, 타고난 재능이라고 생각하기 보다는 나보다 코드를 짜거나 읽은 경험이 더 많은 거라고 생각하면 될 것 같다.

 

청크로 묶을 수 있는 코드를 작성하는 방법

어떤 것이 읽기 좋은 코드인지는 이제 대충 알게되었다.

그럼 이걸 어떻게 쉽게 작성할 수 있을까?

가장 대표적인 것이 디자인 패턴이다.

디자인 패턴을 이용하면 암묵적으로 약속된 무언가를 통해 기억해야할 chunk의 수를 줄일 수 있다.

 

적절한 주석으로 코드를 청킹

연구 결과에 따르면 ‘이 함수는 주어진 이진 트리를 중위 순회하여 프린트한다’ 같은 고수준 주석문은 코드를 청크 단위로 쪼개는데 도움이 된다. 반면에 ‘i++; // i를 1만큼 증가’ 같은 저수준 주석문은 오히려 청킹 작업에 부담이 된다.

 

문법을 꼭 외울 필요가 있을까?

자주 쓰는 문법을 제외하고는 필요할 때 검색해서 찾아보는 경우가 많다.

하지만 어떤 이는 아주 자주쓰는 반복문 조차 외우지 않고 찾아보는 경우가 많다.

나또한 자주 찾다보니 익숙해져서 외우게 되었고, 외우려는 노력을 따로 하지는 않았다.

꼭 외워야할까?

이 질문에 대한 정답은 없다.

하지만 코딩을 하다가 모르는 문법을 찾아보려 인터넷에 들어갔다가, 메일을 확인하거나 기사를 보는 등 쓸데없는 시간을 낭비한 적이 있을 것이다.

연구 결과에 따르면 10%의 프로그래머 만이 인터넷 검색 후 1분 안에 다시 집중을 하였다고 한다.

나머지 사람은 15분은 그대로 날렸다고 한다.

즉, 문법을 외우고 있으면 이런 경우를 줄일 수 있어 도움이 된다.

게다가 코드를 청킹하는 능력이 더욱 강화된다고 한다.

외우고 있는 코드는 LTM에 속하는데, 이는 앞서 얘기했듯이 청킹 능력을 훨씬 강화할 수 있다.

 

문법이나 코드를 어떻게 외울까?

문법을 외우고 있으면 어떤 이점이 생기는지 이제 알겠다.

그럼 자주 쓰는 코드나 문법을 어떻게 쉽게 외울 수 있을까?

단기간에 때려넣는 부트캠프식 암기는 오래가지 못한다. (LTM이 되지 못한다)

책상에 카드 같은 것들을 붙혀서 암기하는 식으로 해야한다.

내가 정리해놓은 자주 쓰는 코드 사이트를 만들어도 좋을 것 같다.

 

LTM에 저장하는 가장 좋은 방법은 정기적으로 꾸준히

책에서는 어떤 사례를 통해 증명을 하는 과정을 상세히 설명해준다.

결론은 장기간에 걸쳐서 정기적으로 꾸준히 반복했을 때 LTM에 가장 잘 저장이 되었다. 영어 단어도 매일 새로운 단어를 외우기 보다, 꾸준히 복습하는 방식으로 외워도 좋을 것 같다.

댓글