[번역] The Unix Philosophy: A Brief Introduction
1. 들어가며
굉장히 오랜만에 쓰는 포스트다. 마지막 포스트부터 10일 넘게 지났는데 내가 처음에 한 약속을 지키지 못했다. 그동안 알고리즘 때문에 시름에 잠겨 있었다. 요즘 Codewars에서 문제를 풀고 있는데 랭크가 올라가면서 문제의 난이도가 급상승했다. 난이도가 높아지면서 그냥 수학문제들이 많이 등장하는데 이 부분은 아직 약하다. 동적계획법 수준으로도 해결이 안 될 정도로 입력이 크다는 등의 애로사항이 꽃피는 등 쉽지 않다. 그래서 주눅이 들었는데 그래도 내가 할 수 있는 부분에서 조금씩 해결해나가고 있다.
오늘 하려고 마음 먹은 것은 Linfo에서 관리하고 있는 ‘The Unix Philosophy: A brief Introduction’에 대한 번역이다. 이 사이트는 리눅스, 리눅스와 관련된 소프트웨어에 대한 방대한 문서를 아카이빙하고 있다. 유닉스를 좋아하는 한 사람으로서 유닉스를 관통하고 있는 핵심 철학들에 관심이 있다. 그래서 관련 정보를 찾아보다가 이 페이지를 알게 되었고 내용을 번역하기로 마음 먹었다. 번역을 하되 내 나름대로 중요하다고 생각되는 부분에 하이라이팅 등의 구조화 액션을 가했고 번역의 측면에서도 직역도 있지만 상황에 따라 적절히 의역을 하기도 했다.
여기에는 유닉스 관련 OS를 조금이라도 써본 사람들은 공감할 내용들이 많이 있다. 또 유닉스가 개발될 당시의 역사적인 맥락 정보 등이 있어 퍽 흥미롭다. 간만에 번역작업에 손댔는데 시작해보도록 하자.
2. [번역] 유닉스의 철학: 간략한 소개
유닉스의 철학 은 켄 톰슨이 1969년 Bell Labs에서 개발한 태초의 유닉스의 핵심(core)뿐 아니라 솔라리스, BSD, Linux 등 다양한 후예와 클론들에게서도 뿌리를 두고 있다. 이 철학은 이 모두를 집합적으로 ‘유닉스 같은(Unix-like)’ 운영체제로 일컬어지게 만들었고, 가장 오래되었고 널리 쓰이고 있음에도 지금까지도 개발되고 있는 최고의 운영체제로 널리 알려지게 했으며, 리눅스의 빠른 성장과 계속된 성공에 크게 기여했다.
이 철학을 정의하는 단일하고 표준화된 서술은 없다. 하지만 만약 단 하나의 단어로 묘사되어야 한다면 그 단어는 모듈성(modularity)일텐데 이는 시스템이 여러 구성요소(모듈)로 구성되고 이들이 함께 조합되고 다양한 방법으로 배열될 수 있음을 나타낸다.(이 포스트의 로고 이미지는 사실 이를 반영한 것이다, 역자 주)
모듈성은 자연에 흔하고 인간이 만든 제품(재화와 서비스 모두)에 그것을 적용한 것은 산업사회의 발전의 핵심적인 요소였다. 그렇지만, 유닉스의 개발 전까지는 모듈성이 컴퓨터 소프트웨어 영역에서는 거의 적용되지 못했으며 심지어 오늘날까지도 이런 위대한 장점이 다른 운영체제에서 완전히 빛을 발하고 있지는 않은데 대표적으로는 마이크로소프트의 윈도우즈가 그런 면이 있다.
모듈성이라는 단어와 별개로 좀더 길고 더 관습적이지만 같은 의미를 담고 있는 유닉스의 철학에 대한 설명은 ‘프로그램이 오직 단일 작업만을 하게 하고, 대신 그것을 잘하게 하라. 그리고 다른 프로그램과 함께 잘 작동하도록 하라’ 가 될 것이다.
이 철학은 흔히 일련의 여러 간략한 규칙이나 교리로 서술된다. 이들은 모두 일반적으로 모듈성의 개념(e.g. 작은 크기, 효율성, 간단한 인터페이스와 쉬운 이해)을 논리적으로 따르고 있지만, 이들을 개별적으로 서술하고 토론하는 것은 유용할 수 있다.
이 교리들 중 소위 구성의 규칙(Rule of composition)이라고 불리는 규칙이 있다. 이 규칙은 모듈성을 지원하는 운영체제에 속한 프로그램들은 다른 프로그램과 쉽게 연결될 수 있도록 설계되어야 한다고 서술한다. 다른 규칙으로는 침묵의 규칙(Rule of silence)이 있는데 프로그램들은 기본적으로 흥미롭거나, 특별하거나 놀라운 내용을 담지 않는 메시지는 출력하지 않아야 한다고 서술한다.
모듈성의 원칙을 ‘유닉스 같은’ 시스템에 있는 모든 것들(프로그램뿐 아니라 프로그램의 부분인 알고리즘, 또는 심지어 운영체제의 핵심인 커널)에 적용하려는 진지한 노력이 시도되고 있다. 그러므로, ‘유닉스 같은’ 운영체제는 일반적으로(최소한 개념적으로) 작은 커널과 함께 서로 간에 다양하고 잘 정의된 인터페이스로 상호작용할 수 있는 다수의 작고 전문화된 프로그램들로 구성된다.
이러한 인터페이스 중에서 가장 친숙하고 유닉스에 있어 가장 중요한 혁신은 pipe(이하 ‘파이프’)이다. 사용자가 입력하는 명령어 안에서 수직의 바로 표현되는(‘|’) 파이프는 프로그램들을 조합해서 한 프로그램의 출력이 다른 프로그램의 입력이 될 수 있도록 한다. 이러한 명령어의 파이프라인(pipelines of commands) 은 비모듈화된 시스템에서는 어렵거나 사실상 불가능해보이는 매우 전문화된 동작(operations)을 쉽게 수행할 수 있게 한다.
유닉스의 철학 교리 중 또 중요한 것은 이진 파일(완전히 사람이 읽지 못하는) 대신에 평문(사람이 읽을 수 있는 알파벳, 숫자 같은 글자들)을 최대한 프로그램이나 설정 파일의 입력과 출력으로 사용하라는 것이다. 이것은 평문이 보편적인 인터페이스(universal interface) 이기 때문에 프로그램들이 텍스트 입력과 출력으로 쉽게 상호작용할 수 있는 반면, 상호 호환되지 않는 이진 형식의 파일로는 인터페이스의 난이도가 높고, 또 이런 평문 파일이 인간이 쉽게 접근할 수(interfaced) 있기 때문이다. 인간이 쉽게 접근할 수 있다는 의미는 이런 파일들을 새로운 플랫폼(다른 운영체제와 하드웨어의 조합)으로 포팅(porting, 다시 말해 수정)하기 쉬울 뿐 아니라 인간이 공부하고 수정하고 향상시키고 확장하기에도 용이하다는 것을 의미한다.
유닉스의 철학이 유닉스 같은 운영체제들을 더 효율적으로 만들고 사용하기 쉽게 할 뿐만 아니라, 이 시스템들의 개발과 향상 또한 촉진한다. 작고 전문화된(모듈화된) 프로그램을 사용하는 것이 크고 다기능의 프로그램을 사용하는 것보다 개발자가 그것들을 더 쉽게 향상시킬 수 있게 하기 때문이다. 한 이유로는 더 작은 프로그램들이 충분히 작고 단순하면 단일한 한 인간이 이해할 수 있는 반면 크고 복잡한 프로그램은 일반적으로 그렇지 않기 때문인 것도 있다. 이것은 또한 이런 전문화는 모든 자원이 한 곳 또는 소수의 영역에 집중되는 것이 아니라 넓게 산개되어서도 개발될 수 있게 해서 개발이 실용적이 되게 하기 때문이기도 하다.
2.1. 역사적 맥락
유닉스의 철학은 최대한 간단하고 효율적인 운영체제를 만들자는 유닉스의 원래의 설계 목표를 넘어섰다. 이 목표는 톰슨이 기존의 운영체제들의 불필요한 복잡도라고 제대로 파악한 것들에 대한 대응이었다. 이런 복잡도는 다양한 종류의 컴퓨터에서 사용될 수 있는 표준화된 운영체제가 없고, 대신 각 컴퓨터 생산회사들이 자신들의 하드웨어에 맞는 개별적인 운영체제를 개발했던 당시의 시대상황과 관련이 있다.
톰슨이 최대의 단순성과 효율성을 원했던 또다른 중요한 요인은 그가 처음에 작성한 운영체제가 메인 메모리가 4000 18-bit words밖에 안 되는 극도로 작은 컴퓨터에서 사용하기 위함이었다는 것이다. However, this was considered quite adequate when the computer was built in 1965, especially given its low cost, of only U.S.$72,000 for a basic model.(이 부분이 정확하게 해석이 안 된다)
비록 수십년 동안 지속적인 메모리 비용의 하락과 CPU의 성능의 향상으로 인해 유닉스 같은 운영체제의 크기와 복잡도가 매우 증가하기는 했지만, 원래의 단순성의 유산은 살아숨쉬고 있고, 유닉스 같은 운영체제들은 윈도우즈 같은 다른 대부분의 시스템보다 여전히 훨씬 더 모듈적이다.
마이크로소프트와 비교했을 때 1990년대부터 시작된 유닉스의 시장점유율 감소는 때때로 유닉스가 자신의 유용성을 소진한 오래되고 투박한 시스템이라는 인식이 원인인 것으로 칭해질 때도 있다. 그러나 이런 감소는 사실 유닉스의 철학이나 운영체제 자체의 고유한 결함 때문도 아니고, 어떠한 마이크로소프트 시스템의 고유한 우월성 때문도 아닌 것으로 드러났다. 오히려, 이것은 유닉스의 철학이 소프트웨어를 수학이나 과학적 지식처럼 대하던 다른 시대를 위해 설계된 결과였다. 즉, 그때는 소프트웨어는 기업 이윤의 증대를 위해 비축되는 무언가가 아니라 개인의 이익을 위해 공유되고 향상되던 무언가였던 것이다.
그러므로 이 철학을 버리기보다는 그것을 기반으로 하는 시스템들이 새로운 환경에서 다시 번영하고 성장할 수 있도록 하는 무언가 추가적인 것이 필요했다. 이 추가적인 것은 free software licensing 이라는 개념의 형태로 등장했는데 이 개념은 소프트웨어를 금전적인 측면에서만 무료(free)로 하는 것이 아니라 또한 사용의 측면(복사, 수정, 확장, 재배포를 포함)에서도 자유롭게(free) 한다. 이런 시대적 맥락 속에서 특히 중요한 것은 copyleft 의 개념의 개발이었다. Copyleft는 비싼 하드웨어의 사용을 필요로 하는 지배적인 버전의 등장을 막고, 혁신을 막지 않고 다양한 버전간 호환성을 증진하려는 시도였다. 결과는 유닉스 같은 시스템들과 그들과 함께 사용할 어플리케이션 프로그램을 대중에 통째로 공개할 수 있는 소유권의 재반환과 순차적으로 이어진 기술 발전의 재부흥이었다.
2.2. 상업 시스템(proprietary system)과 대조하여
유닉스 철학은 마이크로소프트 윈도우즈 운영체제의 철학과는 명백히 매우 다르다. 사실, 이 시스템들은 서로 정반대의 품질들을 특징으로 한다. 매우 근본적으로 말해서, 윈도우즈는 단일체이다.(monolithic, 다시 말해 모듈성의 부족) 구체적인 다른 특징은 다음을 포함한다.
- 매우 큰 프로그램의 크기
- 소스코드의 굉장한 복잡도
- 명백한 장인정신의 부족(예를 들어 보안 이슈 등)
- 투명성의 부족(소스코드가 비밀로 보호되고 있다.)
- 이동성(portability)의 부족(기본 프로세서 종류에서만 작동한다.)
소스코드(source 또는 code라고도 일컬어 진다.)는 소프트웨어(보통 어플리케이션이나 운영체제)의 버전이며 이것들은 원래 인간에 의해 평문으로 쓰여진다.(또는 컴퓨터에 타이핑된다) 그리고 C, C++, Java, Perl, PHP, Python, Tcl/TK와 같은 어떠한 다양한 프로그래밍 언어로도 작성될 수 있다.
이런 날카로운 대조의 원인에는 마이크로소프트 윈도우즈와 다른 상표의(상업적인) 소프트웨어가 다른 시대에 기원을 두고 있고 매우 다른 우선순위의 집합에 지배되고 있다는 설명만이 자연스럽다. 다시 말해, 시장점유율을 확대하거나 유지하고 이윤을 최대화하는 데만 중점을 두고 있고 유닉스 개발자들의 원래의 우선순위에는 거의 관심을 두고 있지 않다는 것이다. 또, 매우 다른 개발 모델(중앙화 대 분산화된 개발) 또한 일조하고 있는 것 같기도 하다.
물론, 이런 시장에 중점을 둔(market-oriented) 목표에 문제가 있는 것은 아니다. 사실, 이런 목표는 지난 천년간 전 세계에서 벌어진 엄청난 경제적 성장에 큰 기여를 했기 때문에 일반적으로 유익하다. 그러나 경제학자들이 지적해 마지 않듯이, 이런 시장 중심 목표는 오직 자유 경쟁(많은 판매자와 구매자가 가격과 품질을 바탕으로 경쟁하는) 이 존재하는 사회에서 최대의 효과를 낼 수 있고 시장이 어떤 이유에서든 독점화된(monopolistic, 대체재 없는 제품의 단일 공급자나 판매자로 특징지어지는) 곳에서는 그 효과를 볼 수 없다.
최대의 공정성을 기하기 위해, 다양한 유닉스 같은 운영체제들도 항상 완전하게 그들의 이상화된 철학을 적용하지는 못했다는 것을 언급해야겠다. 어떤 면에서는, 이러한 목표들은 옆길로 새려는 경향이 있지만 개념의 고유한 미덕으로 인해 다시 원 위치로 돌아온다는 점에서 조금 민주주의를 닮기도 했다.
2.3. 상업화된(proprietary) 유닉스를 넘어서
유닉스과 그 철학의 대단한 성공은 Bell Labs에서 개발된 원 운영체제와 순차적으로 University of Califonia at Berkeley(UCB)에서 개발된 운영체제를 넘어 훨씬 먼 곳에까지 영향을 미쳤다. 아마 가장 중요하게도, 이것들은 리눅스의 근간을 구성하는데 리눅스는 현재 가장 빠르게 성장하는 운영체제이고 많은 컴퓨터 전문가들이 미래의 많은 어플리케이션을 위한 지배적인 시스템이 되리라고 예상하고 있다.
리눅스는 유닉스의 철학의 장점을 주류로 돌려놓고 유닉스 같은 운영체제들 전체를 free software licensing을 통해 이전의 리더십의 위치로 회복시켰다. 또한 리눅스의 성장의 근본에는, 다른 free software의 성장세를 포함해서, 전세계의 개발자들의 협업을 가능하게 한 인터넷이 있다. 이는 시장(playing field)을 평준화하고 free software가 대량의 재정적 자원을 등에 업은 상업 제품들과 효율적으로 경쟁하는 데(어쩌면 심지어 상업 소프트웨어 개발 모델을 위협하는 데) 크게 이바지했다.
사실, 프로그래머들(그리고 테스터와 일반 사용자들)이 지리학적 위치나 조직의 멤버십과 관련 없이 개발 프로세스에 참여할 수 있다는 것과 free software licensing의 사용은 유닉스의 기본 철학(모듈성)을 한층 확장했으며 더 많은 혜택이 생기도록 했다.
운영체제와 더불어, 유닉스 철학은 인터넷의 빠른 개발과 놀라운 성공에 주도적인 역할을 했다. 이는 네트워크가 기반으로 하는 뛰어난 운영체제를 제공하는 것뿐만 아니라 높은 정도의 robustness(error-prone의 반대말 정도로 보면 된다, 역자 주), 확장성, 성능에 큰 기여를 하는 하드웨어, 소프트웨어 두 영역 모두에서의 모듈성의 가치를 증명함으로써 가능했다.
3. 마치며
유닉스의 철학에 대한 간단한 인트로 페이지에 대한 번역을 마쳤다. 생각보다 오래 걸렸는데 마치고 나니 뿌듯하다. 이 페이지는 생각보다 꽤 유용하다. 그래서 편하게 한 번씩 볼 것을 권유한다. 내 개발 정신에도 좋은 영향을 미쳤다.
번역 실력이 부족해서 분명 모자란 부분이 있을 것이다. 정확히 어떻게 해석해야 할지 몰라서 타협 아닌 타협을 해서 번역하기도 했고 매우 적지만 특정 절을 생략한 부분도 있다. 너른 이해 부탁드린다. 그리고 읽으면서 문장 자체에 비문이나 오타가 있으면 지적해주시면 바로 수정할 수 있겠다.
이상 포스트를 마칩니다.