숙련 된 프로그래머가 실제로 디버거를 사용하고 있다면 어떤 상황에서든 사용하십시오. 그 질문에 대한 답변에서 나는 "개월"이라고 말했지만 아마도 "년"을 의미했을 것입니다-나는 정말로 디버거를 사용하지 않습니다. 그래서 내 대답은 당신이 어떤 상황에서 숙련 된 프로그래머로서 디버거를 사용하겠습니까?
숙련 된 프로그래머가 실제로 디버거를 사용하고 있다면 어떤 상황에서든 사용하십시오. 그 질문에 대한 답변에서 나는 "개월"이라고 말했지만 아마도 "년"을 의미했을 것입니다-나는 정말로 디버거를 사용하지 않습니다. 그래서 내 대답은 당신이 어떤 상황에서 숙련 된 프로그래머로서 디버거를 사용하겠습니까?
답변:
디버거를 사용하지 않는 것은 경험이 없다는 표시입니다. 코드를 한 줄씩 단계별로 실행하는 것이 실행 흐름을 추적하는 가장 좋은 방법입니다.
큰 시스템에서 작업하기 때문에 디버거를 자주 사용하기 때문에 짜증이납니다. http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html
코드를 얼마나 짧고 자주 읽는지에 관계없이 항상 버그가있을 가능성이 있습니다. http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html
오류는 인간이며 프로그램이 올바른지 결코 증명할 수 없으므로 디버거 / 자동 테스트와 같은 도구를 사용하여이 어려운 비즈니스에 도움이되지 않겠습니까?
코드가 짧으면 간단한 테스트를 수행합니다. 또한 짧고 버그의 특성을 알고 있다면 코드를 읽는 것으로 충분할 수 있습니다. 그러나 코드 기반이 크면 여러 언어와 함께 3 개의 계층이 혼합 된 후 여러 수준에서 우수한 테스트 적용 범위와 매우 우수한 디버거가 필요합니다. 그렇지 않으면 많은 시간이 낭비됩니다.
그렇다면 언제 디버거가 필요하지 않습니까?
나는 가장 똑똑한 코더가 아니며 가장 경험이 많지는 않지만 여전히 디버거를 사용할 필요가 없습니다. 그때는 :
언제 디버거에 크게 의존합니까?
FileNotFoundException
."디버거"는 둘 이상의 도구를 나타낼 수 있습니다. Visual Studio 디버거, SQL 디버거 (주로 저장된 procs) 및 SQL 프로파일 러 (SP가 호출되는 것을 파악하기 위해)를 사용합니다. 빠른 sysadmin-ish Python 스크립트를 작성하는이 도구의 도구가 필요합니까? 아니요. GUI 기반 도구를 직접 만든 경우? 다릅니다. .Net WinForms 인 경우-아마도 아닙니다. 그것이 WPF라면-그렇습니다.
어쨌든 "실제"프로그래머를 정의하는 것은 무엇입니까? 빠른 것? 지식이 있습니까? 알고리즘에 능숙합니까? 좋은 문서를 작성합니까? 언제이 새로운 타이틀을 정확히 졸업했을까요? 마법의 선은 언제 교차합니까?
기존의 100 년 이상의 노력으로 자신의 손을 더럽 히지 않은 프로그래머는 복잡성과 자신의 한계 (코드 품질에 좌절)에 의해 겸손해질 기회가 없었다고 말할 수 있습니다.
나는 개인적으로 사용 가능한 최고의 디버거를 사용하려고 시도하고 자주 사용하는 경향이 있습니다. 작업이 충분히 간단하고 디버거가 필요하지 않은 경우 사용하지 않습니다. 내가 필요한지 아닌지를 파악하는 데 너무 오래 걸리지 않습니다.
...
이제 이론적으로는 코드베이스를 오랫동안 읽을 수 있었으므로 얻을 수있었습니다. 그러나 실습 방식이 가장 효과적이며, 종종 내가보고있는 어리석은 코드를 다시 작성하고 싶습니다. 불행히도 내가있는 코드 기반을 정리하는 데 10 년 이상이 걸렸습니다. 따라서 디버거를 사용하는 것이 첫 번째 단계입니다. 5 백만 줄의 코드 중 하나만 작동하는 것을 발견 한 경우에만 파일을 위아래로 스캔하여 해당 클래스가 수행하는 작업을 파악하려고합니다.
"디버거가 마음에 들지 않습니다. — 리누스 토발즈
반면에 그는 스택 오버플로 계정이 없으므로 그의 의견에 관심이 있는지 확실하지 않습니다. :)
그래서 내 대답 은 당신이 어떤 상황 에서 숙련 된 프로그래머로서 디버거를 사용하겠습니까?
편집하다:
프로그래밍 과정에서 디버거를 사용하는 방법을 모른다는 점이 많았습니다. 따라서 과거에는 디버거없이 디버깅해야했습니다. 그러나 디버거를 사용하는 법을 배우고 나면 버그를 찾는 데 100 배 더 생산성 이 높아 졌습니다.
현재 답변과 약간 다른 관점을 제공합니다. 종종 실시간 구성 요소가있는 시스템에서 작업하는 임베디드 소프트웨어 엔지니어로서 디버거는 거의 사용하지 않습니다.
때때로 디버거는 놀라운 도구가 될 수 있으며 데스크탑에서 코드를 빌드하고 실행할 수있을 때마다 항상 디버거를 사용합니다.
실시간 제약 조건을 가진 칩에서는 디버거를 사용하는 것과 관련된 큰 부담이 있습니다. 실행을 일시 중지하자마자 나머지 시스템의 타이밍이 치명적일 수 있습니다. 일반적으로 온칩, 중요하지 않은 코드의 printf 및 시간이 중요한 코드의 IO 흔들림이 가장 훌륭하고 실제로 가장 간단한 도구입니다. 디버거만큼 좋지는 않지만 실제 시스템으로 작업하는 것이 훨씬 저렴합니다.
숙련 된 프로그래머는 필요할 때 거의 독점적으로 디버거를 사용한다고 생각합니다. 실제로 코드 실행을 따르는 것보다 버그를 추적하는 더 좋은 방법은 무엇입니까?
당신은 세계의 스키트가 실수하지 않거나 모든 것을 알고 있다고 가정합니까? 가장 사소한 프로그램을 제외한 모든 프로그램은 일부 상황에서 예기치 않은 방식으로 작동합니다. 문제를 조사해야 할 것입니다. 따라서 선택은 스펙트럼의 한쪽 끝에서 인쇄 설명을 사용하거나, 코드가 실행될 때 발생하는 문제를 검토하거나, 다른 쪽에서 모템을 게시하거나, 중간에서 오른쪽을 살펴보고 진행 상황을 파악하는 것입니다.
아마도 더 좋은 방법은 숙련 된 프로그래머가 언제 디버거를 사용해야하는지 아는 것입니다. 스택 추적을 보는 종속성이 거의없는 코드에서는 무엇이 잘못되었는지 파악하기에 충분합니다. 그러나 코드가 다른 코드와 작동하는 복잡한 시나리오가 있으며 작성하지 않은 내용을 보려면 디버거가 필요합니다.
드물게.
당신의 방법은 마음에 의해 컴파일되고 실행될만큼 작고 단순해야하며, 단위 테스트는 기능을 포함해야합니다. 버그를 발견하면 테스트를 작성하십시오. 실행하고 수정하십시오.
ASP.NET 프레임 워크와 같이 테스트 할 수없는 코드에서 예기치 않은 동작이 발생했을 때 디버거를 사용하는 경향이 있습니다.
필요할 때 디버거를 사용합니다. 그것은 매일이 아니지만 때때로 발생합니다. 정확한 결과를 확인하기 위해 코드를 단계별로 실행하는 것이 더 나은 경우가 있습니다.
디버거를 점점 적게 사용한다는 것을 인정해야합니다. 델파이에서 10 년 이상 개발해 왔습니다. 또한 PL / SQL로 저장 프로 시저를 작성합니다. 몇 달 이래로 저는 PHP 개발자이기도합니다.
몇 년 전에 작성된 불분명 한 코드를 발견하고 수정 해야하는 경우 주로 이러한 경우 중 하나에서 디버거를 사용합니다. 코드를 읽기 어려운 경우 프로그램이 작동하는 정확한 방법을 찾는 데 도움이되는 경우가 있습니다. PHP는 거의 필요하지 않지만 이벤트 기반 인 Delphi에서는 복잡한 프레임 워크를 얻었을 때 도움이됩니다.
그러나 당신이 말했듯이 디버거를 사용하는 것은 예외입니다. 대부분의 문제는 코드를 읽고 실수 (또는 다른 사람)가 저지른 실수를 수정하면 해결됩니다.
그러나 그것은 코드를 단계별로 진행합니다. 예외가 발생하면 호출 스택을 자주 사용하고 때로는 변수를 검사하기 위해 중단 점을 배치합니다. 그러나 어쨌든 철저한 리팩토링이 필요한 코드가 거의 항상 있습니다.
나는 때때로 디버거없이 코드를 작성하지만, 총구에 가해질 때만, 즉. 8051 또는 Z80의 레거시 임베디드 건지.
IMHO, 복잡한 작업에 디버거와 로깅이 필요합니다. 한 번은 다른 것을 대신하지 않습니다. 예를 들어 코드가 수행 할 수있는 유일한 작업은 하드웨어와 상호 작용하고 세마포어를 설정하는 것만으로도 앱이 드라이버에 포함되어 있으면 로깅 시스템이 도움이되지 않습니다.
디버거는 작성한 방식에 따라 앱이 제대로 작동하는 시스템 오류를 도울 수 없지만 간헐적 인 통신 프로토콜 오류로 인해 시스템이 여전히 작동하지 않습니다.
따라서 어리 석고 눈부신 버그와 하드웨어 콕업을 제거하려면 디버거가 필요합니다. 간헐적 인 시스템 통합 버그를 포착하려면 좋은 로깅이 필요합니다.
나는 둘 다 가지고 있어야한다 – 나는 내가 얻을 수있는 모든 도움이 필요하다!
숙련 된 프로그래머가 아주 오래된 프로그래머와 동일하고, 디버거를 항상 사용할 수 없었던 때로, 때로는 그리 좋지 않은 경우에 프로그래밍을 배우고 습관을 형성했을 수 있을까요?
printf 디버깅에 능숙하다면 (그리고 80 년대에 우리는 선택의 여지가 없었지만 실제로는 능숙 해졌다), 디버거가 그렇게 많이 추가하지 않았을 것입니다.
개인적인 선택의 문제입니다.
솔직히 나는 디버거가 특정 프로그램 실행 단계에서 램에 무엇이 있는지 아는 데 도움이되는 특정 상황에서 유용하다고 생각합니다.
디버거의 기본 유틸리티는 프로그램을 중지하지 않고 프로그램을 중지하는 것입니다.이 기능은 매우 중요합니다.
이 두 가지 기능 외에도 디버거가 실제로 필요하다고 생각하지 않습니다. 복잡한 프로그램은 일종의 "verbose"모드를 가져야합니다. 즉, printf 또는 std :: cout으로 수행하는 모든 작업, 수행 한 선택 사항 및 기타 여러 매개 변수를 알려줍니다.
프로그램을 만들었을 때 사용자가 프로그램을 사용하는 데 문제가 있다고 상상해보십시오. 프로그램을 사용하도록 설계된 방식으로 사용하고 있는지 또는 그가 불평하는 것이 버그 일 수 있는지 아는 방법은 무엇입니까?
디버거는 자동차의 전기 조향과 같습니다. 차를 두는 것이 더 편하지만 드라이브가 더 나아지지는 않습니다.
Progamming은 디자인과 논리에 관한 것입니다. 도구가 물건을 추적하는 데 도움을 줄 수있는 방법은 더 나은 프로그래머가되지 않습니다.
또한 디버거는 컴파일 된 언어에 유용하며, 해석 된 언어에는 훨씬 적습니다.