블로그 이미지
루미넌스
There are only 10 types of people, those who understand binary and those who do not.

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      
2006/11/07 23:02 Dev 노트
(혹시 있을지 모를, 앞의 내용이 궁금한 방문객을 위한 링크^^;;;)

일단 스펙이 잡혔다고 생각된다면, 물론, 충분히 수요자와의 피드백을 거친 다음에, 그다음 할 일은 일정을 잡아보는것이다.
과연 이 프로젝트를 수행하는데 얼만큼의 시간을 쏟을 것인가를 계획하는 것이다. 정확할 필요는 없다. 그러나 허무맹랑해서도 안된다. 도저히 시킬수 없는, 단지 상급자(보통은 팀장이나 부서장, 혹은 PM)의 기분을 좋게 하기 위해서라던가 당장 회의의 스트레스에서 벗어나고 싶은 맘으로 "질러"버리면 크게 후회할 일이 반드시 생긴다. 그런 스케줄은 없느니만 못하다.
소프트웨어 개발이라는게(역시 하드웨어도 마찬가지이지만..) 물흐르듯 부드럽게 진행되어야 한다.
"자.. 11월 7일 오후 3:45분경에 스펙을 완료했으니까 3:46부터는 스케줄을 잡아보는거야."
이런 식으로 진행할수 없다는 말이다. 그게 가능하더라도 그렇게 해서는 안된다.
스펙을 잡는 과정, 특히 기능명세를 구체화하는 회의를 마치고 고객이 돌아간 뒤에 개발 담당자만 모여서 기술명세를 작성해 가는 과정에서 명세가 구체화 되어 갈수록 스케줄도 나오고, 프로젝트 수행을 위한 설계도 가닥이 잡히고 업무분담도 윤곽이 드러나게 된다. 물론 "DVD대여점 고객관리 프로그램"을 만들어야 한다는게 유일한 명세서인 단계에서는 도무지 스케줄이나, UI와 로직, 데이터 스키마라던지, 필요한 인력이 몇이나 되는지와 같은 설계는 감이 잡히지 않는다.
스펙이 잡힌 후에 스케줄 잡는 작업을 착수해야 한다고 말하는 것은 이런 것이다. 딱히 경계가 있는 것은 아니라는걸 잊지 말자. (하지만 정말 많은 사람들이 모르는건지 잊은건지.. 경계를 그으려고 한다.)
이전의 포스팅에서 "완벽한 명세서를 만든다면 개발프로젝트는 50%이상완료되었다고보아도 좋다."
라고말했다. "완벽한 명세서"가 만들어 졌다면 이미 스케줄링도 되었을 것이고 지금까지 생각할 수 있었던 최대한의 가능성을 검토한 설계와 각 요소를 개발할 담당자까지 정해졌을 것이기 때문에 한 말이다.
그럼, 명세 구체화 과정에서 스케줄은 어떻게 잡아가야 할까..
대체로 개발 프로젝트는 기술명세를 구체화하는 동안 스케줄과 설계가 나온다. 고객의 Needs(요구와 약간 개념이 다르다)를 모두 수용하기 위한 기능명세를 다듬는 과정에서는 스케줄이나 설계가 잘 보이지 않는다. 그렇다고 기능명세를 소흘히 해서는 안된다. 기능명세의 내용을 펼쳐 놓고 만드는 것이 기능명세가 되는 것이다. (적어도 지금 하는 일과 개발자 명함을 파자마자 했던 일을 제외한 내가 참여했던 모든 프로젝트는 그랬다.)
기술명세를 구체화 할때는 개발자들 사이에 이런 대화들이 오간다.

"UI부터 시작할까? 아니면 스키마부터?"
"UI라니? 어떤 환경에서 돌아가는지 정해진거야? 윈도우인지 리눅스인지 맥인지.. 모르잖아?"
"UI와 스키마가 얼마나 분리될 수 있는지부터 생각해 보는건 어때?"
"UI-로직-스키마를 완전 분리하는게 버전업하기 좋지.."
...
"고객 정보란게 도대체 어떤 필드들을 갖는 레코드라고 할 수 있을까?"
"단일한 레코드로 표현되긴 하는거야? 아닐것 같은데.."
"RDBMS로 해결할수 있을것 같다."
...
".Net을 쓰면 맥 환경에서는 안돌아 가잖아?"
"맥에서 돌리겠다는건 억지라구.."
"윈도우 환경이라고 .Net FW를 항상 설치한다고 생각하는거야? 차라리 MFC가 개발하기 빠르지"
...
"UI와 로직 단의 인터페이스는 어떻게 할꺼야?"
"웹서비스랑 웹 애플리케이션으로 만들어서 브라우저 쓰라고 해버릴까?"
...
"고객 레코드는 CClient class로 만들면 되겠어. 구성은 이 그림처럼.."
"DVD타이틀은 CMedia class로 만들면 되고.."
"이 Object를 담을 수 있는 스키마를 생각해 보자.."
...


도대체 머리속에 적당한 예가 떠오르지 않아서 맨날 울궈먹는 DVD대여점-_-으로 또 써보긴 했지만, 대충 분위기가 저렇다는 것이다. (보통 DVD대여점 프로그램을 짤때는 저렇게까지 모여앉아 의논하지 않는다;; 하는게 바람직 하지만..) 하여튼 점점 설계의 윤곽이 드러난다. 이렇게 윤곽이 나올때쯤 되면, 이 부분을 구현하는데는 어느정도 걸리겠다 하는것을 알수 있고, 그걸 모두 합치면 전체 일정이 나오는 것이다.
각 부분의 일정을 생각할 때 빼놓지 말아야 하는 것이 테스트와 디버그 시간이다. 이건 다분히 경험적인 수치일 수밖에 없지만, 그 경험적 수치가 현실성이 있게 하기 위해서 소위 말하는 유닛 테스트를 가능하게 하는 설계를 하는 것이다. 유닛테스트와 같은 TDD(Test-Driven Development)이야기는 다음기회에...;;
이렇게 잡혀진 설계의 개요와 스케줄은 매우 현실성이 있다.
자, 이제 얼만큼의 시간이면 프로젝트를 완수할 수 있다고 팀장님께 보고하러 갈 시간이다.
가기전에 다시 한번 생각해 보자. 각 요소 결합 후의 디버그 시간을 빼뜨리지는 않았는지.. 안빠뜨렸다면 그 앞에 하루나 이틀정도, 프로젝트 규모에 따라, 덧붙이자. 바로 프로토타이핑할 시간이다^^

아마도 지금까지의 과정을 개발을 전혀 모르는 기획부서가 혼자하도록 내버려둔 회사도 많을 것이다. 주변에 보이는 소위 성공한 벤처들은 이 과정을 개발을 약간 해본적이 있거나 개발에 관한 지식은 좀 있는 기획부서에서 했기 때문에 남들보다 뛰어났던 것이다.

이제 최고가 되자.



덧. 쓰다보니 정작 필요한 말은 빼먹게 되는거 같은데.. 책쓰는것도 아닌데 뭐;;;
Creative Commons License
posted by 루미넌스
2006/11/07 00:27 Dev 노트
모든 개발프로젝트를 시작함에 있어 명세서(specification)의 작성은 아주 중요하다. 완벽한(과연?) 명세서를 만든다면 개발프로젝트는 50%이상완료되었다고보아도 좋다.
명세서가 뭐길래 그토록 중요한 것일까?
명세서를 쓴다는 것(혹은, 스펙을 잡는다는것)은 프로젝트의 최종 목표를 정하는 일이고, 목표물이 되기까지 거쳐야 하는 필수 단계들을 나열하는 것이고, 마주칠지도 모르는(아마 거의 마주치게 될) 어려움을 미리 예측하여 어려움의 발생을 최소화하는 유일한 방법이다. 적어도 내가 아는 한은 그렇다.
또, 비교적 지킬수 있는 스케줄링을 하는데 무척이나 기여한다.

우리나라의 대부분의 IT기업들은 보통 스펙을 잡는 과정을 개발과정으로 간주하지 않는다. 이는 기획자의 몫이며 개발자는 기획자가 만든 기획안(이걸 스펙과 혼동한다)대로 구현해 주면 되는 것이라고 생각한다.
그나마도 이렇게 생각해주면 다행이다.

기획자도 없이, 누군가(사장, 혹은 부서장?)에 의해 무언가를 만들겠다고 내던져진 말이 곳 스펙이 되어 버린다. 개발자는 의례 Visual Studio라던지 Eclipse라던지, 터미널에 VI를 열어놓고 높으신 분께서 말한 제품을 어떻게 만들수 있을지 생각한다.

뭔가 이상하지 않은가?
"이러한 소프트웨어가 필요하다"
라고, 단지 필요한 소프트웨어의 대충의 명칭을 말하면 개발자는 알아서 그것은 이런 기능을 가질 것이다 라고 판단하고 자기 머릿속에만 있는, 곳 자기도 기억하지 못할 스펙을 상상해 낸다. 신기하게도 제품은 완성되고, 처음에 프로젝트를 시작시켰던 분께서는...
"훌륭해.. 그런데, 이걸 왜 만든거지?"
라고 말한다. OTL
만들라면서요..
"내가 만들라고 했던건 이런게 아니라.. 어쩌구 저쩌구...주절주절..."
아니 그걸 이제와서 말씀하시면 어떡해요..

누가 잘못한걸까..
개발자도 기획자도 모두 잘못했다.

모든 소프트웨어 프로젝트는 항상 고객에게 기능을 제공하기 위한것이라는 공통된 목적이 있다.
고객은, 개발자가 자기 혼자 쓰려고 만들때는 자기 자신이 될 것이고, 사내 지원조직이나 시스템조직에게는 운영조직이나 다른 시스템조직 또는 서비스를 받는 유저가 고객이 될 것이고(전문용어로 내부고객이라고도 한다), 제조업체의 개발조직에게는 제품을 구입해 주는 소비자(이건 당연히 외부고객이다)가 고객일 것이다. 어떤 경우건 고객은 언제나 위대하시고 언제나 옳은 말씀만 하신다는걸 기억해야 한다.
고객이 "난 이렇걸 원해요"라고 말하는데, "그게 아니죠.. 당신은 이런걸 원하는 것입니다"라고 말할수 있는가? 과연 그게 맞다고 생각하는가? 무슨 근거로?

그래서 스펙화과정, 명세서 작성과정이 꼭 필요하다는 것이다.

XP(eXtreme Programming)이라는 방법론에서 말하길 고객을 개발과정에 참여시키라고 한다.
명세서를 작성하는 과정이 고객이 개발과정에 참여할 아주 좋은 단계이다.
우선,
"이 소프트웨어가 (또는 하드웨어라도 마찬가지..) 이러한 기능을 하며, 이 기능들을 위해서 사용자에게 이러한 인터페이스를 제공하고, 사용자에게 보이지 않는 곳에서 데이터들을 이렇게 조직하기 때문에 이러이러하게 응용한 기능들을 얼마든지 만들수 있다."
이런 "내용"이 명세서에 모두 들어가야 한다.
"물론 이 모든것을 구현하는데는 몇달의 시간이 소요되고, 그에 따른 비용이 얼마이므로, 이 제품의 가격은 얼마가 된다"
이런내용도 가급적 포함시키는게 좋다.

개발자들은 이런 과정을 싫어하는 경향이 있다.
늘 해왔듯이 에디터를 띄우고 코드를 적어 내려가고, 컴파일하고 실행시켜 보아서 고객이 말한 행동을 하는 소프트웨어가 되었는지 확인하는걸 개발의 왕도라고 생각한다. 하지만, 개발자는 실리콘으로 만들어진 것이 아니라 단백질로 만들어졌기 때문에 , 인간 사고 패턴의 한계를 벗어날 수는 없고, 망각이라는 한계로부터 자유로울 수 없다.
만일 당신의 두뇌는 실리콘으로 만들어져 있고 1.5V또는 3.3V의 전원을 공급해서 두뇌를 운용한다면 이따위 헛소리는 집어치라고 말해도 할말이 없다.(5V의 전원을 쓴다면 그따위 구닥다리 두뇌는 집어치우고 차라리 단백질을 택하라고 자신있게 말할 수 있다)
많은 개발자들이 고객은 기술에 대해 아는것이 아무것도 없는데 말도 통하지 않는 그런 사람들하고 어떻게 같이 스펙 작업을 하는가 라고 말할지도 모르겠다. 하지만 고객에게
"이 정보는 Windows 2003 server에 설치된 MS SQL에 저장되어 있으며, 3개의 테이블이 Foreign key로 엮여 있어 Data Integrity가 높게 유지될 수 있습니다. 그러나 Integrity에 대한 exception을 발생할 때의 handling을 위해서 wrapper를 만들 것입니다. 이렇게 하면 모든 컴포넌트의 Data I/O를 통제 할수 있습니다. Data의 I/O가 일어나면 blahblah Algorithm에서 증명된 방법으로 데이터를 가공합니다.
연산의 최소화를 위해 reference를 3개 사용하여 최적화를 수행할 수 있을 것입니다.
이렇게 가공된 데이터는 Bitmap object에 매핑되어 스크린 또는 프린터로 전송됩니다. 프린터로 전송될 때는 Postscript로 변환하기 위한 엔진이 사용됩니다. 어쩌구.."
이런 기술적인 얘기를 하라는게 아니다. 나도 이해 못하겠는 소리를 고객에게 하면 뭣하는가.
이런 현학적인(이 단어도 현학적이다;;) 명세서를 고개에게 들이밀면, 고객은 현란한 기술용어에 감탄하던지 겁을 먹고 개발자에게 "네.. 그렇게 만들어 주면 너무 훌륭하겠네요"라고 말해버린다.
솔직해져라. 이걸 노려왔지 않은가..

스펙명세서에는 크게 두가지 버전이 만들어지는게 정석인데, 하나는 Fuctional Specification(기능명세), 또 하나는 Technical Specification(기술명세)가 된다. 고객에게는 절대 기술명세를 보여줘서는 안되며 (기밀사항이 아니더라도 보여줘선 안된다.) 더욱이 함께 작성해 보자고 달려들어서도 안된다.명세는 쉽게 작성되어야 하는데, 기술명세는 개발자에게 아무리 쉽고 하찮은 내용일지라도 고객에게는 마법주문서와 같아보이게 마련이다.

절대로 명세서는 쉽게 작성해야 한다.
쉽게, 그리고 눈에 확 들어오도록, 가급적 재미있게(구어체를 섞어주는것도 좋다) 작성해야 한다. 명세서를 쉽고 재미있게 작성하지 않으면, 작성한 자신도 다시는 들여다 보지 않을 것이고, 본인이 지금 명세와 얼마나 다른 물건을 만들고 있는지 눈치채지 못하게 된다.
조엘 스폴스키는 "당신이 쉽고 재미있는 명세서를 작성하여 보여줬다고 당신을 얕잡아 보는 회사에서 일한다면, 다른 회사를 찾아보는게 좋을 것이다"라고 충고했다.

조엘, 당신은 대한민국을 모르는군요.. 대한민국은 스펙을 작성하는 사람을 시간을 축내는 사람, 머리가 나빠서 저렇게 정리하느라 시간을 다 써버리는 사람으로 취급한답니다. 젠장할 쉽고 재밌는 명세서를 보여줄 기회가 없기 때문에 우리 회사가 그런 명세서를 얕잡아 보는지 알수가 없다구요..

쉽고 재밌는 명세서(기능명세일 경우엔 특히나 더욱)를 작성할때는 적절히 예를 들어가면서 소프트웨어의 행동을 모두 보여주는 것이 좋다.
어떤 입력에 대해 어떻게 행동할 것인지를 고객과 함께 협의해 나가야 한다.
다이얼로그 박스에 붙어있는 버튼을 클릭하면 어떤 일이 일어날지를 협의해야 한다. 스펙이 구체화 되어 갈수록 다이얼로그박스에 로고를 넣을 것인지, 버튼을 가로로 배치할 것인지 세로로 배치할 것인지, 버튼의 크기는 얼마나 되어야 할지도 여러가지 안을 고객에게 보여주며 고르던지 더 좋은 제안을 하도록 유도해야 한다.

DVD대여 프로그램을 발주하는 DVD대여점 사장님은, 자기 점포의 고객 명단(주의! 우리 고객이 아니다, 우리 고객의 고객이다)을 가장 소중하게생각할 것이다. 사장님이 생각하는 가장 중요한 고객의 정보를 눈에 띄게 배치해서 맘에 드는지 물어봐야 한다. DVD대여점 고객의 취향을 대여 패턴으로 분석이 가능하도록 모든 DVD타이틀의 정보를 어떻게 입력하고 관리할지도 알려 주어야 한다. 사용법이 어렵다고 하면 쉽게 고쳐줘야 한다. 그런 정보를 관리하려 하는게 아니라고 하면 로직을 수정해 줘야 한다.

우리회사에 참 상대하기 힘든 DVD가게 사장님-_-이 있다.
"대여프로그램 만들어줄꺼죠?"
이 한마디 던져놓고 몇달동안 자기 일 하느라 관심도 없이 지내더니 요즘 부쩍 이래가지고 DVD대여를 어떻게 하냐고 땡깡이다. 그러면서 언제까지 되겠냐고 다짜고짜 들이댄다. 마치 내가 프로그램을 잘못 만들고 있으면서 태평하게 놀았기 때문에 자기가 지금 장사를 할수 없다는 식이다. 어쩌라구..
내배를 째던지..
우리 사장님한테 말해서 날 짜르던지..

에효.. 길어졌다.
내일 또 써야지..


덧. 써놓고 보니 내 사상은 확실히 "실용주의 프로그래머"와 "XP", "조엘의 블로그"의 영향을 심하게 받은거 같다;;;;

덧. 혹시 있을지도 모르는, 이 다음 과정이 궁금한 방문객을 위한 링크^^;;;
Creative Commons License
posted by 루미넌스
2006/10/28 15:51 각종잡기
맨날 손에 잡기만 하고 끝가지 읽지는 못했던 책..
왠지 끝까지 가지 못했던 책..
내 책이 아니라서 그랬나..

2006년 10월 27일이 되어서야 내 이름 도장을 쿡~ 찍은 조엘온소프트웨어를 다시 잡았다.

- 2006. 10. 27 22:33

"이 책 내용 대부분은 제 웹 사이트인 조엘 온 소프트웨어에 올라온 가시 시리즈에 먼저 등장했습니다. 이 블로그는 지난 몇년에 걸쳐 제 생각을 기록해온 장소입니다. 당신이 손에 쥐고 있는 이 책은 웹사이트보다는 대단히 체계적인 구성 방식을 따르고 있습니다. 여기서 체계가 의미하는 바는 '감전사 없이 욕조에서 읽을 수 있다'는 뜻입니다."
-서문 중에서

Creative Commons License
posted by 루미넌스
prev 1 2 next