서론: 우주에서는 수리 기사를 부를 수 없다
지난 20부작 시리즈를 통해 컴퓨터 공학의 기초를 다졌습니다. 오늘은 그 이론들이 실제 현장, 그것도 실수가 용납되지 않는 극한의 현장에서 어떻게 적용되는지 보여드리려 합니다.
웹사이트가 다운되면 새로고침을 하면 됩니다. 게임이 멈추면 재접속하면 됩니다. 하지만 화성으로 가는 로켓의 코드가 멈춘다면? 수조 원의 세금이 증발하고 인명 피해가 발생합니다. 그래서 NASA 제트추진연구소(JPL)는 '절대 고장 나지 않는 코드'를 작성하기 위해 엄격한 '코딩 십계명(The Power of Ten)'을 만들었습니다.
오늘 특별 부록에서는 이 전설적인 규칙 중 핵심적인 3가지를 소개합니다. 여러분의 코드를 '우주급' 안정성으로 업그레이드할 비결입니다.
규칙 1: 모든 반복문에는 '한계'가 있어야 한다
우리는 보통 while(true) 같은 무한 루프를 자주 사용합니다. 하지만 NASA에서는 이것이 엄격히 금지됩니다.
- 금지: 조건이 맞을 때까지 계속 기다리는 코드. (만약 센서가 고장 나서 조건이 영원히 안 맞으면? 시스템은 영원히 멈춥니다.)
- NASA 방식: "조건이 맞거나, 10,000번을 시도해도 안 되면 멈춰라."
모든 루프에는 반드시 상한선(Upper Bound)이 있어야 합니다. 그래야 최악의 상황에서도 CPU가 갇히지 않고 다음 명령을 수행할 수 있기 때문입니다.
규칙 2: 힙(Heap) 메모리 사용 금지 (동적 할당 금지)
시리즈 12편, 13편에서 다룬 malloc(동적 할당) 기억하시나요? 놀랍게도 NASA의 미션 크리티컬 코드에서는 프로그램 시작 후에는 메모리 할당을 금지합니다.
이유는 두 가지입니다.
- 메모리 누수(Memory Leak) 방지: 빌린 걸 갚지 않는 실수를 원천 차단합니다.
- 파편화(Fragmentation) 방지: 메모리를 썼다 지웠다 반복하면 구멍이 숭숭 뚫려 성능이 저하됩니다.
그래서 우주선 코드는 필요한 모든 메모리를 출발하기 전에(초기화 단계에서) 미리 다 확보해 놓습니다. "비행 도중에는 절대 추가로 밥 달라고 하지 마라"는 뜻입니다.
규칙 3: 복잡한 재귀 함수 금지
10편에서 배운 재귀(Recursion)는 아름답고 수학적이지만, '스택 오버플로우'라는 치명적인 폭탄을 안고 있습니다.
우주 공간에서는 재귀가 언제 끝날지 100% 확신할 수 없습니다. 예측 불가능성은 공학의 적입니다. 그래서 NASA는 재귀 함수 대신 단순한 반복문(For loop)을 사용하도록 강제합니다. 코드가 조금 길어지고 멋이 없더라도, '예측 가능하고 안전한 코드'가 훨씬 가치 있기 때문입니다.
결론: 방어적 코딩(Defensive Coding)의 미학
NASA의 코딩 표준은 단순히 우주선을 위한 것이 아닙니다.
"내 코드는 언제든, 어떤 이유로든 실패할 수 있다"는 겸손한 태도를 전제로 합니다.
여러분이 웹 서비스를 만들든, 앱을 만들든 이 방어적 태도를 가진다면, 사용자는 여러분의 프로그램에서 단단한 신뢰감을 느낄 것입니다. 화려한 기능보다 중요한 것은, 결정적인 순간에 멈추지 않는 신뢰성이니까요.
이 글은 [NASA 과학자의 컴퓨터 공학 칼럼] 시리즈의 특별 부록입니다.
아직 1편을 안 보셨다면? 아래 링크에서 정주행을 시작해보세요!
[1편: C언어의 불멸성 다시 보기]