임베디드 프로그래머가 본 “어플리케이션” 소프트웨어가 중요한 이유
목차
당신이 프로그래머라면 어느 분야를 가더라도 “어플리케이션”에 관심을 기울여야 하는 이유
제가 프로그래머를 시작한게 된 계기는 재밌게도 당시 다니던 “회사의 권유” 때문이었습니다. 원래 제가 시작했던 분야는 “FPGA” 의 Logic 을 개발하는 일이었지요.
전공이 전자공학이다 보니 학교 다닐때 접하는 분야가 주로 전자회로 혹은 회로이론 같은 과목이었습니다. 그러다가 전공 수업 중에 “ASIC 시스템 설계” 라는 과목에서 FPGA와 ASIC 에 대한 개념을 접하게 되면서 그쪽 분야가 꽤나 흥미롭게 느껴졌습니다.
FPGA의 경우에는 우리가 흔히 알고 있는 반도체 칩의 내부를 설계자가 “프로그래밍”을 하여 설계를 하는 특수한 시스템 반도체를 의미합니다. 내가 직접 칩(시스템 반도체)을 설계한다는게 꽤나 멋있고 재밌었던 모양입니다.
당시 지도 교수님이 스타텍폰으로 유명한 “모토로라” 출신이었지요. 따라서 FPGA나 ASIC 쪽은 꽤나 경력이 있으신 분이었습니다. 물론 학부 시절에는 그 내용에 대해서 자세히 알기는 어려웠고 겉핡기 수준이었지요.
그 수업을 들으면서 “C언어”의 중요성도 알게 되었습니다. 시스템 반도체를 설계하려면 필시 C언어가 필요하다고 설명하셨지요. 그러나 당시만 해도 왜 “C언어”가 필요한지는 전혀 이해하지 못했습니다.
그렇게 대학을 졸업하고 처음 입사했던 회사. 원래 FPGA 를 설계하는 포지션은 학부 졸업 만으로는 취업하기가 굉장히 어려웠습니다. 그런데 작은 중소기업에서 저를 다행이도 뽑아주더군요. 아무것도 모르는 신입이라 저임금을 받고 뽑힌 거지만 그럼에도 FPGA를 다뤄볼 수 있다는 점 때문에 좋은 기회라고 생각하고 나름 열심히 하려고 했던거 같습니다.
작은 회사였지만 나름 “팹리스” 회사 였습니다. 직접 FPGA를 설계하여 충분히 검증을 한 다음에 실제로 “ASIC” 화 하여 실제로 시스템 반도체를 시장에 출시했었습니다. 물론 출시한 칩이 시장에서 성공을 거두진 못했지만 말이죠.
회사에 입사하고 나서 교육을 받았던 기술들은 “Verilog” 라는 시스템 설계 언어와 “ARM Core” 관련 내용이었습니다. 저도 실제 업계에서 “ARM” 이 그렇게나 많이 쓰이고 중요한지 회사에 가서야 알았네요. 그리고 그런 교육과 회사에서의 경험은 지금 생각해 보니 큰 도움이 되었던거 같습니다.
하지만 결국 저는 “FPGA 설계” 분야의 경력을 이어나가진 못했습니다. 그 이유는 당시 회사에 해당 분야의 내놓으라 하는 선배님들이 계셨기 때문이지요. 그 분들의 설계 실력은 아마도 “국내 탑” 이지 않을까 싶습니다.
그런 상황에서 제가 FPGA 설계 분야로 설 자리가 사실 좁았습니다. 회사 입장에서도 저를 굳이 관련 업무에 투입시킬 이유도 전혀 없었지요. 그래서 제안을 받은 것이 “소프트웨어” 쪽으로 전환을 하라는 것이었습니다.
일단 처음에는 단연코 거부했습니다. ㅎ 그 이유는 제가 목표로 했던 분야가 아니었기 때문이지요. 또한 2000년대 초중반인 당시만 해도 프로그래머들의 대우는 결코 좋지 않았습니다. 그래서 미래를 위해 “싫다” 라고 하고 제안을 거절했습니다.
그러나 회사의 입장도 단호했습니다. 제가 프로그래머를 하지 않으면 회사에서 설 자리가 없다고 “압박”을 하였죠. 얼마 되지 않는 경력과 회사를 그만두게 될 지도 모르는 두려움 때문에 어쩔 수 없이 회사의 제안을 받아들였습니다.
당시에 주로 했던 업무는 FPGA로 개발된 시스템 유지보수 업무였습니다. FPGA로 개발된 특정 알로리즘의 칩은 리눅스 기반에 시스템에 탑재되었고 그 칩을 동작시키기 위해 “리눅스 드라이버” 와 관련 API 라이브러리가 개발이 되었지요.
드라이버와 API 라이브러리는 수시로 유지보수와 업데이트를 해줘야 했습니다. 개발된 시스템을 납품한 “갑”사에서 유지보수 요청을 하면 그 대응을 해야 했었기 때문이었습니다. 원래 시스템이라는게 끊임없이 유지보수와 업데이트 이슈가 발생하니깐요.
굼벵이도 구르는 재주가 있었을까요? 학교 다닐때 전공 시간에 C언어를 다뤄봤던 제가 2년동안 이리 저리 치이고 경험을 하다 보니 스트레스는 많이 받았던 거 같지만 조금씩 조금씩 눈에 들어오기 시작하더니 개념이 약간씩 잡혀가는 거 같았습니다.
물론 주로 했던 일은 유지보수 였고 리눅스 기반의 드라이버와 API 라이브러리를 다루다 보니 그 폭은 약간 제한되어 있었다고 밖에 볼 수 없었습니다. 그럼에도 제가 임베디드 리눅스 프로그래머로 경력을 이어나가는 데에는 큰 도움이 되었던거 같았네요.
그러다 너무 낮은 연봉 때문에 안되겠다 싶어서 이직을 시도했는데, 아이러니 하게도 “순수 어플리케이션” 분야로 진출을 하게 되었습니다.
극단적인 낯선 경험, 그리고 엄청난 스트레스
일반적인 사람들은 “극단적인 환경변화”에 굉장한 스트레스를 받게 됩니다. 더운 아프리카나 중동 지역에 사는 사람들이 갑자기 “시베리아”에 가서 살게 된다면 적응하기가 꽤나 어려울 겁니다.
그런데 FPGA나 ASIC, 하드웨어, 디바이스 드라이버 등을 다루던 엔지니어 출신의 프로그래머가 갑자기 “웹”이나 “안드로이드 앱” 같은 분야의 개발을 하게 된다면? 그런 갑작스런 변화가 제게 찾아오게 되었지요.
어느정도 C언어를 다룰 줄 알고 로우 레벨(low level)의 소프트웨어를 다루던 제가 웹 서버나 순수 리눅스 어플리케이션을 개발하는 회사에 이직을 하게 되었습니다. 사실 이 회사를 오려고 전혀 예상치 못했지만 희망하던 회사들이 죄다 불합격하는 바람에 대안으로 오게 되었던 것이지요.
학교 다닐 때 리눅스 기반에서 APM(Apache + PHP + Mysql)을 설치하여 웹서버를 잠깐 운영해 본 경험은 있었지만 그건 공부용이었지 실무 경험은 전혀 없었습니다. 그런데 이직한 회사에서 통신 서버를 개발하고 유지보수를 하는 일을 맡았는데, 이건 정말 제겐 딴 세상의 일과 다름이 없었지요.
이전 회사에서는 하드웨어 엔지니어들이 회로 설계를 하고 저수준의 프로그래밍을 하였으나 이직한 회사에서는 웹 서버의 DB를 다루고(Mysql) 리눅스 데몬을 개발 및 수정을 하는 업무를 맡았는데 전혀 경험이 없다보니 엄청난 스트레스와 시행착오를 겪었던거 같습니다.
이렇게 1여년을 정신없이 보내다 보니, 어느 순간 제가 PHP 를 다루고 있더군요. 제가 주로 써온 언어가 C 언어였는데, 필요에 의해서 PHP 를 사용할 수 밖에 없는 상황이 되버린 것입니다. 그 이유는 웹 GUI 가 동작하던 통신 장비 시스템이었는데 이 시스템을 유지 보수를 하다보니 자연스레 웹 GUI 쪽의 코드인 PHP 를 터특해야 했기 때문입니다.
이 때부터 서버 즉 백엔드(Back-End) 쪽을 다루게 되었던거 같네요. 또한 리눅스에서 “데몬”의 개념과 쉘 스크립트 등등의 리눅스 시스템의 전반적인 개념을 나름 빠른 시간내에 익히게 된거 같습니다.
그런데 당시에는 “리눅스 커널 or 디바이스 드라이버” 등의 부분을 더 해보고 싶었으나 그 부분은 전혀 할수가 없는 회사에서 철저히 “어플리케이션” 분야만 하게 되는 상황이 불만스러웠었나 봅니다. 그런데…
시간이 지나고 보니 “어플리케이션”을 개발했던 경험은 매우 소중했다
PHP와 쉘 스크립트만 다루던 회사에서 임베디드 리눅스 기반의 네트워크 장비를 개발하는 회사로 이직을 하게 되었습니다. 이제 드디어 나름 해보고 싶었던 “임베디드 시스템”을 해본다는 기대가 있었던거 같습니다.
임베디드 시스템을 다뤄보는 것에 흥미를 느끼는 것은 당시보다 10여년이 지난 지금도 변하지는 않았습니다. 하지만 임베디드 업계에 지속적으로 몸담은 현재는 약간 아쉬운 부분도 있게 되었지요.
여전히 현재까지도 “임베디드 업계”에 몸을 담고 있습니다. 물론 지금은 직접적인 개발이 아닌 메이저 칩셋 제조사의 FAE를 통해 “기술지원” 형식으로 계속 업계에 일을 하고 있지만 이제는 위의 글들과 같은 이유로 순수 어플리케이션을 해보고 싶은 생각이 있습니다.
그러고 보니 예전에 순수 리눅스 어플리케이션과 PHP를 통해 웹 GUI 를 다뤄보던 시절의 경험이 꽤나 제게는 소중한 시간이었던거 같네요. 당시만 해도 웹이나 순수 앱쪽의 대우가 좋지 못해 그쪽분야로 진출하고 싶지 않았던 시절이었으니 말이지요.
당시에는 “하기 싫은 일”을 억지로 한다고 생각했는데, 현재 순수 어플리케이션 분야가 위상이 예전과는 천지차이가 되버리게 되니 “꽤 아쉬운” 거 같습니다. 그 때 당시에 다시 임베디드 분야로 이직을 하지 말고 같은 분야로 진출을 했으면 어땠을까? 라는 생각이 드네요.
물론 지난 시간은 되돌릴수 없지만 이후에 몇군데 회사에서 일을 하면서 “어플리케이션” 분야에 나름 센스가 생겼던 것은 꽤나 제겐 강점이 되었던거 같습니다. 이런 점 때문에 이전 회사에서도 꽤나 플러스 점수를 받았기 때문이지요. ㅎㅎ
당신이 임베디드 업계에 있더라도 “어플리케이션”을 직접 만들어 보라
최근에 저는 시간이 날 때마다 “플러터”로 안드로이드 앱을 만들어 보려고 하고 있습니다. 개인적으로는 안드로이드 앱 개발 분야로 진출해 보고 싶은 생각이 있지만 관련 경력이 없다보니 쉽지가 않네요.
모바일 쪽 개발은 여전히 수요가 많고 필요 인력도 부족한 거 같습니다. 또한 제가 평상시에 흥미로워 했던 앱들도 내가 직접 만들어 볼 수 있으니 그만큼 재밌지 않을까? 라는 생각도 듭니다. (물론 돈이 되는 것과는 별개로요~)
작년에 제가 “자유로운 프로그래머”로 살기 위해 잠시 회사를 그만두고 준비를 했던 적이 있었는데요,
이 때 만약 앱쪽으로 충분한 경험을 하고 앱을 출시 했으면 어땠을까? 라는 생각도 해봅니다. 회사를 그만두고 대략 4개월 동안 순수 어플리케이션 관련 공부도 많이 하고 이런 저런 코드도 짜봤는데 하면 할수록 재미가 있었던거 같았네요.
만약 충분한 자본만 있었다면 아마 지금쯤 계속 자유로운 프로그래머로 살고 있었을 수도 있지 않았나 추측해봅니다. 가지고 있는 “돈”이 부족해져서 어쩔 수 없이 다시 직장인으로 복귀 한게 좀 아쉽네요.
약간 잡설이 길었지만 이 문단에서 제가 말씀드리고 싶은 것은 “순수 어플리케이션” 쪽의 경험을 반드시 많이 쌓아보라~고 하고 싶습니다. 제가 개발 경력을 쌓으면서 대략 2년동안 “순수 어플리케이션” 을 다루는 회사를 경험했었는데, 이때의 경험이 지금까지도 꽤나 유용하고 소중했던거 같습니다.
당신이 만약 임베디드 업계에 종사하더라도 이제는 “리눅스 커널” 이나 “드라이버” 쪽에 치우치기 보다는 리눅스 어플리케이션이나 웹쪽에 관심을 가지는게 좋습니다. 이제 임베디드 특히 임베디드 리눅스 쪽 시스템 개발시에도 커널이나 드리이버를 직접 짜는 시대는 어느정도 지났다고 보시면 됩니다.
워낙 사용하는 SoC 의 성능이 좋아지고 칩셋 제조사에서 SDK도 잘 제공이 되기 때문에 실제로 시스템을 동작시키는데 필요한 “어플리케이션” 즉 “데몬”을 잘 짜는게 중요하다고 생각됩니다.
따라서 “어플리케이션”을 잘 구현하고 예외 처리를 잘 하는 기술에 대해 관심과 경험을 많이 쌓아보세요. 당신이 임베디드 관련 회사에 다니고 있더라도 만들어져있는 코드가 아닌 본인이 직접 잘 짠 코드가 시스템에 안정적으로 잘 동작하도록 개발할 수 있는 수준이 된다면 임베디드 뿐만 아니라 순수 어플리케이션 분야로도 진출이 수월할 겁니다.
마지막으로 한마디만 더 해보겠습니다.
프로그래머는 어플리케이션을 잘 만들어야 한다