서론

백그라운드

첫 1년 - 기존 펌웨어 코드 이해하기

펌웨어 개발자로 입사하고서 첫 6개월에서 1년간은 펌웨어 업무에 대해 배우고, 하드웨어 및 전자회로에 대해 이해하고, 기존 프로젝트의 소스코드를 이해하고 개선하는데 시간을 보냈다.

대학원 때 리눅스 커널 코드를 분석하는데 삽질을 많이 해봤기 때문에 와이브레인의 MINDD STIM 기기 펌웨어 코드를 이해하는데에 큰 장벽은 없었다. 그럼에도 따라가는데 애먹었던 코드 조각이 있었는데, callback을 등록해서 돌아가는 함수들이였다.

4천 줄에 가까운 c 파일 하나에 주요기능에 대한 로직이 전부 들어있는데 여기에 로직 함수들은 함수 포인터 배열에 담아두고 있었다. 이 배열의 변수는 X라는 함수에서 이용되는데, A state에 의해서 배열의 index를 정하고 그 로직 함수에 B state를 파라미터로 담아서 호출했다. X라는 함수는 어떤 콜백 함수들에서 B state가 정해진 상태로 호출된다.

한마디로 참으로 복잡했다. 😢

LogicFunc logicFuncPtrArray[] = {
	&logic1,
	&logic2,
	&logic3,
	...
}

-------------------------------------------------------------------

// cbFunc들이 언제 어떤 상태에서 등록이 되는지도 이해해야 한다.
void cbFunc1(Event event) {
	...
	funcX(stateA);
	...
}

void cbFunc2(Event event) {
	...
	funcX(stateA);
	...
}

void cbFunc3(Event event) {
	...
	funcX(stateA);
	...
}

...

-------------------------------------------------------------------

void funcX(StateA state) {
	StateB index = getStateB();
	logicFunc = logicFuncPtrArray[index];
	(*logicFunc)(state);
}

void logic1(StateA state) {
	...
}
void logic2(StateA state) {
	...
}
void logic3(StateA state) {
	...
}
...

그 이후 - 신규 기기 펌웨어 개발 프로젝트

와이브레인 회사는 성격 상 매년 여러 개의 신규 사업 및 프로젝트를 벌린다. 그러다보니 직원들은 모두 여러 개의 프로젝트에 참여하게 된다. 나도 어쩌다보니 1년차부터 매번 2~3개의 신규 프로젝트들을 맡아서 진행해오고 있다.

나에게는 굉장히 좋은 기회라고 할 수 있었다. 기존 프로젝트의 얽히고 섥힌 코드를 유지보수하고 수정하는 과정에서 느꼈던 불편함을 토대로 새로운 프로젝트들에 새로운 설계 방식을 적용해 볼 수 있었기 때문이다. 새로운 방식을 생각해보고 실제 프로젝트의 코드로 적용해볼 수 있었고, 또 거기에서 그 새로운 방식을 구현해보면서 느낀점을 토대로 다시 새로운 프로젝트를 진행해 볼 수 있었다.

그렇다고 해서 내가 지금 개발하고 있는 프로젝트의 설계가 완벽한 것은 아니다. 그저 다양한 방식을 적용해 보는 것이 재밌어서 하고 있지만 완벽한 설계를 향한 길은 끝이 없는 것 같다.

자바 스프링의 설계 원칙을 배우다.

최근에 백엔드의 길로 진로를 변경하고 싶어서 자바 스프링을 배우고 있다. 거기에서 나는 SOLID 원칙을 배우고 스프링과 자바의 인터페이스를 이용해서 잘 정리된 코드를 만들 수 있다는 것을 배웠다. C언어를 이용하여 펌웨어를 개발하는 나로써 자바와 스프링은 참으로 탐스러웠다.

백그라운드 설명이 너무 길다.

펌웨어 구조 설계에 대한 전반적인 내용을 잘 정리한 PPT자료를 발견하여 이 내용을 글로 정리해본다.

펌웨어 구조 설계