
기술이 발전함에 따라 고객의 기대치도 그에 따라 높아집니다. 임베디드 디바이스는 점점 더 스마트해지고, 관련 시스템과 소프트웨어는 점점 더 복잡해지는 반면 개발 일정은 짧아지고 있습니다. 고품질 소프트웨어를 신속하게 개발하는 것은 제품의 성공을 위해 매우 중요합니다. 이 블로그에서는 일상적인 개발 과정에서 코드 품질을 개선하기 위한 체계적인 접근 방식에 대해 설명합니다.
코드 품질이란 무엇인가요?
코드 품질은 코드의 효율성을 측정하여 '좋은' 코드(높은 품질)와 '나쁜' 코드(낮은 품질)를 구분합니다. 코드 품질에 대한 단일 정의는 존재하지 않지만 일반적으로 몇 가지 메트릭을 통해 평가됩니다:
- 가독성: 가독성: 코드는 명확하고 이해하기 쉬워야 합니다.
- 신뢰성: 코드에는 결함이 거의 없어야 하며(이상적으로는 전혀 없어야 합니다).
- 테스트 가능성: 코드는 테스트하기 쉬워야 합니다.
- 재사용 가능성: 코드는 일관된 기능을 통해 재사용을 촉진해야 합니다.
- 유지 관리 가능성: 코드는 업데이트 및 유지 관리가 쉬워야 합니다.
- 확장성: 코드가 유연하게 기능을 추가할 수 있어야 합니다.
- 이식성: 코드는 다른 하드웨어 플랫폼으로 쉽게 이동할 수 있어야 합니다.
코드 품질을 개선하는 방법은 무엇인가요?
코드 품질을 개선하는 것은 일회성 작업이 아니라 지속적인 작업입니다. 다음은 몇 가지 효과적인 전략입니다:
- 코딩 표준을 따르세요: 여기에는 회사별 표준(예: 코딩 스타일 및 명명 규칙)과 업계 전반의 표준(예: MISRA, CERT 및 CWE)이 모두 포함됩니다.
- 정적 코드 분석: 선택한 코딩 표준을 준수하는지 확인하고 시행합니다.
- 단위 테스트: 흔히 기능 테스트라고도 하는 단위 테스트는 코드가 디자인에 부합하는지 확인하고 코드 기능의 정확성을 보장합니다.
- 코드 검토: 코드 검토는 개발자 간의 협업을 강화하고 코드의 논리적 문제를 확인하는 데 도움이 됩니다.
- 버전 관리 사용: 버전 관리를 사용하여 코드 변경 내역을 관리하고 팀 협업을 촉진하며 빌드의 반복성을 유지하는 데 도움을 줍니다.
- CI/CD 채택: CI/CD는 빌드, 분석 및 단위 테스트를 자동화하여 개발 프로세스를 간소화하는 동시에 빌드 반복성을 향상시킵니다.
일상적인 개발에서 코드 품질을 개선해야 하는 이유는 무엇인가요?
일상적인 개발 단계에서 코드 품질을 개선하면 버그를 조기에 발견하고 수정할 수 있어 수정 비용을 크게 줄일 수 있습니다. 다음은 Capers Jones의 저서 '응용 소프트웨어 측정'에 나오는 버그 삽입, 탐지 및 버그 수정 비용에 대한 그림입니다: 생산성 및 품질에 대한 글로벌 분석"에 나오는 그림입니다. 이 그림에서 두 가지가 매우 두드러집니다:
- 대부분의 버그는 일상적인 개발(코딩) 단계에서 발생한다는 점입니다.
- 버그가 일찍 발견될수록 수정이 쉽고 수정 비용이 낮아지며, 반대로 버그가 늦게 발견될수록 수정이 어렵고 수정 비용이 높아집니다.
버그를 늦게 발견하면 결함으로 인해 소프트웨어 릴리스 지표가 왜곡되기 때문에 비용이 더 많이 듭니다. 버그를 늦게 발견할수록 릴리스 지표를 달성하기 위해 시스템에 더 많은 테스트를 수행해야 합니다. 따라서 일상적인 개발(코딩) 단계에서 코드 품질을 개선하면 코드에 처음 주입되는 결함의 수를 줄일 수 있을 뿐만 아니라 다른 버그를 가능한 한 빨리 발견하는 데 도움이 됩니다. 이러한 코드 품질의 두 가지 장점은 프로젝트의 소프트웨어 버그 비용을 획기적으로 줄여줍니다.
일상적인 개발에서 코드 품질을 개선하는 방법은 무엇인가요?
코드 품질을 개선하는 일은 처음에는 어렵게 느껴질 수 있지만, 품질 도구를 사용하면 그 과정이 훨씬 쉬워집니다. 다음은 코드 품질을 빠르게 개선하는 데 도움이 되는 몇 가지 팁입니다.
빌드: 오류 0건, 경고 0건
빌드 중 오류, 경고 0개를 달성하는 것은 매우 중요합니다. 오류는 빌드에 실패하지만 경고는 빌드에 실패하지는 않지만 잠재적인 숨겨진 버그를 나타낼 수 있습니다.
다음은 일반적인 컴파일러 경고입니다. 비교 연산자 ==는 할당 연산자 = 대신 사용해야 합니다:
수정 후 다시 빌드하세요: 0 오류, 0 경고:
정적 코드 분석
오류 0, 경고 0으로 성공적으로 빌드한 후에는 정적 코드 분석을 수행할 것을 적극 권장합니다. 정적 코드 분석은 개발자가 일상적으로 코딩할 때 흔히 빠지는 함정이 코드에 있는지 확인합니다. 또한 품질 도구를 사용하는 경우 정적 코드 분석은 간단합니다.
IAR 임베디드 워크벤치에서는 먼저 해당 C-STAT 검사를 선택하기만 하면 됩니다:
그런 다음 C-STAT을 사용하여 전체 프로젝트에 대해 정적 코드 분석을 수행할 수 있습니다:
C-STAT을 사용하여 단일 파일에 대한 정적 코드 분석을 수행할 수도 있습니다:
분석이 완료되면 해당 C-STAT 메시지 창에 해당 결과가 표시됩니다. 해당 정보를 두 번 클릭하면 소스 코드에서 해당 위치를 확인할 수 있습니다:
IAR C-STAT 도구의 또 다른 편리한 기능은 상황에 맞는 도움말입니다. C-STAT 메시지 창에서 위반 사항 중 하나를 강조 표시하고 F1 키를 누르면 위반 사항에 대한 자세한 정보를 확인할 수 있습니다. 여기에는 위반에 대한 자세한 설명, 이 위반을 나열하는 코딩 표준, 심각도/확실성 매트릭스, 그리고 가장 중요한 것은 버그가 코드에서 어떻게 보이는지, 버그를 수정하기 위해 해당 예제를 수정하는 방법을 보여주는 예제가 포함됩니다. 이와 같은 예제가 있으면 자신의 코드에서 문제를 더 쉽게 분리하고 수정할 수 있습니다:
상황에 맞는 도움말의 정보를 사용하여 코드에서 4u를 (int32_t) 4로 변경해야 한다고 추측합니다. 변경이 완료되면 정적 코드 분석을 다시 수행합니다. 이전 위반 사항이 수정되었습니다:
Google의 사례 연구와 ACM에서 발표한 사례 연구에 따르면 코드 피드백을 받는 것도 실제 피드백 자체만큼이나 중요하다고 합니다. 피드백이 즉각적으로(또는 거의 즉각적으로) 제공되면 개발자는 해당 피드백을 74%는 해결해야 할 문제로 간주합니다. 피드백이 지연된 경우(예: 야간 빌드의 일부로 인해) 그 비율은 21%로 떨어집니다. 저자들은 코드의 '생존자 효과', 즉 문제가 실제로 버그임을 인정하는 것이 릴리스 지표에 해로운 영향을 미치기 때문이라고 생각합니다. IAR C-STAT을 사용하면 개발자가 코드를 데스크 체크하는 동안(즉, 빌드 프로세스에 들어가기 전에) 이러한 버그를 찾아서 수정할 수 있으므로 릴리스 지표의 관점에서 버그가 발생하지 않은 것처럼 보이게 할 수 있습니다.
단위 테스트
정적 코드 분석은 코드가 관련 코딩 표준을 준수하는지 여부만 확인할 수 있고 코드의 기능을 테스트하려면 단위 테스트가 필요하므로 정적 코드 분석 후에는 단위 테스트를 수행할 것을 적극 권장합니다.
IAR 자체는 단위 테스트 도구를 제공하지 않습니다. IAR에는 이러한 단위 테스트 도구를 제공하는 다양한 파트너가 있습니다. 때때로 결함은 런타임 중에 모듈이 서로 호출하는 동안에만 나타날 수 있습니다. 이러한 상황을 테스트하기 위해 IAR C-RUN 런타임 검사를 사용하면 유닛 테스트 중에 잠재적인 문제를 발견할 수 있습니다.
IAR 임베디드 워크벤치에서 해당 C-RUN 런타임 검사 규칙을 선택하기만 하면 됩니다:
리빌드 후 컴파일러는 잠재적인 오류가 발생할 때마다 해당 테스트 코드를 자동으로 삽입합니다.
실행 시 C-RUN은 코드가 삽입된 검사에 실패하면 이를 감지합니다. 예를 들어, 다음 C-RUN 메시지는 액세스 범위를 벗어난 위반이 있음을 알려줍니다:
해당 배열의 크기는 4이지만 [4]는다섯 번째 배열 요소를 나타냅니다. 이로 인해 액세스 범위 초과 위반이 발생합니다. 코드를 수정한 후 테스트를 다시 실행하여 코드가 위반 없이 실행되는지 확인할 수 있습니다:
코드 검토
단위 테스트 후에는 동료에게 코드 검토를 요청하는 것이 좋습니다. 코드 검토의 효율성을 높이기 위해 오류 0개, 경고 0개로 빌드하고, 정적 코드 분석을 수행하고, 단위 테스트를 실행한 후에 코드 검토를 수행하는 것이 좋습니다. 휴먼 리뷰는 가장 비용이 많이 드는 코드 테스트 유형이므로 앞서 언급한 모든 테스트를 통과한 제대로 검증된 코드에 대해서만 이 테스트를 사용해야 합니다.
CI/CD
코드 검토 후에는 자동화된 빌드, 정적 코드 분석 및 단위 테스트를 수행하기 위해 CI/CD를 위해 코드를 서버에 업로드하는 것이 좋습니다.
IAR은 명령줄을 통해 자동 빌드, 정적 코드 분석, 다운로드 및 디버깅(단위 테스트용)을 수행할 수 있는 해당 자동화 도구인 IAR 빌드 도구를 제공합니다:
결론
코드 품질 트렌드를 일찍이 받아들인 기업들이 개발자의 생산성을 높이는 동시에 프로젝트를 적시에 예산 범위 내에서 제공할 수 있는 방법을 입증하면서 코드 품질에 대한 관심이 고객들에게 점점 더 보편화되고 있습니다. 하지만 모든 사람이 이러한 모범 사례를 발견한 것은 아닙니다:
- 일부 회사는 최종 제품 테스트에만 전적으로 의존하고 정적 코드 분석, 단위 테스트 및 코드 리뷰의 가치를 인식하지 못합니다.
- 일부 회사는 매우 우수한 정적 코드 분석 및 단위 테스트 도구를 구입했지만 안타깝게도 개발자가 일상적인 개발 과정에서 이러한 도구를 완전히 사용하지는 않습니다. 대신 소프트웨어 QA 팀에 이러한 테스트를 떠넘기거나(모든 결함이 릴리스 지표에 포함됨), 소프트웨어 릴리스 이후에야 전체 프로젝트에 대해 정적 코드 분석 및 단위 테스트를 수행합니다.
- 일부 기업에서는 불필요한 번거로움이라고 생각하여 아직 CI/CD를 배포하지 않은 경우도 있습니다. 하지만 개발자의 시간은 매우 소중하기 때문에 기업은 빌드, 정적 코드 분석 및 단위 테스트를 자동화하여 개발자가 최대한 빨리 피드백을 받을 수 있도록 최선을 다해야 합니다.
이 블로그에서는 개발자가 일상적인 개발 과정에서 코드 품질을 개선할 수 있는 방법을 소개하기 위해 IAR 임베디드 워크벤치 및 IAR 빌드 도구(C-STAT 정적 코드 분석 및 C-RUN 런타임 검사 포함)를 예로 사용합니다. 블로그에 소개된 IAR 임베디드 워크벤치 및 IAR 빌드 도구(C-STAT 정적 코드 분석 및 런타임 검사 포함)는 도구의 예일 뿐이며 블로그의 접근 방식은 다른 도구에도 적용 가능하다는 점에 유의하시기 바랍니다.
해당 도구를 선택하는 것도 중요하지만 더 중요한 것은 개발자가 일상적인 개발 과정에서 선택한 도구를 최대한 활용하여 코드 품질을 개선해야 한다는 것입니다. 대부분의 버그는 일상적인 개발(코딩) 단계에서 발생하기 때문에 버그가 일찍 발견될수록 수정이 쉽고 수정 비용도 낮아지며, 반대로 버그가 늦게 발견될수록 수정이 어렵고 수정 비용도 높아집니다.
다음 단계로 넘어가기
고급 개발 솔루션으로 임베디드 프로젝트를 개선하세요. 살펴보기 Arm용 IAR 임베디드 워크벤치, IAR 빌드 툴를 살펴보고 다음을 통해 코드 품질을 보장하세요. C-STAT 정적 코드 분석 및 C-RUN 런타임 검사.