Dạy kèm những sinh viên đang vật lộn với những điều cơ bản trong C ++ [đã đóng]


26

Tôi đang dạy kèm cho một vài sinh viên đang gặp khó khăn đáng kể khi học những điều cơ bản của ngôn ngữ lập trình đầu tiên của họ: C ++. Tôi đã biết nhiều sinh viên xuất sắc và thông minh đã thất bại hoặc bỏ khóa học CS đầu tiên của họ. Mọi người tôi đang dạy kèm đều đưa ra một tài khoản tương tự về kinh nghiệm của mình trong lớp: người hướng dẫn di chuyển quá nhanh, không có gì trong các bài giảng có ý nghĩa gì cả, et al. Trước lớp CS này, hầu hết những sinh viên gặp khó khăn này đã không thể hiện sự quan tâm đến máy tính như bất kỳ thứ gì ngoài bộ xử lý văn bản, trình duyệt web hoặc một số hình thức giải trí khác. Máy tính là một hộp đen hoạt động, vậy tại sao phải lộn xộn với nó?

Dự đoán tốt nhất của tôi là họ đang gặp khó khăn khi kết nối sự trừu tượng của khoa học máy tính với các khái niệm quen thuộc. Điều đó có nghĩa là, những sinh viên này có thể biết cách học toán, sinh học hoặc vật lý, nhưng những kỹ thuật đó không hoạt động khi nói đến lập trình.

Có ai có bất cứ đề nghị hoặc lời khuyên? Các sinh viên tôi đang giúp đỡ không xứng đáng để trượt lớp này. Rõ ràng là người hướng dẫn không tính đến phong cách học tập của những sinh viên này. Đó là để nói, người hướng dẫn không phải là sinh viên của mình.


2
Bình luận viên: nếu bạn có câu trả lời, hãy để lại câu trả lời: đừng để nó như một bình luận. Nếu câu trả lời của bạn đã được thêm vào, hãy bỏ phiếu. Nếu bạn muốn thảo luận về chủ đề của câu hỏi này với người khác, hãy sử dụng trò chuyện .

1
Đừng Theo kinh nghiệm của tôi, có đủ người lập trình và không nên ...

Câu trả lời:


42

Có một vài điều mà thực tế mọi người mới bắt đầu phải vật lộn với. Học sinh cần biết cách đọc mã trước khi có thể học cách viết mã.

  • Bản chất tuần tự của các ngôn ngữ mệnh lệnh. Mọi người gặp khó khăn khi hiểu rằng các chức năng được thực hiện theo trình tự, một mục tại một thời điểm, giống như một công thức. Một cách để khắc phục điều này là hiển thị một số mã làm việc thông qua trình gỡ lỗi.
  • Toán tử gán ( =) trong các ngôn ngữ kiểu C là cực kỳ sai lệch. Bạn cần giải thích rất kỹ điều đó a = 5có nghĩa là "gán 5 cho biến a, không phải " a bằng 5 ".
  • Đối với người mới bắt đầu, thật an toàn khi mô tả các chức năng dưới dạng các khối mã có cấu trúc mà các chức năng khác có thể chuyển sang. Ngoài ra, người mới bắt đầu gặp khó khăn khi hiểu rằng trong C ++, các đối số hàm được xác định theo thứ tự, không phải theo tên.
  • Hầu hết các ngôn ngữ lập trình mệnh lệnh đều có một số thành phần khai báo và một số thành phần thủ tục và C ++ cũng không ngoại lệ. Hãy chắc chắn rằng học sinh hiểu rằng một số phần của mã mô tả cấu trúc của chương trình và các phần (chức năng) khác mô tả những gì chương trình nên làm.
  • Bước qua một chương trình với trình gỡ lỗi là một công cụ giảng dạy cực kỳ quan trọng và thường bị bỏ quên .
  • Biểu thức có các loại . 3+3là một số nguyên, 3.5 + 3là một số kép, "3" + "3"(trong C #) là một chuỗi, x == 5 * 3 + 25là một boolean (hoặc số nguyên trong C ++). Dành nhiều thời gian để đảm bảo học sinh hoàn toàn thoải mái với khái niệm này.
  • Phạm vi biến là một cái gì đó mà người mới bắt đầu bị lẫn lộn mọi lúc. Giải thích cho học sinh cách phạm vi hoạt động và đảm bảo rằng họ biết rằng một xphạm vi được xxác định trong một phạm vi khác với một phạm vi được xác định trong phạm vi khác.
  • Mỗi biến được tham chiếu ít nhất ba lần trong vòng đời của nó: khai báo, gán (thường được thực hiện trên cùng một dòng với khai báo), mức tiêu thụ. Nếu bất kỳ thứ nào trong số này bị thiếu, thì có một lỗi về khái niệm ở đâu đó. Vì lý do tương tự, nếu bạn đang phân tích một chương trình làm việc, bạn luôn có thể tìm kiếm ba điều này trong mã để tìm ra mục đích của một biến.
  • forcác vòng lặp không nên được dạy cho đến khi các ví dụ đầy đủ về việc lặp lại sử dụng whilecác vòng lặp được đưa ra. Cú pháp tốc ký khó hiểu và nó khiến sinh viên tự hỏi tại sao họ không thể sử dụng whilecác vòng lặp. Có một bảng cheat mô tả một forvòng lặp theo whilevòng lặp có thể hữu ích.
  • Mảng và con trỏ khá dễ dạy, nhưng là một cơn ác mộng để học. Nói cách khác, cho đến khi nó nhấp chuột, thực hành là quan trọng.
  • Ý tưởng rằng mã là văn bản và rằng một chương trình được biên dịch trên thực tế là một tệp khó nắm bắt đối với một số người mới bắt đầu. Hãy chắc chắn hiển thị cho họ các tệp .cpp, .h và nhị phân trong trình bao.

Các thành phần OOP của C ++ hoàn toàn là một con quái vật khác nhau và tôi hy vọng người hướng dẫn không đến đó - vì OOP được dạy tốt nhất bằng cách sử dụng các ngôn ngữ được thiết kế từ đầu để trở thành OOP. Theo kinh nghiệm của tôi, việc dạy OOP qua C ++ chưa bao giờ suôn sẻ.


2
"Mọi người có khó khăn để hiểu rằng các chức năng được thực hiện theo trình tự"? Tôi nghĩ đó là điều mà hầu như không ai có vấn đề với (ngoại trừ, có lẽ, những người đã học một số ngôn ngữ chức năng trước khi bắt đầu thủ tục). Nhưng tôi đồng ý về mọi thứ khác mà bạn nói.
leftaroundabout

2
+1 để bước với trình gỡ lỗi, vì vậy họ hiểu được sự khác biệt giữa chính chương trình và việc thực hiện chương trình.
Mike Dunlavey

4
@leftaroundabout Bạn sẽ ngạc nhiên. Toán học chủ yếu là khai báo, vì vậy các ngôn ngữ bắt buộc có thể loại bỏ bất kỳ ai học đại số.
Rei Miyasaka

2
Câu trả lời này có vẻ là một chút của "làm xáo trộn các khái niệm." Các khái niệm chắc chắn là chính xác và chắc chắn rất quan trọng, nhưng dạy theo cách này giống như cố gắng dạy ai đó cách lái xe bằng cách phá vỡ các quy tắc của đường.
riwalk

@ Stargazer712 Mọi người đều học các quy tắc của đường trước khi được phép thử bài kiểm tra đường. Tôi có thể trình bày những ý tưởng đột quỵ rộng như "thực hành là chìa khóa" hoặc "sáng tạo" hoặc "suy nghĩ logic", nhưng những điều đó có lẽ khá rõ ràng đối với bất kỳ người hướng dẫn nào, cũng như với hầu hết các sinh viên. Người ta cũng có thể dạy những thứ trừu tượng như toán học rời rạc hoặc lý thuyết ngôn ngữ như một tiền thân của lập trình, nhưng điều đó chỉ trở nên quan trọng khi cơ học quá phức tạp đến nỗi chỉ có thể giải quyết vấn đề bằng trực giác. Sớm muộn gì mọi người cũng phải dừng việc zen và bắt đầu dạy nội dung .
Rei Miyasaka

19

Bạn đã dạy lập trình trước đây chưa?

Tôi đã dạy lập trình cho CS và chuyên ngành phi CS trong bốn năm. Học kỳ đầu tiên, kinh nghiệm của tôi giống như bạn, cho đến khi tôi học được một vài điều.

Điều có vẻ đơn giản đối với tôi không đơn giản với người mới bắt đầu.

Bất kể ngôn ngữ là gì, bạn cần đặt một khung tinh thần - những điều rõ ràng đến mức bạn thậm chí không nhận ra mình biết chúng, chẳng hạn như:

  • Máy tính chỉ làm một việc tại một thời điểm. . Tôi chỉ nói điều này, bởi vì máy tính dường như làm rất nhiều việc, và thực hiện chúng ngay lập tức, rằng với người mới bắt đầu, có vẻ như họ làm mọi thứ cùng một lúc, và đọc cả suy nghĩ của bạn.

  • Các biến rất quan trọng. Điều cần thiết là phải hiểu rằng tên của một biến và nội dung của nó trong thời gian chạy là hai thứ hoàn toàn khác nhau. Người mới bắt đầu đấu tranh với điều này. Nếu tôi nói "Viết chương trình nhập tên của bạn và sau đó nói Xin chào với bạn", họ cần tìm ra rằng họ cần một biến để giữ tên của họ và họ phải nghĩ ra một tên cho biến đó và họ bị cám dỗ tự đặt tên cho nó và tự hỏi "đầu vào" nghĩa là gì.

  • Có một sự khác biệt rất lớn giữa thời gian bạn viết / chỉnh sửa chương trình và thời gian thực hiện chương trình. Trong các bài tập đầu tiên của họ, họ cần được nhắc nhở về điều này khá thường xuyên.

Ngôn ngữ tôi sử dụng là BASIC, vì nó rất đơn giản cho người mới bắt đầu. Không khó để chuyển sang các ngôn ngữ khác sau khi họ đã xây dựng một bộ các khả năng lập trình cơ bản.

Chúng tôi thường viết một chương trình lên bảng và sau đó "chơi máy tính". Nghĩa là, đặt X bên cạnh câu lệnh hiện tại, thực hiện thủ công, sau đó di chuyển X sang câu lệnh tiếp theo. Các biến là hình chữ nhật trên bảng, nơi chúng ta sẽ viết nội dung hiện tại. Khi một nhiệm vụ xảy ra, chúng tôi sẽ xóa nó và đưa vào giá trị mới.

Một mẹo tôi đã phát triển là một máy tính thập phân mô phỏng, với 1000 vị trí bộ nhớ, mỗi vị trí có khả năng chứa một số có 4 chữ số. Có một bộ "opcodes" nhỏ như tải bộ tích lũy, thêm, lưu trữ, nhảy, v.v. Tôi sẽ cho họ viết các chương trình nhỏ bằng "ngôn ngữ máy" này và sau đó một bước để thấy nó hoạt động. Sau đó, các khái niệm như biến, nhảy, v.v ... dễ giải thích hơn nhiều.

Mong rằng sẽ giúp.


Tôi thích ý tưởng mô phỏng máy tính. Bạn có một ngôn ngữ chính thức cho nó, hoặc bạn chỉ thảo luận về các ý tưởng bằng mã giả / tiếng Anh đơn giản?
Rei Miyasaka

@Rei: Tôi đã viết (bằng BASIC) một trình giả lập có tên Simple. Đó là tất cả giao diện bàn phím. Người dùng có thể nhập các giá trị vào "bộ nhớ"; sau đó họ có thể bước một bước và kiểm tra bộ tích lũy và bộ nhớ tại mỗi điểm, nếu họ muốn. Tôi nghĩ rằng điều này thực sự quan trọng bởi vì nó khiến họ làm điều đó, không chỉ nói về nó.
Mike Dunlavey

À được rồi. Cảm ơn, tôi nên thử một cái gì đó như thế.
Rei Miyasaka

Đây nên là câu trả lời số 1 theo ý kiến ​​của tôi.
riwalk

12

Theo tôi, C ++ là một ngôn ngữ quá mức cần thiết.

Nếu tôi là bạn và có đủ thời gian trong tay, tôi sẽ giới thiệu các khái niệm về lập trình và CS bằng Python (hoặc tương tự).

Khi các khái niệm rõ ràng, nghĩa là khi chúng cảm thấy thoải mái với các cấu trúc dữ liệu cơ bản, sự gián tiếp, thuật toán cơ bản, v.v., tôi sẽ từ từ giới thiệu C ++ và chúng sẽ rất nhanh có thể liên quan đến những gì chúng đã học.


2
Tôi đồng ý, nhưng giáo sư thường không có quyền chọn ngôn ngữ để dạy, ít TA hơn.
Rei Miyasaka

4
Tôi không đồng ý với Python. Tôi đã trải qua lớp CS 101 đầu tiên của mình trên C ++ và sau đó chuyển sang một trường dạy CS 101 bằng Python. Các sinh viên Python đã nhầm lẫn về những điều cơ bản khi tất cả chúng ta đều học cùng một lớp CS 201 ... Nhưng tất cả các sinh viên C ++ đều xuất sắc.
OghmaOsiris

@OghmaOsiris, Thành thật mà nói, tôi không biết đủ về Python, nhưng có thể những gì bạn chứng kiến ​​có thể chỉ đơn giản là biểu hiện của xu hướng tự chọn. Xét cho cùng, C ++ là địa ngục đáng sợ đối với một số sinh viên (đặc biệt là đối với những sinh viên thiếu kinh nghiệm nhất trong lập trình).
Stephan Branchot

@Oghma Lớp 201 là gì? Nếu đó là bất cứ thứ gì ở cấp độ thấp, nó có lẽ phải là chi nhánh của riêng nó với C là điều kiện tiên quyết.
Rei Miyasaka

1
@OghmaOsiris: Hmmm Tôi phải không đồng ý, cũng không đồng ý, chia sẻ một kinh nghiệm khác trong việc chuyển sang sử dụng python như một ngôn ngữ đầu tiên đã được chứng minh rất hữu ích cho đến nay tôi biết (đầu tiên là Java no C ++). Tôi không nghĩ rằng những trải nghiệm cá nhân được tính là một điều tốt hơn cái kia tốt hơn cái kia, đó là một cuộc chiến rực lửa không hồi kết. Tôi có thể tranh luận rằng Python có thể là một ngôn ngữ lập trình tuyệt vời để bắt đầu bởi vì nó không theo cách của bạn, nó thực sự làm điều đó tốt hơn hầu hết các ngôn ngữ lập trình, có nhiều sinh viên ....
Trufa

4

Đây là những gì tôi sẽ khuyên:

  1. Cung cấp cho họ tất cả các chi tiết họ cần để tìm ra nó
  2. Khuyến khích họ cố gắng hiểu các chi tiết
  3. Hãy chắc chắn rằng họ có các chi tiết được lưu trữ ở dạng nhỏ gọn bất cứ khi nào họ cần

Về cơ bản tôi sẽ khuyên bạn tạo một tờ giấy a4 có tất cả các chi tiết cần thiết. Một số loại hướng dẫn tham khảo có tất cả các chi tiết. Một số sách cũng có thể giúp, ví dụ: "Ngôn ngữ lập trình C" -book giúp ích rất nhiều vì nó có tất cả các chi tiết cần thiết có sẵn ở dạng nhỏ gọn. Việc nén thông tin là một phần cần thiết trong việc tạo ra giấy a4 có chứa tất cả các chi tiết.


3

Lập trình về cơ bản khác với các lĩnh vực phổ biến khác mà sinh viên gặp phải. Nhiều sinh viên trước khi học đại học đã thành công khi chỉ chú ý trong lớp và có lẽ làm một vài bài tập về nhà với các vấn đề dễ dàng và câu trả lời ở mặt sau của cuốn sách. Đó là nhiều hơn về việc ghi nhớ các quy trình, sau đó tạo ra chúng. Đây cũng là lần đầu tiên rất nhiều sinh viên liên tục nhận được câu trả lời sai (lỗi cú pháp, lỗi logic, lỗi seg, v.v.). Điều này có thể rút cạn động lực của sinh viên khi làm việc trên các chương trình.

Để thực sự biết những gì đang xảy ra với lập trình, họ sẽ cần THỰC HÀNH RẤT NHIỀU. Một kỹ thuật thường bị bỏ qua là yêu cầu họ viết mã psuedo bằng bất cứ ngôn ngữ mẹ đẻ nào trước tiên. Yêu cầu họ tiếp tục mở rộng điều đó cho đến khi họ có một giải pháp khá chi tiết cho vấn đề. Sau đó, vấn đề dịch nó thành mã thực.


3

Khi tôi học đại học, tôi từng làm gia sư cho phần giới thiệu khóa học lập trình trong số các khóa học khác. Vấn đề bạn đang mô tả không phải là hiếm. Tùy thuộc vào vai trò cụ thể của bạn là gì, bạn có thể có những cách tiếp cận khác nhau mà bạn muốn thực hiện.

Đầu tiên, nếu đây là một vấn đề phổ biến ảnh hưởng đến các phần quan trọng của các sinh viên trong lớp, nếu bạn có quyền truy cập, tôi sẽ tiếp cận giáo sư giảng dạy khóa học với phản hồi cụ thể về những khái niệm mà sinh viên không nắm bắt được, để ông hoặc cô ấy có thể kết hợp xem xét bổ sung tài liệu đó khi nó xuất hiện trở lại trong nhiệm kỳ, hoặc cải thiện chương trình giảng dạy cho các điều khoản trong tương lai.

Nếu bạn dạy một phần thảo luận cho khóa học ngoài thời gian trong phòng thí nghiệm của bạn, đó sẽ là thời gian tuyệt vời để giải thích những điều khó hiểu trong bài giảng và giúp làm cho chúng cụ thể hơn và đảm bảo các nguyên tắc cơ bản đều được hiểu.

Nếu thời gian duy nhất bạn làm việc với những sinh viên này là trong thời gian bạn ở trong phòng thí nghiệm dạy kèm, bạn vẫn có thể sử dụng thời gian này để dạy cho các sinh viên từng người một, hoặc một vài người, các khối xây dựng khái niệm mà họ cần để hiểu và hoàn thành bài tập về nhà của họ.

Họ có thể cảm thấy rất lạc lõng trong lớp, thậm chí họ không biết dừng lại và đặt câu hỏi. Nếu đó là trường hợp, trở lại những điều cơ bản với họ. Họ đã ở đâu trong khóa học khi họ hiểu những gì đang diễn ra? Nếu họ không chắc chắn hoặc "không bao giờ" hiểu, bạn có thể phải quay lại từ đầu để giải thích thế giới xin chào, dạy họ những điều như biến là gì, cách máy tính lấy danh sách "hướng dẫn" của họ và cố gắng làm theo thứ tự, nhưng máy tính không "thông minh" như chúng tôi nên bạn phải rất biết chữ và nói những điều chính xác để máy tính hiểu, v.v.

Đó thực sự là một điểm đấu tranh và thất vọng tôi đã thấy khá thường xuyên trong các khóa học lập trình không chuyên ngành. Học sinh viết một số mã. Có vẻ như "về" đúng, nhưng sau đó họ đi biên dịch nó và nó đưa ra một lỗi, một lỗi rất khó hiểu. Và họ không biết điều gì sai với nó. Và nhìn chằm chằm vào mã của họ trong nhiều giờ. Sau đó, cuối cùng tìm ra nó là một cái gì đó có vẻ tầm thường, như một dấu chấm phẩy bị mất, hoặc một cái nẹp ở sai vị trí. Sau đó, họ lại biên dịch nó một lần nữa và vẫn còn một lỗi, đó là một thứ khác. Họ đánh vần một tên biến khác nhau lần thứ hai họ sử dụng nó. Và như vậy. Vì vậy, họ nhờ một người bạn hoặc gia sư hoặc ai đó giúp đỡ, và họ có thể trả lời trên đỉnh đầu của họ "oh chỉ cần thêm cái này ở đó và sau đó nó sẽ hoạt động." Vì vậy, kinh nghiệm của họ là lập trình hơi "bí ẩn"

Đó là một khu vực như một gia sư, nơi bạn có rất nhiều phòng để giúp đỡ. Tùy thuộc vào mức độ thất vọng của họ, tôi có thể có các cách tiếp cận khác nhau để giúp họ tìm ra lý do tại sao mã của họ không hoạt động. Nếu họ sắp xếp nó, tôi có thể đưa ra gợi ý cho họ và cố gắng giúp họ tự tìm ra. Nhưng nếu họ chỉ ở cuối sợi dây về việc sẵn sàng từ bỏ sự thất vọng, tôi sẽ thường đưa cho họ một vài câu trả lời miễn phí, và sau đó cố gắng ít nhất hỏi họ những câu hỏi như "bạn có hiểu tại sao sự thay đổi này đã khắc phục chương trình của bạn không ? "

Đối với một số sinh viên, đặc biệt là những người không chuyên ngành, họ có thể không có sự chú ý có phương pháp đến từng chi tiết cần thiết để trở thành một lập trình viên giỏi hoặc thích lập trình. Bạn có thể nắm tay họ thông qua các chiến lược để giúp họ chú ý đến các chi tiết và đủ phương pháp để giải quyết các vấn đề ngay cả khi đó là một thách thức đối với họ.

Nhưng hậu môn không quan tâm đến việc các sinh viên thụt mã "đúng cách" - thông thường, các lập trình viên bắt đầu tạo ra vấn đề với lồng và phạm vi vì họ có dấu ngoặc không khớp hoặc tương tự vì họ không chú ý đến những gì được lồng trong cái gì. Đưa cho họ một danh sách kiểm tra "những điều cần kiểm tra khi chương trình của bạn không được biên dịch", như thụt lề tất cả các mã đúng và đảm bảo các dấu ngoặc khớp, đảm bảo tất cả các dòng kết thúc bằng dấu chấm phẩy, đặc biệt là xung quanh số dòng xuất hiện lỗi đầu tiên lên, v.v.

Dạy chúng biên dịch sớm và biên dịch thường xuyên. Viết mã bộ xương tối thiểu (giả sử, xin chào thế giới), biên dịch / kiểm tra. Thêm một vài dòng, biên dịch lại. Việc tìm lỗi dễ dàng hơn nhiều nếu bạn chỉ nhìn vào một nhóm nhỏ các thay đổi không phải là một nhóm lớn.

Giúp họ học cách chia nhỏ một vấn đề thành các vấn đề có thể giải quyết nhỏ hơn. Đây là điều tương tự chúng tôi làm khi các lập trình viên chuyên nghiệp giải quyết các vấn đề khó khăn hơn nhiều mà chúng tôi không biết cách giải quyết. Bạn tiếp tục chia nó thành từng mảnh cho đến khi bạn có được thứ gì đó mà bạn biết cách giải quyết hoặc có thể thực hiện một số nghiên cứu để tìm hiểu cách giải quyết. "Những bước bạn cần thực hiện để có được một giải pháp làm việc?" Chà, trước tiên bạn cần một số mã bộ xương (xin chào thế giới). Bạn có biết làm thế nào để làm điều đó? Vâng, thật tuyệt, vì vậy khi chúng ta nói xong, bạn có thể bắt đầu bằng cách làm điều đó! Sau đó, nó cần phải đọc một tập tin như là đầu vào. Bạn có nhớ đọc về điều đó trong chương 4 không? Có thật không? Tại sao bạn không đi xem cái đó sau khi bạn chạy thế giới đang chạy, và xem bạn có thể đến gần như thế nào để nó hoạt động và sau đó gọi lại cho tôi và tôi sẽ giúp bạn thêm một số khi bạn gặp khó khăn về điều đó. Một vài lần đầu tiên bạn có thể chỉ cần lập một danh sách đánh số cho họ các bước cần thiết để giải quyết vấn đề, để họ có thể học hỏi từ ví dụ về cách phân tách vấn đề.

Nếu họ đang nhận được một số nhưng không phải tất cả các tài liệu trong lớp, hãy khuyến khích họ đặt câu hỏi trong lớp, bởi vì chín lần trong số mười, họ không phải là sinh viên duy nhất không hiểu, và giáo sư có lẽ đã che đậy điều gì đó quan trọng.

Nếu họ đang dành "hàng giờ" nhìn chằm chằm vào một lỗi nhưng không phát hiện ra, đó là một sự lãng phí thời gian của họ, họ sẽ không học được nhiều từ nó. Thông thường lỗi là vấn đề sâu sắc, và vấn đề là tìm ra cái nhìn sâu sắc đúng đắn để giải quyết nó, và chúng có thể không có sở trường cho những loại vấn đề đó. Đề xuất các cách tiếp cận chung khác cần thực hiện khi họ gặp khó khăn: nhờ một người bạn khác trong lớp giúp đỡ (làm quen với một số bạn cùng lớp nếu cần thiết), bắt đầu cách làm bài tập về nhà trước để họ có thời gian dừng lại và sau đó đi vào phòng thí nghiệm gia sư và đặt câu hỏi trong giờ mở cửa, hoặc đến giờ làm việc của giáo sư. Nếu chúng được sử dụng để nhồi nhét, hoạt động tốt cho các đối tượng ghi nhớ, chúng sẽ gặp phải một bức tường thất vọng khi chúng ' lại phải đối mặt với lập trình liên quan đến giải quyết vấn đề hơn là ghi nhớ. Chỉ cho họ cách tra cứu các ví dụ về cú pháp từ sách giáo khoa, stackoverflow, v.v ... Khuyến khích họ đăng câu hỏi lên một diễn đàn câu hỏi của lớp tư nhân nếu có.

Dạy chúng cách thu hẹp nơi mã dừng hoạt động. Nhận xét nội dung cho đến khi bạn quay lại một cái gì đó chạy, và sau đó từ từ thêm lại công cụ cho đến khi bạn nhận được segfault đó một lần nữa.

Rất nhiều trong số những ý tưởng này có thể được biến thành bản phát hành nếu chúng xuất hiện nhiều. Các chiến lược thường là phần mà các giáo sư chú ý - họ dành thời gian cho cú pháp, ngữ nghĩa của cách viết vòng lặp, mảng, i / o, v.v. Nhưng không đủ thời gian cho "tôi làm gì khi tôi thử để chạy mã của tôi và nó không biên dịch hay gặp sự cố với tôi? "

Khi nói đến những điều khái niệm, đặc biệt là các nguyên tắc cơ bản, như "biến là gì" hoặc "vòng lặp là gì?" không hiểu điều đó sẽ khiến họ không thể theo kịp phần còn lại của khóa học. Trong một khóa học dựa trên bài giảng, giáo sư có thể không có thời gian để trả lời mọi câu hỏi hoặc giúp bóng đèn đó tắt cho mỗi sinh viên. Và đó là một phần lý do tại sao gia sư rất quan trọng cho việc học lập trình. Họ có thể cần hướng dẫn cá nhân với các tương tự bổ sung để làm cho một chủ đề cụ thể.

Vì bạn đang giảng dạy bằng C ++, tôi sẽ tưởng tượng các lớp học xuất hiện như một chủ đề trừu tượng mà một số sinh viên phải vật lộn để "có được". Thông thường sự trừu tượng của các lớp được dạy với các ví dụ tương ứng với một số đối tượng trong thế giới thực ngẫu nhiên, như "máy ATM", và các phép tương tự được tạo ra cho đối tượng trong thế giới thực. Bạn có thể có các biến để theo dõi số tiền bên trong, bạn có các phương thức, giống như các quy tắc cho biết máy atm làm thế nào để đáp ứng với các điều kiện cụ thể, v.v. Đôi khi, một sự tương tự là "tương tự" đối với một người cụ thể và các sinh viên khác nắm bắt một cái khác tốt hơn.

Bất cứ khi nào có thể, vẽ hình cho họ. Giống như một sơ đồ tuần tự về những gì xảy ra theo thời gian để giúp họ nhìn thấy bức tranh lớn về những gì mã họ đang viết. Người dùng nhấp vào nút này. Sau đó, chương trình sẽ đáp ứng bằng cách làm x, y và z. Vẽ một mảng giống như một loạt các Hộp thư bưu điện tại bưu điện, mỗi bưu điện chỉ có thể chứa một số và các con trỏ giống như mũi tên chỉ vào "địa chỉ" ở mặt trước của hộp. V.v.


2

Trong tất cả các lựa chọn tuyệt vời cho các ngôn ngữ lập trình ngoài kia, trường đại học này sử dụng C ++ làm lớp CS giới thiệu cho các chuyên ngành không thuộc CS ?? Trong tay của người hướng dẫn tài năng, nó có thể hiểu được từ xa-- nhưng tại sao nó lại khó đến vậy?

Khi tôi học "Pascal" trong lớp giới thiệu đại học của mình, chúng tôi đã dành 3 tuần đầu tiên làm việc với " Karel robot ". Đây là một môi trường lập trình giống như hộp cát rất đơn giản, nơi tất cả các khái niệm cơ bản (bao gồm cả đệ quy) đã được khám phá kỹ lưỡng trước khi thực hiện nó trong Pascal. Trong "Karel robot", bạn điều khiển robot trong không gian 2D bằng một nhóm lệnh nhỏ đơn giản. Điều này cung cấp cho sinh viên một nền tảng cụ thể hữu ích mà họ có thể rút ra cho những gì xảy ra tiếp theo.

Có lẽ bây giờ có nhiều ngôn ngữ lập trình hướng dẫn hiện đại hơn, đóng vai trò của "Karel the Robot"? Có lẽ đã quá muộn cho các sinh viên của bạn bây giờ, tuy nhiên.


Chúng tôi đã có một chương trình tương tự được gọi là Alice.
OghmaOsiris


@OghmaOsiris Liên kết Alice bị hỏng. Dấu vết "đã được thêm vào url.
Zoot

Vâng, không có nó, kết thúc ')' đã bị cắt.
OghmaOsiris


2

Ngoài những gì đã nói, tôi cho rằng là người mới bắt đầu, họ chỉ cần làm trầy xước bề mặt, vì vậy hãy điều chỉnh chương trình giảng dạy của bạn cho phù hợp để tránh những thứ phức tạp.

0 - cung cấp cho họ một vấn đề đơn giản (nói đánh giá một biểu thức).

1-cho họ thời gian để tìm ra nó.

2-cho họ câu trả lời.

3-đi qua dòng trả lời theo dòng

4-yêu ​​cầu họ so sánh câu trả lời của bạn với attmpt của họ

5-yêu cầu họ rút ra bài học từ vấn đề này

6-thêm một bước nữa cho vấn đề CÙNG, giả sử một điều kiện yêu cầu câu lệnh IF

7-lặp lại nhiệm vụ trên về một số vấn đề. Đến lúc đó họ sẽ nắm được những điều cơ bản của ngôn ngữ và cách sử dụng môi trường. Sẽ sẵn sàng cho những gì tiếp theo.

Cũng thế,

-Có một vấn đề đơn giản về tiền thưởng để họ thử ở nhà cứ sau 2 lớp hoặc hơn

- Tham gia với mỗi học sinh để xem đâu là điểm ngăn cản anh ta tiến xa hơn

-Cung cấp tài liệu tham khảo dễ dàng, quên các chủ đề phức tạp và sách phức tạp

- quên phản hồi của họ thường xuyên và sử dụng nó

-Cho họ chuẩn bị cho chủ đề tiếp theo trước khi đến lớp


2

Điều giúp tôi khi tôi trải qua CS 101 là học logic trước khi nhìn vào mã. Chúng tôi đã đi qua các bảng chân lý và tính toán giới từ chỉ để chúng tôi bắt đầu nghĩ "điều này đúng hay sai" và không "điều này bằng cái này hay cái kia".

Đó là ngay khi mọi thứ nhấp cho tôi. Khi tôi nhận ra rằng lập trình về cơ bản chỉ là thao túng các giá trị đúng / sai ở cốt lõi của nó, thì tất cả trở nên tương đối đơn giản.

Và điều này làm cho nó không thành vấn đề với việc tôi đang sử dụng ngôn ngữ nào, logic giống nhau ở mọi nơi. Cú pháp có thể gây nhầm lẫn, nhưng tôi có thể nói những câu như "Ok, trong Obj CI gửi tin nhắn đến các lớp như thế này và trong tin nhắn C ++ đã được gửi như thế này theo cách khác. Nhưng thuật toán đã không thay đổi." v.v.


2

Có một bài báo ACM hoặc IEEE ở đâu đó đi sâu vào một số chi tiết về lý do tại sao người mới bắt đầu (ngay cả sinh viên tốt nghiệp CS bắt đầu trong lĩnh vực này) cần phải ngồi sau một lập trình viên cao cấp và xem họ viết mã vấn đề.

Chuyên gia thường cặp cho các vấn đề khó khăn. Học sinh quá thường nói không. Ưu điểm của việc ghép đôi (thay phiên nhau trên bàn phím): 1. Học sinh được cho biết mình đang làm gì sai ngay lập tức. Phản hồi tức thì. 2. Khi người học quan sát giáo viên, người học tiếp thu những điều mà giáo viên sẽ không bao giờ nghĩ ra.

Thay vì để một học sinh phát triển các thực hành xấu, chúng bị chặn lại. (Tôi sẽ lật số 1 với số 2 ở đây và để học sinh xem Giảng viên / TA FIRST )

Dạy CS với một bộ slide powerpoint tĩnh không phù hợp với quy trình viết chương trình tạm thời. (Được cho là có những thủ thuật bạn có thể làm với việc phát triển các chức năng theo từng dòng, nhưng chúng thường rất khó xử.)

Người học cần biết nơi bắt đầu viết, và nơi dừng lại và biên dịch. Bộ não của chúng ta chủ yếu có dây để đọc từ trái sang phải từ trên xuống dưới, nhưng một chương trình giống như toàn bộ chọn cuốn sách phiêu lưu của riêng bạn được nhồi nhét vào một trang duy nhất!

Quá thường xuyên, một người mới bắt đầu sẽ sao chép toàn bộ chương trình và sau đó biên dịch. Ngay cả một chuyên gia cũng có thể đưa ra một vết nứt đầu tiên theo cách đó, trước khi nhận ra rằng họ nên để trống tất cả các chức năng và biên dịch chương trình, sau đó lặp lại thêm vào một bộ xương hoạt động.

Ngoài ra, liên quan là ý tưởng nực cười rằng CS nên được dạy mà không cần máy tính và chỉ cần bút chì và giấy. Tôi tự hỏi có bao nhiêu chuyên gia lập trình được tuyển dụng thực sự nghĩ rằng đây là cách tốt nhất, hoặc nếu đó chỉ là những gì giảng viên CS làm vì bản thân họ không thích làm việc với máy tính? Bất kỳ nỗ lực để loại bỏ một máy tính từ hình ảnh là một ý nghĩa. Làm như vậy làm cho việc lập trình ít thú vị hơn và ít tương tác hơn mức cần thiết. Chúng tôi đã qua những ngày nhập dữ liệu vào thẻ đục lỗ và kiên nhẫn chờ đợi. Các nhà phát triển chuyên nghiệp ngày nay là người hâm mộ của sự hài lòng ngay lập tức. May mắn là hầu hết các sinh viên cũng vậy.

Rõ ràng việc vẽ các thiết kế đẹp bằng bút chì và giấy trước và trong quá trình phát triển là một công cụ mạnh mẽ cho cả lập trình viên chuyên nghiệp và người mới bắt đầu. Điều này giống như thời gian "trên bàn phím" cũng nên được sử dụng để ghép nối! Có lẽ ở đây có thể có ý nghĩa khi để học sinh thử vòng đầu tiên trước khi xem giáo viên, mặc dù với điều này có lẽ cũng đáng để xem quá trình suy nghĩ thực sự của giáo viên.

Cuối cùng, Các phím nóng và thủ thuật chỉnh sửa mà nhà phát triển chuyên nghiệp sử dụng không gây ra "tiếng ồn" cho việc học của học sinh. Quan trọng nhất, họ tham gia và quan tâm đến sinh viên. Thứ hai, họ nâng cao nhận thức cho nhu cầu phát triển chung. Hơn nữa, cơ bản nhất của các thực hành này thường dễ thực hiện nhưng ban đầu không rõ ràng. Một sinh viên cửa hàng gỗ trẻ tuổi có thể dễ dàng học cách tháo móng tay bằng móng búa, nhưng trong hầu hết các trường hợp, trước tiên phải nói rằng đó là móng vuốt để làm gì. Một số thứ cực kỳ dễ làm chỉ là không tầm thường để học mà không được dạy. Ngay cả các nhà phát triển chuyên nghiệp cũng quên đi những "thủ thuật" này mọi lúc và được hưởng lợi từ các công cụ tái cấu trúc như chia sẻ lại để loại bỏ mã thừa hoặc chưa được xử lý, v.v.


1
btw, nếu ai đó có thể chỉ cho tôi tiêu đề của bài viết đó tôi sẽ đánh giá cao nó!
David

2

Lập trình máy tính thường là một trong những khóa học đầu tiên trong đó kỹ năng nhận thức tổng hợp là cần thiết cho một lớp qua. Kỹ năng đó rất khó truyền đạt cho người khác. Bạn có thể giải thích tất cả các thành phần họ có sẵn cho họ và cách họ làm việc. Bạn có thể đưa ra vô số ví dụ về cách người khác đã sử dụng tổng hợp để kết hợp các thành phần đó thành một tổng thể hữu ích hơn, nhưng chỉ có rất nhiều bạn có thể làm mà không cần "nhấp chuột" trong tâm trí của học sinh.

Theo kinh nghiệm của tôi, đó là kỹ năng tổng hợp thường khiến những người không "lập trình" được. Họ có một sự hiểu biết hoàn hảo về các bộ phận, như các biến, hàm và vòng lặp, nhưng họ đặt câu hỏi như: "Tôi hiểu tại sao nó hoạt động, nhưng làm thế nào bạn biết bạn cần đặt một vòng lặp ở đó?" Bạn chỉ cần thực hành cho đến khi bạn nhận được nó.


2

Để đánh lạc hướng Aaron Hillegass, hãy nhắc nhở họ rằng họ không ngu ngốc, thật khó. Lập trình rất khó để rèn luyện trí óc của bạn, đó là một cách suy nghĩ hoàn toàn khác, và trong khi họ có thể đang phải vật lộn với những điều cơ bản thì có lẽ họ khá nhận thức được họ và điều đó sẽ khiến họ khá tuyệt vọng.

Tôi nói điều này như một người đã thất bại trong khóa học CS năm đầu tiên của mình, tôi đã lập trình rất nhiều trước đó và có tất cả các khái niệm (VB, yeah baby) nhưng C ++ sẽ không nhấp cho tôi. Cuối cùng tôi đã quay trở lại những điều cơ bản và làm việc từ đó, sau đó nó nhấp chuột, nhưng nếu ai đó đã nói "Bạn không phải là một thằng ngốc, điều này thật khó khăn", nó sẽ giúp cuộc sống của tôi dễ dàng hơn.


0

Bạn nói rằng "những sinh viên này có thể biết cách học toán, sinh học hoặc vật lý, nhưng những kỹ thuật đó không hoạt động khi nói đến lập trình".

Có một lý do cho điều này, lập trình đòi hỏi một thứ mà những môn học khác không nhất thiết yêu cầu: sáng tạo và ... tưởng tượng . Khả năng "tưởng tượng mọi thứ tại nơi làm việc". Cá nhân tôi nhận thấy một yêu cầu như vậy hiện diện nhiều hơn (tất nhiên, với tất cả các trường hợp ngoại lệ), những người đến từ trường kỹ thuật (cụ thể là điện tử và cơ điện: họ phải "tưởng tượng dòng điện và cách họ điều khiển lẫn nhau", vì họ không thể nhìn thấy chúng!) hơn là từ "khoa học thuần túy" (nơi mọi thứ trông giống như xoay quanh toán học).

Đối với trường hợp cuối cùng này, "nhận thức trực quan" phải được giúp đỡ. Điều quan trọng không chỉ là tập trung vào khái niệm và văn bản (loại -> biên dịch -> xem các lỗi không thể hoạt động nếu bạn không thể "đọc" các lỗi) mà còn cung cấp cách để trực quan hóa mọi thứ, trong thời gian thiết kế ( bằng cách mô phỏng những gì diễn ra trên máy: được chuẩn bị với bảng trắng và bộ màu sau đó) và tại thời điểm thực hiện.

Để phần cuối cùng này thành công, cần phải đưa ra khái niệm thiết yếu về hệ điều hành và "cách các chương trình chạy vào máy" (và thực tế máy đó là gì). Và một IDE không đáng sợ phải được đưa ra. Tôi thường là một "Khối mã tùy chỉnh" với nhiều thứ bị xóa để "không làm sao lãng". Khái niệm dự án được tạo từ các nguồn để tạo các đối tượng được liên kết với thư viện phải được đưa ra TRƯỚC KHI bắt đầu nói về một ngôn ngữ.

Thế giới xin chào truyền thống C ++ yêu cầu điểm vào và thiết bị đầu ra. Học sinh phải quen thuộc với nó. Sự thành công của loại khóa học này phụ thuộc vào những ngày đầu tiên. Bạn cần kích thích một hình dung về những gì xảy ra bên trong máy tính để cho họ hiểu lập trình là gì.
Phần còn lại là cú pháp (khoa học) và trừu tượng (fantasy)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.