먼저 이 패턴을 사용하게 된 계기는 api response에서 http status code처럼 result를 return하려고 하려다 보니 이 result라는 놈이 특정 에러에 따라 정해지는 것이라 메소드 이름에 내용을 정해서 파라미터를 정하면 어떨까 하고 사용하게 되었습니다.

 

Result model입니다. builder 패턴에 Success, failWithNotFoundPath같은 이름에 따라 내용이 정해지게 됩니다.

@Getter
@ToString
@Builder(builderClassName = "Builder")
public class MyResult {

    private boolean succeed;

    private String majorCode;

    private String minorCode;

    public static class Builder {

        public Builder success() {
            this.succeed = true;
            this.majorCode = "200";
            this.minorCode = "0000";
            return this;
        }

        public Builder failWithNotFoundPath() {
            this.succeed = false;
            this.majorCode = "404";
            this.minorCode = "4001";
            return this;
        }
    }
}

builder 패턴은 객체 생성에 관련된 파라미터가 많을 때 깔끔하게 생성을 해주는 장점이 있습니다. 또한 builder에 변경된 파라미터들이 세팅된 후 build()를 하는 시점에 불변하게 만들 수 있는 장점도 있습니다. 하지만 결국 이 패턴도 변경될 파라미터들이 많아지면 복잡해 지는건 마찬가지 입니다.

위의 예제는 3개밖에 안되는 파라미터지만 더 많아도 메소드 이름을 잘 지으면 숫자로 된 result code들이 사람이 읽을 수 있는 string으로 대체되는 효과가 있습니다.

 

아래는 해당 result를 test하는 코드입니다.

@Component
public class BuilderRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        MyResult myResult = MyResult.builder().failWithNotFoundPath().build();
        System.out.println(myResult.toString());
        System.out.println("Value of majorCode on failure : " + myResult.getMajorCode());

        myResult = MyResult.builder().success().build();
        System.out.println(myResult.toString());
        System.out.println("Before changed value of majorCode : " + myResult.getMajorCode());

        myResult = MyResult.builder().success().majorCode("201").build();
        System.out.println(myResult.toString());
        System.out.println("After changed value of majorCode : " + myResult.getMajorCode());
    }
}

결과는 예상하신 것과 같으실 거예요.

MyResult(succeed=false, majorCode=404, minorCode=4001)
Value of majorCode on failure : 404
MyResult(succeed=true, majorCode=200, minorCode=0000)
Before changed value of majorCode : 200
MyResult(succeed=true, majorCode=201, minorCode=0000)
After changed value of majorCode : 201

 

'Programming > Java' 카테고리의 다른 글

java print api 주의 사항  (0) 2021.01.15
왜 돈 연산에는 Floating-point type을 쓰면 안되나?  (0) 2020.06.30
JVM Garbage Collection Basic  (0) 2019.05.10
Non-blocking, Blocking  (0) 2019.03.18
Asynchronous (VS Synchronous)  (0) 2019.03.18

이 글을 쓴 Dave Bailey는 CEO coach로 유명하신 분이라고 합니다. 제목도 grate leader들의 의사소통이긴 하지만 평소에도 잘 적용할만한 내용이라 옮겨 적어 봅니다.

 

https://medium.dave-bailey.com/10-communication-techniques-used-by-great-leaders-75b18c03b3c2

 

10 Communication Patterns Used by Great Leaders

Whether you’re leading a meeting, a team, or a company, your ability to communicate can set you apart as a leader. The skill of bringing…

medium.dave-bailey.com


먼저 올바른 의사 소통은 'Choosing the right words'가 아니라 청중을 이해하고 적극적으로 듣고 사람들과 공감할 수 있어야 합니다. 지난 10년간 효과적으로 의사 소총 할 수 있는 기술을 수집해 왔고 내가 찾은 가장 유용한 skill 중 일부는 아래와 같습니다.

1. 설득하기 위해 'why'로 시작하라

팀에서 중요한 결정을 내릴 때 단순히 나의 결정을 말하고 그 결정의 이유를 설명합니다. 그런데 이렇게 이유를 나중에 말하면 팀원들은 당신의 결정을 생각한 시간을 잃어버리고 good or bad를 생각할 여유를 가지지 못합니다.

순서를 바꿔서 'why'부터 말해 보세요. 당신이 이런 결정을 하게 된 동기(motivation)인 'why'를 먼저 말한다면 팀원들도 당신이 결정을 내리기 위해 생각했던 흐름대로 차근차근 'good or bad'인지를 생각하는 여정을 함께 떠나게 될 것입니다.

2. 마음(hearts)과 생각(mind)을 얻으려면 취약점(vulnerability)을 공유한 다음 비전을 보여라.

모든 정답을 알고 있는 사람이 과연 있을까요? 내 생각에는 없습니다. 특히 당신이 인원을 관리한다면 더더욱 답을 찾기 힘들것이다. 그렇다면 팀의 방향을 정할 때는 어떻게 해야 할까요?

취약점과 비전은 마법의 조합입니다.(Vulnerability and vision are a magic combination.) 답을 모두 얻지 못했거나 때로는 두렵다는 취약점을 보여주는 것은 유대감(a sense of connection)을 높일 수 있습니다... (그리고 heart는 유대감에서 비롯되지요.) 그러고 나서 비전을 말하십시오. (mind는 명확한 방식을 따르게 마련입니다.)

3. 요구하려면 NVC 형식으로 하세요.

어려운 상황에서는 피드백을 제공하고 요청하는 것은 모든 사람에게 어려운 일입니다. 그 이유중 하나는 상대방이 어떻게 반응할지 모르기 때문입니다. 다행히 Marshall Rosenburg의 저서 Nonviolent Communication(NVC)에서 제공하는 강력한 템플릿을 사용하여 피드백을 구성 할 수 있습니다.

When ____[observation], I feel ____[emotion] because I’m needing some ____[universal needs]. Would you be able to ____[request]?

예를 들면, "내가 당신의 리포트를 볼 때 내용이 너무 많아서 다 읽기가 너무 힘들었습니다. 요점만 몇 가지 추려줄 수 있을까요?"라든지, "시스템에 문제가 있어서 로그를 보려고 했는데 너무 많아서 당황스러웠습니다. 이 문제에 대한 keyword가 없을까요?" 등의 포맷입니다. NVC에 대해 더 알고 싶으면 ‘The Essential Guide to Difficult Conversations’을 확인하세요.

4. 포인트를 만드기 위해 40-단어 규칙을 유지하세요.

우리는 들어주기 힘든 요청을 할 때 말을 많이 하는 경향이 있습니다. 이렇게 된 이유나 정당성을 말해야만 하는 것이 얼마나 미안한지 강조하기 위해서 일지 모릅니다.

그러나 이런 종류의 소식을 들은 후에 사람들은 생각할 시간이 필요합니다. 왜냐하면 이야기를 한다고해서 사람들이 듣고 있는 건 아닙니다. 상대방이 들을 준비가 될 시간을 들인 후에 말하고자 하는 포인트를 꺼내세요. (이때 40 단어 규칙을 지키세요.(stick)) 그리고 생각할 시간을 위해 잠시 침묵하는 것이 좋습니다.

5. 설득하려면 스토리텔링하세요.

이야기는 매우 강력합니다. 무미건조한 fact만으로는 우리의 감정을 전달할 수 없기에 이야기 형식으로 커뮤니케이션을 하세요. 스토리텔링은 리더 툴킷의 필수 요소가 되었습니다.

좋은 이야기는 많은 시간이 소요될 필요가 없습니다. 약간의 설정과 사람들이 관련시킬 수 있는 노력이 필요합니다. 비즈니스에서 이야기를 구성하는 방법에 대한보다 포괄적인 목록은 '12 Storytelling Techniques to Supercharge Your Communications'을 참조하십시오.

6. 권한을 부여하려면 허가를 요청하십시오.

당신이 원하는 것을 하도록 만들기 위해 매우 간단하면서도 강력한 트릭이 있습니다. 그들의 허락을 구하십시오.

  • 우리가 agenda에서 벗어난다면 제가 잠시 멈춰도 될까요?
  • 당신에게 제가 피드백을 드려도 괜찮을까요?
  • 제가 논의 범위를 다시 말씀드려도 될까요?

허가를 요구하는 것은 다른 사람을 존중하고 통제력을 부여합니다. 리더가 허락을 구할 때 무장 해제할 수 있으며, 그렇지 않은 경우 사람들은 기꺼이 기꺼이 주는 것이 좋습니다. - 이 부분은 팀장이 팀원들을 존중하면 자연스럽게 권한을 갖게 된다는 이야기 같습니다.

7. 알려주기 위해 질문하세요.

모든 리더는 다른 팀원들의 문제에 뛰어들어 해결해 주는 것이 얼마나 매혹적인지 ​​알고 있습니다. 그러나 당신이 일을 처리해버리면 팀원들은 언제 성장할 수 있을까요?

최고의 리더는 스스로를 통제하고 대신 질문을 할 수 있습니다. 물론 좋은 질문을 하는 것은 연습이 필요합니다. 좋은 질문은 공개적이고 단순하며 호기심이 많으며 '무엇'또는 '어떻게'로 시작합니다. 질문에 대한보다 포괄적인 가이드를 보려면 'How to Ask Your Team the Right Questions'을 확인하십시오.

 

* 사실 좋은 질문하기는 굉장히 어렵습니다. 어렸을 때부터 훈련이 필요한데 주입식 교육의 폐해가 바로 이 좋은 질문하기 교육의 부재라고 개인적으로 생각합니다.

8. 새로운 아이디어를 이끌어 내기 위해 '예'라고 합니다.

브레인스토밍 능력은 모든 리더에게 유용한 기술입니다. 그러나 '아니오'라는 단어보다 창의력을 빠르게 죽이는 것은 거의 없습니다.. ’

‘What did father used to say? Everything before the word “but” is horse shit.’ — Jon Snow

아이디어를 받아들이고 더 많은 정보를 추가함으로써 다른 사람들이 아이디어를 버리지 않고 그 위에 쌓을 것을 권장합니다. 어휘에서 '그러나'라는 단어를 완전히 없애고 사람들이 생각하는 방식이 더 좋아진다고 주장하면서 사람들을 만났습니다.

9. 설득하려면 먼저 공감하세요.

당신의 제품이나 아이디어를 다른 사람들에게 팔려고 할 때, 당신은 그것이 왜 효과가 없을까 하는 좋은 이유를 받을 가능성이 있다. 이렇게 이의제기를 받았을 때에는 어떻게 대응해야 할까요?

순진한 대답은 이의 제기한 사람들이 틀렸다는 것을 설득하는 것이다. 그러나, 다른 근거를 들기 전에 그들의 감정에 먼저 공감하는 것은 상대방으로 하여금 내 말을 들을 기회를 증가시킬 수 있다. 이를 위한 하나의 프레임워크는 'feel, felt, found'이다.

I know how you feel. I felt the same way, and I found that____ [evidence that changed your mind]

그런 오류 나면 정말 당황했겠는데요. 저도 그런 문제를 알고 있었는데요... 이번 주 업데이트에서 그 문제가 해결되어 배포될 것 같습니다. 배포되면 알려드릴게요.

바로 문제에 대한 해결책을 말하기보다 앞에 공감을 함으로써 상대방과 라뽀도 형성될 것 같습니다.

10. 다 듣고 마지막에 말하세요.

리더는 창의적이고 아이디어가 넘쳐나는 경우가 많습니다. 하지만, 당신의 입장을 이용하여 먼저 아이디어를 얻는 것은 당신의 팀원들 스스로 아이디어를 생각해 낼 기회를 빼앗을 수 있습니다.

토론이나 그룹 결정에서, 보통 자신의 생각을 가지고 시간을 보내기 전에 다른 사람의 말에 귀를 기울이는 것이 득이 됩니다. 다른 의견과 제안을 먼저 들어보면, 대체 의견과 제안을 먼저 들음으로써 정보를 얻을 수 있을 뿐만 아니라 팀을 이해할 수 있는 기회를 얻게 됩니다.. 그리고 결정적으로, 사람들은 만약 자신의 의견을 듣고 있다고 느낀다면, 당신의 아이디어를 더 많이 들을 가능성이 높습니다.


패턴은 지혜라고 생각합니다.

지혜는 효과적으로 지식을 적용하고 원하는 결과를 만들어 내는 것을 의미하는데 '효과적으로 지식을 적용'에 대해 패턴은 굉장히 유용하기 때문입니다. - 지혜를 꼭 이렇다고 단정 지을 순 없고 지혜가 뭐야?라는 질문에 대한 많은 답 중 하나는 될 것입니다. -

프로그래밍 패턴도 어떤 문제에 봉착했을 때 이미 이런 방식으로 해결되었던 것을 정리해 놓은 것입니다. 이 글을 통해 의사소통에도 말하는 패턴과 프레임이 있다는 것을 알았고 커뮤니케이션에 문제가 있을 때 어떻게 대처해야 하는지 정리하는 계기가 되었습니다.

커뮤니케이션에 정답은 없습니다. 다만 이런 패턴 / 프레임워크 같은 기술 + 상대방에 대한 존중이 어우러진다면 분명 좋은 대인관계를 가져갈 수 있을 것입니다.

'Doodle' 카테고리의 다른 글

천재이고 싶다...  (0) 2020.08.21
브레빌 870  (1) 2020.07.10
탄천은 사랑입니다.  (0) 2020.06.12
내가 그의 이름을 불러주었을 때  (0) 2020.04.22

메일을 쓸 때 마다 맺음말은 관용어구라 생각해서 "Best Regards,"를 그냥 썼던거 같다.

오늘 부터는 의미를 좀 알고 써보자.

https://blog.hubspot.com/sales/best-kind-regards

 

Best Regards vs. Kind Regards: How to Use Them Each in an Email

Ever find yourself wondering whether to use 'Best regards' or 'Kind regards?' Here's a quick cheat sheet to help you make the right choice every time.

blog.hubspot.com

 

꽃 - 김춘수

내가 그의 이름을 불러주기 전에는
그는 다만
하나의 몸짓에 지나지 않았다.

내가 그의 이름을 불러주었을 때,
그는 나에게로 와서
꽃이 되었다.

내가 그의 이름을 불러준 것처럼
나의 이 빛깔과 향기에 알맞는
누가 나의 이름을 불러다오.

그에게로 가서 나도
그의 꽃이 되고 싶다.

우리들은 모두
무엇이 되고 싶다.
너는 나에게 나는 너에게
잊혀지지 않는 하나의 눈짓이 되고 싶다.

참 좋아하는 시다. 모든 것은 이름을 가지고 불려져야 그것으로 인식된다는, 어쩌면 당연한 사실을 이야기한다.

요즘 용어에 대한 정의를 남한테 설명할 일이 많아진다. 그럴 때마다 어버버 할 때가 많다. 분명 내가 개발할 때 사용했던 개념들이고 알고 있다고 생각했던 것들이 "그거 뭐예요?"라고 물어보면 설명을 못한다.

그 이름으로 불렸을 때 내가 그것으로 인식을 못하는 것이다. 모르는 거지... ㅇㅇ 이건 모르는 거... 문제는 누구나 아는 그 용어를 가지고 대화하는데 서로 다르게 이해하거나, 개념을 알아도 그게 그거다 라고 인식을 못하면 comm.에 중대한 지장을 초래할 것이라는 건 명백하기 때문이다.

사람들은 누구나 인정받고 싶은 욕구가 있다고 한다. 한두 번 본 사람의 이름을 기억하고 반갑게 이름을 불러주면 좋아하는 게 당연하다. 반대로 여러 번 봤는데 이름을 모른다면? 그 사람을 알 수 있다고 할 수 있을까?

요즘은 개발자들이 알아야 할 기술도 많아지고 그에 따라 용어들도 넘쳐난다. 하물며 영어로 된 축약어도 많다. 하지만 기본적인 용어들을 다른 사람에게 명확히 설명할 정도의 개념 정리와 (내가 개발하고 있는) 특정 도메인의 용어 정도는 평소에도 정리하자. 개발 혼자 할 거 아니면 정리하자.

 

p.s. 한동안 TV에서는 청소년 세대의 신조어들을 퀴즈로 내고 그랬었다. 위 글을 쓰고 곰곰이 생각해보니 이런 신조어들을 "왜 내가 알아야 돼?"라고 했었는데 젊은 사람들과 대화를 하고 공감대를 형성하려면 알고 있는 것이 좋겠다는 생각이 들었다. (나이가 엄청 많은 것도 아닌데 벌써 이런 생각을 하다니?!?!) 여담이다.^^

'Doodle' 카테고리의 다른 글

천재이고 싶다...  (0) 2020.08.21
브레빌 870  (1) 2020.07.10
탄천은 사랑입니다.  (0) 2020.06.12
10 Communication Patterns Used by Great Leaders  (0) 2020.05.08

Spring Boot Auto Configuration 예제를 보다가 maven은 많은데 나한테 익숙한 gradle의 예제는 몇 개 안되어서 gradle로 한 번 만들어 보았다.

  1. contact-spring-boot-starter 프로젝트를 clone후에 build 한다.
    • 만든 jar파일을 어떻게 dependency를 추가해야 할까 잠시 고민했는데 maven local repository를 사용하면 간단했다.
  2. gradle install로 jar파일을 local repository에 올린다.
    • maven plugin을 추가하면 gradle install로 local repository에 올라간다.
    • maven local은 내 계정 폴더에 .m2 폴더이다.
    • 같은 버전으로 install을 계속하다 보면 갱신이 안될 수도 있다. 그럴 때는 .m2폴더를 지워야 할 때도 있었다.
  3. AutoConfigurationTest 프로젝트를 clone후에 build 한다.
  4. gradle bootrun으로 실행한다.
  5. AppConfig에 MyContact Bean을 생성한 것과 안 한 것과의 차이를 확인해 본다.
    • @ConditionalOnMissingBean에 의해서 MyContact를 만들면 만들어진 bean의 내용이 나오고 MyContact bean이 없다면 properties의 내용이 나온다.

'Programming > Spring Framework' 카테고리의 다른 글

2way ssl 인증을 위한 JKS 만들기  (0) 2020.03.10
코딩 시험과 TDD  (0) 2019.02.14
Annotation-based Controller  (0) 2017.02.01

2020.04.15일자 DSM 판올림에 드디어 let's encrypt의 와일드카드 인증서가 지원되는군요!

이제는 cli를 이용해 따로 받을 필요 없이 DSM에서 바로 적용 가능 할 것 같습니다.

이것도 해봐야 겠습니다. (아직 만료 4주전이 아니라 안되겠지만...)

그보다 3개월 마다 자동 갱신 되도록 스케쥴도 원클릭으로 되면 좋을것 같은데....

 

DSM 6.2.3의 새로운 기능

  1. 씬 프로비저닝 LUN은 볼륨 공간이 부족할 때 보호되어 클라이언트가 LUN에 데이터를 쓰지 못하게하고 기존 데이터에 대한 읽기 전용 액세스를 허용합니다.
  2. 웹 포털 및 파일 프로토콜을 통해 도메인의 UPN (사용자 이름)을 사용하여 DSM에 로그인 할 수있는 지원이 추가되었습니다.
  3. 로컬 사용자 가져 오기를위한 비밀번호 변경 옵션을 지원합니다.
  4. 가져온 사용자 목록의 호환성이 향상되어 가져온 파일에 구문 오류가있을 때보다 명확한 오류 메시지를 제공합니다.
  5. 사용자가 선택한 SMB 전송 이벤트 만 기록하도록 지원을 추가하여 요구 사항을보다 밀접하게 충족시키는 전송 로그를 제공합니다.
  6. 클라이언트 사용자가 SMB 프로토콜을 통해 공유 폴더에서 하위 디렉토리의 변경 사항을 모니터링 할 수 있도록 지원이 추가되었습니다.
  7. 사용자가 적시에 응답 할 수 있도록 데스크탑 알림에 대한 세부 정보를 추가했습니다.
  8. 외부 UDF 파일 시스템 장치에 대한 지원이 추가되었습니다.
  9. 고 가용성 클러스터에서 Open vSwitch 옵션에 대한 지원이 추가되었습니다.
  10. IP 충돌 감지에 대한 지원을 추가하여 그에 따라 로그 및 알림을 제공합니다.
  11. 와일드 카드 인증서에 대한 Let 's Encrypt 지원이 추가되었습니다.
  12. 클라이언트의 IP 주소가 변경된 후 HTTPS 연결을 통해 DSM 로그인의 필요성을 다시 포기하는 지원이 추가되었습니다.
  13. ext4 볼륨의 Thick Provisioning LUN에 대한 하드웨어 지원 잠금 지원이 추가되었습니다.
  14. DSM 로그인 페이지에서 사용자 정의 바닥 글 메시지 지원이 추가되었습니다.

https://www.synology.com/ko-kr/releaseNote/DS415+

 

DS415+ Release Notes | Synology Inc.

Version: 6.2.3-25426 (2020-05-13) Important Note The update is expected to be available for all regions within the next few weeks, although the time of release in each region may vary slightly. If you want to update to the latest version now, please go to

www.synology.com


2020.05.15

부푼 마음을 부여잡고 와일드카드 인증서를 발급 받아볼까 하고 진행하는데.....

Synology DDNS에서만 사용가능?!?!?!

결국 개인 도메인은 안되는 걸로 판명....

아쉽지만 저는 기존의 certbot을 사용하여 발급받는 방법을 써야 할 것 같습니다....ㅠㅠ

isolation level이란 트랜잭션에서 일관성이 없는 데이터를 어디까지 허용하는 수준

트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준을 Isolation Level이라고 합니다. 예를 들어, 한 사용자가 어떠한 데이터를 수정하고 있는 경우 다른 사용자들이 그 데이터에 접근하는 것을 차단함으로써 완전한 데이터만을 사용자들에게 제공하게 됩니다. 또한, 많은 사용자들의 수정 작업으로 인하여 통계 자료를 작성할 수 없는 사용자를 위하여 읽기 작업을 수행할 수 있도록 Isolation Level을 변경할 수 있습니다. 
Isolation Level을 조정하는 경우 동시성이 증가되는데 반해 데이터의 무결성에 문제가 발생할 수 있거나, 데이터의 무결성을 완벽하게 유지하는 데 반하여 동시성이 떨어질 수 있으므로 그 기능을 완벽하게 이해한 후에 사용해야 합니다.

 

@Transactional (isolation = Isolation.DEFAULT | READ_COMMITTED | READ_UNCOMMITTED | REPEATABLE_READ | SERIALIZABLE)

 

다음은 MySQL에서 지원하는 네 종류의 Transaction Isolation Level입니다.

READ UNCOMMITTED

  • COMMIT 되지 않은 데이터에 다른 트랜잭션에서 접근할수 있다.
  • INSERT, UPDATE, DELETE 후 COMMIT 이나 ROLLBACK에 상관없이 현재의 데이터를 읽어온다.
  • ROLLBACK이 될 데이터도 읽어올 수 있으므로 주의가 필요하다.
  • LOCK이 발생하지 않는다.

READ COMMIITED

  • Oracle DBMS의 경우 Default LEVEL이다.
  • COMMIT 된 데이터에 다른 트랜잭션에서 접근할 수 있다.
  • 구현 방식이 차이 때문에 Query를 수행한 시점의 데이터와 정확하게 일치하지 않을 수 있다.
  • LOCK이 발생하지 않는다.
  • MySQL에서 많은 양의 데이터를 복제하거나 이동할 때 이 LEVEL을 추천한다.

REPEATABLE READ

  • MySQL InnoDB의 경우 Default LEVEL이다.
  • SELECT시 현재 시점의 스냅샷을 만들고 스냅샷을 조회한다.
  • 동일 트랜잭션 내에서 일관성을 보장한다.
  • record lock과 gap lock이 발생한다.
  • CREATE SELECT, INSERT SELECT시 lock이 발생한다.

SERIALIZE

  • 가장 강력한 LEVEL이다.
  • SELECT 문에 사용하는 모든 테이블에 shared lock이 발생한다.

위의 Transaction Isolation Level 은 Read Uncommited 에서 Serializable  순으로 Concurrency 는 높아지고 속도는 느려진다. 따라서 이 둘의 균형을 잘 맞추는 것이 중요합니다.

Isolation Level  에 따라 나타나는 현상이 세가지가 있습니다.

  • Dirty Read
    • 어떤 트랜잭션에서 아직 실행이 끝난지 않은 다른 트랜잭션에 의한 변경 사항을 보게 되는 되는 경우를 dirty read 라고 합니다. 만약 원래 트랜잭션에서 그 변경 사항을 롤백하면 그 데이터를 읽은 트랜잭션은 dirty 데이터를 가지고 있다고 말합니다.
  • Repeatable Read
    • 어떤 트랜잭션에서 같은 질의를 사용했을 때 질의를 아무리 여러번 해도 그리고 다른 트랜잭션에서 아무리 여러 번 그 행을 변경해도 항상 같은 데이터만 읽어드리는 경우를 repeatable read 라고 합니다. 즉 repeatable read 가 요구되는 트랜잭션에서는 다른 트랜잭션에 의한 변경 사항을 볼 수가 없습니다. 그러한 변경 사항을 보고 싶으면 어플리케이션에서 트랜잭션을 새로 시작해야 합니다.
  • Phantom read
    • phantom read 는 다른 트랜잭션에 의한 변경 사항으로 인해 현재 사용 중인 트랜잭션의 WHERE 절의 조건에 맞는 새로운 행이 생길 수 있는 경우에 관한 것입니다. 예를 들어, 잔고가 $100 미만인 계좌를 모두 찾아내는 트랜잭션이 있고, 이 트랜잭션에서 그 데이터를 두 번 읽는다고 가정합시다. 처음 데이터를 읽어들이고 난 후에 다른 트랜잭션에서 잔고가 $0인 계좌를 새로 만들면 이 계좌도 잔고가 $100 이하라는 조건에 맞게 됩니다. 트랜잭션 격리 수준(Transaction Isolation Level)에서 phantom read 를 지원하면 새로운 “유령(phantom)”행이 나오지만 지원하지 않으면 새로 생긴 행을 볼 수 없습니다.
Isolation Level Dirty Read Nonrepeatable Read Phantom Read
READ UNCOMMITTED Permitted Permitted Permitted
READ COMMITTED Permitted Permitted
REPEATABLE READ Permitted
SERIALIZABLE

Tabel1. Ansi Isolation Levels

Mysql 의 InnoDB 스토리지 엔진의 기본 Isolation Level이 REPEATABLE-READ 이고 Oracle 은 READ-COMMITED 입니다. 각 DBMS별 isolation level 에 자세한 내용은 다음 링크에서 참조할 수 있습니다.

Oracle 은 READ-COMMITED 와 SERIALIZABLE 만 지원하며 나머지 두가지 isolation level  은 지원하지 않습니다.

isolation level 확인

mysql docker의 isolation level은 아래와 같습니다.

MySQL InnoDB의 Isolation LEVEL 문서

https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html

 

'Database' 카테고리의 다른 글

샤딩과 파티셔닝 개념 정리  (0) 2018.10.12
DB 정규화  (0) 2014.12.10

옛날에 썼던 사내 wiki들을 다시 둘러보고 있다. 예전에는 이런 것들을 고민했었고 그때는 어떤 문제들을 직면하고 있었고 어떻게 풀어내려고 시도했었는지 기억이 새록새록 나기도 한다.

wiki에는 딱 한 줄만 쓰여 있었다.

로그를 쌓을 때, 고려해야 할 것들에 대한 발표자료가 있어 공유하기 위해 등록합니다.

그런데 내 기억에는 많은 것이 들어 있었다. 이때 진행하던 프로젝트 여러 서버에서 받은 로그들이 한눈에 보기 힘들었다. 그래서 spring sleuth에 빠져있었던 시기였다. 어떻게 하면 로그를 효율적으로 남겨서 한눈에 볼 수 있을까? 를 엄청나게 고민했던 시기여서 몇 줄 되지 않는 기록에도 내 뇌세포들이 반응했다. 그래서 이 기억을 다시 블로그에 남긴다.

내용도 아주 마음에 들어서 다시 봐도 소름이 돋으려고 막 그랬다.

https://speakerdeck.com/devinjeon/jamag-ndc19-joheun-rogeuran-mueosinga-joheun-rogeureul-wihae-goryeohaeya-hal-geosdeul

Google이 권장하고 사용하는 API Design Guide 문서입니다. Project 진행할 때 참고하면 좋을 것 같습니다.

https://cloud.google.com/apis/design/

Google API Design Guide는 네트워크 API를 위한 종합 디자인 가이드이며, 2014년부터 Google 내부에서 사용되었습니다.

google Cloud API 및 기타 Google API를 디자인할 때도 따르고 있는 가이드입니다.

리소스 중심 디자인

API는 종종 인터페이스 및 메소드를 중심으로 디자인이 되는데, 시간이 지나면서 인터페이스와 메소드가 점점 많아지면 개발자가 각 메소드를 따로 배워야 하기 때문에 결국 API가 지나치게 커져 혼동을 초래할 수 있다.

리소스 중심 디자인의 주요 원칙은 소수의 메소드를 사용해 조작할 수 있도록 이름이 지정된 리소스를 정의하는 것이다.

리소스와 메소드는 API의 명사와 동사로 알려져 있다.

  • 리소스는 HTTP 프로토콜을 통해 URL에 자연적으로 매핑되고,
  • 메소드는 HTTP 메소드인 POST, GET, PUT, PATCH, DELETE 에 자연적으로 매핑된다.

What is a REST API?

REST API는 개별적으로 주소 지정이 가능한 리소스(API의 명사)의 컬렉션으로 모델링된다. 리소스는 리소스 이름으로 참조가 가능하며, 적은 수의 메소드집합(동사 또는 동작[verbs or operations])을 통해 조작된다.

REST Google API에서 사용되는 표준 메소드는

  • List, Get, Create, Update, Delete 이다.

  • 데이터베이스 트랙잭션과 같이 표준 메소드로 쉽게 매핑되지 않는 기능은 커스텀 메소드(커스텀 동사 또는 커스텀 작업[custom verbs or custom operations])을 사용할 수 있다.

Design flow

리소스 중심 API를 디자인할 때 다음과 같은 단계를 따르도록 권장한다.

  • API가 제공하는 리소스 유형을 결정
  • 리소스 사이의 관계를 결정
  • 유형 및 관계를 기준으로 리소스 이름 스키마를 결정
  • 리소스 스키마를 결정
  • 최소한의 메소드 집합을 리소스에 연결

리소스

리소스 중심 API는 일반적으로 리소스 계층 구조로 모델링된다.이 때 각 노드는 단순 리소스 이거나 컬렉션 리소스 이다. 이러한 노드들은 편의상 각각 리소스 와 컬렉션 으로 불리는 일이 많다.

  • 컬렉션에는 동일한 유형의 리소스 목록이 포함된다. 예를 들어 사용자는 연락처 컬렉션은 갖는다.
  • 리소느는 상태와 0개 이상의 리소스를 갖는다. 그리고 각 하위 리소스는 단순 리소스가 되거나, 혹은 컬렉션 리소스가 될 수 있다.

메소드

리소스 중심 API의 주요 특징은 리소스에서 실행되는 메소드(기능)보다 리소스(데이터 모델)를 강조한다는 점이다. 일반적인 리소스 중심 API는 다수의 리소스와 소수의 메소드를 함께 제공한다.

이 때 메소드는 표준 메소드 또는 커스텀 메소드가 될 수 있다.

API의 기능이 표준 메소드(List, Get, Create, Update, Delete) 하나에 자연적으로 매핑되는 경우에는 해당 메소드를 API 디자인에 사용한다.

자연적으로 매핑되지 않은 경우 커스텀 메소드를 사용한다.

Example

Gmail API

  • API 서비스 : gmail.googleapis.com
    • 사용자 컬렉션 : users/*
      • 메시지 컬렉션 : users/*/messages/*
      • 스레드 컬렉션 : users/*/threads/*
      • 라벨 컬렉션 : users/*/labels/*
      • 사용자 프로필을 나타내는 리소스 : users/*/profile
      • 사용자 설정을 나타내는 리소스 : users/*/settings

Cloud Pub/Sub API

  • API 서비스 : pubsub.googleapis.com
    • 주제 컬렉션 : projects/*/topics/*
    • 구독 컬렉션 : projects/*/subscriptions/*

리소스 이름

리소스 중심 API에서 리소스는 이름이 지정된 개체이고,*리소스 이름 *은 식별자 이다. 리소스마다 고유한 리소스 이름이 있어야 한다.

리소스 이름은 리소스 자체의 ID와 상위 리소스의 ID, 그리고 API 서비스 이름으로 구성된다.

저희팀은 특성상 여러 파트로 쪼개져 있고 파트별로 상이한 프로젝트를 진행하기 때문에 파트별로 scrum을 진행하고 있습니다. scrum에 대한 article을 읽는 도중에 흥미로운 내용이 있어서 공유하려고 합니다.

스크럼을 진행하면서 분명 스크럼을 진행하고 있으니까 생산성도 올라가고 결과물도 빠른 시기내에 눈에 보일 거라고 생각했는데 왠일인지 기대에 못미치는 경우는 빈번할거라 예상됩니다. 사실 agile 방법론은 개발 방법론이면서 개발 문화에 가깝기에 팀 구성원들 모두가 공감하고 실천하지 않는다면 사실 정착(문화라는 의미에서 제일 맞는 단어 같습니다.)되었다고 보기 힘듭니다. 이런 비효율적인 결과는 어떤 이유 때문일까요? 분명 복합적인 문제임은 분명합니다. 이 어렵고 복합적인 문제를 설명하는 article에 대해 이야기 해보려고 합니다.

The Rise of Zombie Scrum 에서 Johannes과 Christiaan은 "Zombie Scrum"이라는 용어를 썼습니다. 이 내용을 바탕으로 zombie scrum 증상과 치료법에 대해 추려 보겠습니다.

Zombie Scrum?

첫 눈에 좀비 스크럼은 정상적인 스크럼인 것 같습니다. 그러나 심장이 뛰지 않습니다. Scrum 팀은 모든 Scrum 이벤트를 수행하지만 잠재적인 릴리스 가능 증가(생산성 증가)는 스프린트의 결과에 거의 없습니다. 또한 팀은 이러한 상황을 개선 할 의사가 없습니다. 실제로 아무도 이 팀에 관심이 없습니다. 이해 관계자들은 이 팀의 존재를 오랫동안 잊어 버렸습니다.

Zombie Scrum is Scrum, but without the beating heart of working software.

증상

  1. No beating heart - 심장이 뛰지 않는다.

    좀비 스크럼 팀은 분명 스크럼을 진행하지만 작동되는 소프트웨어는 찾아보기 힘듭니다. 또 드물게 완성된 기능은 'nice-to-have'라고 취급되는 것들로 다른 스프린트에서 종료될 수도 있다.  '완료된'(done)의 의미에 대한 매우 제한적이고 모호하지 않은 것이 명백하며, 그것을 확장하려는 추진력이 없습니다. 건강한 스크럼팀은 '완료' 소프트웨어 스트림을 지속적으로 제공하는 것이 'nice-to-have'가 아니라 스크럼의 필수 목표라는 것을 알고 있습니다. 하지만 좀비 스크럼은 다르게 접근합니다. 누가 소프트웨어 작업, 피드백 수집 및 통찰력 생성에 관심이 있을까요?

  2. No (desire for) contact with the outside world - 외부와의 접촉이 없다.

    외부와의 접촉이 없다는 건 난 여기서 코딩만 해요! (I’m only here to code!)라고 외치는 것입니다. 실제로 좀비 스크럼 팀은 그들 자신이 자동차에 있는 수많은 기어 중에 톱니바퀴 하나라고 생각한다는 것입니다.

  3. No emotional response to success or failure - 성공 또는 실패에 대한 감정적 반응 없다.외부 세계와의 접촉이 부족하면 종종 이 증상이 발생하지만 다른 증상과 독립적으로 나타날 수도 있습니다. 생명이 없는 시체와 마찬가지로 Zombie Scrum 팀은 실패하거나 성공한 스프린트에 응답하지 않습니다. 다른 팀들이 욕을 하거나 기뻐하는 곳에서는 그저 무감각한 체념의 공허한 눈빛 뿐입니다. 팀 사기는 매우 낮습니다. 스프린트 백 로그의 아이템은 의심없이 다음 스프린트로 이월됩니다. 왜 안돼냐구요? 항상 다음 스프린트가 있으며 어쨋든 또 반복하면 되니까요!
  4. No drive to improve - 개선의 의지 없다.

    좀비 스크럼에는 기쁨이 없으며 개선할 의지가 없습니다. 그리고 아무도 신경 쓰지 않는 것 같습니다. 그리고 당신은 팀을 비난 할 수 있습니까? 스프린트 검토 또는 스프린트 계획 중에는 제품 소유자가 거의 없습니다.(ownership이 없다.) 팀들은 팀원들의 (전문) 기술을 필요로 하는 다른 팀들에게 지속적으로 끌려가기 때문에 매우 불안정하다. 또한 팀의 성장에 도움이되는 실제 Scrum Master가 없습니다. 병목 현상 중 일부는 다른 사람들은 상상 할지 몰라도 좀비팀은 실제 상황입니다. 그러나 여기서 요점은 한 팀이 자신의 성공에 대해 경험하는 통제력의 부족이며, 이것은 쉽게 지루한 회고와 많은 불평(굴욕)으로 바뀝니다.

원인

  1. A bit too homegrown, or 'Cargo Cult Scrum' - 너무 변형된다.

    국내산 스크럼은 훌륭합니다. 그건 (비싼) 외부 트레이너와 코치의 도움없이 Scrum과 협력하기 시작하는 팀과 조직. 최고의 스크럼 팀 중 일부는 이렇게 시작했습니다. 그러나 스크럼이 너무 집에서 재배 될 수 있습니다. 팀이 격주로 'Daily Scrum'을 하기로 결정하거나 팀이 달리해야 할 일에 따라 스프린트 길이를 조정하는 경우와 같습니다. 스크럼의 부분적인 채택은 종종 의도하지 않은 것입니다. 그러나 스크럼의 일부만 채택하면 실제 혜택이 사라지고 팀이 어려움을 겪을 수 있습니다.
    : 기본 scrum 개념을 너무 customize하는 걸 경계하라는 의미

  2. No Urgency - 긴급함, 목표가 없다.

    우리는 종종 Scrum Teams에서 긴급성의 부족을 목격하는데, 대개 다른 조직들의 긴급성 부족에 기인합니다. 근본적인 원인 중 하나는 가치에 대한 진정한 이해가 없다는 것입니다. 작동하는 소프트웨어가 스크럼의 심장이된다면 가치는 생명의 피와 같습니다. 가치에 관한 애매함 때문에, 보통 Scrum 팀은 종종 명확한 목표를 세우는 데 어려움을 겪습니다. 목표가 없다면 긴급한 이유는 없습니다. 그리고 그것은 결국 좀비 스크럼을 야기시킵니다. 공유된 목표가 어떤 팀에게든 접착제가 되고 그들에게 목적과 동기를 부여하기 때문입니다.

  3. Competing Values

    좀비 스크럼은 본질적으로 애자일 값과 체계적인 불일치의 결과입니다. 우리는 비즈니스 용어가 강력하다는 것을 알고 있지만 우리가 만들고자하는 요점은 Healthy Scrum이 조직의 사람들이 Agile 소프트웨어 개발을 유발하는 것과 충돌하는 소프트웨어 개발에 대한 믿음을 가질 때 Zombie Scrum으로 쉽게 붕괴된다는 것입니다.

    • Scrum은 소프트웨어의 꾸준한 흐름으로 인해 '빠르게 실패'할 수 있다는 것을 이해하는 대신에 좀비 스크럼은 (자체를 위해) 스크럼의 목적을 따라야하는 프로세스로 간주합니다.
    • 좀비 스크럼 (Zombie Scrum)은 동작하는 소프트웨어를 'nice-to-have'로 간주합니다. 우리는 어쨌든 스프린트의 끝에서 반영되지 않을 것입니다. 건강한 스크럼 작동하는 소프트웨어는 필수적입니다. 스프린트가 끝날 때 반영되지 않더라도 우리는 그것으로부터 가장 많이 배웁니다. (회고에 대한 내용인듯.)
    • 좀비 스크럼 팀은 긴박감을 느끼지 못하며 항상 다음 스프린트가 있습니다. 스프린트는 또 만들면 되니까요. 그러나 건강한 Scrum 팀에서 하나의 스프린트는 피드백하는 기회 사이의 기간이 가장 오래 허용됩니다. (회고가 아닌 개발기간이 늘어나는 것을 경계하라는 뜻인듯)
  4. Scrum Cherry Picking

    첫눈에 "Scrum Cherry Picking"는 "Cargo Cult Scrum"과 같은 것처럼 보일 수도 있습니다. 그러나 "스크럼 체리 선택"으로 스크럼의 부분적 채택은 의도적으로 이루어진다는 점이 다릅니다. 책으로 스크럼을 하는 것은 너무 어려웠습니다. 그것은 조직 내에서 너무 많은 고통을 초래했습니다. 따라서 이미 경량화된 Scrum Framework에 대한 일부 변경은 "필요한" 것이었습니다.

    • tester가 매주 4시간 Scrum Master 역할을 수행하도록 허용. 주간 현황 보고서를 경영진과 공유하는 데 시간이 더 걸리지 않을 것입니다.
    • "완료된" 스프린트를 보장하기 위해 스프린트를 며칠 연장하는 것
    • 스프린트 계획 및 목표에 대한 공유 약속 없이 스프린트 계획 종료.
    • "설명할 것이 없기 때문에" 스프린트 리뷰 취소
    • "개선할 시간이 충분하지 않기 때문"에 스프린트 소급 취소
    • 백로그 구체화(Refinement)를 제품 소유자와 "Lead Developer"만 포함하는 "미팅"으로 간주.
  5. Contracts Implying "We Don't Trust You!"

    진정한 가치 중심의 조직도 가치 중심 계약을 받아들인다. 투명성과 신뢰에 기반을 둔 계약들이다. 이런 계약은 효과적인 파트너십을 자극하고 협업을 초대한다. 가치 중심 계약은 새로운 통찰력을 채택하고 얻은 지식을 처리하는 것을 지원한다. 그것은 필요한 변화와 배운 교훈에 따라 행동하도록 장려한다. 가치 중심 계약은 경량하며 필요한 계약과 제약만 포함한다. 가치 중심의 계약은 민첩한 사고방식을 수용한다.

    그러나 실제로는 가치 주도형 Agile 계약에 동의하는 것은 어렵다. 고객이 훌륭한 아이디어를 가지고 있을 때, 열정은 높고 가능성은 무궁무진하다. 우리는 그 계약에 동의하기만 하면 된다...

    계약의 어려움은 모든 것이 신뢰에 관한 것입니다. 서로의 능력에 대한 상호 신뢰가 충분하다면 계약을 맺는 것은 그리 어렵지 않을 것이다. 그러나 고객과 공급자가 이전에 함께 일하지 않은 경우가 많으므로 신뢰의 근거가 입증되지 않은 경우가 많다. 고객은 예산, 시간, 품질 및 범위에 대한 보증을 원한다. 적절한 변화 통제 과정이 부족하다. 몇 가지 힘든 협상 후에 개발팀은 시작하지만 고객과 진정으로 협력하지는 않으며 단지 오래된 요구 사항으로 쓰여진 것을 기계적으로 만들고 있을 뿐이다. 좀비스크럼의 분위기로 구축된 차선의 제품이 그 결과가 될 것이고 그 관계와 신뢰는 깊은 상처를 입게 된다.
    : 고객과의 interaction을 하고 요구사항 변화에 적절히 대응해라.

  6. The Smell of the Place

    In organisations, it's all about the context. This has a huge impact on the behaviour of employees and largely determines the risk of Zombie Scrum. In the video "The Smell of the Place" professor Sumantra Ghoshal offers four examples of smells in organisations. The ones on the left describe "downtown Calcutta in mid summer", on the right is "Fontainebleau in spring". In addition, I'll share some smells that I have interpreted and experienced in organisations.

    • Constraint versus Stretch
    • Compliance versus Discipline
    • Control versus Support
    • Contract versus Trust
    • Project versus Product
    • Planning versus Prognoses
    • Commitment versus Forecast
    • Resources versus People

    If the context of an organisation has lot's of smells that resemble with "downtown Calcutta in mid summer"; chances are Zombie-Scrum will occur. Therefore focus on the opposite of every smell and create "Fontainebleau in spring" in your organisation!

    : 이 부분이 제일 이해되지 않는 부분인 것 같습니다. 세계 경제 포럼에서 Sumantra Ghoshal 박사(인도의 경제학자이자 교육자)가 얘기한 유명한 얘기인데요... 이 8분짜리 영상만으로 포스트 하나 더 나올 정도입니다. 그 장소에서 냄새가 난다니... 어렵네요.ㅠ

치료

  1. Become a Zombie-whisperer

    여러분은 많은 좀비들에게 많은 것을 기대하지 않을지도 모르지만, 단순히 그들과 이야기 하는 것은 놀라운 효과가 있을 지도 모릅니다. 좀비 스크럼 팀들은 그들의 곤경을 좀처럼 달가워하지 않습니다 따라서 좋은 출발은 그들의 상황에 대해 이야기하고 잠재적인 원인과 해결책을 찾아내는 것입니다. 또한 가치관이나 신념에 대해 이야기하는 것을 돕고, (필요할 경우) Scrum의 목적과 기본 가치관에 대해 교육합니다. 좀비 스크럼은 팀 문제가 아니라는 점을 강력히 강조하고 싶습니다. 좀비 스크럼은 조직적 가치와 Scrum 값 사이의 단절을 나타내는 것입니다. 관리의 역할은 여기서 과소평가될 수 없습니다. 그들은 그들이 하는 모든 일에서 Healthy Scrum의 핵심 가치를 지지하고 전달해야 합니다.

  2. Introduce Healthy Scrum into the population

    좀비 스크럼과 싸우는 또 다른 방법은 Healthy Scrum의 작동 방식을 보여주고 설명하고 올바른 가치를 전달할 수있는 사람들을 사람들에게 소개하는 것입니다. 좀비 스크럼으로 고통받는 팀과 조직은 종종 제대로 작동하지 않지만 문제의 원인을 알지 못한다고 생각합니다. 이를 수행하는 방법에는 여러 가지가 있습니다. 다른 회사의 스크럼 사파리에서 팀과 경영진을 참여시켜 스크럼의 작동 방식을 보여주십시오. 또는 작업 수행 방식을 보여줄 수있는 스크럼 경험이있는 직원을 고용하십시오. 또한 팀과 경영진이 조직이 가능한 빨리 물건을 스스로 관리하도록 돕는 데 집중하는 한, 팀과 경영진이 스크럼을 더 잘 이해하도록 돕기 위해 애자일 코치를 참여시키는 데 도움이 될 수 있습니다.

  3. Shake things up (don’t continue the stumble)

    팀이 스크럼 프레임 워크 내에서 상호 작용하는 방식을 변경하여 문제를 해결할 수 있습니다. 예를 들어, 좀비 스크럼 팀은 단축 된 스프린트 길이를 통해 이익을 얻습니다. 3-4 주 반복 대신 길이를 2 주 또는 1 주로 줄입니다. 스프린트 계획은 다가오는 스프린트 내에서 팀이 어떤 유형의 영향을 미치고 싶은지에 대한 답에 초점을 맞 춥니 다. 스프린트 목표를 검토하고 팀이 그 목표를 달성하기 위해 어떤 성과를 거두 었는지 일일 스크럼을 시작하십시오. 로드맵을 사용하여 검토 회의의 통찰력에 대한 컨텍스트를 제공하십시오. 그리고 천국을 위해 실제 고객이나 이해 관계자를 초대하십시오! 회고전을 사용하여 같은 오래된 문제를 끌어 내지 말고 큰 꿈을 꾸십시오. 변형 적 접근 방식이 증분 적 접근 방식보다 더 적합 할 수 있습니다. 무엇을하든 항상 모든 사람을 구할 수는 없습니다. 어떤 사람들은 선택에 의해 좀비이며 질병은 이미 너무 퍼져 있습니다.

  4. Involve the broader Scrum Community

    당신은 좀비 스크럼과의 싸움에서 혼자가 아닙니다. 스크럼의 채택이 계속 증가함에 따라 커뮤니티도 점점 커지고 있습니다. 더 많은 경험을 가진 사람들의 도움을 요청하여 커뮤니티의 혜택을 누리십시오. 현지 Agile 또는 Scrum Meetup을 방문하거나 포럼 (Scrum.org의 포럼) 또는 Facebook을 사용하여 도움을 요청하거나 동료 Scrum 마스터 또는 Agile Coach를 초대하십시오. 또는 우리와 같은 블로거에게 이메일을 보내십시오. 기꺼이 도와 드리겠습니다!

  5. Dare to Embrace Agile Contracting Principles

    1. 작게 시작하십시오. 고객이 자신의 프로젝트에 대한 예산이 많은 경우에도 먼저 단 하나의 Sprint 만 수행하기로 동의하십시오. 제품 비전과 제품 백 로그를 함께 생성하고 추정 한 후에는 첫 번째 '완료', 가치 있고 잠재적으로 출시 가능한 증분을 제공한다는 목표로 첫 번째 스프린트 만 수행하십시오. 스프린트 검토 및 스프린트 회고를 수행하고 다른 스프린트를 시작하기에 상호 신뢰가 충분한 지 결정하십시오.
    2. 전체 스크럼 팀 판매 / 구매 오랜 기간 동안 함께 협력하여 상하를 경험하고 속도가 금 가치가 있다는 것을 알고있는 고정 스크럼 팀. 일반적인 함정은 새 프로젝트가 도착하면이 '골든 팀'을 분리하는 것입니다. 이러지 마 모든 비용으로 팀을 유지하십시오. 고객은 테스터, 애널리스트, 디자이너, 스크럼 마스터, 개발자 등 판매 / 구매 스프린트를 포함한 전체 팀을 확보합니다.
    3. 속도를 알고있는 고정 팀과 함께 일할 때이 팀을 위한 스프린트를 판매하는 것이 더 쉽습니다. 물론 속도는 팀을위한 것입니다. 발견하는 데 3 -5 스프린트가 필요하며, 빌드하는 모든 제품에 따라 다를 수 있습니다. 그러나 경험이 많고 경험이 많은 고정 팀은 제품 백 로그를 추정 할 수 있으며 구현에 걸리는 스프린트의 양 (예 : 5 – 7 스프린트)을 제공 할 수 있습니다. 팀이 고정되어 있기 때문에 스프린트 당 비용이 얼마인지 (예 : 40.000,-)도 알고 있습니다. 이것은이 프로젝트에 필요한 예산이 200.000에서 280.000 사이임을 의미합니다. 모든 Sprint Review 동안 Scrum 팀과 이해 관계자는 다가오는 Sprint를 개발하기 위해 필요한 기능을 논의 할 수 있습니다. 스프린트 당 비용을 고려할 때 얼마나 가치가 있을지 논의 할 수 있습니다. 스프린트를 판매함으로써 고객에게 유리한 점은 계약을 조기에 종료 할 수 있다는 것입니다. 프로젝트를 계속 진행하는 비용이받은 추가 가치보다 높으면 더 이상 스프린트를 구매하지 않을 가능성이 있습니다.

  6. Setup a Smell-o-Meter

    Changing people’s behaviour is not about changing people, but changing the context which they are in: the smell of the place. - Prof. Goshal

    조직에서 모든 사람이 경험하는 냄새에 대한 투명성을 제공함으로써 그에 따라 행동 할 수 있습니다. 부정적인 냄새가 증가하면 좀비 스크럼이 발생할 수 있습니다. 따라서 모든 사람은 지속적으로 나쁜 작은 것을 알고 즉시 행동해야합니다. 이를 통해 좀비 스크럼 발생에 저항 할 수있는 조직적 맥락을 보장 할 수 있습니다.

  7. 냄새-오 미터를 설정하여 조직의 냄새를 "투명하게"만드십시오. 저의 전 동료 Wouter van der Meer는이 아이디어에 대한 훌륭한 블로그 게시물을 작성했습니다.

결론

이 블로그 게시물에서 Christiaan Verwijs와 Johannes Schartau가 설명한대로 좀비 스크럼의 주요 내용을 공유했습니다. 원래 기사 외에도 몇 가지 원인과 치료법을 추가했습니다. 바라건대 이로 인해 좀비-스크럼이 발생할 가능성이 줄어 듭니다! 좀비 스크럼을 다루는 방법에 대한 다른 아이디어가 있다면 공유하십시오!

 


1) nice-to-have : 있으면 좋고... 핵심(core)에서 벗어난 것

2) cargo cult : https://ko.wikipedia.org/wiki/%ED%99%94%EB%AC%BC%EC%88%AD%EB%B0%B0 조상들이 뭘 가져다 주길 비는 토착신앙. scrum을 하기만 하는건 (죽은 조상들이 뭘 갖다주기만 기다리는 건) 전혀 도움이 되지 않는다.

 

+ Recent posts