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다음 영상에서 뵙겠습니다.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video