2008년 3월 2일 일요일

개발자가 되기 위해 익혀야 하는 것들

개발자가 되기 위해서 노력하고 공부하는 사람들이 많지만 대부분의 사람들이 정확히 무엇을 공부해야 하는지 모른채 방황하는 경우가 많다. 여기 저기 개발 관련 사이트에 적극적으로 무엇을 공부해야 하는지 문의하는 사람도 있지만, 이에 정확한 대답을 해주기가 곤란한 경우가 많다. 묻는 사람이 정확히 어떠한 분야의 개발자가 되기를 원하는지를 정확히 하지 않으면 어떤 것을 공부해야 하는지를 구체적으로 정해주기가 어렵기 때문이다. 또한 현재 질문하는 사람의 개인적인 수준과 실력에 따라서 이에 맞는 다음 단계를 추천해야 하지만, 온라인상에서 질문하는 사람의 현 수준을 파악하는 것도 쉬운 일은 아니다.

임베디드 시스템 개발을 하는 나로써도 일반 IT분야 개발자들이 주로 어떤일을 수행하며, 어떤 공부가 필요하고, 어떤 툴을 사용하는지 잘 모르겠다. 개발 잡지를 들추어 보아도 임베디드 환경 개발자들 보다는 PC어플리케이션, 게임, 클라이언트/서버, 웹 개발등에 대한 내용이 훨신 더 많고 이제는 이런 분야에 대한 내용이 너무 낯설어 과연 이들과 내가 같은 IT분야 개발자라고 할 수 있는지 의문이 들때가 많다. 이러니 아직 자신이 무엇을 하게 될지 혹은 하려 하는지도 모르는 사람들에게 어떻게 무엇을 공부해야 하는지 알려줄 수 있겠는가 ? 하지만 이 분야에서 실력은 역시 기본기에서 나오는 것이기 때문에 결과적으로 개발자가 익혀야할 기본 항목들이 크게 차이가 나지는 않으리라 생각한다.

아래에는 내가 임베디드 개발자로써 (나의 업무를 기준으로) 꼭 필요한 것들 중 우선 언어와 개발툴 관련된 것을 정리하여 보았다.

1. C언어: 얼마전 자바에게 1위 자리(정확한 기준이 무엇인지 모르겠다. 사용자의 비율이 기준이려나?)를 내주었다는 소문이 있었지만, 역시 임베디드 환경에서는 C를 알아야 한다. C조차 제대로 못하고 입사하는 사람들이 왜이리 많은지... C는 기본중의 기본이므로 완전하게 마스터 해야 한다.
말이 기본이지 C를 제대로 이해하기 위해서는 상당한 내공이 필요하다. C의 spec.을 내부적으로 컴파일러가 어떻게 구현하는지에 대한 고민도 필요하고 단순히 C를 넘어서, 컴파일러 링커 어셈블러 등등에 대한 이해 및 사용법, make 유틸리티에 대한 이해까지... 한가지 언어 및 그에 필요한 추가적인 도구에 대한 사용법에 능숙해져 필요할 때 바로 사용이 가능해야 그 언어를 비로소 알 고 있다고 말할 수 있을 것이다. 자주 사용하지 않는 것들에 대한 방법(세부 옵션등)을 모두 외우고 있을 수는 없지만, 필요할 때 어떤 책이나 자료를 참조해서 필요한 정보를 얻을 수 있는지등은 알고 있어야 실전에서 바로 써먹을 수 있는 자신의 기술이 된다. C 언어를 안다면서 make 파일을 이해하지 못하여 다른 프로그래머가 제공한 프로젝트를 컴파일조차 못한다면 과연 C언어를 안다고 말할 수 있을까? 좀 더 나아가면, C++과 Java, C#등 C의 형제들도 어느정도 알아야 C를 제대로 이해하는데 도움이 될 것이다. C 전문가라고 말하려면 C만 알아서는 안된다.(사랑하지 않으면 떠나라 - 차드 파울러 - 문장을 조금 바꾸어 인용함) C만 아는것은 C 전문가가 아니라 단지 C만 아는 사람일 뿐이다.

2. Perl: 부끄럽고 창피하게도 나는 Perl을 C만큼 자유 자제로 다루지 못한다. 사실 Perl을 사용하여 실제로 유익한 프로그램을 작성하여 본 적도 없다. 하지만 이러한 스크립트 언어 중 한 개정도는 꼭 자유롭게 다룰 수 있도록 마스터해야 한다고 생각한다. 내가 대학 시절로 돌아갈 수 있다면 반드시 졸업전에 Perl을 꼭 마스터링 할 것이며, 지금도 당장의 필요에 의해서가 아니라 앞으로의 필요에 대비하여 틈틈히 공부하고 있다. 아무리 C를 잘해도 동일한 기능을 Perl로 구현하는 것보다 빠르게 구현하기는 쉽지 않다. 간단한 알고리즘 구현이나 선행 테스트, C로 구현한 프로그램의 Unit테스트 자동화, validation등을 위해서 꼭 배워야 하는 항목이라고 생각된다. 최근에는 파이션, 루비, 루나 등이 새롭게 각광받고 있지만 역시 아직도 가장 많이 사용되는것은 Perl이 아닐까?

3. sed/awk: 일반적 개발자의 필수 항목이라고 하기는 어렵지만, 알아두면 손발의 고생을 덜어주는 유틸리티라고 할 수있다. 사실 awk는 프로래밍 언어로 분류될 만큼 강력한 유틸리티로 주로 시스템 관리자가 시스템 관리를 목적으로 데이터를 정리할 때 사용되는 유틸리티이다. 모든 개발자에게 이런 유틸리티가 필요하다고 할 수는 없지만, 대용량 입출력 데이터(특히 텍스트로 된)를 다룬다면 꼭 배워둘 것을 권하고 싶다. 사실 하루정도만 배우고 연습해도 바로 사용이 가능할 정도로 배우기 쉽기 때문에 일단 익혀두면 죽기전에 본전은 찾을수 있을것이다. 특히 엑셀로 csv파일 데이터를 자주 정리한다면 같은 일을 sed/awk로 해보기를 권유한다.
grep이 라인단위로 원하는 패턴을 찾아서 출력해주는 유틸리티라면 sed는 grep에 편집 기능을 더했고, awk는 여기에 열단위 편집기능과 프로그래밍을 통한 편집 기능이 더해졌다고 할 수 있다.
나의 경우에 있어서, CAN통신 로그 파일과 같이 행과 열이 구분자(공백이나 , 혹은 : )로 분리된 데이터 파일에서 특별한 값을 가지는 데이터만 필터링하여 추출할 때 awk를 사용한다. 대부분의 경우 이러한 통신 로그 파일은 GUI로 구현된 전용 분석 툴이 있어 로그를 쉽게 분석할 수 있지만, 분석 파일이 크고 갯수가 많은 경우 또는 반복적으로 동일한 분석을 수행하여야 할 경우에 awk를 사용한다면 정말 큰 시간을 절약할 수 있다. 실제로 awk를 사용하기 전에 이틀간 수행했던 일을 awk로 한시간만에 끝낸적이 있다. (물론 동일한 작업을 perl등의 스크립트 파일을 사용하여 수행할 수도 있겠다.)

4. vim 에디터 : vi와 이맥스에 대한 해묵은 우열 논쟁이 있고 한편으로는 많을 개발자들이 윈도우즈 환경의 GUI 에디터를 사용하며 코웃음을 치고 있지만 임베디드 환경에서는 vi에디터는 기본으로 알고 있어야 한다. 이는 타겟 시트템이 이맥스나 윈도우용 에디터를 못돌리는 경우에도 vi 에디터는 사용할 수 있는 경우가 많고 무엇보다 공짜/상용 에디터중에 이만한 에디터를 찾기 힘들기 때문이다. 나도 손에 익은 윈도우용 에디터가 있가 있지만, 사용 목적에 따라 vi와 윈도우용 에디터를 번갈아 사용하며, 각기 장단점이 있어 vi를 결코 버릴 수는 없을 것 같다. 윈도우용 에디터는 노력하지 않아도 60%기능은 알고 시작하지만, vi는 노력하지 않으면 사용하기가 결코 만만하지 않다. vi가 별로라고 생각한다면 아직 vi 사용을 위해 별다른 노력을 하지 않았기 때문에다. 참고로 vi를 사랑하려면 ctag와 cscope를 사용하는 방법은 꼭 익혀놓자.

5. grep : 로그 분석을 위해서 sed나 awk를 추천했지만, 로그분석보다 더 자주 해야 하는게 소스 분석이다. 사실 소스 분석을 awk로 해도 grep보다 손색이 있는 것은 아니지만, 쥐잡는데 소잡는 칼 쓸 필요는 없을 것 같다. grep과 find를 함께 사용하여 원하는 내용을 쉽게 찾는 방법은 꼭 익혀 놓자.