관리 메뉴

드럼치는 프로그래머

[프로그래머 이야기] C 프로그램과 CPU의 이해를 통해 전자장치 개발자로 거듭난다. 본문

★─My Life/☆─프로그래머's

[프로그래머 이야기] C 프로그램과 CPU의 이해를 통해 전자장치 개발자로 거듭난다.

드럼치는한동이 2009. 11. 16. 00:39

  전자공학을 전공하고 회사에서 일을 하기 시작하면 당장 붙이치는 문제가 CPU을 다루어야 하고 이것을 동작시켜야 한다. 동작 시키기 위한 프로그램은 거의 99%는 C언어로 작성 한다. 따라서 C언어와 CPU의 동작을 이해하는 것은 전자회로나 반도체를 이해하는 것 보다 중요하다. 실제로 일을 진행하면서 이 두 주제 C언어와 CPU가 거의 다 이고 가끔 특수한 전자 및 컴퓨터 알고리즘이 사용 되어 진다. 따라서 기본적으로 이 두 주제는 무조건 알아야 하고 몸에 익어야 한다. 그리고 일이 주어지면 기본 시스템을 설계하고 내가 모르는 부분을 공부하고 전체를 해결 한다.

   이 과정은 실제로 내가 아는 회사의 누군가를 위해 실제로 진행하는 과정이다. 얼마나 도움이 될 지는 알수 없는 일이나 숙달하는 사람의 의지가 가장 중요하다. 실제로 프로그램 언어 자체는 그리 많은 내용은 아니다. 이것들을 서로 엮어 원하는 기능이 되도록 하기 위해서는 많은 머리 훈련이 필요한데 이것은 마치 영어를 수년간 해 오면서 우리가 말한마디 못하는 것과 같은 것이다. 이것을 돌파하는 것이 목표이다.

   우선 이 두 주제 중에서 C언어를 습득하는 과정을 나의 공부방법을 도입하여 단계적인 숙달 과정을 제시 한다. 따라서 C언어를 모르거나 CPU을 이해 하지 못한다면 앞으로 단계적인 제시를 보고 습득할 수 있다. 수행 과정 상 단계를 나눈 것은 각 단계별로 의미가 있는 것이므로 가급적 단계 숫자 대로 수행 해야 효과적이다. 

목표:

 프로그램을 할 때, 어떤 기능을 코딩하고자 할 때 생각이 바로 떠올라야 한다. 우리가 말을 할 때 개념만 생각하면 어떤 단어를 쓸지를 고민하지는 않는다. 많은 사람은 수많을 시간을 투자해도 영어 한마디 못하는 경우가 많으데, 프로그램에서도 마찬가지 이다. 사람의 머리에서는 우선 개념이 들어 올 때, 단어를 만들어 내는 스냅스에 하드웨어적으로 바로 연결된다. 개념과 단어 그리고 음색이 연결되어 있다. 이것이 목소리를 올리면 소리가 나온다. 여기서 각각의 요소는 개념적 사고체계를 거치지 않고 바로 숙달에 의해 스냅스에 연결되어 동시에 이루어 진다. 나는 개인적으로 이것을 엔진이라는 말을 사용 한다. 프로그램에서 성적처리라는 개념이 들어오면 자료 형태가 과목과 점수라는 개념이 있고, 여기에 점수의 합과 sort이라는 개념들이 스냅스의 연결에 의해 순식간에 떠오른다. 이정도의 정보처리는 개인적으로 지금은 듣는직시 전략이 새워진다. 그러나 대학시절 처음 이 문제를 프로그램할 때 1달동안 알고리즘(알고리즘이라고 생각할 수 없지만)을 구상 했다. for문을 돌리면 되는데 지금 생각하면 왜이래 오래걸렸을까? 신기할 정도이다.

 정리하면 프로그램 엔진이 없어기 때문이다. 엔진이라는 것은 각각의 개념을 처리하는 두뇌의 부분과 이것을 코딩화를 창조하는 스냅스 블럭과 연결을 통해서 코딩이 이루어진다. 사람은 누구나 프로그램을 접해보지 않아서 엔진은 없다. 그래서 처음에는 시간이 받드시 필요하다. 세상에 공짜가 있는가? 스냅스의 연결은 생각을 집중하면 빨리 생긴다. 스냅스 끼리 연결 통로가 생기는 물리적인 연결 과정을 생성해야 때문에 머리가 좋다고 하루 아침에 생기지 않는다. '내가 지금 듣는 직시'라는 말은 머리가 좋아서가 아니다. 처음에 생각을 집중했기 때문에 머리속에서 처리 엔진이 만들어진 상태라서 이다. 전문가들은 다 이렇게 빨리 생성 한다. 성적이라는 말을 들었을 때, 이것을 어떻게 코딩하지를 생각하면 이미 전문가가 아니다. 훈련이 필요한 초보일 뿐이다. '나는 머리가 나빠서 코딩을 못한다' 이런 핑계를 하고 싶을 사람에게 한마디 하자면, 프로그램 코딩을 하는 거는

'말을 하는 사람은 누구가 훈련만 하면 할 수 있다'

는 것이다. 말 훈련도 마찬가지로 누구나 잘 통과 했다. 환경이 그러니 어쩔수 없는 상황이었지만, 프로그램은 그렇지 않았을 뿐이다.

 

 처음에 성적 처리 하는데 한달이 걸렸다. 이때의 집중도는 가의 초인의 집중도 였다. 누워도 fortran 코딩을 생각하고, 버스를 타고 가면서, 밥먹으면서 온통 미친듯이... 어떤때는 수업시간도 잊어버려 친구한테 혼난적도 있다. 이렇게 한달을 통과하고 나니 다음 문제는 가히 기하급수적으로 단축된다. 모든 자연현상이 그렇지만 코딩을 생각해 내는데 시간은  1/e**t의 시간으로 단축된다. t는 훈련(경험) 시간이다. 그래서 지금은 듣는 직시 생각한다. 주의의 어떤 사람은 성적 처리하는 문제를 연습하라니까 책에 나오거, 인터넷에 나오 코딩을 복사하고 이를 곰곰히 생각 한다. 장담하지만 이러면 절대로 엔진은 물건너 간것이다. 99%도 아니고 100%다. 물론 10년 이렇게 보면 생기기는 한다. 한달만 제대로 하면 되는 것을 1년,2년을 사용할 필요가 없다.

 성적처리 문제 코딩을 해결하면서 책의 fortran의 문법을 보고 다시 생각하고, ... 이렇게 수많은 생각들이 집중도에 결합되어 방법이 한순간에 머리에서 떠오른 것이다. 재미 있는 것은 한달동안 그렇게 고민할 때는 단계적으로 떠오르지 않고 순간적으로 스냅스의 연결이 완결되어 해결되었다는 것이다. 머리속에서는 한단계 한단계 쌓아서, 해결 측면에서는 순간적으로 문제가 해결된 것이다. 

 실제로 처음에 FORTAN(지금은 들어보지도 못한 사람이 있을 것같은데 C가 대중화 되기 전에)을 가지고 엔진을 만들고, 다른 언어로 전이하는 것은 쉬운 문제다. PASCAL을 거쳐 C로 전이 했는데, 언어는 표현의 다른 수단일 뿐이지 시간은 별로 걸리지 않는다. Prolog는 지금도 고민 스럽다.

 

 이렇게 고민을 하고 통과하면, 또한가지 생각할 것은 어런 논리적 처리 머리 부분은 다른 논리적 사고를 할 때도 사용되어 진다는 것이다. 따라서 프로그램 코딩은 프로그램에 그치지 않는다. 논리적 사고를 경제, 철학, 생활에 그대로 사용한다. 뇌의 구조상 그렇수 밖에 없을 것이다.

 

프로그램의 엔진을 만든다. 이것이 목표이다.

단계는

1. C언어를 숙달 하는 과정이 우선이다.

2. C언어를 바탕으로 CPU을 이해 한다. 구체적인 CPU을 사용하여 직접 구동 하는 과정이다.

3. CPU 상에서 C언어를 심화 한다.

 

우선은 어떻게 C언어를 이해하고 숙달할 것인가를 주제로 시작 한다.

 

C 언어의 숙달 과정

단계 1 - 가장 간단한 C 프로그램 책 전체를 빨리 읽는다

  - 이 과정은 과거에 C을 공부 한 경우는 전체를 다시 한번 리뷰하여 기억을 재성하는 것이고, 처음 시작하는 개발자는 C의 전체를 파악하기 위한 과정이다. 시간 상 소설 읽드시 빨리 전체를 파악 한다.

 

단계 2 - Step2-1 : 프로그램 문제 1 - 프로그램 엔진을 만들다.

  - 이 과정은 무작정 C로 프로그램을 작성 해 본다. 데이터를 어떻게 처리 할지를 스스로 고민하고 해결함으로써 기본적인 문제를 파악하는 것이다. 해결이 완료되면 스스로 수준을 파악하게 될것이다. 내가 어떤 수준의 프로그램을 할 수 있는지 문제가 무엇인지....

다음에 C을 수강하여 강의를 들으면 뇌가 C언어를 흡수하는 시간과 정도가 다를 것이다.


단계 3 - 프로그램을 문서화 하다 - UML 파일 작성

- 개발 시작 부터 코딩 과정, 디버깅, 버전 관리 등의 일의 전 과정 상 필요한 것이 바로 문서화이다. 스스로도 그렇고 팀워크를 위해서도 그렇다. 우리나라의 성격상 이 문서화는 잘 이루어 지지 않는 것이 사실이다. 어느 정도의 틀이 어느 정도 잡힌 기업의 경우는 이미 잘 이루어 지지 있겠지만, 대부분의 회사에서는 형식적으로 이루어 지고 있는 경우가 많을 것이다. 이것은 개발 시스템 이다. 업체에서 제품을 만든다는 것은 단순히 어느 한 사람의 개발에서 끝나는 것이 아니다. 누군가 문제가 발생 하면 서비스 해야 하고, 문제되는거 개선되는 프로그램에 대해 버전 관리를 해야 한다. 서로 통신을 위한 기본적인 언어인 셈이다. 이 전 과정에 필요한 요소이다. '무지 중요함' 바로 이것이다. 

 

단계 4 - Step2-2 : 성적계산 문제 - 함수를 사용하다

- 코딩을 하다보면 초보자 라면 메인 함수에 모든 결론을 내려고 할 것이다. 그러나 시스템이 커지면 그것은 불가능 하다. 따라서 기능별로 구별하고 모듈별로 나누어 오브젝트화 하여야 한다. 함수 이것은  역시 C의 가장 큰 특징이다. 처음 부터 함수로 작성 했다면 별로 신경 쓸 과정은 아니다.

 

단계 5 - Step2-3 : 코딩의 효율화

- 코딩의 효율화는 특히 CPU을 다루는 코딩에서 중요하다. 대부분 작은 시스템은 메모리가 한정 된다. 이것이 아니더라고 복잡하면 실행 속도가 떨어져 리얼타임의 문제에 봉착할 수도 있다. 숙달이 될 수록 전체 코딩은 단순되면서도 같은 기능을 한다. 경험이 필요한 부분이도 하다.

 

단계 6 : 버전 관리

- 버전 관리는 UML과 함께 단순하지 않다. 같은 제품이라도 수시로 문제를 개선하여 버전이 향상된다. 따라서 코딩 자체를 버전별로 관리되어야 한다. 새로 수정된 버전의 프로그램도 갑자기 과정의 코딩이 필요하여 다시 뒤돌아 갈 수도 있다. 제품수 많아 같은 소스를 공유할 때도 많으므로 체계적인 관리가 필요하고 팀워크 상 공동 작업할 때도 체계가 필요하다.

 

단계 7 - Step2-4 : 성적관리 프로그램을 C++(Object화)로 바꾸어 코딩, 동시에 포인터도.

- 프로그램은 오브젝트화는 경험적 필요성에 따라 탄생된 개념이다. C++이 CPU에 적용되지 않더라도 이 개념은 중요하다. 가능한 수준의 모듈을 파일 분리로 어느 정도는 오브젝트화를 달성 할 수 있다. 이 개념을 만들기 위해 C++을 한번 코딩 해 본다.

 

단계 8 - Step8-1 : 문제 '스트링의 처리' string

- C에서 스트링의 규칙을 알아야 한다. 스트링 처리 방식과 데이터의 처리 방식을 구분하여 개념을 잡아야 한다. 또 스트링과 별도로 첫번째 문제와 비교 상대를 만들어 스스로의 변화를 파악할 수 있을 것이다.

 

단계 9 : 다른 개발자의 프로그램 해석하기, 그리고 비교하기

- 남이 개발화 코딩을 이해 하는 것 역시 중요하다. CPU을 다룰 때 많은 경우는 모든 코딩을 스스로 작성 하지만 경우에 따라 남의 프로그램을 해석 할 필요가 있다. 대표적인 경우가 임베디드 (리눅스 포팅, Windows CE 플랫폼 빌딩 등)을 다루려면 필요한 요소이다. 이것이 아니더라도 특별한 알고리즘을 어디선가 받아 해석하여 자기 프로그램에 추가할 수 있다.

- 두 번째는 초보 일수록 남의 프로그램 방식을 통해 자기 스스로 많은 도움을 받을 수 있다. 스타일 오브젝트 방법 등...



[출처] http://blog.naver.com/dolicom/10022980847
Comments