디버깅에 더 적은 시간을 소비하는 방법? [닫은]


15

파레토 규칙에 따르면, 프로그래머는 자신의 시간의 20 % 만 실제로 유용한 것들에 소비합니다.

나는 80 %의 시간을 디버깅하면서 모든 것을 작동시키기 위해 작은 것들을 수정했습니다.

디버깅 시간을 줄일 수있는 방법이 있습니까?


9
이것이 내가 파레토 원리를 어떻게 해석 할 것인지 잘 모르겠습니다.
c_maker

6
<meme> TDD를 살펴보십시오. </ meme>
StuperUser

1
디버깅 때 실제로 무엇을합니까 ?

3
당신은 세부 사항에 관심에 더 많은 시간을 할애 할 필요가

1
단순히 코드를 살펴보면 얻을 수있는 것이 많습니다. 더 나은 방법으로, 충동을 느끼면 의견을 쓰면 나중에 실수를 알아 채기가 더 쉬워 질 것입니다.
Joey Adams

답변:


5

코드 AGDA 또는 COQ . 코드가 컴파일되면 작동합니다. 하드 코어가 너무 약하면 Haskell 또는 F #과 같이 약한 유형의 언어를 사용하는 언어를 선택하십시오.

그러나 여전히 대부분의 경우 코딩 시간과 테스트 및 디버깅 시간의 80 %를 훨씬 더 생산적으로 사용하게됩니다. 일주일의 100 %는 시간의 20 %를 훨씬 초과합니다. 디버깅이 작업을 수행하는 데 필요한 것이라면 디버깅은 시간 낭비가 아니므로이 비율을 "개선"하는 데 방해가되어서는 안됩니다.


1
단지 무언가가 실행된다고해서 버그가 없다는 것을 의미하지는 않습니다. 버그는 종종 코드가 잘못된 일을 한 결과입니다.
HLGEM

3
@HLGEM, downvoting하기 전에 Agda와 Coq에 대한 자세한 내용을 읽으십시오. 코드를 컴파일하는 경우입니다 보장입증 의 사양은 말한다 정확하게 할 수 있습니다. 물론 사양에도 버그가있을 수 있지만 이런 종류의 문제를 수정하는 것을 "디버깅"이라고 부르지는 않습니다.
SK-logic

2
@HLGEM, "디버깅"에 대한 당신의 개념은 상당히 창의적이고 주류와는 거리가 멀습니다. 어쨌든이 접근법을 사용하면 코딩과 "디버깅"사이의 비율은 20/80에서 멀어집니다. 당신의 downvote를 설명해주세요.
SK-logic

1
@HLGEM, OP 요구 사항 목록에 없습니다. 개발자 수, 담당자 등은 알려진 바가 없습니다. 유일한 질문은 "20/80 비율을 측정하는 방법"뿐이며 정적으로 검증 된 언어를 사용하는 것이 가장 분명한 대답입니다. 그러나 이미 말했듯 이이 대답은 매우 드문 경우에만 적용 가능하며 일반적으로 20/80 규칙을 고수하는 것이 훨씬 나은 옵션입니다.
SK-logic

1
@ uhbif19 Knuth는 그 말을 할 때 유머러스 함을 의미했습니다. 그가 무슨 뜻인지 알아?
Phil

44

단위 테스트.

단위 테스트 적용을 시작한 후 내가 작성한 코드가 더 잘 구조화되었다는 것을 알았습니다. 그러면 버그를 피하고 발견하기가 쉬워졌습니다. 디버깅에 시간이 덜 들었지만 단위 테스트 작성에 더 많은 시간을 보냈습니다.

또한 단위 테스트에 투자 한 시간이 디버깅보다 투자 수익률이 더 우수하다고 생각합니다. 디버깅 세션 후 방금 코드를 수정했습니다. 동일한 버그가 몇 주 후에 나타날 수 있으며 다시 디버깅해야합니다. 단위 테스트를 작성하면 버그가 단위 테스트로 문서화되고 나중에 회귀 테스트로 작동합니다. 버그가 다시 나타나면 단위 테스트에서이를 알 수 있습니다.


나는 단위 테스트를 사용하고 당신에게 완전히 동의합니다. 그러나 모든 것을 테스트 할 수는 없습니다.
uhbif19

5
물론 넌 할 수있어. 잘하지 모든 하지만 모든 문제가. 인터페이스, 의존성 주입, 가짜 및 조롱 클래스 / 메서드를 사용하면 거의 모든 코드에 대한 테스트를 작성할 수 있습니다.
Fredrik

8
@Fredrik, a + b코드 조각 조차도 단위 테스트를 제대로 수행 할 수 없습니다 (테스트에서 산술 데이터 유형의 전체 범위를 다루지 않는 한).
SK-logic

"디버깅 세션 후 코드를 수정했습니다." -- 정말? 디버깅 세션 후에 방금 더 많은 버그를 도입했다고 생각합니다. 버그가 어디에 있는지 모릅니다.
B 세븐

35
  • 코드가 처음에 작동하는지 알 수 있도록 단위 테스트.
  • 코딩 할 내용을 알 수 있도록 최소한의 사전 디자인이 필요합니다.
  • 두 개의 머리가 하나보다 낫고 네 개의 눈이 두 개보다 낫기 때문에 코드 검토. 다른 사람에게 코드를 설명하려고해도 많은 문제가 드러납니다.
  • 버그를 일으킨 변경 사항을 신속하게 격리 할 수있는 버전 관리.
  • 리팩토링 (refactoring) : 코드가 끔찍한 이해할 수없는 혼란으로 바뀌지 않도록합니다.
  • Robert C. Martin의 "Clean Code"를 읽고 그가 말한대로하십시오. 당신은 결과에 놀랄 것입니다.

5
정확히 – 단일 연습 (예 : 단위 테스트)은 크게 개선되지 않지만 연습조합은 가능합니다. 다시 말해 ...은 총알이 없습니다.
Michael

가능한 경우 TDD를 추가합니다.
Tom

1
실제로 깨끗한 코드와 리팩토링을 먼저 정렬했습니다. 단위 테스트는 버그를 조기에 발견하고 수정하는 데 유용하지만 버그 수를 줄이지 않습니다 (메모리에 새로운 것이 있지만 여전히 버그가있을 때 버그를 수정하므로 시간이 조금 줄어 듭니다). 반면에 깨끗한 코드를 작성하면 실제 버그 수가 줄어 듭니다.
Jan Hudec

1
@ JanHudec 리팩토링 + 깨끗한 코드 + 테스트 = TDD
Tom

1
@Tom : 그렇습니다. 그러나 그 부분마다 다른 효과가 있습니다. 깨끗한 코드를 작성하는 방법을 배우면 테스트없이 디버그 시간을 줄일 수 있습니다. 테스트를 통해 모듈을 사용하기 전에 모듈을 테스트 할 수 있으므로 리팩토링 할 때 동작을 수정하지 않았는지 확인할 수 있습니다. 이는 오래된 지저분한 코드를 정리하는 데 필요합니다.
Jan Hudec

8

단위 테스트는 버그를 도입하면 프로덕션 코드 이전에 버그가 발생할 수 있기를 바랍니다. 잘 작성된 단위 테스트는 정확히 어떤 버그가 발생했는지 알려줍니다.

그것은 대부분 당신을 얻을 것이지만, 프로젝트의 99.999 %에 대해서는 여전히 시간을 디버깅해야합니다. 내가 찾은 가장 좋은 것은 4 가지 일을하는 것입니다.

  1. 가능한 한 불변의 유형을 사용하십시오-어떤 값이 잘못되면 즉시 어디를 볼 것인지 (구성중인 곳) 정확히 알게됩니다.
  2. 코드에서 불변을 시행하십시오-값이 확실히 허용되지 않으면 값을 확인하고 진입 점에서 메소드 및 생성자에 대한 예외를 발생시킵니다. 이것을 불변 유형과 결합하면 유효한지 여부에 대한 특정 가정을 시작할 수도 있습니다.
  3. 적절한 로깅이 있는지 확인하십시오-조기에 받으십시오. 문제가 발생했을 때 많은 중요한 정보를 제공합니다. AOP는 여기서 잘 작동합니다. 나중에 생각하는 것은 일반적으로 약간 쓰레기입니다-프로젝트 설정의 일부로 일찍 가져옵니다.
  4. 코드베이스가 충분히 크거나 복잡한 경우에는 기본 요소를 사용하지 마십시오. 예를 들어 int를 사용하는 대신 'Age'라는 유형을 사용하십시오. 처음에는 약간 의미가 없어 보이지만, 순간적으로 무언가의 모든 사용을 추적 할 수 있다는 것은 큰 디버깅 승리입니다.

6

내 80 %는 디버그입니다. 간단한 버그를 수정하고 모든 작업을 수행하려고합니다.

단위 테스트를 작성하여 시작하고 가능한 한 높은 범위를 갖도록 노력하십시오. 누군가 TDD를 언급했지만 BDD 와 함께 갈 것입니다 .

결국 복잡한 버그를 디버깅하는 데 80 %를 소비 할 가능성이 높습니다.


6

디버깅 시간을 덜 소비하는 방법? 적은 코드를 작성하십시오.

코드를 작성하는 한 코드를 디버깅해야합니다. 단위 테스트 등은 엄청나게 도움이되지만 그 필요성을 완전히 제거하지는 않을 것입니다.


4

코드 작성을 시작하기 전에 무엇과 이유를 이해하십시오. 그런 다음 방법론을 일관되게 사용하십시오. 어떤 방법론을 선택 하는가는 방법론의 일관된 반복 사용만큼 중요하지는 않습니다. 일관되게 좋은 결과를 원한다면 일관되게 좋은 일을해야하며 이러한 결과를 얻는 첫 번째 단계는 "광기의 방법"입니다. 문제를 식별 할 때 필요에 따라 방법론을 조정할 수 있으며 시간이 지남에 따라 개발 프로세스를 개선하고 버그와 더 새롭고 의미있는 개발을 개선 할 수 있습니다.


3

컴파일하기 전에 코드를주의해서 읽으십시오. 구문과 기능에 대해 매우주의 깊게 읽으십시오. 놀랍도록 유익 할 수 있으며 코드 섹션이 너무 복잡한 경우에도 좋은 지표입니다.


전적으로 동의합니다. 코드를 작성한 직후에 읽으면 복사하여 붙여 넣기 오타와 같은 명백한 버그가 매우 빨리 드러날 수 있습니다 (나중에 찾기가 어려울 수 있음).
jirkamat

3

대부분의 답변은 디버깅해야하는 문제의 수를 줄이는 방법에 중점을 둔 것으로 보이며 이는 귀중합니다. 그러나 디버깅은 항상 필요하므로 디버깅 속도를 높이는 방법을 살펴 보는 것이 좋습니다.

  • 버전 관리 소프트웨어 사용 방법을 숙지하십시오.

    • 브랜치를 사용하면 개발 영역을 분리하는 데 도움이되며 버그가있는 개발 영역과 그렇지 않은 개발 영역을 확인할 수 있습니다.
    • VCS에서 이등분을 사용하는 방법에 대해 알아보십시오. 다른 VCS를 만들기에는 너무 어렵지 않아야합니다.) 이렇게하면 버그를 도입 한 코드 변경 범위를 좁히고 디버거를 가리킬 위치를 알 수 있습니다. 이 bisection 프로세스는 버그에 대한 테스트가있는 경우 더 빠르며 원자 커밋을 연습 할 경우 어떤 커밋에 문제가있는 변경 사항이 포함되어 있는지 아는 것이 더 유용합니다.
  • 사용하는 프로그래밍 언어에 대한 이해를 향상시킵니다.

    • 프로그래밍 언어에 관한 책, 블로그 및 코드를 읽으십시오.
    • 버그를 수정할 때마다 코드가 작동하지 않는 이유와 수정 된 이유를 철저히 이해해야합니다. 시간이 지남에 따라 당신은 당신의 언어로 많은 문제를 배우게 될 것이며, 그것은 당신이 그들의 문제를 피하고 그들이 다시 발생할 때 그 증상을 발견하는데 도움이 될 것입니다.
  • 논리적으로

    • 동작이 변경되어 어떤 동작으로 인해 변경이 발생했는지 알 수없는 경우 한 번에 둘 이상을 변경하지 마십시오.
    • 가정을 확인하십시오.

2

단위 테스트에 대한 설명에 추가하지만 코드를 지원하기 위해 코드가 분리 된 경우 (예 : MVC) 정말 좋습니다. MVC (또는 유사한) (레거시 프로젝트)를 구현할 수없는 경우 UI에 대해 단위 테스트가 전혀 작동하지 않습니다. 그런 다음 자동화 된 UI 테스트 (Microsoft Coded UI Tests, WaitN)를 추가하면 코드의 해당 부분에서 오류가 줄어 듭니다.

또한 정적 분석 도구 (예 : FxCop / Microsoft Code Analysis, Resharper, JustCode for MS world)를 실행하는 것이 좋습니다. 이들은 어리석은 디버깅 작업을 줄이고 비즈니스 로직 디버깅에 더 집중할 수있는 모든 종류의 일반적인 코딩 문제를 찾을 수 있습니다.


2

작동시킨 다음 빠르게 만들고 예쁘게 만듭니다. 대부분의 버그는 완전히 최적화 된 코드 라인에서 초기 최적화 또는 리팩토링에서 발생합니다. 객체 방향을 사용하는 경우 반복하지 말고, 특히 분석법이 여전히 제약 조건에서 작동하는 경우 간단하게 유지하고 항상 값 범위의 상태를 확인하십시오. 실수를 줄이는 데 도움이되지는 않지만 버그를 더 빨리 발견하는 데 도움이되므로 디버깅에 시간이 덜 걸립니다.


1
"대부분의 버그는 ..."주장이 잘 들리지만이를 뒷받침 할 증거가 있습니까? "대부분의 버그는 잘못 지정된 요구 사항이나 명확한 디자인의 부족에서 비롯된 것"이라고 말하면 똑같이 설득력이 있다고 생각합니다. 진술을 뒷받침하는 연구에 대한 링크 또는 인용을 추가해야합니다.
Caleb

2

나는 최근이 문제에 대해 많은 생각을 해왔다. 간단한 대답은 Don Norman의 The Everyday Things의 디자인이다. 제품을 디자인하는 것처럼 코드를 작성하십시오.

역설적으로 좋은 디자인은 오류를 최소화합니다. 그것은, 당신이 이미하고있는 몇 가지를 의미합니다 ( 왜 그런지 정확히 알지 못할 수도 있습니다 ).

-이름은 직관적으로 작동합니다. 이것은 공식적으로 여유로 알려져 있습니다. 즉, 버튼을 누를 수 있고, 레버를 전환 할 수 있고, 당기는 핸들 등이있다.

나쁜 코드를 작성하기 어렵게 만드십시오. 잘못된 입력을 확인하고 나중에보다 빨리 오류를 발생시키고 적절한 경우 헝가리어 앱을 사용하십시오.이를 잠금 기능이라고합니다.

적절한 추상화를 사용하십시오. 단기 기억력이 약합니다.

-문서는 분명히 중요하지만 코드를 올바르게 사용하는 것이 가장 효과적입니다. 즉, 잘 설계된 제품에는 설명서가 필요하지 않습니다. (이를 보는 가장 확실한 방법은 나쁜 예를 보는 것입니다. 즉, 손잡이가 달린 문은 밀어야합니다.)

단위 테스트. 이것들은 실제로 오류가 발생하는 것을 막지 못하고 버그가있는 곳을 명확하게하고 정신력을 제공합니다.

나는 더 많은 원칙을 놓치고 있다고 확신하지만, 오류 설계에 대해 읽으십시오.


1

디버깅을 줄이는 가장 좋은 방법은 코딩 할 때 집중하고 속도를 늦추는 것입니다. 이것은 당신이 저지른 실수를 보게합니다!


1

위에서 제안한 단위 테스트를 전적으로 지원하지만 TDD 또는 BDD는 문제와 해결책에 대해 먼저 생각해야하므로 큰 가치가 있습니다.

그러나 개인적으로 몇 분 동안 조용히 앉아 문제에 대해 생각하고 문제에 접근하는 방법과 각 접근 방식의 장단점을 생각하면 내 코드 품질이 놀라워지고 혼란에 빠질 수 있습니다.

때때로 한 장의 종이에 빠르게 낙서하면 더 큰 연결된 퍼즐 조각을 볼 수 있습니다.

방금 머리를 숙이고 키보드를 두드리면 최악의 코드를 작성합니다. 약간의 생각과 묵상은 세상을 변화시킵니다.

추신. 큰 스펙을 작성하는 데 몇 시간이 아니라 5 분에서 10 분 정도를 의미합니다.


1

좋은 답변은 이미 있지만 다른 사람들이 말한 것에 추가하여 더 많은 음식을 제공합니다.

실수로부터 배우십시오. 같은 것을 계속 반복해서 만들지 마십시오.

프로그래밍시 엣지 케이스를 다루어야합니다. 버그가 자주 발생하는 곳입니다.

요구 사항에주의하십시오. 작동하지만 요구 사항이 지정된 것을 수행하지 않더라도 버그입니다.

예외 로그는 6 개월 후 문제가 발생했을 때 실제로 도움이 될 수 있습니다. 예외를 기록하는 습관을들이십시오.


0

내 두 가지 주요 생각은 1) 예기치 않은 일을 할 때 실패하는 더 나은 코드를 작성하십시오.

내 코드가

if(value!=null) throw new NotImplementedException();
if(obj.v>0) throw new Exception(); //sometimes i dont write NotImplementedException
if(value=="thing") throw ...;

해당 코드 조각을 실행할 때마다 예외가 발생하여 디버거가 중지되어 새로운 기능으로 코드를 작성하거나 조건을 피할 수 있습니다.

호출 스택, 중단 점 (조건 포함), 즉각적인 창 (프롬프트 또는 repl 창이라고도 함), 'watch'변수 및 기타로 혼란을 더 잘 디버깅 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.