[컴퓨터 세상을 바꾼 25개 논문] GOTO 문의 해로움
[컴퓨터 세상을 바꾼 25개 논문] GOTO 문의 해로움
TL;DR
코드는 한 번 작성되지만, 수천 번 읽힙니다. 에츠허르 다익스트라가 goto를 경계했던 이유는 단순히 문법의 문제가 아니라, 인간의 뇌가 ‘비구조적인 흐름’을 추적하는 데 한계가 있기 때문입니다. 오늘날 우리가 당연하게 여기는 ‘읽기 좋은 코드’의 뿌리를 찾아 거인의 어깨 위에 올라타 봅시다.
코드는 쓰이는 것이 아니라 ‘읽히는 것’이다
1968년, 에츠허르 다익스트라(Edsger W. Dijkstra)는 프로그래밍 역사에 남을 논문 Go To Statement Considered Harmful을 발표합니다. 이 논문이 오늘날까지 회자되는 이유는 기술적인 테크닉을 넘어선 근본적인 통찰을 담고 있기 때문입니다.
(사실 Consider Harmful 은 다익스트라가 지은게 아니라 편집자가 어그로를 끌기 위해서 바꿨다는 비화가..)
우리가 코드를 작성할 때는 순차적으로 써 내려가지만, goto가 남발된 코드는 실행 시점에 어디로 튈지 모르는 ‘스파게티’가 됩니다. 인간의 뇌는 선형적인 논리를 따라가는 데 최적화되어 있습니다. 흐름이 꼬이는 순간, 개발자의 인지 부하는 폭발합니다.
같은 결과를 내는 코드라도, goto 유무에 따라 읽는 사람의 뇌가 겪는 ‘인지 부하’는 천차만별입니다. 이러한 1-10까지의 짝수를 더하는 간단한 코드가 있다고 생각해봅시다.
1
2
3
4
5
6
7
8
9
10
let sum = 0;
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) {
sum += i;
}
}
그런데 goto 문을 쓴다면 이런식으로 작성되어야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int i = 1;
int sum = 0;
loop_start:
if (i > 10) goto loop_end; // 종료 조건 체크 후 점프
if (i % 2 != 0) goto skip; // 홀수면 아래 로직 건너뛰고 점프
sum += i;
skip:
i++;
goto loop_start; // 다시 위로 점프
loop_end:
printf("%d", sum);
논리가 이리저리 점프하며, 전체 그림을 그리려면 라벨(label)을 찾아 시선을 계속 옮겨야 합니다. 작은 루프에서는 사소해 보일지 몰라도, 수만 줄의 코드에서 이런 ‘점프’가 수백 번 일어난다면 그것이 바로 탈출 불가능한 미로, 스파게티 코드의 시작입니다.
5,000줄의 JS 파일이 남긴 교훈
저 역시 과거에 5,000줄짜리 거대한 단일 파일로 구성된 자바스크립트 코드를 유지보수한 적이 있습니다. 단순히 파일이 커서 에디터가 버벅이는 문제보다 더 괴로웠던 건 맥락의 부재였습니다.
구조화되지 않은 코드는 goto 문이 명시적으로 없더라도 그 자체로 거대한 덩어리가 되어 흐름을 방해합니다. 각 함수의 역할이 모호하고 맥락이 뒤엉켜 있으면, 개발자는 코드를 고치기 위해 수천 줄의 히스토리를 머릿속에 억지로 집어넣어야 합니다.
현대적 관점의 “Considered Harmful”
오늘날 현대적인 프로그래밍 언어에서 goto는 거의 퇴출되었습니다. 하지만 다익스트라의 정신은 현대의 클린 코드(Clean Code) 원칙들로 계승되고 있습니다.
- Else-less 프로그래밍: 분기문을 최소화하여 사고의 깊이를 얕게 유지합니다.
- 부정 조건 피하기: if (!isNotCorrect) 같은 코드는 뇌에 불필요한 연산을 강요합니다.
- 조기 반환(Early Return): 함수의 복잡도를 낮추고 읽는 사람의 부담을 덜어줍니다.
이러한 규칙들은 모두 어떻게 하면 읽는 사람이 이 코드를 쉽게 이해할 수 있을까? 라는 질문에서 출발합니다. 가독성을 중시하는 현대 개발자들의 묵시적인 규칙들은 결국 다익스트라가 던진 화두의 연장선에 있습니다.
주니어 개발자에게: 거인의 어깨 위에서 바라보기
우리가 지금 당연하게 사용하는 for, while, if-else 구조는 사실 과거의 거인들이 치열하게 고민하고 싸워 얻어낸 결과물입니다. 현대적인 프레임워크와 최신 문법을 익히는 것도 중요하지만, 가끔은 이런 고전 논문을 통해 왜 이런 구조가 탄생했는가라는 근본적인 질문을 던져보시길 권합니다. 당연하다고 생각했던 것들을 돌아보는 순간, 코드를 바라보는 여러분의 시야는 한 단계 더 깊어질 것입니다.
1
"코드는 작성되는 건 잠깐이지만, 읽히는 건 영원할 수 있습니다."
다익스트라의 논문은 단순히 특정 문법을 비판한 것이 아닙니다. 개발자가 코드를 작성할 때 항상 독자를 배려해야 한다는 책임감을 일깨워준 것입니다. 오늘 여러분이 작성하는 코드 한 줄이 미래의 나, 혹은 동료에게 명쾌한 지도가 될지, 아니면 길을 잃게 만드는 미로가 될지는 여러분의 손끝에 달려 있습니다. 항상 독자를 생각하며 코딩하는 습관을 가져봅시다.