프로그래머의 미래, 아키텍트

아키텍트 이야기
야마모토 케이지 지음, 이지연 옮김, 이용원 외 감수 / 인사이트
나의 점수 : ★★★★

 프로그래머의 상위 클래스 중 하나인 아키텍트에 대한 책.

아키텍트는 번역하자면 ‘책임 설계자’로 전체적인 아키텍처의 설계와 프레임워크의 구현을

담당하는 직책이다.

실제 경험 많은 아키텍트이기도 한 저자가 아키텍트가 하는일에 대해 친절히 설명해 주고 있다. 막연하기만

했던 아키텍트 라는 존재에 한발 다가간 느낌이다.

 대게 프로그래머로 시작한 사람도 나이가 좀 차면 관리자로 빠지기 마련인데, 계속해서 개발을 하고 싶은

사람에게는 아키텍트가 좋은 선택 중 하나다. 개인적으로는 ‘수석 개발자-_-‘가 목표긴 한데… 책에 등장하는

가상의 아키텍트인 C를 보고 있으니 ‘오~ 멋진데’ 라는 생각도 들고.. 아키텍트도 괜찮겠다는 생각이 든다.
 
다만, 문제라면 이 책에서 말하는 아키텍트는 개발 전반에 걸쳐 관여하면서, 다방면에 걸친 넓고 얕은 지식과

설계와 프로그래밍에 탁월한 능력을 가져야 하며, 심지어 개발 외적인 일까지 관여할 수도 있는

(혹자의 말대로) 그야말로 피곤한 직책이다-_-

 그래도 클래스 체인지 시 고려해볼 가치가 충분히 높은 클래스 임에는 틀림없는 듯 하다.

Eclipse, SWT/JFace

Eclipse. 자바 IDE로 시작해서 그 확장성 덕분에

이제는 당당히 플랫폼으로 자리 잡은 녀석이다.

예전에 무료로 쓸 수 있는 자바 IDE를 찾다가 잠깐 써보긴 했는데,

내가 그동안 워낙 자바랑은 관계 없는 일을 하다 보니

별로 인연이 없던 툴이었다.

(CDT가 있긴 하지만, 보통은 VC나 gcc + vi를 쓰니…)

그러다가 어째 어째 하다보니….

이번에 개발툴을 개발하는 일을 하게됐고,

조금이라도 쉽게 할 수 있는 방법을 찾을려니,

이클립스 플러그인으로  개발하게 됐다.

덕분에 자바도 다시 써야 되고,

이클립스에서 사용되는 GUI 툴킷인 SWT와 JFace도

배워야 할 처지가 됏다.

(덤으로 PDE, GEF 등도)

끙.. 요새는 언어고, 라이브러리고 공부해도 손에 잘 안익는데..

역시나 책보면서 열심히 버벅이고 있다;;

그래도 어쩌겠나.. 프로젝트는 해야되니…

개발과정에서 사용자의 적극적인 참여

개발 과정 중에 사용자가 얼마나 적극적으로 참여하는냐는 아주 중요하다.

특히 SI의 경우 그 특성상, 사용자의 요구가 충분히 반영되지 않은 채

시스템이 구축되면 문제는 심각해진다.

개발된 프로그램이 처한 운명은 두 가지 중 하나가 될수 밖에 없다.

창고 속에 처박히거나, 대대적으로 수정되거나…

산업기능요원 시절에  참여했던 모 프로젝트는 후자의 경우였다.

(최종적으론 전자의 운명을 맞긴 했지만… 기획상의 미스랄까.. 그런거였다..)

온갖 고생을 하면서 간신히 만들어 놓은 시스템이

준공이 다되서 ‘못쓰겠다’ 라는 판정을 받았다-_-

그래도 프로젝트를 실패로 만들수는 없는지라…

검수 완료 후 수정을 하겠다는 약속을 하고 무사히 검수를 받았다.

그리고… 서브 시스템 하나가 전면적으로 ‘재개발’ 되었다.

무슨 낙후 지역 재개발 하는 것도 아니고..-_-;

그 후에 PM 한 분이 그 프로젝트와 관련해서 해주신 말씀이 있었는데,

‘사용자를 개발 초기 부터 끌어 들여서 적극적으로 참여하게 해야 한다’

는 거였다.

그 이전에 다른 프로젝트가 있었는데, 개발 과정에서 실사용자가

별 다른 관여를 안 하다가 실제 사용 하면서 계속 해서 요구 사항을

쏟아 내는 바람에 유지보수 하느라 무지하게 고생했던 적도 있었다.

그래서 옳은 말이라고 생각했는데…

사용자가 너무 적극적으로 참여하는 것도 문제인거 같다-_-;

물론, 사용자가 만족할 프로그램을 만드는게 최우선이다.

(열심히 만들었는데 아무도 사용하지 않는건 참으로 씁슬한 일이다.)

사용자는 물론이고 개발자도 만족할 수 있는 프로그램,

필수적인 기능은 물론이고, 온갖 편의 기능으로 장식되어 있는 프로그램을

만들어야 하는 것이다.

그러나 그건, 시간이 무한정있고 그와 함께 돈을 무한정 받을 수 있을 때 얘기다-_-

돈은 쪼금 받고, 일은 무진장 많이 해야 되는 상황은 그야 말로 피해야 될 상황이다.

그런데, 사용자가 너무 적극적으로 나오면, 그렇게 될 수 밖에 없다.

이번에는 최근에 했던 다른 프로젝트를 예로 들어 보자.

이 프로젝트는 정말 고난의 연속이었는데…

수 많은 원인이 있었지만, 그 원인 중의 하나는 지날칠 정도록 적극적인 사용자였다.

프로젝트 초기 부터 제안서는 무시한 요구 사항이 계속 되었고,

중반에 접어들면서 부분적으로 프로그램을 쓸수 있게 되자

그에 대한 온갖 수정 사항, 추가 개발 요구 등이 쏟아 졌다.

심지어는 다 만들어 놓은 기능을 보고, 이렇게 하면 안된다라고 하기도 하고…

(이미 요구사항 분석 단계에서 확실히 말해 줬어야 할 내용도 다수 포함되있다)

이런게 더 필요하다… 이건 이렇게 저렇게 고쳐라… 이 기능은 빼라.. 아니다 다시 넣어라,

다른 X 프로젝트에서는 이렇게 했더라, 우리도 이렇게 하자… 등등

프로젝트가 후반으로 접어들고 막바지가 되서 까지…

그 적극적(?)인 요구는 그칠줄을 몰랐다.

이럴땐 정말이지… 나중에 프로그램이 쓰이든 말든…

사용자는 좀 잠자코 얌전히 있어 줬으면 하는 바램뿐이다.

====

이제는 정말이지 개발중에 사용자가 적극적으로 참여하는게 좋으냐 아니냐는

판단하기 어려운 문제가 되버렸다-_-

무엇이든 적당히가 좋긴 한데… 그게 쉽지가 않으니 문제다…

Borland C++ Builder

윈도우 세계에서는 마이크로소프트 사의 Visual C++ 과 쌍벽을 이루는 C++ 개발툴이다

(사실 윈도우에는 그외에 C++ 개발툴이 잘 없기도 하지-_-;)

난 MS를 썩 좋아하지 않으면서도 그와는 별개로 윈도우에서 개발할때는

주로 MS의 개발툴들을 써왔는데…

D시의 B 프로젝트를 하면 처음으로 C++ Builder 6.0 이라는 놈을 써보게 됐다.

첫 인상은.. 글쎄… 그닥 나쁘지 않았다. C++을 쓰면서도 4GL 처럼

쉽게 프로그램을 개발할 수 있는 개발툴이니… VB와 C++의 장점을

합쳐 놓은 듯한 느낌이었다. 더군다나, 고유의 VCL 컴포넌트 뿐만 아니라

ActiveX 컴포넌트도 가져다 쓸수 있고, 델파이 같은 다른 언어로 만든

컴포넌트도 끌어다 쓸 수 있고… 암튼 쓸만한 툴이구나 했다.

그. 러. 나.

계속해서 쓰다보니 점차 짜증이 났다.-_-

가장 문제가 되는건 툴이 너무 무거웠다. 예전에 J Builder도 굉장히

무거웠던 기억이 있는데… 이놈도 마찬가지 였다.

개발하던 프로그램 덩치가 좀 커진 탓도 있겠지만…

풀 컴파일을 하려면 10 여분은 족히 걸리고…

개발한 프로그램을 디버거로 실행하고 종료하는 데도 몇분씩 걸린다.

VB로 더 덩치가 큰 프로그램을 돌릴때 보다도 더 느린거 같았다.

이 땜에 개발 시간이 몇 배는 소요되니… 이건 정말 치명적이다;;

당최 예상했던 일정을 맞출수가 없다-_-;

더군다나.. 디버깅을 하다보면 지 혼자 자꾸 죽는다. 툴자체가 말이다.

어떨때는 디버거가 꺼지지도 않는다-_-; 또, 어떨때는 디버거를 띄워도

break point에서 멈추지를 않는다… 이럴땐 리부팅을 해주면 다시 잘된다-_-

또, 4GL 스럽다 보니… 별도의 런타임 환경이 필요하다. RTL이던가…

VB의 VB 런타임에 대응되는 넘인데… C++ Builder의 경우에는 프로그램에

static 하게 링크 할수도 있다.(대신 파일 크기는 좀 더 커진다. 속도는… 잘 모르겠다.)

좀 불편한것 중에 하나는 VC++이나 기타 다른 IDE에서 처럼 프로젝트 설정을 여러개로

둘수가 없다는 것이다. debug용 release용을 구분해 둘 수가 없으니,

릴리즈 할때 설정 바꿔서 새로 컴파일하고, 디버깅할때 설정 바꿔서 새로 컴파일 하고…

정말 귀찮다..-_-(거기다 DLL 여러개로 쪼개나서 일일이 바꿀려면 더 귀찮다-_-)

마지막으로… 결정적으로 내가 이 툴을 싫어하게 된 이유는…

순수 C++이 아니라는 것이다! managed C++이라는 이름으로 C++이 C++이 아니게

만들어 놓은 MS에 치를 떨었었는데… 이넘은 그 보다 앞서 C++을 지멋대로 바꿔놨다.

(나중에 알고 보니 C++ Builder 만들었던 개발자가 MS로 가서 .NET을 만들었드만-_-)

(물론… 이건 그냥 개인적인 취향이고, 개인적인 생각이다-_-)

찾아보면 더 있겠지만… 내가 직접 확인한건…

폼의 이벤트 핸들러가 생성자 보다도 먼저 호출 될수도 있다는것.

(만들어 놓은 폼을 상속한 폼의 경우 이렇다)

도대체 어떻게 객체를 만들지도 않고 이벤트 핸들러를 호출 한단 말인가!

또 한가지는 pure virtual function을 가진 클래스의 객체가

인스턴스화 될수 있다는거다. 대신 해당 function을 호출하면 런타임 에러가 난다-_-

쩝… 아무튼…

C++ Builder를 신봉하시는 분들께는 대단히 죄송한 말씀이지만…

내 개인적인 생각으로는… 좀 ‘아니다’ 싶은 툴이다. 다음 프로젝트 부터는 회피대상-_-

볼랜드에서 개발툴 사업부를 매각한다는 얘기도 있고, 개발퉁에서 손뗀다는 얘기도

있었던거 같은데… 얼마전에 보니 새로운 버전이 나오긴 했던데… 좀 괜찮을 라나 모르겠다.

버그가 적은 프로그램을 빠른 시일내에 만드는 방법은 없을까?

버그가 없는 프로그램이란건 현실적으로 불가능한 거고…

최대한 버그가 적은 프로그램을 최대한 빠른 시일내에 만드는것.

그거야 말로 최대 지상 과제 중 하나가 아닐까 한다.

요즘 만들어 놓은 프로그램을 테스트 하면서 수정하고 있자니…

한숨이 푹푹 나온다.

우리나라 SI 특성상(잦은 사용자 요구사항의 변경, 촉박한 일정 등) 고품질의 프로그램을

만드는 것 자체가 힘들다고 생각은 하고 있지만…

이건 좀 너무 아니다는 생각이 든다. 내가 실무를 하게 된게 어느덧 5년이 다 되어 가는데,

이게 과연 5년차 개발자가 만든 프로그램인가 싶을 정도.

수년간 SI하면서 가지게된 개발 방식은 ‘일단 돌아가게 만들자’이다.

버그가 좀 있어도 요구한 기능을 다 만드는게, 거의 버그가 없어도 일부 기능이

구현 안된거 보다는 낫기 때문이다.

구현만 되어 있다면야, 테스트야 적당히 통과할 수도 있는 문제지만

기능이 안되있는건 정말 대책이 없으니까.

그러다 보니, 프로젝트 후반부 및 검수 후에는 버그 수정으로 정신이 없을 정도다.

항상 그랬던거 같은데… 이번 프로젝트에서는 그 정도가 더 심하다.

정말이지 다른 방법을 찾아야 할때가 아닌가 하는 생각이 든다.

TDD가 제대로 사용만 된다면, 이런 문제를 해결 할 수 있지 않을까 하는 생각이

문득 들지만… 글쎄..;;; 웬지 활용을 시도하기가 쉽지가 않다.

—-

두서도 없고 결론도 없는 글은 여기까지=_=

CMMI 인증의 효용성?

ZDNet에서 CMMI 인증에 유효기간이 도입 된다는 내용의 기사를 보다가 문득든 생각이다.

‘그래, CMMI 레벨 5 받았다고 다 제대로 된건 아니지…’

사실, 현재 CMMI 레벨 5를 받았다는 모기업과 같이 프로젝트를 진행 중이다.

글쎄.. CMMI 인증을 받은 기업이라고 조직내 모든 프로젝트가

제대로 잘 굴러가는 것은 아니겠지만..

같이 일하는 업체의 영향도 있겠지만…

이건 좀, 너무 아니다 싶을 정도다. 그래도 명색이 CMMI 레벨5를 받은

기업이라면 뭔가 달라도 달라야 되는거 아닌가?

이건 머.. 이제껏 내가 해본 프로젝트 중에 최악이다.

CMMI 레벨을 취득한 탓인지는 모르겠지만

(시스템이 일을 하니 사람은 누가 와도 상관없어서인지)

수시로 일하는 사람이 바뀐다. 머, 일부 고정적으로 상주 하는 사람도 있지만,

정신이 없을 정도다. 사람 한번 바뀌면 죽어나는건 상주인력.

진행상황, 현재 상태 등을 자세히 가르쳐 줘야하니…

또, 어떤 사람은 어느순간 와서 프로젝트 분위기, 상황 파악도 못하면서

원리원칙 대로만 떠들다 가질 않나,

(이 사람들은 이 프로젝트, 저 프로젝트 돌아가면서 계속 왔다갔다 한다)

거기다 프로젝트가 막바지인 지금도 수시로 설계가 변하고,

요구사항이 추가됐다, 없어졌다를 반복하고…

명확히 정의 안된 업무도 많고…

프로젝트가 굴러가는게 신기할 정도.

우리나라 사람들이 dump로 아무것도 모르고 자격증 따듯이

단지 CMMI 인증을 획득한거 뿐인 건지…

아님 워낙 큰 조직이라서 인증 받은 부서와 못받은 부서의 차이가 크고,

이쪽은 인증을 못받은 부서인 건지…

자기들은 제대로 하는데 협력업체가 제대로 못하는 건지…

도대체가 알수 없다 @_@

웹의 화려한 변신

Google Calendar(http://calendar.google.com)

우연히 ZDNet에서 기사를 보고 들어갔는데…

요새 캘린더 프로그램을 쓸까 말까 생각 중인차에 시기 적절한 서비스기도 하지만…

그 보다 더 놀란건 웹페이지를 이정도 까지 만들었다는 것.

웹 2.0이니 AJAX니 하면서 요새 말도 많더만..

이건 정말 대단하단 생각 밖에 안든다.

google 홈페이지에서 볼수 있는 개인화된 홈 도 마찬가지.

이젠 웹어플리케이션이라고 해도 일반 어플리케이션에 비해 꿀릴게 하나도 없다는 생각이 든다.

웹쪽으로도 관심을 돌려볼까..

임베디드 == 삽질의 연속?

끄으… 물론 내가 경험이 미천한 탓도 있지만…

머.. 이건 삽질의 연속이다.

이더넷이 안되서 한 2~3주 애 먹이더만

알고 보니 저항을 큰걸 달아서 출력이 약했던 거였다.

(내가 그럴줄 알았다. 하드웨어 문제 없기는 개뿔~ 머가 ‘hardware is perfect’냐-_-)

LCD가 제대로 안나와서 이게 도대체 왜 그럴까 고민했던니 백라이트 안켜서 그런거고-_-

(왜 원래 코드에서는 안 켜질까나..)

KITL도 애를 먹여서 KITL을 끄고 하다가 도저히 안되겠어가 어떻게든 돌리기로 결정.

알아보니 KITL을 인터럽트 모드로 돌리면

하드웨어 타이밍 문제 등 때문에 잘 안될 수도 있다나..

그래서 폴링 모드로 돌려야 한다는데.. 얘들이 가르쳐준 파일이 5.0에는 없다-_-

그래서 한참 해맸더니 KITLArgs.flags 를 셋팅해주면 간단하게 해결~

음.. 산넘어 산. 다음 난관은 버튼.

기존에는 인터럽트로 처리했는데,

이넘은 인터럽트가 발생이 안되는데 붙어 있어서리 폴링으로 처리할려니…

왜 도대체 파일이 추가도 안되고 로딩도 안되는 건지….

마구 삽질하다 보니 플랫폼에 있는 파일이 아니라 프로젝트 밑에 있는 파일을 고쳐야 하드만-_-

그래서 겨우 겨우 넣었더니… 이번엔 또 왜 타이머나 쓰레드가 안되는 건지.. 끄응…

한참을 삽질 하다가… 헉…. Init() 함수에서 0을 리턴해서 DLL이 언로드 된거고 이케T-T

마지막으로 버튼 이벤트 잡을 라꼬 소스 참조해 가면서 레지스터 건드리는데…

자꾸 딴 레지스터 건드려서 계속 컴파일 & 다운 새로 하고…

크억…..

해서 계속 삽질 중이고 앞으로도 삽질 할거 같음.

근데.. 적고 보니까 다 내가 바보라서 삽질한거 잖아-_-

Windows CE 포팅… 어렵다….;;;;

머.. 어느 OS 든 새로운 플랫폼으로 포팅하는 건 어려운 일이겠지만….

Windows CE의 포팅도 만만치는 않다.

그나마 같은 프로세서를 쓰는 경우 라면 훨씬 수월하겠지만.

TI에서나오는 칩같이 ARM 기반의 멀티 코어 프로세스 같은 건

정말 곤란하다

CSP(Chip Support Package)라는 부분 부터 시작해서

각종 드라이버, 레지 스터 등등…

정말 할일이 많다…

끙… 남는 시간에 경험 삼아 시작한 거긴 하지만;;;

완성할 수 있을 지… 쩝;;;;

아… 덧붙이자면… 저번에 얘기 했던 4.0 시리즈와 BSP 부분이 달라진건

5.0에서 부터 새로 도입된 product-quality OAL model(맞나?-_-) 인 듯 하다.

보드에 따라 달라지는 부분을 최소화한 새 OAL 모델.

아무리 그래도… 설명이 제대로 안나와 있는건 너무 하잖아;;;

Windows CE, OAL 그리고, 디바이스 드라이버… 그들의 이야기

우우… 한 2주 넘게 계속 문서 보면서 공부하고, 샘플 소스 보고했더니 머리가 다 아프다=_=

그래도 아직 잘 모르겠당;;;;

일단 이제 까지의 내용을 정리해 보면…

최초로 할 일은 역시 BSP를 만드는 일이다.

BSP라는건 타겟 보드에서 Windows CE를 돌리는데 필요한 것들을 OEM이 구현해 놓은 것으로…

bootloader, OAL, Divece Driver, 설정 파일 등으로 이루어 진다.

Windows CE 라는게 소스를 다 공개하지 않는 이상. 환경이 다른 수많은 타겟 보드에 올라가게 하기 위해서는

역시나 뛰어난 추상화와 계층화로 칩이나 보드에 따라 달라지는 부분들만 분리 시켜서 각 OEM이 그 것들을

원하는 대로 수정하게 하는것. 바로 그 부분. OEM Layer에 해당하는 것이 BSP다.

bootloader라는 것은 알다시피 타겟이 부팅되면 최초로 실행되어 OS를 로딩해 주는 부분. 문서상으로 봤을때는,

개발시에 타겟으로 OS를 다운로드하고 램으로 로딩하는 역할을 해서 개발을 도와주며, 최종 제품에는 포함되지

않을 수도 있다는 것 같은데… 그건 잘 모르겠다.

그 다음. OAL. 대충 Windows CE의 서비스나 기능 중에서 타겟에 따라 변경해 주어야 하는 함수들의 집합이라고 할까..

근데 이게 상당히 골 때리는게 4.0에서 5.0으로 넘어 오면서 함수 구성이 좀 바뀐거 같은데…

문서가 반영을 못하는 듯 하다-_-;

머.. 암튼 아무리 타겟마다 달라진다해도.. 그건 일부에 불과 하고 로직이 같은 경우가 많을 터…

어떤 타겟에서든 동일한 로직이 있고, 칩이 같은데 한해서 동일한 로직이 있겠지.

나머지는 보드 구성에 따라 달라지는 부분이 있을테고…

기존에는 아마 이런 부분들을 모두 복사해온 다음에 그 다른 부분만 고쳐서 쓴거 같은데…

이번에는 각각 구분해서 나눠진거 같다.

전체적으로 같이 쓰는 루틴이 담기 함수가 있고 거기서,

칩마다 다른 함수를 부르고…

거기서 다시 보드 마다 다른 함수를 부르고..

머.. 이런식..

그래서 같은 칩을 쓴 타겟에 대한 BSP가 있을 경우엔 일이 상당히 줄어 들게 되는 듯…

( 머.. 어차피 그전에도 일이 적은건 마찬가지네;;; )

암튼…. 문서에도 그렇게 안 나와 있고 누구하나 얘기를 안해줘서 잘 모르겠다만;;-_-;;;

마지막으로 디바이스 드라이버.

머.. 장치마다 구현해 줘야 하는건 당연한 거고… 날 괴롭혔던 것 한가지는.. ISR을 어떻게 할것인가…

즉… 인터럽트가 발생 했을 때.. 해당 하는 디바이스에 맞게 처리를 어떻게 해줄까인데…

혼란 시켰던 것 중에 하나가 ARM 계열은 단일 ISR을 지원한다는것.

즉, 인터럽트가 발생하면 무조건 특정한 함수(OEMInterruptHandler)가 호출된다는것. 그럼 모든 인터럽트에 대한

처리를 여기서 해줘야하나? 그건 아니다.

디바이스 드라이버가 초기화 될때 별도로 인터럽트에 해당하는 ISR을 등록할 수가 있거든.

거기서 등록해 놓으면, OEMInterruptHandler에서 자기가 처리하지 않은 인터럽트에 대해서는 등록된 ISR을

호출해 주도록 하는 것이다. 이 때, IST(Interrupt Service Thread)인가 에서 적당한 처리를 해주게 하기 위해서

논리적 IRQ(sysintr. OEMInit 시에 물리적인 IRQ와 맵핑시킴)과 Event 객체를 등록하기도 한다.

==

음…

일단 오늘은 이정도…