1990년대 애플은 시대가 바뀌었음에도 1984년에 처음 설계된 구식 맥 운영체제를 최신 사양의 애플 컴퓨터에 돌아가게 만들기 위해 고군분투하고 있었습니다. 하지만 모든 노력은 결국 수포로 돌아갔고 아이러니하게도 스티브 잡스가 애플을 떠난 다음 새로 설립한 'NeXT'에서 운영체제를 사오는 수모를 겪습니다. 이후 NeXT에서 개발한 NeXTSTEP 운영체제가 새로운 세대의 맥 컴퓨터를 구동하는 근간으로 자리잡게 됩니다.
애플은 1996년 12월 20일에 애플이 NeXT를 인수했으며 인수의 이유를 NeXT의 객체 지향 소프트웨어 개발 기술과 운영체제에 대한 노하우를 원했기 때문이라고 발표합니다. 그리고 이 거래의 조건으로 스티브 잡스는 다시 애플로 돌아오게 됩니다. 그 후 얼마 지나지 않아 스티브 잡스는 애플의 CEO 자리를 다시 차지하게되고 애플을 컨슈머 전자기기 시장의 거인으로 만들어 놓습니다.
정확하게 16년이 지난 오늘날까지도 NeXT에서 개발된 기술들이 OS X과 OS X에서 파생된 모바일 운영체제 iOS에서 사용되고 있습니다. 이번 주는 아직까지 애플의 최신 기기 속에서 유지되고 있는 NeXT의 유산에 대해 알아볼까 합니다.
유닉스(UNIX)
이 글을 작성하기 위해 우리는 NeXTSTEP과 OS X에 정통한 개발자 여러명에게 자문을 구했습니다. 이 개발자들은 한결같이 유닉스(UNIX)를 NeXTSTEP에서 OS X과 iOS으로 넘어온 기능 중 가장 결정적인 요소로 꼽고 있습니다. 매끄럽고 번드르르한 아이콘과 창, 스크롤 막대 그래픽 뒤로는 바위처럼 단단한 UNIX 운영체제가 자리잡고 있는 것입니다.
유닉스 운영체제는 1969년 AT&T사의 벨 연구소의 켄 톰슨(Ken Thomson)에 의해 개발된 운영체제로서 DEC의 PDP7 시스템 내에서 'MULTICS'를 구현하기 위한 소프트웨어 묶음으로 탄생하였습니다. 초기에는 PDP7 시스템의 어셈블리언어로 작성되었으며, 단일 사용자 환경만을 지원했지만 1970년에 톰슨과 톰슨의 동료 데니스 리치(Dennis Ritchei)가 유닉스 운영체제를 B 언어로 재작성을 하는 과정에서 다중사용자 환경이 지원되었으며, 하드웨어들간의 이식성을 높이기위해 C 언어로 1973년에 재작성되기에 이릅니다.
당시 육중한 크기를 자랑하던 컴퓨터를 구동하기 위해 유닉스가 사용되었는데 개발자들은 간단한 비디오 터미널 연결로 이 컴퓨터들을 프로그래밍하고 제어할 수 있었습니다.
여러분의 책상 위에 놓여져 있는 맥의 운영체제와 바지 주머니 속에 들어가 있는 아이폰이 운영체제도 알고보면 거대한 컴퓨터를 제어하던 유닉스와 근본적인 차이가 없습니다. 또 애플이 유닉스를 도입한 것 덕분에 맥 운영체제에서 보호 메모리 기능(protected memory)과 선제 멀티태스킹(pre-emptive multitasking), 데몬 기반의 서비스들을 사용할 수 있게 되었습니다.
클래식 맥 OS 시절에는 포토샵에서 플러그인 하나가 문제를 일으켜 맥 운영체제 전체가 멈춰버리거나, 특정 명령어를 사용하기 위해 메뉴바를 뒤적거리다 맥이 작동 불가능 한 상태에 들어가기도 했습니다. 보호 메모리 기능이 도입되면서 앱 하나가 시스템 전체를 전복하는 일이 방지되었고, 선제 멀티태스킹 기능이 도입되면서 어떤 프로그램 하나가 시스템의 특정 자원을 이미 점유하고 있더라도 (같은 자원을 사용해야하는) 다른 앱을 동시에 실행할 수 있게 되었습니다. 또 유닉스 기반의 운영체제는 백그라운드에서 상시 돌아가는 '데몬'이라는 프로그램을 사용할 수 있는데 이 때문에 여러분들이 네트워크로 연결된 프린터로 출력물을 뽑을 수 있고, 친구들과 아이폰으로 온라인 게임을 하는 중에 음악을 들을 수 있는 것입니다.
또한 OS X은 POSIX을 온전히 준수(Compliant)하는 운영체제 입니다.
'POSIX[포직스]는 유닉스 운영체계에 기반을 두고 있는 일련의 표준 운영체계 인터페이스입니다. 표준화에 관한 필요성은, 컴퓨터를 사용하고 있는 기업들이 다시 코딩하지 않고서도 다른 컴퓨터 회사가 만든 컴퓨터 시스템에도 운영할 수 있도록, 호환성이 있는 프로그램을 개발하기 원하는 데에서 기인했습니다. 유닉스는 제작자와 비교적 무관한, 중립적인 입장에 있었기 때문에 표준 시스템 인터페이스로 선정되었습니다. 그러나, 몇몇 주요 유닉스 버전들은 공통 분모에 해당하는 시스템을 개발해야할 필요가 상존하고 있습니다.'
OS X이 POSIX 규칙을 준수하고 있기 때문에 오픈소스 소프트웨어를 OS X에서 자유롭게 포팅하고 사용할 수 있습니다. 만약 POSIT 규칙을 준수하지 않았다면 애초 리눅스(Linux)용으로 개발된 FFmpeg 비디오/오디오 인코더가 Handbrake 앱에서 사용되는 것은 불가능했을 것입니다.
Objective-C
Objective-C는 원래 NeXTSTEP용 프로그램을 개발하기 위해 사용된 객체 지향의 프로그래그밍 언어였습니다. 그리고 이제는 OS X과 iOS용 앱을 개발하는데 이용되고 있습니다.
Objective-C는 C++와 달리 C 언어의 엄격한 상위집합입니다.(엄격한 상위집합이라는 말은 C프로그램을 모두 다 Objective C로 컴파일 가능하며, 프로그램의 의미도 양 언어가 동일하다는 의미입니다). 즉, Objective-C는 C 언어에 덮인 얇은 레이어로 볼 수 있습니다.
스티브 잡스는 객체 지향 언어의 열열한 지지자였으며, NeXT를 설립하면서 개발자들에게 객체 지향 언어로 프로그램을 개발할 것을 종용합니다. 객체 지향 프로그래밍 언어는 객체를 코드로 정의하면서 어떤 특성과 능력을 객체에 부여하게 됩니다. 개발자들은 이렇게 만들어준 객체들을 적당히 조합하고 연결할 수 있으며, 또 어떤 명령이나 메시지를 한쪽에서 다른 쪽으로 전달해 특정 작업을 완수할 수 있습니다. 이러한 과정에 있어 개발자들은 기저에 있는 프로그래밍 코드들을 이해할 필요가 없이 객체들이 실질적으로 어떤 메시지를 내보내고 또 이런 메시지에 객체들이 어떻게 반응할 지만 신경쓰면 됩니다.
('더하기'라는 객체가 있고 이 객체에 숫자 두 개가 담긴 메시지를 전송하는 것을 떠올려 보세요. 객체는 이 두 메시지의 합을 다시 돌려 줄 것입니다.)
물론 Objective-C 언어를 폄하하는 사람도 많습니다. 주로 스몰토크(Smalltalk) 스타일의 구문법이 너무 장황하다는 이유 때문입니다. 하지만 애플은 점 구문법(dot syntax)과 블럭(blocks), ARC(automatic reference counting)를 도입하는 등 Objective-C 코드 개선에 많은 노력을 기울이고 있습니다. 또 컴파일 코드 개선을 위해 전통적으로 C 언어를 컴파일하는데 사용되는 gcc도 Clang과 LLVM으로 대체되었습니다. (아래는 Object-C 언어로 작성된 아주 간단한 프로그램의 코드 입니다.)
스티브 잡스가 아직 NeXT에 근무하던 1995년, 잡스는 객체지향 언어 덕분에 소프트웨어 개발이 혁명적으로 변할 것이라고 한 언론사와 인터뷰한 적이 있습니다. 대부분의 개발자들은 당시 스티브 잡스가 남겼던 예견이 현실이 되었다는데 동감하고 있습니다.
NeXT 운영체제용 프로그램을 개발한 윌 쉬플리는 "Objective-C는 Java와 C# 탄생에 직적접인 영향을 주었으며, 대부분의 개발자들이 프로그램을 개발하는 방식에 변화를 주었습니다. 대상이 꼭 애플 기기가 아니라도 말이죠."라고 말하고 있습니다. 또 "NeXTSTEP과 함께 WWW(World Wide Web: 인터넷)의 발현을 목격할 수 있었습니다. 이건 단순한 우연이 아니었습니다. 프로그램을 개발하는데 있어 항상 꿈에 그리던 기기였죠"라며 말을 이었습니다.
쉬플리는 현재 OS X에서 실행되는 프로그램의 상당 수가 NeXT플랫폼에서 영감을 받았거나 아니면 직접 이식되어 온 경우가 많다고 소개했습니다. 이를테면 Numbers나 Keynote, Pages, OmniGraffle 말이죠.
앱킷 프레임워크(AppKit framework)
NeXT는 Objective-C 언어를 개발하는 한편 프로그램 개발에 사용되는 각종 객체들을 미리 만들어 놓아 개발자들이 앱을 개발할 때 곧바로 활용할 수 있도록 준비해 놓았습니다. 이런 객체들은 앱킷(AppKit) 프레임워크라는 하나의 커다란 묶음(Collection)에 포함되어 있는데, 앱킷 프레임워크는 OS X용 앱 개발을 위한 코코아(Cocoa) 프레임워크와 iOS용 앱 개발을 위한 코코아 터치(Cocoa Touch) 프레임 워크에 고스란히 적용되기에 이릅니다. 이런 프레임워크 덕분에 앱 개발에 필수불가결하다고 여겨지는 지루하고 반복적인 코딩 작업이 상당 부분 간소화되었고, 개발자들은 앱을 개발할 때 코딩 작업보다는 앱의 핵심 기능과 편의성 향상을 위해 보다 많은 시간을 투자할 수 있게 되었습니다.
코코아와 코코아 터치 프레임워크가 NeXTSTEP에 뿌리를 두고 있다는 것은 NSArray 객체처럼 양 프레임워크에 포함된 각종 객체들의 접두어가 NS가 붙는다는 사실에서도 쉽게 알아챌 수 있습니다.
'(기업이) 프로그래머들의 사기를 진작시키는 뭔가를 내 놓는 것은 항상 놀라운 결과로 이어집니다."라고 쉬플리는 설명하고 있습니다. "만약 애플이 2008년도에 아이폰 개발 툴킷(iOS SDK)을 내놓지 않았다면 현재의 아이폰이 과연 어떤 모습을 하고 있었을까요? 그건 그냥 아이팟이었을 겁니다. 잘 팔리기는 하겠죠. 하지만 우리의 삶을 바꿔놓는 물건은 되지 못했을 것입니다.'
쉬플리와 함께 '딜리셔스 몬스터(Delicious Monster)'를 개발한 마이크 리(Mike Lee)는 기기와 프레임워크, 사용자들로 연결되는 고리를 다음과 같이 설명하고 있습니다.
'앱킷과 코코아 프레임워크 덕분에 우리 개발자들은 사용자들과 대화하는 수준으로 기기들과 대화를 나눌 수 있습니다. 한 마디로 개발자들은 앱 사용자와 기기를 연결해주는 일종의 외교관인 셈입니다.'
인터페이스 빌더(Interface Builder)
NeXTSTEP 개발자들이 사용하던 개발 도구는 오늘날 인터페이스 빌더라는 이름으로 존재합니다. 그래픽 요소들을 끌어서 뷰 화면에 놓아주는 아주 간단한 작업만으로 개발자들이 앱의 사용자 인터페이스를 만들 수 있는 것입니다. 어떤 기능을 호출하는 버튼을 달고 싶다구요? 버튼을 하나 끌어다 뷰 화면에 넣어주시기만하면 됩니다. 사용자가 선택 가능한 항목들을 담고 있는 드롭 다운 방식의 목록를 만들어야 한다구요? 이 역시 클릭 한 번이면 됩니다.
인터페이스 빌더는 프로젝트 빌더와 따라오는 프로그램인데 이 두 개발 도구를 이용해 초보 개발자들도 무에서 앱의 그래픽 사용자 인터페이스(GUI)를 창조해낼 수 있습니다.
이 두 프로그램의 장점은 여기에만 있는 것이 아닙니다. 개발자 거스 뮐러(Gus Mueller)는 "아주 고가의 IDE(통합 개발 환경)를 공짜로 나눠주고 있는 셈이죠."라고 말했습니다.
인터페이스 빌더는 오랫동안 별도의 앱으로 존재하면서 NeXTSTEP과 OS X 용 프로그램을 개발하는데 사용되다 프로젝트 빌더와 통합되었고, 프로제트 빌더는 Xcode라는 이름을 바꿔 현재 개발자들사이에서 널리 사용되고 있습니다. 앞서 설명한 인터페이스 관련 기능과 함께 프로그래밍 코드를 분석하고 디버깅하는 기능이 추가되면서 맥과 아이폰, 아이패드, 즉 애플 기기용 소프트웨어를 개발하는데 필요한 모든 도구가 Xcode 하나에서 모두 제공되가에 이르렀습니다.
디스플레이 포스트스크립트(Display PostScript)
OS X과 iOS로 넘어온 NeXTSTEP의 유산이 모두 개발자만을 위한 것들은 아니었습니다. 일반 사용자가 볼 수 있는 가장 좋은 -하지만 그 형태는 많이 달라진-예는 디스플레이 포스트스크립트(Display PostScript) 입니다.
90년대 널리 사용되던 그래픽 사용자 인터페이스(GUI) 운영체제는 비트맵 이미지로 화면에 표시할 각종 창과 버튼, 텍스트 블록을 표시했습니다.
NeXTSTEP은 그래픽 요소들이 사전에 픽셀로 그려져 있는 비크맵 방식을 사용하지 않고 당시 어도비가 개발한 레이저 프린터 출력물을 구성하는데 사용되던 언어와 유사한 '포스트스크립트(PostScript)'로 그래픽 요소를 화면에 표시했습니다. 이는 곳 텍스트들과 요소들이 벡터 방식으로 그려져 그래픽 카드나 모니터의 종류, 화면 해상도와는 상관없이 항상 깨끗하고 선명하게 표시될 수 있다는 것을 의미했습니다.
OS X과 iOS에서는 쿼츠(Quartz)라는 기술이 사용되고 있지만 근본적인 작동 매커니즘은 NeXTSTEP에서 사용되는 기술과 큰 차이가 없습니다. OS X은 PostScript 대신 PDF 기반 언어가 사용되기 때문에 해상도와 하드웨어의 영향을 받지 않고도 각종 그래픽 요소를 화면에 선명하게 표시할 수 있으며 또 운영체제 자체적으로 PDF 파일을 아주 자연스럽게 열어보고 생성할 수 있는 장점이 있습니다.
번들(Bundles)
OS X과 iOS는 NeXTSTEP에서 내려져 온 번들 개념을 고스란히 사용하고 있습니다. 번들은 응용 프로그램이나 어떤 특정 파일 유형(확장자)을 구성하는 여러 파일을 담은 일종의 특수한 폴더입니다. 운영체제는 이런 번들 속에 담겨져 있는 파일과 폴더들을 그대로 꽤뚫어 볼 수 있지만 사용자단에서는 한 개의 아이콘이나 파일 하나로 보여지게 됩니다.
사용자가 가장 빈번하게 접하게되는 번들을 꼽으라면 응용 프로그램과 iWork 파일을 들 수 있습니다. 응용 프로그램 번들 속에는 프로그램이 실행되는데 사용되는 프로그래밍 코드와 함께 각종 그래픽 소스들과 아이콘, 설정 파일들이 저장되어 있습니다. 키노트 문서 번들도 내부를 들여다보면 바이너리 형식의 레이아웃 파일을 비롯해 그래픽과 폰트 파일, 템플릿 요소들이 포함되어 있으며, 이런 파일들이 한데 모여 키노트 프로그램 속에서 하나의 프레젠테이션으로 나타납니다. (파인더에서 번들 파일을 우클릭하면 번들 파일의 내부를 들여다 볼 수 있습니다.)
계층 보기(Column file browsing)
계층 보기도 NeXTSTEP에서 OS X으로 전해진 중요한 인터페이스 요소 중 하나입니다. OS X 이전의 맥 운영체제, 즉 클래식 맥 OS의 파인더에서는 아이콘을 격자로 배치하거나 특정 폴더 별로만 파일을 목록 형태로 볼 수 있었습니다. 애플은 이 두 가지를 파인더에 남겨두는 한편 계층별로 정렬된 폴더와 파일을 연쇄적으로 파들어갈 수 있는 계층 보기를 NeXTSTEP에서 차용해 왔습니다.
파인더의 계층 보기 모드를 활성화한 후 창 좌측에서 Macintosh HD나 문서(Document) 처럼 본원(本原)이 되는 폴더를 클릭하면 해당 폴더 속에 담겨져 있는 파일과 하위 폴더가 오른쪽 편에 펼쳐집니다. 여기서 또 다시 하위 폴더를 클릭하면 새로운 계층이 오른쪽에 펼쳐지며 그 속에 내용물들이 화면에 나타납니다. 이런식으로 복잡한 구조를 가지는 폴더나 디스크 드라이브 속을 한단계 한단계씩 탐험해 나갈 수 있습니다.
서비스(Services)
마지막으로 사용자들이 발견할 수 있는 NeXT의 유산은 OS X의 서비스(Service) 항목들입니다. OS X에서는 텍스트나 이미지 등을 선택한 후 보조 클릭을 하거나 메뉴바의 프로그램 명 > Services 메뉴를 통해 이 데이터에 어떤 일련의 작업을 적용해줄 것인지 선택할 수 있습니다.
예를 들어, 텍스트 편집기에서 텍스트를 선택한 후 사전에서 해당 텍스트를 검색하거나, 선택한 텍스트를 포함하는 새로운 이메일을 작성하거나, 선택한 텍스트를 트위터로 전송하거나, 아니면 텍스트를 OS X의 말하기 기능을 사용해 오디오 파일로 전환하고 이를 아이튠즈 보관함에 추가할 수 있습니다.
일부 서비스 항목들은 콘텍스트 메뉴(Contextual menus)에서 바로 사용할 수 있기 때문에 이미 접해본 사용자들이 많을 것이라 생각됩니다. 또 일부 서비스 항목들은 콘텍스트 메뉴가 아니라 특정 키보드 단축키 조합으로 사용할 수 있는 경우도 있습니다. 이를 테면 Command + Shift + 3 단축키로 화면을 캡쳐하는 것 처럼 말이죠. 또 텍스트를 세손가락으로 탭했을 때 나타나는 사전 조회 기능도 실은 서비스 기능의 일종입니다.
뒤를 돌아보고 앞으로 나아가다(Looking back, moving forward)
지금까지 설명한 기술들은 1980년대 후반에서 90년대 초반에 개발되었던 기술들입니다. (유닉스는 무려 1969년까지 거슬러 올라가야 합니다) 애플이 NeXT를 인수한지 16년이 지난 오늘날까지도 최신 애플 운영체제에 그 유산들이 남아 있고 아직까지도 사용자들에 의해 활발히 사용되고 있습니다.
영문 원본
• Ars Technica
같이 읽으면 좋은 글
• 애플 마우스의 역사
• 아이튠즈의 12년 역사를 다시 짚어보다
• 스티브 잡스와 관련된 자료와 영상을 체계적으로 수집하고 정리한 4가지 웹사이트
* 본문의 일부 기술적인 용어나 단락은 위키피디아의 설명으로 대체하거나 추가로 인용문을 달았으며, 또 매끄러운 번역을 위해 일부 의역 처리한 부분이 있을 수 있는 점 참고해 주십시오.