10. C언어의 아버지, 데니스 리치의 일생

자기가 만든 프로그래밍 언어로 운영체제를 개발한 사람.

1999년 데니스 리치의 집.

“Inferno가 자바와 경쟁하기에는 역부족인가?”

당시 데니스 리치 Inferno 운영체제Limbo라는 프로그래밍 언어 개발에 참여하고 있었다.

“따르릉”

“클린턴 대통령이 우리에게 National Medal of Technology 을 준다고? 축하해 톰, 귀찮게도 워싱턴에 가야할이 생겼네.”

켄 톰슨: “우리 너무 상을 많이 받는 거 아닌가?”

데니스 리치: “그러게, 난 사실 튜링상을 받은 것 만으로 만족스러운데..”

데니스 리치가 이렇게 과학자로서 성공하게 된 배경에는 벨연구소에서 연구원으로 일했던 아버지 영향을 많은 받은 듯 보인다.

1940년대 벨연구소

데니스 리치: “아빠는 무슨일을 해?”
아버지(Alistair E. Ritchie): “글쎄다. 아빠는 switching circuit theory을 연구하는데, 넌 아직 이해하기 어렵겠구나.”

“디지털 회로를 만들려면 많은 switch가 필요하지. 아빠는 지금 그에 관한 책을 쓰고 있단다.”

10여년 후,

데니스 리치: “아빠, 하버드 대학 합격증을 받았어요.”

아버지: “축하한다. 그래 물리학을 공부할지 수학을 공부하지 결정했니?”
데니스 리치: “글쎄요. 둘다 너무 재미있어서 당장은 결정하기 어려울 것 같아요.”

“수학도 좋고 물리학도 재밌고.”

1960년 경,

“컴퓨터?”
컴퓨터 특강! 마크I으로 컴퓨터 프로그래밍을 배우세요. 문의: …

“컴퓨터를 이용하면 수학계산을 빨리할수 있겠는걸?”

컴퓨터 특강 시간

데니스 리치는 이 당시 Univac 컴퓨터로 프로그래밍을 배웠는데, 아날로그 컴퓨터, 펀치 카드 사용법을 배우고 나서야 비로소 디지털 컴퓨터를 배웠다[2].

물리학과 학부 학생임에도 불구하고 데니스 리치는 컴퓨터에 더 많은 흥미를 갖기 시작한다.

교수: “자네는 물리학과 학생인데, 논문 주제가 전산 이론이….”
데니스: “결국, 수학에 관한 내용입니다.”

대학원 논문 주제도 지금의 전산학에 관한 내용(hierarchies of recursive functions)이였다. 대학에서 전산학이 제대로 된 학문으로 자리 잡기 전의 일이라서 아마도 응용수학으로 이러한 논문을 쓴 것 같다.

데니스 리치는 이론 보다는 실용적인 측면에 관심이 많았고, 3년 동안 그가 수강했던 컴퓨터 특강의 강사가 되어 컴퓨터를 가르쳤다[2].

 

데니스 리치가 컴퓨터를 가르칠 때는 IBM 7094를 사용했다[2].

1967년 벨연구소

벨연구소 연구원: “오, 자네가 리치의 아들인가?”
데니스 리치: “네, 저를 기억하시는군요.”

켄 톰슨: “안녕 데니스! 벨 연구소에 온 것 을 환영하네.
우리 팀은 다른 회사와 함께 멀틱스라는 새로운 운영체제를 공동 개발하고 있는데, 관심있나?”
데니스: “새로운 운영체제라고요? 재미있을 것 같아요.”

켄 톰슨: “그게 쉽지 않아. 특히, 여러 회사가 공동개발할때는…”

1969년 벨 연구소

데니스: “이제라도 멀틱스 프로젝트에서 빠지게 된 것은 다행이네요.

그런데, 전화 요금 계산에 필요한 운영체제는 이제 어떻게 만들까요?”
켄 톰슨: 걱정마, 내가 새로운 운영체제를 하나 만들고 있는데, 관심있어?”

데니스: 새로운 운영체제?

톰 켄슨은 멀틱스에서 몇가지 아이디어를 가져오고 만들던 코드를 기반으로 새로운 운영체제를 만들고 있었다.

1972년 벨 연구소

유닉스 개발 당시 PDP-11으로 컴퓨터가 업그레이드되었는데, 명령어가 호환되지 않아서 다시 어셈블리 코드를 작성해야했다. 데니스 리치는 톰 켄슨과 함께 개발한 B언어로 유닉스를 다시 개발하려는 시도를 한다[3].

켄 톰슨: “지금 뭐해?”
데니스: “우리가 예전에 만든 B언어로 유닉스를 다시 짜려고 하는데, 쉽지 않네. 아무래도 B언어를 많이 고쳐야할 것 같아.”

당시 B언어는 PDP-11의 최신 기능을 활용하지 못했는데, 이를 수정해서 C언어라는 이름으로 재탄생한다. 그리고, 1972년 유닉스를 다시 C언어로 개발했다[4].

“흐흐 더 이상 어셈블리어로 코딩을 하지 않아도 되네.”

“흐뭇~” “와 C언어 대박인데!”

유닉스와 C언어는 벨 연구소 내에서 사용되었고, 1975년 부터 외부에 라이센스되어 판매되기 시작했고, 대학과 각 기관에 보급되었다. 또한, HP, Sun Microsystems과 같은 회사에서도 유닉스 코드를 기반으로 한 자체 운영체제를 만들기 시작하면서 사실상 업계 표준으로 자리 잡기 시작한다.

C 프로그래밍 언어 책을 쓰다.

벨 연구소에 일하던 브라이언 커니핸은 새내 교육용으로 B언어 튜토리얼를 작성했다. 이후, B언어가 C언어로 업그레이드 되면서 자연스럽게 C언어 튜토리얼도 작성하게 된다.

브라이언 커니핸: “데니스, 내가 쓴 C튜토리얼 기억하지? 이걸 책으로 만들면 어떨까? 자네가 도와주면 더 좋고.”
데니스 리치: “좋은 생각인데!”

책표지, 이미지 출처: 위키피디아 (링크)

C 프로그래밍 언어 책은 1978년 첫판이 출간되었고, 1988년 2판이 출판되었다. 20개 언어로 번역되었고, 90년대까지 전산학을 전공한 학생이면 대부분 이 책으로 C언어를 공부했다.

분산운영체제 Plan9

“흠.. 유닉스 이후에는 어떤 운영체제를 만들어야 하나?”

벨 연구소는 유닉스의 후속으로 80년대 중반부터 Plan9이라는 운영체제를 개발하기 시작한다.

데니스 리치는 이미 Computing Techniques Research 부서를 이끌고 있었는데, 이 때 부터는 실제 개발 보다는 조언자로서 개발에 참여한다. 본인 말로는 급여를 승인하는 업무를 했다고 하는데, 일부 코드를 작성했음을 시인하기도 했다[5].

Plan9은 벨 연구소 내부에서 유닉스를 대치하시 시작했지만 외부에서 고객을 찾기는 쉽지 않았다.

벨 연구소는 1990년대 부터 네트웍 장비에 사용할 목적으로 Inferno라는 운영체제와 Limbo라는 프로그래밍 언어를 개발하기 시작한다. 다양한 네트웍 장비에 동작을 하기 위해 가상 기계를 도입했는데, Sun에서 개발한 Java와 비슷한 부분이 많았다.

동료: “선마이로시스템에서 Java를 발표했는데, Inferno와 비슷해. VM기반으로 동작하고.”
데니스: “응, 들었어.”

벨연구소장: “데니스, Plan9과 마찬가지로 Inferno도 세일즈 마켓팅팀에서 노력했지만 고객을 많이 찾지는 못했네. 아무래도 프로젝트를 다른 회사에 넘겨야겠어.”
데니스: “인수할 회사가 나타나서 다행이네요.”

데니스 리치가 개발에 참여하고 조언을 했음에도 불구하고 벨 연구소가 유닉스 후속으로 개발한 Plan9과 Inferno는 시장에서 성공적이지 못했다. 마케팅의 실패 등 여러가지 이유가 있겠지만, 근본적으로 유닉스가 여전히 쓸만했기 때문에, 다른 OS를 도입할 이유를 찾기 어려웠다. 여기서 에릭 레이먼드는 본인이 쓴 책에서 Plan9를 예로 들면서 이러한 말을 남겼다[6]

“야심적인 시스템 설계자를 위한 교훈이 있습니다. 새로운 솔루션의 가장 위험한 경쟁자는 충분히 좋은 기존 코드 베이스입니다(There is a lesson here for ambitious system architects: the most dangerous enemy of a better solution is an existing codebase that is just good enough).”

Plan9에서 나온 /proc, utf8, clone 등 몇 가지 아이디어는 다른 유닉스와 리눅스에 적용되기도 했다.

2007년 은퇴

팀원: “은퇴하게 되어 너무 아쉬워요.”
데니스: “드디어 은퇴군, Plan9과 Inferno가 성공스럽지 못해서 좀 아쉽지만, 이제 좀 여행을 즐겨야겠어.”

동료: “요즘 건강은 어때? 지난번 전립선 암 수술 이후, 너무 말랐어.”
데니스: “ㅎㅎ 걱정마. 아직까지도 흥미로운게 너무 많아.”

동료:” 데니스하고 통화가 안되는데, 아무래도 집에 가봐야겠어.”

죽음

“이봐 데니스!”

혼자 살고 있던 데니스 리치는 2011년 10월 12일 뉴저지 주 버클리 헤이츠에 있는 집에서 숨진채로 발견되었다[1].

“이렇게 큰 일을 했는데, 이 친구 너무 조용하게 살았어.”
“그래도, 자기가 만든 프로그래밍 언어로 운영체제까지 만든 사람은 아무도 없을거야…:”

참고문헌

[1] 데니스 리치, 위키피디아 한글페이지
[2] Interview with Dennis Ritchie
[3] https://en.wikipedia.org/wiki/C_(programming_language)
[4] https://en.wikipedia.org/wiki/Unix
[5] 데니스 리치 홈페이지: https://www.bell-labs.com/usr/dmr/www/chist.html
[6] http://www.catb.org/esr/writings/taoup/html/plan9.html

본 만화에 나오는 대화는 실제 대화가 아니고 사실을 기반으로 하여 약간의 상상력으로 구성한 것임을 알려드립니다. 혹시 만화 내용 중 틀린 부분이 있으면 답글로 알려주시면 감사하겠습니다.

9. 유닉스 철학

IT 기술은 하루가 다르게 변화 발전해왔다. 하지만, 유닉스 만큼은 만들어진 40여년이 지났지만, 그 철학과 코드는 유닉스를 모태로 한 운영체제에 살아있다.

안드로이드에서 사용되는 리눅스 커널과 아이폰과 맥에서 사용되는 맥OS도 그 중 하나이다.

이 외에 유닉스 호환 운영체제인 미닉스도 유닉스의 설계 철학을 따라 만들어졌다. (더 자세한 가계도는 위키피디아를 참고)

“어떻게 유닉스는 지금까지도 사용되고 있을까?”

그 해답을 찾기 위해서는 유닉스 철학을 알필요가 있다. 물론, 처음 유닉스를 만들때는 거창한 철학 이런거는 없었다.  굳이 물어본다면,

“간단하고 멍청하게 하자” [1]

“아니, 농담이 아니라 진짜 철학을 설명해주세요.”

“그냥 만들었는데…”

켄 톰슨(Ken Thompson)으로 부터 유래된 유닉스 철학은 최소화되고 모듈화된 소프트웨어 개발 방식에 대한 개발 문화의 기준과 철학적 접근 방식을 말한다. 이는 유닉스 선두 개발자들이 얻은 경험을 근간으로 하고 있다[1].

“그래도 잘 모르겠네.”

공식적으로는 1978년 더글러스 맥클로이(Doug McIlroy)에 의해 문서화되었다[1].

  1. 각 프로그램이 하나의 일을 잘 할 수 있게 만들 것. 새로운 일을 하려면, 새로운 기능들을 추가하기 위해 오래된 프로그램을 복잡하게 만들지 말고 새로 만들 것.
  2. 모든 프로그램 출력이 아직 잘 알려지지 않은 프로그램이라고 할지라도 다른 프로그램에 대한 입력이 될 수 있게 할 것. 무관한 정보로 출력을 채우지 말 것. 까다롭게 새로로 구분되거나 바이너리로 된 입력 형식은 피할 것. 대화식 입력을 고집하지 말 것.
  3. 소프트웨어를, 심지어는 운영 체제일지라도 이른 시기에 수주에 걸쳐 이상적으로 시도해가며 설계하고 만들 것. 어설픈 부분을 버리고 다시 만드는 것을 주저하지 말 것.
  4. 프로그래밍 작업을 가볍게 하기 위해, 심지어 우회하는 방법으로 도구를 만들고 바로 버릴지라도 어설픈 도움 보다는 도구 사용을 선호할 것.

그리고 나중에서 피터 사루스(Peter H. Salus)가 다시 한번 요약하였다.[2]

  • 한가지를 일만 잘 하는 프로그램을 만들 것.
  • 다른 프로그램 함께 동작할 수 있는 프로그램을 만들 것.
  • 텍스트 스트림을 처리할 수 있는 프로그램을 만들 것. 왜냐면, 그것이 범용 인터페이스이기 때문이다.

이처럼, 유닉스는 마치 레고 블록 처럼 프로그램간의 입출력을 서로 연결해서 내가 원하는 기능을 쉽게 만들도록 하였다. 무엇보다도 어셈블리어가 아닌 C언어와 같은 고급 언어(high level language)로 만들어져 다른 컴퓨터로 이식이 쉬웠다.

“물론, 또 다른은 이유가 있는데, 그것은 불법복제? 이 이야기는 기회가 되는데로 나중에 이야기하기로…”

“비밀” (유닉스 소스코드가 담긴 테이프)

[1] https://ko.wikipedia.org/wiki/유닉스_철학
[2] https://en.wikipedia.org/wiki/Unix_philosophy

8. 유닉스와 C언어

1960년대 MIT에서 ITS(Incompatible Timesharing System)가 한창 개발되고 있는 동안, 미 동부의 다른 곳에서도 해커의 기운이 물씬 풍기는 곳이 있었는데, 바로 벨 연구소(AT&T Bell Laboratories)였다. 여기서 앞으로 세상을 바꿀 유닉스와 C언어가 개발되고 있었다.


공교롭게도 멀틱스(Multics) 개발에 참여하던 사람들이 나와  ITS와 유닉스를 만들기 시작했는데, 벨연구소 소속인 켄 톰프슨데니스 리치도 멀틱스 개발에 참여하고 있었다.

켄톰슨: 이제 멀틱스 개발에 손을 떼야할 것 같아. 데니스리치: 예상 보다 일정이 지연되고 있어.

멀틱스 프로젝트는 1964년 시작되었으나 코드 크기가 커지고 복잡도가 높아지면서 벨연구소에서 예상했던 것 보다 일정이 많이 지연되고 있었다.

벨연구소: 우리는 내부 일정을 맞추기가 어려워 프로젝트에서 손을 땝니다.
결국, 벨연구소는 1969년 멀틱스 개발에서 손을 뗀다.

벨연구소에 돌아온 톰 켄프슨은 멀틱스 개발 경험을 토대로 새로운 운영체제를 혼자 만들기 한다.

톰켄슨: 데니스, 내가 새롭게 운영체제를 만들고 있는데, 멀틱스에 좀 아이디어를 가져오고 좀 더 단순하게 만들어 보려고. 데니스: 좋은 생각인데, 나도 관심있어.

톰 켄프슨은 멀틱스에서 개발한 주요 기능을 유닉스에서 다시 구현했다.

우선 멀틱스에서 미리 구현해 본 파일 시스템을 PDP-7에 적용했고, 데니스 리치도 개발에 참여했다. 개발이 어느 정도 궤도에 오르자, 팀이 꾸려지고 이들은 파일시스템, 프로세스 모델, 디바이스 파일, 커맨드 라인 해석기 등, 오늘날 우리가 사용하는 운영체제 기능을 PDP-7에서 처음으로 구현하기 시작했다.

그후, PDP-11이 도입되었는데, 유닉스는 어셈블리어로 개발되어 다시 코드를 짜야했다.

데니스: 켄, PDP-11이 새로 들어왔는데, 여기에 유닉스를 포팅하면 어떨까? 켄톰슨: 좋은 생각인데, 문제는 어셈블리어 코딩을 다시 해야한다는 거지.

켄톰슨: 드디어 포팅 끝~~~ 데니스: 이봐, 톰 매번 새 컴퓨터가 나올 때 마다, 매번 코드를 다시 짤 수는 없잖아

켄톰슨: 그래, 데니스 우리 B언어로 유닉스를 다시 만들어볼까? 데니스: 좋은 생각인데, PDP-11정도면 B언어로 유닉스를 포팅할 수 있을거
B언어는 1969년 역시 켄 톰프슨과 데니스 리치가 함께 멀틱스에서 사용하기 위해 개발한 프로그래밍 언어였다.
데니스 리치: 우선 B언어를 PDP-11에 포팅해야 하는데 문제가 있네.

1971년 데니스 리치는 B언어에 문자 타입을 추가하고 컴파일러를 다시 작성해서 PDP-11 기계어를 생성하도록 했다[3].
톰켄스: 데니스  B언어 포팅은 잘되가? 데니스 리치: 문제가 많아. 우선 PDP-11에서는 문제 데이터 타입에 접근하기가 어려워. 다른 새기능을 사용할 수 없고.
톰 켄프슨: 하하, 이번 기회에  B언어를 싹 뜯어 고치는거야. 데니스 리치: 다시 짜야할지도로 모르는데..

1973년에 기본적인 기능이 구현되었고, 이름을 C언어로 불렀다. B의 다음 버전이라서 그냥 C언어로 부르게 되었다.

데니스리치: C언어로 부르면 어떨까? 톰슨: 우와 잘 동작하는데?

데니스 리치는 같은 해에 C언어로 유닉스를 다시 작성하기 시작한다.

C언어에 데이터를 정의할 수 있는 구조체 타입(structure type)을 추가하였다. 이제, C언어는 유닉스 커널을 작성할 수 있을 정도록 강력해졌다.

이처럼 유닉스와 C언어는 켄 톰프슨과 데이니 리치에 의해 짧은 기간에 탄생했지만, 오늘날까지도 핸드폰을 비롯한 대부분의 컴퓨터가 유닉스를 기반으로 동작하고 있다. 또한, 현재도 운영체제 커널은 C언어로 개발되고 있다.

참고
[1] https://en.wikipedia.org/wiki/Unix
[2] https://en.wikipedia.org/wiki/History_of_Unix
[3] The Development of the C Language
[4] The Evolution of the Unix Time-sharing System

7. ITS와 해커 문화

해커문화는 MIT대학의 테크모델 철도클럽에서 시작한다. 이들은 움직이는 모형 기차를 만들고 어떻게 하면 기차끼리 충돌하지 않을까 연구하는 동아리였다[1].  참고로, 아래 동영상을 보면 움직이는 모형 기차 제어에 왜 컴퓨터가 필요한지 알 수 있다.


DEC에서 만든 PDP 기종은 해커 문화와 자유소프트웨어 탄생에 큰 기여를 했는데, 일종의 미니 컴퓨터로 비교적 저렴한 가격으로 판매되어 특히 대학에서 인기가 많았다. 참고로, DEC는 1961년 PDP-1을 MIT대학에 기부했다[2].


그후, 테크모델 철도클럽에서 기차 제어에 관심이 있던 학생들은 하나 둘씩 PDP-1에 더 많은 시간을 보내게 된다.

그리고, 학생들은 재미를 위해 최초로 Spacewar!라는 기념비적인 비디오 게임을 만들었다.

당시 MIT 인공지능연구소(AI Lab)는 해커 문화의 발생지였는데,  GE와 벨연구소(Bell Labs)와 함께 멀틱스(Multics)라는 운영체제를 개발하고 있었다. 하지만, 개발 방향이 맞지 않아 1960년대 후반 부터 자신들이 새롭게  ITS(Incompatible Time Sharing System)이라는 운영체제를 개발한다.

MIT해커 Tom Knight(우)가 ITS 최초 커널을 개발했다.

실제 개발은 PDP-6에서 시작했고 모두 어셈블리어로 작성되었다.

당시 ITS 운영체제는 지금에는 찾아 볼 수 없는 독특한 사용자 환경을 제공했는데, 초기에는 누구나 시스템에 암호 없이 로그인할 수 있었다. 문서와 소스코드를 포함한 모든 파일도 누구나 편집할 수 있었다.

또한, MIT 내부 뿐만 아니라 다른 기관이나 학교에서도 ARPAnet을 통해 ITS에 접속할 수 있었다. 이러한 ITS의 열린 철학과 협력적인 공동체 환경은 해커 문화에 큰 영향을 줬고, 자유/오픈소스와 위키에도 영향을 끼쳤다.

훗날 자유소프트웨어 운동을 시작한 리차드 스톨먼도 1971년 부터 MIT AI Lab에서 일하면서 공동체 일원으로 ITS 운영체제 개발에 참여하였고, 여기서 해커 문화에 영향을 받는다.

이때까지만 해도 소프트웨어는 하드웨어의 번들로 인식되어서 서로 댓가 없이 복사해서 사용했다. 기업도 마찬가지로 소프트웨어를 무료로 배포하였고, 사용자들이 수정하고 복사하도록 허용했다.

참고

[1] https://ko.wikipedia.org/wiki/해커
[2] https://en.wikipedia.org/wiki/PDP-1

6. 해커문화의 탄생

알림: 이번 만화는 에릭 레이몬드의 “해커문화의 짧은 역사”을 참고했습니다.

_

위키피디아 프로그래밍 언어의 역사 페이지를 보면 초기에 개발된 프로그래밍 언어를 찾아 볼 수 있다.만약 처음 들어본 프로그래밍 언어가 있다면, 이 언어들이 아마도 고대 언어일 것이다.

물론, 당시 여성 프로그래머의 활약을 빼놓아서는 안된다.

이러한 진정한 프로그래머가 만들어 놓은 문화가 대화형 컴퓨팅, 네트워크을 발전시켰고,  오늘날의 오픈소스 해커 문화로 진화했다[1].

초기 해커 문화는 MIT대학이 1961년 최초로 PDP-1이라는 컴퓨터를 도입하는 것으로 시작한다[1]. 이 당시 PDP-1을 접한 몇몇 학생들은 재미를 위해 최초로 Spacewar!라는 비디오 게임을 만들었고 문서 편집기와 체스 게임을 만들기도 했다. 또한, 최초로 컴퓨터 음악을 연주하기도 했다.

아래 유튜브 동영상에서 PDP-1에서 연주하는 음악과 Spacewar!를 실행하는 모습을 볼 수 있다.

당시 MIT 인공지능연구소는 해커 문화의 본산지였다. 1960년대 말, 그들은 PDP-10에서 동작하는 ITS(Incompatible Timesharing System)라는 시분할 운영체제와 LISP이라는 언어를 개발했는데, 다른 대학이나 기업들에게 무료로 제공되었다. 인터넷의 초기 형태인 ARPAnet이 연결된 이후, 해커 문화는 ITS와 함께 다른 대학와 기관으로 퍼져나갔다.

참고
[1] 해커문화의 짧은 역사, 에릭 레이몬드

궁금한 부분, 잘못된 부분 등 의견 있으면 답글 바랍니다~

 

5. 소프트웨어 공학의 시작

1960년대까지 소프트웨어는 하드웨어의 일부분에 불과했다. 컴퓨터와 주변 기기들은 방 하나를 가득 채울 만큼 컸고 운영하는데도 많은 비용과 인력이 필요했던 반면, 소프트웨어 규모는 그 만큼 크지 못했고 독립된 영역으로 자리를 잡지 못했다.


컴퓨터를 처음 만든 사람이 수학자이다 보니, 초기에는 수학을 전공하는 학생들이 프로그래밍을 시작하는 경우가 많았다.

기존에 손으로 하던 수학 계산, 각종 실험을 컴퓨터로 할 수 있었기 때문에 자연과학이나 공학을 전공하는 사람들도 프로그래밍을 배웠다.이중에는 그만 프로그래밍에 빠져 그대로 본업을 버리고 프로그래머 전업한 경우도 많다.

1960년대 아폴로11 프로젝트에 참여하여 달착륙선 소프트웨어를 개발한 마거릿 해밀턴의 이야기를 들어보면 그 당시 소프트웨어 개발 환경과 인식을 잘 알 수 있다. 대학에서 수학을 공부한 그녀는 남편의 박사 학위 공부를 지원하기 위해 MIT에서 프로그래머로 일을 시작했다. 당시 그녀는 제대로된 프로그래밍 교육도 받지 못하고 바로 날씨를 예측하는 프로그램 개발에 참여했다.


그 후, 시스템 프로그래밍 전문가가 되어 아폴로11 프로젝트에 참가하게 된다. 당시 아폴로11 프로젝트에는 SW개발을 위한 예산과 일정이 포함되어 있지 않았고, 요구 사항에도 소프트웨어 대한 언급은 없었다[1]. 하지만,  소프트웨어는 우주선 비행과 달착륙선을 제어할 만큼 중요한 역할을 맡았고, 마거릿은 좀 더 신뢰성 높은 소프트웨어를 개발하기 위해 딸을 데리고 주말에 출근하기도 했다.


결국, 1968년에는 무려 400여명의 사람이 달착륙선 프로그램 개발에 참여하였고, 아폴로 11 프로젝트는 성공적으로 마무리되었다.

특히, 그녀는 아폴로 프로젝트 초기에 소프트웨어가 하드웨어 처럼 독립된 영역으로 인정 받을 수 있도록 소프트웨어 공학(software engineering)이라는 용어를 처음 사용했다. 또한, MIT대학에 컴퓨터 프로그래밍 관련 교과목이 생겨날 수 있도록 도움을 주기도 했다[4].

흥미로운 사실은 1960년대까지 SW개발자 상당수가 여성이였는데, 지금의 현실과 비교하면 상당한 차이가 있다. 그 이유는 당시에는 SW개발이 HW개발 보다 덜 중요한 일로 취급되어 여성들이 주로 맡게 되었고 급여 수준도 낮았다[2]. 하지만, 나중에 SW개발이 더 어렵다는 것을 깨닫게 된다. 인터넷에서 흑백 사진의 초기 컴퓨터 사진을 찾아보면 유독 여성이 컴퓨터 앞에 있는 모습을 많이 볼 수 있다.

img_0698

에니악에서 실제 프로그램 배전판을 만들던 분들은 모두 여성이였다[3].


최초로 컴파일러를 만들고 처음으로 디버깅(?)을  한 그레이스 호퍼도 여성이며, 수학 박사이기도 하다. 1947년 호퍼는 마크2에서 프로그래밍 작업을 하고 있었는데, 그 날 따라 천공카드 입력이 잘 안되었다.

결국, 릴레이 안에 죽어있는 나방 때문에 컴퓨터가 제대로 동작하지 않는다는 사실을 알게 된다.

그리고 그 나방을 작업 노트에 붙이면서 최초의 컴퓨터 버그라고 메모를 남긴다.

img_0696

이 처럼 컴퓨터가 사용되던 초창기 시대에는 여성들이 소프트웨어 개발 분야에 선구자적인 역할을 했고, 소프트웨어 공학이 탄생할 수 기반이 마련되었다.

참고

[1] https://www.wired.com/2015/10/margaret-hamilton-nasa-apollo/
[2] http://www.smithsonianmag.com/smart-news/computer-programming-used-to-be-womens-work-718061/
[3] https://iq.intel.com/how-female-eniac-programmers-pioneered-the-software-industry/
[4] https://en.wikipedia.org/wiki/Margaret_Hamilton_(scientist)

4. 처음에는 어떻게 프로그래밍을 했을까?

컴퓨터가 처음 만들어졌을 때, 사람들은 어떻게 프로그래밍을 했을까? 사실, 처음에는 하나의 프로그램을 회로로 구성해서 컴퓨터를 만들었기 때문에 다시 프로그래밍을 할 수 없었다. 초기 컴퓨터는 마치 탁상용 전자계산기와 같았다. 에니악(Eniac)도 배선판을 교체해야 다른 프로그램을 실행할 수 있었는데, 천공카드를 기억장치로 사용했다[1].
실제 프로그래밍은 1949년에 에드박/에드삭과 같은 프로그램 내장형 컴퓨터가 만들어진 이후 가능했다. 프로그램은 기계가 이해할 수 있는 명령어로 구성되어 있는데, 이를 기계어라고 한다. 실제 기계어는 0과 1을 구분할 수 있는 이진수로만 이루어져 사람이 이해하기 어렵다.
그래서 생겨난 것이 어셈블리어(Assembly Language)다. 특히, 에드삭도 이미 오늘날도 같이 initial orders라는 어셈블리어를 사용해서 실행 코드를 작성했다. 실제 에드삭에서 사용한 어셈블리어 언어 예이다[2].
에드삭에서 사용하는 기계어 명령어는 모두 17비트로 이루어져있다. 첫번째 열이 동작코드(Operation code) 이고, 두번째 열인 1비트는 사용하지 않는다. 세번째, 열은 피연산자(operand)인데, 주소를 나타낸다. 마지막 비트는 현재 명령어가 17비트인지 또는 35 비트를 사용하는지 여부를 표시한다.

첫번째 명령어는 T라는 명령코드를 사용했는데, A를 의미하는 누산기(accumulator)에 있는 데이터를 메모리에 입력하고 누산기 데이터를 초기화하는 명령어이다. 두번째 명령어는 H라는 명령코드를 사용했는데, 메모리에서 데이터를 가져와 곱산 레지스터 R에 입력한다.

이와 같이, 기계어는 명령어 자체가 이진수에 불과하기 때문에 사람이 기억하고 바로 코드를 이해하기가 어렵다. 그래서 각각의 명령어를 상징적 기호(mnemonics)로 표현하여 어셈블리(assembly) 언어를 만들었다. 이렇게 표현된 코드를 CPU가 이해할 수 있는 기계어 코드로 변환하는 것으로 어셈블링(assembling)이라고 한다.

초기에는 이를 일일히 손으로 했기 때문에 핸드 어셈블링이라는 말을 사용했다. 물론, 어셈블링 도구가 없으면 지금도 니모닉 변환표를 보고 손으로 직접 어셈블링을 해야 한다. 이처럼 이미 1950년대 부터, 프로그래머들은 어셈블리어를 사용할 줄 알았다.
그런데, 1960년대까지 키보드와 모니터가 상용화되지 않았다. 최초로 모니터와 키보드가 달린 컴퓨터는 1964년 벨연구소와 MIT대학이 함께 개발한 멀틱스(Multics)였고[3], 1970년대 와서 대부분 컴퓨터가 모니터와 키보드가 결합된 터미널을 갖게 되었다. 그렇다면 그 전에는 프로그래머들은 어떻게 코딩을 하고 결과를 확인할 수 있었을까?

멀틱스 컴퓨터(모니터와 키보드를 처음으로 함께 사용했다)

초기 프로그래머들은 천공카드를 사용해서 코딩을 했다. 천공카드는 원래 19세기 말에 데이터를 입력하고 저장하는 용도로 사용되었는데, 미국 통계청에서 인구조사를 위해 사용하였다. 지금의 OMR 답안지를 생각하면 이해가 쉽다. IBM은 당시 천공카드 시스템을 개발하여 세계적으로 시스템을 공급하고 있었다. 이 천공카드가 초기 컴퓨터 사용에 큰 역할을 했다.

실제 사용은 이렇다. 우선 프로그래머는 종이에 어셈블리어로 코딩을 했다. 머리속에서 코드를 실행시켜 디버깅을 하고, 그 코드를 명령어 하나 하나 천공 카드에 기입하였다.
이렇게 준비된 천공 카드를 operator에게 전달하면 대신 컴퓨터에 입력해주고 실행 결과를 종이로 출력해서 전달했다. 물론, 현실은 operator에게 천공카드를 전달하려고 줄을 서야 했고, 실행 결과를 받을 때까지 많은 시간을 기다려야 했다. 물론, 결과가 제대로 안나오면 다시 천공카드를 만들고 실행하는 과정을 반복해야했다.img_0677
재미있는 것은 천공카드만 복사하면 프로그램을 복사하는셈이여서, 그 때까지만 해도 프로그램 복사는 그저 손으로도 가능했다.

[1] http://www.seas.upenn.edu/about-seas/eniac/operation.php
[2] http://www.cl.cam.ac.uk/~mr10/edsacposter.pdf
[3] http://theinventors.org/library/inventors/blcomputer_keyboard.htm