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