당신의 AI 코드는 쓰레기인가요? (해결 방법 대공개)

BBetter Stack
컴퓨터/소프트웨어경영/리더십AI/미래기술

Transcript

00:00:00오늘은 CRAP에 대해 이야기해 보려 합니다. 물론, 여러분이 생각하는 그 CRAP은 아닙니다.
00:00:05이건 '변경 위험 안티패턴 지수(Change Risk Anti-Patterns Index)'의 약자입니다. 이 지표는
00:00:12복잡도는 높지만 테스트는 부족한, 코드 내의 위험한 함수들을 찾아내기 위해 설계되었습니다. 아주
00:00:18새로운 개념은 아니지만, 최근에 발표된 패키지 덕분에 다시 주목하게 되었습니다.
00:00:24알렉산더 프로코란코가 만든 Cargo CRAP이라는 도구인데, Rust 코드에서 이런 핵심 함수들을 식별해 줍니다.
00:00:31CRAP 지표의 원래 아이디어는 알베르토 사보이아와 밥 에반스가 냈습니다. 이들은
00:00:372007년에 자동화된 개발자 테스트 도구를 실험하다가 이 지표를 고안했죠. 하지만 알렉산더가
00:00:44최근 통찰력 있는 블로그 게시물을 통해 이 잊혀진 지표에 다시금 관심을 불러일으켰습니다.
00:00:49거의 모든 코드가 AI 에이전트에 의해 작성되는 요즘, 이 지표가 그 어느 때보다 중요해졌습니다.
00:00:55코드베이스에 숨겨진 문제들을 스캔하는 것이 중요하니까요. 정말 멋진 개념이니 오늘 영상에서
00:01:01더 자세히 알아보겠습니다. 본격적으로 시작하죠. 이게 왜 중요한지 알기 위해, 화면의 이 함수를 보겠습니다.
00:01:11이 함수는 복잡하게 중첩된 match 문을 사용하여 다단계 데이터 변환을 처리하며,
00:01:16몇 개의 루프와 수많은 예외 처리 경로를 포함하고 있습니다. 그래서 순환 복잡도(cyclomatic complexity)가 15 정도로 꽤 높은 편이죠.
00:01:24혹시 '순환 복잡도'라는 용어가 생소하신 분들을 위해 설명하자면, 이건 데이터가 코드를 통해
00:01:30얼마나 다양한 경로로 흐를 수 있는지 측정하는 간단한 방식입니다. if 문을 작성하거나,
00:01:36match, while 루프, 또는 catch 블록을 쓸 때마다 코드에 분기점이 생기게 됩니다. 분기점이 많을수록
00:01:43복잡도 점수는 올라갑니다. 그러면 인간의 뇌가 함수 내에서 발생할 수 있는 모든 결과를 파악하기가 더 어려워지죠.
00:01:51그래서 가능한 한 함수를 더 작은 작업 단위로 쪼개려고 하는 것입니다.
00:01:57지금 화면의 이 함수의 경우, 복잡도가 15라는 것은 이 로직이 시작부터 끝까지
00:02:04실행될 수 있는 서로 다른 경로가 15개 존재한다는 뜻입니다. 만약 이 함수가 단위 테스트로
00:02:09완벽하게 커버된다면, CRAP 점수는 15 그대로 유지됩니다. 복잡하긴 해도 안전한 상태죠.
00:02:16알렉산더의 도구인 CargoCrap을 실행하면 이런 결과를 기대할 수 있습니다. 여기 점수는 13이 나왔네요,
00:02:2315가 아니고요. 아마 라이브러리가 예외 처리 부분을 계산에 포함하지 않아서 그런 것 같습니다.
00:02:27뭐 어쨌든 15와 13은 꽤 근사치이니, 도구가 의도대로 작동하고 있는 셈입니다.
00:02:33그런데 만약 누군가 테스트 코드를 삭제하거나, AI 에이전트가 이 함수를
00:02:39처음부터 생성하면서 테스트 코드를 아예 쓰지 않는다면 어떻게 될까요? 일단 테스트 코드를 주석 처리해 보겠습니다.
00:02:45그리고 CargoCrap을 다시 실행하면, 점수가 갑자기 100을 넘어갑니다.
00:02:51이 도구는 순환 복잡도와 테스트 커버리지를 균형 있게 고려하여 위험을 계산하는 간단한 공식을 사용합니다.
00:02:57즉, 코드의 실행 경로 수와 테스트 커버리지를 대조하는 것이죠.
00:03:03이 함수를 보면, C는 함수의 순환 복잡도이고, COV는 0과 1 사이의 분수로 표현된
00:03:10테스트 커버리지입니다. 이 수식은 테스트가 부족한 복잡한 코드를 아주 엄격하게 페널티를 줍니다.
00:03:17커버리지가 100%라면 수식의 첫 번째 부분이 0으로 떨어지고,
00:03:23CRAP 점수는 단순히 순환 복잡도와 같아집니다.
00:03:26하지만 커버리지가 떨어지면, 수식 왼쪽의 삼승 지수 때문에 위험 점수가 치솟게 됩니다.
00:03:33복잡도가 10이고 커버리지가 0인 함수는 CRAP 점수가 110이나 됩니다.
00:03:39이는 좋은 현상입니다. 예를 들어, 만약 어떤 함수도 순환 복잡도가 5를
00:03:43넘지 않기를 바란다면, 이 지표를 기준으로 삼아 주의 깊게 지켜볼 수 있습니다.
00:03:49만약 어떤 함수가 5보다 높은 점수를 받는다면, 그곳이 바로 집중해야 할 부분이라는 걸 알 수 있죠.
00:03:55보통은 더 높은 복잡도를 허용하기도 합니다. CargoCrap의 기본값은 30으로 설정되어 있죠.
00:04:00하지만 본인의 기준에 맞게 이 지표를 설정할 수 있다는 점을 말씀드리는 겁니다.
00:04:05결론적으로 이건 주목할 만한 좋은 중간 단계 지표입니다.
00:04:09그리고 이 지표는 AI가 코드를 생성하는 시대에 더욱 중요해졌습니다.
00:04:13왜냐하면 AI 에이전트는 복잡하고 구문적으로 정확한 코드 블록을 엄청나게 잘 만들어내기 때문이죠.
00:04:20생각지도 못한 엣지 케이스까지 처리해 주지만, 명시적으로 강요하지 않는 이상
00:04:25의미 있고 강력한 통합 테스트 코드를 작성하는 데는 형편없거든요.
00:04:30그래서 CargoCrap 같은 도구는 단위 테스트를 모두 마친 후 전체 코드 품질을
00:04:37평가하기 위한 보조 검사 도구로 쓰여야 합니다.
00:04:39기본적으로 기술 부채에 대한 히트맵 역할을 하면서 리팩토링 시 가장 고장 나기 쉬운 코드를
00:04:44직접 가리켜 주는 셈이죠.
00:04:47또한 새로운 엔지니어를 팀에 온보딩해야 할 때 코드베이스를 잘 구조화된 상태로 유지하고 싶다면
00:04:52특히 더 도움이 될 것입니다.
00:04:56우리는 요즘 AI가 생성한 코드 때문에 코드베이스가 얼마나 엉망이 될 수 있는지 경험담을 통해 알고 있습니다.
00:05:02우리가 주의를 기울이지 않는다면 말이죠.
00:05:06가끔 AI 에이전트는 같은 함수를 여러 파일에 중복해서 생성하기도 합니다.
00:05:13그래서 저는 이런 도구들, 더 중요하게는 이런 방법론들을 잘 알고 있는 것이 현대적인 코딩 환경에서
00:05:19코드 품질을 높게 유지하는 데 매우 중요하다고 생각합니다.
00:05:24이 방법론을 만든 같은 저자들이 Java용 CRAP 지표 도구도 발표했습니다.
00:05:30솔직히 최근 알렉산더의 블로그를 읽기 전까진 저도 이 지표의 존재조차 몰랐습니다.
00:05:34그의 도구 덕분에 잊혔던 이런 엔지니어링 관행을 다시 알게 되어 감사합니다.
00:05:40다른 프로그래밍 언어들도 이런 도구를 갖추면 큰 도움이 될 거라 확신합니다.
00:05:44혹시 여가 시간에 재미있는 프로젝트를 만들고 싶으시다면,
00:05:48알베르토 사보이아의 원문을 읽어보고 다른 코딩 언어를 위한 도구를 한번 만들어 보세요.
00:05:53많은 개발자에게 정말 유용한 도구가 될 수 있을 테니까요.
00:05:57네, 여기까지입니다.
00:05:58한마디로 CRAP에 대해 알아보았습니다.
00:06:01말하고 보니 좀 웃기네요.
00:06:02어쨌든, 여러분이 아시는 다른 잊혀진 엔지니어링 관행이나 지표가 있다면 무엇인가요?
00:06:08새로운 에이전트 코딩 시대에 우리가 더 신경 써야 할 것들은 무엇일까요?
00:06:13아래 댓글 섹션에서 알려주세요.
00:06:15이런 기술적인 분석 영상이 좋으셨다면,
00:06:18영상 아래의 '좋아요' 버튼을 눌러 알려주세요.
00:06:21채널 구독도 잊지 마시고요.
00:06:24BetterStack의 Andrus였고, 다음 영상에서 뵙겠습니다.
00:06:28다음 영상에서 뵙겠습니다.

Key Takeaway

복잡한 코드의 위험도를 나타내는 CRAP 지표와 CargoCrap 도구를 활용하면 AI가 생성한 코드의 테스트 품질을 체계적으로 관리하고 기술 부채를 제어할 수 있습니다.

Highlights

  • CRAP(Change Risk Anti-Patterns Index) 지수는 복잡도는 높고 테스트는 부족한 위험한 함수를 식별하는 도구입니다.

  • 순환 복잡도가 15인 함수는 코드 실행 경로가 15개 존재함을 의미하며, 단위 테스트가 없으면 위험 점수가 급격히 상승합니다.

  • CargoCrap 도구는 Rust 코드에서 CRAP 점수를 계산하여 테스트가 부족한 복잡한 코드 구간을 찾아냅니다.

  • CRAP 점수 공식은 순환 복잡도(C)와 테스트 커버리지(COV)를 결합하여 커버리지가 낮을수록 위험 점수를 증폭시킵니다.

  • AI 에이전트는 복잡하고 정확한 코드를 생성하지만 단위 테스트 작성에는 한계가 있어 CRAP 지표와 같은 보조 검사가 필수적입니다.

Timeline

CRAP 지수의 개념과 목적

  • CRAP은 '변경 위험 안티패턴 지수'를 의미하며 코드 내 위험한 함수를 찾아냅니다.
  • 복잡도가 높으면서 테스트 커버리지가 낮은 코드는 유지보수 위험이 큽니다.
  • CargoCrap 도구는 Rust 환경에서 이러한 핵심 위험 함수를 자동으로 식별합니다.

알베르토 사보이아와 밥 에반스가 2007년에 고안한 CRAP 지표는 코드 복잡도와 테스트 상태를 결합하여 위험을 측정합니다. 최근 AI가 대량의 코드를 작성하는 시대가 도래하면서, 숨겨진 기술 부채를 식별하기 위한 이 지표의 중요성이 다시 부각되고 있습니다.

코드 복잡도와 위험 계산 방식

  • 순환 복잡도는 함수 내의 제어 흐름 분기점 개수를 통해 코드의 복잡도를 측정합니다.
  • 테스트 커버리지가 100%이면 CRAP 점수는 순환 복잡도 값과 동일해집니다.
  • 커버리지가 낮을수록 순환 복잡도의 삼승 지수가 적용되어 위험 점수가 비약적으로 상승합니다.

복잡도가 15인 함수가 테스트 커버리지를 갖추지 못하면 CRAP 점수는 100을 넘어설 정도로 위험도가 급증합니다. CargoCrap 도구는 이 공식에 따라 코드의 실행 경로 수와 테스트 커버리지를 대조하며, 사용자는 프로젝트의 기술 부채 허용치에 맞춰 기준 점수를 설정할 수 있습니다.

AI 시대의 코드 품질 관리 활용법

  • AI 에이전트는 코드의 논리적 구조는 잘 짜지만 단위 테스트 작성 능력은 부족합니다.
  • CargoCrap은 통합 테스트 후 전체 코드 품질을 평가하는 보조 검사 도구로 적합합니다.
  • 새로운 엔지니어 온보딩 시 코드베이스의 구조적 건전성을 유지하는 지표로 활용됩니다.

AI는 복잡한 구문을 정확히 구현하지만, 명시적 지시 없이는 신뢰할 수 있는 단위 테스트를 생성하지 못합니다. 따라서 CRAP 지표를 활용한 도구들은 기술 부채 히트맵 역할을 수행하며, AI로 생성된 코드의 중복이나 결함을 찾아내어 프로젝트의 지속 가능한 품질을 유지하게 돕습니다.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video