학부 1학년생 디버깅 가르치기

ddoman의 이미지

이번학기에
학교에서 1학년들 숙제도 도와주고 모르는거 가르쳐주는 담당자(??)가 되었는데요 ( 저도 학생이긴 합니다만;; )

남는 시간에 디버깅을 가르쳐줄까 생각 중 입니다. 1학년 과목에서 프로그래밍 코스는 많아도
디버깅을 안 갈켜주다보니깐 printf 노가다 디버깅 조차도 생각을 못하는 얘들이 많더라구요.
그래서 근무시간(??)에 질문하는 애들 없으면 디버깅이나 가르쳐 줄까 생각중인데요

많은 이해를 요구하는 가령..
디버깅 옵션 없이 바이너리를 배포했을 때 crash 리포팅이나 call stack을 어떻게 전달해서
미리 저장해놨던 심볼 테이블이랑 어떻게 매칭시켜서 crash 지점을 찾아내나,
네트웍서버를 위한 쓰레드 디버깅, 패킷 snipping 해서 어케 에러를 찾아내나

그런것들이 아니라( 대상이 학부생 1학년 입니다. )

초짜를 위한 디버깅 전략(??),
왜 필요한가, 디버깅 연습 하기 좋은 예제들

그런정도의 자료를 찾고 있는데
쉽지 않네요.
Debugging for dummies 이런 책 없나..ㅋ

혹시 좋은 자료 혹은 참고 할 만한 책,
또는 문서 알고 계시면 댓글 달아주시면 감사하겠습니다.

프로그래밍 언어는 상관없습니다.

Darkcircle의 이미지

단 루프나 조건문 정도의 범위에 들어서지 않았다는 조건 하에서만요.

루프/조건문 절에 들어가게 되면 애들이 가장 햇갈려 하는 부분이
바로 제어 변수의 값이 바뀌면서 배열이나 계산 식의 값이 어떻게 변하는지
...에 대한 건데요... 이때 디버거 쓸 줄 모르면 낭패봅니다.

별찍기 제대로 짜는 연습을 시키려면 종이에 계산식 적어놓고
x,y 좌표를 그려서 조건이 어떠한 경우에 별이 찍혀지는지
일단 디버거상에 계산식을 입력해서 결과값을 확인하고
그래프 상에 나타내서 전체적인 상을 확인해보고
그걸 코드로 구현하는 연습을 시켜야 합니다.

종이에 쓰는걸 싫어하는 사람을 위해 .. 디버거 돌려가면서 조건이 맞는지 아닌지를 판단해서
별을 그려주고 ... 뭐 이런걸 연습하게끔 유도를 해야 하는데 대부분 저학년 학부생들은
디버거를... 쓰는걸 배워도 아주 잠깐뿐이고... 디버거를 그네들 말로 제대로 쓴다고 하는건
얼추 디버깅 모드 들어가는거랑 변수값 검사하는 방법까지일 뿐입니다.
스택이나 배열 추적하는 ... 이런 제대로 활용하는 방법은 잘 모르죠.
코딩을 잘 못하면 디버거라도 제대로 쓸 줄 알아야 될텐데 ... (<-물론 말도 안되는 ;;; )
---------------------------------------------------------------
실수하지 말아야 하는데 . . . Orz

---------------------------------------------------------------
폐인이 되자 (/ㅂ/)

마잇의 이미지

디버깅보다는 리딩을 가르치는것이 좋다고 생각합니다.

문법만 알고 좋은 글을 쓸 수 있습니까
어휘를 많이 익혔다고 좋은 글을 쓸 수 있습니까.

--
마잇


--
마잇

마잇의 이미지

단기간내에 논술을 잘 하고 싶다는 학생들이 가장 못하는 것이 풍부한 읽기입니다.

풍부한 읽기야말로 사회에 나가기 전 학생들이 할 수 있는 최선의 선택이라고 생각합니다.

같은 문제를 먼저 고민했었던 대가들의 코드를 읽게해야할 의무는 가르치는 사람에게 있다고 생각합니다.
--
마잇


--
마잇

codebank의 이미지

느림의 미학을 가르쳐 주시는건 어떨런지...
사실 모든 것이 빠르게 돌아가는 세상에서 천천히하는 것보다 어려운건 없는 것 같더군요.
여기서 느림의 미학이란 MindStorm님의 말씀처럼 종이에 적는 방법을 이야기합니다.

요즘 컴파일속도가 엄청 빨라져서 예전엔 2~3분정도하던 컴파일 속도가 같은 프로그램을
같은 컴파일러를 이용해서 컴파일해도 1분이내로 나옵니다.
그만큼 H/W 성능은 좋아졌지만 컴파일되는 2~3분동안 컴파일되는 것을 지켜보면서 가질 수
있었던 여유있는 시간이 그만큼 줄어든다는 것을 뜻합니다.

무엇이든 하나가 과하면 다른하나는 반드시 모자라는 법입니다.
H/W의 속도가 향상되면 S/W의 성능이 그에 미치지 못할지도 모른다거나 또는 S/W에 포함되는
알고리즘이라던가 개발자의 상상력이 더이상 발전하지 못한다거나 등등등...
하여간 얻는 것이 있으면 그만큼 손해보는 것도 있는 것이니만큼 조금은 어려운 방법으로
접근을 해서 잃는 것을 조금이라도 줄여보는게 어떨까하는 생각을 해봅니다.

저는 '가장 기초적인 것이 가장 좋은 것이다'라는 생각을 가지고 있습니다.
후학들을 지도하는 입장이 되었다면 프로그램을 작성하는데 필요한 기초적인 방법을 알려주고
그에따라서 프로그램을 작성하는 방법을 알려주는 것이 어떨까 싶네요.
이건 나중에 산출물(?)을 요구하는 사회에서도 어느정도 도움도되고 손으로 만드는 프로그램이
아니라 머리로 만드는 프로그램을 작성할 수 있는 기초가 될 것이라고 생각합니다.
제가 알고 있는 기초는 일단 어떠한 프로그램을 작성할 것인가를 문서로 만드고 만들어진
문서를 기초로 순서도를 작성하고 그 순서도에 맞는 코드를 작성하고 만들어진 코드에서
예상되는 예외를 만들어보고 그것을 어떻게 수정 또는 발생하지 않게 할 수 있는가를 문서로
작성하는... 한마디로 프로그래머들이 가장하기 싫어하는(제가 싫어하는 것들 일 수도 있습니다.
:-)) 일련의 작업들을 알려주고 그대로 따라하게하고 마지막 산출물까지 정리하는 방법을
알려주는 것도 좋은 방법이라고 생각합니다.
처음에는 상당히 고생하고 귀찮아지겠지만 어느정도 익숙해지면 그게 더 효율적인 방법이라는
것을 알 수도 있을테니까요. (나중에 원하는 결과물이 나오지 않았을 때 어느부분에서 잘못된
생각을 했었는지도 추측이 가능할 테니까요. :-))

만일 제가 후학들을 가르치는 입장이라면 아마 위와 같은 방법을 고수하지 않을까 생각합니다.
지금 생각해봐도 위의 방법이 가장 좋은 방법이 아닌가 생각하고 있으니까요.

P.S. : 사실 제가 생각할 때 순서도까지 만들어졌다면 프로그램의 80~90%는 완성된 것이라고
생각합니다. - 물론 개인적인 생각입니다. :-)
------------------------------
좋은 하루 되세요.

------------------------------
좋은 하루 되세요.

fatman의 이미지

학부 1년생이고 남는 시간을 활용해야 한다면 원하는 함수나 코드에 stop을 걸 수 있고, 변수값을 추적할 수 있을
정도면 충분할 것 같습니다. 그 이상은 가르칠 시간도 없고, 학생들도 관심 없어할 가능성이 높습니다.

...

ruinfire의 이미지

오류가 발생하는 초간단한 예제(오류가 여러개 있으면 더 좋음)를 주시고

오류 풀어오면 A+

외치시면 뭐... 알아서 수련하지 않을까요? ^^;;

오류를 수정하려면 디버깅 해야 하니까욤.

아닐까요 ㅠ

제가 지금까지 느낀건

겪어서 배우는게 가장빠르고 효과적이었거든요 ㅠ
------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??

------------------------------------------------------
팔 어딘가가 간지러운데 찾아 긁을 수 없는? 그런 기분??

highwind의 이미지

오류를 수정하는것이 목적이 아닌것같네요
printf를 사용해서 bug를 없에는것도 debugging이라고 할수있자나요.
Debugger를 사용하는것을 가르쳐주고 싶어하는 것 같네요.
예제를 주는 방식은 동의합니다.
gdb나 ddd같은 tool 사용하는 예제를 주시면 될꺼같네요.

=====================================
http://www.timothylive.net

=====================================
http://timothylive.net

winner의 이미지

분명 이산수학책에 나오는데도 알고리즘 수업하는 사람들 중 아는 사람은 없다고 해도 좋을 정도입니다.
저는 대학원생인데 학부생들의 algorithm 숙제를 보면서 느끼는 것이 배열 index의 경계초과에 대한 실수를 많이 한다는 것이었습니다.

물론 algorithm의 간단한 정렬숙제였으므로 실수할 것이 그것뿐일지 모르겠지만
사실 초급자들이 programming 배울 때 가장 고생하는 것이 index의 반복문 아니면 함수호출과정에서의 활용입니다.
저 또한 그것때문에 무던히 고생했죠.

예를 들어

int arr[10];
for (int i = 0; i < 10; i++)
    arr[i] = arr[i+1];

이런 실수를 참 많이 하더군요.

만일 index 를 머릿속으로 반복문을 돌리면서 변화를 추적하려고 하지 않고

int arr[10];
for (int i = 0; i < 10; i++) /* i is in [0, 10) or [0, 9] or 0 <= i < 10 or 0 <= i <= 9 */
    arr[i] = arr[i+1] /* so i+1 is in [1, 11) or [1, 10] or 1 <= i+1 < 11 or 1 <= i <= 10 */

이라고 생각한다면 실수가 많이 줄텐데 말이죠.
(or은 취향대로 생각하라는 뜻으로 적어봤습니다.)

Programming을 논리의 연역적 증명과정으로 보기에 바람직한 상황 속에서만 가능겠지만....

하지만 저는 또한 이런 생각이 듭니다.
차라리 C/C++ 말고 Java 이상의 고급언어로 prototype을 만들어보라는 것이 낫겠다는...
그러면 오류를 정확히 위치 집어서 가르쳐줄텐데 말이죠.

학과내 소모임 후배 약 10명 정도한테(3학년들...) 이것을 이야기해보니 유심히 쳐다보았지만
긍정적으로 반응을 보이는 것은 3명정도였던 것으로 기억합니다.