C ++의 기본 사항에 어려움을 겪고있는 개인지도 교사


26

나는 첫 프로그래밍 언어의 기초를 배우는 데 큰 어려움을 겪고있는 몇 명의 학생들을지도하고 있습니다 : C ++. 나는 첫 CS 과정을 실패하거나 중단 한 많은 우수하고 밝은 학생들을 알고 있습니다. 내가지도하고있는 모든 사람은 수업에서의 그의 경험에 대해 비슷한 설명을한다 : 강사는 너무 빨리 움직이며, 강의에는 아무 의미가 없다. 이 CS 수업 전에는 어려움을 겪고있는 대부분의 학생들이 컴퓨터에 워드 프로세서, 웹 브라우저 또는 다른 형태의 엔터테인먼트 이상으로 관심을 보이지 않았습니다. 컴퓨터는 작동하는 블랙 박스이므로 왜 엉망입니까?

가장 좋은 추측은 컴퓨터 과학의 추상화를 익숙한 개념과 연결하는 데 문제가 있다는 것입니다. 다시 말해,이 학생들은 수학, 생물학 또는 물리학을 배우는 방법을 알고 있을지 모르지만 프로그래밍에 있어서는 그 기술이 효과가 없습니다.

누구든지 제안이나 조언이 있습니까? 내가 돕고있는 학생들은이 수업에 실패 할 자격이 없습니다. 강사가이 학생들의 학습 스타일을 고려하지 않는 것이 분명합니다. 즉, 강사는 그의 학생들이 실패하고 있습니다.


2
해설자 : 답변이있는 경우 답변으로 남겨 두십시오. 의견으로 남겨 두지 마십시오. 답변이 이미 추가 된 경우 투표하십시오. 이 질문의 주제를 다른 사람들과 토론하고 싶다면 chat을 사용하십시오 .

1
하지? 내 경험으로는 충분한 프로그램과 프로그램을

답변:


42

실제로 모든 초보자가 어려움을 겪는 몇 가지가 있습니다. 학생들은 코드 작성 방법을 배우기 전에 코드를 읽는 방법을 알아야합니다 .

  • 명령형 언어의 순차적 특성. 사람들은 레시피와 같이 함수가 한 번에 한 항목 씩 순서대로 실행된다는 것을 이해하는 데 어려움을 겪고 있습니다. 이를 극복하는 한 가지 방법은 디버거를 통해 작동하는 일부 코드를 표시하는 것입니다.
  • =C 스타일 언어 의 대입 연산자 ( )는 매우 잘못되었습니다. 당신은 매우 조심스럽게 설명 할 필요 a = 5수단 "변수에 5 할당 a, 하지 "a "는 5와 같다.
  • 초보자에게는 다른 함수가 건너 뛸 수있는 구조화 된 코드 블록으로 함수를 설명하는 것이 안전합니다. 또한 초보자는 C ++에서 함수 인수가 이름이 아닌 순서로 식별된다는 것을 이해하지 못했습니다.
  • 대부분의 명령형 프로그래밍 언어에는 선언적 구성 요소와 절차 적 구성 요소가 있으며 C ++도 예외는 아닙니다. 학생이 코드의 일부 부분이 프로그램의 구조를 설명하고 다른 부분 (기능)이 프로그램의 기능을 설명한다는 것을 이해하도록하십시오.
  • 디버거를 사용하여 프로그램을 단계별로 실행하는 것은 매우 중요하고 종종 무시되는 교육 도구 입니다.
  • 식에는 유형있습니다 . 3+3정수, 3.5 + 3이중, "3" + "3"C #에서 문자열, x == 5 * 3 + 25부울 (또는 C ++에서 정수)입니다. 학생 이이 개념에 완전히 익숙해 지도록 많은 시간을 보내십시오 .
  • 가변 범위는 초보자가 항상 혼란스러워하는 것입니다. 학생에게 범위의 작동 방식을 설명하고 x한 범위에서 x정의 된 것이 다른 범위에서 정의 된 것과 다른지 확인하십시오 .
  • 모든 변수는 수명, 선언, 할당 (보통 선언과 같은 줄에서 수행), 소비에서 적어도 세 번 참조됩니다. 이것들 중 하나라도 빠지면 어딘가에 개념적 실수가 있습니다. 같은 이유로 작업중인 프로그램을 분석하는 경우 항상 변수의 목적을 파악하기 위해 코드에서이 세 가지를 찾을 수 있습니다.
  • for루프를 사용한 반복의 적절한 예가 while주어질 때까지 루프를 가르쳐서는 안됩니다 . 속기 구문은 혼란스럽고 while루프를 사용할 수없는 이유를 학생들에게 궁금하게 합니다. for루프와 관련 하여 루프 를 설명하는 치트 시트를 갖는 while것이 도움이 될 수 있습니다.
  • 배열과 포인터는 가르치기 쉽지만 배우기에는 악몽입니다. 다시 말해, 클릭 할 때까지 연습이 중요합니다.
  • 코드가 텍스트이고 컴파일 된 프로그램이 실제로 파일 이라는 아이디어는 일부 초보자에게는 애매 모호합니다. 쉘에 .cpp, .h 및 이진 파일을 보여주십시오.

C ++의 OOP 구성 요소는 완전히 다른 짐승이며, 강사가 거기에 도달하지 않기를 바랍니다. OOP는 처음부터 OOP로 설계된 언어를 사용하여 가장 잘 가르쳐지기 때문입니다. 내 경험상 C ++을 통해 OOP를 가르치는 것은 결코 성공하지 못했습니다.


2
"사람들은 기능이 순서대로 실행된다는 것을 이해하는데 어려움이 있습니까?" 나는 그것이 사실상 누구에게도 문제가없는 것이라고 생각합니다 (절차를 시작하기 전에 이미 일부 기능 언어를 배운 사람들을 제외하고). 그러나 나는 당신이 말하는 다른 모든 것에 동의합니다.
leftaroundabout

2
디버거로 스테핑하면 +1이므로 프로그램 자체와 실행 사이의 차이를 알 수 있습니다.
Mike Dunlavey

4
@leftaroundabout 당신은 놀랄 것입니다. 수학은 대부분 선언적이므로 명령형 언어는 대수를 배운 사람을 버릴 수 있습니다.
Rei Miyasaka

2
이 답변은 "개념을 떨어 뜨리는"것 같습니다. 개념은 의심의 여지없이 정확하고 확실히 중요하지만,이 방법을 가르치는 것은 도로 규칙을 따돌림으로써 운전하는 방법을 누군가에게 가르치는 것과는 조금 다릅니다.
riwalk

@ Stargazer712 모든 사람들은 도로 ​​테스트를 시도하기 전에 도로의 규칙을 배웁니다. "연습이 중요하다"또는 "창의적이다"또는 "논리적으로 생각하라"와 같은 푹신한 광범위한 뇌졸중 아이디어를 제시 할 수는 있지만, 대부분의 학생들뿐만 아니라 모든 강사에게도 분명하게 드러납니다. 프로그래밍의 선구자로서 이산 수학이나 언어 이론과 같은 추상적 인 것을 가르 칠 수도 있지만, 직관만으로는 문제를 해결할 수없는 역학이 복잡한 경우에만 중요합니다. 조만간 사람들은 선을 그만두고 내용을 가르치기 시작해야 합니다 .
Rei Miyasaka

19

전에 프로그래밍을 가르쳤습니까?

나는 CS와 비 CS 전공들에게 4 년 동안 프로그래밍을 가르쳤다. 첫 학기, 내 경험은 몇 가지를 배울 때까지 당신과 같았습니다.

저에게 매우 단순 해 보이는 것은 초보자에게는 전혀 단순하지 않았습니다.

언어와 상관없이, 당신은 정신 프레임 워크를 제자리에 두어야합니다.

  • 컴퓨터는 한 번에 한 가지 작업 만 수행합니다. (병렬화와 파이프 라이닝을하고 있다고 말하는 사람은 사라집니다. 학생들이 무언가를 알게되면 돌아옵니다.) 컴퓨터는 몇 가지 다른 일만 할 수 있으며, 이전 단계가 끝날 때까지 한 걸음을 시작할 수 없습니다. 컴퓨터가 너무 많은 일을하고 순간적으로하는 것처럼 보이기 때문에 초보자에게는 모든 것이 한 번에 수행되고 마음을 읽는 것처럼 보입니다.

  • 변수가 중요합니다. 변수 이름과 런타임에 그 내용은 완전히 다른 두 가지라는 것을 이해해야합니다. 초보자는 이것으로 어려움을 겪습니다. "이름을 입력 할 프로그램을 작성한 다음 Hello를 말하십시오"라고 말하면 이름을 보유 할 변수가 필요하다는 사실을 알아야하며 변수의 이름을 생각해야합니다. 스스로 이름을 짓고 "입력"이 무엇을 의미하는지 궁금합니다.

  • 프로그램을 작성 / 편집하는 시간과 프로그램이 실행되는 시간 사이에는 큰 차이가 있습니다. 첫 연습 중에는이를 자주 기억해야합니다.

내가 사용하는 언어는 초보자에게 매우 간단하기 때문에 기본 언어였습니다. 기본 프로그래밍 기능을 만든 후에 다른 언어로 넘어가는 것은 어렵지 않습니다.

우리는 종종 보드에 프로그램을 작성한 다음 "컴퓨터를 재생"합니다. 즉, X를 현재 명령문 옆에 놓고 수동으로 수행 한 다음 X를 다음 명령문으로 이동하십시오. 변수는 보드의 직사각형으로 현재 내용을 작성합니다. 과제가 발생하면이를 지우고 새로운 가치를 부여합니다.

내가 개발 한 트릭은 1000 개의 메모리 위치를 가진 시뮬레이션 된 10 진수 컴퓨터였으며 각각 4 자리 숫자를 보유 할 수있었습니다. 누산기로드, 추가, 저장, 점프 등과 같은 작은 "오피 코드"세트가있었습니다.이 "머신 언어"로 작은 프로그램을 작성한 다음 작동하기 위해 한 단계 씩 실행하도록했습니다. 그런 다음 변수, 점프 등과 같은 개념을 설명하기가 훨씬 쉽습니다.

희망이 도움이됩니다.


나는 시뮬레이션 된 컴퓨터 아이디어를 좋아한다. 공식 언어가 있습니까, 아니면 의사 코드 / 일반 영어로 아이디어를 논의하십니까?
Rei Miyasaka

@Rei : (Basic으로) Simple이라는 시뮬레이터를 작성했습니다. 모든 키보드 인터페이스였습니다. 사용자는 "메모리"에 값을 입력 할 수 있습니다. 그런 다음 한 단계 만 거치면 원하는 경우 각 지점에서 누산기와 메모리를 검사 할 수 있습니다. 나는 그들이 가지고 있기 때문에이 정말 중요하다고 생각 하고 그냥 얘기하지, 그것을.
Mike Dunlavey

알았어 고마워, 나는 그런 것을 시도해야합니다.
Rei Miyasaka

이것은 제 의견으로는 # 1 답변이어야합니다.
riwalk

12

제 생각에는 C ++은 모국어로서의 과잉입니다.

내가 너 였고 충분한 시간이 있다면 파이썬 (또는 비슷한)을 사용하여 프로그래밍과 CS의 개념을 소개하려고합니다.

개념이 명확 할 때, 즉 기본 데이터 구조, 간접, 기본 알고리즘 등에 익숙한 경우 C ++을 천천히 소개하고 이미 학습 한 내용과 매우 빠르게 관련 될 수 있습니다.


2
나는 동의하지만, 교수들은 대개 어떤 언어를 가르 칠지 선택할 권리가 없으며 TA가 훨씬 적습니다.
레이 미야 자카

4
나는 파이썬에 동의하지 않습니다. 저는 C ++에서 첫 번째 CS 101 수업을 겪은 후 Python에서 CS 101을 가르치는 학교로 전환했습니다. 우리 모두가 같은 CS 201 수업을 들었을 때 파이썬 학생들은 기본조차 혼란 스러웠습니다 ... 그러나 모든 C ++ 학생들은 뛰어났습니다.
OghmaOsiris

@OghmaOsiris, 솔직히, 나는 파이썬에 대해 충분히 알지 못하지만 단순히 자기 선택 편견의 징후 일 수 있다고 목격했을 수도 있습니다. 결국 C ++은 일부 학생들에게 (특히 프로그래밍 경험이 가장없는 학생들에게는) 무섭습니다.
Stephan Branczyk

@Oghma 201 수업은 무엇입니까? 저수준이라면 C를 전제 조건으로 사용하는 자체 분기 일 것입니다.
Rei Miyasaka

1
@OghmaOsiris : 흠 저는 동의하지 않습니다. 동의하지 않았습니다. 제 첫 언어가 내가 아는 한 매우 유용하다는 것이 증명되었습니다. 개인 경험이 하나는 다른 것보다 낫다는 것, 즉 끝없는 화염 전쟁이라고 생각합니다. 나는 파이썬이 당신의 길을
잃지

4

다음은 조언하는 내용입니다.

  1. 알아 내기 위해 필요한 모든 세부 사항을 제공하십시오.
  2. 그들이 세부 사항을 이해하려고 노력하도록 장려하십시오
  3. 필요할 때마다 세부 사항을 간결한 형태로 저장하십시오.

기본적으로 필요한 모든 세부 정보가 포함 된 단일 a4 용지를 만드는 것이 좋습니다. 모든 세부 사항이 포함 된 일종의 참조 매뉴얼. "C 프로그래밍 언어"와 같은 일부 서적도 도움이 될 수 있습니다.이 서적은 필요한 모든 세부 사항이 간결한 형태로 제공되어 크게 도움이되었습니다. 모든 세부 사항을 포함하는 a4 용지를 만들 때 정보 압축이 필요합니다.


3

프로그래밍은 학생이 겪는 다른 공통 영역과 실질적으로 다릅니다. 대학 이전의 많은 학생들은 수업 시간에주의를 기울이고 쉬운 문제와 책 뒤의 답변으로 숙제를 몇 번 수행함으로써 성공했습니다. 프로세스를 암기 한 다음 만드는 과정에 관한 것입니다. 또한 많은 학생들이 문법 오류, 논리 오류, 세그먼트 오류 등 반복적으로 잘못된 답을 얻는 것은 처음입니다. 이것은 프로그램 작업시 학생의 동기를 빼앗길 수 있습니다.

프로그래밍에서 무슨 일이 일어나고 있는지 알기 위해서는 많은 연습을해야합니다. 간과되는 기술은 모국어가 무엇이든 의사 코드를 작성하는 것입니다. 그들이 문제에 대해 상당히 자세한 해결책을 찾을 때까지 계속 확장하도록 요청하십시오. 그런 다음 실제 코드로 변환하는 문제입니다.


3

제가 대학에있을 때는 다른 과정들 중에서 프로그래밍 과정을 소개하는 교사였습니다. 설명하는 문제는 드문 일이 아닙니다. 특정 역할이 무엇인지에 따라 다른 접근 방식이 필요할 수 있습니다.

첫째, 이것이 수업 시간에 학생들의 상당 부분에 영향을 미치는 광범위한 문제라면, 그렇게 할 수 있다면, 교수가 접근하지 못하는 개념에 대한 구체적인 피드백을 가지고 교수에게 접근 할 것입니다. 그녀는 학기 중에 다시 나타날 때 해당 자료에 대한 추가 검토를 통합하거나 향후 학기 동안 교과 과정을 개선 할 수 있습니다.

실습 시간 외에 코스에 대한 토론 섹션을 가르치면 강의에서 혼란 스러웠던 사항에 대해 설명하고보다 구체적으로 설명하고 기본 사항을 모두 이해할 수있는 멋진 시간입니다.

이 학생들과 함께 일하는 유일한 시간이 과외 실험실에서 근무하는 경우에도이 시간을 사용하여 학생들에게 일대일 또는 한 번에 몇 명씩 학생들을 이해하기 위해 필요한 개념적 빌딩 블록을 가르 칠 수 있습니다 그들의 숙제를 완료하십시오.

그들은 수업 시간에 너무 길을 잃어 버릴 수도 있습니다. 이 경우 기본 사항으로 돌아가십시오. 그들이 무슨 일이 있었는지 마지막으로 이해했을 때 과정의 어디에 있었습니까? 그들이 확실하지 않거나 "아무도"이해하지 못한다면, 여러분은 Hello world를 설명하기 시작하여 변수가 무엇인지, 컴퓨터가 "명령"목록을 가져 오는 방법 등을 가르치기 시작해야합니다. 그것들을 순서대로 수행하되, 컴퓨터는 우리처럼 "똑똑한"것이 아니기 때문에 당신은 매우 문자 그대로 컴퓨터가 이해하기에 적합한 것을 말해야합니다

그것은 실제로 비 주요 프로그래밍 과정에서 자주 보았던 투쟁과 좌절의 포인트입니다. 학생들은 몇 가지 코드를 작성합니다. "정확한"것처럼 보이지만 컴파일을 시도하면 매우 암호 오류가 발생합니다. 그리고 무엇이 잘못되었는지 전혀 모릅니다. 그리고 몇 시간 동안 코드를 응시하십시오. 그런 다음 그것이 세미콜론이 없거나 잘못된 장소에 버팀대처럼 사소한 것처럼 보이는 것이 무엇인지 알아냅니다. 그런 다음 다시 컴파일하고 여전히 오류가 있습니다. 다른 것입니다. 두 번째로 변수 이름을 다르게 사용했습니다. 등등. 그래서 그들은 친구 나 튜터 또는 누군가에게 도움을 요청하고, "아, 거기에 추가하면 효과가있을 것입니다." 그들의 경험은 프로그래밍이 "신비한"것입니다

그것은 당신이 도울 여지가 많은 가정교사로서의 영역입니다. 좌절 수준에 따라 코드가 작동하지 않는 이유를 파악하는 데 도움이되는 다른 접근법이있을 수 있습니다. 그들이 그것을 얻는 종류의 경우, 나는 그들에게 힌트를주고 그들 스스로 알아 내도록 도울 수 있습니다. 그러나 그들이 좌절을 포기할 준비가 됐다는 생각이 든다면, 나는 종종 그들에게 몇 가지 공짜 답변을 제공하고 최소한 "이 변경으로 인해 왜 프로그램이 수정되었는지 이해합니까? ? "

일부 학생들, 특히 전공이 아닌 학생들에게는 좋은 프로그래머가되거나 프로그래밍을 즐기는 데 필요한 세부 사항에 대한 체계적인 관심이 없을 수 있습니다. 세부 사항에주의를 기울이는 데 도움이되는 전략을 통해 문제를 파악하고 문제가있는 경우에도 문제를 해결할 수있는 방법론적일 수 있습니다.

그러나 학생들이 자신의 코드를 "적절하게"들여 쓰는 것에 대해 항문을 유지하는 경우가 많기 때문에 초보자 프로그래머는 일치하지 않는 괄호 등이 있기 때문에 중첩 및 범위에 문제가 생길 수 있습니다. 모든 코드를 올바르게 들여 쓰고 중괄호가 일치하는지 확인하는 등 "프로그램이 컴파일되지 않을 때 확인할 사항"체크리스트를 제공하십시오. 모든 행은 세미콜론으로 끝나고 특히 첫 번째 오류가 표시되는 행 번호 주위에 있어야합니다 등

일찍 컴파일하고 자주 컴파일하도록 가르치십시오. 최소 스켈레톤 코드 (예 : hello world)를 작성하고 컴파일 / 테스트하십시오. 몇 줄을 추가하고 다시 컴파일하십시오. 큰 버킷이 아닌 작은 변경 내용 만보고 있으면 오류를 훨씬 쉽게 찾을 수 있습니다.

문제를 더 작은 해결 가능한 문제로 나누는 방법을 배우도록 도와줍니다. 이것은 우리가 해결할 방법을 모르는 훨씬 더 어려운 문제를 해결하는 전문 프로그래머와 같은 일입니다. 해결 방법을 알고 있거나 해결 방법을 배우기 위해 연구를 수행 할 수있을 때까지 계속 조각으로 나눕니다. "작동하는 솔루션을 얻기 위해 어떤 단계를 수행해야합니까?" 먼저, 스켈레톤 코드 (hello world)가 필요합니다. 그렇게하는 방법을 알고 있습니까? 예, 좋습니다. 대화를 마치면 시작할 수 있습니다. 그런 다음 파일을 입력으로 읽어야합니다. 4 장에서 읽은 것을 기억하십니까? 그렇지 않습니까? Hello world를 실행 한 후 살펴 보시고 그 작업을 얼마나 가까이 할 수 있는지 확인한 다음 다시 전화 해주세요. 당신이 그것에 붙어 때 더 도움이 될 것입니다. 처음 몇 번은 문제를 해결하는 데 필요한 단계를 번호 목록으로 작성하여 문제를 분해하는 방법을 예제에서 배울 수 있습니다.

학생들이 수업 시간에 모든 자료가 아닌 일부를 얻는다면, 수업 시간에 질문을하도록 장려하십시오. 10 명 중 9 번은 이해하지 못하는 유일한 학생이 아니기 때문에 교수는 아마도 중요한 것에 대해 단지 글로시했을 것입니다.

만약 그들이 하나의 버그를 쳐다 보면서 "시간"을 소비하고 있지만 그것을 알아 내지 못한다면, 그것은 시간 낭비이며, 많은 것을 배우지 못하고 있습니다. 종종 버그는 통찰력 문제이며,이를 해결하기 위해 올바른 통찰력을 얻는 문제이며, 이러한 유형의 문제에 대한 방해가 없을 수도 있습니다. 갇힐 때 취할 수있는 다른 일반적인 접근 방법을 제안하십시오 : 반 친구에게 도움을 요청하고 (필요한 경우 일부 반 친구를 알아 가십시오) 숙제를 미리 시작하여 멈출 시간이 있고 나중에옵니다. 튜터 랩을 열고 영업 시간 동안 질문을하거나 교수의 근무 시간으로 이동하십시오. 그들이 암기 과목에 잘 맞는 벼락치기에 익숙하다면, 그들은 때 좌절의 벽에 부딪 칠 것입니다 암기보다 문제 해결에 관한 프로그래밍에 직면했다. 교과서, 스택 오버 플로우 등에서 구문의 예를 찾는 방법을 보여줍니다. 개인 수업 질문 포럼 (있는 경우)에 질문을 게시하도록 권장합니다.

코드 작동이 중지되는 위치를 좁히는 방법을 가르쳐주십시오. 당신이 실행하는 무언가로 돌아올 때까지 물건을 주석 처리 한 다음 다시 segfault를 얻을 때까지 물건을 천천히 다시 추가하십시오.

이러한 아이디어가 많이 나오면 유인물로 바뀔 수 있습니다. 전략은 일반적으로 교수가 선호하는 부분입니다. 문법, 루프, 배열, I / O 작성 방법의 의미에 시간을 소비하고 있습니다. 그러나 "시도 할 때 어떻게해야합니까?" 코드를 실행하는데 컴파일되지 않거나 충돌하지 않습니까? "

"변수 란 무엇인가"또는 "루프는 무엇인가?"와 같은 개념적인 것, 특히 기본에 관해서는 그들이 코스의 나머지 부분을 따라 가지 못하도록 이해하지 못한다. 강의 중심 과정에서 교수는 모든 질문에 대답 할 시간이 없거나 모든 학생에게 전구가 벗겨 지도록 도울 시간이 없을 수 있습니다. 그리고 이것이 튜터들이 프로그래밍 학습에 매우 중요한 이유의 일부입니다. 특정 주제를 구체적으로 만들기 위해 추가 유추가있는 개별 교육이 필요할 수 있습니다.

당신이 C ++로 가르치고 있기 때문에 클래스가 일부 학생들이 "얻기"위해 애쓰는 추상적 인 주제라고 생각합니다. 종종 클래스의 추상화는 "ATM 기계"와 같은 임의의 실제 세계 객체에 해당하는 예제로 진행되며 실제 세계 객체와 유사합니다. 내부에 돈이 얼마나 있는지 추적하는 변수가있을 수 있고, atm 기계에 특정 조건에 대응하는 방법 등을 알려주는 규칙과 같은 방법이 있습니다. 때로는 하나의 유추가 특정 사람을 위해 "고착"하는 것입니다. 다른 학생들은 다른 것을 더 잘 이해합니다.

가능할 때마다 그림을 그리십시오. 그들이 작성하는 코드의 큰 그림을 볼 수 있도록 시간이 지남에 따라 일어나는 일의 시퀀스 다이어그램처럼 사용자가이 버튼을 클릭합니다. 그런 다음 x, y 및 z를 수행하여 프로그램이 응답해야합니다. 우체국에는 하나의 숫자 만 가질 수있는 사서함 상자와 같은 배열을 그리고 상자 앞면의 "주소"를 가리키는 화살표와 같은 포인터를 그립니다. 기타.


2

프로그래밍 언어에 대한 훌륭한 선택 중이 대학은 C ++을 비 CS 전공을위한 인트로 CS 클래스로 사용합니다 ?? 재능있는 강사의 손에, 원격으로 생각할 수 있지만 왜 그렇게 어렵게 만드는가?

대학 인트로 -CS 수업에서 "파스칼"을 배웠을 때, 우리는 처음 3 주 동안 " 로렐 카렐 "과 함께 일했습니다 . 이것은 파스칼에서 수행하기 전에 모든 기본 개념 (재귀 포함)을 철저히 조사한 매우 간단한 샌드 박스 로고와 같은 프로그래밍 환경이었습니다. "Karel the robot"에서는 간단한 일련의 간단한 명령을 사용하여 2D 공간에서 로봇을 제어합니다. 이를 통해 학생들은 다음에 일어날 일에 대해 구체적으로 설명 할 수 있습니다.

아마도 "Karel the Robot"의 역할을 수행하는 더 현대적인 교육용 프로그래밍 언어가 있습니까? 그러나 지금은 학생들에게 너무 늦었을 것입니다.


우리는 Alice라는 비슷한 프로그램을 가지고있었습니다.
OghmaOsiris


@OghmaOsiris Alice 링크가 끊어졌습니다. 후행 "이 URL에 추가되었습니다.
Zoot

네, 그것없이 끝나는 ')'가 끊어졌습니다.
OghmaOsiris


2

말한 것 외에도 초보자는 표면을 긁기 만하면되므로 복잡한 내용을 피하도록 커리큘럼을 조정하십시오.

0-그들에게 간단한 문제를 줘라.

1-알아낼 시간을 준다.

그들에게 답을 2-주십시오.

3 줄씩 답을 통해 이동

당신의 답변을 그들의 attmpt와 비교하도록 4 번 물어보세요

이 문제에서 교훈을 얻도록 5 명에게 질문하십시오.

6-SAME 문제에 추가 단계를 추가하고 IF 문이 필요한 조건이라고 말하십시오.

7 몇 가지 문제에 대해 위 작업을 반복하십시오. 그때까지 그들은 언어의 기본과 환경을 사용하는 방법을 파악했을 것입니다. 다음에 나올 준비가 될 것입니다.

또한,

-2 수업마다 집에서 시도하는 보너스 간단한 문제가 있습니다.

-각 학생과 대화하여 더 이상 진행하지 못하게하는 요점을 확인하십시오.

-쉬운 참고 자료를 제공하고 복잡한 주제와 복잡한 책을 잊어 버립니다.

-피드백을 자주 받고 사용하십시오

-수업에 오기 전에 다음 주제를 준비하도록 요청하십시오.


2

CS 101을 통과했을 때 도움이 된 것은 코드를보기 전에 논리를 배우는 것이 었습니다. 우리는 진리표와 전치 미적분학을 겪었으므로 "이것은 이것과 동일하다"는 것이 아니라 "이것은 진실인가 거짓"이라고 생각하기 시작합니다.

바로 모든 것이 나를 위해 클릭했을 때였습니다. 프로그래밍이 기본적으로 핵심에서 참 / 거짓 값을 조작한다는 것을 알았을 때 모두 비교적 간단 해졌습니다.

그리고 이것이 내가 어떤 언어를 사용하든 상관없이 논리는 모든 곳에서 동일합니다. 구문은 혼란 스러울 수 있지만 "Ok, Obj CI에서 이와 같은 클래스로 메시지를 보내고 C ++ 메시지에서 이와 다른 방식으로 전송되었습니다. 그러나 알고리즘은 전혀 바뀌지 않았습니다."와 같은 것을 말할 수 있습니다. 기타


2

초보자 (심지어 CS 졸업생조차도)가 상급 프로그래머 뒤에 앉아 문제를 코딩해야하는 이유에 대한 자세한 내용을 다루는 ACM 또는 IEEE 기사가 있습니다.

전문가들은 종종 어려운 문제에 대해 짝을 짓습니다. 학생들은 너무 자주하지 말라고합니다. 페어링의 장점 (키보드로 돌아 가기) : 1. 학생은 자신이 잘못한 것을 즉시 알게됩니다. 즉각적인 피드백. 2. 수강생이 선생님을 볼 때, 수강생은 교사가 지적하지 않았을 일을 선택합니다.

학생들이 나쁜 관행을 개발하게하기보다는 새싹에 갇혀 있습니다. (여기서 # 1을 # 2로 뒤집고 학생이 강사 / TA FIRST를 보도록하겠습니다 )

정적 파워 포인트 슬라이드 세트로 CS를 가르치는 것은 프로그램을 작성하는 일시적인 프로세스에 적합하지 않습니다. (라인별로 기능을 확장하여 수행 할 수있는 트릭이 있지만 일반적으로 어색합니다.)

학습자는 쓰기 시작 위치와 중지 및 컴파일 위치를 알아야합니다. 우리의 두뇌는 대부분 왼쪽에서 오른쪽으로 아래에서 읽을 수 있도록 연결되어 있지만 프로그램은 전체가 자신의 모험 책을 한 페이지에 넣는 것처럼 선택하는 것과 같습니다!

초보자가 너무 자주 전체 프로그램을 복사 한 다음 컴파일합니다. 전문가조차도 그 방법으로 첫 번째 균열을 일으킬 수 있습니다. 모든 기능을 비워두고 프로그램을 컴파일 한 다음 반복적으로 작동하는 골격에 추가해야한다는 것을 깨달았습니다.

또한 CS는 컴퓨터없이 연필과 종이없이 가르쳐야한다는 어리석은 생각입니다. 실제로 많은 수의 프로그래밍 전문가들이 이것이 최선의 방법이라고 생각하는지, 아니면 CS 강사가 컴퓨터 작업을 좋아하지 않기 때문에 CS 강사가하는 일인지 궁금합니다. 사진에서 컴퓨터를 제거하려는 시도는 의미가 있습니다. 그렇게하면 프로그래밍이 재미 있고 대화식이 덜 필요합니다. 우리는 펀치 카드에 데이터를 입력하고 참을성있게 기다리는 시절이 지났습니다. 오늘날의 전문 개발자는 즉시 만족하는 팬입니다. 운 좋게도 대부분의 학생들도 있습니다.

분명히 개발 과정 전후에 연필과 종이로 예쁜 디자인을 그리는 것은 전문 프로그래머와 초보자 프로그래머 모두에게 강력한 도구입니다. "키보드의 손"과 같은 시간도 페어링에 사용되어야합니다! 어쩌면 여기에서 학생이 선생님을보기 전에 첫 라운드를 시도하게하는 것이 이치에 맞을 수도 있지만,이 경우에도 선생님의 실제 사고 과정을 볼 가치가있을 것입니다.

마지막으로, 전문 개발자가 사용하는 단축키와 편집 요령은 학생의 학습에 "잡음"이 아닙니다. 가장 중요한 것은 학생들을 참여시키고 관심을 갖습니다. 둘째, 공통 개발 요구에 대한 인식을 높입니다. 더욱이 이러한 관행 중 가장 기본적인 것은 종종 실행하기 쉽지만 처음에는 분명하지 않습니다. 젊은 나무 가게 학생은 망치의 발톱으로 못을 제거하는 방법을 쉽게 배울 수 있지만 대부분의 경우 발톱이 무엇인지를 먼저 알아야합니다. 배우기가 매우 쉬운 일도 배우기 쉽지 않습니다. 전문 개발자조차도 이러한 "트릭"을 항상 잊어 버리고 리 샵어 (resharper)와 같은 리팩토링 도구를 통해 중복되거나 도달 할 수없는 코드 등을 제거합니다.


1
btw, 누군가가 그 기사의 제목을 알려줄 수 있다면 감사하겠습니다!
David

2

컴퓨터 프로그래밍은 종종 합격 점수를 얻기 위해 인지 합성 기술 이 필요한 첫 번째 과정 중 하나입니다 . 이 기술은 다른 사람에게 전달하기가 매우 어렵습니다. 사용 가능한 모든 구성 요소와 작동 방식을 설명 할 수 있습니다. 다른 사람들이 합성을 사용하여 이러한 구성 요소를보다 유용한 전체 구성 요소로 결합한 방법에 대한 다양한 예를 제공 할 수 있지만 학생의 마음에 "클릭"하는 일 없이는 할 수있는 일이 너무 많습니다.

내 경험상 그것은 프로그래밍을 "받지 못하는"사람들을 피하는 것이 합성 기술입니다. 변수, 함수 및 루프와 같은 부분을 완벽하게 이해하지만 "왜 작동하는지 이해하지만 루프를 배치해야하는 이유를 어떻게 알았습니까?"와 같은 질문을합니다. 당신은 그것을 얻을 때까지 연습해야합니다.


2

Aaron Hillegass를 잘못 인용하려면 어리석지 않다는 것을 상기 시키십시오. 프로그래밍은 당신의 마음을 훈련시키기가 어렵고, 완전히 다른 사고 방식이며, 아마도 그들이 알고있는 기본 사항으로 어려움을 겪을 수도 있고 상당히 낙담하게 만들 것입니다.

나는 첫해 CS 과정을 실패한 사람으로서 이것을 많이 말했지만 많은 프로그래밍을 해왔고 모든 개념 (VB, 예 아기)을 얻었지만 C ++은 클릭하지 않을 것입니다. 나는 아주 기본으로 돌아가서 거기서부터 일하고 나서 클릭했다. 그러나 누군가가 "당신은 바보가 아니에요, 이것은 어렵다"라고 말하면 그것은 내 인생을 더 쉽게 만들었습니다.


0

"이 학생들은 수학, 생물학 또는 물리학을 배우는 방법을 알고 있을지 모르지만 프로그래밍에 관해서는 그 기술이 효과가 없습니다"라고 말했습니다.

여기에는 이유가 있습니다. 프로그래밍에는 창의력판타지 같은 다른 분야에 필요하지 않은 것이 필요합니다 . "직장에서 일을 상상하는"능력. 나는 개인적으로 그러한 요구 사항이 기술 학교 (특히 전자 공학 및 전자 기계 공학)에서 온 사람들에게 더 많이 존재한다는 사실을 알았습니다 (특히 전자 흐름 및 전자 기계 공학 : "전기 흐름을 상상하고 서로를 제어하는 ​​방법"). "순수 과학"(모든 것이 수학 주위를 돌아 보는 것처럼 보이는 것)보다.

이 마지막 경우에는 "시각적인지"가 도움이되어야합니다. 개념과 텍스트 (유형-> 컴파일-> 오류를 "읽을 수없는 경우 오류가 작동하지 않는 것")에 초점을 맞추는 것이 아니라 시각화 방법을 제공하는 것이 중요합니다. 디자인 타임에 사물 ( 기계에 무슨 일이 일어나는지 시뮬레이션함으로써 : 화이트 보드와 컬러 포스트잇으로 준비) 및 실행 시간.

이 마지막 부분이 성공하기 위해서는 운영 체제와 "프로그램이 시스템에 어떻게 실행되는지"(및 실제로 해당 시스템이 무엇인지)에 대한 필수 개념을 제공해야합니다. 그리고 협박하지 않은 IDE가 제공되어야합니다. 나는 보통 "혼동하지 않기"위해 많은 것들이 제거 된 "사용자 정의 코드 블록"입니다. 언어에 대해 말하기 시작하기 전에 라이브러리와 연결될 객체를 생성하는 소스로 만들어진 프로젝트 개념을 제공해야합니다.

C ++ 전통적인 hello world에는 진입 점과 출력 장치가 필요합니다. 학생은 이미 잘 알고 있어야합니다. 이런 종류의 과정의 성공은 첫날에 달려 있습니다. 컴퓨터 내부에서 일어나는 일에 대한 시각화를 자극하여 프로그래밍이 무엇인지 이해할 수 있도록해야합니다.
나머지는 구문 (과학)과 추상화 (판타지)입니다

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