문제

저는 팀원들에게 TDD를 채택하도록 설득하려고 하는 팀에 속해 있습니다(이전 팀에서 TDD가 작동하는 것을 보았고 설정도 비슷합니다).또한, 제 개인적인 믿음은 적어도 처음에는 TDD와 쌍 프로그래밍을 함께 수행하면 정말 도움이 된다는 것입니다.이렇게 하면 경험이 없는 두 명의 (TDD) 개발자가 서로 도움을 주고, 어떤 종류의 테스트를 작성해야 할지 논의하고 좋은 진전을 이룰 수 있습니다.

반면에 내 관리자는 팀에 두 가지 새로운 개발 방식을 동시에 도입하면 두 가지 모두 실패할 가능성이 높다고 생각합니다.그래서 그는 좀 더 보수적으로 아무거나 소개하고 싶어한다.

이 두 가지가 서로 보완적이고 직교하지 않는다는 것을 어떻게 그에게 확신시킬 수 있습니까?아니면 내가 틀렸나요?

도움이 되었습니까?

해결책

TDD에서 무엇을하고 있는지 모르는 사람들이 더 많은 사람들이 도움이 될 것이라고 확신하지 못합니다. 그것은 둘 다 주제를 인터넷 검색하거나 TDD가 무엇인지 정확하게 논쟁하는 두 사람 모두에게 빠르게 내려갈 것입니다.

나는 당신이 팀에 누군가가 주어진 기술의 전도자가되도록하는 것이 더 낫다고 생각합니다 (누군가가 TDD를 읽고 읽고 누군가가 쌍 프로그래밍을 읽고 읽습니다). 그리고 그 사람들이 그 것들을 홍보하고 시험해 보도록합니다. 예, 둘 다 동시에 발생할 수 있지만 프로젝트 팀 전체에서 사용할 필요는 없습니다. 당신은 당신의 팀의 소규모 그룹이 프로그래밍 쌍을 이루고 그들의 경험을 다시보고 할 수 있습니다.

다른 팁

Pair Progamming은 새로운 연습, 특히 TDD를 배울 때 효과적입니다.

따라서 타협으로 둘 다 가질 수 있습니다. 민첩한 방식으로 점진적 으로이 작업을 수행하십시오. 먼저 페어 프로그래밍을합니다. 둘 중 더 쉽습니다. 쌍 프로그래밍 후 모든 관행은 배우기가 훨씬 쉬워지고 팀이 더 빠르고 일관성을 높이고 채택 할 것입니다. 페어 프로그래밍은 채택 해야하는 첫 번째 엔진 링 관행이 아니라면 첫 번째 중 하나입니다. 효과적으로 수행해야합니다. 아래는 쌍 프로그래밍을 수행하는 방법에 대한 설명입니다.

페어링 된 프로그래밍은 소프트웨어를 개발할 때 개발 팀이 사용할 수있는 가장 강력한 관행 중 하나입니다. 두 개의 개발자와 함께 페어링은 단일 컴퓨터와 키보드를 사용하여 스토리 카드를 적극적으로 개발합니다. 관리자는 페어링 된 프로그래밍을 사용하면 프로그래밍 비용이 두 배가 될 것이라고 걱정합니다. 언뜻보기에, 그들이 왜 2-2 개발자들이 같은 작업을 함께 일하도록 요청 받고 있다고 생각할 수 있는지 이해할 수 있습니다. 그러나 실제로이 개발 기술을 사용하는 민첩한 팀은 초기 개발 비용의 약간의 증가 (유타 대학교 연구에 따르면 15%)가 결함 감소, 더 짧고 저렴한 테스트로 인해 상쇄되는 것 이상의 것으로 나타났습니다. 주기 및 생산 지원의 필요성 감소.

프로그래머가 쌍을 이루고 함께 일하는 것이 생산성을 향상시키는 것이 반 직관적 인 것처럼 보일 수 있지만,이 기술이 실제로 작동하는 이유는 여러 가지가 있습니다 ( "두 머리가 하나보다 낫습니다."이유는 다음과 같습니다.

  • 품질 향상 - 페어링은 코드 검토를 장려합니다. 타이핑을하면서 많은 실수가 잡히게됩니다. 페어링 된 프로그래밍은 코드의 품질에 전념하고 항상 버그를 식별하고 수정하기 위해 함께 협력하는 두 사람이 수행 한 연속 코드 검토를 의미합니다. 유타 대학교 (University of Utah)의 연구에 따르면 코드에서 발견 된 결함의 최종 결함 수는 쌍으로 작성된 코드에 대해 평균 15% 감소한 것으로 나타났습니다.
  • "고정"하는 시간이 줄어 듭니다. - 프로그래밍은 어렵습니다. 개발자들은 종종 해결책을 찾기 위해 고군분투하고 "고정 된"것보다 더 많은 시간을 소비합니다. 파트너가 아이디어를 브레인 스토밍하고 필요한 경우 도움을 구하는 데 동의하는 데 동의하면 솔루션을 찾기 위해 고정 된 비생산적인 시간의 양이 줄어 듭니다.
  • 산만에 소요되는 시간이 줄어 듭니다. 개발자는 개인 전화 통화에 시간을 보내거나 웹을 서핑하는 데 시간을 보내거나 파트너와 함께 일할 때 이메일 휴가를 보냅니다.
  • 다른 수준의 경험, 다른 문제 해결 스타일, 다른 보조 기술의 두 가지 관점이 문제에 적용됩니다. 유타 대학교 (University of Utah)의 연구는 또한 쌍으로 작성된 소프트웨어의 더 나은 전체 설계와 더 짧은 코드 길이를 확인했습니다.
  • 미지의 것에 대한 두려움이 적습니다. 다른 개발자와 짝을 이룰 때 혼자 일할 때보 다 문제를 해결하거나 새로운 기술을 다루는 것이 더 쉽습니다. 또한 시간이 지남에 따라 전체 응용 프로그램에 대한 이해가 훨씬 더 좋습니다. 결국, 프로젝트는 여러 사람이 페어링의 결과로 시스템의 각 부분을 이해하는 것으로 끝납니다.
  • 범위를 구축 할 가능성이 적습니다. 종종 개발자는 요구 사항에서 해결되지 않은 기능을 기꺼이 추가합니다. 쌍과 함께 일할 때, 두 번째 개발자는 자신의 파트너를 임무를 수행 할 가능성이 높습니다.
  • 팀 역학 향상 - 쌍을 이루는 접근 방식으로 인해 사람들은 함께 일하는 법을 배웁니다. 그들은 더 자주 말하고 더 나은 정보의 흐름을 경험합니다. 결과적으로 팀 역학이 향상됩니다. 실제로, 우리는 최고의 팀 빌딩 경험이 고객이 흥분하는 소프트웨어를 생산하기 위해 협력하고 있음을 발견했습니다. 모두가 성공적인 팀의 일원이되는 것을 좋아합니다.
  • 지식의 사일로 제거 - 도메인 지식, 코드 지식 또는 관행에 대한 지식은 팀을 통해 신속하게 전파됩니다.

팀이 페어링에 대해 편안하게 대면하면 TDD를 사용하십시오. 파괴는 다음과 같습니다.

TDD (Test-Driven Development)는 원하는 개선 또는 새로운 기능을 다루는 새로운 테스트 사례가 먼저 작성된 후 테스트를 통과하는 데 필요한 생산 코드가 구현되고 마지막으로 마지막으로 작성된 소프트웨어 개발 엔지니어링 실무입니다. 변경 사항을 수용하기 위해 소프트웨어가 리팩토링됩니다. 실제 개발 이전의 테스트 가용성은 변경 후 빠른 피드백을 보장합니다. 실무자들은 시험 중심 개발이 단순히 테스트 방법이 아니라 소프트웨어를 설계하는 방법이라고 강조합니다. 시험 중심 개발은 강력한 관행이며 수명주기 후반에 발견 된 결함 감소에 큰 기여를합니다. 새로운 팀은 TDD 실무자와의 경험과 짝을 이루거나 TDD 코칭을 받도록 강력히 권장됩니다.

테스트 중심의 개발을 위해서는 코드의 요구 사항을 정의하는 자동화 된 단위 테스트가 코드 자체의 각 측면에 작성해야합니다. 이 테스트에는 참 또는 거짓 인 주장이 포함되어 있습니다. 테스트를 실행하면 코드가 발전하고 재현 될 때 올바른 동작을 신속하게 확인합니다. Xunit 개념을 기반으로 한 테스트 프레임 워크는 자동화 된 테스트 케이스 세트를 작성하고 실행하는 메커니즘을 제공합니다. 테스트 중심 개발주기 : 다음 순서는 예제에 의한 책 테스트 중심 개발을 기반으로하며, 많은 사람들이 현대 형태의 개념에 대한 표준 소스 텍스트라고 생각합니다.

  1. 테스트를 작성하십시오. 시험 중심 개발에서 각 새로운 스토리 카드는 테스트를 작성하는 것으로 시작합니다. 이 테스트는 기능이 구현되기 전에 작성되었으므로 실패합니다. 테스트를 작성하려면 개발자가 기능의 사양과 요구 사항을 명확하게 이해해야합니다. 이는 요구 사항이 충족되는시기를 지정하기 위해 수락 기준이있는 스토리 카드를 통해 달성 될 수 있습니다. 이것은 또한 기존 테스트의 변하지 않거나 수정을 의미 할 수 있습니다. 이는 코드가 작성된 후 테스트 중심 개발과 단위 테스트 작성의 차별화 된 기능입니다. 코드를 작성하기 전에 개발자가 요구 사항에 초점을 맞 춥니 다.
  2. 모든 테스트를 실행하고 새로운 테스트가 실패했는지 확인하십시오. 이는 테스트 하네스가 올바르게 작동하고 새로운 테스트가 새로운 코드를 요구하지 않고 실수로 통과하지 않음을 확인합니다. 새로운 테스트도 예상되는 이유로 실패해야합니다. 이 단계는 테스트 자체를 부정적인 것으로 테스트합니다. 새로운 테스트가 항상 통과 할 가능성을 배제하므로 무가치합니다.
  3. 코드를 작성하십시오. 다음 단계는 테스트가 전달되는 일부 코드를 작성하는 것입니다. 이 단계에서 작성된 새 코드는 완벽하지 않으며 예를 들어, 테스트를 공격적인 방식으로 통과 할 수 있습니다. 이후 단계가 개선되고 연마되기 때문에 허용됩니다. 작성된 코드는 테스트를 통과하도록 설계된 것이 중요합니다. 더 이상 (따라서 테스트되지 않은) 기능은 예측되어야하며 어느 단계에서도 '허용'해야합니다.
  4. 자동화 된 테스트를 실행하고 성공한 것을 본다. 이제 모든 테스트 사례가 통과되면 프로그래머는 코드가 테스트 된 모든 요구 사항을 충족한다고 확신 할 수 있습니다. 이것은 사이클의 마지막 단계를 시작하는 좋은 지점입니다.
  5. 리팩터 코드. 이제 필요에 따라 코드를 정리할 수 있습니다. 테스트 사례를 다시 실행함으로써 개발자는 리팩토링이 기존 기능을 손상시키지 않는다고 확신 할 수 있습니다. 복제를 제거하는 개념은 모든 소프트웨어 설계의 중요한 측면입니다. 그러나이 경우 테스트 코드와 프로덕션 코드 사이의 복제를 제거하는데도 적용됩니다 (예 : 3 단계에서 테스트를 통과하기 위해 두 가지에서 반복 된 마법 번호 또는 문자열).

반복하다

또 다른 새로운 테스트로 시작하여 사이클을 반복하여 기능을 전달합니다. 단계의 크기는 개발자가 좋아하는 것만 큼 작거나 자신감이 더 커질 수 있습니다. 테스트를 만족시키기 위해 작성된 코드가 그렇게 빨리 그렇게하지 않으면 단계 크기가 너무 클 수 있으며 더 작은 테스트 가능한 단계를 대신 사용해야합니다. 외부 라이브러리를 사용할 때는 라이브러리가 버그가 많다고 믿을만한 이유가 없다면 라이브러리 자체를 효과적으로 테스트하는 것만 큼 작을 수있는 단순한 증분을 만드는 것이 중요합니다. 주요 프로그램이 작성됩니다.

개발 스타일 테스트 중심 개발을 사용하는 데는 다양한 측면이 있습니다. 예를 들어 "간단하고 바보 같은"(키스) 및 "당신은 필요하지 않을 것"(yagni)의 원칙이 있습니다. 테스트를 통과하는 데 필요한 코드 만 작성하는 데 중점을두면 디자인은 다른 방법에서 종종 달성하는 것보다 깨끗하고 명확 할 수 있습니다. 시험 중심 개발은 프로그래머가 먼저 테스트 사례에 실패해야합니다. 아이디어는 테스트가 실제로 작동하고 오류를 포착 할 수 있도록하는 것입니다. 이것이 표시되면 정상주기가 시작됩니다. 이것은 빨간색/녹색/리 팩터로 알려진 "테스트 중심 개발 만트라"로 만들어졌습니다. 테스트 중심 개발은 실패, 전달 및 리팩토링의 테스트 케이스를 추가하는 단계를 지속적으로 반복합니다. 각 단계에서 예상 테스트 결과를 받으면 프로그래머의 코드의 정신적 모델이 강화되고 자신감을 높이고 생산성을 높이면 생산성이 향상됩니다.

새로운 것을 배울 때 짝 프로그래밍이 큰 도움이 될 것이라는 당신의 말은 절대적으로 옳습니다.두 가지 모두를 위해 열심히 노력해야 한다는 점에 동의합니다.

아마도 관리자에게 이를 설명하는 가장 좋은 방법은 이 두 가지 새로운 사항을 동시에 도입하도록 요청하지 않는 것입니다.대신, TDD 구현을 시작하는 가장 효율적인 방법은 작업을 완료하는 동시에 두 명의 개발자를 "TDD 조사 팀"으로 삼아 함께 작업하여 적절한 도구를 설정하고, 기술을 테스트하고 이를 환경에 적용하기 위해 수행해야 할 작업이 무엇인지 파악합니다.작업이 완료되고 약간의 경험이 있는 두 사람이 있으면 그들을 나누어서 며칠 동안 다른 개발자와 함께 앉아 다른 개발자가 새로운 기술에 대한 속도를 높일 수 있도록 하십시오.모든 개발자가 TDD를 배울 때까지 반복합니다.

당신은 설득하지 않습니다. 둘 다 함께 작동한다고 생각하는 이유를 말하고,이를 확인하는 일부 데이터를 제시하고, 결정하게하십시오. 모든 사람에게 좋은 생각이라고 설득해야한다면 아무도 그것을 너무 잘 받아들이지 않을 것이라고 내기하고 있습니다. 시범 반대.

개인적으로 나는 쌍 프로그래밍이 경험이 많고 경험이없는 한 사람과 가장 잘 작동한다는 것을 알았습니다.

즉, 나는 균등하게 숙련 된 능력을 갖기보다는 프로그래머의 기술/exp의 차이를 목표로합니다.

경험이 많을수록 설명에서 더 많이 빠져 나가고 생각이없는 사람들은 아이디어를 튀기고 '모범 사례'를 선택할 수있는 기회를 얻는 반면, 생각을 구조화해야합니다.

TDD에 관해서는, 나는 큰 팬입니다. EXP는 경험이없는 사람들에게 실제로 테스트의 요점을 이끌어내는 데 도움이되기 때문에 도움이됩니다. 즉, 모든 것을 절대적으로 테스트하고 싶지 않습니다 ... 초점이 추가됩니다. 종종 사람들은 자신이 달성하려는 것에 초점을 맞추지 않고 시험을 쓰고 있습니다.

단위 테스트는 필수 IMO입니다 ... 결국, 일부 직원은 2 년 안에 거기에 있지 않을 것입니다. 기능을 확인할 것이 없다면 기존 코드를 어떻게 변경할 수 있습니까?

글쎄, 관리자에 따라 XP 문헌에서 이러한 관행이 상호 의존적이라는 주장을 지적 할 수 있습니다. 예를 들어, 단단한 단위 테스트가없는 경우 무자비하게 리팩터를 리팩터링하지 마십시오.

페어링은 "모든 생산 개발이 쌍으로 이루어질 것"이 아니라 새로운 어려운 문제에 대한 공동 작업과 같이 TDD를 알아 내기위한 목적으로 만 점진적으로 접근 할 것을 제안합니다.

한 연습에는 다른 연습이 필요하지 않지만 한 번에 조금씩 두 가지를 소개하는 '비열한'방법이 있습니다.

사용 가능한 Xunit 프레임 워크 중 하나를 사용하여 TDD를 구현한다는 목표부터 시작하십시오. 호환 가능한 동료를 찾아 하루에 약 1 시간 동안 기꺼이 당신과 함께 일할 것인지 물어보십시오. "Shawn, 나는이 새로운 도구를 시도하고 있습니다. 제가 제대로하고 있는지 확인하도록 도와 주시겠습니까?" 정말 잘 작동합니다.

Shawn과 며칠 후 Susan과 반복합니다 ...

어쨌든 그것을하십시오. 관리자가 페어링을 잡으면 Magic Words "Code Review"라고 말하십시오.
가정 : 분명히 쌍은 징계/집중해야하며 세션이 끝날 때 작업 코드를 생성해야합니다.

코드 기반의 기존 버그에주의를 기울이는 테스트를 작성하십시오. 그런 다음 상사에게 보여주십시오. 갑자기 TDD가 좋은 아이디어라는 데 동의 할 수 있다고 생각합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top