코드를 빠르게 이해하려면
23년 이전 글/IT 교양

코드를 빠르게 이해하려면

이 포스트의 주요 주제

  • 코드를 빨리 이해하는 것이 어려운 이유
  • 두뇌가 정보를 어떻게 인식 가능한 부분으로 나누는지
  • 단어와 코드 같은 정보를 분석할 때 LTM과 STM 사이의 상호작용
  • 코드 분석 시 영상 기억 공간의 역할
  • 코드 기억을 통한 코딩 수준의 자가 진단 방법
  • 읽기 쉬운 코드를 작성하는 법

프로그래머의 뇌를 읽고 작성 되었습니다

 

코드를 신속하게 읽기

프로그래머가 가장 시간을 쏟는 작업은 어떤 작업일까?

 

Measuring Program Comprehension: A Large-Scale Field Study with Professionals

During software development and maintenance, developers spend a considerable amount of time on program comprehension activities. Previous studies show that program comprehension takes up as much as half of a developer's time. However, most of these studies

ieeexplore.ieee.org

다음의 연구결과에 따르면 프로그래머는 60% 시간을 코드를 이해하는데 사용한다고 한다.

반대로 말하면 코드를 이해하는 속도를 높이면 업무의 효율을 높힐 수 있다.

 

코드를 읽는 목적은 다양하겠지만 대게 기능 추가, 버그 발견, 또는 더 큰 시스템을 이해하기 위해서가 보통이다.

그리고 이 상황에서 한가지 공통점이 있는데 이는 코드에 존재하는 특정한 정보를 찾는다는 것이다.

ex) 기능 추가할 부분, 버그가 있을 만한 부분, 특정 메서드가 구현된 방법

따라서 관련 정보를 신속하게 찾는 능력이 필요하며, 수준이 높아질 수록 시간을 아낄 수 있다.

삽입 정렬을 구현한 자바 프로그램을 예시로 프로그래밍 시에 두뇌에서 일어나는 일을 살펴보자

 

자바코드 재현 첫 번째 실험

public class InsertionSort {
	public static void main(String[] args) {
    	int[] array = {45, 12, 85, 32, 89, 39, 69, 44, 42, 1, 6, 8}
        int temp;
        for (int i = 1; i < array.length; i++) {
        	for (int j = u; j > 0; j--) {
            	if (array[j] < array[j - 1]) {
                	temp = array[j];
                    array[j] = array[j-1];
                    array[j-1] = temp;
            	}
        	}
        }
        for (int i = 0; i< array.length; i++) {
        	System.out.println(array[i]);
    	}
	}
}

 

 

위 자바 코드를 다시 재현할 때 아래 그림과 같은 과정을 거쳤을 것이다

 

 

코드를 읽을 때 대체로 STM을 사용해 저장하며, 읽는데 사용하는 문법에 대한 지식, 그리고 삽입 정렬에 대한 부분은 LTM으로 부터 가져온다. 따라서 해당 코드를 보고 따라 구현할 때 모르는 부분은 삽입 정렬에 대한 알고리즘 기억을 되살려서 작성하게 될 것이다

 

자바코드 재현 두번째 실험

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);
    }
}

이 코드를 3분동안 보고 외운 뒤 다시 하려고 하면 위 자바코드 보다 더 어려울 것이다.

이유는 for문의 변수명부터 생소했으며, 코드의 역할이 LTM에 저장된 지식을 사용해 추측할 수 없기 때문이다.

특히 변수 L과 1은 시각적으로도 헷갈린다.

 

첫번째 두번째 코드를 통해 비교함으로써 알게되는 것은, LTM의 도움 없이 코드를 이해하는 것은 어렵다는 것.

STM의 경우 용량의 제한도 있을 뿐더러 봤던 정보를 기억하는 시간이 30초를 넘지 못하며, 30초 후에 그 정보는 LTM에 저장되거나 잊어먹는다.

최근 연구에서는 STM 용량이 2~6으로 더 적다고 추정하고 있어 특히 이 STM의 용량 제한을 극복하기 위해 LTM과의 협업이 중요해진다.

 

용량 제한을 극복하는 방법

 

단위로 묶기

아드리안 더흐로트라는 네덜란드의 수학자에 의해 나온 개념으로 Chunk라는 개념이 있다. 더흐로트는 사람마다 체스실력의 차이가 나는 이유를 알아내기 위해 체스 고수와 일반인에게 임의의 체스말이 배치된 판을 기억하게 하였고, 고수 그룹이 훨씬 체스 말의 위치를 잘 기억했다.

두번째 실험에서는 첫 실험과 달리 체스 말을 마구잡이로 배치했으며, 이때는 두 그룹 모두 제대로 기억해내지 못했다.

세번째 실험에서 확연한 차이가 있었는데, 좌표로 기억하는 일반인 그룹과 달리, 전문가 그룹은 LTM에 대한 지식을 꺼내어 이용했고, 이는 STM 내에 4개 정도의 항목만 필요하게 사용하였다.

과거 경험과 연결하여 기억한게 인상적이었는데

"3월 어느 비 오는 토요일에 베치와 시합했던 게임인데 캐슬링만 왼쪽이군"의 식으로 기억하는 방법은 LTM에 저장된다는 것이었다.

더호로트는 몇개 그룹으로 묶은 정보를 청크로 불렀으며, 이런 Chunk는 STM 기억 공간을 하나만 차지한다.

 

체스의 예는 코드에도 그대로 적용할 수 있다.

 

Knowledge Organization and Skill Diffrences in Computer Programmers

위 실험은 코드를 통해 체스 연구와 비슷한 상황과 결과를 보여주었다. 

핵심은 코드에서도 체스 연구에서 드러난 것과 비슷한 현상이 일어났다는 것

 

우리는 읽는게 아니라 '본다'

정보가 STM에 들어가기 전 감각 기억 공간에 저장된다. 코드를 읽을 때 이 코드는 영상 기억 공간에 잠시 저장된다.

어두운 밤 불빛을 빠르게 흔들면 마치 잔상이 남는 모습을 볼 수 있는데 이는 영상 기억 공간 때문이다.

영상 기억 공간에 대한 논문

위 실험에서는 3 X 3 또는 3 X 4의 형태로 된 글자를 짧은시간(1/20초) 보여주며 글자를 외우게 했다.

이 때 글자를 다 읽는 것은 물리적으로 불가능해야하지만, 참가자들은 75% 확률로 무작위로 선정한 열과 행의 글자를 기억했다. 이는 STM의 용량보다 많다는 것을 뜻한다.

이들의 기억력이 좋아서였을까? 다른 실험으로 알아본 결과, STM을 사용해서 기억하도록 했더니 일반인과 같이 6개 정도의 알파벳만 기억했다

 

기억하는 방식이 중요하다

알골 언어 키워드를 기억하는 실험에서 초급과 고급 프로그래머들의 기억 방법이 확연히 차이가 났다

STRING CASE OR NULL ELSE STEP DO

FOR WHILE TRUE IS REAL THEN OF

FALSE BITS LONG AND SHORT IF END

위 키워드를 외우는 실험에서 초급의 프로그래머는

TRUE IS REAL THEN FALSE의 방식으로,

고급 프로그래머는 

TRUE FALSE를 묶거나, IF THEN ELSE를 묶는 등 CHUNK 방식을 적극 활용했다

 

그렇다면 우리가 사용하는 코드에는 어떻게 적용할까?

 

디자인 패턴

디자인 패턴이 코드의 유지 보수에 도움이 되는지에 대한 연구가 있었다.

Two Controlled Experiments Assessing the Usefulness of Design Pattern Information During Program Maintenance

A Controlled Experiment Comparing the Maintainability of Programs Designed with and without Design Patterns

해당 그림을 보면 디자인 패턴에 따른 코드 유지 보수의 효율을 알 수가 있다.

 

주석 쓰기

주석문은 초급 개발자의 코드 이해도 돕지만, 개발자의 코드 청킹 방식에도 영향을 미친다.

특히 The Effects of Beacons, Comments, and Tasks on Program Comprehension Process in Software Maintenance

연구에 따르면 개발자들은 주석에 굉장히 의존하는 편이다.

예를 들어 ' 이 함수는 주어진 이진 트리를 중위 순회하며 프린트한다' 라는 고수준 주석문은 코드를 청크 단위로 쪼개는데 큰 도움을 준다, 그러나 i++; 다음에 i를 1만큼 증가 같은 저수준 주석문은 오히려 청킹 작업을 방해한다.

 

표식 남기기

표식은 일반적으로 코드 내에 사용하는 특정 자료구조, 알고리즘 혹은 접근 방식 등을 보여주는 라인이다.

class Node:
	def __init__(self, key):
    	self.left = None
        self.right = None
        self.val = key

# 중위 순회 함수

def print_in_order(root):
	if root:
    
    	# 왼쪽 자식에 대한 첫 번째 재귀 호출
        print_in_order(root.left)
        
        # 노드 데이터 출력
        print(root.val)
        
        # 오른쪽 자식에 대한 재귀 호출
        print_in_order(root.right)
 
 print("트리의 내용은 다음과 같다.")
 print_in_order(tree)

다음의 파이썬 코드에서 표식 역할은 다음과 같다

  • 주석문에 단어 '트리'를 사용
  • root와 tree라는 변수명
  • left와 right라는 필드명
  • 트리에 관한 문자열 값("트리의 내용은 다음과 같다.")

숙련된 개발자는 코드를 읽고 이해할 때 표식을 많이 이용하는 경향이 있다.

 

코드에서 적절한 표식을 찾는 단계.

  1. 코드 선정 - 잘 모르는 코드로 하고 언어는 아는 언어로.
  2. 코드 파악 - 코드 기능 요약
  3. 사용하는 표식 적극적 확인 - 주석문, 변수명, 메서드명, 임시 저장값 등 모든 것이 표식
  4. 회고 - 어떤 표식을 찾았는지, 코드 표식인지, 주석문인지, 무엇에 대해 알려주는 표식인지 등
  5. 코드에 다시 적용 - 선택한 표식들을 개선하거나 확장하기
  6. 다른 사람과 비교 - 잘하는 사람의 표식 활용 배우기, 또는 다른 사람과 비교하기

 

청킹 연습

경험이 쌓이면 자연스럽게 프로그래밍 지식이 늘어나지만, 코드 청킹을 의도적으로 늘릴 수 있는 방법이 있다.

이는 신체를 단련하기 위해 하는 운동과 같은 것으로 꾸준한 연습이 필요한 부분이다

  1. 코드 선정 - 주로 작업하지 않는 코드베이스, 또는 자신이 오래전 작성한 코드로 언어에 대한 지식 있으면 ok
  2. 코드 파악 - 2분을 넘지 않게 타이머 설정 후 코드를 파악
  3. 코드 재현 - 종이 또는 IDE에 봤던 코드를 구현
  4. 회고 - 쉽게 기억한 부분, 부분적으로 기억한 부분, 아예 기억하지 못한 부분, 기억 못한 이유, 익숙하지 않은 개념이 있는지, 또는 도메인 지식의 문제인지 확인
  5. 다른 사람과 비교

 

 

 

본편은 책의 두번째 파트로

첫번째 파트는 아래 링크로 보세요

 

 

다른 사람의 코드를 읽기 어려운 이유

프로그래머의 뇌(PROGRAMMER`S BRAIN)를 읽은 후 정리한 글 - Chapter. 1 코드가 초래하는 세 가지 종류의 혼란 3가지 언어를 예시를 들어 혼란의 종류에 대해서 알아보자 1. APL( A Programming Language ) - 위..

okdone.tistory.com

 

 

반응형