9.8.3 인지 복잡도(Cognitive Complexity)를 통한 이해하기 어려운 코드 필터링

9.8.3 인지 복잡도(Cognitive Complexity)를 통한 이해하기 어려운 코드 필터링

순환 복잡도(Cyclomatic Complexity)는 코드의 논리적 실행 경로를 정확히 계산해 주지만, 인간이 그 코드를 읽을 때 느끼는 심리적·인지적 부담감까지 대변하지는 못한다. 예를 들어, switch 문 안에 case가 30개 나열되어 있다면 순환 복잡도는 30으로 치솟지만, 인간 개발자는 이 평면적인 분기문을 매우 직관적으로(쉽게) 이해할 수 있다. 반면, 복잡도가 낮더라도 if 블록 안에 재귀(Recursion) 함수와 goto 문이 꼬여있다면 코드는 해독 불가능한 상태가 된다.

이러한 지표의 맹점을 보완하기 위해 SonarSource가 주창한 **인지 복잡도(Cognitive Complexity)**가 새로운 세대의 유지보수성 오라클로 떠오르고 있다. AI가 코드를 생성할 때, 기계의 언어를 기계의 논리로만 평가하지 않고, ’이 코드를 이어받아 리뷰할 인간 시니어의 뇌가 얼마나 큰 부하(Load)를 받을 것인가’를 수치화하여 필터링하는 것이다.

1. 인지 복잡도 산정의 주요 알고리즘

인지 복잡도 오라클은 일반 복잡도와 달리 다음과 같은 구체적인 ’독해의 장벽’을 마주칠 때만 페널티 점수를 누적시킨다.

  • 중첩(Hierarchy)의 페널티 가중치: if 문 안에 다시 if 문이 들어갈 때, 안쪽 if문은 바깥쪽보다 인간의 인지 부하를 곱절로 요구한다. 인지 복잡도는 중첩 깊이가 깊어질수록 가중치(Multiplier)를 부여하여 점수를 기하급수적으로 폭발시킨다.
  • 분기의 연속성(Continuity): 다중 논리 식(예: if (a && b && c))은 한 번에 이해하기 쉬우므로 1점으로 치지만, 연산자가 중간에 혼용되는 경우(예: if (a && b || c))는 뇌가 연산자 우선순위를 새로 계산해야 하므로 추가 페널티를 매긴다.
  • 재귀(Recursion) 및 점프: 머릿속 스택 메모리를 꼬이게 만드는 goto, continue의 남용, 혹은 직접적인 자기 함수 호출(Recursion)이 발견되면 인지 복잡도 점수가 상승한다.

2. ’영리함(Cleverness)’을 배척하는 오라클의 철학

LLM은 종종 자신의 코딩 능력을 뽐내듯 극도로 축약된 형태의 코드를 생성하곤 한다. 파이썬의 삼항 연산자(Ternary Operator)를 3중으로 중첩하거나, 리스트 컴프리헨션(List Comprehension) 안에 복잡한 필터링 로직을 한 줄로 우겨넣는 식이다([x for x in data if x > 0 and (x % 2 == 0 if flag else x % 3 == 0)]).

순환 복잡도 오라클은 이러한 ‘원라이너(One-liner)’ 코드의 라인 수가 1줄이라는 이유로 통과시켜 버릴 수 있다. 하지만 인지 복잡도 스캐너는 이 구문이 인간의 머릿속에서 전개(Unpacking)되어야 하는 심리적 단계를 계산하여 치명적인 에러(Reject)를 뱉어낸다.

“[Cognitive Oracle Reject] 함수 42번째 라인의 리스트 컴프리헨션 구문이 인간의 단기 기억 용량(Cognitive Load)의 한계를 초과했습니다. 복잡한 한 줄짜리 코드를 해체하여, 명시적인 for 루프와 의미를 설명하는 변수명(Descriptive Variables)을 도출하도록 재작성하십시오.”

3. Human-readability를 향한 강제 교정 루프

인지 복잡도 기반의 오라클을 CI/CD 파이프라인의 핵심 Gatekeeper로 설정하면, AI는 점차 자신이 작성하는 코드의 대상 독자(Audience)가 컴파일러 기계가 아니라 결국 훗날 깃허브에서 코드를 들여다볼 **‘인간 엔지니어(Human Engineer)’**라는 사실을 상호작용 속에서 튜닝해 나간다.

코드는 숏코딩(Short-coding) 경진대회의 산출물처럼 영리하고 모호해지는 대신, 주니어 개발자라도 술술 읽어 내려갈 수 있는 한 편의 명료한 산문(Prose)처럼 평탄화(Flattened)된다. 이해하기 어려운 코드를 거부하는 이 오라클은 기계 주도(Machine-Driven)의 맹목적 속도전 속에서도, 우리가 구축하는 소프트웨어가 영원히 인간의 통제 체제(Human Governance) 안에 머물도록 보장하는 최후의 인문학적 방어선이다.