내가 LG 자기소개서란에 적었던 것을 옮겨적은 것이다.
열정
고등학교 때, 컴퓨터 공학으로 진로를 결정했을 때 부터 스스로 다짐했던 것이 있었습니다.
그것은 바로 '한가지 분야에 대해서 전문가가 되자' 였습니다.
대학교 1학년 여름방학 때, 대자보를 보고 우연히 들어가게 된 벤처동아리에서 그 전에는 몰랐던 컴퓨터의 폭넓은 분야를 다양하게 접해볼 수 있었습니다. 그 중에서도, 가장 인상 깊었던 것은 바로 리눅스 였습니다. 특히, 몇 시간동안 인터넷을 통해 찾아낸 영문서를 놓고, 며칠 동안 밤을 새서 랜카드를 잡았을 때의 희열은 무엇과도 바꿀 수 없었습니다.
그렇게 하나씩 모르던 것을 새롭게 알아갈 때마다 즐거움은 더했습니다. 이 후 교내 학생들을 대상으로 한 웹 호스팅 서비스를 시작하면서 부터 서버와 네트워킹, 보안에 관해서 관심 있게 배울 수 있었습니다.
3 학년때 인도 IT 연수 교육에 선발되어, 현지인들과 1년 동안 뱅갈로르에서 IT 기술을 배우면서 한층 폭넓은 시야를 가질 수 있었습니다.
4 학년때 복학해서 서버로 주로 사용되던 리눅스가 임베디드 분야에서 한창 각광을 받고 있다는 얘기를 듣고, 한편으로는 신기하기도 하고, 새로운 분야에 대해 공부해보고 싶다는 호기심이 생겼습니다. 임베디드 리눅스를 공부하면서, 전에는 몰랐던 리눅스라는 운영체제에 대해 좀 더 깊이 있게 알 수 있었습니다.
졸업 후에 디지털 셋톱박스 개발 회사에 입사했습니다. 하지만, 일을 해나가면서 저 스스로 부족함을 많이 느꼈습니다.
배움에는 왕도가 없다는 생각을 새삼스레 다시금 하게 됩니다. 고인 물이 언젠가는 썩듯이, 하루가 다르게 변하는 요즘 같은 정보화 사회에서는 새로운 기술에 열린 자세를 가지지 못하면, 결국은 도태될 수 밖에 없다는 것을 사회생활을 하면서 깨닫게 되었습니다.
그래서 대학원 진학을 결심하게 되었습니다.
항상 겸손한 자세로 모든 일에 대해 초심의 열정으로 임한다면 세상에 못할 것은 없다고 생각합니다.
앞으로도 이런 저의 생각이 헛되지 않도록 항상 노력할 것입니다.
성취
지금와서 돌이켜 보면 크게 두 가지가 있습니다.
첫번째는 4학년 졸업작품을 준비할 때 였습니다.
4학년동안의 배운 것을 하나의 결과물로 만들어내야 했기에 나름대로는 부담이 컸었습니다.
특히, 저사양의 PC 들을 묶어서 고성능을 낼 수 있도록 하는 클러스터를 만들 때는 가장 힘든 일이 PC 를 구하는 일이었습니다. 학교를 수소문한 끝에 어렵게 창고에 쌓아둔 MMX 컴퓨터 10 대 정도를 구할 수 있었습니다. 테스트를 통해 그 중에 제대로 작동하는 부품들을 끼워 총 5 대의 PC 를 구할 수 있었습니다. 각각의 PC 에 리눅스를 설치하고 나서, 허브로 연결된 Master node 와 Slave node 를 부팅하고 외부에서 접속했을 때 제대로 Loadbalancing 이 되는 모습을 본 날은 밤 늦도록 잠을 이루지 못한 기억이 있습니다.
두번째는 집 부터 해남 땅끝까지 갔던 도보여행입니다. 회사를 그만두고, 대학원 진학에 대한 막연한 목표와 조급함만이 있었을 때 제 자신을 시험해보고 싶었습니다. 그리고 그 때 당시 읽었던 한비야님의 책을 읽고 도보여행을 결심했습니다. 처음에는 '과연 내가 할 수 있을까?' 하는 의구심이 앞섰지만, 하루하루 해남에 가까워 질수록 몸과 마음은 가벼워졌습니다. 차로는 약 10 분이면 갈 수 있는 거리를 1 시간 넘게 걸으면서, 너무 빠르게 지나가서 미쳐 보지 못했던 내 자신을 뒤돌아 볼 수 있었습니다.
목적지인 해남 땅끝 탑에 올랐을 때, '이보다 더 힘든 일도 마음만 먹으면 할 수 있다' 라는 자신감을 얻을 수 있었습니다.
15 일 동안의 여행동안, 길위에서 만났던 사람들과의 따뜻한 인심과 몸소 체험했던 에피소드들은 아직도 생생히 기억에 남아있습니다.
실패
회사에 들어와서 처음으로 POD 디바이스 드라이버를 개발하는 일을 맡게 되었을 때입니다. 타겟보드에 POD 를 꼽고, 초기화를 해주고, CIS Tuple 을 읽어야 하는 부분에서 에러가 발생하는 문제였습니다. 디버깅을 해보니 특정 Tuple 에서만 잘못된 값을 읽고 있었습니다.
원인을 찾기 위해, 여러가지 타겟보드와 여러가지의 POD Card 를 놓고 테스트를 해봤습니다. 그 결과 같은 프로그램을 실행해도 각각의 보드마다 다른 결과를 나타냈습니다. 저는 Software 문제는 아니라고 단정하고, Hardware 문제라고 생각했습니다. 하지만 Hardware 에서도 특별한 원인을 찾아내지 못했고, 결국 문제의 원인을 밝혀 내는데, 많은 시간을 소비하게 되었습니다.
그 후에 타겟보드에서 POD 로 들어가는 신호 중 하나가 반대로 출력되어 발생하는 문제로 밝혀졌습니다. 이 일을 계기로 스펙문서와 데이터시트를 꼼꼼히 읽어야 한다는 값진 교훈을 얻었습니다.
역량
대학교 1 학년때부터 교내 벤처 동아리에서 여러가지 프로젝트를 경험하였습니다.
1 학년때는 교내 벤처동아리 홈페이지 서버를 구축 및 관리하였습니다. 2 학년때는 리눅스의 Samba 를 이용한 CD 백업 시스템 프로젝트에 참여했습니다. 또한 리눅스원 강의교재의 리눅스 네트워킹, 프로세싱 관리 파트를 집필했습니다. 그리고 교내 재학생과 일반인들을 대상으로 무료 웹 호스팅 서비스를 제공했습니다. 책으로만 보고 알고 있던 것들을 실제로 서비스를 해봄으로써 책 이외의 많은 것들을 배울 수 있었습니다.
3 학년때는 인도 IT 연수 교육에 선발되어, 1 년동안 Oracle DBA 과정을 수료하였습니다.
인도의 현지인들과 함께 공부하면서 기초학문을 중시하는 그들의 교육방식이 부럽기도 했습니다. 하지만 전반적으로 낮은 생활수준을 보면서 내가 참 좋은 환경에서 풍요롭게 살고 있구나 하는 생각도 들었습니다. 또한 한국인이라는 자부심을 느낄 수 있었던 좋은 기회였습니다.
4 학년때는 리눅스 커널을 이용한 CheckPoint 와 SnapFS 를 구현했습니다. CheckPoint 는 리눅스 커널에 System Call 을 이용해서 중단된 프로세스의 검사점(CheckPoint)을 이용해서 복구가 가능하도록 하였습니다.
SnapFS 는 리눅스 커널상에서 원하는 시간에 파일시스템의 상태 이미지를 저장할 수 있게 구현하였습니다.
졸업 작품으로는 로드밸런싱 클러스터와 임베디드 시스템을 이용한 웹에서의 가전제품 제어를 구현했습니다.
로드밸런싱 클러스터는 총 5 대 중 1대의 Master node 와 4 대의 Slave node 를 묶어서 앞단의 Master node 가 Slave node 로 라운드로빈 또는 우선순위를 할당하여 부하를 분산하는 방식을 사용했습니다. 이 때 Master node 가 예기치 않은 문제로 죽었을 경우에, Slave node 중에 한 node 가 Master node 가 되어 역할을 수행하게 됩니다. 이 후 이전의 Master node 가 복귀하게 되면, 현재 Master node 는 다시 원래의 Slave node 로 돌아가게 됩니다.
임베디드 시스템을 이용한 웹에서의 가전제품 제어는 SA-1110 타겟보드에 리눅스 커널 2.4.18 을 포팅하고 goahead 웹 서버를 올려서 GPIO 에 연결된 전기 스탠드를 외부에서 제어할 수 있도록 구현했습니다.
성격
약점은 제가 고지식하다는 점입니다. 특히 제가 관심있는 분야 외에서는 고지식한 편입니다.
특히 친구들이나 나이 어린 후배나 동생들과 대화를 할 때 많이 느낌니다.
강점은 주어진 일에 대해 적극적으로 임한다는 것입니다.
일단 하겠다고 마음을 먹으면 어떻게 해서든 끝을 보는 성격입니다. 설사 결과가 실패라고 할지라도, 저 스스로가 납득할 수 있을 정도로 최선을 다했기 때문에 이에 대한 후회는 없습니다.
오히려 실패를 본보기 삼아 다음에 같은 실패를 되불이 하지 않도록 왜 실패했는지, 실패한 요인이 무엇인지에 대해 분석합니다.
두번째는 한번 배운 것은 절대 잊어버리지 않도록 문서화를 한다는 것입니다.
사람인 이상, 오늘 알았던 지식도 어느정도의 시간이 흐르면 자연스럽게 잊어버리기 마련입니다. 그래서 저는 대학교 1 학년 때부터 동아리 선배의 조언으로 문서화를 하는 습과을 길렀습니다. 예를 들어, 한 프로그램에 대해서 디버깅을 했다면 어떤 이유로 인해서 어떤 부분을 어떻게 디버깅을 했다면 어떤 이유로 인해서 어떤 부분을 어떻게 디버깅 했는지에 대해 일종의 디버깅 일지를 만듭니다. 이렇게 하면 몇달 뒤에라도 프로그램에 문제가 생겼을 때, 제일 먼저 이 문서를 참고 함으로서 디버깅 시간을 줄일 수 있습니다. 또한 다른 사람과 의견을 교환할 때도, 말로 설명을 해주는 것보다는 문서를 보여주면서 설명을 하는 방법이 더 효율적입니다.
현재는 위키(wiki) 를 사용해서 문서화 관리를 하고 있습니다.
10 년 후
그 동안 얻은 경험과 노하우를 바탕으로 저와 같은 길을 걷고 있는 후배들을 위한 밑거름이 되고 싶습니다.
엔지니어로 볼 때 가장 뛰어난 기술을 꼽으라면 그것은 바로 경험이라고 생각합니다. 10 년이라는 기간이 짧다면 짧을 수도 있고 길다면 길수도 있는 기간이라고 생각합니다.
그 동안 제가 경험했던 시행착오를 똑같이 겪지 않도록 후배들에게 모범이 될 수 있는 멘토이자 친구 같은 조언자가 되고 싶습니다.
언제나 현재의 자리에 연연하지 않고, 언제나 초심의 마음으로 먼저 솔선수범 할 수 있는 사람이 되고 싶습니다.
경력
지상파 HD & SD SetTop 개발 (STI7710)(2005.1 ~ 2005.12)
- 튜너 디바이스 드라이버 개발 및 포팅
- BSP 포팅, Platform 세팅 및 하부 디바이스 드라이버 개발
- BSP 개발(Serial Down)
OPENCABLE HD & SD SetTop 개발 (STI5517 & STI7020)(2003.12 ~ 2005.1)
- POD(Point-Of-Deployment) 개발 및 디바이스 드라이버 개발
- 디바이스 드라이버 개발(DVI)
상세 기술서
2 년 1 개월의 재직기간 동안 주로 디바이스 드라이버의 개발과 포팅을 담당했습니다. 또한 회사에서 사용한 RTOS 를 이용한 BSP 개발을 담당했습니다.
1 년 차에는 OPENCABLE HD & SD SetTop 개발 프로젝트에 참여했습니다. HD 의 경우에는 STI5517 과 STI7020, SD 의 경우에는 STI5517 Platform 에서 개발했습니다.
여기서 POD(Point-Of-Deployment) 의 디바이스 드라이버와 애플리케이션 개발을 담당했습니다. POD 의 Physical Part(CIS check, Personality Change, Buffernego) 와 Application Part(각 통신 Layer 와 MMI, Application Info 등)을 개발했습니다.
3 개의 Task 를 사용해서 POD 의 삽입여부를 판단하고, CIS 의 특정 Tuple 값을 읽어들여서 인증 받은 POD Card 인지를 판단합니다. 하드웨어 인증을 거치면, COR Write 를 통해 Personality Change 를 수행합니다. 그 결과, POD 와 SetTop 은 Attribute Mode 에서 IO Mode 로 바뀝니다. 이제 POD 와 SetTop 과 상위 애플리케이션 상에서의 통신을 위해서 Buffernegotitaion 을 수행합니다. 이 과정이 끝나면, 하위부터 Physical Layer, Link Layer, Transport Layer, Session Layer, Resource Layer, Application Layer 까지의 통로를 통해 서로간의 통신이 가능합니다.
2 년 차에는 지상파 HD & SD SetTop 개발 프로젝트에 참여했습니다. HD 와 SD 모두 STI7710 의 One-Chip Platform 에서 개발했습니다.
여기서 BSP 개발 및 포팅과 하부 디바이스(Tunner, A/V, Flash, EEPROM 등) 드라이버 개발을 담당했습니다.
SetTop 이 부팅해서 하나의 완벽한 동작을 수행하기까지의 각각의 하부 하드웨어 모듈 디바이스들이 동작하도록 했습니다. 또한 차후에 프로그램의 업데이트를 위해서, 시리얼 포트를 이용한 업데이트 다운로드 기능을 개발했습니다.
연구실적
수행 프로젝트
Embedded S/W Design and Verification Techniques for MPSoC (MPSoC 용 임베디드 S/W 설계 및 검증 기술 개발)
기존의 SoC 를 개발하기 위한 설계 도구들은 거의 대부분 하드웨어 설계에 초점을 맞추고 있습니다. 하지만, MPSoC 를 개발함에 있어서 하드웨어 개발 보다도 소프트웨어의 개발에 비중이 커지고 있습니다. 이런 추세에 따라 MPSoC 를 대상으로 임베디드 소프트웨어를 설계하고 검증하는 프레임워크를 개발하는 것을 목적으로 합니다.
세부전공
예전에는 코드를 만들어내는 데에 초점을 두었다면, 이제는 얼마나 효율적으로 코드를 만들어내는 데에 초점을 두고 있습니다. 이에 따라 프로그램의 제작보다는 유지보수가 점점 중요해지고 있습니다. 실제적으로 프로젝트의 대부분을 새로운 코드를 만들어내기 보다는 기존의 코드를 디버깅하는 데 소요되고 있습니다.
버그는 사람이 프로그래밍을 시작하면서 부터 생겨난 개념입니다. 프로그램도 사람이 만드는 이상 완벽할 수는 없습니다. 점차 디버깅에 대한 관심이 높아지면서 어떻게 하면 프로그래머가 좀 더 쉽게 프로그램의 오류를 찾아낼 수 있고, 생산성을 높일 수 있는 지에 관해 여러가지 연구들이 이루어지고 있습니다.
특히 실시간 시스템 소프트웨어에서의 디버깅은 비결정성(Nondeterministic) 이라는 소프트웨어적인 특징과 이기종(Heterogeneous) 간의 하드웨어적인 특징 때문에 일반적인 디버깅과는 많이 다릅니다.
현재는 ARM9 S3C2410 기반의 단일 프로세서 플랫폼에서 소프트웨어 오류가 발생했을 때의 상태를 Record & Replay 함으로서 오류가 발생했을 때의 상태를 재현하는 방법을 연구하고 있습니다.
희망 연구 분야
임베디드 시스템을 효율적으로 테스팅하고 검증할 수 있는 분야에서 일해보고 싶습니다.
나아가서는 Hardware 와 Software 를 아우르는 솔루션을 만들어보고 싶습니다.