Mengajar siswa yang berjuang dengan dasar-dasar dalam C ++ [ditutup]

26

Saya mengajari beberapa siswa yang mengalami kesulitan signifikan mempelajari dasar-dasar bahasa pemrograman pertama mereka: C ++. Saya telah mengenal banyak siswa yang luar biasa dan cerdas yang gagal atau gagal dalam kursus CS pertama mereka. Setiap orang yang saya bimbing memberikan kisah yang sama tentang pengalamannya di kelas: instruktur bergerak terlalu cepat, tidak ada dalam kuliah yang masuk akal, dkk. Sebelum kelas CS ini, sebagian besar siswa yang berjuang ini tidak menyatakan minat pada komputer sebagai sesuatu yang lebih dari pengolah kata, browser web, atau bentuk hiburan lainnya. Komputer adalah kotak hitam yang berfungsi, jadi mengapa harus mengacaukannya?

Dugaan terbaik saya adalah bahwa mereka mengalami kesulitan menghubungkan abstraksi ilmu komputer dengan konsep yang sudah dikenal. Dengan kata lain, siswa ini mungkin tahu cara belajar matematika, biologi, atau fisika, tetapi teknik-teknik itu tidak berfungsi ketika menyangkut pemrograman.

Adakah yang punya saran atau saran? Para siswa yang saya bantu tidak layak untuk gagal di kelas ini. Jelas bahwa instruktur tidak mempertimbangkan gaya belajar para siswa ini. Artinya, instruktur gagal bukan muridnya.

AdmCrunch
sumber
2
Komentator: jika Anda memiliki jawaban, biarkan itu sebagai jawaban: jangan tinggalkan itu sebagai komentar. Jika jawaban Anda telah ditambahkan, pilih itu. Jika Anda ingin mendiskusikan topik pertanyaan ini dengan orang lain, gunakan obrolan .
1
Tidak? Dari pengalaman saya ada cukup banyak orang yang memprogram dan tidak boleh ...

Jawaban:

42

Ada beberapa hal yang secara praktis diperjuangkan oleh setiap pemula. Siswa perlu tahu cara membaca kode sebelum mereka dapat belajar cara menulis kode.

  • Sifat berurutan dari bahasa imperatif. Orang-orang kesulitan memahami bahwa fungsi dijalankan secara berurutan, satu per satu, seperti resep. Salah satu cara untuk mengatasinya adalah dengan memperlihatkan beberapa kode yang bekerja melalui debugger.
  • Operator penugasan ( =) dalam bahasa gaya-C sangat menyesatkan. Anda perlu menjelaskan dengan sangat hati-hati yang a = 5berarti "menetapkan 5 ke variabel a, bukan " a sama dengan 5 ".
  • Untuk pemula, aman untuk menggambarkan fungsi sebagai blok kode terstruktur yang dapat dilompati oleh fungsi lain. Juga, pemula mengalami kesulitan memahami bahwa dalam C ++, argumen fungsi diidentifikasi berdasarkan urutan, bukan dengan nama.
  • Sebagian besar bahasa pemrograman imperatif memiliki beberapa komponen deklaratif dan beberapa komponen prosedural, dan C ++ tidak terkecuali. Pastikan siswa memahami bahwa beberapa bagian kode menggambarkan struktur program, dan bagian lain (fungsi) menjelaskan apa yang harus dilakukan program.
  • Melangkah melalui program dengan debugger adalah alat pengajaran yang sangat penting dan sering diabaikan .
  • Ekspresi memiliki tipe . 3+3adalah bilangan bulat, bilangan 3.5 + 3ganda, "3" + "3"(dalam C #) adalah string, x == 5 * 3 + 25boolean (atau bilangan bulat dalam C ++). Luangkan banyak waktu untuk memastikan siswa benar - benar nyaman dengan gagasan ini.
  • Ruang lingkup variabel adalah sesuatu yang pemula bingung sepanjang waktu. Jelaskan kepada siswa bagaimana lingkup bekerja, dan pastikan mereka tahu bahwa yang xdidefinisikan dalam satu lingkup berbeda dari yang xdidefinisikan dalam lingkup lain.
  • Setiap variabel direferensikan setidaknya tiga kali dalam masa hidupnya: deklarasi, penugasan (sering dilakukan pada baris yang sama dengan deklarasi), konsumsi. Jika ada yang hilang, maka ada kesalahan konseptual di suatu tempat. Untuk alasan yang sama, jika Anda menganalisis program kerja, Anda selalu dapat mencari tiga hal ini dalam kode untuk mengetahui tujuan suatu variabel.
  • forloop tidak harus diajarkan sampai contoh iterasi yang memadai menggunakan whileloop diberikan. Sintaksis steno membingungkan, dan membuat siswa bertanya-tanya mengapa mereka tidak bisa menggunakan whileloop. Memiliki lembar contekan yang menjelaskan forloop dalam hal whileloop dapat membantu.
  • Array dan pointer cukup mudah untuk diajarkan, tetapi mimpi buruk untuk dipelajari. Dengan kata lain, sampai klik, latihan itu penting.
  • Gagasan bahwa kode adalah teks dan bahwa program yang dikompilasi sebenarnya sebuah file sulit dipahami oleh beberapa pemula. Pastikan untuk memperlihatkan kepada mereka file .cpp, .h dan binary di shell.

Komponen OOP dari C ++ adalah sepenuhnya binatang buas yang sama sekali berbeda, dan saya agak berharap instruktur tidak sampai di sana - karena OOP paling baik diajarkan menggunakan bahasa yang dirancang dari bawah ke atas menjadi OOP. Dalam pengalaman saya, mengajar OOP melalui C ++ tidak pernah berjalan dengan baik.

Rei Miyasaka
sumber
2
"Orang-orang kesulitan memahami bahwa fungsi dijalankan secara berurutan"? Saya pikir itu hal yang hampir tidak ada yang punya masalah dengan (kecuali, mungkin, orang yang telah belajar beberapa bahasa fungsional sebelum memulai prosedural). Tapi saya setuju tentang semua yang Anda katakan.
leftaroundabout
3
+1 untuk melangkah dengan debugger, sehingga mereka dapat merasakan perbedaan antara program itu sendiri dan pelaksanaannya.
Mike Dunlavey
4
@leftaroundabout Anda akan terkejut. Matematika sebagian besar bersifat deklaratif, sehingga bahasa imperatif dapat membuang siapa pun yang belajar aljabar.
Rei Miyasaka
2
Jawaban ini tampaknya hanya sedikit "mengoceh konsep." Konsep-konsepnya tidak diragukan lagi benar dan tentu saja penting, tetapi mengajar dengan cara ini sedikit seperti mencoba mengajari seseorang cara mengemudi dengan mengoceh tentang aturan jalan.
riwalk
@ Stargazer712 Setiap orang mempelajari aturan jalan sebelum diizinkan untuk mencoba tes jalan. Saya dapat memberikan ide-ide luas seperti "latihan adalah kunci" atau "menjadi kreatif" atau "berpikir secara logis", tetapi hal-hal itu agaknya cukup jelas bagi instruktur mana pun, serta bagi sebagian besar siswa. Orang juga bisa mengajarkan hal-hal abstrak seperti matematika diskrit atau teori bahasa sebagai pendahulu pemrograman, tetapi itu hanya menjadi penting ketika mekanika sangat kompleks sehingga masalah tidak dapat diselesaikan dengan intuisi saja. Cepat atau lambat orang harus berhenti menjadi zen dan mulai mengajarkan konten .
Rei Miyasaka
19

Sudahkah Anda mengajar pemrograman sebelumnya?

Saya mengajar pemrograman untuk jurusan CS dan non-CS selama empat tahun. Semester pertama, pengalaman saya seperti milik Anda, sampai saya belajar beberapa hal.

Apa yang tampaknya sederhana bagi saya sama sekali tidak sederhana bagi para pemula.

Terlepas dari bahasa, Anda perlu menempatkan kerangka mental di tempat - hal-hal yang sangat jelas Anda bahkan tidak menyadari bahwa Anda mengenalnya, seperti:

  • Komputer hanya melakukan satu hal pada satu waktu. (Siapa pun yang mengatakan mereka memiliki paralelisme dan perpipaan, pergi. Kembalilah ketika siswa mengetahui sesuatu.) Komputer hanya dapat melakukan sejumlah kecil hal yang berbeda, dan mereka tidak dapat mulai melakukan satu langkah sampai yang sebelumnya selesai. Saya hanya mengatakan ini, karena komputer tampaknya melakukan begitu banyak hal, dan melakukannya secara instan, sehingga bagi seorang pemula sepertinya mereka melakukan semuanya sekaligus, dan membaca pikiran Anda juga.

  • Variabel itu penting. Sangat penting untuk memahami bahwa nama variabel, dan isinya pada saat dijalankan, adalah dua hal yang sama sekali berbeda. Pemula berjuang dengan ini. Jika saya mengatakan "Tulis program untuk memasukkan nama Anda dan kemudian menyapa Anda", mereka perlu mengetahui bahwa mereka membutuhkan variabel untuk menyimpan nama mereka, dan mereka harus memikirkan nama untuk variabel tersebut, dan mereka tergoda untuk menamai diri mereka sendiri dan bertanya-tanya apa artinya "input".

  • Ada perbedaan besar antara waktu di mana Anda menulis / mengedit program, dan waktu di mana ia dieksekusi. Selama latihan pertama mereka, mereka perlu diingatkan tentang hal ini cukup sering.

Bahasa yang saya gunakan adalah BASIC, karena sangat sederhana untuk pemula. Tidak sulit untuk beralih ke bahasa lain setelah mereka membangun kemampuan pemrograman dasar.

Kami sering menulis program di papan tulis, dan kemudian "bermain komputer". Artinya, letakkan tanda X di sebelah pernyataan saat ini, lakukan secara manual, kemudian pindahkan tanda X ke pernyataan berikutnya. Variabelnya adalah persegi panjang di papan tulis, tempat kami akan menulis konten saat ini. Ketika tugas terjadi, kami akan menghapusnya dan memasukkan nilai baru.

Salah satu trik yang saya kembangkan adalah komputer desimal simulasi, dengan 1000 lokasi memori, masing-masing mampu memegang angka 4 digit. Ada satu set kecil "opcode" seperti memuat akumulator, menambah, menyimpan, melompat, dll. Saya ingin mereka menulis program kecil dalam "bahasa mesin" ini dan kemudian satu langkah untuk melihatnya bekerja. Kemudian nanti, konsep seperti variabel, melompat, dan sebagainya jauh lebih mudah untuk dijelaskan.

Semoga itu bisa membantu.

Mike Dunlavey
sumber
Saya suka ide komputer yang disimulasikan. Apakah Anda memiliki bahasa formal untuk itu, atau Anda hanya mendiskusikan ide-ide dalam pseudocode / bahasa Inggris biasa?
Rei Miyasaka
@ Reei: Saya menulis (dalam BASIC) sebuah simulator bernama Simple. Itu semua antarmuka keyboard. Pengguna bisa memasukkan nilai ke "memori"; kemudian mereka dapat melakukan satu langkah dan memeriksa akumulator dan memori di setiap titik, jika mereka mau. Saya pikir ini sangat penting karena membuat mereka melakukannya , tidak hanya membicarakannya.
Mike Dunlavey
Ahh baiklah. Terima kasih, saya harus mencoba sesuatu seperti itu.
Rei Miyasaka
Ini harus menjadi jawaban # 1 menurut saya.
riwalk
12

Menurut pendapat saya, C ++ adalah tugas berat sebagai bahasa pertama.

Jika saya adalah Anda, dan memiliki waktu yang cukup, saya akan memperkenalkan konsep pemrograman dan CS menggunakan Python (atau serupa).

Ketika konsepnya jelas, yaitu, ketika mereka merasa nyaman dengan struktur data dasar, tipuan, algoritma dasar dll, saya perlahan-lahan memperkenalkan C ++ dan mereka akan dengan cepat dapat menghubungkan dengan apa yang sudah mereka pelajari.

yati sagade
sumber
2
Saya setuju, tetapi para profs biasanya tidak memiliki hak untuk memilih bahasa yang akan diajarkan, apalagi TA.
Rei Miyasaka
4
Saya tidak setuju dengan Python. Saya melewati kelas CS 101 pertama saya di C ++ dan kemudian beralih ke sekolah yang mengajarkan CS 101 dengan Python. Para siswa Python SO bingung bahkan pada dasar-dasar ketika kita semua mengambil kelas CS 201 yang sama ... Tapi semua siswa C ++ unggul.
OghmaOsiris
@OghmaOsiris, Terus terang, saya tidak cukup tahu tentang Python, tetapi mungkin apa yang Anda saksikan hanyalah manifestasi dari bias seleksi sendiri. Lagipula, C ++ menakutkan bagi sebagian siswa (terutama bagi siswa yang paling tidak berpengalaman dalam pemrograman).
Stephan Branczyk
@Oghma Apa kelas 201? Jika itu adalah sesuatu yang tingkat rendah, itu mungkin harus cabang sendiri dengan C sebagai prasyarat.
Rei Miyasaka
1
@OghmaOsiris: Hmmm saya harus tidak setuju, ya tidak juga tidak setuju, berbagi pengalaman berbeda di universitas saya beralih ke python sebagai bahasa pertama telah terbukti sangat membantu sejauh yang saya sadari (yang pertama adalah Java no C ++). Saya tidak berpikir pengalaman individu dianggap sebagai bukti bahwa yang satu lebih baik dari yang lain, itu adalah perang api yang tidak pernah berakhir. Saya mungkin berpendapat bahwa Python mungkin merupakan bahasa pemrograman yang bagus untuk memulai karena itu tidak menghalangi jalan Anda, sebenarnya lebih baik daripada kebanyakan bahasa pemrograman, yang dapat banyak siswa ....
Trufa
4

Inilah yang akan saya sarankan:

  1. Berikan mereka semua detail yang mereka butuhkan untuk mengetahuinya
  2. Dorong mereka untuk mencoba memahami detailnya
  3. Pastikan mereka memiliki detail yang disimpan dalam bentuk ringkas kapan pun mereka membutuhkannya

Pada dasarnya saya akan menyarankan Anda untuk membuat kertas a4 tunggal yang memiliki semua rincian yang diperlukan. Beberapa jenis manual referensi yang memiliki semua detail. Beberapa buku juga dapat membantu, misalnya "Bahasa pemrograman C" - buku sangat membantu karena memiliki semua detail yang diperlukan tersedia dalam bentuk yang ringkas. Kompresi informasi adalah bagian penting dalam menciptakan kertas a4 yang berisi semua detail.

tp1
sumber
3

Pemrograman secara substansial berbeda dari domain umum lainnya yang ditemui siswa. Banyak siswa sebelum kuliah telah berhasil dengan hanya memperhatikan di kelas dan mungkin melakukan beberapa pekerjaan rumah dengan masalah mudah dan jawaban di belakang buku ini. Ini lebih lanjut tentang proses menghafal, lalu menciptakannya. Ini juga pertama kalinya bagi banyak siswa untuk mendapatkan jawaban yang salah berulang kali (kesalahan sintaks, kesalahan logika, kesalahan seg, dll). Ini dapat menguras motivasi siswa ketika mengerjakan program.

Untuk benar-benar tahu apa yang terjadi dengan pemrograman, mereka harus PRAKTEK BANYAK. Teknik yang sering diabaikan adalah meminta mereka menuliskan kode psuedo dalam bahasa apa pun yang menjadi bahasa asli mereka terlebih dahulu. Minta mereka untuk terus mengembangkannya sampai mereka memiliki solusi yang cukup terperinci untuk masalah tersebut. Kemudian masalah menerjemahkannya ke dalam kode nyata.

Peter Smith
sumber
3

Ketika saya masih di perguruan tinggi, saya dulu menjadi tutor untuk kursus pemrograman intro di antara kursus lainnya. Masalah yang Anda gambarkan adalah tidak biasa. Bergantung pada apa peran spesifik Anda, Anda mungkin memiliki pendekatan berbeda yang ingin Anda ambil.

Pertama, jika ini adalah masalah luas yang mempengaruhi bagian penting dari siswa di kelas, jika Anda memiliki akses untuk melakukannya, saya akan mendekati profesor yang mengajar kursus dengan umpan balik spesifik tentang konsep apa yang siswa gagal pahami, sehingga ia atau dia dapat memasukkan tinjauan tambahan atas materi tersebut ketika muncul kembali dalam istilah tersebut, atau meningkatkan kurikulum untuk istilah-istilah masa depan.

Jika Anda mengajar bagian diskusi untuk kursus di samping waktu praktikum Anda, itu akan menjadi saat yang tepat untuk menguraikan hal-hal yang membingungkan dalam perkuliahan dan membantu menjadikannya lebih konkret dan memastikan fundamental semua dipahami.

Jika satu-satunya waktu Anda bekerja dengan siswa-siswa ini adalah selama waktu Anda di lab bimbingan belajar, Anda masih dapat menggunakan waktu ini untuk mengajar para siswa baik satu per satu, atau beberapa sekaligus, blok bangunan konseptual yang mereka butuhkan untuk memahami dan menyelesaikan pekerjaan rumah mereka.

Mereka mungkin merasa sangat tersesat di kelas sehingga mereka bahkan tidak tahu harus berhenti di mana dan bertanya. Jika itu masalahnya, kembali ke dasar dengan mereka. Di mana mereka dalam kursus ketika mereka terakhir mengerti apa yang sedang terjadi? Jika mereka tidak yakin, atau "tidak pernah" mengerti, Anda mungkin harus kembali ke awal untuk menjelaskan hello world, mengajari mereka hal-hal seperti apa variabelnya, bagaimana komputer mengambil daftar "instruksi" mereka dan mencoba untuk lakukan secara berurutan, tetapi komputer tidak se "pintar" seperti kami sehingga Anda harus sangat harfiah dan mengatakan hal-hal yang tepat untuk dipahami komputer, dll.

Itu sebenarnya adalah titik perjuangan dan frustrasi yang sering saya lihat di kursus pemrograman non-jurusan. Siswa menulis beberapa kode. Tampaknya "tentang" benar, tetapi kemudian mereka pergi untuk mengkompilasinya dan itu memberikan kesalahan, kesalahan yang sangat samar. Dan mereka tidak tahu apa yang salah dengan itu. Dan menatap kode mereka selama berjam-jam. Kemudian akhirnya mencari tahu itu adalah sesuatu yang tampaknya sepele, seperti titik koma yang hilang, atau penyangga di tempat yang salah. Kemudian mereka mengkompilasinya lagi, dan masih ada kesalahan, itu sesuatu yang lain. Mereka mengeja nama variabel secara berbeda saat kedua kali menggunakannya. Dan seterusnya. Jadi mereka meminta bantuan teman, tutor, atau seseorang, dan mereka dapat menjawab dengan keras kepala, "oh, tambahkan saja di sana dan nanti akan berhasil." Jadi pengalaman mereka adalah pemrograman sedikit "misterius"

Itu adalah area sebagai tutor, di mana Anda memiliki banyak ruang untuk membantu. Tergantung pada tingkat frustrasi mereka, saya mungkin memiliki pendekatan berbeda untuk membantu mereka mencari tahu mengapa kode mereka tidak berfungsi. Jika mereka mendapatkannya, saya mungkin memberi mereka petunjuk dan mencoba membantu mereka mencari tahu sendiri. Tetapi jika mereka hanya pada ujung tali mereka tentang siap untuk menyerah frustrasi, saya akan sering memberi mereka beberapa jawaban freebie, dan kemudian mencoba untuk setidaknya bertanya kepada mereka pertanyaan seperti "apakah Anda mengerti mengapa perubahan ini memperbaiki program Anda ? "

Untuk beberapa siswa, terutama non-jurusan, mereka mungkin tidak memiliki perhatian metodis terhadap detail yang diperlukan untuk menjadi programmer yang baik atau menikmati pemrograman. Anda dapat menahan mereka melalui strategi untuk membantu mereka memperhatikan detail, dan cukup metodis untuk menyelesaikan masalah bahkan jika itu merupakan tantangan bagi mereka.

Tetapi anal-retention tentang para siswa mengindentifikasi kode mereka "dengan benar" - begitu sering, programmer pemula membuat masalah dengan bersarang dan ruang lingkup karena mereka memiliki kawat gigi yang tidak cocok atau sejenisnya karena mereka tidak memperhatikan apa yang bersarang di bawah apa. Beri mereka daftar periksa "hal-hal untuk memeriksa kapan program Anda tidak dapat dikompilasi", seperti indentasi semua kode dengan benar dan pastikan kawat gigi cocok, pastikan semua garis diakhiri dengan titik koma, terutama di sekitar nomor baris tempat kesalahan pertama muncul Facebook, dll.

Ajari mereka untuk kompilasi lebih awal dan kompilasi sering. Tulis kode kerangka minimum (katakanlah, hello world), kompilasi / tes. Tambahkan beberapa baris, kompilasi lagi. Jauh lebih mudah untuk menemukan kesalahan jika Anda hanya melihat ember kecil perubahan bukan ember besar.

Bantu mereka belajar cara memecah masalah menjadi masalah kecil yang bisa dipecahkan. Ini adalah hal yang sama yang kita lakukan sebagai programmer profesional yang memecahkan masalah yang jauh lebih sulit yang tidak kita ketahui caranya. Anda terus memecahnya menjadi potongan-potongan sampai Anda mendapatkan sesuatu yang Anda tahu bagaimana menyelesaikannya atau dapat melakukan riset untuk belajar bagaimana menyelesaikannya. "Langkah apa yang perlu Anda ambil untuk mendapatkan solusi yang berhasil?" Nah, pertama Anda perlu beberapa kode kerangka (hello world). Apakah Anda tahu bagaimana melakukan hal itu? Ya, bagus, jadi ketika kita selesai berbicara, Anda bisa mulai dengan melakukan itu! Maka perlu membaca file sebagai input. Apakah Anda ingat pernah membaca tentang itu di bab 4? Tidak juga? Mengapa kamu tidak pergi melihat-lihat itu setelah kamu mendapatkan hello world running, dan lihat seberapa jauh kamu bisa mendapatkan itu bekerja dan kemudian panggil aku kembali dan aku Aku akan membantumu lagi ketika kau terjebak pada itu. Beberapa kali pertama Anda mungkin hanya perlu membuat daftar bernomor untuk mereka dari langkah-langkah yang diperlukan untuk menyelesaikan masalah, sehingga mereka dapat belajar dari contoh cara menguraikan masalah.

Jika mereka mendapatkan beberapa tetapi tidak semua materi di kelas, dorong mereka untuk mengajukan pertanyaan di kelas, karena sembilan dari sepuluh, mereka bukan satu-satunya siswa yang tidak mengerti, dan profesor mungkin hanya menyelimuti sesuatu yang penting.

Jika mereka menghabiskan "berjam-jam" menatap satu bug tetapi tidak mengetahuinya, itu buang-buang waktu, mereka tidak belajar banyak dari itu. Seringkali bug adalah masalah wawasan, dan ini masalah dengan wawasan yang tepat untuk menyelesaikannya, dan mereka mungkin tidak memiliki keahlian untuk jenis-jenis masalah tersebut. Sarankan pendekatan umum lain yang harus diambil ketika mereka macet: minta bantuan teman lain di kelas (kenalilah beberapa teman sekelas jika perlu), mulai pekerjaan rumah mereka jauh-jauh hari agar mereka punya waktu untuk berhenti, dan kemudian datang ke laboratorium guru dan ajukan pertanyaan selama jam buka, atau buka jam kantor profesor. Jika mereka terbiasa menjejalkan, yang bekerja dengan baik untuk subjek menghafal, mereka akan membentur dinding frustrasi ketika mereka dihadapkan dengan pemrograman yang lebih tentang pemecahan masalah daripada menghafal. Tunjukkan pada mereka cara mencari contoh sintaks dari buku teks, stackoverflow, dll. Dorong mereka untuk mengirim pertanyaan di forum pertanyaan kelas privat jika ada.

Ajari mereka cara mempersempit tempat kode berhenti bekerja. Komentari hal-hal sampai Anda kembali ke sesuatu yang berjalan, dan kemudian perlahan-lahan tambahkan kembali sampai Anda mendapatkan segfault lagi.

Banyak dari ide-ide ini dapat diubah menjadi handout jika mereka banyak muncul. Strategi biasanya merupakan bagian dari profesor yang menyeleweng - mereka menghabiskan waktu mereka di sintaks, semantik bagaimana menulis loop, array, i / o, dll. Tapi tidak cukup waktu dihabiskan untuk "apa yang saya lakukan ketika saya mencoba untuk menjalankan kode saya dan itu tidak mengkompilasi atau crash pada saya? "

Ketika datang ke hal-hal konseptual, terutama fundamental, seperti "apa itu variabel", atau "apa itu loop?" tidak memahami yang akan mencegah mereka untuk bisa mengikuti sisa kursus. Dalam kursus berbasis kuliah, profesor mungkin tidak punya waktu untuk menjawab setiap pertanyaan atau membantu bola lampu menyala untuk setiap siswa. Dan itulah bagian dari mengapa tutor sangat penting untuk belajar pemrograman. Mereka mungkin memerlukan instruksi individual dengan analogi tambahan untuk membuat topik tertentu menjadi konkret.

Karena Anda mengajar di C ++, saya akan membayangkan kelas muncul sebagai topik abstrak yang beberapa siswa berjuang untuk "dapatkan". Seringkali abstraksi kelas diajarkan dengan contoh-contoh yang berhubungan dengan beberapa objek dunia nyata acak, seperti "mesin ATM", dan analogi dibuat dengan objek dunia nyata. Anda mungkin memiliki variabel untuk melacak berapa banyak uang yang ada di dalamnya, Anda memiliki metode, yang seperti aturan yang memberitahu mesin atm bagaimana menanggapi kondisi tertentu, dll. Kadang-kadang satu analogi adalah yang "melekat" untuk orang tertentu , dan siswa lain memahami yang berbeda dengan lebih baik.

Jika memungkinkan, buatlah gambar untuk mereka. Seperti diagram urutan tentang apa yang terjadi dari waktu ke waktu untuk membantu mereka melihat gambaran besar dari apa yang kode mereka lakukan. Pengguna mengklik tombol ini. Maka program harus merespons dengan melakukan x, y, dan z. Gambar sebuah array seperti sekelompok PO Boxes di kantor pos yang masing-masing dapat menampung hanya satu nomor, dan pointer seperti panah menunjuk ke "alamat" di bagian depan kotak. Dll

Jessica Brown
sumber
2

Dari semua pilihan bagus untuk bahasa pemrograman di luar sana, perguruan tinggi ini menggunakan C ++ sebagai kelas CS intro untuk jurusan non-CS ?? Di tangan instruktur berbakat, itu mungkin bisa dibayangkan - tapi mengapa membuatnya begitu sulit?

Ketika saya belajar "Pascal" di kelas intro-CS kampus saya, kami menghabiskan 3 minggu pertama bekerja dengan " Karel the robot ". Ini adalah lingkungan pemrograman mirip logo kotak pasir yang sangat sederhana di mana semua konsep dasar (termasuk rekursi) dieksplorasi secara menyeluruh sebelum melakukannya di Pascal. Di "Karel robot", Anda mengontrol robot di ruang 2D menggunakan satu set kecil perintah sederhana. Ini memberi siswa landasan konkret yang bermanfaat yang dapat mereka manfaatkan untuk apa yang terjadi selanjutnya.

Mungkin sekarang ada bahasa pemrograman instruksional yang lebih modern yang mengisi peran "Karel the Robot"? Mungkin terlambat bagi siswa Anda sekarang.

Angelo
sumber
Kami memiliki program serupa bernama Alice.
OghmaOsiris
Ini Alice: " en.wikipedia.org/wiki/Alice_(software) "
OghmaOsiris
@OghmaOsiris Tautan Alice rusak. Trailing "ditambahkan ke url.
Zoot
Ya, tanpa itu, akhiran ')' terputus.
OghmaOsiris
2

Selain apa yang dikatakan, saya berasumsi bahwa sebagai pemula mereka hanya perlu menggaruk permukaan, jadi sesuaikan kurikulum Anda sesuai untuk menghindari hal-hal rumit.

0-beri mereka masalah sederhana (katakan mengevaluasi sebuah ekspresi).

1-beri mereka waktu untuk mencari tahu.

2-beri mereka jawabannya.

3-pergi melalui baris jawaban demi baris

4-minta mereka untuk membandingkan jawaban Anda dengan attmpt mereka

5-minta mereka untuk mengambil pelajaran dari masalah ini

6-tambahkan langkah lebih lanjut untuk masalah SAMA, katakan kondisi yang membutuhkan pernyataan IF

7-ulangi tugas di atas pada beberapa masalah. Pada saat itu mereka akan memahami dasar-dasar bahasa dan cara menggunakan lingkungan. Akan siap untuk apa yang terjadi selanjutnya.

Juga,

-Memiliki masalah sederhana bonus bagi mereka untuk mencoba di rumah setiap 2 kelas atau lebih

-mengajak setiap siswa untuk melihat apa gunanya menghentikannya dari melangkah lebih jauh

-Menyediakan bahan referensi yang mudah, lupakan topik yang rumit dan buku yang kompleks

-menerima umpan balik mereka sering dan menggunakannya

-Minta mereka untuk mempersiapkan topik berikutnya sebelum mereka datang ke kelas

Tidak ada kesempatan
sumber
2

Apa yang membantu saya ketika saya melewati CS 101 adalah mempelajari logika bahkan sebelum melihat kode. Kami melewati tabel kebenaran dan kalkulus preposisi hanya supaya kami mulai berpikir "ini benar atau salah" dan bukan "ini sama dengan ini atau itu".

Tepat di situlah semuanya diklik untuk saya. Setelah saya mengetahui bahwa pemrograman pada dasarnya hanya memanipulasi nilai benar / salah pada intinya, maka semuanya menjadi relatif sederhana.

Dan ini membuatnya jadi tidak masalah bahasa apa yang saya gunakan, logika sama di mana-mana. Sintaksis mungkin membingungkan, tetapi saya dapat mengatakan hal-hal seperti "Ok, di Obj CI mengirim pesan ke kelas seperti ini dan dalam pesan C ++ dikirim seperti ini dengan cara lain. Tetapi algoritma tidak berubah sama sekali." dll.

OghmaOsiris
sumber
2

Ada artikel ACM atau IEEE di suatu tempat yang masuk ke beberapa detail mengapa pemula (bahkan lulusan CS mulai di lapangan) perlu duduk di belakang seorang programmer senior dan melihat mereka kode masalah.

Profesional sering berpasangan untuk masalah yang sulit. Siswa terlalu sering disuruh untuk tidak melakukannya. Keuntungan berpasangan (bergiliran di papan ketik): 1. Siswa segera diberi tahu apa yang dia lakukan salah. Umpan balik instan. 2. Ketika pelajar melihat guru, pelajar itu mengambil hal-hal yang tidak pernah terpikirkan oleh guru untuk ditunjukkan.

Alih-alih membiarkan seorang siswa mengembangkan praktik-praktik buruk, mereka malah gagal. (Saya akan membalik # 1 dengan # 2 di sini dan membiarkan siswa menonton Instruktur / TA PERTAMA )

Mengajar CS dengan seperangkat slide powerpoint statis tidak cocok untuk proses temporal penulisan program. (Memang ada trik yang dapat Anda lakukan dengan menumbuhkan fungsi baris demi baris, tetapi biasanya canggung.)

Peserta didik perlu tahu di mana harus mulai menulis, dan di mana harus berhenti dan mengkompilasi. Otak kami sebagian besar ditransfer untuk membaca kiri ke kanan atas ke bawah, tetapi sebuah program seperti keseluruhan memilih buku petualangan Anda sendiri dijejalkan ke dalam satu halaman!

Terlalu sering seorang pemula akan menyalin seluruh program dan kemudian kompilasi. Bahkan seorang profesional mungkin memberikan celah pertama dengan cara itu, sebelum menyadari mereka seharusnya membiarkan semua fungsi kosong, dan menyusun program, kemudian secara iteratif ditambahkan ke dalam kerangka kerja.

Juga, terkait adalah ide konyol bahwa CS harus diajarkan tanpa komputer dan hanya pensil dan kertas. Saya bertanya-tanya berapa banyak profesional pemrograman yang dipekerjakan yang benar-benar berpikir ini adalah cara terbaik, atau apakah itu hanya yang dilakukan oleh instruktur CS karena mereka sendiri tidak suka bekerja dengan komputer? Upaya apa pun untuk menghapus komputer dari gambar adalah usaha yang kejam. Melakukannya membuat pemrograman kurang menyenangkan dan kurang interaktif dari yang seharusnya. Kami sudah lama melewati hari memasukkan data ke kartu punch dan menunggu dengan sabar. Pengembang profesional saat ini adalah penggemar kepuasan instan. Untungnya sebagian besar siswa juga.

Jelas gambar desain yang cantik dengan pensil dan kertas sebelum dan selama proses pengembangan adalah alat yang ampuh untuk programmer profesional dan pemula. Ini seperti waktu "hands on keyboard" juga harus dihabiskan untuk berpasangan! Mungkin di sini mungkin masuk akal untuk membiarkan siswa mencoba ronde pertama sebelum menonton guru, meskipun dengan ini pun mungkin layak untuk melihat proses pemikiran guru yang sebenarnya.

Terakhir, Tombol pintas dan trik pengeditan yang dipekerjakan pengembang profesional bukanlah "gangguan" dalam pembelajaran siswa. Yang paling penting, mereka melibatkan dan menarik minat siswa. Kedua, mereka meningkatkan kesadaran akan kebutuhan pembangunan bersama. Lebih jauh lagi, yang paling mendasar dari praktik-praktik ini seringkali mudah dilakukan tetapi pada awalnya tidak jelas. Seorang siswa toko kayu muda dapat dengan mudah mempelajari cara melepaskan kuku dengan cakar palu, tetapi dalam banyak kasus pertama-tama harus diberitahukan bahwa itulah gunanya cakar itu. Beberapa hal yang sangat mudah dilakukan tidak sepele untuk dipelajari tanpa diajarkan. Bahkan pengembang profesional melupakan "trik" ini sepanjang waktu, dan mendapat manfaat dari alat refactoring seperti penyelamat untuk menghapus kode yang berlebihan atau belum terjangkau, dll.

David
sumber
1
btw, Jika seseorang bisa mengarahkan saya ke judul artikel itu, saya akan menghargainya!
David
2

Pemrograman komputer sering merupakan salah satu kursus pertama di mana keterampilan kognitif sintesis diperlukan untuk tingkat kelulusan. Keterampilan itu sangat sulit untuk diberikan kepada orang lain. Anda dapat menjelaskan semua komponen yang tersedia untuk mereka dan bagaimana cara kerjanya. Anda dapat memberikan banyak contoh tentang bagaimana orang lain menggunakan sintesis untuk menggabungkan komponen-komponen itu menjadi keseluruhan yang lebih bermanfaat, tetapi hanya ada begitu banyak yang dapat Anda lakukan tanpa sesuatu "mengklik" di benak siswa.

Dalam pengalaman saya itu adalah keterampilan sintesis yang paling sering menghindari orang yang tidak "mendapatkan" pemrograman. Mereka memiliki pemahaman yang sempurna tentang bagian-bagian, seperti variabel, fungsi, dan loop, tetapi mereka mengajukan pertanyaan seperti, "Saya mengerti mengapa itu bekerja, tetapi bagaimana Anda tahu Anda perlu membuat lingkaran di sana?" Anda hanya perlu berlatih sampai Anda mendapatkannya.

Karl Bielefeldt
sumber
2

Untuk salah mengutip Aaron Hillegass, ingatkan mereka bahwa mereka tidak bodoh, itu sulit. Pemrograman sulit untuk melatih pikiran Anda, itu cara berpikir lain, dan sementara mereka mungkin berjuang dengan dasar-dasar mereka mungkin cukup sadar mereka dan itu akan membuat mereka cukup sedih.

Saya mengatakan ini sebagai seseorang yang gagal dalam kursus CS tahun pertamanya juga, saya telah banyak memprogram sebelumnya dan mendapatkan semua konsep (VB, ya sayang) tetapi C ++ tidak akan cocok untuk saya. Saya akhirnya kembali ke dasar-dasar dan mengerjakannya dari sana, lalu diklik, tetapi jika seseorang berkata, "Kamu bukan idiot, ini hanya sulit" itu akan membuat hidup saya lebih mudah.

Nicholas Smith
sumber
0

Anda berkata "siswa ini mungkin tahu cara belajar matematika, biologi, atau fisika, tetapi teknik-teknik itu tidak bekerja ketika datang ke pemrograman".

Ada alasan untuk hal ini, pemrograman membutuhkan sesuatu yang tidak perlu dilakukan oleh disiplin lain: kreativitas dan ... fantasi . Kemampuan untuk "membayangkan berbagai hal di tempat kerja". Saya pribadi menemukan persyaratan seperti itu lebih hadir (tentu saja, dengan semua pengecualian karena) berasal dari sekolah teknik (elektronik dan elektromekanik khususnya: mereka harus "membayangkan aliran listrik dan bagaimana mereka saling mengontrol", karena mereka tidak bisa lihat mereka!) daripada dari "ilmu murni" (di mana semuanya tampak seperti membalikkan matematika).

Untuk kasus terakhir ini, "kognisi visual" harus dibantu. Penting untuk tidak hanya berfokus pada gagasan dan teks (tipe -> kompilasi -> melihat kesalahan tidak dapat bekerja jika Anda tidak dapat "membaca" kesalahan) tetapi untuk memberikan cara untuk memvisualisasikan hal-hal, baik pada waktu desain ( dengan mensimulasikan apa yang terjadi pada mesin: bersiaplah dengan papan tulis dan set post-it berwarna) dan pada waktu pelaksanaan.

Agar bagian terakhir ini berhasil, gagasan penting tentang sistem operasi dan "bagaimana program berjalan menjadi mesin" (dan apa sebenarnya mesin itu) harus diberikan. Dan IDE yang tidak mengintimidasi harus diberikan. Saya biasanya "Blok Kode kustom" dengan banyak hal dihapus untuk "jangan mengalihkan perhatian". Gagasan proyek yang dibuat dari sumber untuk menghasilkan objek yang akan dihubungkan dengan perpustakaan harus diberikan SEBELUM mulai berbicara tentang bahasa.

C + + hello world tradisional membutuhkan titik masuk dan perangkat output. Siswa pasti sudah terbiasa dengannya. Keberhasilan kursus semacam ini tergantung pada hari-hari pertama. Anda perlu merangsang visualisasi tentang apa yang terjadi di dalam komputer agar mereka mengerti apa itu pemrograman.
Selebihnya adalah sintaks (sains) dan abstraksi (fantasi)

Emilio Garavaglia
sumber