Mengapa CS diajarkan untuk dihafal? [Tutup]

23

Saya telah mengambil Ilmu Penempatan Komputer Lanjutan untuk tahun terakhir ini di sekolah menengah. Tampaknya seolah-olah kita diajarkan untuk menghafal kode dan fungsi saja dan bukan bagaimana menjadi cerdas dan efisien dalam menggunakan dokumentasi dan sejenisnya.

Secara praktis, saya membayangkan banyak (jika tidak semua) pekerjaan pemrograman akan memungkinkan Anda membolak-balik dokumentasi, meninjau kode masa lalu dan kode orang lain, pada dasarnya melakukan apa yang guru saya anggap "selingkuh."

Sementara saya setuju konsep inti sangat penting untuk dihafal (dalam subjek apa pun), tampaknya berlebihan dan tidak praktis bagi saya untuk memberikan ujian pena-dan-kertas untuk kelas CS, terutama ketika secara praktis Anda akan memiliki kompiler, debugger, referensi manual, dan seluruh internet untuk dirujuk dalam situasi kerja di dunia nyata.

Mengapa CS diajarkan berfokus pada menghafal kode dan fungsi yang bertentangan dengan mengajarkan keterampilan yang berguna termasuk bagaimana menggunakan dan menafsirkan dokumentasi, kode sampel, debugger dan semacamnya?

esqew
sumber
34
CS bukan tentang menghafal kode dan fungsi. Di mana Anda belajar CS? Bolehkah saya menyarankan masalah sebenarnya adalah bahwa kursus yang Anda ambil adalah omong kosong?
Andres F.
1
@AndresF. OP dalam Ilmu Komputer Penempatan Lanjutan yang merupakan kursus yang ditawarkan untuk siswa sekolah menengah (sebelum universitas).
3
@GlennNelson Ups! Saya salah membaca itu. Oke, dalam hal ini: esqew : Anda akan lega mengetahui, di tingkat universitas, CS (kebanyakan) bukan tentang menghafal kode. Anda harus membaca banyak hal, meskipun;) Pendidikan CS juga tidak harus tentang mencari pekerjaan (Anda mungkin akan kecewa jika Anda berpikir demikian)
Andres F.
1
Anda harus tahu itu tidak seperti ini di sebagian besar perguruan tinggi. Di sekolah saya, setiap tes ilmu komputer tunggal telah menjadi catatan terbuka / buku terbuka.
Casey Patton
2
Perhatikan bahwa bagian dari jawaban yang paling mungkin adalah CS bukan gelar pemrograman . Jangan berharap untuk belajar pemrograman dari kelas CS. Berharap untuk mempelajari segala macam teori dan konsep yang mendasari yang kebetulan relevan untuk seorang programmer. Dan tentu saja, Anda akan belajar beberapa bahasa pemrograman dan diajarkan sedikit pemrograman dasar, tetapi terutama, pemrograman yang sebenarnya adalah sesuatu yang mereka anggap akan Anda dapatkan sehingga Anda dapat fokus pada semua hal-hal CS , dan bukan sebaliknya. sekitar.
Jalf

Jawaban:

37

Di kelas sekolah menengah, Anda berada di tingkat paling dasar dari jalan Anda menuju penguasaan. Hal-hal yang tercakup di kelas Anda adalah hal-hal yang diharapkan diketahui oleh programmer profesional. Dalam banyak hal, ini mirip dengan mempelajari "tabel waktu" Anda. Tentu saja Anda akan selalu dapat mengambil kalkulator dalam pengaturan "dunia nyata", tetapi menghafal ini tidak hanya meningkatkan kecepatan Anda dalam tugas yang lebih kompleks, tetapi juga mempromosikan pemahaman yang lebih menyeluruh tentang prinsip-prinsip dasar.

Misalnya, Anda harus mengetahui beberapa algoritma penyortiran, cara penerapannya, cara kerjanya, kapan paling baik digunakan, dan kapan tidak menggunakannya. Ini selalu bisa dilihat, tetapi seharusnya tidak harus - lebih dari seorang ahli matematika harus mencari 6 kali 8.

Jeffrey
sumber
9
Anda harus mengetahui sifat dasar dari algoritma pengurutan tetapi sudah sekitar 15 tahun sejak saya memiliki kesempatan untuk menulis apa pun selain semacam gelembung. (Untuk N yang sangat kecil kadang-kadang jawaban yang lebih baik.)
Loren Pechtel
1
Saya berharap bisa mengatakan bahwa semua kelas Ilmu Komputer sebaik itu. Di sekolah menengah saya, mereka mengajar sintaksis dasar java ... Sepanjang tahun. Banyak dari kelas meninggalkan membual menjadi "seorang programmer" ketika mereka bahkan tidak bisa menjelaskan perbedaan antara Bubble sort dan algoritma Dijkstra.
Daniel Gratzer
2
Sebagai contoh, mengingat bahwa Anda dapat mencari kata apa pun di kamus, secara teoritis Anda harus dapat memahami artikel ini dioneone . Tetapi otak kita hanya menangani sejumlah kecil ketidaktahuan bersarang.
Benjol
1
Dan mengejutkan-menghafal tabel waktu saya sama sekali tidak berguna bagi saya sama sekali. Berapa lama waktu yang dihabiskan oleh insinyur perangkat lunak rata-rata untuk mengimplementasikan algoritma penyortiran? Oh, tunggu- mungkin sekitar 0 . Bahkan pada kesempatan yang sangat jauh bahwa jenis yang disediakan lingkungan tidak cukup baik untuk Anda, Anda hanya perlu satu orang untuk menulis algoritma yang lebih tepat- dan dia dapat menggunakan informasi yang tersedia secara sepele tentang sesuatu seperti Wikipedia untuk memilih dan mengimplementasikan algoritma optimal- dan kemudian Anda dapat menggunakannya kembali untuk sisa waktu.
DeadMG
2
@ KangD: Dan menghafal referensi tidak akan membantu sedikit pun. Itu tidak melibatkan merancang apa pun, itu hanya copy paste. Satu-satunya perbedaan antara menjawab dari memori dan menyalin dari Wikipedia adalah bahwa satu disimpan dalam RAM dan satu disimpan di otak Anda. Itu masih copy-paste.
DeadMG
14

Ini sering diajarkan dengan cara ini karena guru umumnya tidak tahu cara lain menguji pemahaman. Perasaan Anda sepenuhnya benar karena tidak ada gunanya diajarkan seperti ini. Cara orang dididik pada umumnya sangat membutuhkan reformasi!

Hidup menjadi lebih baik, setidaknya di UIUC saya telah menemukan bahwa semakin tinggi Anda pergi di kelas CS Anda semakin sedikit ujian berorientasi seperti yang Anda jelaskan dan di sebagian besar kursus saya kami telah diizinkan lembar contekan untuk semua omong kosong bahwa Anda mungkin sudah googled jika Anda benar-benar duduk di depan komputer.

Yang sedang berkata, semakin tinggi saya telah pergi di kelas saya semakin sedikit mereka benar-benar mengajari Anda tentang bahasa atau bagaimana menerapkan sesuatu. Sebenarnya saya hanya punya satu kelas di mana mereka sebenarnya mengajarkan kami apa saja tentang pemrograman, itu sebagian besar konsep matematika abstrak dan kami diharapkan hanya mencari tahu bagian pemrograman sendiri (asalkan mereka selalu senang untuk membantu tetapi ini adalah tidak pernah ada sesuatu dalam ujian).

rudolph9
sumber
2
+1 Amin. Saya biasa mengajar pemrograman di tingkat perguruan tinggi, dan tujuan saya adalah untuk memindahkan siswa secepat mungkin ke titik di mana mereka dapat melakukan proyek unik mereka sendiri. Saya benci ketika guru memperlakukannya sebagai menghafal atau melakukan hal-hal dengan "cara yang benar". Apa yang saya coba lakukan adalah menempatkan keterampilan yang cukup di tempat untuk melepaskan kreativitas siswa sendiri.
Mike Dunlavey
... Saya memiliki siswa yang sangat cerdas dan sangat pandai menghafal. Mereka akan mengambil satu atau dua tes sebelum saya bisa menyampaikan bahwa Anda perlu menulis program untuk belajar pemrograman, bukan menghafal hal-hal.
Mike Dunlavey
Dengar dengar! Ini lucu, tumbuh dewasa aku tidak pernah bagus di sekolah; skor ACT buruk, nilai jelek, dll. Tapi saat diperkenalkan ke CS semuanya masuk akal. Saya benar-benar berjuang di bidang tertentu tetapi saya hanya belajar untuk mengatasi hal-hal yang telah menghambat saya melalui pemahaman konsep yang telah saya pelajari di kelas CS saya.
rudolph9
10

Jangan biarkan sekolah mengganggu pendidikan Anda.

- Mark Twain

Saya seorang Meksiko dan memberi tahu Anda hal ini karena di Meksiko sebenarnya bukan tempat yang baik untuk pendidikan (dalam tingkat apa pun), setidaknya dalam pendidikan publik.

Nah, di tengah karir saya (CS) saya merasa persis sama seperti yang Anda rasakan, jadi saya mulai belajar sendiri dan saya menghabiskan satu tahun belajar algoritma, linux, scripting, bagaimana komputer saya bekerja, sedikit relasional database, html, css, dll (sedikit tentang semua). Dan tentu saja, saya harus melewati kelas *, menurunkan nilai saya * dan lulus satu tahun setelah *, semua untuk belajar.

Setelah tahun itu, saya kembali ke rutinitas "normal", kembali ke kelas reguler, pekerjaan rumah, ujian, dan proyek. Kelas-kelasnya masih membosankan, tidak ada yang baru untuk dipelajari, semuanya sama. Jadi saya memutuskan untuk masuk ke situs kontes pemrograman seperti hakim UVA online , juru kode dan euler proyek , kemudian saya menonton beberapa ceramah di MIT Open Course Ware dan saya masih belajar sendiri, tetapi dengan cara yang berbeda.

Pelajaran: Jangan biarkan hal-hal terjadi, buatlah hal-hal terjadi. Jika Anda tidak puas dengan cara Anda belajar, ubahlah!

* Bukan keputusan paling bijak yang telah saya buat.

razpeitia
sumber
4
"Jangan biarkan hal-hal terjadi, buat hal-hal terjadi", - Jika pernah ada kata-kata untuk hidup, itu adalah itu!
GrandmasterB
+1 untuk kutipan. Saya <hampir tidak perlu membaca sisa jawaban
Chani
3

Itu tergantung pada apa yang Anda coba hafalkan ...

Untuk mempelajari matematika, misalnya, Anda harus terbiasa dengan aljabar dan Anda harus sering menjadi kreatif dalam cara melakukan manipulasi aljabar untuk menyederhanakan persamaan. Tetapi Anda harus mengingat blok-blok bangunan tertentu agar dapat fokus pada potongan-potongan menarik itu. Anda harus, misalnya, hafal tabel perkalian Anda dengan hati dan Anda harus tahu beberapa identitas sehingga Anda bisa mengenali cara memanipulasi persamaan untuk menggunakan identitas itu.

Untuk mempelajari ilmu komputer, Anda juga harus terbiasa dengan struktur dan algoritma data blok bangunan dasar karena Anda perlu menerapkannya pada masalah tingkat yang lebih tinggi. Sangat tidak mungkin bahwa Anda akan pernah, misalnya, menulis implementasi daftar tertaut Anda sendiri di dunia nyata, Anda hanya akan menggunakan yang disediakan oleh perpustakaan Anda. Tetapi mengetahui bagaimana daftar tertaut diterapkan dan bagaimana menerapkan daftar Anda sendiri, Anda akan dapat mempertimbangkan di mana dan apakah akan menggunakan daftar tertaut ketika Anda mulai bekerja pada masalah tingkat yang lebih tinggi. Demikian pula, Anda tidak akan pernah menulis fungsi pencarian biner Anda sendiri tetapi penting untuk memahami cara kerjanya sehingga Anda dapat mempertimbangkan hal-hal seperti di mana database dapat menggunakan indeks dan di mana tidak bisa.

Setelah Anda menghafal beberapa blok bangunan dasar, jauh lebih mudah untuk melakukan hal-hal seperti menafsirkan dokumentasi. Dokumentasi mungkin menunjukkan bahwa daftar sedang digunakan dan berasumsi bahwa pemrogram secara implisit tahu bahwa ini berarti memasukkan adalah O (1) dan pencarian adalah O (n). Blok bangunan juga jauh lebih stabil dari waktu ke waktu - Anda sangat mungkin menggunakan debugger baru setiap beberapa tahun, Anda cenderung menggunakan pencarian biner yang sama sepanjang karier Anda.

Gua Justin
sumber
Di mana dan apakah akan menggunakan daftar tertaut didasarkan pada hal-hal seperti itu kompleksitas untuk berbagai operasi, dan itu kinerja memori. Anda tidak perlu menerapkannya untuk mengetahui hal-hal tersebut. Di mana basis data dapat menggunakan pencarian biner? Untuk kunci yang tahu cara membandingkannya. Yah, itu mudah.
DeadMG
3

"Mengapa CS diajarkan berfokus pada menghafal ... sebagai kebalikan dari mengajarkan keterampilan yang berguna" - Saya pikir Anda terlalu sedikit menghafal. Sama seperti Anda harus berlatih menulis kode, menafsirkan dokumentasi, menggunakan debugger, Anda juga harus berlatih menghafal.

Anda mungkin terkejut betapa efisiennya jadinya jika Anda tidak harus sering-sering pergi ke referensi API atau mencari banyak perintah debugger.

Salah satu hal terbaik yang saya pelajari di sekolah menengah adalah dengan mengamati seorang teman yang tidak pernah membuat catatan apa pun di kelas. Argumennya adalah dia bisa mengingat apa yang penting. Saya mulai melakukan hal yang sama dan berpikir bahwa itu meningkatkan keterampilan menghafal saya yang saya temukan sangat berguna setiap hari bahkan dengan semua referensi API yang tersedia.

DXM
sumber
2
Tidak harus melihat API datang melalui latihan, tidak mengajarkan API sebagai pendidikan formal.
DeadMG
@DeadMG: Mampu mengingat lebih banyak hal datang dengan latihan, sama seperti yang lainnya. Meminta Anda untuk mengingat API tertentu bukanlah tujuan itu sendiri, tetapi sarana untuk melatih kepala Anda untuk menyimpan informasi sehingga Anda tidak perlu sering melihatnya. Dan saya tidak hanya berbicara tentang API, jika saya dapat mengingat satu hal tambahan, itu satu perjalanan lebih sedikit yang perlu saya lakukan ke Google / MSDN / file sumber lain dan dengan latihan ini membuat perbedaan dalam seberapa cepat Anda dapat bekerja .
DXM
Berlatihlah dengan API spesifik itu . Tidak menghafal secara umum. Dan waktu yang dihabiskan dalam pendidikan adalah catatan kaki kecil dibandingkan dengan waktu profesional.
DeadMG
2

Ujian pena dan kertas benar-benar masuk akal jika tujuannya adalah untuk menguji pemahaman yang lengkap tentang subjek yang ada. Saya mengikuti ujian Ilmu Komputer AB hampir satu dekade lalu dan saya setuju dengan metode pena dan kertas.

Anda harus cukup tahu tentang algoritma apa pun yang Anda pelajari di tingkat yang lebih rendah dari Ilmu Komputer untuk dapat menjelaskan bagaimana menulis kode implementasi dalam bahasa target Anda. Siswa juga harus dapat menulis kode dengan tangan dengan sebagian besar sintaks yang benar. Kita semua terkadang melewatkan tanda titik koma atau tanda kurung :). Juga keterampilan debugging dan desain dapat diuji tanpa inferensi dari IDE yang bermanfaat.

Jika seorang siswa tidak dapat melakukan ini, maka mereka tidak memiliki penguasaan topik itu, hanya mungkin suatu keakraban yang lewat.

Peter Smith
sumber
-1: Semua kode tulisan tangan yang benar secara sintaksis memberi tahu Anda bahwa orang tersebut mampu menulis program yang dapat dikompilasi (Mungkin sekitar satu juta kali lebih lambat daripada komputer paling lambat) -yaitu mungkin tidak berfungsi seperti yang dimaksudkan. Lebih buruk lagi, mereka hanya memiliki ingatan yang baik dan mungkin bisa melafalkan Shakespare jika ditanya. Tidak banyak cara untuk menunjukkan keterampilan orang sebagai pengembang.
mattnz
Jawaban ini tidak memberikan alasan untuk pendapat yang disajikan. Mengapa ada yang bisa menulis implementasi untuk algoritma apa pun dalam bahasa favorit mereka?
DeadMG
Intinya bukan bahwa orang ini adalah pengembang yang baik, itu adalah bahwa mereka tahu materi Ilmu Komputer yang diajarkan di kelas mereka. Jika seorang siswa telah diajarkan bagaimana membuat grafik suatu fungsi, maka masuk akal untuk mengharapkan siswa tersebut melakukannya pada suatu ujian. Tes yang baik juga mengalahkan penghafalan dengan mengajukan pertanyaan yang membutuhkan pemahaman konseptual seperti menerapkan semacam gelembung menggunakan beberapa kunci untuk struktur data ini. Saya baru saja menarik diri, atau menjelaskan perbedaan antara pencarian kode ini yang saya berikan kepada Anda dan pencarian biner.
Peter Smith
-2

Dalam pengalaman saya, menghafal datang dengan latihan sederhana dan sama sekali tidak perlu mengajarkannya sama sekali. Lebih penting lagi, pendekatan ini hanya berarti menghafal apa yang sebenarnya perlu Anda ingat dalam apa pun yang Anda lakukan, bukan sekelompok sampah acak yang guru Anda harapkan mungkin Anda butuhkan dan selalu Anda tidak akan mengingatnya. Waktu yang dihabiskan untuk mengingat implementasi beberapa algoritma bisa jauh lebih baik digunakan untuk beberapa penyebab lainnya.

Lagi pula, mengapa Anda perlu berlatih menulis algoritma? Setelah Anda menulis sekali, Anda dapat menggunakannya kembali untuk semua waktu - bahkan pada kesempatan yang sangat jauh bahwa orang lain belum menulis implementasi yang tersedia secara bebas untuk bahasa pilihan Anda dan bahwa lingkungan Anda belum menyediakan seperti itu sebuah algoritma untuk Anda gunakan, yang sepele tidak benar untuk sebagian besar algoritma sederhana seperti pengurutan dan semacamnya. Mempraktikkan sesuatu di tempat yang sangat tidak mungkin Anda harus melakukannya sejak awal dan bahkan jika Anda melakukannya, Anda hanya perlu melakukannya sekali saja? Bukan penggunaan waktu yang berharga.

Hal penting yang perlu diketahui tentang Heapsort bukanlah bagaimana menerapkannya sama sekali. Ini kompleksitas operasi dalam kasus terbaik dan terburuk, dan hal-hal serupa. Tapi, yang mengejutkan, ada tabel berguna-keren di Wikipedia yang akan langsung memberi Anda informasi ini. Jadi sekali lagi, tidak ada gunanya memiliki pengetahuan itu. Ini langsung tersedia untuk Anda kapan pun Anda inginkan dari sekarang hingga akhir waktu tanpa biaya. Jadi mengapa Anda ingin menghafalnya? Tidak ada gunanya.

Dalam pengalaman saya, sama sekali tidak ada alasan untuk meminta siswa untuk menghafal apa pun. Jika Anda mengajukan pertanyaan yang dapat dijawab dari sumber referensi, maka Anda mengajukan pertanyaan di mana dapat menjawabnya tidak memiliki nilai.

DeadMG
sumber
2
Wah, teman-teman, jangan repot-repot menjelaskan downvotes Anda atau sesuatu seperti itu ....
DeadMG
Satu-satunya waktu saya perlu tahu heapsort adalah ketika saya membutuhkan antrian prioritas yang dapat dimodifikasi (heapsort berfungsi dengan baik sebagai antrian prioritas). Mampu mengadaptasi algoritma yang dikenal adalah alasan yang baik untuk mengetahui cara mengimplementasikannya.
David Thornley
@ David: Anda tidak perlu tahu bagaimana heapsort bekerja. Implementasi menggunakan algoritma apa pun akan baik-baik saja.
DeadMG
Tidak dalam kasus khusus itu, itu tidak akan terjadi. Itu harus menangani banyak peristiwa, sering, pada sistem yang sudah terlalu tertekan. Untuk proyek itu, kami membutuhkan efisiensi, dan kami mendapatkannya. Untuk konteks, itu terjadi sekali dalam karir yang agak panjang, dan semua penyortiran saya untuk waktu yang lama adalah hal-hal seperti keluarga SQL ORDER BYdan C ++ std::sort.
David Thornley
@ David: Oleh karena itu, saya sarankan itu hampir tidak sesuatu yang dibutuhkan setiap programmer.
DeadMG