- 소프트웨어 프로젝트 일정이 지연된다고하여 개발 사업말기에 인력을 추가로 배치하는 것은 개발 사업을 더욱 지연시키는 결과를 초래한다.
브룩스의 법칙(Brooks' law)은 프레더릭 브룩스가 자신의 1975년 저서 《인월미신》 (The Mythical Man-Month)에서
"지체되는 개발 프로젝트에 인력을 더하는 것은 개발을 늦출 뿐이다"
라고 주장한 법칙이다. 브9룩스는 "임산부가 아무리 많아도, 아이를 낳는 데에는 9개월이 걸린다"라고 자신의 주장을 비유적으로 표현했다. 이 브룩스 법칙이 자주 인용되지만, 《인월미신》에 이 주장 바로 위에 써 있던 "극도로 단순화해서 말하면"이란 구문을 생략되어 본뜻이 왜곡되어 전해지기도 한다.
오해 브룩스 법칙에 대한 가장 흔한 오해는 뛰어난 프로그래머와 일반적인 프로그래머 개인의 능력이 차이가 많이 나기 때문에, 고액의 임금을 받는 매우 뛰어난 소수의 프로그래머를 이용하는 것이 평범한 능력을 가진 다수의 프로그래머를 고용하는 것보다 생산성이 높다는 것이다. 그러나 브룩스 법칙이 적정선 이하의 극소수의 프로그래머만을 프로젝트에 투입하더라도 개발을 빨리 끝낼 수 있다고 말하는 것은 아니다.
해결책 브룩스 법칙에서 언급된 문제를 피해가기 위해서는 문제 전체를 소규모의 그룹이 맡을 수 있는 조각으로 나누고, 상급 팀이 시스템 통합을 맡는 것이다. 그렇지만 이 또한 문제를 나누는 과정이 정확하지 않으면 팀 간의 의사소통 비용이 늘어나게 되어 문제를 더 크게 만들 수 있다는 단점이 있다.
여타 분야에의 적용 브룩스의 법칙은 달성하고자 하는 일의 속성에 따라 그 적용 가능성이 극명하게 달라진다. 예를 들어 늦어진 건설 계획에서 덤프트럭을 더 투입한다고 해서 부가적으로 계획이 지체거나 하지 않는다. 이는 일의 속성상 누구나 최소한의 기술과 트럭만 갖고 있다면 업무를 바로 처리할 수 있고, 트럭 운전사들끼리 의논을 해 가며 일을 할 필요 또한 적기 때문이다.
반면 소프트웨어 개발과 같은 디자인 작업에서는 새로 투입된 인력은 프로젝트에 대해 기본적인 방향이나 방법, 이미 진행된 작업에 대한 교육이 선행되어야만 프로젝트에 도움이 될 수 있다.
260쪽 / 판형 : A5 / 1판
출간일 : 2008년 10월 6일
ISBN-13 : 978-89-91268-47-0
책소개 스크럼의 대부인 켄 슈와버가 쓴 <<스크럼>>은 소프트웨어 시스템 개발 프로젝트에서 기술과 프로세스를 관리/운영하는 실천 방법 중 높은 생산성을 검증받은 스크럼의 기본적인 이론들을 소개하고 있습니다. 특히, 어떻게 스크럼 팀을 조직하여 일일 스크럼 회의와 스크럼 프로젝트 계획을 하는지와 스크럼을 이용한 백로그 추적과 프로젝트 완료 등을 어떻게 해야 하는지 등에 관한 스크럼의 실천법이 저자들의 20년간의 다양한 경험 사례를 통해 이해할 수 있게 설명되어 있습니다.
“스크럼은 다르다”
애자일 소프트웨어 개발 방법론이 유연한 소프트웨어 시스템의 미래를 여는 열쇠라고 말한다면, 스크럼은 급변하는 비즈니스 환경에서 소프트웨어 개발과 관리를 가장 효과적으로 해내는 전위대라고 말할 수 있을 것입니다. 이 책에는 기존의 것들을 단순히 우려먹는 그렇고 그런 방법론이 아니라 수십 년 간의 경험을 통해 얻은 저자들의 철학과 이론, 그리고 실천법들이 다양하고 심층적인 사례와 함께 온전히 담겨 있습니다.
“스크럼은 불편하다”
스크럼은 외견상 간단하게 보이는 방법론이지만 우아한 기술과 헌신적인 실천을 요구합니다. 그러니 적용하자마자 잠재되어 있는 문제점들이 폭로되어 이러저러하게 조직의 쓴맛을 보게 됩니다. 그래서 스크럼은 불편합니다. 허나 성공하는 프로젝트를 만끽하려면 넘어야 할 산입니다. 신뢰와 헌신, 믿음과 용기, 개방과 공유라는 스크럼의 가치를 통해 그 ‘불편’을 돌파해 보십시오.
“스크럼은 통한다”
소프트웨어 개발은 항상 새로운 제품을 만드는 창조적인 행위입니다. 이러한 새로운 제품을 개발하는 과정에서 넓고 깊은 연구와 창발적인 활동은 두말하면 잔소리죠. 그러려면 새로운 지식을 창출하고 스스로 자기 조직화를 잘 할 수 있는 관점과 실천이 필요합니다. 스크럼은 소프트웨어 개발의 패러다임을 바꾸는 새로운 세계관을 보여줍니다. 이 책에서 스크럼의 세계관을 투영한 소프트웨어 개발의 다양한 관점을 - 시스템 역학적, 인류학적, 복잡계 과학적, 정신분석적, 패러다임 전환적 관점 등 - 확인하십시오. 왜 스크럼은 통하는지 바로 알아챌 것입니다.
그밖에 이 책을 통해 스크럼을 바로 사용할 수 있는데 그 덤으로 이런 것을 얻습니다.
1. 기존에 실행되고 있는 엔지니어링 실천방법과는 상관없이 소프트웨어 개발에 스크럼을 바로 적용시킬 수 있다.
FOR 회돌이가 회돌이 구조의 유일한 유형은 아닙니다. FOR 회돌이는 수행하고 싶은 반복의 횟수를 미리 알아야 하기 때문에 즉, 미리 계산할 수 있을 경우에 딱 맞습니다. 그래서 무슨 일이 일어날 때까지 특정한 과업을 계속하고 싶지만 그 때가 언제가 될지 모른다면 무슨 일이 일어나는가? 예를 들어, 파일로부터 데이터를 읽어 처리하고 싶습니다. 그러나 얼마나 많은 데이터 항목이 파일에 들어 있는지 미리 알지 못합니다. 파일의 끝에 이를 때까지 그냥 계속해서 데이터를 처리하고 싶습니다. FOR 회돌이에서 가능하지만 어렵습니다.
이 문제를 해결하기 위하여 도다른 유형의 회돌이가 있습니다: WHILE 회돌이가 그것입니다.
먼저 j를 1로 초기화하고, while 회돌이의 제어 변수를 초기화하는 일은 아주 중요한 단계입니다. 이를 빼먹으면 에러가 자주 야기됩니다.
다음으로 while 서술문 자체를 실행합니다. 이는 불리언 표현식으로 평가됩니다.
결과가 True이면 다음에 따라오는 들여쓰기 블록을 실행합니다. 예제에서 j는 12 미만이므로 블록 안에 들어갑니다.
print 서술문을 실행하여 곱셈표의 첫 줄을 출력합니다.
다음 줄은 제어 변수 j를 증가시킵니다. 이 경우 가장 마지막에 들여쓰기된 줄로서, while 블록의 끝을 의미합니다.
다시 while 서술문으로 되돌아가 새로운 j 값을 가지고 4-6 단계를 반복합니다.
이 행위를 j가 13에 도달할 때까지 계속해서 반복합니다.
그 시점에서 while 테스트가 False를 돌려줍니다. 들여쓰기 블록을 건너뛰고 while 서술문과 들여쓰기가 같은 다음 줄로 갑니다.
이 경우 다른 줄이 없으므로 프로그램이 끝납니다.
지금까지 눈에 보이는 그대로 이해되셨으리라 믿습니다. 단 한가지 지적하고 싶다면 - 위의 while (그리고 for) 줄 끝에 쌍점(:)이 보이십니까? 그를 보고 파이썬은 다음에 일단의 코드(블록)이 온다는 것을 압니다. 잠시 후에 보시겠지만, 다른 언어들은 자신만의 방법으로 인터프리터에게 줄을 함께 무리짓도록 알려줍니다. 파이썬은 쌍점과 들여쓰기를 조합해 사용합니다.
파이썬의 for 회돌이는 연속열을 반복합니다. 혹 잊으셨다면 파이썬에서 연속열은 문자열이나 리스트 또는 터플입니다. 그래서 그런 연속열에 작동하는 for 회돌이를 작성할 수 있습니다. for 회돌이를 사용하여 'word'라는 문자열에서 철자를 하나씩 인쇄해 봅시다.:
>>> for c in 'word': print c
...
기호가 한 줄에 하나씩 인쇄되는 것에 주목하세요. 또 회돌이 몸체가 단 한 줄로 구성되어 있어서 같은 줄, 쌍점(:) 다음에 추가할 수 있는 것에도 주목하세요. 쌍점은 파이썬에게 다음에는 코드 블록이 온다고 알려줍니다.
터플을 회돌이 할 수도 있습니다:
>>> for word in ('one','word', 'after', 'another'): print word
...
이 번에는 한 줄에 단어 하나씩을 얻습니다. 물론 그 모두를 한 줄에 인쇄할 수도 있습니다. print 서술문 뒤에 쉼표를 하나 두면 파이썬이 새줄문자를 인쇄하지 못하도록 막기 때문에 다음 print 서술문은 바로 앞 서술문이 떠났던 그 곳에서 다시 시작합니다.
>>> for word in ('one', 'word', 'after', 'another'): print word,
...
이제는 단어들이 한 줄에 보입니까?
(range()는 리스트를 만들어 내므로) 이미 리스트에 적용되는 for 회돌이를 보았지만 완벽을 기하기 위하여 명시적으로 해 보겠습니다:
>>> for item in ['one', 2, 'three']: print item
...
이와 같이 foreach 스타일의 회돌이를 사용할 때 한 가지 약점이 있습니다. 회돌이는 집단에 있던 원소들이 담긴 사본을 돌려주기 때문에, 그 집단의 내용물을 직접 수정할 수는 없습니다. 그래서 집단을 수정할 필요가 있다면 다음과 같이 집단의 지표가 관련된 좀 어색한 해결책을 사용해야 합니다:
myList = [1,2,3,4]
for index in range(len(myList)):
myList[index] += 1
print myList
myList의 각 항목이 1씩 늘어납니다. 지표 트릭을 사용하지 않았다면 복사된 항목만 증가시킬 뿐이지 원래 리스트는 바뀌지 않았을 것입니다.
이 예제에서 처음으로 파이썬 상호대화 프롬프트(>>>)를 사용하지 않았습니다. 그래서 이것을 연속열 심화연구 주제에서 기술한 대로 파일에 타자해 넣을 필요가 있습니다. >>> 프롬프트에서 타자해 보려면 빈 줄을 더 추가해서 파이썬에게 블록이 끝났음을 알려주어야 합니다. 예를 들어 myList = 뒤에서 말입니다. 실제로 블록이 시작되고 멈추는 곳을 배우는 아주 좋은 방법입니다; 코드를 타자해 넣고 줄이 더 필요한 곳을 올바로 추측했는지 알아보세요. 바로 들여쓰기가 바뀌는 곳이 그곳입니다!
회돌이에 대하여 다른 함정은 반복 중인 집단 안에서 항목을 지우면 안된다는 것입니다. 그렇지 않으면 회돌이는 혼란을 일으킵니다. 마치 그 위에 올라서서 나무의 가지를 쳐내는 예전 만화 주인공처럼 말입니다! 이런 상황을 다루는 가장 좋은 방법은 다른 종류의 회돌이를 사용하는 것입니다. 이런 회돌이는 다음 섹션에서 연구해 보겠습니다. 그렇지만 원소를 안전하게 제거하는 법을 이해하려면 분기라는 또다른 주제를 다룰 때까지 기다릴 필요가 있습니다. 그래서 이 주제는 그 즈음에 다다르면 설명드리겠습니다.
프로그래밍 언어에게 변수를 교체시켜서 반복할 때마다 값이 증가되도록 해 보겠습니다. 파이썬으로 다음과 같이 보입니다:
>>>for i in range(1,13):
... print "%d x 12 = %d" % (i, i*12)
...
고지 1: range(1,13)으로 13을 지정할 필요가 있는데 range() 함수는 앞 숫자에서부터 두 번째 숫자 미만까지 만들어내기 때문입니다. 처음보면 약간 괴이하게 보이지만 거기에는 이유가 있으며 곧 익숙해질 것입니다.
고지 2: 파이썬에서 for 연산자는 실제로 foreach 연산자입니다. 한 집단의 각 원소에 코드를 적용한다는 점에서 말입니다. 이 경우 집단은 range()가 생성한 숫자로 구성된 연속열입니다. 파이썬 프롬프트에서 print range(1,13)를 타자해서 무엇이 인쇄되는지 보면 증명할 수 있습니다.
고지 3: print 줄은 들여쓰기(indented) 되어 있습니다. 다시 말해 위의 for 줄보다 더 안으로 공간이 들어가 있습니다. 파이썬에게 print가 반복할 부분이라는 것을 알리는데 아주 중요한 요점입니다. 여러 줄이 안으로 들여쓰기 되어도 좋습니다. 파이썬은 집단의 매 원소마다 들여쓰기된 그 모든 줄을 반복할 것입니다. 또한, 얼마를 들여쓰기 하든 신경쓰지 않습니다. 일관성만 있으면 됩니다.
고지 4: 상호대화 인터프리터에서 리턴키를 두 번 눌러야 프로그램을 실행시킬 수 있습니다. 그 이유는 파이썬 인터프리터가 첫 리턴키만으로는 회돌이 코드 뒤에 추가해야 할 또다른 줄인지 아닌지 구별하지 못하기 때문입니다. 두 번째로 엔터키를 치면 파이썬은 코드가 끝났다고 간주하고 프로그램을 실행시킵니다.
그래서 어떻게 프로그램은 작동하는가? 단계별로 알아 봅시다.
무엇보다, 파이썬은 range 함수를 사용하여 1에서 12까지의 숫자 리스트를 만듭니다.
다음으로 파이썬은 i를 리스트의 첫 값과 똑 같이 만듭니다. 이 경우 1이군요. 다음으로 값 i = 1을 사용하여 들여쓰기된 코드를 실행합니다:
print "%d x 12 = %d" % (1, 1*12)
다음으로 파이썬은 다시 for 줄로 되돌아가 i에 리스트의 다음 값을 설정하는데, 이번에는 2이군요. 다시 들여쓰기된 코드를 실행합니다. 이번에는 i = 2를 사용합니다:
print "%d x 12 = %d" % (2, 2*12)
i에 리스트의 모든 값이 할당될 때까지 계속해서 이렇게 반복합니다. 그 지점에 이르면 들여쓰기 되지 않은 다음 명령어로 갑니다. 실제로 - 이 경우 더 이상 명령어가 없으므로 프로그램이 끝납니다.
이제 다음 몇 장에 걸쳐서 개발할 프로그래밍 연습 문제를 소개하겠습니다. 새로 테크닉을 배워감에 따라서 그 해결책을 점차 개선해 보겠습니다.
삼중 따옴표 안에 싸 넣으면 긴 문자열을 타자할 수 있다는 사실을 기억하십니까? 삼중 따옴표를 사용하여 곱셈표를 구성해 봅시다:
>>> s = """
1 x 12 = %d
2 x 12 = %d
3 x 12 = %d
4 x 12 = %d
""" # 주의하라 - 문자열 안에 주석을 넣을 수 없다
>>> # 문자열의 일부가 되어 버린다!
>>> print s % (12, 2*12, 3*12, 4*12)
미가공 재료 주제에서 변수의 개념을 소개하였습니다. 거기에서 변수란 미래에 참조하기 위하여 데이터에 표식을 붙여둔 라벨이라고 말씀 드렸습니다. 다양한 리스트와 주소록 예제에서 변수를 사용하는 예제도 몇 가지 보았습니다. 그렇지만 변수는 근본적으로 프로그래밍에서 중요합니다. 그래서 새로운 것을 더 배우기 전에 어떻게 변수를 사용하는지 짧게 요약해 보고 싶습니다.
이제 IDLE 또는 도스(또는 유닉스) 명령어 창의 파이썬 프롬프트(>>>)에서, 다음을 타자해 보세요:
>>> v = 7
>>> w = 18
>>> x = v + w # 변수를 계산에 이용한다
>>> print x
여기에서는 변수를 ( v, w, x ) 만들고 그 변수를 조작하고 있습니다. 마치 휴대용 계산기의 M 버튼을 이용하여 결과를 저장해 두었다가 나중에 사용하는 것과 비슷합니다.
형식화 문자열을 이용하여 그 결과를 인쇄하면 더 예쁘게 만들 수 있습니다:
>>> print "The sum of %d and %d is: %d" % (v,w,x)
형식화 문자열의 장점은 변수에도 저장할 수 있다는 것입니다:
>>> s = "The sum of %d and %d is: %d"
>>> print s % (v,w,x) # 다른 값으로 똑 같은 출력을 인쇄할 때 유용하다
이렇게 하면 print 서술문이 훨씬 더 짧아집니다. 특히 값이 많을 때 그렇습니다. 그렇지만 또한 그 만큼 난해해지기 때문에 어느 것을 선택할지는 스스로 판단하셔야 합니다. 저장된 포맷 값보다 아주 긴 줄이 더 읽기 편한지 아닌지 스스로 결정해야 합니다. 여기에서 한 것 같이 print 서술문 옆에 형식화 문자열을 두더라도 그렇게 나쁘지 않습니다. 마지막으로 도움이 될만한 것 하나는 사용 용도를 설명하도록 변수 이름을 짓는 것입니다. 예를 들어 형식화 문자열 s를 호출하는 대신 본인은 sumFormat으로 호출할 수도 있었습니다. 그래서 코드는 다음과 같이 보입니다:
>>> sumFormat = "The sum of %d and %d is: %d"
>>> print sumFormat % (v,w,x) # 값은 다르고 출력은 같을 때 유용하다
이제, 프로그램에서 여러 다양한 형식화 문자열이 있으면 어느 포맷을 인쇄할지 더 쉽게 알려줄 수 있습니다. 의미를 붙여 이름을 짓는 것이 언제나 좋은 생각이며 가능하면 본인도 의미있게 이름을 짓도록 노력하겠습니다. 아직까지는 변수가 많은 의미를 담을 만큼은 아닙니다!