인지부하와 코드

좋은 코드란?

by 김탁현

이 글은 cognitive-load 라는 글을 보고 많은 공감을 한 후 작성하게 된 글입니다.

아래 링크를 첨부드리오니 읽어보시는 걸 추천드립니다.

https://github.com/zakirullin/cognitive-load/blob/main/README.ko.md


좋은 코드란?

최근 좋은 코드 라는 것이 무엇일까? 에 대한 고민을 하게 되었다. 나를 비롯한 주변에 물어보았을 때, 보통 "가독성 좋은 코드요", "직관적으로 이해가 잘 되는 코드요" 와 같은 답변을 얻을 수 있었다. 틀린 말은 아니다. 하지만 "가독성 좋은 코드가 어떤 코드일까요?", "어떤 코드가 직관적으로 이해가 잘 될까요?" 와 같이 질문을 하면 답변하기가 어렵다. 이번 포스팅은 인지 부하 이론과 함께 좋은 코드에 대한 생각을 정리하고자 한다.


인지 부하 이론

인지 부하란 학습자가 정보를 처리할 때 작업 기억(Working Memory)에 가해지는 정신적 부담을 의미한다. 인지 부하 이론은 "인간은 정보를 처리하는 능력에 본질적인 제약이 있다" 는 사실에서 출발한다. 가독성 좋은 코드, 직관적인 코드는 인지 부하 이론과 밀접한 관계가 있다고 생각한다. 그 이유는 다음과 같다.


1. 개발 업무 중 약 70% 는 코드를 읽고 이해하는 것이다.

2. 코드를 읽고 이해하는데 큰 영향을 주는 것은 인지 부하이다.

3. 그렇기에 인지 부하를 줄이는 것은 개발 업무에 있어 매우 중요하다.


그럼 인지 과부하 라고 표현할 수 있는 상황은 무엇일까? 여러 맥락이 뒤엉켜있는 코드, 비즈니스 코드가 노출된 수백 줄의 코드 등이 대표적인 예시라고 생각한다. 이런 코드를 마주쳤을 때, 우린 보통 "복잡하다", "리팩토링이 필요하다" 와 같은 표현을 쓰고, 이 때 인지 과부화 상황이라 표현할 수 있을 것 같다.


이를 바탕으로 가독성 좋은 코드, 직관적으로 이해할 수 있는 코드는 인지 부하를 최대한 줄인 코드라고도 정의할 수 있을 것 같다. 그럼 "인지 부하를 줄인 코드가 뭘까요?" 라는 질문이 생길 수 있다. 이제부터 인지 부하 이론에 대해 알아보며 차근차근 정리하려한다.


인지 부하 3가지 유형

앞서 인간은 정보를 처리하는 능력에 본질적인 제약이 있다고 했다. 이러한 제약을 초과할 경우, 학습이나 작업의 효율성이 저하될 수 있다. 인지 부하 이론에선 인지 부하를 총 3가지 유형으로 정의 후, 각 인지 부하가 언제 증가하고, 어떻게 줄일 수 있을지를 정의한다.


내재적 인지 부하: 학습 자료, 과제의 난이도와 개인의 사전지식에 의해 요구되는 인지부하

외재적 인지 부하: 학습의 설계, 지도 방식, 과정 등에 의해 요구되는 인지부하

유의적 인지 부하: 새로운 지식을 기존 지식체계에 통합시킬 때 요구되는 인지부하


이렇게 3가지 인지 부하 유형이 있으며, 인지 부하 이론에선 설계자는 총 부하가 인간의 한계 내에 머무르도록 균형을 조정 해야한다. 위 3가지 유형 중, 내재적 인지 부하는 과제 자체의 복잡도라 줄이기 어렵지만, 외재적 인지 부하는 학습의 설계, 지도 방식 등에 의해 증가하는 것으로 해당 인지 부하를 줄이는 것에 집중해야한다고 한다. 또한 유의적 인지 부하를 늘려 학습자가 지식을 스스로 습득하게 유도하는 것이 중요한 목표라고 한다.


개발에 빗대어 다시 정의해보자. 현재 재직 중인 Lunit 을 기준으로 작성했다.


내재적 인지 부하: 의료 도메인 자체 난이도와 도메인 이해도 및 지식에 의해 요구되는 인지부하

외재적 인지 부하: 개발자가 작성한 코드, 프로젝트 아키텍처에 의해 요구되는 인지부하

유의적 인지 부하: 도메인과 코드의 연관관계를 이해하며 요구되는 인지부하


의료 도메인 자체 난이도와 규제 복잡성에 의해 요구되는 내재적 인지 부하는 바로 줄이기 어려워보인다. 반면, 개발자가 작성한 코드, 프로젝트 아키텍처에 의해 요구되는 외재적 인지 부하는 줄일 수 있다. 유의적 인지 부하는 개발자 본인이 다양한 시간과 노력을 들여 체화해야하므로 일정 수준 이상의 부하 유지가 필요해보인다. 그럼 3가지 유형의 인지 부하를 어떻게 조절할 수 있을까?


인지 부하를 조절하는 방법

인간은 정보를 처리하는 능력에 본질적인 제약이 있어 총 부하가 인간의 한계 내에 머무르도록 균형을 조정 해야한다고 했다. 각각의 인지 부하를 어떻게 조절할 수 있을지 알아보자.


내재적 인지 부하 조절하는 방법

1. 완성된 예제 활용 원리

2. 사전 훈련 원리


외재적 인지 부하 조절하는 방법

1. 중복 제거 원리

2. 맥락 제거 원리


유의적 인지 부하 조절하는 방법

1. 개인화 원리

2. 자기 설명 원리


내재적 인지 부하 조절 방법의 핵심은 과제의 복잡성을 설계적으로 조절하거나, 학습자의 사전지식을 향상시키는 방식으로 간접적으로 관리하는 것이다. 그렇기에 완성된 예제를 활용하여 문제 해결 과정을 쉽게 이해할 수 있도록 돕고, 학습 내용을 이해하기 위해 알고 있어야하는 요소를 먼저 이해시켜 사전지식 향상을 돕는 것이 조절하는 원리가 된다.


외재적 인지 부하 조절 방법의 핵심은 불필요한 인지 처리 과정을 최소화하고, 학습자가 본질적 내용에만 집중할 수 있도록 환경을 단순화하는 것이다. 그렇기에 동일 정보를 포함하는 텍스트, 그림의 중복 제시를 피하고, 핵심 맥락과 상관없는 +@ 에 해당하는 부수 맥락을 제외하는 것이 주요한 방법이다.


유의적 인지 부하 조절 방법의 핵심은 학습자의 주의가 이해한 것을 소화할 수 있게 만드는 것이 핵심이다. 학습자가 스스로 "왜 그렇게 되는지" 설명하는 방법, 이해한 내용을 스스로 재구성하는 방법 등을 통해 단순히 암기에 그치지 않고, 새로운 지식을 자신의 기존 지식망과 연결하는 것이 방법이다.


부하 조절하는 방법도 개발에 빗대어 다시 정의해보자.


내재적 인지 부하 조절 방법은 프로젝트 관련 문서와 README 등 다양한 자료를 토대로 사전 지식을 쌓는 과정과 프로젝트의 아키텍처가 어떻게 연관되어 있는지를 설명을 듣거나 찾아보는 것이다. 이러한 과정 없이 코드를 접하게 될 경우, 내재적 인지 부하가 높아지면서 빠르게 총 부하 한계치에 도달하게 될 것이다.


외재적 인지 부하 조절 방법은 추상화 계층 깊이 통일, 명확한 네이밍 규칙, UI 구조와 코드 구조의 시각적 정렬 등이 있다. 코드를 이해하는 과정에 있어 불필요한 탐색을 줄이는 방법이다. 예상 가능한 형태, 일관성 있는 형태를 최대한 유지, 제공하여 각 코드의 본질에만 집중할 수 있게 하는 것이 핵심이다. 가독성 좋은 코드의 여러 조건 중 하나가 위에서 제시한 방법일 것 같다.


유의적 인지 부하 조절 방법은 코드 리뷰에서 "왜 이렇게 구현했는가" 를 설명하는 방법, 동일한 기능을 다른 패턴으로 구현하는 방법 등이 있다. 이러한 경험은 단기적으로 더 많은 인지 자원을 요구하지만, 장기적으로는 지식을 내재화하고, 지식의 입출력을 자연스럽게 이끌어낼수 있다.


그래서 좋은 코드란?

다시 처음의 질문으로 돌아가보자. 좋은 코드란 무엇일까? 가독성이 좋은 코드란 무엇일까? 지금의 나는 이렇게 생각한다. 좋은 코드는 단순히 보기 좋은 코드나 문법적으로 완벽한 코드는 아니라고 생각한다. 사람의 인지 구조를 고려해 작성된 코드, 즉 읽는 사람의 머릿속에서 자연스럽게 작동하는 코드다.


인지 부하 관점에서 생각해보면 다음과 같이 정리할 수 있을 것 같다.


내재적 인지 부하 관점: 도메인과 설계 맥락을 충분히 이해할 수 있도록 돕는 예제가 함께하는 코드

외재적 인지 부하 관점: 불필요한 탐색과 혼란을 줄여 본질에 집중하게 하는 코드

유의적 인지 부하 관점: 스스로 사고하고, 이유를 설명할 수 있게 만드는 코드


결국 좋은 코드는 사람의 생각을 가장 적게 요구하는 코드라고 생각한다.


앞으로 문제를 풀기 위해 나온 여러 아키텍처를 인지 부하 이론을 통해 풀어가며 단순히 아키텍처를 사용하는 것이 아닌 내재화하여 이해하고자 한다. 이를 통해 사람의 생각을 가장 적게 요구하는 코드가 무엇인지 찾고자 한다.