저는 반쪽짜리 프로그래머인거 같습니다.

gurugio의 이미지

며칠전에도 비슷한 글을 올렸었는데요

하드웨어를 다루는 수업에서 8086보드를 만들다가 끝까지 못 만들고

뒤쳐저서 정말 아쉬웠었는데요

프로그래머로서 알아야할 소양중에 하드웨어가 필수라고 생각합니다

그런데 어느정도까지일까요?

간단한 회로도를 보고 그에 맞는 어셈블리 코딩정도일 수도 있겠고

각종 임베디드용 시피유를 다룰 수 있는 것도 있겠고

사람마다 분야가 틀리니까 정도의 차이는 있겠지만

기본적으로 알아야할 정도의 하드웨어에 대한 지식은 어느정도 일까요?

너무 깊게 들어가려니 전자기학과 회로이론이 압박하고

그렇다고 그냥 넘어가려니 드라이버나 커널 다룰때 갑갑해집니다.

또 PC의 커널 외에도 임베디드쪽 필드에서 필요한 정도의 하드웨어 지식은

프로그래머에게 어느 정도가 될지 궁금합니다.

휴... 내년에 VHDL 수업을 듣기는 할텐데 따라갈 수 있을지 걱정이네요.

NeoTuring의 이미지

본인에게 필요한 만큼만 공부하세요.

http://xp.c2.com/YouArentGonnaNeedIt.html

쎄시봉의 이미지

학원 강사님께서 하신 말씀이 좋은 대답이 될 것 같습니다.

Quote:
이종 격투기에는 크게 타격기술과 꺾기 기술이 있습니다. (권투와 같은 것이 타격기의 대표이고 유도와 같은 기술이 꺽기의 대표입니다.) 하지만 이 두가지를 모두 다 통달할 필요는 없다고 봅니다. 예를 들어 권투선수에서 이종격투기로 전향한 선수라면 꺾기 기술에 대한 방어 내지 대처법 정도를 연마해 둔다면 시합에서 잘 통할것입니다. 상대편이 타격기술과 꺾기 기술에 모두 도통한 사람이 아니라면 말이지요. 이런 사람은 실제 거의 없다고 보시면 됩니다. [중략]
프로그래머는 그보다 인간성이 중요하다고 생각합니다. 대부분의 회사에서 하드웨어를 하는 사람들은 제품이 완성되어 소프트웨어쪽으로 넘길 때 설명을 잘 안해줍니다. 이럴 때 밥이나 술을 사주면서 좀 더 많은 정보를 얻으면 좀 더 편하게(?) 프로그램을 짤 수 있습니다.

어떻게 보면 너무 요령을 가르쳐 준 것 같아 "뭐 그래~" 이럴 수도 있겠지만 맞는 말인것 같습니다.
에, 또 디바이스 드라이버를 작성하는 경우라면(리눅스의 경우) 어셈블리가 꼭 필요한 것은 아닌 것 같습니다. x86이건 ARM이건 디바이스 드라이버 소스를 보시면 모두 C로만 되어있습니다. 어셈블리가 쓰이는 건 주로 arch 디렉토리 밑의 부분인데 이건 커널 포팅하는 사람이 주로 하게 되지요.
Viz의 이미지

저는 컴퓨터 엔지니어에게 있어 하드웨어 부분과 소프트웨어 부분 모두 중요하다고 봅니다. 물론 많은 사람들이 한쪽만을 택하는 경우가 많아 보이기는 합니다만...

제가 다니는 과만 하더라도 하드웨어에 대해 꽤나 훌륭한 커리큘럼이 존재함에도 불구하고, 많은 사람들이 하드웨어에 대한 커리큘럼을 포기하고 있습니다. 일단 처음 시작이 어렵기 때문이겠죠.

특히 하드웨어는 파악하기 힘든 부분에서 잘못이 생기면 대처하기가 쉽지 않아서 좌절하는 분이 많습니다. 코드를 짜는 것은 잘못되어 봤자 어딘가의 '코드'이겠지만 보드를 만들다 보면 칩 설계의 잘못인지, 보드 구성의 잘못인지, 어디 납땜이 잘못된건지 도저히 알 수 없는 경우에 빠지기도 하니까요.

하지만 저는 이런 어려움에도 불구하고 하드웨어 쪽을 공부했던 것이 매우 보람있었다고 생각합니다. 하드웨어 쪽에 대해 지식을 쌓기 전에는 단지 블랙박스에 불과하던 컴퓨터가 조금씩 속이 보이는 녀석이 되기 시작했으니까요.

책에서, 그리고 코드로 인터럽트가 뭐다.. 라고 생각하는 것보다 오실로스코프 상에서 번뜩이는 펄스를 보는게 휠씬 좋습니다. "디바이스 컨트롤러"를 만들어보면 "디바이스 드라이버" 같은건 어렵지 않을지도 모릅니다. OS가 없는 환경에서 ELF 로더 같은 걸 만들어 프로그램을 올려보면 PC가 주는 환경이 얼마나 축복인지도 알 수 있고요. :D

질문 글에서 전자회로나 회로이론 같은 부분에 약해서 걱정이라고 하셨는데 디지털 시스템에 한정한다면 0과 1의 bit가 low, high의 voltage level에 대응한다는 것만 알아도 충분합니다(적어도 저의 경우는 그러더군요 :) )
그것보다는 일반적인 디바이스가 어떻게 구성되는지, 디바이스들의 bus가 어떻게 연결되고 각 모듈의 handshaking이 어떻게 이루어지는지 같은게 휠씬 중요한 문제고 프로그래밍을 하는 것에 있어도 많은 도움이 되는 부분일 것입니다.

결론은... 하드웨어 쪽도 가능한 열심히 해보시라는 것입니다. 아는 선배의 말씀으로는 학교 졸업하면 절대 그쪽 공부할 기회가 오지 않을 것이라 하시더군요.

My Passion for the Vision!

hb_kim의 이미지

디바이스 드라이버 관련 일을 할때 보통 두 부류로 나뉘는데 한 부류는 레퍼런스 코드를 만드는 그룹이고, 나머지는 애플리케이션용 드라이버를 만드는 그룹입니다.

레퍼런스 코드란 칩회사에서 고객들에게 나누어주는 코드로, 보통 하드웨어가 개발단계에 있을때 드라이버 엔지니어가 칩개발과 동시에 firmware 나 드라이버를 작성해야만 하는 경우입니다. 이 경우에는 최종 동작에 문제가 있을때 본인의 드라이버에 문제가 있는 경우도 있으나, 하드웨어에 문제점이 있을수도 있으니 어느 정도 하드웨어에 대해서 알아야 분석내지 디버깅을 할수 있고, 본인의 업무를 수행할수 있습니다.

애플리케이션용 드라이버 프로그래머들은 이러한 레퍼런스코드를 이미 칩회사로부터 공급받은 상태에서 특정 기능을 추가하거나, 성능을 개선하거나, 다른 OS 로 포팅하거나 등등의 수정을 하는것이 업무입니다. 이 경우에 하드웨어는 어느정도 신뢰성을 가지고 있다고 보며, 디바이스 드라이버 프로그래머가 하드웨어에 관해서 이해해야 할것은 아주 최소입니다.

레퍼런스 코드를 만드는 프로그래머가 되고자 할 경우에는 말씀하신 여러가지 디지털 로직에서 부터 마이크로프로세서 아키텍쳐 까지 폭넓게 이해하고 있으며, 그 외에 로직 아날라이저라던가 하는 기본 분석 장비의 사용법을 알면 좋겠죠. 아무리 그래도 VHDL 까지는 필요 없다고 생각합니다.

애플리케이션용 드라이버 프로그래머들은 최소한만 이해해도 될것입니다. AND, OR, XOR 게이트부터 시작해서 latch, clock 등의 개념만 알고 있으면 되겠죠. 로직 아날라이저나 납땜인두에 대해서 알면 좋지만 굳이 알아야 할 필요는 없구요.

참고로 애플리케이션용 드라이버를 필요로 하는데가 훨씬 많습니다.

본인이 하드웨어에 대해 공부하고 싶지 않다면 굳이 하지 않아도 된다는 생각입니다. 그대신 좋아하는 분야에 대해서 더 많이 하면 충분히 보상이 되겠죠. 회사에서 일을 할때 다른 사람과 팀웍을 잘 유지하면, 어떤 분야의 지식이 조금 부족하다 하더라도 별 문제가 없습니다.

gurugio의 이미지

하드웨어를 얼마나 공부해야 하는지 주위 분들에게 자주 여쭤봅니다.

대답은 여러가지가 있는데요

대부분은 알면 좋겠지만 자신은 별로 하고 싶지 않았고 잘 모른다이고요

별로 필요없다는 거의 없고

꼭 필요하다는 조금 됩니다.

리눅스 사이트라서 그런지 지금까지의 답글들만 보면

별로 필요없다라는 의견이 훨씬 많은것 같네요.

음.. 전 물론 하드웨어 제작부터 어플리케이션까지 어느 분야에 나아가게 될지

모르기때문에 뭐든지 학교에서 배울 수 있을 때 배워두자는 생각이라

수학과, 전자과, 시스템공학과 수업을 모두 듣고 듣고자 하고 있습니다.

개인적인 생각은요 하드웨어 공부를 해본 사람들은 대부분 프로그래밍에

도움이 됬다고 하시더라구요. 그래서 할 수 있는데까지는

부딪혀 보려고 합니다.

... 음 아주아주 작고 간단한 보드를 직접 만들어서 리눅스를 포팅해보는

정도까지만 공부를 할 수 있다면 그야말로 더할 나위없이 좋을 텐데요...

우리 학교에 그렇게 작업하시는 교수님께서 계시긴 한데

로봇쪽이라 좀 분야가 달라서 찾아가지는 못하고 있답니다.

암보드를 직접 만들어서 리눅스를 포팅해서 시스템 전체를 만들더라구요..

허허.. 그걸 보고나니 완전 벙쪄버렸답니다. oops

저같은건 이만년은 더 공부해야겠다는 생각뿐이죠 모.. wink

세벌의 이미지

어느 길을 갈 것이냐에 따라 다르겠죠. 제가 아는 분 중 한 분은 소프트웨어 개발을 몇년 동안이나 한 분인데 고장난 컴퓨터에 대한 얘기를 하다가 보드가 망가진 것 같다는 말을 듣더니, 보드가 뭐지? 키보드? 이러시더군요. -.- 프로그램은 다른 사람이 보았을 때 알아보기 쉽게 짜고 에러가 거의 없기로 소문난 분이었습니다.

이정원의 이미지

여러분들의이야기를 들어보니 저야말로 왕초보의 최하수라는 생각이 드는군요.
저도 보드 만들고 리눅스 포팅하고 프로그램짜넣고 해보고싶습니다. T.T 무엇부터해야할지.....

ㅡ,.ㅡ;;의 이미지

gurugio wrote:

프로그래머로서 알아야할 소양중에 하드웨어가 필수라고 생각합니다

그런데 어느정도까지일까요?

.

무엇을어느정도 알아야될까. 생각하기전에.. 자신이 무얼할지 생각해보세요..

자신의 목표가 있다면.. 그것을 이루기에 해야할것들이 많을것이고 다하기엔 시간이 없을것이고 그중에서 중요한순서데로 하겠지요..


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

imcrazy의 이미지

저도 원래 전공은 제어계측입니다..

우리 학교는 제어계측의 여러 분야 중에서 주로 신호처리를 다루기때문에..
2학년 이후로 전공 수업시간에 거의 미분 적분만 하고 실제 하드웨어는 실험시간에.. 소프트 웨어는 실험물을 동작 시킬정도로(물론 어셈이나 C언어는 거의 독학으로 해야 합니다.)만 배웁니다.

프로그래밍에 관심이 있어서 입학때부터 C언어를 혼자 끄적거렸었는데..
포인터나 포트, 레지스트리 같은것이 영 개념이 안잡히다가..
2학년땐가?? z80으로 원보드 컴퓨터를 하나 만들어 보니까.. 바이오스 부터 부팅까지 개념이 확 잡히더군요..
포인터나 기타 메모리에 대해서도.. 이해가 쉬워졌습니다.

실험시간에는 16bit어드레스를 직접 세어가면서 기계어를 보면서 디버깅하기도 하고.. (z80기계어는 매우 쉽답니다.. ^^;;)
여하튼 그랬었었는데..

결론은.. 하드웨어를 알면 프로그램에 도움이 되기도 하고.. 특정 부분에 있어서 이해가 쉽기도 하지만.. 몰라도 큰 상관은 없다고 생각 합니다.

디바이스 드라이버나 기타 하드웨어와 밀접한 프로그램을 개발해야 할 경우에는 필요한 부분만 공부 하변 되겠죠.. 프로그램을 먼저 공부한 사람이라면 저랑 반대 방향에서 이해해 가는 것도 좋을 겁니다..

전 메모리 납땜하면서 8bit어드레스 데이터를 2번 보내서 16bit어드레스를 지정하고 어쩌고.. 이러다가.. 프로그램에서 메모리 번지 어쩌구를 보고.. 아.. 내가 납땜한게 이거구나.. 라고 이해 했거든요...

하드웨어 디버깅이나 프로그램 디버깅이나.. 별 차이 없습니다.
일단 찍어보는게 우선이구요.. 하드웨어는 테스터로... 프로그램은 프린터()로..
그담에는 모듈간 연결을 확인 하고.. 그다음에는 모듈자체를 확인하고..

옛날 생각이 나네요.. 아... 학교다닐때 수업좀 열심히 들어둘걸..

서지훈의 이미지

딱 어느 정도까진 없을거 같고...
시간되고... 여건이 되면...
계속 공부를 하시면 될거 같네요...
전혀 모르면 아쉽고...
너무 깊이알면 머리아파지니깐...
걍... 재밌게... 필요할 때...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);