Bagaimana cara saya sepenuhnya belajar Ilmu Komputer? [Tutup]

46

Menjadi programmer yang sepenuhnya otodidak, saya ingin jika saya dapat memperbaiki diri dengan belajar sendiri kursus ilmu komputer yang diajarkan kepada lulusan CS biasa.

Menemukan sumber daya yang berbeda di internet itu mudah, tentu saja ada perlengkapan kursus terbuka MIT , dan ada kursus Coursera dari Stanford dan universitas lain. Ada banyak sumber daya terbuka lainnya yang tersebar di Internet dan beberapa buku bagus yang berulang kali direkomendasikan.

Saya telah belajar banyak, tetapi studi saya sangat terfragmentasi, yang benar-benar mengganggu saya. Saya akan senang jika di suatu tempat, saya dapat menemukan jalan yang harus saya ikuti dan setumpuk yang harus saya batasi, sehingga saya bisa yakin tentang bagian penting apa dari ilmu komputer yang telah saya pelajari, dan kemudian secara sistematis mendekati yang belum saya miliki.

Masalah dengan Wikipedia adalah tidak memberi tahu Anda apa yang penting tetapi bersikeras menjadi referensi lengkap.

Perangkat kursus terbuka MIT untuk ilmu Komputer dan Rekayasa Kelistrikan. memiliki daftar besar kursus juga tidak memberi tahu Anda kursus apa yang penting dan apa opsional sesuai minat / kebutuhan orang. Saya tidak menemukan menyebutkan urutan di mana orang harus mempelajari mata pelajaran yang berbeda.

Yang saya sukai adalah membuat daftar yang bisa saya ikuti, seperti yang dummy ini

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

Seperti yang bisa Anda lihat dengan jelas, saya punya sedikit gagasan tentang mata pelajaran apa sains komputer tertentu.

Akan sangat membantu, bahkan jika seseorang menunjukkan kursus penting dari perlengkapan Kursus MIT (+ mata pelajaran penting yang tidak hadir di MIT OCW) dalam urutan studi yang disarankan.

Saya akan daftar posting yang sudah saya lalui (dan saya tidak mendapatkan apa yang saya cari di sana)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - jawaban teratas mengatakan tidak pantas belajar cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - menunjuk ke MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getting-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming

Optimus
sumber
Sama sekali? Semua hal teoretis yang menyenangkan juga?
Ya, saya benar-benar menyukai hal-hal teoritis yang menyenangkan, saya pikir itu akan meningkatkan pemahaman saya tentang subjek (meskipun itu masalah perdebatan di lingkaran saya). Juga, saya merasa ditinggalkan sendirian ketika teman-teman CS saya berdiskusi tentang hal-hal CS atau saya mengganggu mereka dengan mengajukan terlalu banyak pertanyaan.
Optimus
2
Perhatikan bahwa ada beberapa jenis "pulau" dalam kurikulum tempat segala hal saling terkait. Anda misalnya jarang membutuhkan kalkulus lambda dalam teori grafik. Juga pertimbangkan bahwa mungkin baik untuk memiliki mentor di sekitar - apakah Anda tinggal dekat dengan lembaga pendidikan yang sesuai?
Sebenarnya saya lakukan, dan ramah dengan para profs tetapi saya tidak bisa mengganggu mereka sepanjang waktu. Mereka telah berkontribusi pada banyak pengetahuan terfragmentasi yang saya miliki di tempat pertama.
Optimus
3
Dalam hal ini Anda mungkin dapat mengambil satu atau dua kursus yang dipilih - yang memungkinkan Anda untuk selalu mengganggu para profesional.

Jawaban:

24

Saya telah melihat beberapa materi kuliah dari MIT, dan itu sangat buruk . Mereka memiliki bahan ajar yang membutuhkan VC5, banyak variabel global implisit, melewati warna sebagai "Biru" alih-alih ARGB 32bit, apalagi mengapung 4x [0,1], hal semacam itu. Saya tidak akan mempercayai kurikulum atau kode hanya karena berasal dari universitas ternama.

Gelar CS saya (dari universitas yang masuk 10 besar di UK untuk CS) terdiri dari:

Tahun pertama:

  1. OOP- dasar-dasar super
  2. Sistem Komputer - hal-hal seperti, representasi biner bilangan bulat.
  3. Teori basis data relasional dasar
  4. Matematika untuk geometri 2D dan 3D CS-sederhana.
  5. Sedikit HTML / JS- melengkapi hal-hal pemula
  6. Sedikit PHP yang sama kecilnya.
  7. Sedikit pemrograman fungsional

Tahun kedua:

  1. Masalah hukum dalam hal-hal komputasi seperti, hukum yang berputar di sekitar perlindungan data pengguna
  2. Bahasa pemrograman - hierarki Chomsky dan lexing dibahas
  3. Sistem Operasi, Jaringan, dan Internet - kebanyakan hal seperti memori virtual dan paging, tumpukan IP
  4. Grafik komputer 2D - kebanyakan hanya membuktikan teorema matematika yang mendasarinya
  5. AI- deskripsi dasar jaringan saraf, sistem kepercayaan Bayesian, dll.
  6. Analisis persyaratan - ikhtisar singkat tentang UML, persyaratan fungsional / nonfungsional.
  7. Proyek tim

Tahun ketiga:

  1. Analisis Algoritma - teori kompleksitas, kebanyakan
  2. Implementasi bahasa pemrograman - teknik parsing LL / LR, CFG, dan hal-hal semacam itu.
  3. Manajemen Proyek Perangkat Lunak - lihat model Waterfall / Agile
  4. Komputasi Internasional - Unicode dan kesenangan lokalisasi lainnya
  5. Lanjutan AI- tidak tahu, jujur, dan saya sudah mendapat ujian segera
  6. Grafik komputer 3D - kebanyakan, sekali lagi, hanya membuktikan teorema untuk matriks rotasi dan semacamnya
  7. Sistem Berbasis Agen - kebanyakan tentang agen asinkron yang berkomunikasi, mencapai keputusan kelompok, dll.
  8. Aplikasi Mikroprosesor - pemrosesan sinyal digital
  9. Robotics- mencakup hal-hal seperti visi komputer dan pengambilan keputusan robot pada tingkat tinggi

Seperti yang akan Anda perhatikan, hampir semuanya adalah "dasar" dari sesuatu dan hampir tidak ada yang tercakup dalam kedalaman yang bermanfaat.

Hal-hal yang sebenarnya patut dilakukan, penting:

  1. OOP- dan kemudian beberapa lagi, dan kemudian beberapa lagi
  2. Pemrograman fungsional-juga beberapa lagi. Cobalah untuk memilih bahasa seperti C ++ atau C # di mana Anda tidak perlu mempelajari kembali sintaks dan alat, dll, untuk membahas kedua gaya.
  3. Memori virtual part OS baik untuk diketahui, seperti mode kernel vs mode pengguna. Abaikan segmentasi dan tumpukan IP.
  4. Analisis persyaratan - Harus bermanfaat untuk proyek apa pun
  5. Analisis algoritma-mengetahui kompleksitas algoritmik apa, bagaimana menguranginya, dan kompleksitas apa dari operasi umum adalah penting.
  6. Model manajemen proyek perangkat lunak - banyak toko melakukan Agile dan banyak yang lebih tua masih melakukan model gaya Waterfall.
  7. Komputasi internasional - Unicode sangat penting

Hal-hal yang patut dilakukan, secara opsional:

  1. Pemrograman bahasa - hierarki Chomsky, alat lexing dan parsing. Lewati teori di belakang LL atau LR parser - parser LR dapat menerima hampir semua CFG yang realistis, dan ketika tidak bisa, dokumentasi generator parser Anda akan memberi tahu Anda tentang hal itu.
  2. Grafik 3D. Saya tidak bermaksud "Buktikan ini adalah formula matriks rotasi" buang-buang waktu, maksud saya sebenarnya "Ini adalah vertex shader" barang, atau GPGPU. Itu menyenangkan, menarik, dan berbeda.
  3. Beberapa hal AI adalah bidang potensial yang menyenangkan dan merintis jalan.

Hal-hal yang penting tetapi saya toh tidak menutupinya:

  1. Concurrency - suatu yang harus diketahui, setidaknya dasar-dasarnya, untuk siapa saja pada tahun 2012.

Sisanya adalah buang-buang waktu. Sayangnya, sebagian besar dari sembilan poin ini saya sudah tahu, atau mengambil bagian yang berguna di tempat lain. Jika Anda membaca tentang hal-hal seperti masalah FizzBuzz dengan cepat menjadi jelas bahwa Anda sebenarnya tidak perlu tahu terlalu banyak untuk berada di atas paket-yang beruntung, karena gelar saya dan banyak materi yang saya lihat online untuk gelar lain benar-benar tidak banyak mengajar sama sekali.

DeadMG
sumber
3
@ ThorbjørnRavnAndersen: Teori adalah alat untuk menulis kode, tidak lebih. Sebuah teori tidak bernilai apa-apa jika Anda tidak dapat menggunakannya untuk membuat kode yang lebih baik.
DeadMG
3
@Optimus: Sebagian besar dari semua teori tidak dapat membantu Anda membuat kode yang lebih baik.
DeadMG
3
Teori adalah dasar untuk mengetahui kode apa yang bisa ditulis, dan apa yang tidak.
17
Ada beberapa saran yang sangat bagus dalam posting ini, tetapi Anda terlalu dogmatis tentang menyatakan beberapa bidang hanya membuang waktu. Ada banyak variasi dalam pekerjaan pemrograman hari ini, dan apa yang membuang-buang waktu untuk satu pekerjaan mungkin penting untuk pekerjaan lain. Daripada hanya mengabaikan sesuatu sebagai buang-buang waktu, akan sangat membantu untuk menggambarkan jenis perkembangan yang telah Anda lakukan.
Charles E. Grant
4
Saya telah melakukan banyak wawancara selama beberapa tahun terakhir, dan sepertinya kesenjangan terbesar saat ini di perguruan tinggi adalah dalam pengajaran struktur data dan algoritma. Kesenjangan terbesar kedua adalah dalam memahami bagaimana alat diimplementasikan secara internal. Menurut pendapat saya, kelas dalam menggunakan alat tertentu adalah buang-buang waktu. Tidak banyak gunanya mengetahui sintaks C ++ jika Anda tidak bisa menjelaskan kapan harus menggunakan tabel hash dan kapan harus menggunakan pohon.
Gort the Robot
5

Open Course ware hanyalah daftar kursus yang telah mereka sediakan. Jika Anda ingin tahu apa yang akan diambil seorang siswa, mampir ke situs web MIT (non OCW) dan lihat program yang sebenarnya. Mereka memiliki daftar apa yang diperlukan dan apa yang dianggap sebagai prereq untuk apa. Ini halaman mereka.

stonemetal
sumber
Saya mencari di dalamnya, tetapi saya menemukan persyaratan mereka cukup singkat. dan di mana daftar panjang kursus?
Optimus
1
web.mit.edu/catalog/degre.engin.ch6.html Adalah daftar besar. CS disebut sebagai 6.3
stonemetal
terima kasih, ini juga akan sangat membantu, bagus untuk mengetahui kurikulum apa yang diikuti oleh universitas besar
Optimus
1
Saya sedang melakukan EECS di Berkeley sekarang. Jika program MIT EECS terstruktur seperti Berkeley, maka Anda tidak akan mendapatkan banyak panduan di sana: kami memiliki urutan pengantar singkat dan kemudian secara harfiah melakukan apa pun yang Anda inginkan dalam urutan apa pun yang Anda inginkan selama Anda melakukan jumlah minimum tingkat lanjut kursus. Saya pikir itu luar biasa, tetapi mungkin tidak akan membantu Anda mencari tahu kursus mana yang harus diambil: Saya harus membuat keputusan sendiri. (Saya mendapat bantuan dari penasihat fakultas saya, tetapi secara kebetulan sarannya adalah mengikuti seminar pascasarjananya :)).
Tikhon Jelvis
@TikhonJelvis Lebih mudah untuk membuat pilihan tentang apa yang ingin Anda pelajari dan apa yang tidak ingin Anda pelajari, begitu Anda memiliki gagasan tentang apa ruang lingkup bidang itu dan ruang lingkup apa yang paling tidak harus dicakup. Saya, sebagai lulusan Teknik Sipil, memiliki sedikit gagasan tentang apa yang terjadi dalam Ilmu Komputer dan Engg. Lapangan
Optimus
5

Coba rekomendasi kurikulum Ilmu Komputer 2001 dari ACM / IEEE, ditautkan di sini: http://www.acm.org/education/curricula-recomendations

bersama dengan pembaruan CS 2008.

Halaman 17 dari laporan tahun 2001 memiliki bagan praktis yang menggarisbawahi semua "inti" pengetahuan dan masih daftar pilihan.

Suatu program sarjana tidak akan memiliki waktu untuk mencakup bahkan mata kuliah yang dianggap inti oleh rekomendasi ini, sehingga mereka akan menyatukan beberapa kategori bersama dan membiarkan siswa memilih di antara mereka (misalnya, Sistem Operasi, Bahasa Pemrograman, dan Rekayasa Perangkat Lunak digabungkan ke dalam Perangkat lunak, dan siswa memilih jalur).

Anda dapat menemukan kursus yang diperlukan di situs web departemen CS untuk hampir semua sekolah, dan mereka harusnya memiliki beberapa versi.

Ruan Caiman
sumber
bagus, sedikit ketinggalan zaman, tetapi masih banyak mata pelajaran yang tersisa untuk pilihan dalam kurikulum normal dianggap inti di sini, itu baik untuk memiliki pilihan studi yang lebih luas tersedia jika Anda kehabisan hal-hal yang Anda punya antri +1.
Optimus
Untuk yang malas, daftar itu berisi: Dasar Pemrograman Discrete Structures (DS) (PF) Algoritma dan Kompleksitas (AL) Arsitektur dan Organisasi (AR) Sistem Operasi (OS) Net-Centric Computing (NC) Bahasa Pemrograman (PL) Bahasa Pemrograman (PL) Manusia-Komputer Interaksi (HC) Grafik dan Komputasi Visual (GV) Sistem Cerdas (IS) Manajemen Informasi (IM) Masalah Sosial dan Profesional (SP) Rekayasa Perangkat Lunak (SE) Ilmu Komputasi dan Metode Numerik (CN).
Damien Roche
-4

Jika saya boleh, saya ingin menyarankan bergabung dengan github.com sebagai bagian dari proses belajar Anda.

Kemudian Anda dapat mencari-cari kode yang memiliki beberapa aplikasi dunia nyata yang Anda minati, mengkloningnya sendiri, bekerja dengannya, kode itu, dan mengenalinya, dan akhirnya mulai mengirimkan tambalan kembali ke proyek sumber , dan selanjutnya, kerjakan proyek sumber terbuka yang Anda minati.

Dan, tentu saja, Anda akan terbiasa dengan git, yang lebih baik.

Kzqai
sumber
5
-1: Meskipun berharga, itu tidak memaparkannya pada aspek teoritis dalam ilmu komputer yang perlu dia ketahui.
Ken Bloom
pernah di sana melakukan itu, kami juga memiliki repo git pribadi, Berkeliaran di github memang membuat Anda seorang programmer yang lebih baik
Optimus