왜 학교는 디버거를 다루지 않습니까? [닫은]


12

SO에 대한 또 다른 숙제 질문 후에 . 대다수의 학생들은 디버거가 무엇인지 또는 어떻게 사용하는지 전혀 모릅니다. 디버거를 사용하는 방법을 아는 것이 프로그래밍의 다른 기본 요소만큼이나 중요하다고 생각합니다.

  • 문제는 디버깅해서는 안되며 최신 디버깅 도구를 사용하는 방법은 프로그래밍 기본 사항과 함께 가르쳐야합니까? 그렇지 않은 경우

2
음 .. 당신은 gdb가 현대적인 디버깅 도구 라고 말하는거야 ? 나쁜 디버거는 아니지만 최신 기술이 아닙니다.
Billy ONeal

1
동의하지만 학생들이 Visual Studio를 사용하고 디버거를 어떻게 또는 왜 사용할지 몰랐다는 질문에 대답했습니다.
다시 실행

@ 다시 실행 : 음 .. ouch. 그들은 IDE에서 "재생"버튼을 칠 수 없습니까? (BTW, I +
1'd

system.out 인쇄 로깅은 게으르고 부적절한 마지막 요새입니다

6
@Jarrod, 꽤 광범위한 일반화 및 아마도 지나치게. 때로는 문제가 발생하는 프로그램에서 단순히 디버거를 사용할 수 없습니다.

답변:


7

가르치는 데 필요한 디버거 를 사용 하는 것이 아니라 일반적인 디버깅 기술이 필요합니다 . 여기에는 물론 디버거를 사용하는 방법을 가르치는 것뿐만 아니라 다양한 다른 중요한 기술, 예를 들어

  • 비판적 사고
  • 나누고 정복하다
  • printf 디버깅, 로깅 등
  • 책상 점검
  • 스트레스 테스트

추가적인 이점으로, 프로그래밍 이외의 영역에서 문제 해결에 많은 기술을 적용 할 수도 있습니다.

이 모든 주제에 대한 좋은 책이 있습니다. 모든 학부생과 프로그래밍의 기본 사항을 배우는 사람 은 David J Agans의 디버깅 이 필요할 것 입니다.


8

고등 컴퓨터 과학 과정은 학생들이 프로그래밍 기본 사항 을 가르치는 데 적합합니다. 이러한 개념은 학생들이 필요한 개념을 익히고 더 넓은 범위의 프로그래밍 언어 및 문제 세트에 적용하기를 희망하여 학생들에게 가르쳐집니다 .

반면에 디버깅 도구는 구현 영역 의 하위 집합입니다 . 개념이 동일하더라도 각 도구는 언어마다 다릅니다. 우리는 디버깅 도구에 노출되었지만 실제로는 깊이 다루지 않았습니다. 우리가 툴 디버깅에 일주일 이상을 보낸다면, 뒤돌아 보면 시간 낭비라고 생각합니다. 차라리 BigO 표기법이나 다형성에 대해 배우고 싶습니다. 그러나 디버깅 도구의 힘이 학생들에게 (성공적으로) 전달되지 않았다면 그것은 필요하지 않을 것입니다.


3
+1. 번역 : 모든 사람 등 MSVS, GCC / GDB, LLVM / 꽝, 사용하기 때문에
빌리 ONeal

1
내가 @rerun에 동의한다는 것을 인정해야하지만 +1; 소프트웨어 상점에서 사용되는 기본 개념과 도구를 다루는 과정 (또는 그 일부)은 새로운 졸업생의 생산성을 높이는 데 큰 도움이 될 것입니다. 소스 컨트롤을 잠시 사용한 후에도 소스 컨트롤을 이해하지 못하는 것처럼 보이는 여러 가지를 살펴 봤습니다.
Ken Henderson

일반 개발자가 많은 시간을 함께 보내는 많은 기술은 학교에서 다룹니다. 소스 제어, 일반적인 구성 관리, 코드 탐색, 코드 판독, 빌드 프로세스 등 CS 학위는 이론적 인 측면을 다루어야한다는 것을 이해하지만 학생들이 기존의 큰 코드 기반으로 작업하여 버그를 찾아 수정하는 하나의 senor 레벨 클래스라고 생각합니다. 코드에서 확인하고 "배치"하면 새로운 개발자가 훨씬 유용합니다.
다시 실행

3
나는 완전히 동의하지 않습니다. 실제 코드가 작성되는 경우 (코드 작성은 과학 개념을 연습하는 좋은 방법이기 때문에) 학생들은 해당 코드를 작성하는 좋은 방법에 액세스 할 수 있어야하며 , 필요한 경우 디버거를 사용하는 것도 포함됩니다. 그것은 bigO 표기법에 소비 할 수있는 시간을 빼앗아 가지 않습니다. 많은 학생들이 사소한 오류를 통해 무차별 대입에 소비하는 시간을 자유롭게합니다. 그로부터 많은 것이 얻어지지 않습니다. 또한 많은 다른 과학 과정 (예를 들어 물리학)에는 교과 과정의 일부로 실용적인 측정 기술이 포함되어 있습니다.
잉카

2
디버거를 사용하려면 코드뿐만 아니라 컴퓨터의 작동 방식을 이해해야합니다. 나는 이것이 프로그래밍 기본 이라고 생각합니다 . 컴퓨터가 실제로 무엇을하고 있는지 전혀 모르는 학생들이 너무 많아서 좋은 프로그래머가되지는 않습니다.
edA-qa mort-ora-y

2

대부분의 초급 프로그래밍 과정에서 프로그램 상태는 몇 가지 인쇄 설명으로 버그를 제거 할 수있을 정도로 간단합니다. 학생들이 직접 수작업을하도록 강요하는 문제가있을 수 있으므로 코드에서 특정 유형의 버그가 발생하는 방식과 장소를 파악할 수 있습니다. 어디를 볼지 모른다면 디버거는 쓸모가 없습니다.


4
좋은 디버거는 print 문보다 사용 하기 쉽습니다 . Print 문은 어떻게 든 데이터를 문자열로 직렬화하는 방법이 필요하므로 직렬화를 수행하려면 자체 코드 (버그 리딩)가 필요합니다. 예를 들어, 링크 된 목록 프로그램은 디버거에서 쉽게 진행할 수 있지만 링크 된 목록 횡단 알고리즘을 작성하려는 학생에게는 인쇄 문이 도움이되지 않습니다. 올바른 인쇄 문을 작성하려면 해당 알고리즘이 필요하기 때문입니다. .
Billy ONeal

2
@Billy 그래서 잘못된 코드를 단계별로 실행하면 어떻게 든 도움이됩니까?
Neil Butterworth

1
@Billi ONeal, 당신은 틀 렸습니다. 당신이 말하는 디버거가 존재하지 않습니다. 프로그램을 통한 대화식 스테핑은 디버그 로깅 문제를 이미 식별 한 경우에만 유용합니다. 내 연습에서 (> 20 세 이상) 결코 내 자신의 코드와 함께 디버거를 사용해야했습니다. 적절한 주장과 로깅은 항상 충분했습니다. 나는 라이브러리 코드와 레거시 도구와 함께 저주받은 도구 만 사용하고 있습니다. 그리고 btw., 모든 데이터 구조를 읽을 수있는 것으로 직렬화 할 수 있다는 것은 항상 좋은 생각입니다. 일부 언어 / 환경은 무료로 제공합니다.
SK-logic

1
@Billy ONeal, 직렬 포트에 연결된 마이크로 컨트롤러 장치의 메모리를 어떻게 탐색 하시겠습니까? 그리고 저는 데이터 구조와 알고리즘에서 충분히 글을 읽기 전에 포인터와 물건으로 저수준 언어에 신선함을 노출시키는 것은 좋은 생각이 아니라고 생각합니다. 그때까지 그들은 제대로 디버깅하는 방법을 알게 될 것입니다.
SK-logic

1
@Billy ONeal, 가장 어려운 부분은 디버거에서 값을 검사 할 때 (btw. 대부분의 경우 직접 메모리 검사가 아닌 .dump () 메서드를 호출하는 것과 같은 경우) 올바른 순간을 식별하는 것입니다. 직렬화 된 값을 인쇄합니다. 적절한 디버그 로깅 인프라가 있으면 문제는 로그 파일 분석으로 좁혀집니다. 대부분의 경우 간단한 grep작업을 수행합니다. 스테핑, 조건부 중단 점 없음-grep 만 가능합니다.
SK-logic

2

그렇게 중요하지 않습니다. 나는 거의 하나도 사용하지 않으며 결코 가지고 있지 않습니다. 코드를 디버깅하는 가장 좋은 방법은 다음과 같습니다.

  • 처음에는 버그를 작성하지 마십시오
  • 작성하는 경우 디버거에 들어 가지 말고 생각하여 수정하십시오.

또한 최신 멀티 스레드 소프트웨어의 경우 디버거는 버그를 발견하지 않고 숨기는 효과가 있습니다. 그리고 그들은 학위 수준에서 분명히 "학습"되어서는 안됩니다. 워드 프로세서를 사용하는 방법을 가르치는 사람은 누구보다 많습니다.


6
나는 이것에 달려 있다고 생각한다. 작성하지 않은 크고 문서화되지 않은 코드베이스의 동작에 익숙해 지려는 경우 디버거는 코드베이스가 수행하는 작업에 적응하는 가장 빠른 방법 중 하나입니다. 모든 코드를 작성하는 경우 디버거가 자주 필요하지는 않지만 우리 모두가 그 자리에있는 것은 아닙니다. +1
Billy ONeal 2

1
@ 빌리 우리는 다른 의견에 동의해야합니다. 디버거가있는 거대한 MT 거래 서버를 알게됩니다.
Neil Butterworth

@ Neil : 나는 그런 종류의 문제를 개인적으로 다루지 않았지만 ... 문제없이 전에 MT 코드를 디버깅했습니다. 아마도 나는 MSVC ++에 망치고있다-디버거는 다양한 스레드가 실제로하는 일을 실제로 보여줍니다. 그러나 2008 이전 버전에서 디버깅하는 경우 (추가 된 시점이라고 생각) 어떻게하면 더 어려워 질 수 있는지 알 수 있습니다.
Billy ONeal

@Neil : 틀리지 말아라-디버거가 생각을 대신 할 수 있다고 말하거나, 그것이 당신이 보는 유일한 것이라고 말하지는 않는다. 나는 그것이 어떤 경우에는 무언가를 이해하기 쉽게 만드는 도구라고 말하고 있습니다. 디버거가 더 많은 혼동을 일으키는 경우 일반적으로 더 혼란스러워한다는 것을 쉽게 알 수 있습니다 (더 혼란스러워 짐). 그러면 디버거를 끄고 다른 것을 시도 할 때입니다. 어떤 경우에는 도움이되지만 코드 / 입력 / 출력을보고 무슨 일이 일어나고 있는지에 대한 생각을 대체 할 수는 없습니다.
Billy ONeal

2
나는 당신이 여기에 지혜의 얼굴을 날고 있다는 것을 알고 있습니다. 그러나 당신은 Linus Torvalds, Larry Wall, Brian Kernighan 및 Rob Pike와 같은 사람들과 좋은 회사에 있습니다.
btilly

0

학생들은 인간이고 인간은 모든 종류의 실수를 저지르기 때문에 디버깅을 배워야합니다. 그 중 일부는 주어진 실수에 대한 깨달음이 발생하기 전에 실험 데이터 (디버깅 정보)를 얻어야합니다.

프로그램에 의해 설계가 정확해야한다는 전제 (수학 부서에서 상속 받았을 수도 있음) 때문에 디버깅은 가르치지 않습니다. 따라서 학생들은 프로그래밍을 올바르게 "실험"해서는 안됩니다. 그러나 이것은 불완전한 인간이 일정 압력 등에서 변화하는 사양에 소프트웨어를 크랭크하는 실제 제조 과정을 무시합니다.


흠 .. 아마도 우리 학교는 다를 수도 있지만 CWRU에서 그런 일은 아닙니다.
Billy ONeal

아마도 프로그래밍 과정의 역사적 부서 상속 트리에 달려있을 것입니다.
hotpaw2

나는 당신이이 모든 것을 어디서 얻었는지 잘 모르겠습니다. 모든 입문 강의는 버그를 추적하는 방법에 대해 몇 가지 강의를합니다.
davidk01

@ davidk01-OP의 관찰 내용을 설명하지는 않지만 자주 들었지만 이전에 두 번 이상 들었습니다.
hotpaw2

@ hotpaw2 : OP의 관찰을 설명하지 않는 것은 무엇입니까? 학생들이 프로그램 디버깅을 배우는 데 어려움을 겪고 있다고해서 그것이 당신이 뛰어 넘는 결론에 대해 가르치지 않았다는 것을 의미하지는 않습니다. 학부생과 대학원생으로 여러 프로그래밍 과정을 수강했습니다. 모든 수업에서 강사는 하나 이상의 강의를 통해 잘못된 프로그램을 검토하고 일반적인 디버깅 기술을 시연하기 위해 수정했습니다.
davidk01

0

이 질문은 나에게 이질적이다. 우리 대학에서 디버거 (JDB 및 Eclipse 디버거) 사용은 1 년 컴퓨터 과학 순서만큼 일찍 가르쳐졌습니다. 소프트웨어 테스트 과정에서 디버거 및 기타 테스트 도구 사용에 대해 다시 배웠습니다.

개인적으로 사람들이 취업 할 수 있도록 준비하는 좋은 학교가 적절한 디버깅 및 테스트 기술에 대해 가르치고 있지 않다는 것을 믿기가 매우 어렵습니다. 그들은 분명히 그것의 모든 측면을 다룰 수는 없지만 적어도 교실의 기초를 가르 칠 수 있습니다.


0

스스로 알아 내십시오

교수 나 TA가 시간을 내어 쉽게 알아낼 수 있는 것을 가르치는 것을 필요로하지 않았으며 원하지도 않았습니다 . 저에게 어려운 개념을 가르치고 학습을 안내하기 위해 있습니다. 그들은 아니고 당신이 RTFM하지 않아도이있을 수.

배우는 방법 배우기

대학은 당신이 모르는 모든 주제를 통해 손을 잡는 것이 아니라 배우는 법을 배우는 것에 관한 것이어야합니다. 이 과정을 통해 끊임없이 손을 잡고 있다면 현실 세계에서 비참하게 실패 할 것입니다.

눈을 통한 오르막 길

내가 학교에 갔을 때 그들은 당신에게 언어를 가르치는 것을 귀찮게하지 않았습니다. 당신은 당신의 자신의 시간에 그것을 픽업 것으로 예상되었다. 그들은 당신에게 프로젝트와 시설을 줄 것입니다. 구현을 완료하고 작업 프로그램을 제출하기 위해 필요한 정보를 추적하는 것은 사용자의 책임입니다. 근무 시간을 제외하고는 실제 세계와 매우 유사합니다.

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