회사 선배들 중에 CTS 개발자(퀄컴, 인텔, 엔비디아 기술 지원)로 일하는 분을 만나면 제조사 개발자들와 의사소통을 하는데 많은 시간을 보낸다고 합니다. “재현 경로는 뭔가요? 로그를 좀 더 추가해서 재현시켜 주세요. 공장에만 재현이 된다고요? 시에틀에서만 재현이 된다고요?”  사실 칩셋 벤더(퀄컴, 인텔, 엔비디아0에게 기술문의를 할 때는 영어로 칩셋 벤더가 만든 사이트에 문제를 업로드해야 합니다. 그런데 사실 제조사의 개발자들은 영어를 못하죠. 또한 아예 글을 쓰는 능력이 떨어지는 경우가 많아 명확히 이슈에 대한 설명을 못하는 경우가 많습니다.

그런데 가끔 자신의 책임을 전가하기 위해 일부러 재현경로를 다르게 칩셋벤더에게 공유하는 것을 본 적이 있습니다. 한국에서도 재현이 잘되는 이슈인데 보름 정도 놀면서 이슈를 썩혀 놓았다가 칫셉 벤더(퀄컴, 인텔 등등)에게 이슈를 문의합니다. 한국에서는 절대 재현이 안된다고 적습니다. 사실 100% 재현이 되는 데 말이죠. 미국에서만 재현이 된다고 합니다. 보름 동안 난 한국에서 재현을 시키느라고 고생을 했다고 이런 저런 가짜 정보를 적습니다.

이런 거짓말을 하는 이유는 사실 대부분 임베디드 관리자들이 칩셋 벤더 기술 문의 즉 이슈 tracking site 메일의 cc로 등록된 경우가 많기 때문입니다. 한국에서 100% 재현이 되는 이슈인데 보름 후에 칩셋 벤더에게 기술 문의를 한 것을 부서장이 알 수도 있죠. 결국 시간이 지나면 부하 직원이 일을 안하고 먹고 놀았다는 것 알게 되는 것이죠. 물론 관리자들이 이 사실을 알면 개박살을 내겠죠. 발길질에. 욕설에. 나가 죽어라, 소새끼 말새끼, 밥도 먹지 말아라 등등.

그래서 퀄컴에 기술 문의 사이트(Service Request)를 통해서 문의를 하면 대부분 퀄컴 CTS(Customer Technical Server)엔지니어들은 뭐 문의 내용에 답신은 하지 않고 RAM DUMP 달라고 합니다. RAM DUMP없다고 하면 이러 저렇게 하면 RAM DUMP 추출을 할 수 있으니 문제를 재현시켜서 RAM DUMP를 뽑아서 달라고 하죠. 퀄컴 개발자들은 RAM DUMP 없이는 거의 움직이지 않습니다. 왜냐하면 RAM DUMP에는 문제가 발생하였을 시에 snap shot을 그대로 뜬 것이라(어떤 문제가 생겨서 특정 프로세스에서 abort 즉 crash가 발생할 경우 그 코어의 handler에서 다른 프로세스에 irq를 바로 trigger하여 다른 각 프로세스를 suspend시키고 바로 cache를 flush시킴), RAM DUMP만 보면 어떤 이유로 타겟(폰 혹은 디바이스)에 문제가 발생 하였는지 바로 파악할 수 있기 때문이죠. 당연히 쓸때없이 서로 메일을 주고 받거나 전화 통화를 하는 시간을 줄일 수 있습니다. 램 덤프로 모든 디버깅 정보를 다 볼 수 있기 마련이죠.
제조사의 개발자가 SIM이 없는 상태였다, SDCARD가 없는 상태라고 거짓말을해도 RAM DUMP를 보면 다 나옵니다. Airplane 모드였다라고 뻥을 쳐도 디버그 용 변수를 까보면 다 들통이 나죠.

이렇게 일하는 것을 보면 칩셋 벤더가 제조사 개발자로부터 참 많이 골탕을 먹은 것 같습니다. 칩셋 업체에게 있는 그대로의 디버깅 정보를 공유하는 것은 상식인데 말이죠. 같은 개발자로써 기본적인 자존심과 지켜야 하는데 말이죠.

훌륭한 임베디드 관리자 및 부서장이 되기 위한 조건에 대해서 살펴보도록 하자.

임베디드 부서의 부서장들은 개발자를 기술적으로 리드할 줄 알아야 한다. 기술적인 내용을 개발자보다 많이 알아야 된다는 의미는 아니다. 개발자들과 개발자들의 언어로 충분히 의사소통을 할 수 있는 능력과 더불어 개발자들이 보지 못하는 프로세스적인 관점으로 문제를 잘 해결할 수 있도록 만들어주는 환경을 만들어 주는 것을 말한다.

기본적으로 부서원들의 기술적인 내용이 담긴 보고를 명확히 이해를 해야 하는 것은 기본이다. 최소한 모듈의 개발자만큼 깊이 있게 기술적인 내용을 파악하지 못하더라도 담당자에게 몇 가지 질문을 던지면서 이해를 해야 한다. 기술적 배경 지식은 관리자들이 정말로 알기 힘든 자신의 아킬레스 건이라고도 할 수도 있고 혹은 가장 쉽게 키울 수 있는 역량이라고도 할 수 있다. 기술적인 내용은 자신의 노력으로 예를 들면 시간을 내어 짬짬이 메일이나 코드를 분석을 통해 알아내고 이해할 수 있기 때문이다.

개발자들은 관리자들이 기술적인 내용을 이해 못해서 딴 소리를 하는 순간은 정확히 알아챈다. 또한 그런 관리자를 저열한 관리자로 바라본다. 임베디드 개발자들은 기술 지식의 내공에 대한 프이드도 높고 어찌보면 고지식한 놈들이 많기 때문이다.  이럴 때 개발자들 사이에서 조용히 소문이 퍼진다. “누구 누구 허접이래”.
난 컨퍼런스 콜이나 회의에서 임베디드 기술적 지식이 부족한 관리자가 여러 개발자 앞에서 딴소리(ex: 와이 파이 콜은 시스템 콜에서 어떻게 불려요?)를 할 때 개발자들의 눈빛이 갑자기 바뀌는 순간을 선명하게 기억한다. 황당한 눈빛이다. 정말로 개발자들에게 개망신을 당하지 않기 위해서는 임베디드 개발실 부서장들은 쉬지 않고 기술적인 내용에 대해 필사적으로 공부를 해야 한다. (개발자인 나는 당연히 죽을 정도로 공부를 해야 한다.)

어떤 소프트웨어 공학 교재에서 소프트웨어 관리자는 기술적인 내용에 대해서 자세히 몰라도 된다는 내용을 본 적이 있다. 큰 그림으로 개발 과정을 이끌어가는 것이 중요하다고 지적한 것이다. 사실 소프트웨어란 분야가 바다와 같이 너무나도 범위가 넓고 또한 경계를 나누기도 애매하다. 하지만 임베디드 소프트웨어의 세계에서는 이런 룰이 절대 통하지 않는다.

며칠 동안 진행이 안 되는 이슈 때문에 다른 업체와 함께했던 컨퍼런스 콜이나 회의를 기억해 보자. 임베디드 소프트웨어라는 세례를 받은 개발자들은 
정말 수 많은 기술적인 분석과 코드를 방언 터지듯 말한다.
프로세스, 워크 큐, MMU, 유저 스페이스 공간의 주소, 와치독, 캐패시터, 볼테이지 드롭(voltage drap), ADC(Analog to Digital), 캐시 플러쉬, 메모리 커럽션(memory corruption), 스택 오버런(stack overrun), 웜 리셋(warm reset), 벅스(bucks), 파워 레일(power rail), 캡(capacitor), 지피아이오(GPIO), 메모리 콘트롤러, 시스템 패브릭스 및 버스 기타 등등.

위에서 언급된 용어는 임베디드 세상에서 기본적으로 사용되는 언어이다. 이런 단어들에 대해서 정확하게 알지 못하면 관리를 할 수가 없다. 기본적으로 위의 용어들에 대해서는 기본 개념을 정확히 파악하고 있어야 하며 지금 개발 중인 디바이스에서 어떻게 구현이 되어 있는 지도 알아야 한다. 예를 들면, 100분 토론의 진행자인 손석희 같이 회의의 진행 흐름을 파악함과 동시에 정곡을 찌르는 질문도 해야 할 수준이 되어야 하는 것이다.

누가 위의 글을 읽으면 너무 임베디드 개발 관리자에게 가혹하면서 과중한 능력을 요구하느냐고 반문할지도 모르겠지만, 이게 임베디드 세상의 현실인 것 어떻하나?

시스템 소프트웨어(시스템 반도체, 전기자동차) 관련 강의를 유데미 올렸는데요. 할인 쿠폰을 요청하시는 개발자분들이 늘어나서 아예 블로그 포스트로 올립니다.
 
1. 유데미 강의명: '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 1부- 저자직강'
 
링크: 강의 링크
할인 쿠폰(50%할인): 'E9634A74265052837859'
[설명] 제가 쓴 '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 책의 저자 직강 1부 강의입니다. 6월달에 책이 출간될 예정인데 미리 저자 강의를 준비했습니다. 시스템 반도체나 전기 자동차에 사용되는 Arm 프로세서는 Armv8-A, Armv7-A 기반이므로, 관련 업체로 취업을 준비하시거나 현업 시스템 소프트웨어 개발자에게 도움이 되는 내용을 담고 있습니다.
 
유데미 코리아와 함께 목차를 구성하고 편집까지 진행한 콘텐츠입니다. 또한 책의 내용은 물론 디버깅을 통해 Arm 아키텍처에 대한 더 깊이 있는 내용을 다루고 있으므로 시스템 소프트웨어 분야에서 커리어를 이어나가려는 분께 추천합니다.
 
2. 유데미 강의명: 'Armv8-A 아키텍처 Overview - 64비트 Arm Cortex-A Processor 기반'
링크: 강의 링크
할인 쿠폰(50%할인): 'EB52732CAF0421687905'
[설명] 제가 쓴 '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 책에서 Armv8 아키텍처
부분만 발췌해 설명한 강의입니다. 64비트 기반 Armv8 아키텍처에 대한 부분만 보시려는 분께 추천드립니다.
 
3. 유데미 강의명: 초보 시스템 소프트웨어 개발자 벗어나기 - 시스템 반도체, 전기 자동차 분야
링크: 강의 링크
할인 쿠폰: '56B818FDBF6CE59E4D59'
(참고: 강의 가격이 높지 않아 50%까지 할인되지 않습니다.)
[설명] 시스템 소프트웨어 업계에 대한 전망과 동향 그리고 시스템 소프트웨어 개발자가 되기 위해 어떤 내용을 배워야 하는지 설명하는 강의입니다.
 
계속 할인 쿠폰을 요청해주셔서 감사합니다.
종종 현업 개발자들이랑 만나면, 듣는 이야기가 있습니다.
 
   "개발자로써 커리어를 관리하기 어렵다."
   "지금 하고 있는 개발 스킬을 다른 회사에서 활용할 수 있을까?"
 
개발자들끼리 조금 진지하게 대화를 나누면 나오는 주제입니다. 물론 저도 이런 고민을 수도 없이 했는데요. 종종 "개발자로써 커리어를 관리하기 어려운 이유가 무엇인가"에 대해 생각해 봤습니다. 가끔은 다른 회사의 임원이나 관리자분들을 만날 기회가 있었는데, 그 분들과 대화를 나누니 무엇인가 퍼즐이 맞춰진다는 느낌을 받았습니다.
 
그 퍼즐은 바로 "개발자의 커리어 관리"입니다.
 
많은 분들이 취준생들에게 어찌보면 포괄적이고 두루뭉실한 조언을 많이 합니다. 그것은;
 
    "열심히 노력해라. 노력한 만큼 보상이 주어지는 게 소프트웨어 개발이다."
    "개발자로써 실력을 키우도록 노력해라."
 
틀린 말은 아니지만, 저에겐 뭔가 공허한 소리로만 들리는데요. 그 이유에 대해 조금 더 말씀드리겠습니다.
 
개발자들은 부서장들의 성과를 위해서만 존재한다
 
개발자로써 커리어를 관리하고 키우기 전에 먼저 알아야 할 핵심이 있습니다.
 
   "개발자들은 부서장들의 성과를 위해서만 존재한다."
 
한국에 있는 대부분의 IT 회사들은 위에서 언급한 규칙에 따라 움직이게 되어 있습니다. 여러분들은 여러분의 상사를 위해 존재한다는 말입니다. 이런 문장을 읽으면 물론 불쾌한 느낌이 들기 마련인데요. 조금은 듣기는 거북해도 맞는 말이란 생각이 듭니다. 쓴 약이 몸에도 좋다는 말이 있잖아요.
 
매니저들이나 부서장(대부분 개발자들의 상사)들은 개발자들에게 다음과 같이 조언합니다.
 
   "개발자로써 역량을 키우는게 중요하다."  
 
개발자들이 매니저에게 이런 말을 들으면 "그래, 개발자로써 실력을 키우는 게 중요하지. 열심히 공부해야 겠다"란 생각이 들 것입니다. 그런데 부서장들의 속 마음을 디버깅해보면 그들이 정말로 하고 싶은 메시지는 다음과 같습니다.
 
   " (나의 성과를 위해) 개발자로써 역량을 키우는게 중요하다."  
 
부서장 입장에서는 자신의 성과를 달성하는게 가장 중요합니다. 첫 째도 성과, 두 번째도 성과입니다. 이를 위해 필요한 조건 중의 하나가 개발 역량인 겁니다. 그런데 부서장은 한술 더 떠서 다음과 같은 이야기를 합니다.
 
   " 개발자로써 전문성을 유지하고 키워나가는 게 중요하다."  
 
하지만 이들의 속마음을 들여다보면 "나의 성과를 이루기 위해 내 부서에 있는 개발자들이 전문성을 키웠으면 한다" 진심입니다.
 
니가 나를 위해 일하지 않고, 니가 크려고 해!
 
그런데 가끔 개발자 중에 전문성을 키우다가 "개발자가 소속된 부서의 성과"를 내는 것 이상의 실력을 키우는 경우도 있습니다. 개발자로써 역량을 끌어올리다 보니 전문성이 계속 증진되는 경우입니다.
 
예를 들면, 리눅스 커널에 컨트리뷰션(기여)를 한다던가, 컴파일러 코드를 개선해 뭔가 성능을 개선하는 것을 들 수 있습니다. 가끔은 공부한 내용을 잘 정리해 책을 출간하기도 합니다.
 
그런데 거의 대부분의 부서장들은 자신의 성과에 직접적인 결실을 맺을 수 없는 개발 역량을 키우는 것 별로 좋아 하지 않습니다. 물론 책을 쓰는 것을 싫어하는 분들도 많습니다.(이 사실을 제가 출판사 사장님께도 들은 내용입니다.) 그 이유는 간단합니다.
 
    "자신을 위해 일을 하지 않기 때문입니다."
 
부서장들은 자신도 모르게 이런 생각이 들 겁니다.
 
   "니가 나를 위해 일하지 않고, 니가 크려고 해!"
   "그건 내가 용납할 줄 알아" 
 
극단적으로 말해, 부서장은 자신의 성과를 위해 개발자 여러분이 어떤 개발 역량을 갖추었는지 관심을 갖습니다. 자신의 성과를 위해 여러분이 존재할 뿐인 것이죠.
 
대부분 IT 업체는 부서장의 성과를 중심으로 운영됩니다. 이 점을 염두에 두면 그 동안 이해되지 않았던 많은 부분이 명쾌해질 것입니다.
임베디드 BSP 개발자들은 언제 답답함을 느낄까요? 
야근을 할 때 일까요? 사채업자와 같은 매니저가 찾아와 목에 칼을 들이 대면서 말도 안되는 일정으로 윽박지를 때인가요?
이런 상황은 짜증이 조금 나긴 하지만 그나마 버틸만 합니다.
 
임베디드 BSP 개발을 진행하다가 가장 암담함을 느낄 때는, 뭘 배우고 공부를 해야 실력을 키울 수 있을 지 모를 때입니다. 실력을 키우는 방법을 모르는 상황이죠. 아마 안개 속에서 보이지 않는 적과 싸우는 느낌일텐데요.
 
이런 임베디드 BSP 개발자가 어떻게 하면 실력을 키우는 되는지 주위 선배들에게 물어 보면 속 시원하게 대답을 해주지도 못합니다.
 
위에서 언급된 임베디드 BSP 개발자가 저였습니다. 이런 암담함을 초보 개발자 시절에 3년 정도 겪었습니다. 개발 도중에 크래시가 발생하면 매니저는 "옥상에서 뛰어 내리라고 했는데, 그 때 가장 답답했던 것은 "뭘 배워야 욕을 덜 먹을지 몰랐다"는 점이었습니다.
 
(그 당시 트라우마가 아직도 남아 있어, 저는 옥상에 잘 가지 않습니다.)
 
시간이 지나고 보니, 임베디드 BSP 개발자로써 실력을 키우기 위해 배워야 할 지식이 무엇인지 천천히 알게 됐습니다. 그 목록을 정리하면 다음과 같습니다.
 
   * 디버깅 스킬(TRACE32 혹은 하드웨어 디버거)
   * Arm 아키텍처(특히 익셉션, 메모리 시스템)
   * SoC에 대한 지식(특히 Stability Architecture, Boot Sequence)
   * 리눅스 커널
2~3년 정도 개발을 하면 프로젝트를 3~4개 정도 마무리합니다. 그런데 어느 시점이 되면 이런 느낌이 들 수 있어요.
 
    "이 팀은 정말 맞지 않네!"
 
시간이 더 지나면 나중에 "이 팀을 꼭 떠나야 겠다" 확신이 듭니다. 개발자가 회사나 팀을 떠나고 싶어하는 이유는 뭘까요? 예를 들까요?
 
    "조직 책임자가 자신의 성과를 인정해주지 않는다."
    "개발자로써 연량이 전혀 늘지 않는다."
    "연봉이 현저히 낮다!"
 
연봉이 너무 낮아 불만이 심하면 이직을 시도합니다. 그런데 팀장과 사이가 좋지 않거나 역량이 늘지 않는다는 느낌을 받으면 조직을 옮길 수 있습니다. 어느 정도 규모가 있는 회사에서는 팀을 옮길 수 있는 기회를 주기도 합니다. 대기업에서는 '사내 공모'라는 통해 개발자가 조직을 이동할 수 있는 기회를 주죠.
 
가끔 조직 이동을 고민하거나 꼭 조직 이동을 희망하는 개발자들이 있는데요. 이 분들이 참고하면 좋을 것 같아 "팀은 이동한 개발자에게 저지르는 관리자의 만행"에 대한 글을 포스팅합니다. 이런 정보를 모르고 당하면 정말 힘이 쭉 빠지거든요.
 
고과 바닥 깔기
 
팀(조직)을 이동한 개발자(새로운 팀원)가 가장 많이 받는 피해는 뭘까요? 고과를 낮게 받는 겁니다.
 
쓰레기 관리자들이 가장 많이 하는 짓거리는 최근에 조직을 옮긴 개발자의 고과를 바닥으로 까는 겁니다. 다른 조직에서 왔던 개발자를 희생양으로 삼는 거죠. 새로운 조직으로 가셨는데 고과를 깔지 않았다고요? 이 분은 그나마 운이 좋은 편입니다. 
 
한 가지 예를 들까요? 7월에 조직 이동을 했다고 칩시다. 어렵게 조직을 이동한 후, 이동한 조직의 책임자와 첫 면담을 합니다. 업무의 방향이나 목표를 이야기하면서 조직 책임자는 다음과 같이 말합니다.
 
   "우리 팀으로 이동하기 전에 했던 일은 올해 평가에서 제외하는게 낫지 않을까요?"
 
조직을 옮긴 개발자는 이 말을 처음 듣고는 그려려니 합니다. 속으로 "맞아, 예전에 내가 했던 개발 업무는 중요한게 아니지. 새로운 조직에서 해야 할 업무가 중요하지"라고 생각합니다. 이 말은 한 조직 책임자의 속마음을 모른채 말이죠. 그럼 이런 말을 한 조직 책임자의 속마음을 컴파일해볼까요?
 
   "이 새끼! 고과를 까야 겠네. 7월 이전에 아예 한 일이 없다고 하면 되겠구나"
   "7월까지 한 일이 없으니, 연말에 평가할 때 니가 한 일은 1/2 밖에 안된다고 해야 겠다!"
 
개발자가 조직을 옮긴 다음에 바로 Performance를 낼까요? 새로운 방향의 개발을 하면 어느 정도 적응하는 시간이 필요한 경우가 많습니다. 축구 선수 중에 분데스리가에서 프리미어 리그, 혹은 프리미어 리그에서 스페인 라리가 리그로 이적한 선수들도 적응 시간이 필요한 경우가 많죠. 그래서 새로 이동한 조직의 다른 팀원들 보다 Performance를 내지 못할 수도 있습니다.
 
그런데 가끔 이동한 조직에서 열심히 해 다른 동료만큼 일을 해내는 분들도 있습니다. 그런데 조직을 옮긴 개발자는 "내가 하는 일이 Performance를 제대로 내는 수준인가"라고 스스로를 의심하는 경우도 있습니다.
 
개발자가 새로운 팀에서 적응을 하던 말던, 관리자 입장에서 누군가 고과를 바닥으로 깔아야 하는 상황이면 팀에 새롭게 이동한 개발자를 희생양으로 삼는 경우가 있습니다.  
 
원래 조직 책임자는 고과 때문에 항상 골치입니다. 오랫동안 같이 일했던 팀원에게 고과를 잘 챙겨주지 못하는 상황이 많죠. 그런데 새롭게 팀으로 이동한 멤버도 잘 챙겨줄까요? 그렇지 않은 경우가 많습니다. 대부분 아주 좋은 희생양입니다. 그래서 조직을 옮긴 개발자는 고과를 좋게 받을 가능성이 아주 낮습니다.
 
새로운 팀원을 또 다른 조직으로 버리기
 
쓰레기 관리자가 저지르는 만행은 "팀에 새롭게 합류한 개발자를 다른 조직으로 보내버리는 겁니다". "팀에 새롭게 왔는데 왜 다른 팀으로 보내?"란 의문이 들 수 있는데요. 설명을 조금 더 읽어주세요.
 
회사의 운영 방식마다 다르지만 신생 조직이 자주 생기는 경우가 있습니다. 종종 신생 조직이 생기면 다른 팀에 있는 개발자를 착출합니다. 신입 사원이나 경력 사원으로 새로운 조직을 구성하는게 아니라 기존 조직에 있던 개발자로 팀을 꾸리는 것이죠. 
 
팀장(관리자) 입장에서는 신생 조직이 생겨서 팀원 중에 누군가를 보내 달라는 요청을 받게 됩니다. 이럴 때 쓰레기 관리자들이 저지르는 만행은 다음과 같습니다. 
 
    "최근에 자신의 팀으로 이동한 인원을 다른 신생 조직으로 보냅니다." 
 
기존에 같이 데리고 있던 인원은 보내기 싫고. 최근에 이동한 개발자를 다른 조직에 보내니 마음이 덜 불편합니다.
 
관리자(팀장) 입장에서, 다른 팀에서 자신의 팀으로 어떤 개발자가 오고 싶다고 하면 일단 받아 줍니다. 나중에 혹시 버리기 위한 카드로 남겨주는 것이죠. 
 
개발자가 팀을 옮기려는 결정을 할 때 많은 고민을 합니다. 선배를 만나 조언을 구하기도 하죠. 그런데 새로운 팀원을 버리는 카드로 받아주는 관리자가 있다니! 정말 안타까운 현실이죠.
 
설겆이 업무 할당
 
만행 정도는 아니지만, 쓰레기 관리자들이 하는 악습은 새로온 팀원에게 설겆이 업무를 할당하는 겁니다. 
 
프로젝트를 하다보면 누군가는 해야 할 꼭 필요한 업무인데, 다들 꺼려하는 일이 있습니다. 시료 샘플을 조립하거나 꾸준히 이미지를 빌드해서 배포하는 업무가 그 중 하나입니다. 혹은 팀의 총무나 자산을 관리하는 업무도 이 중 하나죠. 쓰레기 관리자는 새로운 팀원에게 이런 일을 시킵니다. 팀을 이동한 개발자는 새롭게 옮긴 팀에서 잘 적응하려고 이런 설겆이 업무를 할당 받아도 일단 열심히 하려는 경우가 많습니다. 이런 개발자를 이용해 먹는 겁니다.
 
팀 내에서 중요한 플래그 십 프로젝트에 아예 투입시키지 않습니다. 기존에 일을 잘하는 개발자들이 있는데 구지 팀에 새로온 멤버에게 시킬 필요가 없다고 생각합니다. 조직을 이동한 개발자에게 개발 난이도가 낮지만 업무량은 많은 프로젝트를 할당하는 경우가 많습니다.
많은 개발자들이 커리어를 고민합니다. 어느 정도 연차가 쌓이면 다들 개발자 커리어에 대해 고민을 하기 시작하죠. 여러 개발자들이 커리어에 대해 고민하는데요. 조금이라도 도움을 드리는 차원으로 몇 가지 정보를 포스트합니다.
 
1. 한국의 임베디드 개발 업체의 특성과 전문성
 
한국 임베디드 업체의 특징은 너무나 당연한 이야기지만 제품 개발 중심입니다. 제품 스팩과 가격을 결정해 수주를 받는 구조죠. 국가 기관이나 대기업으로부터 수주를 받습니다. IT 생태계를 이루는 다양한 업체와 협업하기도 하죠. 그런데 대부분 개발 업무는 아래 카테고리 중 하나일 겁니다.
 
- 제품 스팩 검토, 데이터 시트 리뷰
- 데이터 시트에 맞게 페리페럴 브링업 및 기본 동작 구현
- 버그 수정 및 안정화
- 인증 테스트를 거친 다음에 제품 개발 완료
 
대부분 업계의 임베디드 제품은 다양한 부품과 소프트웨어를 사용하지만, '리눅스 + Arm 프로세서 + 메모리 + 페리페럴(제품 스팩)' 구조가 대세입니다. 그런데 제품 개발에 초점이 맞춰져 있다 보니 개발자로써 전문성을 키우기 어려운 상황이라는 점이 단점입니다.
 
가장 대표적인 예를 들면요; 1~2개 제품을 리눅스 드라이버와 Arm 프로세서에서 개발했다고 가정하겠습니다. 이 쯤 되면 리눅스 드라이버나 Arm 프로세서에 대해 좀 알 것 같단 느낌이 들어요. 그런데 새로운 프로젝트의 스팩이 만약 리눅스가 아니라 다른 RTOS이고, Arm 프로세서가 아니라 RISC-V 프로세서이라면 어떻게 해야 할까요? 나는 리눅스와 Arm 프로세서 기반으로 개발했으니 이런 프로젝트는 못한다고 거절할 수 있을까요? 대부분 새로운 제품에서 요구하는 RTOS나 RISC-V의 구조를 분석해야 합니다. 수주를 준 업체가 부품을 정하면 이에 맞게 해당 부품(메모리, 페리페럴)을 분석하고 개발하기도 합니다.
 
물론 주니어 개발자 시절에는 다양한 제품을 개발하면 경력에 도움이 됩니다. 개발의 시야를 넓힐 수 있고 다양한 실무 경험을 키울 수 있죠. 사실 업계에서 가장 선호하는 개발자가 이런 유형이기도 합니다. 또한 다양한 RTOS나 CPU 기반으로 개발하면 공통으로 알아야 하는 스킬(TRACE32, JTAG 디버거, 회로도 분석 방법)을 익힐 수 있습니다.
 
하지만 7년 이상 개발 경력이 쌓이면, (본인이 원치 않던) 시니어 개발자의 길로 접어 드는데요. 누군가 "당신이 개발자로써 전문성이 무엇인가"라고 묻는 다면 딱히 내가 뭘 정말 잘 안다고 답하기 어렵습니다. 저도 유사한 상황을 겪었습니다.
 
모든 한국의 임베디드 업체가 제가 언급한 방식으로 운영되지는 않습니다. 나름대로 원천 솔류션을 겸비한 업체도 있겠죠. 시니어 레벨로 들어서면 전문성에 대한 질문을 할 필요가 있습니다.
 
2. 한국의 임베디드 개발자의 테크 트리
 
만약 전문성이 그리 요구되지 않는 제품을 개발하다가 연차가 쌓이면 계속 원하는 개발을 할 수 있을까요? 그렇지 않습니다. 대부분 업체에서 '관리를 하라'고 요구합니다. 어떤 기능에 대해 '기능 리더'를 맡아 달라는 게 아니라, 프로젝트 전반을 책임져 달라고 요구합니다. 문서를 취합하고 고객사의 전화를 받는 역할까지 맡길 원하죠. 동시에 개발도 잘 하라고 합니다. 그게 선임급 개발자가 할 역할이라고 주장하죠.
 
사실 임베디드 업체의 '기술 이사'급 정도의 매니저나 임원은 2000년대 초반에 개발을 했거나 하드웨어 출신 개발자인 경우가 많습니다. 네이버나 카카오 같은 소프트웨어 업체는 팀장이나 임원이 80년 생들로 구성돼 있는데요. 임베디드 업체는 고인물이 많아서 임원이나 매니저들의 연령이 "60년대 중반 ~ 70년대 초반"으로 형성돼 있습니다. 개발과 관리를 동시에 할 수 없다고 불만을 토로하면 이 분들이 잘 들어줄까요? 대부분 "잠꼬대 같은 소리하는군"이라고 무시할 것입니다. 예전에 (20년 전에) 자신이 개발과 관리를 동시에 한 무용담을 1시간 넘게 할 것입니다. 물론 20년 전에 개발했던 RTOS는 전체 소스 라인이 1000 밖에 안되는 심플한 베어 메탈 코드인 경우가 대부분입니다.
 
대부분 개발자들은 관리를 하기 싫어하는데요. 강아지가 목 줄에 이끌리듯이 관리를 하기 시작합니다. 물론 개발을 병행하죠. 시간이 들어 관리 업무에 더 많은 시간을 할애합니다. 이 쯤에 커리어의 갈림길에 들어 섭니다. 
 
   "개발자의 길을 갈 것인가", "관리를 할 것인가" 
 
용기 있게 개발자의 길을 가겠다고 선언한 분이 있지만. 많은 분들이 현실에 타협하면서 관리를 하기 시작합니다. 그런데 개발을 잘하는 캐릭터를 겸비한 분은 관리 능력이 떨어지는 경우가 많습니다. 또한 10여년 전부터 관리를 했던 매니저에게 밀리는 상황도 겪죠. 결국 관리도 못하고 개발도 못해 회사에서 버림 받는 처참한 상황을 맡게 됩니다.   
 
그렇다면 시니어 개발자로써 전문성을 키우려면 어떤 방식으로 개발을 해야 할까요? 이 내용은 다음 포스트에서 업데이트하겠습니다.
 
이번에는 임베디드 혹은 시스템 리눅스 개발과 관련된 이야기를 해보려고 해요. 
 
저는 개발자 뿐만 아니라 취준생 분들과 교류를 하면서 여러 가지 정보를 공유받고 공유하기도 하는데요. 가끔 황당할 때가 있어요. 어! 어떻게 이런 생각을 할 수가 있지? 이런 정보를 어떻게 들었지? 그럼 어떤 황당한 소리를 들었냐고요? 이제부터 이야기를 해볼께요.
 
'리눅스 디바이스 드라이버'는 배울 필요가 없다
 
가장 먼저 들었던 소리는 '리눅스 디바이스 드라이버'는 배울 필요가 없다는 의견을 주신 분들이 있었어요. 앱 개발자 분들은 이런 말을 할 수도 있을 것 같아요. 그런데 임베디드나 리눅스 시스템 분야 개발을 지망하시는 분들 입에서 이런 말이 나오더라고요. 그래서 제가 물어봤죠. 디바이스 드라이버를 배우지 않아도 되는 이유가 뭐에요? 그런데 뭐라고 대답하는 줄 아시나요? SoC 칩 업체에서 안정된 리눅스 드라이버를 제공하기 때문이래요. 이 이야기를 듣고 저도 모르게 나오는 웃음을 참기 어려웠어요. 이게 뭔 소리지?
 
다시 한번 강조하지만 이런 말은 한 사람이 임베디드 리눅스 개발자 지망생이었어요. 그래서 이 친구에게 다시 한번 물어봤어요. 이게 니 생각이냐? 그랬더니 자신이 다녔던 IT 학원 강사가 이런 말을 했다는 거였어요. 취준생들이 IT 강사들이 하는 말을 그대로 믿는다는 게 좀 안타까웠어요. 
 
그래서 제가 그 친구에게 임베디드 리눅스 개발자가 리눅스 디바이스 드라이버를 꼭 배워야 하는 이유를 설명해 줬어요. 그 이야기를 여기서 하면요.
 
먼저 제품을 구성할 때 부품이 바뀔 수가 있어요. 예를 들어 A란 센서 부품에서 B라는 센서 부품으로 변경됐어요. 그럼 B라는 센서의 드라이버를 제품에 맞게 수정해야 해요. 
 
이 때 SoC 칩 업체 개발자에게 B란 센서의 드라이버를 제작해 달라고 하면, 소스를 줄까요? 이런 요청을 하면 아예 들은 척도 하지 않을껄요?
 
두 번째로는 SoC 칩 업체에서 전달하는 드라이버 자체도 100% 안정성이 보장된다고는 볼도 수 없고요. 이건 좀 민간한 이야기기도 한데요. 생각지도 못한 버그가 숨어 있을 수 있어요. 그런데 제품을 개발하는 도중에 버그가 나오면 SoC 칩 업체 개발자가 그 버그를 잡아 줄까요? 물론 개발하려는 SoC 칩에 대한 기술 지원 비용을 지불한다면 가능하겠죠.
 
그런데 생각보다 SoC 칩에 대한 기술 지원 비용을 내지 않고 개발하는 프로젝트가 은근히 많아요. 이런 상황에서는 제품 개발자가 SoC 칩 업체에서 전달된 드라이버 코드를 수정해야 되죠.
 
또한 디바이스 드라이버를 모르면 부팅 시간이라던가 디바이스의 실행 시간을 최적화하는 작업을 진행할 수 없어요. 리눅스 시스템 프로그래밍으로 이런 작업을 할 수 있다고 주장하시는 분도 있는데요. 사실 시스템 프로그래밍은 직접 하드웨어를 콘트롤 할 수 없으므로 한계가 있어요.
 
스케줄러 코드를 수정할 필요가 없으니 리눅스 커널은 배울 필요가 없다
 
이어서 제가 들었던 황당한 이야기를 해볼께요. 리눅스 시스템 개발 업계에서 이런 소리를 하시는 분들이 있는데요. 스케줄러 코드를 수정할 필요가 없으니 리눅스 커널은 배울 필요가 없다는 소리를 해요. 작년까지만 해도 2000년대 초반에 임베디드 개발을 시작했다가 리눅스에 적응하지 못했던 퇴물 개발자들로부터 이런 소리를 들었는데요. 요즘에는 주니어 개발자들의 입에서 이런 말을 들을 때 '약간 어이가 없다'는 생각이 좀 들었어요. 참 꼰대는 나이를 초월해서 존재한다는 생각도 드는데요. 
 
'리눅스 커널의 스케줄러 소스 코드를 수정할 필요가 없다' 맞는 소리죠. 다른 해야 할 일이 얼마나 많은데요. 이런 말을 하면서 차라리 리눅스 커널에서 실전 개발에 도움이 될만한 내용을 잘 배우자라고 주장하면 수긍할꺼에요. 저도 비슷한 생각이거든요. 리눅스 커널의 내용은 너무 방대해서 먼저 배우면 좋은 내용부터 배우자란 말에 동의해요. 그런데 리눅스 커널은 배울 필요가 없다라는 주장에는 전혀 동의할 수가 없어요. 
 
리눅스가 어떻게 돌아가는지 시스템 개발자 수준으로 알려면 리눅스 커널의 기본 동작 원리는 알아야 해요. 이걸 모르고 알고는 엄청난 차이에요. 또한 리눅스 드라이버나 리눅스 시스템 프로그램으로 하드웨어를 제어해도, 이런 프로그램의 동작 원리를 깊게 파고 들어가면 만나는게 리눅스 커널이거든요. 그리고 리눅스 디바이스 드라이버는 리눅스 커널에서 제공하는 API로 구성돼 있어요. 그러니 리눅스 커널을 모르면 리눅스 디바이스 드라이버 자체를 제대로 개발할 수가 없죠.
 
그렇다면 리눅스 디바이스 드라이버를 배울 필요가 없다. 리눅스 커널을 배울 필요가 없다는 소리를 하는 이유는 뭘까요?
 
이런 소리를 IT 강사들이 한다면, 리눅스 커널 드라이버가 리눅스 커널을 제대로 가르칠 능력이 안되기 때문일 꺼에요. 학생들이 리눅스 커널에 대해 질문을 하면 '그거 SoC 칩 업체에서 전달하는 거니 잘 몰라도 돼'라고 대답하는 거죠.
 
실제 현업에서는 리눅스 디바이스 드라이버를 배울 필요가 없다는 소리보다 리눅스 커널을 제대로 배울 필요가 없다는 소리를 더 자주 듣는데요. 개발자보다 관리자 즉 매니저들이 이런 말을 더 자주 할 가능성이 높아요. 저도 그랬고요.  이렇게 말하는 가장 큰 이유는 조금은 극단적인데요. 개발자를 오로지 비용 관점으로 관리하기 때문이에요. 회사에서 100원을 투자하면 120원만큼 개발자가 일을 하기 원하는 경우가 있거든요. 그런데 개발자가 리눅스 커널을 배우는데 시간을 투자하면 회사 입장에서는 손해라고 생각하는 거에요. 왜냐면 리눅스 커널은 며칠 배운다고 바로 티가 나지 않거든요. 뭔가 개발자의 기초 체력을 키운다란 느낌이에요.  
 
이렇게 제가 대본까지 써가면서 이런 콘텐츠를 만든 이유는, 취준생들이 왜곡된 정보를 듣고 잘못된 방향으로 커리어를 선택할 수 있이 때문이에요.
 
이렇게 제가 이런 글을 쓴 이유는, 취준생들이 왜곡된 정보를 듣고 잘못된 방향으로 커리어를 선택할 수 있기 때문이에요. 이런 왜곡된 정보를 참고해서 리눅스 디바이스 드라이버나 리눅스 커널에 대해 아무런 공부를 하지 않은 체, 면접을 볼 수도 있거든요. 운이 좋게 면접에 통과 하면 좋겠지만 면접에서 리눅스 디바이스 드라이버나 커널에 대해 조금이라도 배운 경쟁자가 있다면 바로 탈락하겠죠.
 
SW 업계에서 배울 필요가 없는 지식은 없고 우선순위만 있을 뿐이다.
 
또한 IT 개발자가 배울 필요가 없는 지식은 없는 것 같아요. 리눅스 시스템 개발자라도 해도 파이썬으로 애플리케이션을 코딩하는 것 배울 필요가 없는 건 아니에요. 시간이 있으면 배우면 좋지만, 우선 순위라는 게 있잖아요. 뭐 arm 프로세서나 하드웨어와 같이 더 중요하게 익혀야 하는 테마가 있잖아요.
 



+ Recent posts