파레토 규칙에 따르면, 프로그래머는 자신의 시간의 20 % 만 실제로 유용한 것들에 소비합니다.
나는 80 %의 시간을 디버깅하면서 모든 것을 작동시키기 위해 작은 것들을 수정했습니다.
디버깅 시간을 줄일 수있는 방법이 있습니까?
파레토 규칙에 따르면, 프로그래머는 자신의 시간의 20 % 만 실제로 유용한 것들에 소비합니다.
나는 80 %의 시간을 디버깅하면서 모든 것을 작동시키기 위해 작은 것들을 수정했습니다.
디버깅 시간을 줄일 수있는 방법이 있습니까?
답변:
코드 AGDA 또는 COQ . 코드가 컴파일되면 작동합니다. 하드 코어가 너무 약하면 Haskell 또는 F #과 같이 약한 유형의 언어를 사용하는 언어를 선택하십시오.
그러나 여전히 대부분의 경우 코딩 시간과 테스트 및 디버깅 시간의 80 %를 훨씬 더 생산적으로 사용하게됩니다. 일주일의 100 %는 시간의 20 %를 훨씬 초과합니다. 디버깅이 작업을 수행하는 데 필요한 것이라면 디버깅은 시간 낭비가 아니므로이 비율을 "개선"하는 데 방해가되어서는 안됩니다.
단위 테스트.
단위 테스트 적용을 시작한 후 내가 작성한 코드가 더 잘 구조화되었다는 것을 알았습니다. 그러면 버그를 피하고 발견하기가 쉬워졌습니다. 디버깅에 시간이 덜 들었지만 단위 테스트 작성에 더 많은 시간을 보냈습니다.
또한 단위 테스트에 투자 한 시간이 디버깅보다 투자 수익률이 더 우수하다고 생각합니다. 디버깅 세션 후 방금 코드를 수정했습니다. 동일한 버그가 몇 주 후에 나타날 수 있으며 다시 디버깅해야합니다. 단위 테스트를 작성하면 버그가 단위 테스트로 문서화되고 나중에 회귀 테스트로 작동합니다. 버그가 다시 나타나면 단위 테스트에서이를 알 수 있습니다.
a + b
코드 조각 조차도 단위 테스트를 제대로 수행 할 수 없습니다 (테스트에서 산술 데이터 유형의 전체 범위를 다루지 않는 한).
단위 테스트는 버그를 도입하면 프로덕션 코드 이전에 버그가 발생할 수 있기를 바랍니다. 잘 작성된 단위 테스트는 정확히 어떤 버그가 발생했는지 알려줍니다.
그것은 대부분 당신을 얻을 것이지만, 프로젝트의 99.999 %에 대해서는 여전히 시간을 디버깅해야합니다. 내가 찾은 가장 좋은 것은 4 가지 일을하는 것입니다.
대부분의 답변은 디버깅해야하는 문제의 수를 줄이는 방법에 중점을 둔 것으로 보이며 이는 귀중합니다. 그러나 디버깅은 항상 필요하므로 디버깅 속도를 높이는 방법을 살펴 보는 것이 좋습니다.
버전 관리 소프트웨어 사용 방법을 숙지하십시오.
사용하는 프로그래밍 언어에 대한 이해를 향상시킵니다.
논리적으로
단위 테스트에 대한 설명에 추가하지만 코드를 지원하기 위해 코드가 분리 된 경우 (예 : MVC) 정말 좋습니다. MVC (또는 유사한) (레거시 프로젝트)를 구현할 수없는 경우 UI에 대해 단위 테스트가 전혀 작동하지 않습니다. 그런 다음 자동화 된 UI 테스트 (Microsoft Coded UI Tests, WaitN)를 추가하면 코드의 해당 부분에서 오류가 줄어 듭니다.
또한 정적 분석 도구 (예 : FxCop / Microsoft Code Analysis, Resharper, JustCode for MS world)를 실행하는 것이 좋습니다. 이들은 어리석은 디버깅 작업을 줄이고 비즈니스 로직 디버깅에 더 집중할 수있는 모든 종류의 일반적인 코딩 문제를 찾을 수 있습니다.
작동시킨 다음 빠르게 만들고 예쁘게 만듭니다. 대부분의 버그는 완전히 최적화 된 코드 라인에서 초기 최적화 또는 리팩토링에서 발생합니다. 객체 방향을 사용하는 경우 반복하지 말고, 특히 분석법이 여전히 제약 조건에서 작동하는 경우 간단하게 유지하고 항상 값 범위의 상태를 확인하십시오. 실수를 줄이는 데 도움이되지는 않지만 버그를 더 빨리 발견하는 데 도움이되므로 디버깅에 시간이 덜 걸립니다.
나는 최근이 문제에 대해 많은 생각을 해왔다. 간단한 대답은 Don Norman의 The Everyday Things의 디자인이다. 제품을 디자인하는 것처럼 코드를 작성하십시오.
역설적으로 좋은 디자인은 오류를 최소화합니다. 그것은, 당신이 이미하고있는 몇 가지를 의미합니다 ( 왜 그런지 정확히 알지 못할 수도 있습니다 ).
-이름은 직관적으로 작동합니다. 이것은 공식적으로 여유로 알려져 있습니다. 즉, 버튼을 누를 수 있고, 레버를 전환 할 수 있고, 당기는 핸들 등이있다.
나쁜 코드를 작성하기 어렵게 만드십시오. 잘못된 입력을 확인하고 나중에보다 빨리 오류를 발생시키고 적절한 경우 헝가리어 앱을 사용하십시오.이를 잠금 기능이라고합니다.
적절한 추상화를 사용하십시오. 단기 기억력이 약합니다.
-문서는 분명히 중요하지만 코드를 올바르게 사용하는 것이 가장 효과적입니다. 즉, 잘 설계된 제품에는 설명서가 필요하지 않습니다. (이를 보는 가장 확실한 방법은 나쁜 예를 보는 것입니다. 즉, 손잡이가 달린 문은 밀어야합니다.)
단위 테스트. 이것들은 실제로 오류가 발생하는 것을 막지 못하고 버그가있는 곳을 명확하게하고 정신력을 제공합니다.
나는 더 많은 원칙을 놓치고 있다고 확신하지만, 오류 설계에 대해 읽으십시오.
위에서 제안한 단위 테스트를 전적으로 지원하지만 TDD 또는 BDD는 문제와 해결책에 대해 먼저 생각해야하므로 큰 가치가 있습니다.
그러나 개인적으로 몇 분 동안 조용히 앉아 문제에 대해 생각하고 문제에 접근하는 방법과 각 접근 방식의 장단점을 생각하면 내 코드 품질이 놀라워지고 혼란에 빠질 수 있습니다.
때때로 한 장의 종이에 빠르게 낙서하면 더 큰 연결된 퍼즐 조각을 볼 수 있습니다.
방금 머리를 숙이고 키보드를 두드리면 최악의 코드를 작성합니다. 약간의 생각과 묵상은 세상을 변화시킵니다.
추신. 큰 스펙을 작성하는 데 몇 시간이 아니라 5 분에서 10 분 정도를 의미합니다.
내 두 가지 주요 생각은 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'변수 및 기타로 혼란을 더 잘 디버깅 할 수 있습니다.