Data Scientist 코딩/알고리즘 test 문의

64.***.218.106

임베디드 분야의 알고리듬이나 애플레이케션 자체는 사실 극도로 단순하고 몇게 되지도 않습니다. 단지 스케쥴러나 루푸를 어떻게 효과적으로 짜느냐 정도의 난이도가 있을 뿐이죠. 물론 요즘 아마죤 서버와 연동하는게 트렌드라 아마죤 입출력 인터페이스 접근방법, 기본 보안 그리고 전통적인 TCP/IP 정도만 할줄 알면 나머지는 말 그대로 인터넷에 돌아다니는 코드로 stackoverflow driven design 만으로도 쉽게 코딩이 가능합니다.

말씀하신 분야가 은근히 넓다라는 말은 실무적 시각으로 볼때는 결국 어떤 프로세서를 경험했봤냐는거죠. 임베디드는 타겟이 소프트웨어 그 자체가 아니라 하드웨어 입니다. 즉, 어떤 하드웨어에서 개발을 했느냐가 곧 임베디드 프로그래밍인거죠. 하드웨어 사양 자체가 표준이 있는게 아니라 대부분 제품 사양에 따라 대부분 자기 제품에 최적화된 커스텀 보드를 만들어 사용하므로 물리적인 변수가 정말 무궁무진합니다. 거기서 오는 다양성을 얼마나 감당할 수 있느냐는건데 생각해보면 그것도 그리 어려운게 아닙니다. 왜냐면 회사마다 제품에 사용하는 하드웨어 (프로세서)는 한번 정해지면 그 제품이 심각한 문제나 END OF LIFE 되기전 까지는 계속 동일한 플랫폼을 사용하기 때문입니다. 물론 프로세서 퍼포먼스나 파워도 조금씩 업그레이드 되지만 그자체로 그리 심각한 변수는 아닙니다. 따라서 어떤 한 회사에서 임베디드 코딩을 할때는 그 회사에 머무는 한 계속 동일한 개발 환경을 사용한다고 보면 됩니다. 그리고 회사를 옮기면 완전히 다른 플래폼을 사용하므로 새로운 BSP에 익숙해질때까지 시간이 좀 걸립니다.

질문하신 임베디드의 핵심은 제가 볼때 크게 세가지입니다.

1. 부트로더 – 모든 커스텀 보드는 일반 피씨가 아니므로 모든 셋팅을 첨부터 개발자가 다 해줘야 합니다. 물론 부트로더는 개발 초기에 한번 셋팅해놓고 계속 사용하지만 나중에 펌웨어 업그레이드를 한다든가 할때를 위해서 부트로더 자체를 제품의 필요에 맞게 수정할 수 있는 능력이 필요합니다. 대부분의 회사에서 부트로더를 시니어 레벨 이상의 개발자들이 손을 댑니다.

2. 통신
여기서 말하는 통신은 외부 디바이스와의 통신을 말하는게 아니라 펌웨어 내부에서 서브시스템들끼리 데이터를 주고 받는 통신을 말합니다. 대규모 임베디드 프로젝트의 경우 여러 개발자가 서로 다른 서브시스템과 모듈을 개발하는데 그때 서로 자신들이 정한 네트웍 프로토콜로 통신합니다. 따라서 기본적인 TCP/IP 같은건 거의 모든 임베디드 프로그래밍에 기본으로 들어갑니다.

3. 통신 프로토콜
TCP/IP, CAN, I2C, HART, MODBUS, 등등 꽤 여러종류의 전통적인 통신 프로토콜은 대부분 기본으로 쓰입니다. 물론 이런 통신 프로토콜은 하드웨어 벤더들의 드라이버 형태로 라이브러리를 제공하므로 직접 로우레벨 코딩까지 할 필요는 없지만 많은 경우에 드라이버에 버그가 있거나 퍼포먼스에 문제가 발생합니다. 그럼 직접 드라이버 소스코드를 보고 버그를 수정한후 드라이버 자체를 재컴파일해서 다시 로드하는거죠. 이런건 시니어 레벨이나 아키텍트 레벨 개발자들이 담당합니다.