다른 분야도 마찬가지겠지만,
대학교에서 기초 이론을 배우고 이 바닥에서 일 시작하는 사람이랑
학원이든 무슨 교육이든 이수해서 속성으로 실무 위주로 배워서 일 시작하는 사람으로 크게 나눌 수 있지.
나는 개인적으로 저 둘 사이에 크게 구분을 하지 않고 알려고 하지도 않아.
그저 시키는 일을 잘 하는지만 보고 판단하지.
그래서 기초 이론이 크게 필요 없는 일을 할 때는 전적으로 경험과 일머리가 좋은 사람이 성과가 더 좋드라.
그런데 기초 이론이 필요한 어떤 이슈가 터졌을 때는
확실 배운 사람이 낫드라.
그리고 똑같이 전공을 했었다고 해도 학교에서 어떤 과목을 얼마나 공부했느냐에 따라서도 다르더라.
예를들어 컴퓨터 구조 같은거 모르면,
파이프라인 같은걸 또 굳이 설명해서 이해시켜야 이슈를 해결 할 수 있지.
저걸 배우고 온 사람한테는 그냥 "파이프 라인 스테이지를 고려하면 어쩌구...." 하면서 설명하고 지나갈 수 있는데 말이지.
그래서 내가 생각했을 때 이바닥 엔지니어라면 꼭 필요한 과목을 추려줄께
아직 학생이라면 수강 신청 할 때 참고 하도록해.
과목이름은 최대한 범용적으로 할 테니까 비슷한거를 니들이 다니는 학교에서 찾아봐.
요새는 학교마다 과목이름을 특이하게들 많이 붙이더라.
1. 필수로 수강해야 하는 것들
이정도는 알아야, 기본기 갖춘 펌웨어 엔지니어라고 생각되는 과목들
* C 언어
과목이름이 뭐든, C 언어는 필수야.
세상이 변해도 앞으로 최소 10년은 더 C언어가 펌웨어에서는 메인일꺼다.
암튼 C언어는 걍 닥치고 수강해
* 자료구조
뭐 말이 더 필요한가.
자료구조 제대로 못 만드는 소프트웨어 엔지니어는 자격 미달이지.
펌웨어도 소프트웨어라는 사실을 잊지마.
* 컴퓨터 구조
웹이나 앱 만드는 애들은 솔직히 컴구 몰라도 지장 없다고 본다. (알면 좋겠지.)
그런데 펌웨어 엔지니어한테 컴퓨터 구조는 필수 of 필수다.
그냥 펌웨어 개발의 시작부터 끝이 전부 컴퓨터 구조 이론을 직접적으로 체험하는 일이라고 생각한다.
* 시스템 프로그래밍
나는 링커 구조, 메모리 구조, 실행 파일 구조 이런거를 시스템 프로그래밍 과목에서 공부했는데,
다른 학교는 모르겠네.
펌웨어는 말 그대로 시스템을 직접 건들이면서 작업하는 것이기 때문에 시스템 프로그래밍은 꼭 수강해야 한다.
* 논리회로
컴퓨터 구조 과목에 선행 과목이라서 선정했다.
물론 논리회로 단독으로도 필요하긴 해.
데이터시트같은거 읽을 때 도움이 많이 되거덩.
* 운영체제
이걸 여기에 넣을지 아래 2번에 넣을지 잠시 고민했다.
나는 개인적으로 운영체제를 되게 재미있게 공부했고 이거로 대학원 갈까도 생각했을 정도로 진지했거덩.
펌웨어 엔지니어로 15년 넘게 일하면서 내가 가진 운영체제 지식으로 덕을 많이 봤다.
RTOS 같은거 간단하게 직접 만들어서 제품에 반영하기도 했지.
RTOS를 쓰지 않더라도 멀티코어 환경이 필수인 세상에서 단순 펌웨어라고 해도 운영체제 지식이 필요해.
* 컴파일러
직접 컴파일러를 만들 수준이 아니라고 해도 하다못해 컴파일 에러 메시지 해석하는데에도 컴파일러 지식은 필요하다.
그리고 나는 직접 컴파일러를 만들기도 했어.
ARM 코어에 붙어서 작은 작업을 처리하는 자체 인스트럭션 셋을 이용하는 회사 자체 코어에 펌웨어를 만들려면
아주 단순한 트랜슬레이터 수준이라고 하더라도 컴파일러 지식이 필요하지.
이런 자체 코어도 안만드는 회사에서 일한다면... 솔직히 좀 미래가 없다고 본다. 이직해라.
* 파일처리
펌웨어 자체는 파일처리를 하지 않는게 기본이지.
그런데 펌웨어를 개발하면서 여러가지 지원 툴들을 쓰거나 만들일이 엄청 많아.
그때 파일처리가 필수야.
예를 들어 펌웨어를 사이닝(signing) 하는 툴을 만든다고 쳐.
펌웨어 바이너리에 헤더 붙이고 끝에 해시 붙이고 공개키 붙이고 뭐 이런거 해야 하는데
이게 다 파일처리다.
그리고 막 쏟아져 나오는 로그같은거 처리할 일도 많지.
그런게 다 파일처리야.
2. 공부하면 좋은 과목
의외로 알아두면 일하면서 광팔아 먹기 좋은 지식들
* 소프트웨어공학
주먹구구로 대충 일하는 회사가 아닌 이상,
그래도 구색 같춘 회사라면 최소한의 프로젝트 관리를 할꺼다.
프로젝트 관리가 어떻게 돌아가는지 알면 니가 일하는 페이스를 조절 하는데 도움이 되지.
그리고 언제까지 시키는 일만 할것 같냐? 언젠간 너도 프로젝트 리딩을 한다.
그럴 때 소프트웨어 공학 지식이 필요하다.
* 전자공학
펌웨어 일이라는게 하드웨어랑 밀접하다 보니까,
하드웨어를 직접 만지거나 만드는 일은 없어도
그쪽 용어를 많이 듣게 된다.
최소한 하드웨어 관련 용어라도 해석하라면 필요한 과목이다.
* 알고리즘
은근 펌웨어는 그리 대단한 알고리즘이 많이 필요하지 않다.
내 경력에서는 시큐리티 펌웨어 할 때 알고리즘을 많이 다뤘는데,
그런거 아니면 사실 펌웨어는 하드웨어의 특성과 시퀀스가 중요하지
알고리즘을 이리 바꾸고 저리 바꾸고 하면서 뭘 할 일이 별로 없어.
딱 정해진 명확한 시퀀스가 미리 주어지는 경우가 거의 대부분이거든.
그래도 아주 기본 알고리즘들.
예를들어, 큐, 스택, 트리, 리컬시브, 리스트, 해시, 풀 뭐 이런것들에 대한 개념은 빠삭해야지.
* 객체지향 프로그래밍
걍 C++ 공부하란 얘기야.
* 프로그래밍언어
펌웨어는 C로 거의 하지만 은근 지원 툴을 쓸 때 여러 프로그래밍 언어를 많이 쓴다.
이들 프로그래밍 언어들이 기본적으로 두 계열로 나뉜다. 절차형 언어와 함수형 언어지.
그리고 스크립트 언어들도 많이 쓴다. 스크립트 언어들은 거의다 인터프리터들인데 예내들은 특성이 또 좀 달라.
뭐 이런걸 이론 수준에서 공부하면 좋지.
3. 펌웨어랑은 관계 없지만 꽤 중요한 과목
내 생각에는 엄종 전환할 때 유용할 것 같아.
* 공학수학
기본 of 기본 이론이긴 한데 나는 사실 딱히 이 과목에서 배운 지식을 제대로 써 본적이 없어
안배웠어도 먹고 사는데 지장 없었을 것 같은 느낌...
물론 다른 과목 공부하는데 필요했겠지만...
* 미적분
이거도 기본 수학이니까...
* 확률 통계
내가 학교 댕길 때는 인기 없었는데
요새는 확률, 통계 이게 머신 러닝의 기초 이론이다 보니까
인기가 엄청 많다고 하더라.
* 선형대수
선형대수 역시 머신 러닝의 기초 이론이다 보니..
아마 앞으로 몇 년 이내에 펌웨어에도 머신러닝 코딩 할 일이 생길지도 몰라.
난 그 전에 은퇴해야지.
* 네트워크
네트워크 펌웨어 질은 비추한다.
너무 어렵고 복잡하거덩. 사실 천재들 같아. 이쪽에서 일하는 사람들은.
댓글 영역