화물 컬트 프로그래밍 태도를 어떻게 다룰 수 있습니까?


257

나는 강제적 인 입문 프로그래밍 과정에 일부 컴퓨터 과학 학생들이 있는데, 프로그래밍 언어를 일련의 마법 주문으로보고, 어떤 효과를 얻기 위해 캐스팅해야합니다 (솔루션에 대한 아이디어를 표현하는 유연한 매체가 아닌) .

그들은 문제의 본질을 고려하지 않고 이전의 유사하게 보이는 과제에서 코드를 복사하여 붙여 넣는 경향이 있습니다.

이 학생들이 그들이 작성한 각 코드의 구조와 의미를 이해할 수 있고, 이해해야한다고 자신감을 갖도록하기위한 연습이나 유추가 있습니까?


8
해설자 : 여기에 의견에 답을 남기지 마십시오. 자신의 답변을 작성하십시오. 의견은 질문에 대한 여러 가지 가능한 답변을 논의하기위한 장소가 아닙니다. 제안을 답변으로 제시하거나 채팅 을하여 먼저 살을 빼십시오.

50
학계가 도착할 때마다-나는 내 미래에 대해 걱정하게됩니다 ... Boeing 7-28-7과 터빈이 200,000RPM으로 돌아가는 것을 상상해보십시오. 어쨌든 나는 떠난다.
Ben DeMott

67
당신이 생각 해 봤나 실패 그들에게 몇 번, 모두가 소프트웨어 개발 잘라! 그들은 모두 특별한 눈송이는 아닙니다!

6
프로그래밍이 캐스팅 캐스팅과 유사하다고 SICP가 유명하지 않습니까? 나는 학생들이 SICP를 인용하거나 Abelson과 Sussman이 묘사하려고 한 것과 비슷한 것을 비교하고 있다고 의심하지만, 가장 유명한 사람 중 하나 인 경우 누군가가 프로그램 작성과 철자법을 비교하는 것이 본질적으로 잘못되었음을 알지 못합니다. 컴퓨터 프로그래밍 서적은 처음 몇 페이지에서 똑같은 일을합니다.
Robbie

9
Eric Lippert는이 주제에 관해 할 말이 많습니다. 그리고 내가 할 수있는 것보다 훨씬 더 우아하고 간결한 방법으로 : blogs.msdn.com/b/ericlippert/archive/2004/03/01/82168.aspx
P.Brian.Mackey

답변:


120

일련의 연습을 제시 할 수 있습니다. 각 연습은 이전에 구축하면서 문제에 추가 요소를 추가하거나 비틀거나 다른 관점에서 문제를 조사하여 이전 솔루션의 약점을 나타내며 새로운 접근법이 필요합니다. . 이를 통해 기성품 코드를 복사하여 붙여 넣는 대신 각 솔루션에 대해 생각하고, 분석하고, 수정하고, 실험해야합니다.

엄격하게 프로그래밍 작업은 아니지만 다른 가능성은 다양한 것을 추정 하도록 요청하는 것입니다. 예를 들어 초당 미시시피 델타를 통해 흐르는 물의 양은 얼마입니까? 이러한 질문에는 확실한 답이 없습니다. 특히 설득력있는 (범위) 가치에 도달하기 위해 특정 가정을 만들어야하기 때문입니다. 그리고 이러한 많은 "고전적인"답변에 대한 답변을 실제로 검색 할 수 있지만, 아직 인터넷에서 찾을 수없는 새로운 답변을 쉽게 구성 할 수 있습니다.

이러한 종류의 운동에 대한 예 는 Jon Bentley의 Programming Pearls 에서 찾을 수 있습니다 . 또한 Pragmatic Programmer 에는 몇 가지 좋은 과제가 있습니다.

세 번째 종류의 작업은 버그를 찾아서 수정해야하는 코드를 제시하는 것입니다. 이것은 다시 그들의 분석 기술과 프로그램이 실제로 어떻게 작동하는지에 대한 이유를 사용하도록 강요합니다.

최신 정보

Billy ONeal의 의견 피드백 :

"연습 시리즈"의 문제점은 이전 운동에 문제가있는 학생들이 나머지 운동을 위해 완전히 망쳐 져 있다는 것입니다.

나는 이것이 어려운 수준을 비슷한 수준의 학생들에게 그룹화 / 비슷한 수준의 학생들로 그룹화하는 일반적인 문제에 관한 것이라고 생각하지만 옳습니다. 또한 문제와 해결책에 대해 토론하고 토론하고 문제를 함께 해결해야하는 소규모 그룹으로 학생들을 배치 할 수 있습니다. 누군가가 그것을 얻지 못하면 다른 사람들이 도울 수 있습니다 (이 설정은 팀워크 기술도 향상시킵니다). 그리고 누군가가 게 으르려고 노력하고 다른 사람들이 모든 일을하게한다면, 교사 (모퉁이에서 노트북으로 WoW를하지 말고 걸어 다니고, 학생들을지도하고지도해야하는 교사)에게 분명히 주목할 것입니다.

또한 기술 수준이 다른 학생들을 수용 할 수 있도록 운동을 조정할 수도 있습니다. 초보자는 느리고 경험 많은 사람은 더 빨리 갈 수 있습니다.


이 멋진 답변에 간단한 웹 사이트에 대한 링크를 추가하고 IMHO는 과정에 대한 보완으로 설정해야합니다 : http://projecteuler.net/ 이것은 코드에 대한 그들의 식욕을 자극하는 웹 사이트입니다. 원하는 언어로 해결해야 할 난제 문제가 증가하고 있습니다. 첫째, 중독성이 있으며 경쟁을 자극합니다. 계정을 통해 진행 상황을 추적 할 수 있습니다.
Nicolas C.

142

학생들 은 과목에 대한 관심성적을 받아야하는 학생들의 균형 잡힌 행동에 맞서 싸우고 있습니다. 많은 학생들은 다음과 같이 느낍니다.

(잘못된 실험 || 실험) == (실패 등급 및 폐기물 시간)

학생이 자신의 시간이나 학년이 위험에 처해 있다고 느끼 자마자, 흥미로운 과목이라도 학습중단 하고 바로 "나는 신경 쓰지 않고 교사에게 정답을줍니다"라고 바로 넘어갑니다. 귀하의 학생들은 모서리를 잘라하려고 (또는 그래서 그들은 생각) 문제에 대해 가능한 한 작은 생각을 그냥 복사 및 붙여 넣기하여 멀리에서 해킹에 의해.

이 문제를 해결하는 방법에 대한 제안 사항은 다음과 같습니다.

  1. Bob Ross 방법 사용 : 복사 및 붙여 넣기와 비교하여 새로 시작하는 것이 가능하고 빠르다는 것을 입증하십시오 . 수업 중에 눈앞에 새로운 프로그램을 만드십시오- 프로그래밍은 그림을 그리는 것과 같습니다.
  2. 창의성이 필요한 과제를 제공하십시오 . 예를 들어, 각 학생에게 코스 내내 사용할 종이에 자체 데이터 구조 (동물원, 애완 동물 상점, 도시, 대학 등을 만드는 데 필요한 개체)를 만들게합니다. 과제 # 2는 이러한 구조를 클래스 나 객체 등으로 변환 할 수 있습니다. 기본적으로, 그것들을 추상적으로 생각하도록 유도하십시오- 창의성에 대해 보상 한 다음 창의성을 컴퓨터 프로그램으로 전환 한 것에 대해 보상하십시오.
  3. 가능한 한 적은 양의 구문을 사용하십시오. 그들이 것을 모르고 - 생성 클래스 및 언어 구문과 같은 상용구 물건은 종종 프로그램의 모든 어디서 중괄호를 넣어하는 방법을 알고 있는지 생각으로 학생들을 오도하는 것이 프로그램의 도입에 매우 유행 곱슬의 중간에 무슨 중괄호는 창의성이 흐르는 곳 입니다. 간단한 언어를 선택하고, 여전히 무언가를 복사하여 붙여 넣으려는 학생들을 위해 샘플 파일 (예 : 빈 수업 파일)을 제공하십시오. 과정이 진행됨에 따라 점차 구문과 컴파일 가능한 할당에 대해 더 엄격해질 수 있습니다.

그것은 &&비트 단위 연산으로도 성공할 수 있다고 생각하지만 그래야합니다 .
tvanfosson

나는 데이터가 어떻게 생겼는지 모르지만 비트 연산은 내가 의도 한 것입니다. Good catch :-)
Kevin McCormick 21

3
"중괄호의 한가운데에 창의력이 흐르는 곳이 있습니다"==> 죄송합니다. 그러면 그들에게 파이썬을 가르치지 않을 것입니다.
Olivier Pons

3
교사에게 학습 대신 '올바른'답변을 제공하려는 데 따른 또 다른 문제는 사람들이 종종 학습이라고 생각한다는 것입니다. 예 : lesswrong.com/lw/iq/guessing_the_teachers_password
Wilka

6
그리고 여기에 행복한 세미콜론 몇 개를 추가하겠습니다 ...
VirtuosiMedia

44

내 마음에 오는 몇 가지 :

  • 그들에게 다른 사람 (당신)이 작성한 코드를 실제로 설명 할 수있는 임무를 부여하십시오. 이전 코드에 대한 이해 또는 특히 코드 부족이화물 컬트 프로그래밍의 가장 큰 원인이자 위험입니다. 필요한 경우 한 줄씩 주석을 사용하여 프로그램을 일반 영어 (또는 사용하는 언어)로 설명하도록 요청하십시오.

  • 코드를 설명한 후에 만 ​​특정 변경을 위해 코드를 수정하도록 요청하십시오. 예를 들어, 내림차순으로 정렬하는 정렬 함수를 제공 한 경우 오름차순으로 정렬하도록 요청하십시오. 또는 더 까다로운 것. 그러나 주어진 코드를 이해해야 하는 것이 맞는지 확인하십시오 .

  • 원하는 경우 부활절 달걀을 코드에 넣을 수 있습니다. 전혀 문제가되지 않거나 전혀 문제가되지 않는 한두 줄. 그들에게 그러한 선이 존재한다는 것을 암시하고 그것을 제거하는 사람들에게 추가 점수를 부여하십시오.

  • 그런 다음에야 자신에게 코드를 처음부터 작성하도록 할당 할 수 있습니다. 이 시점에서 그들은 코드가 실제로 무엇인지에 대해 훨씬 더 잘 이해해야합니다. 그들은 스스로하기가 조금 더 쉬울 수도 있습니다.

기본 아이디어는 프로그래밍이 코드를 작성하는 것이 아니라 읽는 것입니다. 읽기 코드도 가르쳐야합니다.


4
이스터 에그 아이디어는 테스트 / 검증을 가르치는 좋은 방법 인 것 같습니다. "계약을 위반하지 않고 와트를 제거 할 수 있습니까?"
Neil N

3
코드 읽기 +1 직관적 인 추측을하고 버그를 증명하여 버그를 수정하는 많은 사람들이 있습니다. 코드를 읽으면 올바른 솔루션을 얻을 수있는 단서가됩니다. 그것은 명백하게 들리지만, 나는 그것이 많이 무시한 것을 본다.
Chris

38

다른 방법으로보십시오. 이화물 숭배 현상은 Dreyfus 기술 습득 모델의 초보자 단계입니다 . 이것이 우리가 배우는 방법입니다. 프로그래밍을 처음 배웠을 때 Compute의 뒷면에서 코드 페이지를 입력하기 만하면됩니다! 잡지. 반복이 핵심입니다. 아기는 부모가 듣는 소리를 복사하여 말하는 법을 배웁니다. 우리가 배우는 모든 것은 모방을 통해서입니다. 우리는 모방에서 숙달로가는 방법을 배워야합니다.

당신이 가진 문제는 학생들이 아무것도 반복하지 않고 인터넷에서 복사한다는 것입니다. 그것에 약간의 이점이 있지만 이득은 최소입니다. 실제로 코드를 입력하는 행위는 나를 이해의 장소로 이끌었습니다. 나는 타이핑하는 것에 패턴이 나타나기 시작했고 내가하고있는 것에 대한 이해를 얻었습니다.

실험실을 코드 dojo로 구성하는 옵션이 있습니다. 학생들에게 같은 문제에 대해 서로 짝을 이루어 교제하도록하십시오. 해결하는 데 약 10 ~ 15 분이 걸리는 문제를 선택하십시오. 몇몇 실습에서이 문제를 반복하고 반의 실력이 향상됨에 따라 새로운 문제를 일으킨다. 학생들이 솔루션을 프로그래밍하는 것을보고 실험실에서 반복하도록하여 실험실을 시작할 수도 있습니다. 각 반복마다 스위칭 쌍.

귀하의 시험에는 각 학생이 나머지 수업 앞 학기의 문제를 해결하는 코드 kata가 있습니다. 정확성뿐만 아니라 형태와 창의성에 중점을 둡니다. 나는 이것이 가정 과제를 부여하는 것보다 프로그래밍하는 방법에 대한 깊은 이해를 제공 할 것이라고 생각합니다.


"처음 프로그램을 배웠을 때 Compute! 잡지 뒷면에서 코드 페이지를 입력하는 것이 전부였습니다." 매우 지루한. 나는 곧 반대되는 태도를 개발했다. 다른 곳에서 복사 할 수있는 코드조차도 작성하라. 그렇지 않으면 코드에서 실제로 무슨 일이 일어나고 있는지 확신 할 수 없다.
조르지오

우리 교사 중 한 명이 우리에게 그가 준 어셈블러 프로그램을 복사하도록 과제를 주었고, 우리 자신의 필체로 사본을 만들어야했습니다. 그는 또한 우리가 첫 페이지에 이름을 써서 필기가 우리의 것인지 확인하기를 원했습니다. 그 임무에는 약 3 시간이 걸렸습니다.
sashoalm

1
Jon Jagger의 Cyberdojo 와 같은 방해받지 않는 환경 이이를 위해 우수 할 수 있으며, 자신의 서버를 설정하는 것은 github 에서 가상 머신 또는 소스를 다운로드하는 것만 큼 간단 합니다.
Mark Booth

@giorgio 나는 당시 8 살이었습니다. 내 기술 수준은 "무료 게임에 이것을 입력하십시오"
Michael Brown

25

나는 과거에 입문 수업을 가르쳤으며 지금 되돌아 보는 것을 기억합니다.

어떤 학생들은 프로그래밍이 다른 이유로 그렇게 생각합니다. 나는 내가 한 일을화물로 많이 배운 좋은 아이를 기억합니다.

그것이 고립 된 문제는 아니라고 생각하지만 같은 수업에 참여하는 다른 학생들은 비슷한 행동을하거나 문제에 접근하고 표현하지 않을 수 있다고 항상 생각했습니다.

  1. 결정론과 같은 것들을 설명하는 데 어느 정도 시간이 걸렸는데, 이는 동일한 데이터와 코드가있는 동일한 환경에서 동일한 결과를 가질 것이라는 의미입니다 ( "랜덤 성"을 무시 함).

  2. 문제 해결은 학생의 행동에 달려 있으며 다른 문제는 아닙니다. 문제를 해결하고 올바른 철자를 찾지 못하도록주의를 기울여야합니다.

  3. 그들은 교육 환경에 있으므로 학습 경험을 제공하기 위해 문제가 만들어지며 결과는 프로그래밍 방법 (또는 경우에 따라 시스템 관리자 수업, 프로그램 작동 방식, 다른 방식)을 배우는 것입니다. 나에게 해결책을 줘. ( "세계는 다른 계산기가 필요하지 않습니다. 운동입니다"), 사용 가능한 자료 (예 : 제공된 메모)로 문제를 해결할 수 있습니다.

  4. 코드 완성에 있다고 생각합니다. "복사하여 붙여 넣어도 코드는 본인의 것입니다." 누군가 그렇게했다면화물 스타일이어서는 안됩니다. 모든 줄은 나에게 (개별적으로) 또는 다른 학생에게 (동일한) 또는 수업에 설명해야했습니다.


23

학생들은 코스 시작올바른 '추상 레벨' 에서 시작 했습니까 ? 예를 들어 한 줄의 코드를 작성하지 않고 루프 및 조건부와 같은 주요 프로그래밍 구조를 소개하는 숙제?

프로그래밍을 소개했을 때 첫 번째 과제는 ' Rick the Robot '이었습니다. 우리는 은행, 식료품 점 등 흥미로운 점이있는 도시의 항공지도가있는 종이를 가지고있었습니다. 우리는 'Rick'이라는 친구가 있었고 '한 걸음 걸음', '왼쪽보기'와 같은 행동을했습니다. '올바른 모습', '길 건너', '반복', '만약 무언가가 있다면 무엇인가'와 같은 것을 사용할 수 있습니다. (이 과제를 찾을 수 없었기 때문에 이것은 100 %가 아닙니다.) Rick은 자신이받은 것만 사용할 수 있고 맵의 다른 장소로 가야한다는 아이디어가있었습니다.

이것은 재미있는 운동이었고 당신을 기본에 대해 소개 한 것입니다. 이 문제 (게임)에 대한 좋은 대답은 없으며 복사하여 붙여 넣을 솔루션이 없습니다. 이와 같은 코드를 사용하면 코드를 위협하지 않고 창의력을 발휘할 수 있습니다.

마지막으로, 아이디어는 초록으로 시작 하여 콘크리트 쪽으로 이동하는 것 입니다. 붙여 넣기 초록은 복사 할 수 없습니다. 그들은 문제를 해결하기 위해 그것을 이해해야합니다.


3
루프와 조건? 변수, 대입 및 표현식으로 시작하겠습니다. 명령 행에서 두 개의 숫자를 읽고 추가 한 다음 결과를 인쇄하게하십시오. 거의 고통스럽고 분명한 일을하는 것은 학생들에게 무슨 일이 일어나고 있는지 이해할 수 있다는 자신감을주고 실험을 장려합니다.
TMN

2
@c_maker : 과제는 미취학 아동을위한 게임처럼 보입니다. 학생들에게 너무 쉬운 작업을 제공하면 과목에 대한 관심을 줄일 수 있습니다.
Goran Jovic

2
@ c_maker : 귀하의 답변에 장점이 있다고 생각합니다 while not at-corner do take-one-step end. 변수 및 데이터 유형과 같은 것들에 대해 " 채우지 않고"실제 코드 로 이동하는 방법을 보지 못했습니다 . 사과, 내 반응은 반성에 약간 가혹한 것 같습니다.
TMN

7
릭 로봇의 주요 가치는 루프, if 문 등을 이해하는 데 도움이되지 않는다고 생각합니다. 주요 가치는 프로그램 작성 방법의 일반적인 프로세스를 이해하는 데 도움이됩니다. 특정 단계별 알고리즘 방식으로 문제를 확인할 수 있습니다. 이 예제를 통해 영어로 프로그래밍 프로세스를 이해하면 코드의 모양을 가르쳐 세부 사항을 채울 수 있습니다. 이것은 훌륭한 아이디어입니다. +1
Phil

1
[Karel the Robot] ( en.wikipedia.org/wiki/Karel_(programming_language) 을 기반으로 한 나의 소개 과정 (30 년 전!)을 상기시킵니다 . 어쨌든, Karel은 파스칼과 같은 문법을 사용했지만 너무 많이 사용하지는 않았습니다.
JeffK

20

당신이 요구하는 것은 현재 블룸의 분류 체계의 인지 영역에서 분석과 합성을 보여주는 것입니다.

불행히도, 그것은 일종의 "말을 물로 인도"하는 유형의 상황입니다. 여전히 이해력에 어려움을 겪고있을 때 분석과 합성은하기 매우 어렵습니다. 이해력이 없으면 분석 및 종합 활동은 학습 활동보다 잡초로 더 많이 작용할 것입니다.

내 개인적인 의견은 프로그래밍 클래스 소개에 응용 프로그램 이상을 기 대해서는 안된다는 것입니다. 이것은 학생들이 이러한 개념에 처음 노출 된 것이므로 아이들에게 에세이를 쓰라고 요구하기 전에 읽도록 ​​가르치는 것과 같습니다. 이러한 높은 수준의 기술은 이후 수업에서 따릅니다.


2
Bloom 's Taxonomy에 대해 매우 흥미로운 내용입니다. 제 생각에, 학생들이 코드를 이해하고 소개 강의에서 붙여 넣는 것보다 코드를 이해하도록하는 것이 더 중요합니다. 그들은 if진술 이 어떻게 작동 하는지 알아야 하고, 계속 나아 가기 전에 처음부터 자신의 글을 쓸 수 있어야합니다. 인지 부분이 작동하도록 한 다음 응용 프로그램으로 이동하십시오.
Phil

저는 최근 Richard Felder의 훌륭한 교수 관련 과정에 참석했습니다. 그의 의견은 강화하기 전에 블룸의 분류 체계를 "마스터 링"할 필요가 없다는 것입니다. 예를 들어 그는 유치원 어린이들에게 세서미 스트리트 (Sesame Street) 또는 [...?]와 왜 더 나은 TV 쇼가 더 나은지 비교할 때 어떻게 분석을 연습하고 있는지 이야기했습니다.
Aivar

11

시작하기 위해 코드를 제공 하는 것을 고려 했습니까 ? 빈 주 함수처럼 할당에 필요한 간단한 비계가 무엇이든 (어떤 언어를 사용하고 있는지 모르겠습니다). 컴파일하고 실행하며 아무것도하지 않는 것. 그런 다음 코드의 적어도 일부 가 작동 한다는 확신을 가지고 코드를 추가 할 수 있습니다 .

이것은 실제로 "실제 세계"에서 일반적입니다. 많은 IDE 및 기타 도구가 이미 일반적인 라이브러리 / 템플릿 / 구성 파일을 사용하여 빈 프로젝트를 만듭니다.


코드를 제공하는 또 다른 방법은 코드를 작성한 클래스 (이전 코드와는 작동하지 않음)와 상호 작용하고 코드를 변경할 수없고 할당해야하는 과제를 요구하는 것입니다. 과제를 수행하는 코드.
Zoot

또는 코드를 제공하여 단방향으로 작동하도록하고 동작을 변경 / 추가하도록 할당하십시오. 그렇게하면 기본 동작이 아닌 특정 동작에 중점을 둡니다.
JohnMcG

모국어의 경우 상용구가 필요없는 언어를 사용하십시오. 파이썬은 이런 점에서 좋으며 C / C ++ / Java는 예를 들어 좋지 않습니다.
Lie Ryan

IDE, 코드 완성 및 템플릿은 화물 컬트 정신을 증진 시킵니다. 학생들이 시간을내어 템플릿 코드가 필요한 이유 를 이해 하고 맹목적으로 레시피를 따르는 것보다 훨씬 많은 것을 배우게됩니다.
Mark Booth

8

화물 컬트를 포함한 모든 종류의화물 컬트 정신 은 관련된 기술에 대한 근본적인 이해 부족에서 비롯됩니다.

카고 컬트 프로그래밍은 문제가있는 습관이 아니라 프로그래머가 직면 한 근본적인 혼란의 증상으로 생각해야합니다.

더 중요한 것은, 학생의 이해 부족이 단순히 자신감 부족의 결과라는 가정은 근본적으로 오도되어 근본적인 문제를 다루지 않습니다.

대신, 학생의 복사-붙여 넣기 프로그래밍 스타일은이 학생이 자신이해야 할 일의 복잡성에 압도되어 있음을 알려주는 붉은 깃발이어야합니다.

그는 본능적으로 과거 프로젝트를 현재 프로젝트를 구축 할 비계로 사용하고 있으며 이전에 해결 된 문제를 빌딩 블록으로 사용하여 솔루션을 작성하려고합니다. 우리 모두는 어느 정도 이것을 수행하지만, 대부분의 사람들은 과거 작업에서 얻은 지식을 빌딩 블록 으로 사용하여 수행합니다 . 이 학생은 대신 작업 자체를 사용하고 있습니다. 즉, 작업중인 블록을 진정으로 이해하지 못합니다. 그는 자신의 이해가 허락하는 한 작업을 분해했으며, 큰 코드 블록을 원자 단위로 취급 합니다 . 작동 방식을 이해하지 못하기 때문 입니다. 그는 그들이하는 일만 알고 있습니다.


감사! 당신은 생각할 음식을 많이주었습니다. 처음에는 코드 조각 안에 구조와 구성 적 의미가 있다고 상상할 수 없다고 생각했습니다. 이제 나는 그들이 실제로 그것을 이해하려고 애 쓰지만 실패하고 최후의 수단으로 복사 붙여 넣기를 사용했다고 생각합니다.
Aivar

7

프로젝트 아이디어를 바꾸 십시오 !

프로그래밍 세계에서는 실제로 모든 솔루션에 대해 새 프로젝트를 실제로 만드는 경우는 거의 없습니다. 대부분 우리는 오래된 것들을 수정합니다.

과제에 대한 하나의 솔루션에서 전체 학기에 대한 하나의 솔루션으로 프로젝트 아이디어를 변경하십시오. 각 과제 는 이전 과제를 기반 으로합니다.

프로젝트 : 엘리베이터 시스템 구축

  • 과제 1 : 현재 층을 인쇄
  • 과제 2 : 엘리베이터 클래스의 데이터 구조를 만들고 엘리베이터를 기준으로 바닥을 인쇄
  • 과제 3 : 바닥을 인쇄하여 "엘리베이터 이동"코드를 작성하십시오. 키보드 입력 허용 (> 입력 층 :)
  • 과제 4 : 다수의 엘리베이터 취급

요점은 새 작업에 대한 이전 할당을 재활용하는 대신 이전 할당 을 기반 으로 한다는 것 입니다.


2
복사-붙여 넣기는 문제가 아니며 문제는 복사하는 내용을 이해하지 못한다는 것입니다.
Aivar

1
증분 할당의 한 가지 문제는 학생이 초기 과제를 엉망으로 만들면 나머지 코드에는 작동하지 않는 코드가 붙어 있다는 것입니다. 많은 강사들이 후속 과제의 기초로 사용할 작업 코드를 유용하게 제공 할 수 있지만, 원래 문제로 돌아갑니다. 이해하지 못하는 다른 사람의 코드 수정
베리 브라운

정말? 강사가 학생의 코드 작업을 도와 줄만큼 도움이되지 않으면 실제로 일을하고 있습니까?
Richard

모든 사람이 마감일까지 과제를 수행하지는 않습니다.
Barry Brown

@Barry, 코스 전체에 논리적으로 구축되는 모든 주제에 해당되지 않습니까? 예를 들어, 집합 조합과 교차로를 배우지 않으면 나머지 이산 수학 과정을 망칠 수 있습니다. 또는 주기율표를 배우지 않으면 남은 화학 과정에 적합합니다. 아이디어는 학생들이 올바른 순서로 개념을 습득하고 개념을 습득 할 때까지 엉덩이를 움직이게하는 것입니다. 다음 주 수업에 대비하여 프로그램을 준비하기 위해 일주일 동안 밤새도록 시간을 보낼 수 없다면 소프트웨어 개발 경력을 쌓을 필요가 없습니다.
Jonathan Henson

7

최소 상용구 코드가 필요한 고급 언어를 사용하는 것이 좋습니다.

나에게는 종종 마법 주문처럼 느껴지고 이해력을 방해하는 큰 프레임 워크 또는 장황한 언어의 상용구 코드입니다.

저는 CS 입문 프로그래밍 과정에서 ML 을 개인적으로 배웠습니다 . 수년 동안 Lisp 는 MIT에서 프로그래밍을 소개했습니다. 둘 다 훌륭한 선택입니다. 그들이 가진 이점 중 일부는

  • 대화식 통역사. 탐험이 가능하므로 매우 중요합니다.
  • 간결합니다. 상용구가 전혀 없습니다. 이를 통해 학생들은 표현하려는 아이디어에 집중할 수 있습니다.
  • 상대적으로 모호하고 외계인 (적어도 학생들이 이미 경험 한 Java, C 또는 기타 주류 언어와 비교). 그렇습니다, 나는 그것을 전문가로 열거합니다. 아무도 사전 경험이 없기 때문에 학생들의 경기장을 평평하게합니다. 또한 솔루션을 웹에서 숙제로 복사하여 붙여 넣을 수있는 가능성이 줄어 듭니다.

ML은 꽤 좋은 선택입니다! 그러나 파이썬은 또한 처음 두 가지 사항에 적합하며 사용하기 쉽습니다 (큰 기술적 번거 로움을 의미하지 않음).
Aivar

또한 특히 Wing IDE와 같은 우수한 IDE와 결합 할 때 Python을 적극 권장합니다.
Ken

6

나는 80 년대 초보 프로그래머의 문제에 대해 조사했다. 오늘 초보 프로그래머와의 경험을 바탕으로 많은 변화가 없었습니다. 초보자에게는 컴퓨터가 실제로하는 일에 대한 유용한 정신 모델이 없습니다. 그들은 기계 자체가 마법이기 때문에 마법의 주문에 의존합니다.

프로그래밍에는 자연스럽게 간단한 작업을 자연스럽게 작은 단계로 나누는 것이 필요합니다. 초보자는 일상 생활에서 이러한 세분성을 다루지 않기 때문에 작은 단계가 무엇인지, 특히 기계가 어떤 작은 단계를 사용할 수 있는지 명확하지 않은 경우 파악하기가 어렵습니다. 그러나 그들이 그것을 알아낼 수 있더라도, 그들은 원격 제어에 의해 미스터리 머신을 제어하는 ​​프로그래밍 언어 (비 자연적 언어로 가장 자연스럽지 않은 언어)의 문법과 제한적 의미론에 직면하게된다.

문제에 대한 논리적 솔루션과 기계의 기능성을 연결할 수 없으므로 언어 ​​요구를 충족시키는 데 중점을 둡니다. 첫 번째 목표는 무엇이든 컴파일하는 것을 작성하는 것입니다. 두 번째는 프로그램이 실제로 무엇을하든 충돌을 피하기 위해 조정하는 것입니다. 그런 다음 시간, 에너지 및 관심이있는 경우 문제가 요구하는 것과 유사한 결과를 생성하도록 프로그램을 시도합니다. 그 과정에서 우연히 잘 작성된 코드를 생성 할 수 있습니다.

어쨌든, 프로그래밍을 배우는 초보자는 의도적으로 컴퓨터를 제공하고 내면화했기 때문에 컴퓨터의 유용한 정신 모델을 유추했기 때문에 성공합니다.


5

서면 응답이 필요한 코드에 대해 질문 할 수 있습니까? "이 코드는 무엇을하고 있습니까?" "프로그래머가 왜 이렇게 해결 했습니까?" "더 나은 방법이 있습니까?"등?

실제로 코드를 건드리지 않고도 할 수있는 문제에 대해 생각하게됩니다.


5
  • 문제에 대한 가장 짧은 솔루션을 만들도록 요청하십시오.
  • 인센티브로 간결한 솔루션을 보상하십시오.
  • 리팩토링 코드를 중심으로하는 연습 만들기
  • 학생들에게 과제를 교환하고 효율성과 코드 청결을 위해 과제를 모의하고 오버 헤드 프로젝터에서 가장 효율적이지 않은 것을 사용하십시오.

2
리팩토링은 실제로 연습하는 데 매우 중요합니다. 그러나 가장 짧은 솔루션은 반드시 가장 깨끗하지는 않으며 가장 효율적일 필요는 없습니다 (이 용어의 정의에 따라 다름).
Péter Török

학교에서는 친구의 솔루션보다 문자 길이가 짧은 솔루션을 작성하려고했습니다. 그것은 짧은 변수 이름과 일반적으로 잘 읽지 않는 코드를 작성하는 것을 의미했습니다.
Christian

@Christian 간단히 말해서, 컴파일러는 실제로 변수 이름을 신경 쓰지 않기 때문에 실제로 문자 길이가 짧지는 않습니다. 코드 복잡성, 일명 KISS 에 대해 이야기하고 있습니다 .
Lynn Crumbling

4

JoelFans 아이디어와 유사하게, 사용자가 작성한 의사 코드 (언어)를 사용하여 종이에 초기 할당을하도록합니다. 적합하다고 생각되는 구조를 추가 할 수 있으며 마법 상자에 대해 걱정하지 않아도됩니다.


4

나는 '카고 컬트 (cargo cult)'라는 말은 그들이 필요하다고 생각하는 것을 삽입하고 있다는 것을 의미하지만 실제로는 문제를 해결하는 데 전혀 도움이되지 않습니다.

이 경우 간결성을 기반으로 등급을 매기는 데 항상 몇 가지 요소를 추가 할 수 있습니다. 프로그램에 불필요하거나 중복 된 코드를 남겨두면 향후 문제가 발생하거나 중단 될 수 있으므로 유지 관리가 더 어려워집니다.

그들은 영어 수업에서 작문 연습에서 비슷하게 판단 될 것입니다. 아무도 접선에서 나오는 물건을 원하지 않거나 일반적으로 요점을 맞추지 않고 엉망이되는 사람은 없습니다.

어셈블리 클래스를 수강 할 때 교사는 속도, 크기 또는 메모리 사용량에 대한 코드를 작성하기를 원할 경우 각 운동에 대해 알려 주었고, 요청한 내용을 최적화하지 않은 경우에는 표시하지 않았습니다. 에 대한.

...

그들이 이전의 유사한 과제에서 코드를 복사하여 붙여 넣는 경우 실제로 새로운 문제를 해결하는 것입니다 ... 음, 그것은 코드 재사용 일뿐이며 재사용을위한 코드의 적합성에 대해 나쁜 가정을하지 않는 한 나는 그들이하는 것이 합리적이라고 생각합니다. (예를 들어, 파일을 읽고, 입력을 위해 ... 재사용 할 수있는 모든 모듈 식 부품을 제안합니다. 원하지 않는 경우, 연습을 다른 것으로 만들어야합니다.


문제는 코드 구조를 보지 않고 복사 붙여 넣기를한다는 것입니다.이 유형의 패턴은 지난번에 유용하다고 생각하기 때문에 여기에도 적합합니다. 그들은 자신감을 가지기보다는 희망과 노력을합니다.
Aivar

4

불행히도, 그것은 많은 사람들의 두뇌가 작동하는 방식입니다. 따라서 이것을 '치료'할 수없는 사람들이 있다는 것을 이해하십시오. 프로그래밍에 필요한 정신 정밀도 수준에서 일할 수없는 사람들이 많이 있습니다. 어떤 사람들은 단순히 그것을 위해 설계되지 않았습니다. 나는 학생들을 포기한다고 말하는 것이 아닙니다. 모든 사람들이 그것을 줍지 않는다면 실패한다고 가정하지 마십시오.

수업의 맥락에 대해 더 많이 알지 못하면서, 간단한 문제 / 학생들 , 루프 등의 기본 구조 에이 문제 학생들과 더 초점을 맞추고 싶습니다 . 홀수, 10 번째 숫자마다 인쇄하는 간단한 루틴. 각각 10 줄 이상의 코드. 그들이 '마술 사고'라면 분명히 그 기초를 아직 마스터하지 못했습니다. 그들이 무슨 일이 일어나고 있는지 파악할 때까지 여러 가지 간단한 일과를하게하십시오. 다른 사람이 종이에 코드를 작성하는 것을 언급했습니다.이 간단한 루틴을 수행하는 좋은 방법이라고 생각합니다.

플로우 차트를 배우도록 고려할 수도 있습니다. 어떤 사람들에게는 알고리즘의 흐름을 볼 수 있고 그것이 코드에 연결되는 방법을 알면 코드를 흐름에 연결하는 데 도움이 될 수 있습니다.


3

이상적으로 첫 번째 강의에서는 완전히 추상적 인 것으로 시작하십시오. (그룹으로서, 리더로서 당신과 함께) 식료품 쇼핑을하는 방법에 대한 지침을 목록에서 작성하고, 고급 지침을 점진적으로 분류하십시오. 그들이 깨달음을 얻을 때까지

이 지시 사항은 문자 그대로 추론하는 방법을 모르는 로봇에 의해 문자 그대로 이어질 것임을 알려주는 데 도움이됩니다. 하지만 안내를 담당하는 실습 활동이어야합니다.


좋은 지적! 나는 이것을 해왔고 이것이 많은 학생들을 올바른 길로 인도했다고 생각합니다. 그러나 전부는 아닙니다.
Aivar

3

Alistair Cockburn은 Shu-Ha-Ri의 개념과 이것이 프로그래밍에 어떻게 적용되는지 http://alistair.cockburn.us/Shu+Ha+Ri에 대해 설명합니다 . 학생들이이 연속체의 어디에 있는지 명심하는 것이 중요하다고 생각합니다. 먼저 좌절감을 완화하는 데 도움이됩니다. 복사 / 모방은 무언가를 배우기 시작할 때 매우 자연스러운 반응이며 받아 들여지는 모드입니다. 둘째, 앞으로 나아가는 방법에 대한 아이디어를 얻는 데 도움이 될 수 있습니다. 예를 들어, 여러 가지 방법 (루프 대 재귀, 콘솔 대 웹 / gui)으로 해결할 수있는 문제를 선택한 다음 먼저 한 가지 방법으로 해결 한 다음 다른 방법으로 배우도록 할 수 있습니다. 합법적 인 코드 재사용, 구성 요소 화, 재사용 가능한 라이브러리 작성 등에 관한 정보

필자가 사용한 또 다른 성공적인 방법은 서로를 기반으로하는 일련의 프로젝트를 구축하여 사람들이 뒤처지지 않도록 과제를 제출 한 후 각 단계에서 기본 작업 버전을 제공하는 것입니다. 프로세스의 각 단계는 새로운 것을 소개해야합니다. 프로그래밍 클래스보다 디자인 클래스에서이 작업을 수행하는 것이 더 쉽지만 여전히 가능해야합니다. 이것에 대한 한 가지 좋은 점은 명시 적으로 각 단계에서 그들과 비교할 수있는 좋은 (희망적으로) 구현을 제공한다는 것입니다. 이 비교를 과제로 제시하십시오. 즉, 노력에 대한 자체 코드의 미니 코드 검토를 수행하십시오. 이것을 여러 가지 추가 신용 옵션 중 하나로 만들 수 있습니다.

필자는 일반적으로 "코멘트"에 큰 비중을 두지 않지만 코드 문서를 등급 항목 중 하나로 만들 수 있습니다. 각 프로젝트마다 접근 방식, 각 구성 요소의 적합성 및 문제 해결 방법을 설명하는 "운영 이론"문서를 작성하게하십시오. 일반적으로 코드 에서이 작업을 많이 수행하고 싶지만 생각 뚜껑을 쓰고 종이에 넣으십시오.

마지막으로 창의력을 발휘하고 학생들이 서로의 코드를 검토하고 평가하도록 할 수 있습니다. 당신을 위해 일하는 동료 압력을가하십시오. 가장 높은 등급의 코드 (및 문서)에 대한 등급 또는 추가 크레딧의 일부가되도록하십시오.


3

빠른 제안입니다. 내가 해결하거나 디버깅 해야하는 프로그래밍 문제가있을 때마다 내 코드에서 '컴퓨터 재생'을보고 머리에서 변수와 값을 추적하고 각 줄이 실행될 때 예상되는 것을 추적하고 싶습니다. . 그래서 어딘가에서 일부 코드를 복사 한 경우 자체 코드가 완전하지 않고 참조 해야하는 경우가 아니라면 정확히 무슨 일이 일어나고 있는지 이해하기 위해 한 줄씩 이동하고 싶습니다. 본질적으로 컴퓨터를 재생합니다. VBA 디버거는 기본적으로이 작업을 더 쉽게 만들어 주지만 학생들이 종이에이를 수행하게하면 기본 사항이 될 수 있습니다. 이 라인은 실제로 무엇을합니까?


나는이 작업을 권장했지만 일부는 너무 느리고 오류가 발생하기 쉽기 때문에 건너 뛰기로 결정했습니다.
Aivar

마커를 사용하여 프로젝터에서이 작업을 시도 했습니까? 고등학교 프로그래밍 수업을 기억하면 선생님이이 작업을 수행했으며 다른 학생들은 대부분 신경 쓰지 않았지만 도움이되는 기술이라고 생각했습니다. (총체적인 일반화가 다가옴) 우리 세대 이하의 학생들에게 동기를 부여하기는 어렵습니다. 우리는 질문하지 않는 법을 배웠습니다.
Mallow December

3

대학 수준에서 입문 프로그래밍을 가르쳤습니다. 그것은 빵과 버터 코스였습니다. 모든 교수진이 그랬습니다. 저는 우리가 아주 잘했다고 생각합니다. 우리는 공통의 텍스트를 따르고 공통 시험을 보았지만 각자의 교실 방법을 사용했습니다. 그 이후로 오랜 시간이 지났지 만 때로는 프로그래밍에서 아이를 가르치는 경우가 많으며 전체 그림은 거의 같습니다.

내가하는 방법은 가능한 한 구체적으로 바닥에서 시작하는 것입니다. 학생들이 아는 것은 구조입니다. 그들은 이미 많은 개념을 가지고 있습니다. 나는 그 위에 더 많은 개념을 만들고 있으며, 비생산적인 개념을 형성하고 있습니다. 동시에 나는을 통해 배우게한다 .

인텔 8008 칩, 일부 EPROM 및 몇 개의 회로가있는 작은 컴퓨터를 만들었습니다. I / O 칩이 커플 스피커에 연결되었을 때 약간의 듀엣을 재생하도록 프로그래밍했습니다. 카운터를 카운트 다운하는 내부 루프와 함께 작은 프로그램이 어떻게 작동했는지 설명하겠습니다. 그것은 지연으로 작용할 것입니다. 그런 다음 출력 비트를 토글하고 다시 수행합니다. 잠시 동안 그런 다음 다른 지연으로 전환하여 다른 피치를주는 등의 작업을 수행합니다. 메모리 칩에는 작은 타이머가 있으며 타이머 입력 중 하나에서 커패시터 리드를 집어 넣으면 프로그램이 veeeeery를 천천히 실행 합니다 . 이 클래스는 내가 컴퓨터 것을 이해하는 클래스를 원 ... 클릭, 클릭, 스피커가 클릭가는들을 수 한 번에 아주 간단한 일을 한 단계 수행. 그런 다음 커패시터 리드를 풀면 "음악"이 터져 나옵니다. (박수 갈채)

그런 다음 1000 자리의 메모리 위치에 각각 부호있는 4 자리 10 진수를 보유한 매우 간단한 10 진수 컴퓨터 용 시뮬레이터를 만들었습니다. "누산기에 추가", "음수이면 점프"등과 같은 매우 간단한 opcode가 있습니다. 나는이 "기계 언어"에서 두 개의 숫자를 추가하거나 숫자 목록을 추가하는 것과 같은 작은 프로그램을 작성하게 할 것입니다. 그런 다음 한 단계 씩 실행하거나 Enter 키를 누르고 있으면 "빠르게"실행되는 것을 볼 수 있습니다.

요점은 컴퓨터가 아주 적은 수의 서로 다른 기본 작업 만 수행 할 수 있다는 개념을 한 번에 하나씩 수행한다는 점입니다. 이것은 컴퓨터가 복잡하고 동시에 모든 작업을 수행하고 마음 속에서 거래를한다는 인상을 상쇄하기위한 것입니다.

거기에서 우리는 "실제"언어 (BASIC :)로 프로그래밍을 시작했는데, 매우 간단하지만 흥미로운 프로그램으로 시작하여 조건부, 루프, 배열, 파일, 병합 등을 통해 작업했습니다. 이 프로그램의 목적은 프로그래밍 기술을 유일하게 사용하는 것이기 때문에 자신이 선택한 프로젝트를 수행 할 수 있도록 충분한 기술을 배치하는 것이 었습니다. 프로젝트에 대한 아이디어를 버리고 거기서 아이디어를 가져옵니다. 나는 마지막 순간까지 그것을 연기하고 당황하게하지 않도록 서면 아이디어를 요청한 다음 진행 보고서를 요구할 것입니다. 나는 그들이 스스로 힘으로 배우기 때문에 프로젝트가 가장 좋은 부분이라고 생각합니다.

컴퓨터가 무엇을하는지에 대한 매우 구체적인 이해의 초기 접지는 나중에 개념을 가르치기가 훨씬 쉬워졌으며, 그렇지 않으면 배열이나 (나중에) 포인터와 같은 실제 속도 범프가 될 것입니다. 우리는이 훌륭한 것으로 "추상화 (abstraction)"라는 개념을 영화 롭게하는 경향이 있지만, 공기가 아닌 콘크리트 기초 위에 세워 져야합니다.


3

saself - 내가 믿는 가르쳐 프로그래머 애니메이션 코드가 무엇을하고 있는지 알 수 측면에서 가장 도전한다. 프로그램에 추상 조작을 수행하는 알고리즘과 수학 변환이 포함되어있는 경우, 특정 지점에서 수학이 수행하는 작업을 이해하는 유일한 방법 (천재가 아닌 경우)은 코드 자체의 실행을 이해해야합니다.

순진한 생각이 틀렸다면 저를 바로 잡으십시오. 당신이하고 싶은 것은 not학생들이 "디자인 패턴"을 사용 하지 못하도록 막는 것이지만, 그들이 CnP가 무엇인지 이해하도록하는 방법을 찾는 것입니까? 그런 다음 학생들에게 애니메이션을 조작하도록 요청하십시오. 애니메이션에서 출력을 조정하려면 각 단계에서 발생하는 상황을 이해해야합니다. 당신이 언급 한 우려에 대해, 잘 구상 된 애니메이션 프로젝트가 학생이 그것을 얻었을 때 명백한 방식으로 나타날 것이라고 상상합니다. 그들이 당신이 특정한 관련, 상호 의존적 인 변수를 기대하거나 조정하지 않은 변형을 실현했을 때.

당신이하고있는 교육 학적 한계와 목표를 알지 못하면, 애니메이션이 완전한 해답이라고 말할 수는 없습니다. 애니메이션 직업을 벗어난 애니메이션의 전체 커리큘럼은 질문에서 추측 할 위험이 있습니다. 소수의 프로젝트는 교묘하고 훌륭한 무언가를 낳을 수 있습니다. 나쁘지 않습니다.

또 다른 참고로, 나는 대학 전 프로그래머를위한 고등학교 수준의 코딩 올림픽 ( 전략) 경쟁에 관한 신문 기사 (예, 종이!)를 읽었습니다. 그들의 도전에 대한 설명은 내가 읽은 것을 기억할 수 있는 순수한 코딩의 가장 분명한 표현이었다 . 경쟁 업체는 서로에 대해 그리고 모범 사례 표준에 따라 판단됩니다. 이 대회를 위해 학생들은 모두 자신의 솔루션을 계획해야 하고 손 코드 문제가 시간 제한 내에 완료하는 데 필요한 원소 "디자인 패턴". 따라서 CnP 프로그래밍에 대한 귀하의 우려에 대한 해결책 은 학생들 이 CnP 와 동일한 "코드 청크"를 작성할 수 있는지 테스트하는 것입니다!

NY 타임즈에 있었을 것입니다. 빠른 검색에서 찾지 못했습니다. 비슷한 예는 ACM의 International Collegiate Programming Contest입니다. 이 콘테스트는 빠른 프로그래밍을 강조합니다. "팀 경쟁에서 번개처럼 빠른 프로그래밍은 결정적인 기발한 기술이며, 이력서 맨 위에는 많은 구직자가 놓을 수있는 것이 아닙니다." 따라서 실제 문제에서 추상화를 권장 합니다.

또한,

HP 코드 전쟁


2

기술적으로는 좋지만 너무 모호한 프로그래밍 언어를 사용하여 수업을 가르치면 복사 할 기존 코드를 찾을 수 없습니다.


1
나는 그들이 다른 사람의 작품을 복사하는 것에 대해 걱정하지 않지만 주어진 상황에서 사용할 수없는 자신의 작품이나 예제 스 니펫을 복사합니다.
Aivar

2

당신은 또한 그들을 어려운 방법으로 취급 할 수 있습니다.

복사 붙여 넣기에 유해한 방법을 찾으십시오. 정확한 예는 없지만, 비슷한보기의 두 번째 연습에 붙여 넣은 경우,화물 컬트 학생들에게 매우 길고 고통스러운 "불안정한 불안정성"또는 "자동 데이터 손상"버그가있는 첫 번째 운동을 만들면 좋습니다. 한편 "비화물 컬트"2 백만 사고는 최악의 학생에게도 명백한 해결책을 가져 왔을 것입니다 (최초의 운동 해결책을 보지 못했음). 그런 다음 레슨을 배우고 붙여 넣기 코드를 세 번째 연습에 복사하기 전에 두 번 생각할 수 있습니다.


1

이 행동은 프로그램이 마법 주문이라는 신념 때문인 것으로 의심됩니다. 게으름과 동기 부족 일 가능성이 높습니다.

따라서 교사로서의 직업은 학생들에게 동기를 부여하는 것이라고 생각합니다. 진정으로 동기가 부여 된 학생은 해결책을 잘라내어 붙여 넣을 수 없습니다 (마감일과 마감일이있는 프로그래머에게만 해당됩니다 ...)


이러한 학생들 중 일부에게는 게으름 및 / 또는 마감일이 확실히 원인입니다. 그러나 일부는 정말 열심히 노력하고 있습니다 ...
Aivar

@Aivar-강사는 아마도 학생들의 강점과 약점에 대해 더 잘 알고있을 것입니다. 호기심, 무엇을 당신은 생각 "열심히"하는 학생들을위한 장애 요인은 무엇입니까?
Leigh

@Leigh-나는 그들이 뇌의 분석 부분을 충분히 훈련시키지 못했고 무차별 대입으로 과제에 접근하고 있습니다. 그리고 그들에 대한 대안적인 접근을 설명하는 것은 어렵다.
Aivar

@ Aivar-아마도 초기 단계에서 분석에 더 집중해야 할 것입니다. 예를 들어 두 부분 운동을 설계합니다. 첫 번째 세그먼트는 코드의 빌딩 블록에 중점을 둡니다. 두 번째는 동일한 예제를 해체, 디버그 및 분석합니다. 즉, "이유"에 대한 질문을하고 실제 접근 방식이 다른 접근 방식 (부식 력 등)으로 코드를 개선하는 방법에 대해 논의합니다. 지식을 강화하고 특정 언어로 올바른 구문을 구성하는 것 이상으로 프로그래밍을 보도록 장려하는 데 도움이되는 조기에 그리고 자주 수행하십시오.
Leigh

1

서브 루틴을 가르칩니다. 이전 과제에서 얻은 코드를 가져와 서브 루틴으로 바꾸게합니다. 서브 루틴이 실제로 수행하는 작업을 이해하는 데 도움이되는 기능 문서에 대해 설명하십시오.


이것은 실제로 문제를 해결하지 못합니다.
Pubby

나는 그렇게 생각합니다. 화물 컬트는 목적에 맞지 않는 코드를 포함합니다. 그들이 코드를 서브 루틴으로 나누고 서브 루틴이 무엇을하는지 문서화하면 도움이 될 것입니다. 분석은 학습의 큰 부분이며 분석은 여러 부분으로 나누어야합니다.
Tony Topper

1

학생들이 인터넷에 접속할 수없는 교실 앞에서 과제를하도록하십시오 (학교가 인터넷을 끊고 수업 중 전화 사용을하지 않도록하십시오). 최소한 테스트를 위해이 작업을 수행하십시오. 기본 프로그래밍 경험을 위해 인터넷을 사용해야하는 이유는 전혀 없습니다. 이 책은 소개 연습을위한 충분한 자료가되어야합니다. 고급 수업에 참여하고 이미 생각하는 법을 배운 후에는 인터넷 사용을 허용하십시오.


1

그들에게 비슷하게 들리는 과제를주지 마십시오.

또는, 더 미친다면, 처음부터 TDD를 배우십시오. 실제로 해결중인 문제를 공식화하는 데 도움이되는 많은 코드 (즉, 테스트)를 작성 (복사하지 않고 작성)합니다.


테스트 작성은 처음에 코드를 작성하는 것보다 어려운 경우가 많습니다. 교사가 시험을 작성한 다음 학생들에게 과제에 맞서 달릴 것을 제안합니다.
TMN

@TMN : 역효과를 낳을 수 있습니다. 학생들은 테스트가 통과 될 때까지 코드를 임의로 변경하도록 암시 적으로 권장됩니다.
Goran Jovic

@ GoranJovic : "암시 적으로 권장"에 동의하지는 않지만 의도로 작성된 코드와 테스트를 통과하기 위해 함께 해킹 된 코드를 구별하는 쉬운 방법이 없다는 것을 알고 있습니다. 물론,이 문제는 학계에 국한되지도 않습니다 ...;)
TMN

@TMN : 그리고 "한 번에 한 단계 씩 (개발자가 필요로하는 한 단계)"증분이 사라질 것입니다.
herby

해결책 : 학생들이 프로그램을 작성하는 동안 사용할 수있는 최소한의 테스트 세트를 제공하지만 프로그램은 훨씬 더 포괄적 인 테스트 세트에 대해 등급이 매겨지고 학생들이 작성하는 테스트에 대해 실행될 것이라고 경고합니다.
베리 브라운

1

수업 시간에 사람들에게 매우 도움이되는 것은 그들이 선택할 수있는 주제에 대해 작은 프로젝트를 작성하는 것입니다.

프로그래밍을 시작했을 때도 힘들었고 수업 시간에 많이 복사했습니다. 그런 다음 집에서 게임 프로그래머가되고 싶을 때 작은 게임을 만들기 시작했고 훨씬 쉽게 만들 수있었습니다. 비록 그들이 우리가 수업에서 본 것들보다 훨씬 더 힘들었지 만. 그냥 관심이 있었기 때문입니다.

우리 반의 다른 사람들은 시험에서 40-50 %에서 90-100 %로 똑같은 일을했기 때문에 갔다.


1

내가 입문 프로그래밍 과정에 있었을 때 강사는 모든 사람이 영어로 알고리즘을 작성하고 코드를 작성하기 전에 알고리즘을 인쇄하여 켤 것을 요구했습니다. 그런 다음 변수 만들기, 사용자 입력 가져 오기, 계산 수행, 출력 출력 등과 같은 주석을 많이 입력해야합니다. 더. 이로 인해 내가 뭘했는지 생각하고 솔루션을 작성하고 영어와 Java 간을 계속해서 번역했습니다.

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