2010-02-16

프로세스 그 시작 - 스크럼

이름은 들어봤다 수준에서 아주 조금... 몇 발자국만(이나) 앞으로 나간 느낌이다.

Agile 열풍이 휘몰아 치던 시절에 조금 들어 본 스크럼을 우리가 일하는 방법 가운데에 놓았다.

3명이지만 프로세스는 필요하다고 판단했다. CMM Level 5를 준수하는 프로세스는 우리가 지구에서 가장 큰 소프트웨어 회사가 되면(구글과 MS와 애플을 합친 정도) 당연히 사용할 생각이다.(물론 관심없다의 다른 표현이다)

소프트웨어 개발 뿐만 아니라 일반적인 일하는 방식을 잡아줄 필요성에 많은 Agile 방법론 중에서 스크럼을 선택했다. 실제로 회사 설립과 관련한 일들도 백로그로 관리하고 스프린트 태스크로 설정하여 처리했다. 심지어는 마우스와 원두 커피 구매까지...


스크럼을 파악하려고 여러 글들을 읽었는데 그 중 아래 글들이 도움이 되었다.


* 책은 읽지 못했고, 다른 글들은 조금 오래되었거나.. 별로 감흥이 없었다.

첫번째 글은 철학(철학은 시류를 타지 않고 오래간다)을 다루고 두번째 글은 초보자를 위한 스크럼 안내서 같은 역할을 한다.


그리고 도구를 찾았다. 포스트잇을 사용하는 건 조금 어색하고 부끄럽다.

처음에 구글 Doc 스프레드쉬트를 사용했다. Burndown 차트 표현도 가능했고 탭으로 스프린트를 나누어 관리할 수도 있어서 나쁘진 않았다.(엑셀을 생각하면 된다) 그러나 백로그를 체계적으로 관리하기가 쉽지 않았다.

구글 Doc으로는 백로그를 User Story 혹은 Use Case로 기술하기가 쉽지 않다.


스프린트 2까지는 구글 Doc을 사용하다 스프린트 3 중간에 Rally로 전환했는데(이 역시 미리 정해놓은 태스크였다) 스프린트 3 종료와 함께 다시 구글 Doc으로 돌아갔다.

선무당이 Rally를 잡은 격이나... Rally 좋지 않다.


다음은 스프린트 1 Burndown 차트이다.

2주 혹은 4주가 아닌 업무일 기준으로 10일을 스프린트 기간으로 잡았다. 하루 실제 업무 가능한 시간을 5시간으로 정했으니 3명이 한 스프린트에서 사용할 수 있는 시간은 150 시간이다. 하지만 아직 완전한 셋업이 되지 않아 100시간 조금 넘는 규모로 스프린트 태스크를 구성했다.


지금까지 적용 과정에서 얻은 스크럼에 대한 생각은 긍정적이다.

  • 길을 잃지 않게 해준다.
  • 프로세스 자체에 소요되는 시간이 부담이 되지 않는다.(구글 Doc과 Rally를 왔다 갔다 하면서 낭비한 시간을 제외하면)

반면 좀 어렵게 다가오는 점은 백로그에 대한 관리이다. Uncle Bob 지적처럼...

  • 어떻게 백로그를 체계적(계층적)으로 관리할 수 있을까?
  • 백로그와 스프린트 태스크 간의 상관 관계는?
  • 특정 스프린트에서 완료하지 못한 태스크를 어떻게 처리해야 하는가?


(저렴하면서) 구미에 맞는 도구가 없다는 것이 아쉽다. 시간이 나면 스크럼 도구도 고민해봐야겠다.

2010-02-12

에어론 체어(Aeron Chair)... 듀오백

조엘 블로그에서 처음 알았다. 죽이는 의자라는 걸...

에어론 체어

[출처: 여기]


사업을 시작하면서 하나 갖고 싶었다. 물론 내가 갖는다는 건 모두가 갖는 다는 뜻이다. 세명 뿐이다.


Guy KawasakiThe Art of the Start에서 폼(Form)이 아닌 기능(Function)이 중요하다며 에어론 체어를 폼의 대명사로 다루었지만...어쩌면 그가 개발자는 아니었기 때문일거다(물론 내 주관적인 생각).


꽤나 자주 목이 뻐근하고... 큰 무게를 짊어진 것 같은 느낌에 정형 외과에서 물리 치료를 받은 적도 많아 더욱 탐이 났다.


그러나 구매한 건 듀오백 Alpha-100M


[출처: 듀오백 사이트]

얼마나 좋은지는 모르겠다. 에어론 체어를 써보지 않았으니...

NHN이 돈이 많다는 걸 증명한 의자에 대한 자세한 이야기는...


사람들은 다양한 생각들을 가진다.

2010-02-11

좋은 소프트웨어

사업을 시작한 후에 때때로 엄습해오는 불확실성을 억누를 때 기대는 명제가 있다.

좋은(Good) 소프트웨어는 팔린다.


조엘이 블로그에 쓴 다음(Headcount) 글이 이 명제가 참 일 가능성을 한번 더 증명한다.


그렇다면 좋은 소프트웨어는?

  • 사용자가 쓰기에 적절하다. 기능과 성능 측면을 모두 고려해서...
  • 유지보수를 포한한 개발 비용이 감당 가능하다.

결국 둘이 아니라 하나다.

적은 비용을 투자해서 개발한 쓸만한 소프트웨어


물론 구글이나 애플이나 마이크로소프트라면 이렇게 보겠지만...

뻑가는 죽이는 거... 돈 걱정은 하지 말고


불행하게도 혹은 다행하게도 난 구글을 위해 일하지 않는다.

돈을 왕창 쓰는 거야 자신 있지만... 뻑가는 걸 만들 재주는 없다. 돈으로 뻑 가는 걸 만드는 건 아니다. 삼성을 보라구...


어찌되었든 두번째 조건은 만족하면서 망망대해를 향해 항해를 시작했다.

개발자는 둘이다. 쓸만한 노트북, 모니터, 책상, 좋은 의자... 기타 등등을 사는데 소요한 비용도 이전 회사에서 받은 월급에 한참 못 미친다. (일인 기준으로)


그럼 좋은 소프트웨어를 만들 확률은 벌써 50%...

좋은 소프트웨어를 만들면 성공할 확률은 80%... (그렇다 치자^^)


그럼 성공할 확률은 이미 40%... 수학보다 산수가 좋다. 믿거나 말거나...

2010-02-01

CRACKING THE OYSTER

Jon Bentley가 쓴 Programming Pearls 1장. CRACKING THE OYSTER를 정리한 글이다.

제시된 문제는 다음과 같다.

n(최대 10,000,000 개 이하)개의 0보다 큰 정수로 이루어진 파일이 있다. 동일한 값은 존재하지 않으며, 정수 이외의 데이터는 없다.

이 파일에 있는 정수들을 어떻게 정렬할 수 있을까?

  • 메모리는 최대 1 MB까지만 사용할 수 있다.
  • 하드 디스크는 충분히 사용할 수 있다.
  • 몇 분안에 실행이 완료되어야 한다.


디스크를 이용한 Merge Sort

Merge Sort는 다음을 참고한다. 이 문제를 해결하는데 적합한 알고리즘은 아니다.


Multipass Sort

정수를 7 바이트로 표시하면 1 MB 메모리에 약 143,000 개의 정수를 올려 놓을 수 있다.

1024 * 1024 / 7 = 약 149,796

정수를 32 비트로 표시하면 1 MB 메모리에 약 250,000 개의 정수를 올려 놓을 수 있다.

1024 * 1024 / (32 / 8) = 약 262,144

이 정보를 기초로 파일을 여러번 읽어 문제를 해결할 수 있다.

첫번째 읽을 때는 0에서 249,999 사이 정수만을 메모리에 올려 놓은 후에 정렬을 하여 결과를 파일에 쓴다. 이렇게 반복적으로 마지막에는 9,750,000에서 9,999,999 사이 정수만을 대상으로 이 작업을 수행한다.

반복적으로 40 차례 파일을 일으면 모든 정수를 정렬할 수 있다.

10,000,000 / 250,000 = 40


비트맵을 이용한 처리

정수 이외의 데이터는 없고, 중복된 값이 없다는 전제 조건을 이용하면 간단하게 비트맵으로 문제를 해결할 수 있다.

즉, 크기가 10,000,000인 비트 배열을 만들어서 특정 정수가 존재하면 다음과 같이 처리한다. 예를 들어, 13,223가 존재하면 다음과 같이 한다.

bit[13223] = 1;

* 1 MB 이상 메모리가 필요하다. 1 MB가 엄격한 제한 조건이라면 Twopass Sort와 함께 사용한다.


가상 코드는 다음과 같다.

/* phase 1: initialize set to empty */
for i = [0, n)
  bit[i] = 0
/* phase 2: insert present elements into the set */
for each i in the input file
  bit[i] = 1
/* phase 3: write sorted output */
for i = [0, n)
  if bit[i] == 1
    write i on the output file



비트맵을 이용한 해결 방법은 범용적이지는 않다. 즉 특정 문제를 해결하는데 적합하다. 그런데 특정 문제를 해결하는데는 탁월한 방법이다. 

문제를 해결하는데 가장 중요한 것은 문제를 이해하고 정의하는 것이다.
Careful analysis of a small problem can sometimes yield tremendous practical benefits.