최근 17년전에 작성한 프로그램을 다시 추가 개발하고 있습니다.

 

당시 7년차일때 작성한 리눅스 프로그램으로 출장개발로 1년이 걸렸지요.

현재까지도 이 프로그램을 잘 운영되고 있고, 운영사에서 직접 유지보수하고 있지만

다른 개발자 5명 이상은 손을 거쳐간 프로그램이 되었습니다.

단순 테스트 검증시 1주일, 상세 검증은 한 달이 걸리는 나름 규모가 있는 프로그램입니다.

 

라인수 카운트를 해보니 6만5천줄 정도 되네요. 흥미로운 사실은 개발당시 리눅스 라이브러리에 대한 고정관념 같은게 있어서, C standard 라이브러리 이 외에는 전혀 다른걸 사용하지 않았다는 겁니다. 해당 줄 수가 실제 제가 코딩한 전부라는 거지요. xml parser, ftp 등등을 무슨 똥배짱인지 직접 다 코딩했었지죠. 이런 무식이! T.T

 

이 프로그램을 다시 개발하게 되었을 때 예전의 나를 보는 것 마냥 두근대고 부끄러워지더군요.

 

막상 소스를 열어보니 웬걸 제법 잘 짰는데..라고 생각되었습니다 (자화자찬 +.+)

main 문 안에 전부 task 처리하고, 변수는 struct 로 묶어서 전부 포인터 처리.

더 놀라운 사실은 17년동안 해당 전체 구조가 전혀 바뀌지 않은 상태로 유지되었다는 거고,

다른 개발자들도 제가 짠 구조 아래서 그 구조를 답습하여 프로그램을 개발해왔다는 사실입니다.

사실, 누구라도 외주 개발사 입장에서는 맘에 안들어도 전체를 뜯어 고치는 일은 전혀 다른 일이긴 합니다.

 

이번 수정은 추가 장비가 붙는 바람에 약 10% 정도 수정이 필요한 작업이었는데, 실제 집중 투여한 시간은 20일 정도입니다. 예전 7년차 개발 속도라면 2개월이 걸릴 일이 되겠군요. 17년만에 3배 이상 빨라진거 같습니다.

 

이번에 수정해야 할 부분 중  개발 당시 제일 애를 먹었던 알고리즘 수정 부분이 있었는데

도대체 왜 이렇게 구현했는지 소스를 따라가도 남의 소스를 보는 마냥 이해가 되지 않는 것이이었습니다.

그래서 해당 부분은 그 대로 남기고 , 오롯이 새로 코딩해보니 ,

결국 원래 부분과 똑같이 구현되는 것을 발견했습니다. 아, 그때 삽질한 게 아니었구나.. 하는 걸 알게 되었지요.

 

리눅스 시스템이나 쓰레드도 없는 함수 태스크 방식의 루프 프로그램이었지만

그 당시에 정말 예쁘게 짜려고 , 프로그램 경력에 오점을 남기지 않으려고 (다른 사람이 욕하는 프로그램을 짜면 안되니깐..) 나름 노력했었는데, 한참뒤에 제가 그걸 돌려받게 될 줄은 전혀 몰랐지요.

 

예전의 나의 모습을 거울로 다시 보는 듯한 경험.

그 당시의 고민의 흔적을 다시 되새기며, 그때 왜 그랬을까 한줄한줄 따라가다가

그 길이 최선이있다는 재발견.

 

흥미로운 경험이었습니다~~~

 

 

일반적으로 프로그램 과제를 진행하는데 있어 자그마한 목표들이 있다.

 

여러가지 사유로 인하여 지연되기도 하고 일정의 문제로 기본적인 문제를 해결하지 못한체로

땜방식으로 일을 처리하기도 한다.

 

한가지 중요한 사실은 "왜 이것을 개발해야 하는가" 이다.

이 질문을 놓치게 된다면 사실 개발의 의미가 없다고 보아도 된다.

 

예를 들면

 A 기능을 구현하기로 했다고 치자.

A 기능을 구현하여야 되는 이유와 명분, 소비자의 반응, 일정 이런 것들이 총체적으로 합쳐서 이루어져서 판단을 해야 한다. 단지 지시로 며칠까이 이런 기능만 구현해라고만 된다면, 그런 목표가 있는 사람과 단순히 코딩만 한 사람과의 결과물은 같지만 다르다.

 

후자는 영원히 그자리에 머물 것이고 전자는 다음번에는 같은 일을 반복하지 않거나

다시 리비전하여 원래 목표대로 완성을 할 것이다.

 

작은 차이가 큰 변화를 만든다.

 

내가 짜는 함수가 어떤 목적을 가지고 있는지 명확히 하자!

 

컴퓨터는 바보입니다. 

 

0 1 밖에 몰라요.

원리를 제대로 알려면 완전 기초부터 컴퓨터 구조론까지 배워야 하지만 간단히 설명하면 아래와 같습니다.

 

+ - 연산을 잘하는 매우 빠른 놈이 있는데 이 놈이 2진수밖에 모른다네요.

좀 이용을 해야지 생각합니다.

 

일단 숫자 10을 표현하자니 1010(2) 로 표현이 되는군요.

또 가만히 살펴보니 이 놈의 생각 저장 창고가 8bit (8칸 으로 된 2진수 로 되어 있네요)

 

즉, 저장 창고도 2진수인데 8개가 한 묶음이랍니다. 

2가지 정보를 저장할 수 있는 1bit 가 8 개 묶음, 8bit 를 1Byte 로 부르기로 합니다.

 

다시 돌아가서 1 bit 는 2가지의 경우의 수를 표현이 가능합니다.

0 또는 1 이니깐 2가지 표현이 가능하네요.

그럼 2 bit 는 00(2) 01(2) 10(2) 11(2) 아하 4가지가 표현이 가능하군요.

즉, bit 가 하나씩 증가할 때 마다 2의 승수개수로 표현이 가능한 종류가 늘어납니다.

그럼 1byte = 8 bit 는 2^8 승 즉 256가지의 종류를 표현할 수가 있겠군요.

계속 생각하면 2^10 은 1024byte 가 되고 이는 1KBye 로 부른다네요 .

 

아하 1KByte != 1000Byte 가 아니군요!

 

다시 1 byte 로 돌아가면 , 1byte 방이 옆으로 연결되서 쭉쭉 있는겁니다. 그 방에 호수도 있네요. 101호 102호...

아까도 말했지만 컴퓨터는 단순 연산만 한다는 거지요. 그 메모리 방에서 값을 꺼내서 더하기 빼기 옮기기 만 한다고 생각하시면 되요.

 

그리고 컴퓨터는 어셈블리라는 언어만 이해를 하는 절대 외국어를 안배우는 1개국어 사용자인데

( 어 그럼 C 나 java 는 뭐지?  -> 모든 언어가 결국 어셈블리로 변환되어 실행됩니다)

하나 예를 들면 mov a,b 하면

a 방에 있는 값을 b 방으로 옮겨라 는 뜻입니다. 근데 한번에 안 옮겨저요. 바보라서.

 

위 한줄을 읽고 (1클럭) , 일단 명령을 읽어야지요

그 한줄을 해석하고 (1클럭) , 어떤건지 실행 준비해야지요.

실행하고 (1클럭) ,  a 에 값을 빼와야지요

저장하고(1클럭) , b 에 쑤셔 넣어야지요.

 

흠 그러면 이명령은 CPU 가 1MHz 클럭 로 동작한다면 1 clock 이 1us 니깐 4us 만에 실행이 되겠군요.

아이고 느리네..하나 옮기는데 이정도면...

 

여기서 파이프라인 설명하려다 ..아차 여기는 초보용...이라 생략합니다.

OK . OK 여기까지...

 

정리하면

뭔가 이 바보 상자는 2진수로된 방에서 값을 꺼내서 계산하는데 

명령을 시키는 것은 asm 만 이해를 하고 

이것도 몇단계로 나누어서 실제 실행을 하는군.

 

좋아 숫자는 이해했어. 근데 지금 보는 이글자는 뭐야

hello world 나오는거 해봤는데, 그거는 어떻게 표현하는거지?

 

네 맞습니다. 컴퓨터는 'h' 인지 'e' 인지를 몰라요.  언급한 것처럼 단순히 0-255 개 를 1방안에 표현할 뿐이지요.

 

자 그럼 화면에 나오는 'A'  값은 어떻게 하는거지 , 숫자밖에 안들어가는데 'A' 는 뭔가 다르게 들어가나?

 

컴퓨터는 처음에 말했지만 바보 상자입니다.

 

그래서 정의를 해주었어요. 만약 이 방안에 값이 0x41(hex / 16진수 입니다) 이 값은 65란 값이기도 하고 

2진수로 0100 0001 입니다. 물리적인 셀공간에는 정말 0100 0001 로 저장되어 있겠지요.

그냥 전구 8개가 끄고 켜고 끄고 끄고 끄고 끄고 끄고 켜고 그렇게 있다고 생각하시면 되요.

 

자 그럼 'A' 값은 어떻게 표현하느냐!

 

이 0x41 값이 들어있으면 'A' 로 치자입니다.

 

이게 무슨 뚱딴지 같은 소리냐? 개소리 하지 마세요! 라고 할 수 있는데 이게 다입니다.

 

그럼 65 하고 'A' 하고 어떻게 구분해? 라고 하신다면 

계속 제가 이야기했지요. 컴퓨터는 바보 상자라구요..구분 못합니다. 그냥 저장된 65란 값이지요.

 

문자를 표현하기 위해서 ascii code 표라는 테이블을 만들고 그냥 정의해놓은겁니다.

'B' 는 다행스럽게도 하는 더해서 66 이군요. 고맙게도 순서대로 정의를 해놓았답니다.

 

다시 원래 질문!

65 하고 'A ' 는 컴퓨터 자체는 구분을 못합니다.

다만 사람이 사용하기에 따라서 'A' 로 사용하기도 65 란 값으로 사용하기도 하는겁니다.

 

이상하지요.

 

이상 바보 컴퓨터에 대한 설명이었습니다~~

+ Recent posts