본문 바로가기
IT 공부/공부하며 알게된 사실들

왜 다른 사람이 작성한 코드는 이해하기 힘든 것일까 (본질적 어려움)

by exdus3156 2023. 12. 15.

수많은 개발자들이 개발 실력을 업그레이드하려면 다른 사람이 작성한 코드를 읽어보라고 한다.

하지만 막상 오픈소스 하나를 찾아서 코드를 읽다보면 생각보다 정말 이해하기 힘들다.

난 처음에 이 문제의 원인을 내 프로그래밍 실력이 낮아서 문제라고 생각했다. (이건 정답)

그래서 프로그래밍 언어를 더더욱 배워야 한다고 생각했다. (이건 오답)

하지만 개발 공부를 하면 할수록 느껴지는 것이 생겼다. 코드를 읽기 어려운 이유는 코딩 문법이 어려워서가 아니다.

해당 프로젝트가 해결하려고 하는 도메인의 지식 구조와 프로젝트의 구성 요소에 대해 전혀 모르기 때문에 알아 먹기 힘든 것이었다.

막상 시간을 들여 천천히 읽다보면 의외로 구조와 코드 문법은 아주 어려운 것은 없었다.

아주 가끔 모르는 키워드가 나올 수 있는데, 그때 구글링을 하면 생각보다 쉽게 문법이 무슨 기능을 담당하고 있는지 파악할 수 있었다.

하지만 왜 그 기능이 있는지를 몰랐다.

이건 프로그래밍 언어나 기술의 문제가 아니었다. 

실제로 가장 중요한 것은 해당 프로젝트의 코드가 해결하려는 문제 영역과 관련된 지식들, 그리고 그 문제를 객체로 분해하고 협력시키는 과정에서 생기는 복잡한 상호 작용을 이해하는 것이 문제였다.

예전에 톰캣(tomcat)을 이해하려고 오픈 소스를 열었는데 보자마자 거의 포기했었다. 

나는 그것이 내 자바 실력이 부족해서라고 생각했다.

하지만 막상 클래스들을 보면 아주 심각하게 어려운 문법을 사용하진 않았다.

코드의 구조와 제어 흐름, 무엇이 무엇을 호출하는지 정도는 이해할 수 있었다.

문제는 각 클래스들이 해결하려는 문제 영역에 대한 지식이 전혀 없었던 것이다. 즉, 서블릿 JSP 명세, HTTP 프로토콜, 서블릿 컨테이너 등.. 복잡한 지식이 필요했다.

좋은 예시일지는 모르겠지만, 예를 들어 축구 게임 코드가 있는데 해당 코드에서 OFFSIDE라는 단어가 있다고 하자. 코딩 문법을 알아도 축구 규칙을 모르는 사람은 코드의 제어 흐름 정도는 파악할 수 있어도 도대체 이 기능과 변수가 왜(WHY) 있는지는 알 수 없을 것이다.

 

<코드 컴플리트> 제5장 구현 설계 부분을 보면, 코딩의 진정한 어려움은 프로그래밍 언어의 문법 체계나 개발 툴의 복잡성 같은 것이 아니라고 했다. 코딩의 어려움은 복잡한 구조로 얽히고 섥힌 문제 영역에 대한 지식을 이해해야 한다는 점에서 어렵다. (링크)

문제 영역의 본질적인 복잡성이 코드를 이해하는데 어려움을 주는 요인이다. 위 링크에서 볼 수 있듯이, 본질적인 어려움은 프로그래밍 언어나 컴퓨터 종류와는 전혀 별개이기 때문에 어떤 언어를 사용하든 피할 수 없는 문제다.

물론 비본질적 어려움도 어려운 것은 마찬가지지만, 이것은 개념과 기술에 대한 공부로 해결할 수 있다. 하지만 본질적 어려움과 관련해서는, 해당 문제와 비슷한 문제를 해결한 경험이 없다면 문제가 무엇인지 그 자체를 이해하질 못하므로 코드도 이해하기 힘든 것이다.

그래서 오픈 소스든 뭐든 타인이 작성한 코드를 이해하고 싶다면, 먼저 프로그래밍 언어나 관련 개념들을 공부한 뒤에, 해당 프로젝트 자체가 무엇인지 알아야 할 것이다. 프로그래밍이 문제를 해결하는 것이므로 어쩌면 프로그래밍 언어 문법보다 더 중요한 것이 바로 이렇게 해당 프로젝트의 문제를 식별하고 해결하고자 하는 것이 정확히 무엇인지 파악하는 것이지 않을까?

물론 이렇게 적었다고 나는 그렇게 할 수 있다고 말하는 것은 아니다. 나로선 본질적 어려움뿐만 아니라 비본질적 어려움 또한 실력을 쌓으려 노력해야 하는 처지니까 말이다.

다만 코드를 해석할 때 내가 정확히 마주한 문제가 어떤 문제인지(본질적 어려움에 속하는지, 아니면 비본질적 어려움에 속하는지) 파악해야만 어떤 전략으로 대응해야 할 지 알 것이다.

본질적 어려움이라면 해당 프로젝트의 목적이나 기능, 문제 영역을 더 연구해야 하는 것이고, 비본질적 어려움이라면 내가 모르는 문법, 내가 모르는 빌드 툴, 디자인 패턴, 자료구조와 알고리즘, 혹은 운영체제나 네트워크와 같은 기본 개념을 더 공부해야 할 것이다.