코드를 신속하게 읽는데 어려움을 느끼는 이유는 '생소'하기 때문이다. 생소한 코드는 장기기억이 아닌 단기기억에 기억되는데, 이런 단기기억공간을 두고 STM(Short-Term Memory)이라 부른다.
STM은 용량에 제한이 있다.
코드에 혼란을 느끼는 이유(2)
코드에 혼란을 느끼는 이유(1) 코드를 보다보면 혼란에 빠질 때가 있다. 개발자가 코드를 보며 혼란에 빠지는 경우는 3가지이다. 1. 지식의 부족 2. 정보의 부족 3. 처리능력의 부족 지식의 부족 2 2
lordofkangs.tistory.com
( STM의 자세한 내용은 위 포스팅 참고바랍니다. )
우리가 생소한 코드를 볼 때, 단기로 기억할 수 있는 데이터의 양과 시간은 정해져있다. 컴퓨터도 단기기억장치인 RAM의 용량에 따라 컴퓨터의 처리속도가 달라진다. 램 8GB보다 랩 16GB가 훨씬 빠른 것처럼 말이다.
그렇다면 인간의 RAM인 STM의 성능을 높히려면 어떻게 해야할까?
바로, 청크(Chunk)를 사용하면 된다.
청크(Chunk)
청크(Chunk)란 한 개의 묶여진 정보를 의미한다. 청크를 어떤 방식으로 묶느냐에 따라 코드를 기억하는 용량과 속도가 빨라진다.
1. 장기기억공간(LTM)과 연계하여 묶기
5초간 두 문장을 외워보자.
1 . frse dfik ekwd
2. cat loves cake
1번과 2번의 문장 길이는 얼추비슷하지만 1번은 외워지지 않는 반면 2번은 한번에 외워진다. 무엇이 다른걸까? 1번의 경우, 각 알파벳이 청크단위로 묶이지 않아 12개 알파벳을 모두 외워야 한다. 하지만 2번은 cat, loves, cake 이렇게 3가지 청크(Chunk)로 묶여져서 한번에 기억된다.
이처럼 청크를 사용하면 처음보는 문장도 한번에 신속하게 기억된다.
청크로 묶으려면 배경지식이 필요하다. cat, loves, cake라는 단어를 모르면 2번도 1번과 다르지 않다. 고로, STM에 많은 단어를 기억하려면 그만큼 많은 정보가 LTM(Long-Term Memory, 장기기억)에 저장되어야 한다. 이것이 전문가가 초보자보다 코드를 더 잘 기억하는 이유다.
2. 영상기억공간과 연계하여 묶기
정보로 데이터를 기억하는 것보다 더 많은 데이터를 기억하는 방법이 있다. 바로, 시각적효과를 이용하는 것이다. 단순나열보다 구조가 있는 데이터가 더 많이 기억된다. 인간이 영상기억공간을 갖기 때문이다. 무언가를 오래 보다가 눈을 감으면 잔상이 그려진다. 이건 뇌가 아닌 어느 저장공간에 시각적잔상이 남아있음을 의미한다.
1. P S W M S R T K T H V E
2.
P S W M
S R T K
T H V E
1번보다는 2번이 더 오래 기억된다. 1번과 2번 모두 청크로 묶을만한 LTM은 없지만 2번은 시각적효과가 있기에 영상기억공간에 오래 남는다. 그러므로 LTM이 아닌 영상기억공간에 자리잡은 구조와 연계하여 데이터를 기억하면 STM의 한계를 넘는 용량의 데이터를 기억할 수 있다.
이를 코드와 연관지으면, 중첩구조, 들여쓰기 등등이 있다.
단순히 코드문법만 보는게 아니라 코드의 구조도 함께 신경써서 읽는다면 오래 기억에 남는 코드 읽기가 가능해진다.
3. 대상이 아닌 방식으로 묶기
FOR WHILE TRUE IS REAL THEN FALSE BITS IF END ELSE
위 단어 나열을 기억한 후 최대만 많은 단어를 작성하라고 했을 때, '무엇'을 외울 것인가 보다 '어떻게' 외울 것인가에 초점을 맞추면 더 많은 단어를 기억 할 수 있다.
위 단어를 아래와 같이 외워보자.
FOR WHILE / TRUE FALSE / IF ELSE THEN END / BITS IS REAL
주어진 단어를 그대로 외우기 보다는 LTM을 활용하여 일정한 순서를 부여하면 단어나열을 더욱 쉽고 많이 외울 수 있다.
코드에서 청크란?
코드도 청크로 묶어 읽는다면 신속한 읽기가 가능해진다.
1) 디자인 패턴 사용
디자인패턴에 대한 지식(LTM)이 있다면 청킹 능력이 향상된다. 패턴에 대한 지식과 구조로 인해, LTM과 영상기억공간을 활용하여 쉽게 기억되니 그만큼 읽는 속도도 빨라진다.
2) 주석문 쓰기
# 입력받기
N = int(input())
sortArr = []
for i in range(N) :
sortArr.append(int(input()))
# 버블정렬 시작
for i in range(N) :
changeCount = 0
for j in range(N-1,i,-1) :
if sortArr[j] < sortArr[j-1] :
sortArr[j], sortArr[j-1] = sortArr[j-1], sortArr[j]
changeCount += 1
if changeCount == 0 :
break
# 출력
for i in range(len(sortArr)) :
print(sortArr[i])
위 코드를 보면, 주석문으로 총 세 구간으로 나뉘어진다.
#입력받기, #버블정렬 시작, # 출력
이렇게 주석으로 통해, 코드를 구간별로 청킹해주면 개발자는 더 빠른 속도로 코드를 이해할 수 있다.
3) 표식남기기
변수명, 주석, 메소드명에 코드와 관련있는 이름을 넣는 것이다.
def print_in_order(root):
if root :
print_in_order(root.left)
print(root.val)
print_in_order(root.right)
print란 단어로 개발자는 해당 함수가 '출력'하는 함수임을 알 수 있다. root, left, right라는 이름으로 개발자가 자료구조가 이진트리임을 알 수 있다. 이처럼 코드와 관련있는 이름으로 표식을 남기면 개발자는 그곳에서 힌트를 얻어 더욱 빠르게 코드를 이해할 수 있다.
참고자료
프로그래머의 뇌:훌륭한 프로그래머가 알아야 할 인지과학의 모든 것
COUPANG
www.coupang.com
'개발교양도서 > 프로그래머의뇌' 카테고리의 다른 글
코드 청킹 연습하기(1) (0) | 2023.04.06 |
---|---|
코드 청킹 연습 (0) | 2023.04.05 |
코드 표식 파악 연습 (0) | 2023.04.05 |
코드에 혼란을 느끼는 이유(2) (0) | 2023.03.08 |
코드에 혼란을 느끼는 이유(1) (0) | 2023.03.03 |