버그

An error, flaw, failure or fault in a computer program that causes it to produce an incorrect result.

— IEEE 전산 공학 표준 사전에서 규정하는, 시스템 설계 사양을 완벽히 비껴가 정상 구동을 방해하는 치명적인 결함의 수학적 정의

개발자의 미숙함과 기계의 매정한 냉혹함이 빚어낸 인류 최대의 디지털 흑역사이자, 오늘도 전 세계 스타트업과 대기업 개발진의 주말 저녁 치맥 파티를 사정없이 폭사시키는 영혼의 탈수기. 분명히 퇴근 5분 전까지 완벽하게 돌아가던 코드가, 배포 서버 런타임에 올라타는 순간 미지의 귀신에 홀린 듯 버그를 터트려 퇴근 도장을 뺏어가는 야속함(...)

1. 개요

컴퓨터 프로그램의 설계 사상이나 소스코드의 빈틈, 또는 부주의한 오타로 인해 소프트웨어가 개발자의 의도를 완전히 무시한 채 엉뚱한 연산 값을 뱉거나 시스템을 크래시 폭사시키는 논리적·기술적 결함. 1947년 역사적 포착을 계기로 전산 업계의 만국 공통 대명사로 박제되었다.

2. 물리적 벌레에서 디지털 악당으로

소프트웨어 결함을 '버그(Bug)'라 부르게 된 비결은 다분히 물리적인 역사에서 출발했다. 1947년 미국 하버드 대학교에서 하드웨어 컴퓨터 '하버드 마크 II' 시스템이 원인 모를 오작동 정지 상태에 빠지자, 여성 수학자이자 전설적인 제독 그레이스 호퍼가 원인을 집요하게 파고들었다. 범인은 컴퓨터 계전기(Relay) 진공관 철컥 스위치 사이에 끼어 죽어 있던 진짜 실물 나방 벌레였다. 그녀는 핀셋으로 이 나방 시체를 정교하게 꺼내 개발 일지에 셀로판테이프로 붙이고 '실물 버그가 포착되었다(First actual case of bug being found)'라고 적어 박제했다. 이때부터 컴퓨터의 결함을 고쳐나가는 전 과정을 벌레를 잡는다는 뜻의 디버깅(Debugging)이라 정립해 부르게 되었다.

3. 공포의 하이젠버그와 슈뢰딩거의 버그

개발자들을 가장 가혹하게 괴롭히며 도를 닦게 만드는 끝판왕 버그는 정직하게 매번 재현되는 버그가 아니다. 물리학의 불확정성 원리를 흉내 내어, 잡으려고 로그를 심거나 디버거 툴을 들이대는 순간 흔적도 없이 사라졌다가, 방심하고 운영 서버에 올리면 기습적으로 터져 나오는 기괴한 버그들을 하이젠버그(Heisenbug)라 부른다. 또한 평소에는 아무 문제 없이 1년 내내 조용히 돌고 있었으나, 우연히 소스코드를 보던 동료가 '어? 이 코드 구조면 여기서 널 포인터 에러가 무조건 터져야 정상인데?'라고 의문을 갖고 코드를 건드려 관측하는 순간 그 즉시 참사가 발동해 대참사가 터지는 기괴한 슈뢰딩거의 버그(Schrödinbug)까지 유령처럼 개발실을 배회한다.(...)

4. 관련 밈 및 드립

4.1. 버그가 아니라 의도된 기능(Feature)입니다

내가 고치기 귀찮거나 도저히 고칠 공임비가 안 나오는 끔찍한 게임 내 런타임 버그 오작동을, 고객 센터나 기획서에 우아하게 들이밀며 '이것은 버그가 아니라 고난도의 세련된 유저 몰입용 게임 물리적 기획적 기능(Feature)입니다'라고 뻔뻔하게 사기 치고 뭉개는 유구한 실무 책임 회피 드립이다. 오늘도 수많은 게임사들과 실무 코더들이 이 핑계를 대며 버그 패치 우선순위를 밑바닥으로 내팽개치곤 한다.(...)

5. 여담

  • 99개의 버그 노래: 전 세계 개발 전산실에서 내려오는 가장 유명한 자조적인 구전 가요이다. '벽에 걸린 99개의 버그, 하나를 잡아 패치했더니, 벽에는 127개의 버그가 기어 나오네.(...)' 하나의 버그를 고치면 사이드 이펙트로 또 다른 신종 버그 30개가 연쇄 발발하는 눈물겨운 종속성 파탄 상황을 절묘하게 노래한 명곡이다.
  • 가장 값비싼 버그 참사: 1996년 유럽 우주국의 아리안 5호 로켓이 발사된 지 단 37초 만에 공중분해당한 대참사는, 64비트 실수 소스 데이터를 16비트 정수형 메모리 변수에 구겨 넣다가 오버플로우가 터져 센서 계통이 마비되어 발생했다. 단 한 줄의 캐스팅 안전장치 부재가 무려 4,500억 원의 공중분해 자폭 비용을 지출한 눈물겨운 역사이다.
  • 테스트 코드의 구원: 이 버그들의 침공을 방어하기 위해 똑똑한 개발자들은 코드를 짜기 전이나 짠 후에 프로그램의 동작을 자동으로 기계가 검증하게 만드는 유닛 테스트(Unit Test) 방어막을 촘촘히 쳐서, 사후 빌드 타임에 버그가 새어 나가는 대참사를 조기에 예방한다.

6. 관련 문서