코드 라인 길이와 가독성의 상관 관계

이상민·2022년 4월 6일
1
post-thumbnail

코드의 가독성이란 어려운 주제이다. 오늘은 몇가지 논문을 보며 호불호가 가장 없을 것 같은 가독성 주제인 줄 길이에 대해서 다룬다. 그냥 뭔가 느낌적으로 읽고 이해하기 좋은 것 뿐만 아니라 더 과학적인 연구가 있을까? 해서 찾아보게 되었다.

연구 1. 화면에서 읽을 때 읽는 속도와 줄 길이의 영향

2001년에 마이크로소프트 사의 지원을 받아 실행된 해당 연구는, 읽는 속도(보통, 빠름)와 줄 길이(25, 55, 100)에 따른 독해력의 차이를 구명하고자 했다. 기존에 출력물에 대한 비슷한 연구는 많았으나, 디지털 시대에 따른 화면 상의 글에 대한 연구는 비교적 부족했었다. 출력물에서는 줄 길이가 70자를 넘지 않는 것이 좋다는 연구 결과가 있었고, 이것이 화면에도 적용되는지 또한 해당 연구의 목적 중 하나였다. 제시된 글의 줄 길이와 읽는 속도를 다르게 하고, 글의 내용과 관련되어 질문을 하는 방식으로 독해력을 측정하였다. 이 글은 줄 길이에만 관심이 있으니, 그것 위주로 연구의 결과를 설명한다. 아래는 연구에서 사용되었던 화면의 예시이다.

연구 결과 줄의 길이가 길어지면 전반적으로 독해력이 떨어지는 것을 볼 수 있다. 보통의 읽기 속도에서는 확실히 줄 길이가 길어짐에 따라 독해력이 낮아졌고, 빠른 읽기 속도에서는 너무 짧을 때와 너무 길때 모두 상대적으로 독해력이 낮아졌다.

한가지 재밌는 점은 독해력을 떠나서 단순 읽는 양으로만 비교하면, 줄 길이가 증가할 수록 특정 시간내에 읽을 수 있는 양 또한 증가했다는 점이다. 아래 그림에서 볼 수 있듯이, 읽는 속도를 떠나 cpl이 증가함에 따라 읽는 양 또한 증가한다.

정리하자면 줄이 길면 더 빠르게 읽을 수 있어 훑어 보는 경우에는 유리할 수 있으나, 글에 대한 이해력이 떨어진다. 해당 연구에선 줄 길이와 독해력의 상관 관계를 자연스러운 눈의 움직임과 다음 줄을 찾는 문제의 결과일 것으로 추측했다. 눈은 보통 움직이는 범위가 있는데, 줄이 길 수록 이 범위를 벗어나 움직이므로 읽기에 저해가 되었고, 줄이 길 수록 다음 줄로 넘어갈 때 한번에 시작점을 찾기 어려우니 읽기에 방해되어 독해력에 영향이 있었을 것이란 추측이다. 빠른 읽기 속도에서 짧은 줄 길이의 독해력 저하는 줄 길이가 너무 짧아 한번의 집중에 정보를 모으기가 어렵고 자주 스크롤 해야해서 그랬을 것으로 추측했다.


연구 2. 가독성에 대한 코딩 관습의 영향

다음 연구는 비교적 최근인 2018년도에 진행된 것으로, 코딩 관습(컨벤션)에 따른 가독성 영향을 파악하고자 했다. 연구 방법은 특정 코딩 컨벤션마다 이를 따르는 자바 코드와 따르지 않는 자바 코드를 보여주고, 그중 가독성이 더 좋다고 생각하는 방식을 선택하는 것이었다.

실제 코드를 보는 것인 만큼 연구 참여자들은 개발자였고, 연차별 분포는 아래와 같았다.

총 11가지의 코딩 컨벤션을 가지고 평가를 하였다.

  1. 중괄호 앞에 빈칸 띄우기
// Adherent
if(hi) {
    ...
}

// Violating
if(hi){
    ...
}
  1. 중괄호를 새로운 라인이 아니라 바로 뒤에 붙이기
// Adherent
while(hi) {
    ...
}

// Violating
while(hi) 
{
    ...
}
  1. 빈줄로 연관된 코드 구분
// Adherent
var other = otherService.getOne();
other.doWork();

cache.put(other);
repository.save(other);

// Violating
var other = otherService.getOne();
other.doWork();
cache.put(other);
repository.save(other);
  1. 줄 길이를 80자로 제한

  2. 인덴트는 4 공백으로

// Adherent
if(hi) {
    doSmth();
}

// Violating
if(hi) {
  doSmth();
}
  1. 코드 블럭은 깊이 3단계를 초과하지 않도록

  2. 한줄에 ;는 하나씩만

// Adherent
doSmth(); 
doOther();

// Violating
doSmth(); doOther();
  1. 캐노니컬 이름은 사용하지 않음
// Adherent
@Service

// Violating
@org.springframework.stereotype.Service
  1. 프로포티 호출 체이닝 하지 않기

  2. 긴 동작은 지역 변수로 분리하기

  3. 네이밍은 사전에 있는 단어를 사용하기

이중 8가지는 통계적으로 유의미한 결과를 보였다. 7가지는 긍정적인 영향을 미치고, 1가지는 부정적인 영향을 미쳤다. 1, 4, 7, 8, 9, 11은 가독성을 향상 시켰고, 2번은 저해 시켰다. 연구에서 2번에 대한 결과는 참가자들의 기존 C#의 경험에서 발생했을 수 있다고 설명했다.


참고자료

Dyson, Mary & Haselgrove, Mark. (2001). The influence of reading speed and line length
on the effectiveness of reading from screen
. Retrieved from https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.108.4346&rep=rep1&type=pdf

Santos, Rodrigo & Gerosa, Marco. (2018). Impacts of Coding Practices on Readability. Retrieved from https://www.ime.usp.br/~gerosa/papers/ICPC2018-Legibility.pdf

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

1개의 댓글

comment-user-thumbnail
2023년 8월 24일

논문 까지 찾아서 알려주시는 좋은 글이네요!
잘 읽었습니다. 감사해요!!

답글 달기