이 질문에는 이미 답변이 있습니다. :
답변
버그없는 애플리케이션에 가장 가까운 더 비쌉니다. 100 % 코드 커버리지를 목표로하는 것과 같습니다. 0 %에서 95 %, 95 %에서 99 %, 99 %에서 99.9 %까지 동일한 시간과 비용을 소비합니다.
이 추가 0.1 %의 코드 적용 범위 또는 품질이 필요합니까? 원자로의 냉각 시스템을 제어하는 소프트웨어 제품을 개발하고 있다면 아마도 그렇습니다. “비즈니스 애플리케이션에서 작업하는 경우에는 그렇지 않을 것입니다.
또한 고품질 소프트웨어를 만들려면 가 필요합니다. 매우 다른 접근 방식입니다 . 비즈니스 앱을 작성하는 데 평생을 바친 개발자 팀에게 거의 버그가없는 애플리케이션을 만들도록 요청할 수는 없습니다. 고품질 소프트웨어에는 공식 증명 는 매우 높은 비용으로 인해 비즈니스 앱에서 사용하고 싶지 않은 것입니다.
에서 설명했듯이 내 기사 :
-
비즈니스 앱은 “생명에 중요한 소프트웨어에 필요한 품질을 목표로해서는 안됩니다. 이러한 비즈니스 앱이 수시로 실패하는 경우에는 그렇지 않기 때문입니다.” 중요합니다. 아마 모든 대기업의 웹 사이트에서 버그와 다운 타임을 보았습니다. 아마존은 유일한 예외입니다. 이 다운 타임과 버그는 성 가시고 회사에 매달 수천 달러의 비용이들 수도 있지만 수정하는 데 훨씬 더 많은 비용이들 것입니다.
-
비용이 가장 중요합니다. 실용적으로 공부해야합니다. 5,000 명의 고객에게 영향을 미치고 그 고객이 영원히 떠날 정도로 중요한 버그를 상상해 봅시다. 이것이 중요합니까? 예? 더 많이 생각하십시오. 각 고객이 연간 10 달러를 지불하고 있다고 말하면 어떻게 될까요? 버그 수정에 거의 10 만 달러가 들었나요? 이제 버그 수정이 훨씬 덜 흥미로워 보입니다.
이제 귀하의 질문에 구체적으로 답해 보겠습니다.
그렇게 많은 테스트를 거친 후에도 버그가보고되는 이유는 무엇입니까? 이것이 우리의 요구 사항 문제입니까? 우리 고객이 우리가 제공하는 것에 만족하지 않는 것 같습니까? 뭔가 잘못 되었나요?
많은 일이 잘못 될 수 있습니다. 테스트 란 실제 자동화 된 테스트를 의미합니까? 그렇지 않다면 이것은 그 자체로 큰 문제입니다. 테스터가 요구 사항을 이해합니까? 고객과 정기적으로 의사 소통합니까? 반복 당 최소 한 번은 기껏해야 팀원이 즉시 현장에서 고객 담당자에게 연락 할 수 있습니다. ? 반복이 충분히 짧습니까? 개발자가 자신의 코드를 테스트하고 있습니까?
위에 링크 된 올바른 내용을 작성 문서와 마찬가지로 버그 보고서를 작성하고 연구합니다. 이 버그가 처음에 나타난 이유와 각 테스터가 놓친 이유 . 이를 통해 팀 프로세스의 격차에 대한 몇 가지 아이디어를 얻을 수 있습니다.
고려해야 할 중요한 사항은 다음과 같습니다. 고객이 버그 수정 비용을 지불하고 있습니까? 그렇지 않은 경우 많은 것을 고려하도록 권장 할 수 있습니다. 버그가 될 수 있습니다. 버그에 소비 한 시간에 대해 그에게 비용을 지불하면 버그 보고서 수가 상당히 줄어 듭니다.
완전히 버그가 없는지? 프로세스는 무엇입니까? 사소한 버그가있는 응용 프로그램을 배포 할 수없는 이유는 무엇입니까? 우리가 완벽 주의자 여야하나요?
나. 지난 주말에 직접 앱을 작성했는데 지금까지 버그를 찾지 못했습니다.
버그는보고되었을 때만 발생하는 버그입니다. 따라서 이론적으로 버그없는 애플리케이션을 갖는 것은 전적으로 가능합니다. 만약 아무도 사용하지 않는다면 버그를보고 할 사람이 없을 것입니다.
이제, 완벽하게 일치하는 대규모 애플리케이션을 작성합니다. 사양이 정확하고 입증 된 경우 (위에 언급 된 공식 증명 참조)은 다른 이야기입니다. 이것이 생명에 중요한 프로젝트 인 경우 목표 가되어야합니다 ( “응용 프로그램을 의미하지 않음” 버그가 없습니다 .
현재 시나리오가 올바른 개발 및 테스트 프로세스입니까? 개발자, 테스터 및 클라이언트가 함께 최대한의 이익을 얻을 수있는 효율적인 방법이 아니라면 서로를 이해하기 위해?
-
, 그들은 통신해야합니다. 이것은 내가 본 대부분의 회사에서 일어나는 일이 아닙니다. 대부분의 회사에서 프로젝트 관리자는 고객 (때로는 담당자에게)과 대화하는 유일한 사람입니다.그런 다음 개발자, 인터랙션 디자이너, 아키텍트, DBA 및 테스터와 요구 사항에 대한 이해를 (때로는 부분적으로) 공유합니다.
이것이 고객 (또는 고객의 대리인)이 다음을 수행하는 데 필수적인 이유입니다. 팀의 모든 사람이 접근 할 수 있거나 (Agile 접근 방식) 한 사람이 팀의 몇 명의 다른 사람과 만 의사 소통하고 정보를 전체 팀과 공유 할 수있는 방식으로 할 수있는 권한을 부여하는 공식적인 의사 소통 수단을 보유해야합니다. 모든 사람이 동일한 정보를 갖도록합니다.
-
개발 및 테스트를 수행하는 많은 프로세스가 있습니다. 회사와 팀을 정확하게 알지 못하면 어떤 프로세스를 수행해야할지 결정할 방법이 없습니다. 컨설턴트를 고용하거나 충분히 숙련 된 프로젝트 관리자를 고용하는 것이 좋습니다.
댓글
답변
모든 버그가 동일하게 생성되는 것은 아니므로 왕겨에서 밀을 분류해야합니다.
기대 사항
많은 버그는 단순히 소프트웨어가 수행하는 작업과 최종 사용자가 기대하는 작업이 부족하기 때문에 발생합니다. 이러한 기대는 다른 소프트웨어 사용, 잘못된 문서, 과도한 영업 직원, 소프트웨어의 작동 방식 등 여러 영역에서 비롯됩니다.
범위 확대
더 많이 제공할수록 버그 가능성이 커집니다. 많은 버그는 단순히 새로운 기능을 통해 발생합니다. X & Y를 제공하지만 고객은 뒷면에 Z도 제공해야한다고 말합니다.
문제 도메인 이해
많은 버그는 문제 도메인을 제대로 이해하지 못한 단순한 이유 때문에 발생합니다. 모든 고객은 자신의 비즈니스 규칙, 전문 용어 및 작업 방법을 가지고 있습니다. 이것의 대부분은 어디에도 문서화되지 않을 것입니다. 그것은 단지 사람들의 머리 속에있을 것입니다. 세계 최고의 의지로이 모든 것을 한 번에 담을 수는 없습니다.
그래서 … 어떻게해야할까요.
자동 단위 테스트
많은 버그가 일부 코드 변경 또는 기타의 예기치 않은 부작용으로 도입되었습니다. 자동화 된 단위 테스트가 있으면 이러한 문제를 해결하고 처음부터 더 나은 코드를 생성 할 수 있습니다.
테스트는 제공된 데이터만큼 우수하므로 문제 도메인을 완전히 이해해야합니다.
p>
코드 커버리지
이것은 자동화 된 단위 테스트와 함께 진행됩니다. 가능한 한 많은 코드를 테스트해야합니다.
강의 알아보기
미치는 똑같은 일을 몇 번이고 반복하며 다른 결과를 기대합니다
마지막 실패의 원인을 이해하십니까? 당신 은요? 정말요? 문제 발생하지만 진정한 루트 소스는 무엇입니까? 잘못된 데이터? 사용자 오류? 디스크 손상? 네트워크가 중단 되었습니까?
어떤 형태로든 해결 과정을 거치지 않고 동일한 문제가 반복해서 발생하는 것만 큼 클라이언트를 괴롭히는 것은 없습니다.
답변
소프트웨어 개발 초기부터 결함이 존재했습니다. 결함이 유용성 또는 기능에 영향을 미치는 정도와 심각도를 질문으로 말하기는 어렵습니다.
결함없는 프로그램이 존재하지만 사소하지 않은 시스템에는 결함이 있습니다.
p>
어떤 종류의 우선 순위를 결정해야하며 결함의 원인을 조사해야 할 것입니다. 결함이 도입 된 위치에 대해 논의해야 할 것입니다. 간단한 Q로 이러한 문제에 대해 논의 할 내용이 너무 많습니다. div id = “68dbcd8c49″>
게시물입니다.
품질 문제가있는 조직의 인과 분석 및 수정 프로세스에 대한 전체 책이 저술되었습니다.
그래서 제가 추천하는 것은 : (특정 순서 없음)
- 결함 추적 시스템을 아직 찾지 못한 경우 구현
- 결함 심각도 분류 방법 결정
- 고객의 기대를 충족하지 못하는 이유 (개발자, QA, 고객 등) 파악
- 5 가지 이유와 같은 몇 가지 연습에 대해 알아보고 유사한 조사를 수행합니다. 결함의 일부 원인에 대해 설명합니다.
어플리케이션이라고 부르는 것에 따라 다릅니다.
어떤 상황에서도 실시간 동작이 정확히 일치하는지 확인해야하는 대화 형 프로그램을 의미한다면 기본적으로 버그가 없음을 증명하는 것은 불가능합니다. 그것에. 중단 문제 를 해결할 수 있다면 가능할 것이라고 생각하지만 할 수는 없습니다.
하지만 “그러한 입력은 결국 그러한 최종 상태를 산출 할 것입니다”라는 진술이 있으면 불변 . 그뿐 아니라 하위 문제에서 정확성 증명을 세분화 할 수 있습니다. 각 문제는 모든 상황에서 올바르게 작동하는 것으로 비교적 쉽게 입증 될 수 있습니다. (일반적으로 얼마나 많은 시간이 & 메모리에 걸리는지에 대해 매우 정확할 수는 없지만)
이러한 기술은 기본적으로 어느 곳에서나 가능합니다. 프로그래밍 언어 ( Malbolge 와 같은 일부 난해한 언어는 그 !를 반증하려고합니다!)하지만 모든 명령형 언어에서는 매우 빠르게 지저분 해집니다. 많은 정보를 꼼꼼하게 추적해야하기 때문에 암시 적 프로그램 상태. 기능적 언어 1 에서 증명은 훨씬 더 멋지게 보이는 경향이 있습니다 ( 순수 언어 또는 순수 기능적 언어 하위 집합). 그래도 특히 동적 유형의 경우 허용되는 입력에 대한 많은 요구 사항을 작성해야합니다. 이는 물론 강력한 정적 유형 시스템의 주요 이점 중 하나입니다. 요구 사항은 코드에 바로 있습니다.
이상적으로는 즉, 실제로 O “Caml 또는 Haskell 프로그램에는 비 전체 함수 , 즉 올바른 유형에도 불구하고 특정 입력에 대해 충돌 / 정지 / 던지기하는 함수 2 . 이러한 언어는 매우 유연한 유형 시스템을 가지고 있지만 때로는이를 사용하여 완전히 제한하는 것이 불가능하기 때문입니다.
종속 유형 언어 입력 ! 이들은 필요에 따라 정확하게 유형을 “계산”할 수 있으므로 정의하는 모든 것은 필요한 모든 것을 증명하는 유형 서명을 정확히 가질 수 있습니다. 실제로 종속 유형 언어는 대부분 증명 환경 em으로 학습됩니다. >. 불행히도 그들 중 어느 것도 실제로 프로덕션 소프트웨어를 작성하지 않는다고 생각합니다. 실제 응용 프로그램의 경우 완전히 버그를 방지 할 수있는 가장 가까운 방법은 다음과 같은 전체 기능을 사용하여 Haskell로 작성하는 것입니다. 가능합니다. 기능적 설명에 관해서 만 버그 방지 –에 가깝게 예쁘게 합니다. Haskell “모나드를 사용하여 IO를 처리하는 고유 한 방법은 매우 유용한 증명을 제공하지만 일반적으로 시간이 얼마나 걸리는지에 대해서는 알려주지 않습니다. 끝. 사용자의 POV에서 특정 상황에서 기하 급수적 인 시간이 걸릴 수 있습니다. – 프로그램이 완전히 멈춘 것처럼 심각한 버그 일 수 있습니다.
1 또는 더 일반적으로 설명 적 언어입니다. 논리적 언어에 대한 경험은 많지 않지만 그와 비슷하게 증명할 수 있다고 생각합니다. 안부.
2 올바른 유형이 아닌 경우 컴파일러는 해당 언어에서 허용하지 않습니다 . 이미 많은 버그를 제거했습니다. (또한 Hindley-Milner 유형 추론 덕분에 실제로 프로그램을 더 간결하게 만듭니다!)
댓글