한동안 볼포 게시판을 왔다갔다만 했지 간단한 답변 조차도 피해왔었습니다.
하지만 최근의 글들을 보니 손이 근질근질해서 가만히 있지를 못하겠더군요.
특히나 현지아빠까지 한마디 하셔서, 동조하는 의미로 적어봅니다.
0.프롤로그
가끔 연락을 해오던 학교 후배와 메신저로 안부를 묻다가 학교에 가봐야겠다는 생각이 들더군요. 3학년 2학기 기말 고사 직전에 벤처한다고 뛰쳐 나와서는 후배들과 얘기를 나눈 적이 없었습니다. 벤처는 1년 만에 접고 현재 직장에서 4년차가 될때까지 일해오고 있습니다. 가봐야겠다고 결심이 굳은 이유는 뭘해야하는지 갈팡질팡하고 있는 모습이 안타까워서 였습니다. 그렇다고 스스로는 좋은 후배, 동기도 아니었고 주위 사람과의 인간관계도 두리뭉실한 타입도 아니지만, 컴퓨터공학과 과내 동아리였던 추억도 있고, 후배 녀석들은 너무 내버려뒀구나 하는 자책감에서 였습니다. 대전에서 대구까지 하루 시간을 내어서 갔다오는 것은 시간적으로 금전적으로 피곤한 일이라 미뤄 왔었지만 어쨌든 가서 후배들과 얘기를 나눴습니다.
1.맛있어 보이는 떡
속해있었던 랩에 가보니 별로 달라진건 없더군요. 단지 책이 몇권 눈에 띄었습니다. Refactoring, eXtream Programming 책이었는데요, 기분이 좀 묘했습니다. 왜냐면, 저는 학생때 본격적인 소프트웨어 공학관련 책은 접해보지를 못했었습니다. 기껏해야 OOP 개념서와 C++ 책이 다였지요. 물론 오래된 소프트웨어 공학을 이수하긴 했지만 저한테는 별 도움 안되었습니다. 읽어봤는데 내용은 잘 와닿지가 않았지요. Design Pattern은 봤냐고 물었더니 안봤다는 얘기도 들었습니다. 책을 보게된 동기는 동아리에서 프로젝트가 있는데, 몇해 아래 후배가 권해줬다고 했습니다. 이제 프로젝트 시작하는 후배에게 왜 이런 추상적인 이론서를 추천했는지 이유는 알겠지만, 나도 몇해전에야 접했다, 적용해볼려면, 운이 좋아야 할거다 라고만 했습니다. 적용해볼려면 부단한 노력과 적절한 프로젝트가 맡겨져야한다는 운이 필요하겠지요. 물론 미리 잘해두면 좋겠지만...
2.컴파일러는 깔았고, 이제부터 뭐하지?
공부하고 있는 내용은 물어보니, 툴 위주로 공부하고 있다는 후배도 네트웤쪽이나 리눅스쪽으로 공부하고 있다는 녀석도 있었습니다. 물론 저도 그때는 그렇게 막연한 분야로 대답했을 겁니다. 그걸로 뭐해볼려고라고 물으니 그게 문제라고 하더군요. 뭘 해볼려니 툴 사용이 익숙지 않아서 그걸 익히고 있고, 막상 만들어볼라고 하니 아이템을 못찾겠다는 공통적인 얘기였습니다. 졸업을 앞둔 4학년도 마찬가지구요. 저 역시도 별다른 해답은 못주었습니다. 다만, 툴에 익숙해지는 것은 몇개월이면 된다, 하지만 그 시간을 좀 줄일 수는 있다, 지금해볼 수 있는 것은 익숙한 윈도 어플 아니겠느냐. 계속하라는 말은 아니고 감을 익히고 눈을 뜨기에는 그런게 필요하다, 툴은 익숙해지면 그만이고 윈도 API는 플랫폼에 종속적일 뿐이므로 찾는 방법만 안다면 툴로 극복 가능하다, 간단한 스케쥴 어플 같은 것으로 시작해라. BCB를 해봐라, Ansi C++을 지원하고 VCL 정도만 익히면 된다, 디버깅 훈련에 좋고 잡다한 기능에 눈을 팔지 않아도 된다, 필요하다면 VC도 문제될 것 없다, 하지만 툴 익히다가 시간 다 보낼 것이다, 몇번 해보면 분야하나를 잡고 파고들 수 있을 거다, 그기까지는 가봐야 한다, 등을 얘기 했습니다.
3.1만 조각의 퍼즐 맞추기
OS 스터디 그룹이 있다고 해서 말을 들어보니 당혹스럽더군요. 윈도우 같은 OS를 만드는게 목표라고 했습니다. 선배 몇명이 도와준다고 해보라고 했다더군요. 기본 동작하는 수준까지 만들고 내년에는 개발환경을 만든다고 했습니다. 스터디도 되고, 동아리 자체 개발 환경으로 사용한다는 계획이었습니다. 어느 정도 수준이 되는지 질문을 했습니다.
한 프로그램에서 아래 두개의 함수를 동작시키는 방법은 무엇일까?
Func_A()
{
while(1);
}
Func_B()
{
while(1);
}
다행스럽게 쓰레드를 사용하면 된다라는 답이 나왔습니다. 그럼 쓰레드를 지원하지 않는다면 어떻게 할까? 라는 질문에는 답하지 못했습니다. 아시겠지만 답은 멀티-타스킹을 지원하는 루틴을 작성해야 된다입니다. 즉, 타켓 CPU나 MCU의 HW 인터럽터를 이용해서 일정한 Tick에 ISR 루틴을 실행하게 하고, dispatch 루틴을 실행해서 실제 스케쥴링을 하면 됩니다. 설명을 위해 가상코드를 작성해봤습니다.
//Interrupt Service Routine, int_no:interrupt number
interrupt scheduler(int int_no)
{
switch(int_no){
case: INTN_T0INT:
dispatch_handler();
break;
default:
abort_kernel(); //unknown interrupt
}
}
//Dispatch Handler
void dispatch_handler(void)
{
// globally disable dispatch
// confirm queue empty
// get top priority task
// check queue
// delete top
// insert to bottom
// reschedule
dispatch_request();
}
아쉽게도 후배인 컴퓨터공학 학부생들은 HW에 대해서는 거의 모르다시피 했습니다. 타켓 CPU나 MCU를 모르고 어떻게 OS를 짠다는 건지. 부트로더 만들고, 부팅되면 스케쥴러 만들고, Task, Memory, virtual memory management system 만들고, File system 만들면 되는 다 끝나는 것도 아니고, device driver 계층과 네트워크 지원, API 지원 등을 다 할 수 있을지 의문스러웠습니다. 8bit cpu 가지고 간단한 커널부터 만드는게 낫겠다고 말은 했습니다만 혼란스러워 했습니다. 저 역시 이런말로 기를 죽여도 되는지 후회가 되었습니다만 제 말만 믿고 살아갈 녀석들이 아니기에 굳게 마음 먹었습니다. 어쨌든 나도 학교 다닐때 꿈이 OS만드는 거였다, 지금은 rtos 정도는 사용하고 있고, 만들 수 있고 설명해 줄 수 있다. 결과적으로는 꿈을 이룬것이지만, 윈도우 같이 많은 것을 지원하는 OS는 아니고, 윈도 정도는 혼자 할 수 없다, TCP/IP 스택을 완전히 새로 구현한다고 생각해봐라, 평생 걸릴 것이다, 현재 32bit CPU는 이해하기에 너무 복잡하고 공부에 불필요한 기능이 많다, 8bit에 커널 돌릴 수 있는 정도면 되지 않겠느냐, 등을 얘기 했습니다.
4. 셀러리맨
저는 4년차의 직장인입니다. 대전에 살고 있고, 직장도 대전입니다. 개발 분야는 자동차용 ECU, 열병합용 ECU 등의 엔진 제어와 보정/해석 툴, 그리고 CR 인젝터 등의 시험 장비를 위주로 개발 해왔습니다. 개발 언어는 주로 C(Tasking, gcc), C++(BCB)를 사용하고, LabView 및 ASCET-SD 등을 사용하거나 진행 중입니다. 개발 환경은 single-tasking 환경 및 자사에서 개발한 rtos가 있고, X-Scale용으로 임베디드 리눅스를 적용 중입니다. 그리고 윈도우도 있구요. 이런 개발 기반을 가지고 먹고사는 셀러리맨입니다. 개발하고 싶은 것을 사업화해서 살아가고 있는 것이 아니고, 개발요청서와 제어사양서, 프로젝트 일정에 맞춰서 허덕거리며 개발하고 월급으로 먹고 산다는 겁니다.
이 회사에 오기전까지는 이런 것들이 있는지 조차 몰랐고, 여러분이나 동기들이 얘기하는 분야에 대해서는 지금도 한번 들어본적이 있거나, 처음 듣는 내용이 대다수입니다. 몇십억씩하는 논스탑 머신에서 신용결제 프로그래밍하는 모습을 어찌 말로 알 수 있겠습니까, 그런가보다하고 상상만 하는 거지.
이런 것들이 있는지 조차 몰랐는데, 좋아하는 분야니 뭐니 그런거 말할 수 있었을리가 없습니다. 지금에서야 힘드네,뭐네 그럴 수 있는 거구요.
개발에 필요한 환경은 품의된 내용 안에서 사면 됩니다. 해봤냐 아니냐는 선택의 기준까지는 못됩니다. 단지, 프로젝트 일정에 spike solution 기간을 넣는 정도겠지요.
원격모니터링 해야하는데, 어떤 환경으로 개발할래? 라는 질문은 절대 안합니다. 사용자가 요구하는 사양은 이거다. 일정은 이렇고, 설계구상서 올려라, 이렇게 합니다. 설계구상서와 품의서 작성하면서 툴이나 개발 환경 얘기는 안합니다. 다만, 구입해야할 툴이나, 장비의 견적서는 첨부되겠군요. 개발자가 판단하지요, .net이 필요하면 그쪽으로 가면 되고, 아니면 말고. 심지어 Labview로도 할 수 있지요. 물론 제가 속해있는 회사의 경우입니다.
5. 에필로그
학교 방문건은 후배를 생각하는 마음도 있었지만, 생각을 정리하고픈 마음도 있었습니다. 개발을 하면서 자꾸 드는 회의감, 끝도 보이지 않는 레벨업의 길, 꿈의 축소와 퇴색 등에서 좀 벗어나서 생각을 해보고 싶어서 였습니다. 돌아오는 기차 안에서 씁쓸하더군요. 뭘 잘났다고 그딴 소리를 했을까? 그냥 놔두면 다 알아서 할텐데 괜히 꿈이나 상상을 밟아버린 것을 아닌가 하는 생각이 들었습니다.
분명히 얘기한 것은 개발자는 자신감만 있으면 된다였습니다. 프로그래밍에 눈을 뜨는것이 급하고, 그다음부터는 자신감이다, 그것만 있으면 어떤 분야에 가더라도 극복할 수 있다, 라고 얘기했습니다. 이는 저에게 하는 말이기도 합니다.
분야의 전문가는 많고 그들의 영역에 들어가는 것은 들어가고 싶어서 들어가는 것도 있지만, 운이 있어야 합니다. 그 다음부터는 자신감입니다.
툴의 전문가가 되려면 그렇게 하시길. 하지만 저는 그렇게 되지 않겠습니다. 제가 일하고 있는 분야에 대해 좀더 시간을 투자하고 싶습니다.
생각보다 길어졌습니다. 읽으시느라 수고하셨습니다. 그럼...
|