TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 26 READS

"타이프라이터가 아님": 반세기를 버틴 오류 메시지의 교훈

"타이프라이터가 아님": 반세기를 버틴 오류 메시지의 교훈
SOURCE IMAGE · HACKER NEWS

1990년대 유닉스 계열 운영체제에서 이메일을 보내다 보면 가끔 당혹스러운 오류를 만났다. 전에 메일을 주고받은 적 있는 상대에게 다시 보낼 때조차 확인 메시지 대신 이런 문구가 떴다. "550 mwichary... User unknown: Not a typewriter(사용자를 알 수 없음: 타이프라이터가 아님)". 사용자를 못 찾겠다는 것까지는 이해하겠는데, 느닷없이 "타이프라이터"가 왜 등장하는지는 도무지 짐작하기 어려웠다. 이 짧은 한 줄은 서로 무관해 보이는 네 가지 사정이 한 지점에서 겹치며 만들어진 결과였다.

대소문자와 중첩된 오류 처리

첫째 원인은 많은 개발자에게 익숙한 대소문자 문제였다. 메일 전송을 담당하던 sendmail은 초창기 관행에 따라 사용자 이름이 항상 소문자라고 가정했다. 그래서 "MWichary"는 조용히 "mwichary"로 바뀌었고, 이는 실제로 존재하지 않는 사용자였다. 문제는 프로그램이 "입력을 소문자로 바꿨더니 그런 사용자가 없더라"는 판단 과정을 보여주지 않고, 그저 최종 결과만 내뱉었다는 점이다.

둘째 원인은 오류 처리 루틴 자체의 메타 오류였다. sendmail은 "User unknown"이라고 정확히 보고한 뒤, 디버깅에 도움이 되라고 시스템이 반환한 오류 값을 반사적으로 덧붙였다. 평소라면 "Host is down(호스트 꺼짐)"이나 "No space left on device(장치에 공간 없음)"처럼 유용한 문자열이 붙었을 자리다. 터미널에서 이것저것 시도해 본 사람이라면 한 번쯤 봤을 법한 특유의 메시지들이다. 그런데 이 상황에서 딸려 나온 시스템 값이 하필 쓸모없는 것이었다.

타이프라이터라는 유물

"Not a typewriter"가 뜻하는 바는 사실 오류라기보다 상태에 가깝다. 대략 "이 프로그램은 백그라운드에서 돌고 있어서 사용자의 입력을 받거나 사용자에게 뭔가를 보여주도록 되어 있지 않다"는 의미다. 운영체제의 일을 조용히 처리하는 수많은 프로그램에 해당하는, 지극히 평범한 조건이다.

문구가 하필 "타이프라이터"인 것은 역사의 흔적이다. 초기 컴퓨터는 입출력 장치로 타이프라이터를 연결해 썼다. 어떤 것은 전면 패널, 즉 콘솔에 붙은 로컬 장치였고, 어떤 것은 원격 장치인 테레타이프라이터였다. 이는 teletype, 더 줄여 tty로 불렸다. 지금도 쓰는 용어라면 바로 그 흔적이다. 글자 하나하나가 비싸게 느껴지고 입출력 수단이라고는 타이프라이터뿐이던 시절, "내가 뭔가 할 만한 입출력 대상이 아니다"라는 뜻이 "타이프라이터가 아님"이라는 간결한 표현으로 굳었다. 그리고 그 문자열은 타이프라이터가 테레타이프, 화면 달린 터미널, 나중에는 터미널·콘솔 앱으로 대체된 뒤에도 수십 년을 더 살아남았다.

넷째 조각은 문법의 장난이다. 두 메시지를 콜론으로 이어 붙인 단순한 선택 탓에, 마치 "사용자가 타이프라이터여야 하는데 아니다"라는 뜻처럼 읽혔다. 각각은 멀쩡했던 조각들이 연결 방식 하나로 전혀 다른 문장이 되어버린 셈이다.

실무자가 가져갈 것

이 오류는 결국 리네임되었다. 오늘날 마주친다면 "Inappropriate ioctl for device(장치에 부적절한 ioctl)"라고 뜨며, 이는 분명 개선이다. 다만 내부 코드명은 여전히 ENOTTY로 남아 있다. 타이프라이터가 무엇이었는지 모두가 잊은 뒤에도 수십 년을 더 그 이름으로 불릴 가능성이 크다.

이 사례가 오늘의 소프트웨어에 던지는 질문은 분명하다. 하나는 프로그램이 최종 결과만 보여줄 것인가, 아니면 그 결과에 이르게 된 판단 과정을 드러낼 것인가 하는 문제다. 입력을 조용히 소문자로 바꾼 뒤 "없는 사용자"라고만 답하는 대신, 정규화 과정을 사용자에게 알렸다면 혼란은 크게 줄었을 것이다. 또 하나는 맥락 없이 하위 계층의 오류 값을 그대로 이어 붙이는 관행의 위험이다. 디버깅을 돕겠다는 선의가 콜론 하나와 만나 전혀 엉뚱한 의미를 만들어냈다. 마지막으로, 한번 쓰기 시작한 문자열과 식별자는 그 전제가 사라진 뒤에도 끈질기게 살아남는다는 점이다. ENOTTY는 레거시 명명이 어떻게 기술 부채가 아닌 화석처럼 굳는지를 보여준다. 참고로 이 글의 원제 "Traditional, but Puzzling"은 솔라리스 운영체제 매뉴얼이 이 오류를 설명하며 붙인 표현에서 왔다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://unsung.aresluna.org/traditional-but-puzzling/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...