민첩한 방법을 사용할 때 좋은 디자인을 얻는 방법? 작성합니다 ( 일반적으로 버그를 방지하고 특히

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

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

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

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

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

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

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

편집-참고

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

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

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



답변

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

그런 다음하지 마십시오.

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

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

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

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

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


답변

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

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


답변

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

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

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

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

충분하고 YAGNI

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

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

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

스크럼

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

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

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

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

일반적으로

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

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

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


답변

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

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

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

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

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


답변

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

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

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


답변

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