모든 것의 출발은 코드 품질입니다.
대부분의 기업들은 제품의 품질, 그리고 제품을 사용하는 고객의 경험이 지니는 중요성에 동의할 것입니다. 그렇지만 그와 마찬가지로 중요한 것, 그리고 경우에 따라서는 그보다도 더 중요한 것이 있으니 바로 제품을 적시에, 그리고 가능한 최소한의 비용으로 출시하는 것입니다. 불가능해 보일 수도 있는 일이지만, 꼭 그런 것도 아닙니다. 이러한 목표를 동시에 달성하는 방법이 있으니, 바로 코드의 품질에 집중하는 것입니다. 그렇다면, 왜 코드 품질이 이렇게 중요한 것일까요? 사실 여기에는 몇 가지 이유가 있습니다.
코드 품질을 높이기 위한 노력을 지속적으로 기울임으로써, 정식 빌드에까지 이러한 결함이 섞여 들어가 디버깅에 몇 날 며칠을 허비하기 전에 결함을 빠른 시간 내에 격리시킬 수가 있습니다. 뿐만 아니라 적절한 소프트웨어 엔지니어링 원칙을 따르는 코드의 품질을 높이게 되면 코드의 유지 관리도 한결 수월해집니다. 이는 그 만큼 하자도 적고, 또 확장도 한결 수월하기 때문입니다. 이는 기존에 작성한 코드를 재사용할 수 있다는 것을 의미하며, 이를 통해 다음 프로젝트에서는 시간을 절약할 수 있습니다.
우수한 코드 품질을 달성함으로써 기대할 수 있는 또 하나의 장점은 보안을 위한 기준을 수립할 수 있다는 것입니다. 만일 코드 상에 버그가 포함되어 있고, 이것이 해커에게 이용당할 수가 있다면, 이러한 버그를 반드시 수정하고, 어플리케이션을 조작의 위험을 최소화하는, 안전한 방법으로 업데이트 하지 않으면 안 됩니다. 하지만 이보다 훨씬 더 좋은 전략은 버그가 처음부터 어플리케이션 내에 섞여 들어가지 않도록 적절한 코딩 표준을 준수하는 것입니다. 만일 적절한 코딩 표준을 따랐다는 것을 입증하실 수 있다면, 어플리케이션이 필요로 하는 안전 인증을 받는 것도 그만큼 수월해집니다.
미래에 대비하는 건강한 코드
미래에 대비하는 코드라는 것은 두 가지 측면에서 생각할 수 있습니다. 하나는 코드를 미래의 프로젝트에 다시 사용하는 것입니다. 여기서 한 가지 흥미로운 점은 대부분의 소프트웨어 견적 모델에서는 전체 소프트웨어 유지보수 작업 중에서 수정 대상 소프트웨어를 이해하는 과정이 차지하는 비중에 절반에 이른다고 주장하고 있다는 점입니다. 물론, 코드가 복잡해질수록, 이해하기가 힘들어지기는 합니다. 또한 프로젝트의 규모가 커질수록 기존에 자기가 해 놓은 작업을 다시 이해하기 위해 골몰하는 데에 소요되는 시간을 줄일 수가 있을 것입니다.
두 번째 측면은 코드의 품질을 높여, 소프트웨어가 오랜 시간 동안 정상적으로 운용될 수 있도록 하는 것입니다. 이는 소프트웨어 상에 결함이 없도록 하거나, 가급적 결함이 없는 상태에 근접하도록 하는 것을 의미합니다. CERT, CWE, MISRA와 같은 코딩 표준은 나름의 규칙을 정해, 공통적으로 나타나는 문제점을 개발자가 피할 수 있도록 해 주는 한 편, 숨겨진 버그의 수를 줄이고, 코드의 가독성을 높이는 방향으로 코드를 작성할 수 있도록 해 줍니다. 이를 통해 코드를 파악하기가 더 쉬워지고, 관리성도 좋아지는 것입니다. 이렇게 코딩 표준을 준수하여 개발하게 되면 건강할 뿐 아니라 효율성을 겸비한 코드를 작성할 수 있습니다. 다행스럽게도, 코드 검사 및 코드 표준 부합 점검을 통해 이러한 목표를 달성할 수 있도록 도와주는 도구가 존재합니다.
코딩 모범 규준 준수를 통한 기능적 안전성 인증 달성
코딩 표준은 소스코드 작성 중 개발자가 이상한 내용을 작성하지 않도록 방지해 주며, 이를 통해 코드의 전반적인 품질을 높이는 데에 도움을 줍니다. 뿐만 아니라 기능적 안전성 인증 어플리케이션을 개발한다고 할 경우, 최소한 통계적 분석 기법을 반드시 사용해야 하며, 대부분의 표준에서는 런타임 분석도 함께 수행할 것을 권고하고 있습니다.
C와 같은 언어에서는 정의되지 않은 행동이 다수 존재합니다. 따라서 컴파일러에 따라 개발자가 작성한 코드를 다르게 해석할 수도 있으며, 따라서 컴파일러 별로 반응이 달라지는 악몽과 같은 상황에 직면할 수도 있습니다. 이는 특히 회사에서 코드의 크로스 컴파일링을 요구할 시 더욱 심각해지는 문제입니다. 코딩 표준은 해당 언어로 여태껏 경험해 보지 못한 미지의 영역으로 분기가 이루어질 때 개발자가 이를 파악할 수 있도록 해 줍니다. 이를 통해 코드를 다시 표준 방식으로 작성하여, 컴파일러 종류 별로 달리 발생할 수 있는 문제를 미연에 방지해 줍니다. 결함의 발생 비율을 낮추어 주는 점 외에도, 코딩 표준은 개발자가 코드를 작성할 시 오류의 발생 위험이 높은 방식, 또는 코드의 가독성이 떨어지는 방식으로 작성하지 않도록 해 줍니다. 자동화된 코드 검토 및 시험 보고서 작성을 통해 사용자의 개발 조직 성숙도 입증할 수 있고, 개발자의 결과가 반복 가능하며, 하자의 탐지 및 수정을 위한 프로세스도 갖추고 있음을 보일 수 있습니다. 결론적으로 안전상 중요성이 높은 어플리케이션을 작업하고 있는 경우, 우수한 코드 품질 달성은 절대적인 필요 조건이 되는 것입니다.
코드 품질을 통한 보안 기준점 확보
민간 고객에서 입법 당국에 이르기까지, 커넥티드 제품 분야에서 보안 수준 개선을 요구하는 목소리가 날로 높아지고 있습니다. 효과적인 보안성 확보를 위해서는 제품의 초기 기획 단계에서부터 보안 설계를 반영하여야 하며, 제품의 사용이 완전히 중지될 때까지 계속해서 작동해야 합니다. 그래야 고객은 물론, 개발 주체도 보호를 받을 수 있습니다.
제품의 보안성은 어떻게 확보할 수 있을까요? 제목으로 다시 돌아가 봅시다. 모든 것의 출발점이 코드 품질이라는 말은 보안 부문에서도 그대로 적용됩니다. 보안에 있어 한 가지 중요한 부분은 공격에 노출될 수 있는 면적 자체를 줄이는 것입니다(attack surface). 그리고 이를 위해서는 최종 제품에 반영되는 코드가 우수한 품질을 유지하고, 어플리케이션의 실행 시 어떠한 일이 벌어지고 있는지를 개발자가 파악하고 있는 것이 필요합니다. SEI CERT C 코딩 표준에서는 C 프로그래밍 언어에서 보안성을 갖춘 코드를 작성하는 데에 필요한 규칙을 제공하고 있으며, 이러한 규칙의 준수 여부를 관리하는 데에 필요한 도구도 나와 있습니다.
정적 분석과 런타임 분석 모두 취약성을 발견하고, 이를 통해 반드시 취약성을 발견 및 제거할 수 있는 양질의 코드 개발하는 데에 있어 필수적인 활동입니다. 이러한 규칙 및 권고 사항의 목적은 정의되지 않은 반응을 제거해 정의되지 않은 프로그램 반응 및 공격 가능한 취약성의 발생으로 이어지지 않도록 하는 등의 방식으로 안전하고 신뢰할 수 있으며, 보안성을 갖춘 시스템을 개발하는 것입니다. 코드의 품질을 유지할 수 있는 좋은 프로세스가 정립되면, 개발자의 프로세스에 효과적인 보안 조치를 추가하는 과정 역시 한결 간편해지고, 이러한 노력을 들여 기대할 수 있는 효과도 크게 높아질 것입니다.
통합 코드 분석툴을 통한 손쉬운 코드 품질 관리
코딩 표준을 사용하게 되면, 양질의 코드를 작성하게 될 수밖에 없습니다. 이로 인해 코드가 한 결 안전해지며, 보안성도 더 높아집니다. 코딩 표준은 또한 소프트웨어 개발 주기 중 테스트 및 수정 과정에 들어가는 시간도 줄여준다는 장점이 있습니다.
그렇다면, 코딩 표준을 쉽게 시행할 수 있는 방법에는 무엇이 있을까요? 가장 빠른 방법은 통합 코드 분석 도구를 사용하는 것입니다. 이와 같은 도구는 개발자가 코드 상에서 가장 빈번하게 발생하는 결함을 찾아내는 데에 도움을 줄 뿐 아니라, 개발자가 코드를 작성하는 단계에 서는 미처 생각하지 못하는 문제를 찾는 데에도 도움이 됩니다. 모든 개발자가 일일 업무의 일환으로 코드 품질 점검을 실시하게 되면, 기업은 좀 더 일찍 문제를 발굴해 낼 수 있게 되며, 프로젝트 일정은 물론 최종 완제품에 가해지는 파급 효과 역시 최소화시킬 수가 있습니다. 통합 코드 분석툴은 개발자가 자신의 코드를 완전하게 통제할 수 있도록 해 줌과 동시에 개발 과정, 그리고 전개 과정에서 코드의 품질을 높일 수 있도록 해 줍니다. 그와 동시에 제품의 품질을 확보하고, 고객이 긍정적인 체험을 하도록 하는 데에 집중합니다.
작성: Tora Fridholm
This article is part of a series focusing on the importance of code quality.