[후기] 프로그래머의 뇌

Sangwoo, Yang (DAN)
11 min readFeb 26, 2024

--

사람의 뇌는 LTM, STM, 작업공간으로 나뉘어져있다

여기 3개의 단어가 있습니다.

위에 있는 단어를 5초 동안 보고, 얼마나 기억 할 수 있나요?

그러면 이 문자는요?

이 문자는 모두 기억 할 수 있나요?

비교적 앞에 단어들보다는 뒤로 갈수록 더 많이, 더 쉽게 기억 할 수 있었을 것입니다.

‘당연하지 내가 한국인인데?’ 라고 생각이 들었다면 당신은 LTM을 잘 활용하고 있을 것입니다.

‘단어별로 생각하면 금방 외우는걸?’ 라는 생각이 들었다면 당신은 청크을 잘 활용하고 있을 것입니다.

그럼 LTM이란 무엇이고 청크란 무엇일까요?

LTM, STM, 작업공간

LTM은 long-term memory를 뜻합니다. 흔히 말하는 지식이죠, 장기 기억공간은 기억하는 내용을 반영구적으로 저장하는 곳입니다.

만약 앞선 내용을 미국으로 유학을 간 중국인 대학원생이라면, LTM을 활용해 가장 앞에 문자가 가장 쉬웠을 것입니다.

STM은 short-term memory를 뜻합니다. 정보의 부족이죠, 정보를 수집 할때 우리의 뇌는 단기 기억 장소에 일시적으로 저장하지만, 다른 정보를 찾는 과정에서 이미 수집해놓은 정보의 일부를 잊어버리기도 합니다, 마치 뒤 늦게본 confection 까지는 기억이 나다가 Feline이 기억이 나지 않는 것도 STM과 연관 됩니다.

마지막으로 작업공간(working memory)는 많은 정보를 처리할때 사용이 됩니다.

그렇다면 프로그래밍에서는 어떨까요?

아래 코드는 APL 코드 입니다.

2 2 2 2 2 T n

어떤 코드인지 아시겠나요? 숫자 n을 이진수로 표현하는 코드 입니다. 만약 T가 무엇인지 몰랐다면, 2가 왜 저렇게 정렬 되어있는지 몰랐다면 알 수 없는 코드 일 것입니다. 이것이 LTM의 문제 입니다.

아래 코드는 JAVA 코드 입니다

public class BinaryCalculator {
public static void mian(Interger n)
System.out.printLn(Interger.toBinaryString(n))
}
}

개발자라면 JAVA 코드를 어느정도는 이해하고 읽을 수 있을 겁니다. 이것도 숫자 n을 이진수로 변환하는 코드이죠, 하지만 toBinaryString이 어떻게 동작하는지 모른다면, 정확히 동작 원리를 이해하지 못 할 수도 있을 겁니다.

여기서 잠깐! 혹시 이상한 점은 찾지 못하셨나요, 함수 이름을 의도적으로 mian으로 바꾸어 놓았는데, 읽은때는 자연스럽게 main으로 읽지 않으셨나요..? STM은 정보를 해석하는 데 사용하지만, 정보의 파악이 끝나면 금방 잊어버릴 수 있습니다 ( 자신도 모르게요! )

이번 코드는 베이직에서의 이진수 표현입니다.

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$

이 코드 또한 N을 이진수로 표현하는 코드이지만 변수명을 일부러 잘 사용하지 않고 일관되지 않은 변수명을 사용하다 보니, 읽긴 쉬워도 머리로 암산하기에는 혼란스러울수도 있습니다.

즉 코드를 읽는게 너무 복잡해지면 작업 공간에서 문제가 발생해 처리 능력이 떨어진다는 것이죠.

프로그래밍 업무와 관련한 인지 과정

고객으로 부터 버그 리포트를 받은 당신은 해당 버그를 청각 시각을 통해 두뇌로 입력됩니다. 버그가 발생한 몇 개월 전의 코드를 보면서 STM을 사용해 코드를 읽을것이고, 동시에 몇 개월 전에 구현한 내용을 LTM에서 가져 올 것입니다.

그리고 LTM에 저장된 유사한 버그의 해결법이나 개인적인 기억 두가지가 작업 공간에 들어오게 되고

당신은 그제서야 비로소 문제에 대해 생각할 수 있게 되는것이죠

하지만 너무 많은 코드가 있다면 어떻게 해야할까요?

여기서 뇌의 청크 능력이 발휘 됩니다.

청크

실제 프로그래머가 일하는 시간중 코드를 읽고 분석하는 일은 생각보다 많습니다. 연구에의하면 프로그래머의 시간중 거의 60%를 코드를 ‘작성’하는것이 아닌 ‘이해’하는데 사용한다 하죠

우리는 다양한 이유로 코드를 이해해야 합니다.

  • 기능 추가
  • 버그 발견
  • 시스템 이해

등등..

만약 코드를 신속하게 이해한다면 그 시간을 아껴 더욱 빠른 개발을 할 수 있을 것입니다.

하지만 생소한 코드를 읽는것은 쉽지 않습니다.

public void execute(int x[]) {
int b = x.length;
for (int v = b/2 - 1; v >= 0; v--;) {
func(x, b, v);
}

for (int l = b-1 ; l > 0 ; l--) {
int temp = x[0];
x[0] = x[l];
x[l] = temp;
func(x, l, 0);
}
}

분명 Java 코드 이지만, 코드를 기억하고 다시 작성하긴 쉽지 않습니다, 앞서 알아봤던 STM의 용량의 한계 때문이죠.

코드에 있는 모든 정보를 STM에 저장하고 처리하는것 물리적으로 불가능합니다, 연구에 의하면 30초정도만 기억이 가능하다 하죠.

심지어 시간 뿐만이 아니라 크기 또한 제약됩니다. 최근 연구에서는 STM의 용량이 2~6개라고 추정하고 있습니다.

그렇다면 이 작은 용량을 극복하기 위해선 어떻게 해야할까요?

체스마스터의 기억력

흔히 체스 마스터와 평범한 체스 플레이어가 있다면, 체스 마스터의 기억력이 더 좋다고 생각 할 수 있습니다.

그렇다면 실제로 체스판에 임의의 말을 배치해놓고, 해당 위치를 기억하게 하면 어떤 결과가 나올까요?

이 실험에서는 역시나 체스 마스터가 훨씬 더 잘 기억했습니다.

하지만 이 실험에 단 하나의 조건만 변경해본다면 어떨까요, 체스판이 체스 규칙과는 전혀 무관하고, 절대 나올수 없는 위치에 체스말들이 있다면요?

즉 이전 실험은 체스게임중 나올 수 있었단 경우의 수였고, 이번 실험은 실제 체스 게임에서는 나올수 없는 경우였죠

실험 결과는 놀랍게도, 체스 마스터와 체스 플레이어 둘 다 기억을 제대로 하지 못했습니다.

그렇다면 왜 체스 마스터가 첫번째 실험에서 더 많이 기억을 할 수 있었을까요? 그것은 바로 ‘청크’를 이용했기 때문입니다,

평범한 체스 플레이어는 말의 위치를 하나씩 기억을 했지만,

체스 마스터는 LTM의 저장되어있는 지식을 많이 활용했습니다. 예를 들어 “현재 체스판이 ‘시실리언 오프닝’에서 나이트가 2칸을 더 움직임”과 같은 식이었습니다.

즉 여러개의 기억을 하나의 청크로 묶음으로서 STM에 기억 공간중 하나만 차지 할 수 있게 만들었기에, 더 많은 말들을 기억 할 수 있었습니다.

프로그래밍에서 청크

프로그래밍에서도 이는 동일 하게 쓰일 수 있습니다. 다음과 같은 방법등을 통해 청크를 만들수 있죠

  • 디자인 패턴 사용
  • 주석문 (고수준 주석문은 청킹에 도움이 되지만, 저수준 주석문은 오히려 부담이 된다, i++를 i는 1만큼 증가하는 코드임, 이라 적는것 처럼)
  • 표식(beacon) 남기기

이러한 방법을 통해 좀 더 쉽게 코드를 이해 할 수 있고, 시간을 줄 일 수 있습니다.

코드를 다 읽었다면, 이제 어떻게 코딩 문제를 더 잘 해결 할 수 있을까요?

코딩 문제 해결을 더 잘하려면

하나의 문제에도 다양한 해결책이 나올 수 있고, 그 해결책에 대해 비교할 때가 있을 것입니다.

예를 들어 한 회사의 모든 고객을 간단한 리스트로 구성할 것인가 아니면 지점의 기본값을 기준으로 트리로 구성해 모델링 할 것인가 등등으로요

이렇게 사람들은 문제를 풀 때 대부분 ‘모델’을 만듭니다, 모델은 실재를 간단하게 표현한것으로, 주된 목적은 문제에 대해 생각하고 해결하는 데 도움을 주기 위한것이죠.

문제를 풀 때 코드의 모델을 명시적으로 사용하는 것은 두 가지 장점이 있습니다.

  1. 모델은 프로그램에 대한 정보를 다른 사람과 공유 할 때 유용하다.
  2. 문제를 풀 때 도움이 된다.

이러한 모델은 LTM이 관련된 기억을 찾는 데 도움이 되기 때문에 문제 해결에 매우 유용합니다.

하지만 모든 모델이 동일하게 유용할까요?

파리 문제

이 그림은 야밤의 공대생 만화에 나와있습니다(https://www.yes24.com/Product/Goods/43757394)

이때 파리의 이동 경로를 모델링하는 것이 맞는 해결책이긴 하나.. 너무 복잡한 계산을 필요로합니다.

히지만 더 쉬운 해결책은 파리의 이동경로가 아닌 파리자체에 집중을 하는것입니다.

파리는 1시간동안 시속 15마일로 날기때문에 총 15마일이동한다는 것이죠

프로그래밍에서도 문제에 대한 여러 가지 다른 표현을 가지고 작업합니다. 어떤 프로그램 언어는 가능한 표현의 개수를 제한하는데 이것은 문제를 푸는 데 도움이 되기도 하고 해가 되기도 합니다.

예를 들어 APL언어는 행렬과 관련한 해결책의 모델링을 위해서는 완벽하지만, 행렬로 표현하지 못하는 문제에서는 사용하기 어려운 듯이요.

그렇다면 두뇌 외부가 아닌 내부에서는요?

두뇌 내부에서는 <정신 모델>을 사용합니다.

정신모델(Mental Model)

정신 모델은 풀어야 할 문제에 대해 추론하기 위해서 사용할 수 있는 작업 기억 공간 내의 추상화입니다.

우리는 컴퓨터와 상호작용할 때 많은 종류의 정신 모델을 만듭니다. 예를 들어 파일 시스템을 생각해보면, 한 폴더 안에 같이 있는 파일들을 생각할 것입니다.

물론 더 깊이 생각해보면 하드 드라이브에 폴더나 파일이 실제로 있는 것은 아니라는 것을 알겠지요

코드를 생각 할 때 역시 정신 모델을 사용합니다. 예를 들어 코드가 특정 라인에 실행되고 있다고 생각하듯이요, 실제로는 그 라인에 대해 생성된 이진 코드인듯이요!

이렇게 컴퓨터가 코드를 실행하는 방법에 대해 추론할 떄 사용하는 모델이 바로 <개념적 기계> 입니다.

개념적 기계(Notional Machine)

정신 모델은 세상의 모든 것의 모델이 될 수 있지만, 개념적 기계는 컴퓨터가 코드를 실행하는 방법에 대해 추론할 때 사용하는 모델입니다.

하지만 개념적 기계는 불완전 할지는 몰라도 컴퓨터가 작동하는 방식을 설명 혹은 추론하는 것이다. 따라서 잘 못되거나 일관되지 않을 수 있는 정신 모델과는 다릅니다.

예를 들어 변수 x가 12라는 값을 가질 때 우리는 값이 저장된 메모리 주소와 이 주소를 변수에 연결하는 포인터 같은 것에는 관심을 두지 않고, x를 어딘가에 존재하는 마치 상자 또는 이름표 같은 개체라고 생각하듯이요.

이러한 개념적 기계는 앞선 예시 처럼 <스키마타>를 적용할 수 있어 프로그래밍에 관해 생각 할 때 일반적으로 효과적인 수단입니다.

만약 ‘변수는 외발자전거와 같아’ 라고 한다면 변수를 이해하는데 그다지 도움이 안될 것입니다.

마무리

앞선 내용을 통해 프로그래밍을 할 때 뇌를 어떤 방식으로 활용하는지에 대해 조금이라도 도움이 되었으면 좋겠습니다.

프로그래밍은 까다로운 인지 활동 중 하나로 간주됩니다. 즉 문제를 추상적으로 해결하는 동시에 프로그램을 작성하는데, 이러한 일은 대부분의 사람이 자연스럽게 가질 수 없는 수준의 주의력을 요구합니다.

그렇다보니 프로그래밍을 하는 동안 일어나는 실수는 수없이 잦습니다.

인지적 문제를 깨닫고, 연습하는 노력을 통해 조금은 더 나은 프로그래머가 되지 않을까..? 라는 생각을 해봅니다. 적어도 두뇌를 통해 코드를 처리하는 방식을 조금은 이해한것 같습니다.

위에 내용은 <프로그래머의 뇌>에 나온 내용을 간단하게만 정리한 글입니다. 더 많은 내용들이 궁금하시다면 제가 책을 빌려드릴 수 있습니다!(선착순)

(꾸준하게 책을 읽게 해준 매일열장 스터디에 감사합니다)

더 볼거리

--

--