티스토리 뷰

이 포스팅은 프로그래머의 뇌를 읽고 작성하였습니다.

정보가 두뇌로 들어오면 STM에 도달하기 전에 감각 기억 공간이라는 영역을 통과합니다. 감각 기억 공간은 컴퓨터에 비유하면 입력장치와 통신하는 입출력 버퍼라고 볼 수 있습니다. 주변 장치로부터 전송된 정보가 입출력 버퍼에 잠시 저장되는 것처럼 감각 공간에도 마찬가지로 시각, 청각, 촉각에 의한 정보가 잠시 저장됩니다. 그리고 각 감각에 대해 각자의 임시 저장공간이 존재합니다. 이 중 프로그래밍과 관련된 감각은 영상 기억 공간입니다.

영상 기억 공간

코드를 읽을 때 눈을 통해 정보가 들어오고 이 정보는 영상 기억 공간에 잠시 저장됩니다.

영상 기억 공간을 간단히 설명하면 어두운 곳에서 폭죽을 흔들면 그 잔상이 남아 글씨를 쓸 수 있는데 이 때 사용되는 기억 공간이 영상 기억 공간입니다. 직전에 본 이미지가 주는 자극을 잠시 저장할 수 있는 공간으로, 책을 볼 때 문장을 읽고 눈을 감아도 페이지의 레이아웃 등이 떠오르는 것 역시 영상 기억 공간 덕분입니다.

영상 기억 공간이 코드를 읽을 때 어떻게 사용될까요? 관련된 실험을 먼저 살펴보면 아래와 같은 3*4 격자로 된 글자를 실험 참여자에게 보여줍니다.

G D N C
R Q W E
K Y S B

참여자에게 위 같은 이미지를 0.05초 동안 보여준 뒤 무작위로 선택한 줄에 어떤 글자가 있었는지 물어보았습니다.

눈의 반응 속도는 0.2초 내외이기 때문에 저렇게 짧은 시간 동안 모든 글자를 읽는 것은 불가능합니다. 하지만 이 실험의 참여자 중 75%는 무작위로 선정한 열이나 행의 모든 글자를 기억했습니다. 이는 4~6개로 알려진 STM의 용량보다 많습니다.

참여자들이 기억력이 뛰어난 것도 아니었고, 모든 글자를 다 기억해보라고 했을 때는 특정 줄의 문자를 물어봤을 때보다 잘 기억해내지 못하고 절반 정도만 기억해냈습니다. 이는 우리가 알고있는 STM의 개수 6개와 일치합니다. 한 줄에 네 개의 글자는 잘 기억했다는 사실은 글자 격자 전체가 어딘가 저장되고 이때 저장되는 장소가 STM이 아닌 다른 곳임을 의미합니다. 이렇게 시각을 통해 들어온 정보가 저장되는 곳을 영상 기억 공간이라고 부릅니다. 실험에서 알 수 있듯이 영상 기억 공간에 저장되어있는 모든 정보가 STM에서 처리할 수 있는 것은 아닙니다.

영상 정보와 코드

영상 기억 공간에 저장된 정보를 모두 STM이 처리할 수 없기 때문에 코드를 읽을 때 처리할 수 있는 정보를 선택해야 합니다. 이런 선택은 무의식적으로 이루어지는데 특정 부분을 놓치고 지나가는 경우가 그에 해당합니다. 그리고 이것이 의미하는 것은 STM이 처리할 수 있는 것보다 더 많은 정보를 저장하는 것이 이론적으로 가능하다는 것입니다.

이 내용을 활용해서 코드를 잠시 보고 그것을 기억해 봅시다. 반 페이지 분량의 코드를 몇 초간 보고 아래 질문에 답하면 됩니다.

  • 코드의 구조는 어떻게 되어 있는가?
    • 깊이 중첩된 구조 or 평탄한 구조
    • 눈에 띄는 라인은 있는가?
  • 코드에서 들여쓰기는 어떻게 되어 있는가?
    • 간격은 있는가?
    • 큰 뭉치처럼 보이는 것이 있는가?

기억하는 대상보다 방식이 중요하다

코드를 읽고 재현할 때 무엇을 이해했는지 또는 잘못 이해하고 있는지 스스로 진단할 수 있는데 무엇을 기억해냈느냐뿐만 아니라 어떤 순서로 기억했는지 파악하는 게 자가 진단에 유용합니다.

또 다른 실험에서는 프로그래머들에게 알골 언어의 키워드를 외우도록 해보았습니다.

FOR CASE LONG WHILE IS ELSE STRING
AND OR BITS STEP TRUE REAL FALSE
NULL SHORT THEN END DO IF OF

참가자들이 21개의 키워드를 모두 외웠을 때 한번 적어보도록 하였는데 그 결과 초급인 사람들은 "TRUE IS REAL THEN FALSE" 이런식의 문장을 사용하였고, 고급인 사람들은 "TRUE, FALSE", "IF, THEN, ELSE" 등을 묶어 이미 가지고 있는 지식을 사용하였습니다.

청크로 묶을 수 있는 코드

앞서 다뤘던 청크로 기억하는 연습을 몇 번 해보면 코드를 여러 개의 그룹으로 묶을 수 있다는 것을 알 수 있습니다. 그렇다면 거꾸로 읽기 쉬운 코드를 작성하려면 어떻게 해야 할까요?

디자인 패턴 사용

디자인 패턴이 사용된 코드는 유지 보수를 할 때 프로그래머가 해당 패턴을 알고 있다면 도움이 됩니다. 디자인 패턴에 대한 지식을 가지게 되면 청킹 능력이 향상되어 코드를 더 빠르게 익힐 수 있다는 연구 결과가 있습니다. 이는 패턴에 따라 차이가 나기도 하는데 데코레이터 패턴보다는 옵저버 패턴을 파악하고 수정하는 시간이 더 짧았다고 합니다.

주석 사용

연구 결과에 따르면 주석이 있는 코드가 개발자들이 읽을 때 시간이 더 많이 소요된다고 합니다. 이는 개발자들이 코드를 읽을 때 주석문 역시 읽는 다는 점을 시사하고, 최소한 주석이 아무 의미 없는 것이 아님을 알 수 있습니다. 그리고 주석이 있으면 새로운 개발자가 코드를 쉽게 이해할 수 있다고 합니다.

이는 역시 청킹하는데 영향을 주는 요소이고 특히 복잡한 알고리즘을 수행하는 메서드 위에 주석이 달려있다면 훨씬 더 극적인 도움을 줄 수 있을 것입니다.

개인적으로 인라인 주석은 선호하지 않는 편인데 유틸 메서드에 간략한 설명을 자바독으로 제공하는 것은 필요하다고 생각합니다. 그 메서드를 호출했을 때 어떤 일을 수행하는지 코드를 보지 않아도 알 수 있고 IDE에서도 툴팁으로 간단하게 띄워서 보여주기 때문입니다.

표식 남기기

코드에 어떤 표식을 남기면 청킹에 역시 도움을 줄 수 있습니다. 여기서 표식은 한 라인 또는 라인의 일부가 될 수 있는데 코드를 읽을 때 바로 알아볼 수 있다면 그게 바로 표식입니다.

표식은 코드를 읽고 이해하는 과정에서 개발자가 갖는 가정이 맞거나 틀린 것을 확인해주는 역할을 수행합니다.

표식에는 단순 표식과 복합 표식이 있습니다. 단순 표식은 의미 있는 변수명 처럼 문법을 통해 의미가 전달되는 것을 말합니다. root, tree와 같은 변수명이나 연산자, if else 도 모두 단순 표식에 해당합니다. 복합 표식은 단순 표식으로 이루어진 좀 더 큰 단위의 코드로 단순 표식들이 모여 함께 실행하는 기능에 대해 알려줍니다. 예를 들어 for 루프는 변수 선언 및 초기화, 값의 변화 및 경계 조건을 포함하기 때문에 복합 표식입니다.

표식은 청크와 관련이 있지만 좀 더 작은 코드 개념입니다.

다음은 표식을 찾는데 도움이 되는 연습 과정 입니다.

  1. 코드 선정: 잘 아는 언어로 된 잘 알지 못하는 코드 베이스를 선정하여 하나의 메서드를 선택
  2. 코드 파악: 코드가 하는 일 요약
  3. 사용하는 표식 확인: 읽다가 이해가 가는 부분에 대해 잠시 멈추고 왜 그렇게 생각했는지 적기, 주석, 변수명, 메서드명 등
  4. 회고: 어떤 표식을 찾았는가? 코드의 요소인가 사람의 언어로 된 정보인가? 무엇에 관해 알려주고 있는가? 코드의 도메인에 대한 지식을 나타내는가? 코드의 기능에 대한 지식을 나타내는가?
  5. 코드에 다시 적용: 새로운 표식을 추가하거나 기존 표식을 수정
  6. 비교: 주변 사람들과 함께 연습 및 비교

청킹 연습

경험이 쌓이면 지식이 자연스럽게 늘어나지만 코드 청킹을 의도적으로 연습하는 몇 가지 방법이 있습니다.

의도적 연습은 어떤 기술을 향상시키기 위해 조금씩 연습하는 것을 의미하는 것으로 팔의 근육을 늘리기 위해 푸시업을 하는 것 등을 의미합니다. 프로그래밍은 여러 가지 이유로 의도적 연습이 흔치 않습니다. 따라서 적극적으로 코드를 기억해내는 것을 훈련하면 아주 좋습니다.

  1. 코드 선정: 익숙한 코드베이스를 선정하여 메서드나 함수 혹은 밀접하게 연결된 코드 선택(최대 50라인)
  2. 코드 파악: 2분 이내로 코드 파악
  3. 코드 재현: 새로운 파일에 코드 다시 작성
  4. 회고: 어느 부분을 쉽게 기억했는가? 부분적으로 기억한 코드가 있는가? 전체를 다 기억하지 못한 코드가 있는가? 기억하지 못한 라인들이 있다면 그 이유는? 기억하지 못한 라인에 본인이 익숙하지 않은 프로그래밍 개념 또는 도메인 지식이 있지 않은가?
  5. 비교: 주변 사람들과 함께 연습 및 비교

요약

  • STM은 두 개에서 여섯 개 사이의 항목을 저장할 수 있음
  • 정보를 기억할 때 STM 크기 제약을 극복하기 위해 LTM과 협업
  • 새로운 정보를 읽을 때 청크라는 몇 개의 묶음으로 나눔
  • LTM 지식이 부족하면 하위 수준의 정보들에 의존해야 해서 STM이 빨리 소진됨
  • LTM이 충분한 지식을 가지고 있다면 추상개념을 STM에 저장함으로써 공간을 절약
  • 코드를 읽을 때 영상 기억 공간에 저장 후 아주 적은 일부만 STM으로 보내짐
  • 코드를 기억해내는 일은 프로그래밍 지식에 대한 자가 진단 도구
  • 디자인 패턴, 주석문, 표식과 같은 것들은 코드를 우리 두뇌에서 처리하기 쉽게 만들어줌
댓글