코드 잘짜기 위해서 뇌 과학까지 알아야하다니!!
평소 이 책에 대해서 극찬하는 글을 자주봤는데 기대했던 것 이상으로 좋은 책이었다. 평소에 올바른 코드란 무엇인지에 대해서 정말 많은 고민을 했는데 이 책을 접한건 큰 행운이라 생각된다. 읽기 전엔 위와 같은 생각이었지만 읽고 난 후에는 역시 지식은 넓을 수록 좋다는 것을 다시금 깨달았다.
기억 방식
이 책은 들어가며 간단한 코드 예제를 보여주며 예제 코드를 왜 읽기 힘든지, 왜 이해하기 어려운지를 설명하며 시작한다. 책 내용을 따르면 우리 뇌는 다음과 같은 세 가지 방식으로 기억한다고 한다.
- 장기 기억 공간 (Long term memory, LTM)
- 단기 기억 공간 (Short term memory, STM)
- 작업 기억 공간 (Working Memory)
위 세 기억 방식들에 대한 설명 이후로 이 책은 기억 방식을 통해 프로그래머가 어떻게 코드를 읽고 이해하는지, 그리고 뇌 과학에 기반하여 어떻게 코드를 작성하는 것이 좋은지 가이드해준다.
장기 기억 공간
먼저 장기 기억 공간(LTM)은 기억하는 내용을 반영구적으로 보관하는 곳이다. 즉, 지식을 저장하는 공간으로 이 공간이 코드를 작성할 때 어떤 작용을 하는지 알아보기 위해 다음 예제 코드를 살펴보자.
2 2 2 2 2 ⊤ n
과연 프로그래밍 언어가 맞는지 의심스러운 위 예제 코드는 APL이라는 언어로 구현된 이진수 변환 프로그램이다. 간단히 언어에 대해 소개하자면 APL은 과거에 수학적인 계산을 위해 만들어진 오늘 날에는 거의 사용되지 않는 언어다.
책 내용에 따르면 위 코드에서 T
는 수의 값을 다른 진법의 수로 변환해주는 함수라고 한다. 정말로 동작하는지 확인하고 싶다면 https://tryapl.org/에서 테스트를 할 수 있다.
수정 전 문장 "책 내용에 따르면 위 코드에서 T는 수의 값을 다른 진 법의 수로 변환해주는 함수라고 한다. 정말로 동작하는지 확인해보고 싶어서 https://tryapl.org/에서 테스트를 해봤는데 동작이 안되어서 진짜인지는 모르겠다."
kangmingu93님이 댓글로 사용 방법을 공유해주셨습니다. 사이트 상단에서T
모양으로 보이는 아이콘을 사용하여 가능합니다. n 위치엔 변환할 수를 넣으면 됩니다.
ex) 2 2 2 2 2 ⊤ 10 ➡️ 0 1 0 1 0
아무튼 필자도 그랬지만 예제 코드를 보고나서 많은 혼란을 느꼈을 것이다. 일단 우리가 알던 프로그래밍 방식과 전혀 다르고 각 숫자와 문자가 무엇을 하는지 전혀 모르기 때문이다. 따라서 우리가 이 코드를 보고 혼란을 느끼는 이유는 지식의 부족 때문이라 할 수 있다. 지식이 없다는 것은 장기 기억 공간(LTM)에서 해당 지식이 없다는 것을 말한다.
따라서 코드를 해석할 때 필요한 지식은 장기 기억 공간에서 꺼내오게 된다. 지식이 부족하다면 우리는 코드를 해석하는데 어려움을 느끼게 된다.
단기 기억 공간
이어서 단기 기억 공간(STM)은 정보를 일시적으로 저장하는 공간이다. 말 그대로 정보를 일시적으로 저장하기 때문에 다른 정보를 찾는 과정을 거치거나 시간이 지나면 잊게 된다. 다음 예제 코드를 살펴보자.
public class BinaryCalculator {
public static void main(Integer n) {
System.out.println(Integer.toBinaryString(n));
}
}
두 번째 예제 코드도 이진수 변환 프로그램인데, 이미 Java를 잘 아는 개발자라면 쉽게 느껴질 것이고 Java를 잘 모르더라도 대충 어디서 이진수 변환이 이루어지는지 알 수 있을 것이다.
이는 우리가 Binary, Calculator, to Binary 등에 대한 단어를 알고있고 공통된 프로그래밍 언어 문법을 지식으로 알고 있고 이를 LTM에서 꺼내오기 때문이다. 보통 이런 지식을 제외하고 로직을 이해할 때는 STM에서 정보를 저장하고 꺼내오는 과정을 수행하게 된다. 예를 들어, main
함수의 첫 줄을 읽을 때 우리는 입력받는 변수 n
이 있고 이 변수가 정수형이라는 것을 알 수 있다. 이 함수가 어떤 일을 수행할지는 모르지만 일단 n
은 계속 기억해둔 상태로 코드를 읽게된다. 다음 라인을 살펴보면 toBinaryString
메서드가 n
을 받아 실행됨을 알게되고 이를 다시 기억하게 된다.
이 예제가 혼란스러울 수 있는 이유는 toBinaryString
이 내부적으로 무엇을 수행하는지 알지 못한다는 점이다. 즉, 혼란의 원인은 정보의 부족이라 할 수 있다.
...라고 하지만 책에 나온 이 예제는 조금 아쉬운게 Integer.toBinaryString
은 무엇을 하는지 충분히 구체적인 이름이기 때문에 정보가 부족하다는 느낌이 안든다. 그래서 필자가 새로운 예제를 만들어봤는데 한 번 살펴보자.
import java.time.*;
public class Sample {
public static void main() {
String year = "2022";
String month = "08";
String day = "05";
LocalDate localDate = LocalDate.parse(year + "-" + month + "-" + day);
System.out.println(localDate);
}
}
위 코드는 Java의 LocalDate
를 사용하여 날짜를 출력하는 예제이다. 여기서 필자는 LocalDate
의 parse
메서드가 이해하기 혼란스러운 메서드라고 생각하는데 값을 어떻게 넣어야 하는지, 내부적으로 어떻게 수행되는지 메서드 이름만 봐서는 알 수 없기 때문에다. 물론 String을 DateTime으로 변환하는 규칙은 어느정도 공통적으로 정해진 규칙이 있지만 이런 규칙을 잘모르는 개발자라면 충분히 헷갈릴 수 있다고 생각한다.
그래서 결국 위 코드에서 parse
라는 메서드가 어떤 것을 수행하는지, 수행하기 위해 어떤 데이터가 필요한지 정보가 부족하다 볼 수 있다. 이를 알기 위해선 별도로 LocalDate.parse
메서드 내부를 살펴보거나 문서를 읽어봐야 한다. 이러한 정보가 부족하다면 우리는 코드를 해석하는데 어려움을 느끼게 된다.
작업 기억 공간
작업 기억 공간은 우리가 사고할 때 사용하는 영역으로 LTM과 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$
위 예제도 결국 이진수 변환 프로그램인데 BASIC 역시 오래된 언어기 때문에 지식적인 혼란이 발생할 수 있다. 그렇지만 APL처럼 너무 다른 정도는 아니기 때문에 변수명이나 연산자, 예약어 등을 통해 어떻게 동작하는지 유추할 수는 있다.
어려운 코드는 아니지만 위에서 봤던 Java 예제보다는 해석하는데 시간이 오래 걸렸을 것이다. 이는 머릿속에서 모든 과정을 처리하기 어렵기 때문으로 코드가 실행되는 것을 한눈에 파악할 수 없기 때문이다.
이런 일이 발생하는 이유는 처리 능력의 부족 때문이다. 변수에 임시로 저장되는 값을 전부 기억하며 각 단계를 처리한다면 모를까 필자처럼 평범한 사람은 메모하지 않는다면 위 로직이 어떤 일을 수행하는지 한눈에 알기 힘들 것이다.
인지 과정
책의 내용을 따르면 우리는 정보를 다음과 같이 처리하고 인지한다고 한다.
정보는 우리가 필요한 것들만 적당히 필터링되어 STM에 저장된다. 그리고 이렇게 저장된 정보는 작업 기억 공간에서 사용되고 필요하다면 LTM에서 지식을 가져와서 합쳐지게 된다. 위 도식은 책 전반에 걸쳐서 설명할 때 사용되는 도식으로 각 영역이 어떻게 동작되는지 쉽게 알 수 있다.
그래서 결국 이 책은 위에서 설명한 LTM, STM, 작업 기억 공간과 이 인지 과정을 핵심으로 우리가 코드를 어떻게 분석하고 작성해야 하는지, 어떻게 공부하고 훈련해야 하는지를 전반적으로 설명한다. 좋은 내용이 많기 때문에 꼭 읽어보는 것을 추천한다.