Làm thế nào tôi có thể đối phó với thái độ lập trình tôn giáo hàng hóa?


257

Tôi có một số sinh viên khoa học máy tính trong một khóa học lập trình giới thiệu bắt buộc, người coi ngôn ngữ lập trình là một bộ phép thuật, phải được sử dụng để đạt được hiệu quả (thay vì xem nó như một phương tiện linh hoạt để thể hiện ý tưởng giải pháp của họ) .

Họ có xu hướng sao chép-dán mã từ các bài tập tương tự trước đó mà không xem xét bản chất của vấn đề.

Có một số bài tập hoặc tương tự để làm cho những sinh viên này tự tin hơn rằng họ có thể, và nên, hiểu cấu trúc và ý nghĩa của từng đoạn mã họ viết không?


8
Bình luận viên: Đừng để lại câu trả lời ở đây trong phần bình luận. Viết câu trả lời của riêng bạn. Nhận xét không phải là một địa điểm để thảo luận về các câu trả lời khác nhau có thể cho câu hỏi: hoặc đưa ra gợi ý của bạn làm câu trả lời hoặc đưa nó ra để trò chuyện với nó trước.

50
Bất cứ khi nào học viện đến đây - tôi lo lắng cho tương lai của mình ... Tôi chỉ tưởng tượng mình đang ở trên một chiếc Boeing 7-28-7 và Turbines quay với tốc độ 200.000 vòng / phút chạy trên phần mềm điều khiển được viết bằng C bởi một trong những học sinh gần như không qua khỏi của bạn .. Dù sao tôi lạc đề.
Ben DeMott

67
Bạn đã từng xem xét FAILING cho họ một vài lần, không phải ai cũng bị loại ra để phát triển phần mềm! Chúng không phải là những bông tuyết đặc biệt!

6
Không phải SICP là loại nổi tiếng khi nói rằng lập trình tương tự như đúc chính tả? Ý tôi là, tôi nghi ngờ các sinh viên của bạn đang trích dẫn SICP hoặc thậm chí so sánh với những gì Abelson và Sussman đang cố gắng miêu tả, nhưng tôi không thấy việc ai đó so sánh việc viết chương trình với chính tả, khi một trong những người nổi tiếng nhất sách lập trình máy tính ngoài kia làm điều tương tự chính xác trong vài trang đầu tiên.
Robbie

9
Eric Lippert có rất nhiều điều để nói về chủ đề này. Và theo một cách rất thanh lịch hơn và ngắn gọn hơn là tôi có thể có thể: blogs.msdn.com/b/ericlippert/archive/2004/03/01/82168.aspx
P.Brian.Mackey

Câu trả lời:


120

Bạn có thể trình bày cho họ một loạt các bài tập, mỗi bài tập xây dựng trước đó trong khi thêm một số yếu tố bổ sung hoặc xoắn vào vấn đề hoặc điều tra vấn đề từ một quan điểm khác nhau, điều này cho thấy một điểm yếu của giải pháp trước đó, đòi hỏi một cách tiếp cận mới, khác biệt . Điều này buộc họ phải suy nghĩ, phân tích, sửa đổi và thử nghiệm với từng giải pháp, thay vì chỉ sao chép một đoạn mã đã làm sẵn.

Một khả năng khác - mặc dù không hoàn toàn là một nhiệm vụ lập trình - là yêu cầu họ ước tính nhiều thứ khác nhau. Ví dụ, có bao nhiêu nước chảy qua đồng bằng Mississippi mỗi giây? Những câu hỏi như vậy không có câu trả lời được đặt ra, đặc biệt là vì người ta cần đưa ra một số giả định nhất định để có được (các) giá trị (phạm vi) thuyết phục. Và - mặc dù câu trả lời cho nhiều câu hỏi "cổ điển" này thực sự có thể được googled - bạn có thể dễ dàng tạo ra những câu hỏi mới chưa được tìm thấy ở bất cứ đâu trên mạng.

Ví dụ cho cả hai loại bài tập này có thể được tìm thấy trong ví dụ Lập trình Ngọc trai của Jon Bentley. Ngoài ra Lập trình viên thực dụng có một số thách thức tốt.

Một loại nhiệm vụ thứ ba sẽ là trình bày cho họ một số đoạn mã có (một hoặc nhiều) lỗi trong đó, mà họ phải tìm và sửa. Điều này một lần nữa buộc họ phải sử dụng các kỹ năng phân tích và lý do về cách chương trình thực sự hoạt động.

Cập nhật

Phản hồi từ một bình luận của Billy ONeal:

Vấn đề với "chuỗi bài tập" là các sinh viên gặp vấn đề với bài tập trước đó hoàn toàn bị vặn vẹo cho các bài tập còn lại.

Bạn đã đúng, mặc dù tôi cảm thấy đây là vấn đề chung về việc đặt độ khó của khóa học ở mức độ phù hợp / nhóm các sinh viên có trình độ kỹ năng tương tự lại với nhau. Hơn nữa, người ta có thể sắp xếp các sinh viên thành các nhóm nhỏ hơn, nơi họ được yêu cầu thảo luận và tranh luận về các vấn đề và giải pháp, và giải quyết các vấn đề cùng nhau. Nếu ai đó không hiểu, những người khác có thể giúp đỡ (thiết lập này cũng sẽ cải thiện kỹ năng làm việc nhóm). Và nếu ai đó cố gắng lười biếng và để những người khác làm tất cả công việc, thì chắc chắn sẽ được giáo viên chú ý (người được cho là đang đi dạo, giám sát và tư vấn cho học sinh, không chơi WoW trên máy tính xách tay của mình trong góc ;-)

Và người ta cũng có thể điều chỉnh các bài tập để phù hợp với học sinh với các cấp độ kỹ năng khác nhau. Người mới bắt đầu có thể đi chậm hơn, người có kinh nghiệm nhanh hơn.


Tôi sẽ thêm vào câu trả lời hay này một liên kết đến một trang web đơn giản, rằng IMHO nên được đặt làm phần bổ sung cho các khóa học: http://projecteuler.net/ đây là trang web để kích thích sự thèm mã của họ. Nó có các vấn đề khó khăn ngày càng tăng phải được giải quyết với ngôn ngữ họ muốn. Đầu tiên, nó gây nghiện, và nó cũng kích thích sự cạnh tranh: bạn có thể theo dõi tiến trình của họ thông qua tài khoản của họ, họ cũng có thể làm điều đó.
Nicolas C.

142

Bạn đang chiến đấu với hành động cân bằng của học sinh về nhu cầu của họ để quan tâm đến chủ đề của bạnnhu cầu của họ để đạt điểm . Nhiều sinh viên cảm thấy rằng:

(Nhận sai | | Thử nghiệm) == (Không đạt hạng && Thời gian lãng phí)

Ngay khi học sinh cảm thấy rằng thời gian hoặc lớp học của mình có nguy cơ, ngay cả đối với một môn học thú vị, họ ngừng học và nhảy thẳng đến "Tôi không quan tâm, chỉ cần cho giáo viên trả lời đúng". Học sinh của bạn đang cố gắng cắt giảm các góc (hoặc vì vậy họ nghĩ) bằng cách suy nghĩ ít nhất có thể về vấn đề và chỉ cần hack nó bằng cách sao chép và dán.

Dưới đây là những gợi ý của tôi về cách giải quyết vấn đề này:

  1. Sử dụng phương pháp Bob Ross: Chứng minh với họ rằng cả hai đều có thể và nhanh hơn để bắt đầu lại so với sao chép và dán. Tạo các chương trình mới trước mắt họ trong lớp - thực sự cho họ thấy rằng lập trình có thể giống như vẽ một bức tranh.
  2. Cung cấp các bài tập đòi hỏi sự sáng tạo . Ví dụ, yêu cầu mỗi sinh viên tạo cấu trúc dữ liệu của riêng họ (các đối tượng cần có để tạo Sở thú, Cửa hàng thú cưng, Thị trấn, Cao đẳng, v.v.) trên giấy để sử dụng trong suốt khóa học. Bài tập số 2 có thể chuyển đổi các cấu trúc đó thành các lớp hoặc các đối tượng, v.v. Về cơ bản, hãy lôi kéo chúng suy nghĩ một cách trừu tượng - thưởng cho chúng vì sự sáng tạo, và sau đó thưởng cho chúng vì đã biến sự sáng tạo của chúng thành một chương trình máy tính.
  3. Sử dụng số lượng cú pháp ít nhất có thể. Các công cụ nồi hơi như tạo các lớp và cú pháp ngôn ngữ rất phổ biến trong phần giới thiệu lập trình đến nỗi nó thường khiến học sinh lầm tưởng rằng tất cả các chương trình chỉ biết đặt dấu ngoặc nhọn ở đâu - họ không nhận ra rằng cái gì ở giữa xoăn niềng răng là nơi dòng chảy sáng tạo . Chọn một ngôn ngữ đơn giản và cung cấp các tệp mẫu (chẳng hạn như tệp lớp trống) cho các sinh viên vẫn muốn sao chép và dán nội dung nào đó. Bạn có thể dần dần trở nên nghiêm ngặt hơn về cú pháp và các bài tập có thể biên dịch khi khóa học tiến triển.

Điều đó nên &&- mặc dù tôi nghi ngờ nó cũng có thể thành công như một thao tác bitwise.
tvanfosson

Tôi thực sự không biết dữ liệu trông như thế nào, nhưng có một thao tác bitwise là những gì tôi dự định. Bắt tốt :-)
Kevin McCormick

3
"những gì ở giữa các dấu ngoặc nhọn là nơi dòng chảy của sự sáng tạo" ==> oops anh ấy / cô ấy sẽ không dạy họ Python sau đó ...
Olivier Pons

3
Một vấn đề khác với việc chỉ cố gắng cung cấp cho giáo viên câu trả lời 'đúng' thay vì học, đó là mọi người thường nghĩ đó là việc học. Ví dụ lesswrong.com/lw/iq/guessing_the_teachers_password
Wilka

6
Và sau đó tôi sẽ thêm một vài dấu chấm phẩy hạnh phúc ở đây ...
VirtuosiMedia 17/213

44

Một số điều mà tôi suy nghĩ:

  • Đưa cho họ các bài tập mà họ thực sự phải giải thích mã mà người khác (bạn) đã viết. Hiểu về mã trước đó hoặc cụ thể hơn là thiếu nó là nguyên nhân lớn nhất và nguy hiểm của lập trình sùng bái hàng hóa. Yêu cầu họ sử dụng các bình luận, từng dòng nếu cần thiết, để giải thích chương trình của bạn bằng tiếng Anh đơn giản (hoặc bất kỳ ngôn ngữ nào bạn sử dụng).

  • Chỉ sau khi họ giải thích mã, hãy yêu cầu họ sửa đổi mã để thực hiện một thay đổi nhất định. Ví dụ: nếu bạn cung cấp cho họ một hàm sắp xếp giảm dần, hãy yêu cầu họ sắp xếp tăng dần. Hoặc một cái gì đó đòi hỏi nhiều hơn. Nhưng hãy chắc chắn rằng đó là một cái gì đó đòi hỏi sự hiểu biết về mã đã cho.

  • Bạn có thể, nếu bạn thích, đặt một số trứng Phục sinh trong mã. Một hoặc hai dòng không có gì hữu ích hoặc thậm chí liên quan đến vấn đề cả. Cung cấp cho họ một gợi ý rằng các dòng như vậy tồn tại và cấp thêm điểm cho những người loại bỏ chúng.

  • Sau đó và chỉ sau đó bạn có thể giao cho họ một nhiệm vụ để tự viết một đoạn mã từ đầu. Tại thời điểm này, họ nên hiểu rõ hơn về mã thực sự là gì. Họ thậm chí có thể thấy dễ dàng hơn một chút để tự làm điều đó.

Ý tưởng cơ bản là lập trình không chỉ là viết mã, mà còn đọc nó. Đọc mã cũng nên được dạy.


4
Ý tưởng trứng Phục sinh có vẻ như cũng là một cách tốt để dạy kiểm tra / xác minh. Dọc theo dòng "wat có thể được gỡ bỏ mà không phá vỡ bất kỳ hợp đồng nào?"
Neil N

3
+1 để đọc mã. Tôi thấy rất nhiều anh chàng sửa lỗi bằng cách đoán trực quan và sau đó tìm kiếm để chứng minh điều đó. Tôi thấy rằng việc đọc mã cung cấp manh mối đưa bạn đến giải pháp phù hợp. Nghe có vẻ rõ ràng, nhưng tôi thấy nó bỏ bê rất nhiều.
Chris

38

Nhìn nó theo một cách khác. Hiện tượng sùng bái hàng hóa này là giai đoạn mới làm quen với Mô hình thu nhận kỹ năng của Dreyfus . Đây là cách chúng ta học. Khi tôi mới học lập trình, tất cả những gì tôi đang làm là gõ các trang mã từ mặt sau của Compute! tạp chí. Sự lặp lại là chìa khóa. Các bé học cách nói chuyện bằng cách sao chép âm thanh mà chúng nghe được từ bố mẹ. Tất cả mọi thứ chúng ta học được là thông qua bắt chước. Chúng ta chỉ cần được dạy cách đi từ bắt chước đến làm chủ.

Vấn đề bạn gặp phải là học sinh của bạn không lặp lại bất cứ điều gì, họ đang sao chép nó từ Internet. Có một số lợi ích cho điều đó nhưng lợi ích là tối thiểu. Hành động thực sự gõ mã là những gì đã đưa tôi đến một nơi hiểu biết. Tôi bắt đầu thấy các mẫu trong những gì tôi đang gõ và hiểu được những gì tôi đang làm.

Một lựa chọn là cấu trúc phòng thí nghiệm của bạn như một võ đường mã. Cho học sinh thay phiên nhau ghép đôi với nhau trong cùng một vấn đề. Chọn một vấn đề mất khoảng 10 đến 15 phút để giải quyết. Lặp lại vấn đề đó qua một vài phòng thí nghiệm và đưa ra một bước ngoặt mới cho vấn đề khi sự thành thạo của lớp học tăng lên. Có lẽ bắt đầu phòng thí nghiệm bằng cách cho các sinh viên xem bạn lập trình giải pháp và để họ lặp lại. Chuyển đổi cặp với mỗi lần lặp.

Đối với các bài kiểm tra của bạn có một mã kata nơi mỗi học sinh làm việc thông qua các vấn đề từ học kỳ trước phần còn lại của lớp học. Tập trung không chỉ vào tính chính xác mà hình thức và sáng tạo. Tôi nghĩ rằng điều này sẽ cung cấp một sự hiểu biết sâu sắc hơn về cách lập trình hơn là giao bài tập về nhà.


"Khi tôi mới học lập trình, tất cả những gì tôi đang làm là gõ các trang mã từ mặt sau của tạp chí Compute!": Đây là giai đoạn rất sớm của tôi khi tôi sử dụng một chiếc Commodore Vic20 để chạy các chương trình đồ chơi nhỏ và nó nhanh chóng trở thành rất nhàm chán. Tôi sớm phát triển thái độ ngược lại: viết cho mình ngay cả mã mà bạn có thể sao chép từ nơi khác, nếu không bạn sẽ không bao giờ chắc chắn điều gì đang thực sự xảy ra trong mã.
Giorgio

Một trong những giáo viên của chúng tôi sẽ giao cho chúng tôi bài tập để sao chép một chương trình biên dịch chương trình mà anh ấy đã đưa cho chúng tôi và anh ấy yêu cầu bản sao phải được thực hiện bằng chữ viết tay của chúng tôi. Anh ấy cũng muốn chúng tôi viết tên của chúng tôi ở trang đầu tiên trước anh ấy để anh ấy có thể kiểm tra xem chữ viết tay là của chúng tôi. Nhiệm vụ đó khiến tôi mất khoảng 3 giờ.
sashoalm

1
Một môi trường không bị phân tâm như Cyberdojo của Jon Jagger có thể rất tuyệt vời cho việc này và việc thiết lập máy chủ của riêng bạn cũng đơn giản như tải xuống máy ảo hoặc nguồn từ github .
Đánh dấu gian hàng

@giorgio Lúc đó tôi 8 tuổi. Cấp độ kỹ năng của tôi là "nhập cái này vào một trò chơi miễn phí"
Michael Brown

25

Tôi đã dạy các lớp giới thiệu trong quá khứ và khi tôi nhớ lại bây giờ:

Một số sinh viên nghĩ rằng lập trình là như thế vì những lý do khác nhau. Tôi nhớ có một lần một đứa trẻ ngoan ngoãn vận chuyển hàng hóa rất nhiều những gì tôi đã làm:

Tin rằng đó không phải là một vấn đề riêng lẻ, nhưng các sinh viên khác trong cùng lớp có thể có hành vi tương tự hoặc tiếp cận vấn đề và không thể hiện nó, tôi luôn luôn giải quyết lớp học.

  1. Một thời gian được dành để giải thích một số nội dung như tính xác định, có nghĩa là trong cùng một môi trường có cùng dữ liệu và mã, chúng sẽ có cùng kết quả (xua tan "tính ngẫu nhiên"),

  2. Vì việc giải quyết vấn đề tùy thuộc vào hành động của học sinh chứ không phải bất cứ điều gì khác, nên cần chú ý giải quyết vấn đề và không tìm đúng chính tả,

  3. Họ đang ở trong một môi trường giáo dục, vì vậy các vấn đề được tạo ra để cung cấp trải nghiệm học tập, kết quả là học cách lập trình (hoặc trong một số trường hợp như các lớp học cho Quản trị viên hệ thống, cách chương trình hoạt động, khác biệt) và không cho tôi một giải pháp ("Thế giới không cần máy tính khác, đó là một bài tập"), vì vậy vấn đề của họ có thể được giải quyết bằng các tài liệu có sẵn (ví dụ: ghi chú được cung cấp),

  4. Tôi nghĩ rằng đó là trong Code Complete: "Ngay cả khi bạn sao chép và dán, mã vẫn là của bạn". Nếu ai đó đã làm nó, nó không nên là kiểu hàng hóa. Mỗi dòng phải được giải thích cho tôi (cá nhân) hoặc cho một học sinh khác (cùng) hoặc với lớp.


23

Học sinh của bạn đã bắt đầu'mức độ trừu tượng' chính xác khi bắt đầu khóa học? Ví dụ, một bài tập về nhà giới thiệu cho họ các cấu trúc lập trình chính như các vòng lặp và các điều kiện mà không cần viết một dòng mã nào?

Khi tôi giới thiệu về lập trình, nhiệm vụ đầu tiên của chúng tôi được gọi là ' Rick Robot '. Chúng tôi có một mảnh giấy với bản đồ trên không của một thành phố với những điểm thú vị, như ngân hàng, cửa hàng tạp hóa, v.v ... Chúng tôi có một anh chàng tên là 'Rick' và có những hành động như 'đi một bước', 'nhìn trái', 'Nhìn đúng', 'băng qua đường' và chúng ta có thể sử dụng những thứ như 'lặp lại' và 'nếu có gì đó, thì hãy làm gì đó'. (Đây không phải là 100%, vì tôi không thể tìm thấy nhiệm vụ này) Ý tưởng là Rick chỉ có thể sử dụng những gì anh ấy đã đưa ra và anh ấy phải đến những nơi khác nhau trên bản đồ.

Đây là một bài tập thú vị và một cái gì đó đã giới thiệu cho bạn những điều cơ bản (đôi khi khó nắm bắt nhất đối với người mới). Không có câu trả lời hay cho vấn đề này (đây là một trò chơi) và không có giải pháp nào để sao chép và dán từ đó. Một cái gì đó như thế này cũng có thể cho phép bạn chơi với sự sáng tạo của họ nhiều hơn một chút mà không khiến họ sợ hãi bằng mã.

Cuối cùng, ý tưởng là bạn bắt đầu với bản tóm tắt và tiến về phía cụ thể . Họ không thể sao chép dán trừu tượng. Họ phải hiểu nó để giải quyết một vấn đề.


3
Vòng lặp và điều kiện? Tôi sẽ bắt đầu chúng với các biến, bài tập và biểu thức. Cho họ đọc hai số khỏi dòng lệnh và thêm chúng, sau đó in kết quả. Thường xuyên làm một cái gì đó gần như rõ ràng đau đớn mang lại cho sinh viên sự tự tin rằng họ có thể hiểu những gì đang xảy ra, và khuyến khích họ thử nghiệm.
TMN

2
@c_maker: Bài tập của bạn trông giống như một trò chơi dành cho học sinh mầm non. Cho sinh viên của bạn những nhiệm vụ quá dễ dàng chỉ có thể làm giảm sự quan tâm của họ đối với môn học.
Goran Jovic

2
@c_maker: Tôi nghĩ rằng câu trả lời của bạn có giá trị, tôi chỉ không thấy cách chuyển từ while not at-corner do take-one-step endmã thực tế mà không "chèn lấp" vào những thứ như biến và loại dữ liệu. Lời xin lỗi, phản ứng của tôi có vẻ hơi khắc nghiệt đối với sự phản ánh.
TMN

7
Tôi nghĩ rằng giá trị chính đằng sau Rick Robot không phải là giúp hiểu các vòng lặp, nếu các câu lệnh, v.v ... Giá trị chính là giúp chúng hiểu được quy trình chung về cách viết chương trình. Nó giúp họ nhìn nhận vấn đề theo một cách cụ thể, từng bước, thuật toán. Một khi họ hiểu quy trình lập trình bằng tiếng Anh với một ví dụ như thế này, thì bạn có thể điền vào các chi tiết bằng cách dạy cho họ biết mã trông như thế nào. Đây là một ý tưởng tuyệt vời. +1
Phil

1
Nhắc nhở tôi về khóa học giới thiệu của tôi (30 năm trước!), Dựa trên [Karel the Robot] ( en.wikipedia.org/wiki/Karel_(programming_lingu) . (Lưu ý: liên kết không thành công vì url thực sự bị chặn Nhấp vào tùy chọn đầu tiên trên trang xuất hiện.) Dù sao, Karel đã sử dụng cú pháp giống Pascal, nhưng không quá nhiều.
JeffK

20

Những gì bạn đang yêu cầu họ làm là thể hiện phân tích và tổng hợp trong lĩnh vực nhận thức của Phân loại tư duy Bloom , nơi họ hiện chỉ trình bày ứng dụng.

Thật không may, đó là một loại tình huống "dẫn ngựa xuống nước". Phân tích và tổng hợp cũng rất khó thực hiện khi bạn vẫn đang vật lộn với sự hiểu biết. Nếu không có sự hiểu biết tại chỗ, các hoạt động phân tích và tổng hợp sẽ hoạt động như cỏ dại hơn là các hoạt động học tập.

Ý kiến ​​cá nhân của tôi là không nên mong đợi gì hơn là ứng dụng trong phần giới thiệu cho các lớp lập trình. Đây là lần đầu tiên sinh viên được tiếp xúc với những khái niệm này, vì vậy nó giống như dạy trẻ em đọc trước khi yêu cầu chúng viết một bài luận. Những kỹ năng bậc cao hơn sẽ theo sau trong các lớp học sau này của họ.


2
Một chút rất thú vị về phân loại của Bloom. Theo tôi, điều quan trọng là làm cho một sinh viên hiểu mã hơn là sao chép / dán nó vào một lớp giới thiệu. Họ cần biết cách các ifcâu lệnh hoạt động và có thể tự viết từ đầu trước khi chúng tiếp tục. Nhận phần nhận thức làm việc, sau đó chuyển sang ứng dụng.
Phil

Gần đây tôi đã tham dự một khóa học tuyệt vời liên quan đến giảng dạy của Richard Felder. Ý kiến ​​của ông là bạn không cần phải "làm chủ" mức phân loại thấp hơn của Bloom trước khi đẩy mạnh. Một ví dụ, ông nói rằng trẻ em mẫu giáo đang thực hành phân tích như thế nào khi chúng được yêu cầu so sánh chương trình truyền hình nào tốt hơn - Sesame Street hay [...?] Và tại sao.
Aivar

11

Bạn đã xem xét việc cung cấp cho họ một số mã để bắt đầu? Bất cứ điều gì đơn giản là giàn giáo mà bài tập cần, như một hàm chính trống (tôi không biết bạn đang sử dụng ngôn ngữ nào). Một cái gì đó biên dịch và chạy và không làm gì cả. Sau đó, họ có thể bắt đầu thêm mã của mình với một mức độ tin cậy rằng ít nhất một phần của nó hoạt động.

Điều này thực sự khá phổ biến trong "thế giới thực"; rất nhiều IDE và các công cụ khác tạo các dự án trống với các tệp thư viện / mẫu / cấu hình điển hình đã có sẵn.


Một cách khác để cung cấp mã là yêu cầu họ tương tác với một lớp bạn đã viết (không hoạt động với mã trước đó) và đưa ra yêu cầu về việc gán mã mà mã của bạn không thể thay đổi và họ phải tự sửa đổi mã để thực hiện công việc chuyển nhượng.
Zoot

Hoặc thậm chí cung cấp mã để làm cho nó hoạt động theo một cách và thực hiện nhiệm vụ để thay đổi / thêm hành vi. Bằng cách đó, họ tập trung vào hành vi cụ thể hơn là cơ bản để nó hoạt động.
JohnMcG

đối với ngôn ngữ đầu tiên, hãy thử sử dụng ngôn ngữ không yêu cầu bất kỳ bản mẫu nào để bắt đầu. Python là tốt về mặt này, C / C ++ / Java là một ví dụ xấu.
Lie Ryan

Nếu bất cứ điều gì, IDE, hoàn thành mã và các mẫu thúc đẩy tâm lý sùng bái hàng hóa. Nếu sinh viên dành thời gian để hiểu lý do tại sao mã mẫu đó là cần thiết và họ sẽ học được nhiều hơn là mù quáng làm theo công thức.
Đánh dấu gian hàng

8

Bất kỳ loại tâm lý sùng bái hàng hóa nào (bao gồm cả các hầm hàng hóa ) đều xuất phát từ sự thiếu hiểu biết cơ bản về công nghệ liên quan.

Lập trình vận chuyển hàng hóa không nên được coi là một thói quen có vấn đề, mà là một triệu chứng của sự nhầm lẫn tiềm ẩn mà lập trình viên đang phải đối mặt.

Quan trọng hơn, giả định rằng sự thiếu hiểu biết của học sinh chỉ đơn giản là sự phát triển của sự thiếu tự tin của anh ta về cơ bản là sai lầm và không giải quyết được vấn đề tiềm ẩn.

Thay vào đó, phong cách lập trình sao chép của sinh viên nên là một lá cờ đỏ cho bạn biết rằng sinh viên này bị choáng ngợp bởi sự phức tạp của những gì anh ta dự kiến ​​sẽ làm.

Anh ấy theo bản năng sử dụng công việc trong quá khứ như một giàn giáo để xây dựng dự án hiện tại của mình, cố gắng sáng tác một giải pháp sử dụng các vấn đề đã được giải quyết trước đó như các khối xây dựng. Tất cả chúng ta đều làm điều này ở một mức độ nhất định, nhưng hầu hết chúng ta làm điều này bằng cách sử dụng kiến thức thu được từ công việc trong quá khứ như các khối xây dựng của chúng ta. Thay vào đó, sinh viên này đang sử dụng công việc đó, điều đó có nghĩa là anh ta không thực sự hiểu các khối anh ta làm việc cùng. Anh ta đã phân rã công việc theo như sự hiểu biết của anh ta cho phép, và coi các khối mã lớn là các đơn vị nguyên tử vì anh ta không hiểu cách chúng hoạt động . Anh ta chỉ biết những gì họ làm.


Cảm ơn! Bạn đã cho tôi rất nhiều thức ăn cho suy nghĩ. Ban đầu tôi nghĩ rằng có lẽ họ chỉ không thể tưởng tượng rằng có một cấu trúc và ý nghĩa cấu thành bên trong một đoạn mã. Bây giờ tôi đang nghĩ rằng có lẽ họ thực sự đã đấu tranh để hiểu nó nhưng thất bại và sử dụng bản sao dán như là phương sách cuối cùng.
Aivar

7

Thay đổi ý tưởng của bạn về các dự án!

Trong thế giới lập trình, hiếm khi chúng ta thực sự tạo ra các dự án mới cho mọi giải pháp xuất hiện. Hầu hết thời gian chúng tôi sửa đổi những cái cũ.

Thay đổi ý tưởng của bạn về một dự án từ một giải pháp cho mỗi bài tập thành một giải pháp cho toàn bộ học kỳ. Mỗi nhiệm vụ được xây dựng trên nhiệm vụ trước.

Thí dụ

Dự án: Xây dựng hệ thống thang máy

  • Bài tập 1: In ra sàn hiện tại
  • Bài tập 2: Tạo cấu trúc dữ liệu cho lớp thang máy và in ra sàn dựa trên thang máy
  • Bài tập 3: Tạo mã "di chuyển thang máy", in ra sàn. Chấp nhận nhập bàn phím (> nhập sàn :)
  • Bài tập 4: Xử lý nhiều thang máy

Vấn đề là bạn xây dựng dựa trên nhiệm vụ trước thay vì tái chế các nhiệm vụ cũ cho một nhiệm vụ mới.


2
Chà, sao chép không phải là vấn đề, vấn đề là họ không hiểu những gì họ đang sao chép.
Aivar

1
Một vấn đề với các bài tập gia tăng là nếu học sinh làm hỏng sớm, chúng sẽ bị mắc kẹt với mã không hoạt động cho phần còn lại của chúng. Nhiều người hướng dẫn sẽ cung cấp một cách hữu ích mã làm việc để sử dụng làm cơ sở cho các bài tập tiếp theo, nhưng sau đó họ quay lại vấn đề ban đầu: sửa đổi mã của người khác mà họ không hiểu.
Barry Brown

Có thật không? Nếu một người hướng dẫn không đủ hữu ích để giúp sinh viên làm việc với mã của họ, họ có thực sự làm việc của họ không?
Richard

Không phải tất cả mọi người sẽ nhận được nhiệm vụ của họ làm việc vào ngày đáo hạn.
Barry Brown

@Barry, đây không phải là trường hợp với mọi môn học xây dựng logic trong suốt khóa học? Chẳng hạn, nếu bạn chưa từng học tập Liên minh và Giao lộ, bạn sẽ bị cuốn vào phần còn lại của khóa học Toán rời rạc. Hoặc nếu bạn không bao giờ học bảng tuần hoàn của mình, bạn sẽ được giải cho khóa học Hóa học còn lại. Ý tưởng là buộc học sinh thành thạo các khái niệm theo đúng thứ tự và thực hiện các động tác lừa cho đến khi chúng thành thạo chúng. Nếu họ không thể dành cả đêm trong một tuần để có được một chương trình phù hợp để sẵn sàng cho ngày học tiếp theo, họ không cần phải tạo ra sự nghiệp phát triển phần mềm.
Jonathan Henson

7

Cân nhắc sử dụng một ngôn ngữ cấp cao, yêu cầu tối thiểu mã soạn sẵn.

Đối với tôi, nó thường là mã soạn sẵn trong các khung lớn hoặc ngôn ngữ dài, có cảm giác như phép thuật và cản trở sự hiểu biết.

Cá nhân tôi đã được dạy ML tại khóa học lập trình giới thiệu CS của tôi. Trong nhiều năm, Lisp được dạy làm giới thiệu về lập trình tại MIT. Cả hai đều là lựa chọn tuyệt vời. Một số lợi ích họ có là

  • Phiên dịch tương tác. Rất quan trọng, vì điều này cho phép thăm dò.
  • Rất súc tích. Không có nồi hơi nào cả. Nó cho phép các sinh viên tập trung vào các ý tưởng mà họ đang cố gắng thể hiện.
  • Tương đối tối nghĩa và xa lạ (ít nhất là so với Java, C hoặc các ngôn ngữ chính khác mà sinh viên có thể đã có một số kinh nghiệm). Vâng, tôi liệt kê đó là một pro. Nó san bằng sân chơi cho học sinh, vì có khả năng sẽ không có ai có kinh nghiệm trước đó. Và nó làm cho ít có khả năng họ sẽ chỉ có thể sao chép-dán các giải pháp để làm bài tập về nhà trên web.

ML sẽ là sự lựa chọn khá tốt! Nhưng Python cũng phù hợp với hai điểm đầu tiên của bạn và nó rất dễ sử dụng (có nghĩa là không có rắc rối kỹ thuật lớn).
Aivar

Tôi cũng rất muốn giới thiệu Python, đặc biệt là khi kết hợp với một IDE tốt như Wing IDE.
Ken

6

Tôi đã làm một số nghiên cứu về các vấn đề của các lập trình viên mới vào những năm 80. Dựa trên kinh nghiệm của tôi với các lập trình viên mới làm việc ngày hôm nay, không có nhiều thay đổi. Người mới không có một mô hình tinh thần hữu ích về những gì máy tính thực sự làm. Họ dùng đến bùa chú ma thuật vì bản thân cỗ máy là ma thuật.

Lập trình đòi hỏi phải phá vỡ các nhiệm vụ đơn giản tự nhiên thành các bước nhỏ không tự nhiên. Vì người mới không đối phó với độ chi tiết tốt như vậy trong cuộc sống hàng ngày, họ khó có thể tìm ra các bước nhỏ nên làm gì, đặc biệt là khi không rõ những bước nhỏ mà máy tạo ra. Nhưng ngay cả khi họ có thể tìm ra điều đó, thì họ vẫn phải đối mặt với cú pháp cứng nhắc và ngữ nghĩa hạn chế của ngôn ngữ lập trình (một ngôn ngữ không tự nhiên giả dạng như một ngôn ngữ gần như tự nhiên) điều khiển cỗ máy bí ẩn bằng điều khiển từ xa.

Vì họ không thể tạo ra mối liên hệ giữa một giải pháp hợp lý cho vấn đề và chức năng của máy, họ tập trung vào việc đáp ứng các yêu cầu của ngôn ngữ. Mục tiêu đầu tiên là viết một cái gì đó - bất cứ thứ gì - mà biên dịch. Thứ hai là điều chỉnh chương trình đó - bất cứ điều gì nó thực sự làm - để giữ cho nó không bị hỏng. Sau đó, nếu họ có thời gian, năng lượng và sự quan tâm, họ cố gắng để chương trình tạo ra kết quả giống với những gì vấn đề yêu cầu. Trên đường đi, họ có thể vô tình tạo ra mã được viết tốt.

Rất có thể, những người mới học lập trình thành công vì họ đã suy ra một mô hình tinh thần hữu ích của máy tính, chứ không phải vì họ đã cố tình đưa ra một cái và tiếp thu nó.


5

Bạn có thể hỏi họ câu hỏi về các đoạn mã yêu cầu trả lời bằng văn bản? Giống như "Mã này đang làm gì?" "Tại sao các lập trình viên giải quyết nó như thế này?" "Có cách nào tốt hơn không?", V.v?

Điều đó thực sự sẽ khiến họ suy nghĩ về vấn đề, đó là điều họ có thể làm mà không cần chạm vào mã.


5
  • Thách thức họ tạo ra các giải pháp ngắn nhất có thể cho vấn đề.
  • Thưởng các giải pháp ngắn gọn hơn với một ưu đãi.
  • Tạo các bài tập xoay quanh mã tái cấu trúc
  • Yêu cầu học sinh giao dịch các bài tập, và mô phỏng chúng để đạt hiệu quả và độ sạch mã, và sử dụng một số cách kém hiệu quả nhất làm ví dụ trên máy chiếu trên cao.

2
Tái cấu trúc là vô cùng quan trọng để thực hành. Tuy nhiên, thật tốt khi nhớ rằng giải pháp ngắn nhất không nhất thiết phải sạch nhất, cũng không hiệu quả nhất (cũng phụ thuộc vào định nghĩa của các điều khoản này).
Péter Török

Ở trường, tôi đã cố gắng viết các giải pháp có chiều dài nhân vật ngắn hơn các giải pháp của một người bạn. Điều đó có nghĩa là sử dụng tên biến ngắn và trong mã viết chung không đọc tốt.
Christian

@Christian Tóm lại, tôi không thực sự có nghĩa là ngắn về độ dài ký tự, vì trình biên dịch không thực sự quan tâm đến tên biến. Tôi đang nói về sự phức tạp của mã ... hay còn gọi là KISS .
Lynn sụp đổ

4

Tương tự như ý tưởng của JoelFans là yêu cầu họ thực hiện các bài tập ban đầu trên giấy bằng cách sử dụng mã giả (ngôn ngữ) mà bạn tạo. Bạn có thể thêm các cấu trúc khi bạn thấy phù hợp và họ không lo lắng về hộp ma thuật.


4

Tôi sẽ giả định rằng bằng 'giáo phái vận chuyển hàng hóa', ý bạn là họ đang chèn những thứ nghĩ là cần thiết, nhưng thực sự không có gì để giải quyết vấn đề.

Nếu đó là trường hợp, bạn luôn có thể thêm một số yếu tố vào phân loại dựa trên sự đồng nhất - để lại mã không cần thiết hoặc dư thừa trong chương trình của bạn sẽ yêu cầu các vấn đề trong tương lai, vì nó có thể bị hỏng hoặc chỉ gây khó khăn hơn trong việc duy trì.

Họ sẽ bị đánh giá tương tự trong một bài tập viết trong một lớp học tiếng Anh - không ai muốn những thứ bị tắt trong một tiếp tuyến ngẫu nhiên hoặc nói chung là lan man mà không đi đến điểm chính.

Khi tôi tham gia một lớp lắp ráp, giáo viên sẽ cho chúng tôi biết mỗi bài tập nếu anh ấy muốn chúng tôi viết mã về tốc độ, kích thước hoặc mức sử dụng bộ nhớ và anh ấy sẽ đánh dấu nếu bạn không đến gần để tối ưu hóa những gì anh ấy yêu cầu cho

...

Nếu họ sao chép và dán mã từ các bài tập tương tự trước đó và thực sự đó là thứ để giải quyết vấn đề mới ... tốt, đó chỉ là sử dụng lại mã, và trừ khi họ đưa ra các giả định xấu về sự phù hợp cho mã để sử dụng lại , Tôi nghĩ rằng nó hoàn toàn hợp lý để họ làm. (ví dụ, đọc từ một tập tin, cung cấp đầu vào ... tất cả các phần mô-đun có thể được sử dụng lại. Nếu bạn không muốn họ làm điều đó, bạn cần làm cho các bài tập giống nhau.


Vấn đề là họ đang sao chép mà không thấy cấu trúc của mã - họ chỉ nghĩ rằng kiểu mẫu này hữu ích thời gian qua, vì vậy hy vọng nó cũng phù hợp ở đây. Họ hy vọng và cố gắng thay vì tự tin.
Aivar

4

Thật không may, đó là cách mà rất nhiều bộ não của mọi người hoạt động. Vì vậy, đi vào sự hiểu biết rằng có những người bạn không thể 'chữa trị' về điều này. Có rất nhiều người không thể làm việc ở mức độ chính xác về tinh thần cần thiết cho lập trình. Một số người chỉ đơn giản là không được thiết kế cho nó. Tôi không nói từ bỏ các sinh viên - Tôi đang nói đừng cho rằng bạn thất bại nếu không phải ai cũng chọn nó.

Không biết nhiều hơn về bối cảnh của lớp học, tôi muốn nói tập trung nhiều hơn với những sinh viên có vấn đề này vào các cấu trúc rất cơ bản - đơn giản nếu / thens, vòng lặp, v.v ... Các thói quen đơn giản để in ra các số lẻ, mỗi số thứ mười, v.v. hơn 10 dòng mã mỗi. Nếu họ là 'suy nghĩ ma thuật' thì rõ ràng họ chưa nắm vững những điều cơ bản đó. Yêu cầu họ thực hiện nhiều thói quen đơn giản khác nhau cho đến khi họ nắm bắt được những gì đang diễn ra. Một số người khác đề cập đến việc viết mã ra giấy - tôi nghĩ đó cũng là một cách tuyệt vời để thực hiện những thói quen đơn giản này.

Bạn cũng có thể xem xét cho họ học biểu đồ dòng chảy. Đối với một số người, việc có thể thấy luồng của thuật toán và sau đó cách kết nối với mã, có thể hữu ích cho họ khi kết nối mã với luồng.


3

Lý tưởng nhất trong bài giảng đầu tiên, hãy bắt đầu với một thứ hoàn toàn trừu tượng: yêu cầu họ (với tư cách là một nhóm, với bạn là người lãnh đạo) viết ra các hướng dẫn về cách đi mua hàng tạp hóa từ danh sách và phá vỡ dần các hướng dẫn cấp cao cho đến khi họ đạt đến giác ngộ.

Nó giúp nói với họ rằng những hướng dẫn này sẽ được tuân theo theo nghĩa đen của một robot, người không biết cách suy luận mọi thứ. Nó phải là một hoạt động thực hành, nơi bạn chịu trách nhiệm hướng dẫn họ, mặc dù.


Điểm tốt! Tôi đã làm điều này và tôi tin rằng điều này đã hướng dẫn nhiều sinh viên đi đúng hướng. Nhưng không phải tất cả.
Aivar

3

Alistair Cockburn nói về khái niệm Shu-Ha-Ri và cách áp dụng vào lập trình, http://alistair.cockburn.us/Shu+Ha+Ri . Tôi nghĩ rằng điều quan trọng là phải nhớ rằng học sinh của bạn đang ở đâu trong sự liên tục này. Đầu tiên sẽ giúp giảm bớt một số thất vọng của bạn. Sao chép / bắt chước là một phản ứng rất tự nhiên và chế độ được chấp nhận khi bạn lần đầu tiên bắt đầu học một cái gì đó. Thứ hai, nó có thể giúp bạn có được một số ý tưởng về cách tiến về phía trước. Ví dụ: bạn có thể muốn xem xét việc chọn một vấn đề có thể được giải quyết bằng nhiều cách (vòng lặp so với đệ quy, bảng điều khiển so với web / gui) sau đó rõ ràng yêu cầu họ giải quyết theo cách này, sau đó là cách khác - phần thưởng họ có thể học về tái sử dụng mã hợp pháp, thành phần hóa, tạo thư viện tái sử dụng, v.v.

Một cách thành công khác mà tôi từng thấy là sử dụng một loạt các dự án xây dựng lẫn nhau, tạo một phiên bản làm việc mặc định, có sẵn ở mỗi bước sau khi các nhiệm vụ được giao để ngăn chặn mọi người tụt lại phía sau. Mỗi bước của quy trình nên giới thiệu một cái gì đó mới. Tôi sẽ cấp cho bạn rằng điều này có thể dễ thực hiện hơn trong một lớp thiết kế so với lớp lập trình, nhưng nó vẫn có thể thực hiện được. Một điều tốt đẹp về điều này là bạn rõ ràng cung cấp cho họ một triển khai tốt (hy vọng) để so sánh với họ ở mỗi bước. Đưa ra sự so sánh này như một bài tập, tức là thực hiện đánh giá mã nhỏ về mã của chính họ so với nỗ lực của họ. Bạn có thể muốn thực hiện một trong một số tùy chọn tín dụng bổ sung.

Mặc dù tôi thường không quan tâm nhiều đến "ý kiến", nhưng bạn có thể muốn tạo tài liệu về mã một trong các mục cấp. Yêu cầu họ tạo tài liệu "Lý thuyết vận hành" cho từng dự án mô tả cách tiếp cận của họ, cách từng thành phần phù hợp và cách họ cùng nhau giải quyết vấn đề. Thông thường, tôi muốn mã tự làm nhiều thứ này, nhưng nó sẽ khiến họ đặt mũ suy nghĩ của họ lên và đặt nó lên giấy.

Cuối cùng, bạn có thể muốn sáng tạo và để học sinh của bạn xem xét mã của nhau và đưa ra đánh giá. Đặt áp lực ngang hàng để làm việc cho bạn. Cho phép điều này trở thành một phần của cấp tín dụng hoặc tín dụng bổ sung cho mã được xếp hạng cao nhất (và tài liệu).


3

Chỉ là một gợi ý nhanh chóng. Bất cứ khi nào tôi gặp vấn đề về lập trình cần giải quyết hoặc gỡ lỗi, tôi muốn xem mã của mình và 'chơi máy tính' trong đầu tôi theo dõi các biến và giá trị của chúng và những gì tôi mong đợi khi mỗi dòng được chạy . Vì vậy, nếu tôi đã sao chép một số mã từ một nơi nào đó, trừ khi nó tự hoàn thành và tôi chỉ cần tham khảo nó, tôi muốn đi từng dòng một để hiểu chính xác những gì đang diễn ra. Chủ yếu chơi máy tính. VBA Debugger về cơ bản làm cho nhiệm vụ này dễ dàng hơn nhưng làm cho sinh viên của bạn thực hiện nó trên giấy có thể cung cấp cho họ các nguyên tắc cơ bản như thế nào. Dòng này thực sự làm gì?


Tôi đã đề nghị họ làm điều này, nhưng tôi đoán đối với một số quá trình quá chậm và dễ bị lỗi, họ quyết định bỏ qua nó.
Aivar

Bạn đã thử làm điều này trước mặt họ trên máy chiếu bằng bút đánh dấu chưa? Nếu tôi nhớ lớp lập trình trung học của mình, giáo viên của chúng tôi đã làm điều này, và mặc dù hầu hết các học sinh khác không quan tâm, tôi nghĩ đó là một kỹ năng hữu ích. (Cảnh báo tổng quát hóa sắp tới) Thật khó để tạo ra động lực trong học sinh của thế hệ tôi và trẻ hơn, chúng tôi đã học cách không đặt câu hỏi.
Mallow

3

Tôi đã dạy lập trình giới thiệu ở cấp đại học. Đó là một khóa học bánh mì, tất cả các giảng viên đã làm nó, và tôi nghĩ rằng chúng tôi đã làm nó khá tốt. Chúng tôi theo một văn bản chung và có các bài kiểm tra chung, nhưng mỗi chúng tôi đều có phương pháp lớp học riêng. Đã lâu lắm rồi, nhưng thỉnh thoảng tôi có thể dạy kèm cho một đứa trẻ lập trình, và toàn bộ bức tranh cũng giống như vậy.

Cách tôi làm là bắt đầu từ phía dưới, càng cụ thể càng tốt. Những gì sinh viên biết là một cấu trúc. Họ đã có rất nhiều khái niệm. Tôi đang xây dựng các khái niệm xa hơn trên các khái niệm đó và tôi đang loại bỏ các khái niệm mà chúng có thể tạo thành phản tác dụng. Đồng thời, tôi làm cho họ học bằng cách làm .

Tôi đã xây dựng một máy tính nhỏ với chip Intel 8008, một số EPROM và một vài mạch. Tôi đã lập trình cho nó chơi một bản song ca nhỏ khi chip I / O được kết nối với một cặp loa. Tôi sẽ giải thích cách chương trình nhỏ hoạt động, với một vòng lặp bên trong để đếm ngược một bộ đếm. Điều đó sẽ hành động như một sự chậm trễ. Sau đó, nó sẽ chuyển bit đầu ra và làm lại. Nó sẽ làm điều đó trong một thời gian, và sau đó chuyển sang một độ trễ khác, đưa ra một cao độ khác, v.v. Chip bộ nhớ có một bộ đếm thời gian nhỏ, và nếu tôi nhét một đầu tụ điện vào một trong các đầu vào bộ hẹn giờ, chương trình sẽ chạy chậm . Cả lớp có thể nghe thấy những người nói đang bấm, bấm, bấm ... Tôi muốn cả lớp hiểu rằng máy tính đang làm những việc rất đơn giản từng bước một. Sau đó, tôi sẽ bỏ nối dây dẫn tụ điện, và "âm nhạc" sẽ nổ ra. (vỗ tay)

Sau đó, tôi đã xây dựng một trình giả lập cho một máy tính thập phân rất đơn giản, có 1000 vị trí bộ nhớ, mỗi vị trí giữ một số thập phân có 4 chữ số được ký. Nó có các opcodes rất đơn giản như "thêm vào bộ tích lũy", "nhảy nếu âm", v.v. Tôi sẽ yêu cầu họ viết các chương trình nhỏ bằng "ngôn ngữ máy" này, như thêm hai số hoặc thêm danh sách các số. Sau đó, họ có thể xem nó hoạt động bằng cách bước đơn hoặc giữ phím Enter để xem nó chạy "nhanh".

Quan điểm của việc này là đưa ra khái niệm rằng máy tính chỉ có thể thực hiện một số lượng rất nhỏ các hoạt động cơ bản khác nhau và chúng thực hiện chúng cùng một lúc. Điều này là để chống lại ấn tượng họ có rằng máy tính rất phức tạp và họ làm tất cả mọi thứ cùng một lúc và đọc được suy nghĩ của bạn trong cuộc mặc cả.

Từ đó chúng tôi tiếp tục lập trình bằng ngôn ngữ "thực" (BASIC :), bắt đầu với các chương trình rất đơn giản nhưng thú vị, làm việc thông qua các điều kiện, vòng lặp, mảng, tệp, hợp nhất, v.v. Đối tượng là đặt một bộ kỹ năng đầy đủ để họ có thể thực hiện một dự án do chính họ lựa chọn, bởi vì đó là điều duy nhất làm cho việc lập trình trở nên thú vị - việc sử dụng mà bạn có thể đặt nó. Tôi sẽ đưa ra một số ý tưởng cho các dự án, và sau đó họ sẽ lấy nó từ đó. Tôi sẽ yêu cầu các ý tưởng bằng văn bản, và sau đó tiến hành báo cáo, để giữ cho chúng khỏi hoãn lại đến phút cuối cùng và sau đó hoảng loạn. Tôi nghĩ rằng các dự án là phần tốt nhất, bởi vì họ đã học dưới sức mạnh của chính họ.

Cơ sở ban đầu đó là một sự hiểu biết rất cụ thể về những gì máy tính làm cho việc dạy các khái niệm sau này trở nên dễ dàng hơn nhiều, nếu không sẽ là những cú va chạm tốc độ thực sự, như mảng hoặc (trong khóa học sau). Chúng ta có xu hướng tôn vinh khái niệm "trừu tượng" là điều tuyệt vời này, nhưng nó cần được xây dựng trên một nền tảng cụ thể, không phải trên không.


3

Một lập trình viên tự dạy tôi tin rằng hoạt hình là thử thách lớn nhất về mặt nhận biết mã đang làm gì. Khi một chương trình chứa các thuật toán và các phép biến đổi toán học thực hiện các thao tác trừu tượng, cách duy nhất để hiểu toán học đang làm gì tại bất kỳ điểm nào (trừ khi bạn là một thiên tài) đòi hỏi phải hiểu việc thực thi mã.

Sửa tôi nếu ý tưởng ngây thơ của tôi không đúng. Những gì bạn muốn làm là notngăn chặn sinh viên của bạn sử dụng "mẫu thiết kế", nhưng để tìm cách đảm bảo họ hiểu họ là gì của CnP? Sau đó thử thách học sinh của bạn để thao tác một hình ảnh động. Để điều chỉnh đầu ra trong một hình ảnh động, cần phải hiểu những gì đang xảy ra ở mỗi bước. Đối với mối quan tâm đã nêu của bạn, tôi tưởng tượng một dự án hoạt hình được hình thành tốt sẽ biểu hiện theo những cách rõ ràng khi một sinh viên "hiểu được" - khi họ nhận ra một sự biến đổi mà bạn không mong đợi hoặc điều chỉnh một số biến phụ thuộc lẫn nhau có liên quan.

Không biết giới hạn sư phạm và mục tiêu bạn đang làm việc, tôi không thể nói hoạt hình là câu trả lời hoàn chỉnh. Toàn bộ giáo trình hoạt hình bên ngoài nghề hoạt hình là, tôi nên mạo hiểm để đoán, ra khỏi câu hỏi. Một vài dự án có thể không có kết quả ít hơn trong một cái gì đó nghệ thuật và tuyệt vời, điều đó không phải là xấu.

Một lưu ý khác, tôi đã đọc một bài báo (vâng, giấy!) Về một Thế vận hội mã hóa cấp trung học - wot-wot - cạnh tranh cho các lập trình viên trước đại học. Mô tả về những thách thức của họ là sự rõ ràng nhất về mã hóa thuần túy mà tôi có thể nhớ lại đã đọc. Các đối thủ cạnh tranh được đánh giá với nhau và theo tiêu chuẩn thực hành tốt. Đối với các cuộc thi này, sinh viên phải lên kế hoạch cho giải pháp của mình viết mã "mẫu thiết kế" nguyên tố mà vấn đề cần phải hoàn thành trong giới hạn thời gian. Vì vậy, giải pháp cho mối quan tâm của bạn về lập trình CnP là kiểm tra xem các sinh viên có thể viết cùng một "đoạn mã" mà họ là CnP'n không!

Tôi chắc chắn rằng nó đã được đăng trên NY Times. Một tìm kiếm nhanh đã không tìm thấy nó. Một ví dụ tương tự là Cuộc thi lập trình trường đại học quốc tế của ACM. Cuộc thi này nhấn mạnh vào lập trình nhanh chóng: "Lập trình nhanh như chớp trong thi đấu nhóm là một kỹ năng kỳ quặc, không chính xác là một người tìm việc sẽ đặt lên hàng đầu một bản lý lịch." Vì vậy, tôi muốn đề xuất sự trừu tượng từ các vấn đề trong thế giới thực là câu trả lời.

Cũng thế,

Cuộc chiến mã HP


2

Dạy cho lớp sử dụng ngôn ngữ lập trình tốt về mặt kỹ thuật nhưng tối nghĩa đến mức họ sẽ không thể tìm thấy bất kỳ mã hiện có nào để sao chép.


1
Tôi không lo lắng về việc họ sao chép tác phẩm của người khác, nhưng tác phẩm của chính họ hoặc một số đoạn trích mẫu, không thể sử dụng được trong tình huống đã cho.
Aivar

2

Bạn cũng có thể đối xử với họ một cách khó khăn.

Tìm cách để tạo một bản sao-dán có hại cho họ. Tôi không có ví dụ chính xác nhưng nếu bạn tạo ra một bài tập đầu tiên có giải pháp, nếu được dán trong bài tập thứ hai tương tự, sẽ mang đến cho các sinh viên giáo dục hàng hóa trong một lỗi "mất ổn định" hoặc "tham nhũng dữ liệu im lặng" rất dài và đau đớn. Trong khi đó, một suy nghĩ 2 triệu "không sùng bái" sẽ mang lại một giải pháp rõ ràng cho ngay cả học sinh xấu nhất (anh ta đã không nhìn thấy giải pháp tập thể dục đầu tiên). Sau đó, có thể có một số khả năng họ có thể học bài học và suy nghĩ hai lần trước khi sao chép mã dán vào bài tập thứ ba.


1

Tôi nghi ngờ rằng hành vi này là do niềm tin rằng các chương trình là phép thuật - nhiều khả năng đó là sự lười biếng và thiếu động lực.

Vì vậy, tôi nghĩ rằng công việc của bạn với tư cách là một giáo viên là thúc đẩy học sinh của bạn - không học sinh nào thực sự có động lực sẽ cắt và dán một giải pháp (điều đó chỉ dành cho các lập trình viên làm việc với thời hạn và điểm mấu chốt để đáp ứng ...)


Đối với một số học sinh đó, sự lười biếng và / hoặc thời hạn chắc chắn là nguyên nhân. Nhưng một số người đang làm việc rất chăm chỉ ...
Aivar

@Aivar - Là một người hướng dẫn, có lẽ bạn sẽ hiểu biết nhiều hơn về những điểm mạnh và điểm yếu của các sinh viên. Vì tò mò, bạn nghĩ điều gì cản trở những học sinh "làm việc chăm chỉ"?
Leigh

@Leigh - Tôi nghĩ rằng họ đã không đào tạo được phần phân tích trong não của họ đủ và họ đang tiếp cận các bài tập với lực lượng vũ phu - phương pháp làm việc của họ không phải là tìm kiếm toàn diện. Và giải thích cách tiếp cận thay thế cho họ là khó khăn.
Aivar

@Aivar - Có lẽ nên tập trung hơn vào phân tích trong giai đoạn đầu. Ví dụ thiết kế hai phần tập thể dục. Phân đoạn đầu tiên tập trung vào các khối xây dựng của mã. Trong khi thứ hai giải mã, gỡ lỗi và phân tích cùng một ví dụ. tức là đặt câu hỏi "tại sao" và thảo luận về cách cải thiện mã với các mối tương quan trong thế giới thực với các cách tiếp cận khác nhau (lực lượng vũ phu, v.v.). Hoàn thành sớm và thường xuyên sẽ giúp củng cố kiến ​​thức của họ và khuyến khích họ xem lập trình nhiều hơn là chỉ xây dựng cú pháp đúng trong một ngôn ngữ cụ thể.
Leigh

1

Dạy chương trình con. Yêu cầu họ lấy mã mà họ đang lấy từ các bài tập trước và biến nó thành chương trình con. Dạy họ về tài liệu chức năng để giúp họ hiểu chương trình con đang thực sự làm gì.


Điều này không thực sự giải quyết vấn đề.
Pubby

Tôi nghĩ rằng nó làm. Vận chuyển hàng hóa là bao gồm mã không phục vụ mục đích. Nếu họ đang phá mã của họ thành các chương trình con và ghi lại những gì các chương trình con đó làm thì điều này sẽ giúp ích. Phân tích là một phần lớn của học tập và phân tích đòi hỏi phải chia mọi thứ thành nhiều phần.
Tony Topper

1

Làm cho họ làm bài tập trước mặt bạn trong lớp học mà không có truy cập Internet được cung cấp (trường học đã cắt nó, cho phép không sử dụng điện thoại trong lớp học). Ít nhất làm điều này cho các bài kiểm tra. Không có lý do nào cả mà họ nên sử dụng Internet cho các trải nghiệm lập trình cơ bản. Cuốn sách nên là một tài nguyên đủ cho các bài tập giới thiệu. Cho phép sử dụng Internet khi bạn đang ở trong một lớp nâng cao và họ đã học được cách suy nghĩ.


1

Không bao giờ cung cấp cho họ bài tập âm thanh tương tự.

Hoặc, điên rồ hơn, học chúng TDD ngay từ đầu. Nó thúc đẩy việc viết (không sao chép, viết) rất nhiều mã (cụ thể là các bài kiểm tra) thực sự giúp hình thành vấn đề đang được giải quyết.


Kiểm tra viết thường khó hơn viết mã ở nơi đầu tiên. Tôi đề nghị rằng có thể giáo viên viết bài kiểm tra, sau đó đưa chúng cho học sinh chạy theo bài tập của chúng.
TMN

@TMN: Điều đó có thể phản tác dụng. Học sinh sẽ được khuyến khích ngầm thay đổi mã ngẫu nhiên cho đến khi các bài kiểm tra vượt qua.
Goran Jovic

@GoranJovic: Không chắc chắn tôi đồng ý với "khuyến khích ngầm", nhưng tôi nhận ra không có cách nào dễ dàng để phân biệt giữa mã được viết với ý định và mã bị hack với nhau chỉ để vượt qua các bài kiểm tra. Tất nhiên, vấn đề này không chỉ giới hạn ở giới hàn lâm, ...;)
TMN

@TMN: Và bước "một (dễ dàng như nhà phát triển cần) tại một thời điểm" sẽ biến mất.
Herby

Giải pháp: cung cấp một bộ bài kiểm tra tối thiểu mà học sinh có thể sử dụng trong khi viết chương trình của mình, nhưng cảnh báo họ rằng chương trình của họ sẽ được xếp loại dựa trên bộ bài kiểm tra toàn diện hơn nhiều VÀ nó sẽ được chạy theo bài kiểm tra mà học sinh viết.
Barry Brown

1

Một cái gì đó tôi đã thấy rất hữu ích cho những người trong lớp tôi đang viết một dự án nhỏ về họ, về một chủ đề họ có thể tự chọn.

Khi tôi bắt đầu lập trình, điều đó cũng khó với tôi và tôi đã sao chép rất nhiều trong lớp. Sau đó ở nhà, tôi bắt đầu làm những trò chơi nhỏ, vì tôi muốn trở thành một lập trình viên trò chơi, và tôi thấy chúng dễ thực hiện hơn nhiều. Mặc dù chúng khó hơn nhiều so với những thứ chúng ta thấy trong lớp. Chỉ vì nó quan tâm đến tôi.

Một vài người khác trong lớp tôi đã tăng từ 40-50% trong các bài kiểm tra của họ lên 90 - 100%, vì họ đã làm điều tương tự.


1

Khi tôi tham gia khóa học lập trình giới thiệu, người hướng dẫn yêu cầu mọi người viết một thuật toán bằng tiếng Anh và in ra và bật nó trước khi chúng tôi bắt đầu viết mã. Sau đó, chúng tôi sẽ phải đưa ra nhiều nhận xét như Tạo biến, Nhận đầu vào từ người dùng, Thực hiện tính toán, Đầu ra in, v.v. Tôi đã cập bến một vài lần vì không có đủ nhận xét khi tôi nghĩ có nhiều, vì vậy tôi bắt đầu thêm hơn. Điều này buộc tôi phải suy nghĩ về những gì tôi đang làm và viết các giải pháp và tiếp tục dịch qua lại giữa tiếng Anh và Java.

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.