260쪽 / 판형 : A5 / 1판
출간일 : 2008년 10월 6일
ISBN-13 : 978-89-91268-47-0
책소개 스크럼의 대부인 켄 슈와버가 쓴 <<스크럼>>은 소프트웨어 시스템 개발 프로젝트에서 기술과 프로세스를 관리/운영하는 실천 방법 중 높은 생산성을 검증받은 스크럼의 기본적인 이론들을 소개하고 있습니다. 특히, 어떻게 스크럼 팀을 조직하여 일일 스크럼 회의와 스크럼 프로젝트 계획을 하는지와 스크럼을 이용한 백로그 추적과 프로젝트 완료 등을 어떻게 해야 하는지 등에 관한 스크럼의 실천법이 저자들의 20년간의 다양한 경험 사례를 통해 이해할 수 있게 설명되어 있습니다.
“스크럼은 다르다”
애자일 소프트웨어 개발 방법론이 유연한 소프트웨어 시스템의 미래를 여는 열쇠라고 말한다면, 스크럼은 급변하는 비즈니스 환경에서 소프트웨어 개발과 관리를 가장 효과적으로 해내는 전위대라고 말할 수 있을 것입니다. 이 책에는 기존의 것들을 단순히 우려먹는 그렇고 그런 방법론이 아니라 수십 년 간의 경험을 통해 얻은 저자들의 철학과 이론, 그리고 실천법들이 다양하고 심층적인 사례와 함께 온전히 담겨 있습니다.
“스크럼은 불편하다”
스크럼은 외견상 간단하게 보이는 방법론이지만 우아한 기술과 헌신적인 실천을 요구합니다. 그러니 적용하자마자 잠재되어 있는 문제점들이 폭로되어 이러저러하게 조직의 쓴맛을 보게 됩니다. 그래서 스크럼은 불편합니다. 허나 성공하는 프로젝트를 만끽하려면 넘어야 할 산입니다. 신뢰와 헌신, 믿음과 용기, 개방과 공유라는 스크럼의 가치를 통해 그 ‘불편’을 돌파해 보십시오.
“스크럼은 통한다”
소프트웨어 개발은 항상 새로운 제품을 만드는 창조적인 행위입니다. 이러한 새로운 제품을 개발하는 과정에서 넓고 깊은 연구와 창발적인 활동은 두말하면 잔소리죠. 그러려면 새로운 지식을 창출하고 스스로 자기 조직화를 잘 할 수 있는 관점과 실천이 필요합니다. 스크럼은 소프트웨어 개발의 패러다임을 바꾸는 새로운 세계관을 보여줍니다. 이 책에서 스크럼의 세계관을 투영한 소프트웨어 개발의 다양한 관점을 - 시스템 역학적, 인류학적, 복잡계 과학적, 정신분석적, 패러다임 전환적 관점 등 - 확인하십시오. 왜 스크럼은 통하는지 바로 알아챌 것입니다.
그밖에 이 책을 통해 스크럼을 바로 사용할 수 있는데 그 덤으로 이런 것을 얻습니다.
1. 기존에 실행되고 있는 엔지니어링 실천방법과는 상관없이 소프트웨어 개발에 스크럼을 바로 적용시킬 수 있다.
날마다 새로워진다면 우리는 얼마나 발전할 수 있을까?
끊임없이 노력하면 어느 순간 한단계 발전한다는 점은 불변의 진리다.
내가 닮고 싶어하는 사람들은 하나같이 지독하다 싶을 정도로 끊임없이 노력한다.
꾸준히 노력하기 위해서는 구체적인 목표를 세우고 매일 실천하는 것이 중요하다.
하나, 일신우일신(日新又日新)하기 위해 구체적으로 꾸준히 하는 것을 만들어라.
- 날마다 새로워지려면.
최근 들어 대립하지 않으려는 의지는 균형감을 자꾸 생각하게 한다.
합리적인 판단과 조화로운 결정 사이에는 많이 차이기 있지만
여기서 그것에 대해 긴 이야기를 늘어놓고 싶지는 않다.
최근 몇 차례 한 가지 기술적 이슈에 대해 자문 요청을 받았다.
자문을 할 수록 내가 정말 하고 싶은 말은
'나는 A라는 툴을 싫어한다.'에 가깝다는 것을 알았다.
(물론, 최대한 완곡하게 이야기 하면서, 내면에서는 그렇게 말하려는 욕구를 달래고 있다.)
기술과 툴 자체에 대해 공부하는 위치에 서면
스스로 세운 어떤 기준에 부합하지 못하는 기술/툴에 대해서는 비판적이 될 수 밖에 없다.
그것이 나를 위한 항변이지만...
반대 편으로 돌아서보자.
A가 아니라면 대체할 수 있는 뭔가가 있어야 한다.
사실 A에 완전한 비교 우위를 점하는 어떤 툴을 써보지 않은 이상
다른 어떤 툴도 지지하기는 힘들다.
또한, A라는 툴을 공급하는 업체와 그 직원들까지 생각하면 더 신중하게 발언해야 하기에
섣불리 A가 나쁘다라고 말할 수도 없다.
이런 류의 자문은 대개 급작스러운 순간에 구두로 물어오는 경우가 많아
말을 하면서 판단도 해야 한다.
여기서 최선 안은 무엇일까?
몇 차례 이런 경우를 겪으면서 내가 도출한 몇 가지는 아래와 같다.
1. 직접 해보지 않은 단순한 느낌이나 어디선가 들은 얘기는 언급하지 않는다.
모호한 지식을 풀어놓다 보면 스스로의 선호가 개입되기 쉽고
자칫 별 근거도 없는 주관적인 의견을 내놓을 수 있다.
2. 가능한 구체적으로 언급한다.
자문을 받는 의뢰인은 몰라서 묻는 것이다. 따라서, 오해의 소지가 존재한다.
구체적일수록 오해의 폭은 작고
추상적일수록 오해의 폭은 크다.
3. 차분하게 발언의 폭을 조절하여 리듬을 유지하라.
혹시 상대가 조급하여 질문 공세를 하게 되면
호흡 조절없이 정신없이 답변할 수 있다.
이렇게 되면 여유를 잃어 충분히 생각하면서 발언할 기회를 놓친다.
답변 와중에 한번 쯤 웃을 수 있는 여유를 갖을 수 있다면
분명 더 진솔한 답을 낼 수 있다.
스승을 찾는 방법 - http://younghoe.info/219
스승을 찾는 방법 2nd Edition - http://younghoe.info/599
스승을 찾는 방법
가끔 사람들은 이렇게 묻곤 한다.
'그런 것들은 누구한테 배웠어요?'
누구한테 배웠는지 확실하지 않다.
보고 배운 것이라고 해도
경험을 통해 내 것으로 만들기 전에는 '배운 것'이라고 할 수 없다.
그것은 마치 수학 공식을 다 외워도 문제를 풀지 못하는 것과 같은 이치다.
예전에는 나의 식견을 훨씬 뛰어넘는 사람에게 배움을 얻게 되면
입에 침이 마르도록 그를 칭송했다.
그 즈음에는 내 것으로 만든 것은 아무 것도 없었다.
결국 배운 것이 없었다. 마치 TV의 등장 인물 대하듯... 주변의 스승을 대한 것이다.
최근에 쭉쭉빵빵 여자분 외에 뵙고 싶은 분이 있다. ^^
모처에서 프로젝트를 진행할 때
본인의 사고 틀에 맞춰서 작업을 하게 하여
주변 사람들에게 고통을 맛보게 한 분이다.
당시 회식 뒷풀이나 티타임/흡연시간에 단연 화제의 주인공으로 회자되던 분인데...
나는 그 분을 통해서 많이 성장했다.
만일 주변에 멘토가 없다고 아쉬워하는 분이 있다면
다시 한번 둘러보라고 얘기해주고 싶다.
스티브 잡스만이 인생의 스승이 되는 것은 아니다.
노력하면 스승을 찾는 법을 체득할 수 있다. :)
스승을 찾는 방법 2nd Edition
스승을 찾는 방법이라는 글을 쓴 적이 있다. 벌써 9개월 전의 글이다.
요즘 일터에서 또 한 사람의 스승을 만난다. (사실 여러 사람의 스승이 존재하는데 그 중에 개인적인 취향으로 한 사람을 지정하고 싶은 것이지도 모른다.)
스승의 사전적 정의가 어떤지 모르지만, 자신의 성장에 도움을 주는 사람을 스승이라고 봤을 때, 흥미롭게도 다수의 스승은 '스승'이라는 이름을 갖고 등장하지 않는다.('선생'이나 '교수'를 포함해서...)
돌아보면 내 인생에 등장한 인물 중에서 스승이라는 역할에 가장 어울리는 사람들은 선생이나 교수는 아니다. 그 인물의 모든 모습이 스승이 아니라 어떤 특징이 스승 역할을 했다.(신을 만난 것이 아닌 이상 당연한 것이리라.)
얘기가 거창해져 버렸다. 원래는 요즘 스승 역할을 해주는 특정 인물에 대해 쓰고자함이었다. 그런데 예전에 써둔 글이 생각 나서 연장선으로 정리한다.
그 분에 최근에 많은 것을 전수해주셨는데 그것을 간단히 정리해두고 싶다.
1. 자연원리에 입각한 사고, 그리고 실천
2. 지속적인 프로세스 개선(생활화)
3. 단시간에 특정 목적에만 초점을 맞춘 실행
또한, 두 가지 중요한 개념에 대해 메모해둬서 향후에 누군가와 함께 논의할 여지를 만들어둔다.
1. MECE
2. FFF
애초에 하고자 한 이야기는 위 두 단란이다.
그리고, 이왕 연작으로 글을 썼으니 결론을 지어보자. 지금 막 떠오르는 스승 진선미(?)를 두고 생각해보면 다음과 같은 공통점을 발견할 수 있다.
첫번째는 스승은 어김없이 내가 준비가 되어 있을 때 나타났고(스승을 만나려고 준비한 것은 아니다)
두번째는 그들(혹은 그들이 가진 스승으로써의 특징)은 감탄할만한 일관성을 지니고 있다는 점이다.
파일이나 문자열 내에 포함되어 있는 특별한 패턴(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합을 정규식(regular expression)이라 한다. 정규식에서의 특수 문자(special character)는 다음과 같다.
(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시
예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
(3) . (period) : 임의의 한 문자를 표시
예 : ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)
(4) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄
[]내에서 "^"이 선행되면 not을 나타냄
이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다.
여기에서 "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower,
print, space, uppper, xdigit가 있다.
이에 대한 자세한 내용은 C언어의 를 참조하면 된다.
예를 들어 [:digit:]는 [0-9]와 [:alpha:]는 [A-Za-z]와 동일하다.
이외에 [:<:]와 [:>:]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝
을 나타낸다.
예 : [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)
[Yy] (Y 또는 y)
[A-Za-z0-9] (모든 알파벳과 숫자)
[-A-Z]. ("-"(hyphen)과 모든 대문자)
[^a-z] (소문자 이외의 문자)
[^0-9] (숫자 이외의 문자)
[[:digit:]] ([0-9]와 동일)
(5) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄
예 : a{3} ('a'의 3번 반복인 aaa만 해당됨)
a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄)
a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
ab{2,3} (abb와 abbb 만 해당됨)
[0-9]{2} (두 자리 숫자)
doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
[^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당)
.{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)
(6) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열
예 : ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등)
* (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨)
.* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨)
ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등)
a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등)
doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
[A-Z].* (대문자로만 이루어진 문자열)
ike.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등)
(7) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열
예 : ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨)
ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등)
ike.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)
[A-Z]+ (대문자로만 이루어진 문자열)
(8) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
(9) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용
(10) | (bar) : or를 나타냄
예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
korea|japan|chinese (korea, japan, chinese 중 하나)
(11) \ (backslash) : 위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 '\'를 선행시켜서 사용하면됨
예 : filename\.ext ("filename.ext"를 나타냄)
[\?\[\\\]] ('?', '[', '\', ']' 중 하나)
정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함
정규식은 Unix의 대표적인 유틸리티인 vi, emacs, ed, sed, awk, grep, egrep 등에서 사용할 수 있다. 다음은 grep에서 정규식을 활용한 예를 보여 주고 있다.
(1) $ 명령어 | grep '정규식'
<= 명령어의 결과를 grep이 입력받아 정규식을 이용하여 패턴을 찾아냄
예 : $ who | grep 'hgkim' <= hgkim이라는 사용자가 login 해 있는지를 알아봄
$ ls -al | grep '^d.*' <= ls -al 의 결과 'd'로 시작하는 라인(즉 디렉토리들)
만을 출력
$ ls -al | grep '^d.*' <= ls -al 의 결과 'd'로 시작하는 라인(즉 디렉토리들)
만을 출력
$ ls -al | grep '^[^d]..x..x..x' <= 디렉토리는 제외하고("[^d]") 누구나
실행가능한 파일("..x..x..x")들 찾기
(2) $ grep '정규식' 파일이름
<= 파일을 입력받아 정규식을 이용하여 패턴을 찻아냄
예: $ grep 'telnet' /etc/inetd.conf
이외의 명령어들도 grep과 유사한 형태로 이용된다. 따라서 정규식을 잘 이용하면 유닉스의 활용이 배가 될 것이다.
PHP에서는 정규식과 관련하여 다음의 네가지 함수를 제공한다.
int ereg(string givenPattern, string givenString, array matched);
- givenString을 "string1stringAstring2stringBstring3 ... string9stringI" 로 주어져 있다고 하자. 이때 stringA, stringB, ... , stringI는 NULL 이어도 상관이 없다(즉 givenString은 "string1string2string3 ... string9" 인 경우임).
- givenString이 위와 같이 주어진 경우,
givenPattern은 "(pattern1)stringA(pattern2)stringB(pattern3) ... (pattern9)stringI"로 입력하여야 한다. 즉 pattern1, pattern2, ..., pattern9는 각각 string1, string2, ... , string9에서 찾고자하는 정규식인 것이다.
- 이때 pattern1이 string1에서 발견한 패턴은 $matched[1]에 저장되고, pattern2가 string2에서 발견한 패턴은 $matched[2]에 저장되고, ..., pattern9가 string9에서 발견한 패턴은 $matched[9]에 저장된다. PHP3의 경우 ereg에서는 최대 9개 까지의 pattern을 찾을 수 있도록 설정되어 있음에 유의하자.
- 그리고 $matched[0]에는 $matched[1]stringA$matched[2]stringB ... $matched[9]stringI가 저장된다.
- ereg가 반환하는 값은 $matched[0]에 저장된 문자열의 개수이다.
- ereg는 case sensitive
- eregi는 case insensitive
예1 :
코드 => print(ereg ("(.*)ef([abc].*)","abcdefabc",$matched));
print(" ");
while (list($a,$b)=each($matched))
if ($b)
print("$a, $b ");
결과 => 9
0, abcdefabc
1, abcd
2, abc
예2 :
코드 => print(ereg ("(.*)d(.*)e(.*)qrs(.*)","abcdefghijklmnopqrstuvwxyz",$matched));
print(" ");
while (list($a,$b)=each($matched))
if ($b)
print("$a, $b ");
결과 => 26
0, abcdefghijklmnopqrstuvwxyz
1, abc
3, fghijklmnop
4, tuvwxyz
예 3 :
코드 => $date="1999-11-17";
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs))
print("$regs[3].$regs[2].$regs[1]");
else print("Invalid date format: $date");
결과 => 17.11.1999
예 4 :
코드 => $joomin="711011-1234567";
if (ereg("([0-9]{2})([01]{1}[09]{1}[0-3]{1}[0-9]{1})-([12]{1}[0-9]{6})",$date, $regs))
print("Valid");
else print("Invalid format: $joomin");
int eregi(string givenPattern, string givenString, array matched);
- ereg의 'case insensitive' 버젼
예 :
코드 => $email="xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr";
- givenPattern이 "(패턴)"으로 묶인 문자열들을 포함하고 있으면, replacementPattern에는 이에 대응하는 "\\digit(문자열)" 형태의 문자열들을 포함하고 있어야 한다(digit는 0, 1, ... ,9 중 하나). 그리고 givenString은 "(패턴)"을 이용해 찾은 결과들을 "\\digit(문자열)"에 있는 "문자열"들로 대체하게 된다. "\\0" 는 givenString 전체에 대해 "(패턴)"의 결과를 적용할 때 이용된다.