민첩한 방법을 사용할 때 좋은 디자인을 얻는 방법?


15

저는 약 3 년 동안 민첩한 방법론 (SCRUM)을 사용해 왔으며 특히 여러 수준의 단기 피드백에서 (초기 액세스 권한이있는 고객부터 구현 된 기능에 이르기까지 기능을 테스트 할 수있는 테스터) 새로운 코드에 대한 매우 빠른 피드백을 검토 등을 통해 제공 할 수있는 다른 개발자로부터 구현되는 즉시)

반면에, 나는 두 가지 열린 문제가 있는데, 그 중 첫 번째는이 질문에서 설명하려고합니다.

문제점 : 좋은 디자인을 얻는 데 어려움

코드가 지저분 해지면 리팩토링을 시도하고 가능한 한 단위 테스트를 작성합니다 ( 일반적으로 버그를 방지하고 특히 리팩토링 할 때 도움 이 됨). 다른 한편으로, 일일 커밋과 함께 약간의 복잡한 기능을 조금씩 개발하고 코드가 구조화되지 않을 때 코드를 계속 다시 생각하면 실제로 좋은 디자인을 만들 수 없습니다.

내가 최근에 생산할 수있는 유일하게 잘 디자인 된 모듈은 다른 접근법을 취함으로써 얻은 것입니다. 나는 며칠 동안 문제를 분석했습니다. ), 며칠 동안 모든 관련 클래스 및 관계의 다소 세부적인 디자인을 스케치 한 다음 내 사무실에 갇히고 약 3 주 동안 중단없이 작업하여 전체 코드를 작성했습니다. 결과는 찾기 쉽고 수정하기 쉬운 버그가 거의 없었으며 매우 명확한 디자인으로 인해 그 이후로 관련 변경이 필요하지 않은 최고의 결과였습니다.

그래서 지금까지 큰 그림이 마술처럼 프로세스에 등장하기를 희망하면서 코드를 작은 단위로 작성하기 전에 미리하고 싶은 것에 대한 전반적인 그림을 얻는 것이 훨씬 효과적이라는 것을 알았습니다. 최선의 노력으로 소규모 증분 개발 방식으로 인해 항상 디자인이 나빠졌습니다.

질문 : 비슷한 경험을 한 사람이 있습니까? SCRUM을 잘못된 방식으로 적용하고 있습니까? 또는 조금씩 개발하고 제대로 디자인 된 소프트웨어를 사용하려면 어떻게해야합니까? 아니면 실제 코딩을 시작하기 전에 디자인 사용자 스토리를 예약해야 합니까? 최소한 평균보다 복잡한 기능에 대해서는 이것이 모범 사례로 간주됩니까?

편집-참고

나는 좋은 디자인 이 절대적인 것이 아니며 그 자체로 가치가 없지만 상황에 달려 있다는 사실을 알고 있으며, 당면한 문제에 충분히 적합한 디자인을 목표로 삼아야합니다 .

예를 들어, 간단한 구성 요소를 구현해야하는 경우 (1) 가능한 한 빨리 준비해야하고, (2) 한 번만 사용하고, (3) 시스템의 다른 부분 (YAGNI)에서 사용합니다.

구성 요소 (1)을 여러 번 사용하고 제품의 여러 가지 다른 릴리스에서 (2) 시간이 지남에 따라 유지 관리 및 확장해야 할 때 (3) 구성 요소에 따라 다른 많은 구성 요소가있을 때 우수한 설계 .


5
The only well-designed module I could produce recently I obtained by taking a different approach-당신은 당신의 자신의 질문에 대답했습니다. 당신은 여전히 필요 일부 선행 디자인; 리팩토링을 통해 유기적으로 좋은 디자인을 기대할 수는 없습니다. 그런 식으로 작동하지 않습니다.
Robert Harvey

1
아니요. 스크럼을 올바르게 적용하지 않았기 때문일 수 있습니다.
Giorgio

3
"정확하게 스크럼"과 같은 것은 없습니다. 원하는 결과를 생성하는 프로세스 만 있습니다.
Robert Harvey

1
그것이 그들이 "가이드 라인" 이라고 불리는 이유입니다. 어쨌든, 매일 커밋하고, 짧은 (1 주일에서 1 개월) 스프린트를가집니다. 이와 같은 규칙은 디자인에 대해 전혀 말하지 않습니다. 여전히 디자인이 있어야합니다.
Robert Harvey

답변:


13

다른 한편으로, 일일 커밋과 함께 약간의 복잡한 기능을 조금씩 개발하고 코드가 구조화되지 않을 때 코드를 계속 다시 생각하면 실제로 좋은 디자인을 만들 수 없습니다.

그런 다음하지 마십시오.

모든 것이 멋진 민첩한 상자에 맞지는 않습니다. 종종 제품에는 개인에게 농사를 짓거나 스프린트 내에서 제정신으로 완성 할 수없는 몇 가지 복잡한 것들이있을 것입니다. 강제로 그 상자에 그들 만 문제가 발생합니다. 그러나 이것들은 거의없고 사이에 있어야합니다. 많은 구성 요소가 이와 같다는 것을 알게되면 제품 소유자가 팀과 함께 일을 더 잘 해내 야합니다. 나는 당신이 한 일을 잘하고 있습니다. 이야기를 잡고 디자인 한 다음 몇 주가 걸릴 것으로 예상하여 최대한 빨리 망치십시오.

더 일반적인 경우에는 Agile에서 좋은 디자인을 얻기 위해 내가 본 3 가지가 있습니다.

  • 실제로 디자인을해라 -내가 본 많은 곳에서 스프린트를 시작하고 코드를 만들기 시작했다. 이런 식으로 나쁜 디자인을 얻을 수 있습니다. 애자일은 계획-코드-테스트-릴리스의 개발 프로세스를 변경하지 않고 더 세부적인 부분으로 단축합니다. 스프린트 시작시 필요에 따라 실제로 솔루션을 디자인하십시오.

  • 건축가 / 리드를 확보하십시오 -프로젝트가 충분히 커지면 여러 응용 프로그램에서 작업하는 여러 스크럼 팀이 생깁니다. 모든 팀이 설계 관점에서 무엇을하고 있는지 아는 것이 주요 업무 인 누군가 (또는 응용 프로그램의 크기에 따라 여러 사람)를 갖는 것이 매우 유용합니다. 질문에 대답하고 팀을보다 조화로운 오버 아키 디자인으로 안내 할 수 있습니다. 각 스크럼 팀에 다른 팀이하는 일을 대부분 알고있는 리더가있는 것도 보았고 매우 효과적이었습니다.

  • 실용 주의자가 되십시오 -나는 이것을 위에 덮었습니다. 애자일은 도구이며 다른 도구와 비슷합니다. 모든 문제에 적용되는 것은 아닙니다. 일부 구성 요소에 적용하기에 적합하지 않은 경우 적용하지 마십시오. 당신의 목표는 좋은 소프트웨어를 제공하는 것입니다; 잊지 마세요.


3
"그 상자에 넣으면 문제가 발생합니다."
Giorgio

17

작은 증분으로 구현하고 체계적으로 유지 관리 가능한 코드로 끝날 수 있습니다. 이론적으로는 매우 간단합니다. 각 변경 후에 코드가 잘 구성되어 있는지 확인하면 항상 잘 구성됩니다. 리팩토링해야 할 때 코드를 계속 추가하기 때문에 코드가 제대로 구성되지 않습니다.

디자인에 얼마나 많은 시간을 소비하더라도 결국 요구 사항이 예상치 못한 방식으로 변경되므로 원래 디자인에 맞지 않는 코드를 작성해야합니다. 그런 다음 점진적으로 변경해야합니다. 단위 테스트가 훌륭하고 리팩토링에 능숙하다면 새로운 요구 사항을 충족하면서 코드를 체계적으로 유지할 수 있습니다.


+1 : 알겠습니다. 따라서 리팩토링 이야기를 계획해야 할 필요가 있다고 생각할 때 리팩토링 이야기를 예약해야하며 충분히 좋은 디자인을 다시 얻을 때까지 새로운 기능을 추가하지 마십시오. 그것은 아마도 우리가 프로세스에서 놓친 것 일 것입니다 (IMO, 우리가 개발하는 증가가 종종 너무 작다는 사실 외에도).
Giorgio

2
실제로 당신은 추가해야합니다 기술 부채 이야기를 실제로 제품 소유자로 행동하는, 이것이 무엇을 의미하는지 때 논의 기술적 인 부채 .

4
"기술 부채"스토리 또는 이와 유사한 스토리를 작성하여 제품 소유자가 코드 품질에 대한 책임을지는 곳에서 본 모든 프로젝트는 코드 품질이 항상 속도와 사기를 심각하게 손상시킬 정도로 낮은 우선 순위를 갖습니다. 팀은 코드 품질을 책임지는 실체라고 생각합니다. 팀은 스토리를 추정하여 보존되거나 필요한 경우 기술 부채를 낮출 수있는 여지가 있어야합니다.
Buhb

4
"리팩토링 이야기"또는 "기술 부채 이야기"는 발생하지 않아야합니다. 못. 리팩토링 비용은 개발의 일부이며 별도의 작업이되어서는 안됩니다. 실제로는 이야기가 아니라 계획된 단계가 아닌 작은 단계로 지속적으로 이루어져야합니다. 우리 팀이 리팩토링 이야기를 시도했지만 안타깝습니다. '즉석에서'리팩토링을 시작하면 리팩토링이 코딩 스타일의 일부가되고 별도의 작업이 아니라는 것을 알 수 있습니다.
Patkos Csaba

1
코드베이스가 중요한 재구성 / 재 작성없이 스토리 X를 편리하게 처리 할 수 ​​없다고 생각하는 경우,이 재구성은 스토리 X의 일부 여야하며 스토리 X를 추정 할 때이 재구성에 필요한 작업을 고려해야합니다.
Buhb

6

"잘 디자인 된"은 주관적입니다

"잘 설계된" 이란 무엇입니까 ? 제품 소유자에게? 고객에게?

가요 "잘 설계된 제품 소유자의 목표를"? 고객의 목표? 아니면 그냥 당신?

무엇 당신은 생각 "잘 설계되지" 여전히 제품 소유자의 기대에 부응하고 고객의 행복을? 그렇다면 그것은 "잘 설계된"것 입니다.

충분하고 YAGNI

모든 시스템은 제품 소유자가 완료 등의 이야기를 받아들이는하고 고객이 그들의 요구 사항을 충족 믿기 때문에 대부분의 애자일 방법론에 아무것도, "잘 설계된"의 말하지 않는다 "잘 설계된" .

되는 예상 개발자들이 전문가들과 것이다 실용적 기능과 스토리를 구현하는 최상의 방법, 적절한 설계 및 관용구를 사용합니다.

개발자 문제인 작업을 올바르게 수행 할 시간을 고려하지 않은 경우, 제품 소유자가 수행 할 수있는 짧은 시간 내에 작업을 요구하는 경우이를 수행하는 것은 특권이며 교육에 대한 책임은 사용자에게 있습니다. 기술적 부채 이야기 형태의 결과 .

스크럼

기록 할 수있는 민첩한 방법론은 민첩한 방법론이 아닙니다. "-Jarrod Roberson

SCRUM은 소프트웨어 제품의 전체 수명주기를 관리하는 도구의 프레임 워크입니다. 그것은 딱딱한 것들이 아니라 시작하고 희망적으로 개선하기에 좋은 곳입니다.

내가 일한 대부분의 상점에는 Sprint ZERO라는 팀의 선임 구성원이 제품의 전체 아키텍처 또는 테마를 스케치 할 수있는 Sprint가 있습니다.

20보다 큰 스토리는 일반적으로 실제로 3 ~ 5 포인트 정도가 될 때까지 분류됩니다. 이러한 이야기 ​​중 하나는 "팀으로서 우리가이 기능을 어떻게 디자인 할 것인지 논의하기 위해 만나서 할당 된 시간이 주어지면 가능한 한 적은 기술적 부채를 갖도록해야합니다."

일반적으로

일반적으로 "잘 설계된" 시스템은 충분하며 YAGNI를 따릅니다.

Agile 및 SCRUM, 특히 Agile의 구현은 제품 소유자 / 스폰서에게 가능한 한 투명하게 제품을 생산하는 방법 에 대한 것 입니다.

기술적 인 설계 / 아키텍처 에 관한 것이 아닙니다 . 고객의 요구와 기대를 충족시키는 소프트웨어를 제공하는 방법에 대한 철학입니다. "잘 설계된" 부분 이라고 부르지 않는 것은 철학의 근본적인 부분이 아니기 때문에 실패 자체가 아닙니다.


2
"잘 설계된"제품 소유자의 목표 : 직접적인 목표는 아닙니다. 간접적으로 그렇습니다. 잘 설계되어 디버그 및 유지 관리가 더 쉬워집니다. 지저분하고 잘못 설계된 코드에서 중요한 버그 (응용 프로그램을 중단시킨)를 찾는 데 몇 주가 걸렸습니다.
Giorgio

3
정말 우울한 답변입니다. 그것은 기본적으로 회색 끈적 거리는
Robert Harvey

목표가 아닌 @Giorgio는 암시적인 기대입니다.

@RobertHarvey 저는 Big Ball of Mud 비디오를보고 논문을 읽은 것을 알고 있습니다. 이것은 실제 생활이며, SCRUM은 특히 BBOM의 인정이며 프로세스의 일부로 엔트로피를 수용하고 그것을 기술 (기술적 데뷔)하고 느리게 (리팩토링) 시도하여 관리함으로써 방법론에 BBOM을 수용합니다. 그렇습니다. 총 BBOM / 엔트로피에서 멀리 떨어져야하지만 실제로는 항상 그런 것은 아닙니다.

1
하지만 "암묵적인 기대"를 먹을 수는 없습니다. 그냥 손을 흔들며입니다. "전문가이고 내가하는 일을 알고 있기 때문에 잘 설계 될 것입니다." (최고의 빌 머레이의 목소리로) 맞습니다.
Robert Harvey

3

우리는 몇 달 동안 스크럼과 함께 일해 왔으며, 귀하의 문제에 관한 경험을 나누고 싶습니다.

몇 달 전에 저는 구현해야 할 큰 부분이있었습니다. 모든 사양을 준비 했으므로 그에 따라 새로운 기능을 구현해야했습니다. 작업은 약 5-6 주가 소요되었습니다 (추정 한대로). 나는 첫 주에 디자인 작업에만 시간을 보냈다. 작업은 조금 복잡했습니다. 사양에서 결론을 내린 15 개의 다른 상태를 가진 주요 객체가 있었고 UI는 모든 상태에 대해 다른 동작을해야했습니다.

그 후 전체 워크 플로와 DB 구조 및 클래스를 디자인했습니다.

내 경우에는 다른 접근법이 보이지 않습니다. 한 번에 코딩에 들어가면 결국에는 유지하기가 거의 불가능하고 더 이상 변경하기가 매우 어려워 질 것입니다. 그러나 다음 2 주 동안 변경이 있었으므로 코드를 다시 작성해야했습니다. 초기의 생각한 디자인으로 지금은 쉬웠습니다. 이것은 우리의 시간, 돈 및 신경을 절약했습니다.

이 경험을 마치면 처음에는 수용 가능한 디자인을 만들 가치가 있다고 확신합니다. 기적을 기르면 결국 끝낼 수 있기를 바랍니다.


1
+1 : 매우 흥미로운 답변. 민첩한 지지자들은 6 주 이야기를 더 작은 이야기로 나눈다 고 말합니다. 나는 한 번 비슷한 조언을 받았으며, 6 주간의 1 주일 이야기는 서로간에 많은 의존성을 가지고있을 것이라고 대답했습니다. 작업 계획을 변경하더라도 문제 영역을 바꿀 수 없기 때문입니다. 나는 이것에 대한 답을 얻지 못했습니다. 애자일은 종종 작고 독립적 인 이야기로 작업을 해체 할 수 있다고 가정하지만 실제 세계에서는 항상 그런 것은 아닙니다.
Giorgio

1

뒷좌석은 20-20입니다. 프로젝트를 시작할 때 모든 정보를 파악한 다음 몇 주 안에 코드를 작성하기 위해 정보를 처분했다면 그렇게하는 것이 좋습니다.

획득 한 모든 통찰력, 시도 및 실패 / 변경해야하는 접근 방식 및 요구 사항에 충분한 크레딧을 제공 할 수있는 고객 / 사용자의 능력 향상에 대해 충분한 크레딧을 제공하지 않습니다.

성공적인 낙하 프로젝트의 역사를 가진 사람이 민첩한 방법론으로 전환하는 이유는 무엇입니까?


"왜 성공적인 낙하 프로젝트의 역사를 가진 사람이 민첩한 방법론으로 전환하겠습니까?": 매우 훌륭한 관찰 (+1). 워터 폴과 애자일 사이의 선택은 프로젝트의 종류와 관련이 있어야한다고 생각합니다. 빈번한 프로토 타입이 필요한 정의가 불완전하고 프로토 타입이 최종 제품이 될 수있는 프로젝트의 경우 애자일이 적절할 수 있습니다. 요구 사항이 더 안정적이고 견고성과 안정성이 더 중요한 프로젝트의 경우 폭포 (또는 일부 변형)가 더 나은 선택 일 수 있습니다.
Giorgio

0

프로젝트를 시작하기 전에 항상 최종 목표가 무엇인지, 어떤 기능을 구현할 것인지, 언제 언제 구현해야하는지에 대한 더 큰 그림이 필요합니다. 원자 작업으로 스토리 작업은 문제를 요구합니다. 향후 요구 사항을 가능한 한 많이 염두에 두어야합니다.


디자인 사용자 스토리 를 예약하는 것이 좋습니다 ?
Giorgio

@Giorgio : 불필요 할 수도 있지만 제품 소유자는 최소한 프로젝트가 시작되기 전에 고객의 프로젝트에 대한 고객의 기대에 대한 개요와 그것이 어떻게 분해되었는지에 대한 설명을 제공해야합니다.
James

1
누군가 공감하는 경우 이유를 제시하십시오
James

Downvoters는 왜 downvote를 설명해야하는지 거의 설명하지 않습니다. 꽤 성가신 것 같습니다.
조르지오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.