Mata pelajaran CS yang harus diketahui oleh seorang sarjana [ditutup]

34

Di perguruan tinggi, saya tidak pernah tertarik pada teori. Saya tidak pernah membacanya. Tidak peduli berapa banyak saya mencoba, saya tidak dapat membaca hal-hal dan tidak tahu apa yang sebenarnya terjadi secara praktis. Seperti misalnya, dalam mata kuliah saya tentang teori automata, profesor saya memberi tahu saya segala sesuatu yang mungkin berkaitan dengan aspek matematisnya, tetapi tidak sekali pun dia menyebutkan di mana itu akan digunakan secara praktis. Ini hanya sebuah contoh.

Saya berhasil lulus kuliah dan magang di sebuah perusahaan juga, di mana saya melakukan proyek dan untungnya mereka tidak mengganggu nilai saya, karena mereka di atas rata-rata.

Sekarang, saya tertarik untuk mengetahui mata pelajaran apa yang harus disadari oleh siswa CS secara mutlak dan positif? Subjek yang dapat memiliki relevansi di industri. Ini karena saya punya waktu luang dan itu akan membantu saya lebih baik untuk memiliki pemahaman yang baik tentang mereka.

Apa saran Anda? Seperti untuk satu, algoritma adalah satu subjek.

Karl
sumber
3
Ekspresi reguler didasarkan pada teori automata, dan itu akan membantu Anda jika Anda harus menguraikan apa pun. Saya sudah melakukan dan belajar hal-hal di sekolah yang terbukti tidak relevan dengan pekerjaan yang saya miliki, tetapi itu mengatakan setidaknya sama banyak tentang apa yang saya kerjakan sebagai apa yang saya pelajari. Tidak ada yang saya pelajari tidak akan berguna di lapangan dalam segala situasi.
David Thornley
2
Aku benci bekerja dengan tipemu ... jk (semacam). Jika saya jadi Anda, saya pertama-tama akan meluangkan waktu untuk mengulas hal-hal yang harus Anda ketahui dari sekolah - dengan cara itu Anda tidak akan terlihat seperti orang bodoh pada wawancara berikutnya. Setelah itu saya akan belajar sejumlah besar struktur data dan algoritma yang terlihat seperti mereka dapat digunakan di dunia nyata. Anda harus mencari tahu di mana Anda ingin berada. Jika seorang pengembang game, maka Anda mungkin membutuhkan aljabar linier, grafik 3d, geometri komputasi. Secara umum Anda perlu meninjau data str, alg, database, os dan hal-hal kompiler minimal dan terus belajar.
Ayub
Sulit untuk menyebutkan aplikasi tertentu untuk teori automata dengan cara yang sama sehingga sulit untuk menyebutkan aplikasi tertentu untuk aritmatika. Mungkin berlebihan, tapi tidak terlalu banyak. State diagram seringkali bermanfaat, dan memanipulasinya dalam kode berguna untuk sejumlah tujuan. Pohon keputusan (diperkecil menjadi digraf) adalah contoh yang relatif baru bagi saya, dan saya bahkan perlu menggunakan model negara (dalam bentuk kanonik) sebagai kunci ke dalam wadah. Jika Anda tidak dapat melihat aplikasi dalam aplikasi, pikirkan cara menambahkan lapisan tipuan - pembuatan kode.
Steve314
1
Anda mendapatkan banyak jawaban CS yang bagus di bawah ini, tapi saya pikir dengan membatasi pertanyaan Anda seperti Anda melewatkan beberapa hal paling berguna yang pernah saya lihat dalam 15 tahun sejak saya mendapatkan BSCS saya, apa yang membedakan orang-orang? yang telah bekerja dengan baik di industri: komunikasi kelompok kecil & keterampilan kerja tim. Konyol tampaknya, pergilah ke departemen pidato / bahasa / teater dan ambil kelas seperti "komunikasi kelompok kecil" atau "kepemimpinan / manajemen tim / kelompok". Bahkan jika Anda tidak berencana melakukan manajemen, keterampilan yang Anda ambil di sana akan membuat Anda menjadi insinyur dan anggota tim yang lebih baik.
taksi

Jawaban:

41

Percaya atau tidak, salah satu hal yang ternyata sangat penting bagi saya di kemudian hari adalah Konstruksi Kompiler. Bukan versi namby-pamby modern menggunakan Lex dan Yacc, itu untuk boneka.

Konstruksi kompiler NYATA tempat Anda menulis pemindai simbol dan pengurai Anda sendiri dari bawah ke atas.

Ini adalah sesuatu yang saya pikir tidak akan pernah saya gunakan lagi. Namun pada 20 tahun terakhir saja sudah terbukti bobotnya dalam emas 4 kali lipat. Pernah memerintahkan prosesor yang harus saya tulis, setiap pemindai pesan masuk, setiap pengirim pengguna, setiap penerjemah skrip, telah menggunakan prinsip-prinsip dari kursus itu. Lakukan dengan cara itu dan hidup itu manis, jelas dan sederhana. DAN AKU bahkan memberikan semua info kepada seorang kolega yang belum melakukannya - dia benar-benar harus menulis kompiler untuk mesin abstrak. Yang mungkin saya tambahkan telah menjadi sangat sukses secara komersial.

Jika saya harus naik dan berterima kasih kepada dosen mata kuliah di bidang apa pun, ini dia. Tanpa itu saya akan mendapatkan tetapi solusi saya akan jauh lebih buruk.

(Dan sebelum seseorang melompat dan berkata "baik Anda bisa menggunakan lex dan yacc ..." jawabannya adalah, mungkin - itu tergantung banyak pada sistem. Dalam beberapa kasus bahasa pemrograman bukan C (misalnya PL / M dan Ada), dalam beberapa kasus tidak tersedia Lex atau Yacc yang tersedia untuk platform. Mengetahui dasar-dasar berarti solusi sudah ada, alih-alih meremas-remas tangan mencoba mencari cara menekuk beberapa alat agar sesuai dengan masalah.)

dengan cepat_now
sumber
6
+1 Compiler adalah salah satu kursus favorit saya di uni, dan selalu bermanfaat. Saya jarang menggunakan lex / yacc / bison, secara fundamental penggunaannya jauh lebih konkret.
Orbling
Saya setuju sepenuhnya meskipun untuk alasan yang berbeda. Mengenal cara menulis generator kode - meskipun saya menggunakan Lex dan Yacc - adalah perendaman pertama dan terbaik saya dalam pemrograman berorientasi objek.
Peter Turner
Anda dapat (dan juga JUGA tahu caranya) menulis pembuat kode dalam bahasa C, atau bahasa non-OO lainnya. Kemudian ini merupakan pelajaran dalam menulis potongan kode prosedural yang sangat besar, dan memecah parser / pemindai / pembuatan kode menjadi fase yang masuk akal dan dapat dipahami.
cepat pada
+1 Compiler menggabungkan begitu banyak pola dan prinsip yang memungkinkan Anda melihat desain dan kode dengan cara yang benar-benar berbeda setelah melakukannya.
Andrew T Finnell
2
"Ini adalah sesuatu yang saya pikir tidak akan pernah saya gunakan lagi." Jika saya punya satu dolar untuk setiap kali saya mengatakan itu pada diri saya ketika saya masih muda ....
Nick Spreitzer
37
  1. Struktur / Algoritma Data terutama Grafik. Jumlah situasi dunia nyata di mana saya berhasil menggunakan algoritma yang berhubungan dengan grafik telah mengejutkan saya. Fokus pada mengetahui karakteristik kapan suatu struktur data atau algoritma sesuai. Mampu melihat masalah dan tahu untuk menggunakan pemrograman dinamis / algoritma serakah misalnya penting dan dapat menghemat banyak waktu.

  2. Pengetahuan kerja tentang kompleksitas komputasi. Anda tidak perlu tahu dari atas kepala Anda apa batas bawah dari jenis radix adalah tetapi mengetahui bagaimana mencari tahu apa waktu terburuk menjalankan sesuatu yang Anda tulis adalah penting, terutama untuk proyek-proyek penting kinerja.

  3. Konsep OS. Manajemen memori, Penjadwal, dll. Setiap pengembang benar-benar harus memiliki pemahaman yang kuat tentang sistem operasi mengingat bahwa kode yang Anda tulis terus berinteraksi dengannya.

  4. NetSec. Saya telah menemui sangat sedikit pengembang yang memiliki pemahaman yang kuat tentang masalah keamanan dasar dengan pengembangan (buffer overflows, xss, SQLI, dll). Ini benar-benar suatu keharusan jika Anda ingin sukses dalam industri. Sangat bagus jika Anda dapat menulis hal besar berikutnya tetapi Anda tidak akan memiliki banyak pengguna lama jika Anda tidak mengamankan data mereka.

  5. Pemrograman paradigma. Ketahui karakteristik dan perbedaan antara pemrograman OO / Fungsional / Prosedural. Salah satu kelas sarjana terbaik yang pernah saya miliki adalah menulis 20 penerjemah instruksi sederhana untuk fortan, skema, prolog, dll dalam bahasa itu sendiri. Hanya paparan itu sendiri dapat benar-benar membantu Anda memahami konsep dasar pengembangan perangkat lunak.

Kurtis
sumber
1
+1 Seluruh daftar sangat diperlukan, (4) khususnya sangat penting di era terdistribusi modern.
Orbling
1
+1 pada Struktur Data / Grafik. Jumlah programmer yang saya tahu tidak tahu bagaimana cara menggunakan Hashtable dengan benar atau mengapa Linked List sebagai gantinya adalah array sederhana dalam beberapa kasus mengejutkan saya setiap hari.
Machado
+1 untuk paradigma pemrograman. Pemahaman yang baik tentang kontras antara berbagai jenis bahasa sangat membantu.
apoorv020
19

Memenuhi persyaratan kelulusan belum tentu cukup untuk menjadi ilmuwan komputer terbaik yang Anda bisa. Untuk kurikulum perguruan tinggi yang umum, berikut adalah sepuluh hal utama yang harus Anda pelajari:

  1. Dasar-dasar ekonomi - Kursus pengantar yang mencakup topik-topik seperti pelengkap dan pengganti sangat penting untuk bekerja dalam ekonomi yang lebih besar, atau hanya memahaminya saja. Sementara konsep Giffen Good tidak selalu membantu Anda, mengetahui tentang eksternalitas akan membantu. Mungkin juga membantu Anda menghargai bahwa lebih banyak situasi menang-menang daripada yang mungkin Anda sadari.

  2. Cara menulis bukti - Semua jurusan ilmu komputer harus tahu cara menulis bukti. Dan matematika diskrit, sementara bagian dari sarapan yang seimbang, tidak masuk hitungan. [Induksi hanya satu teknik bukti, dan Anda bisa bertahan tanpa benar-benar mengetahui banyak tentang bukti.] Kursus aljabar atau analisis nyata diperlukan untuk benar-benar menulis bukti. Yang saya maksud dengan aljabar adalah teori kelompok atau aljabar abstrak, bukan mata kuliah yang Anda ambil di sekolah menengah. Untuk manfaat penuh, ambil aljabar dan analisis nyata dalam istilah yang sama.

    Mengapa penulisan bukti penting? Karena itu pemrograman! Pikirkan ketika Anda pertama kali belajar bagaimana memprogram: apakah suatu tugas memerlukan suatuifdan satu putaran, Anda mungkin tidak memiliki intuisi tentang di mana harus menempatkan mereka dalam hubungan satu sama lain. Tetapi sekarang tugas yang sama akan terasa sangat alami. Menulis bukti sangat mirip. Ada serangkaian trik yang Anda pelajari, dan begitu Anda mempelajarinya, segalanya terlihat sangat berbeda.

  3. Cara menulis - Keterampilan komunikasi tertulis sangat penting, baik Anda akan bekerja di industri atau akademisi. Cara terbaik adalah Anda dapat menemukan kursus mekanik, dan bukan kursus menulis yang efektif tentang topik yang berbeda. Artinya, banyak sekolah akan mencoba membuat kursus penulisan lebih relevan atau menarik dengan menjadikannya tentang topik khusus. Cobalah untuk mengikuti versi "membosankan" dari kursus.

  4. Probabilitas dan statistik - Ada beberapa hal yang hanya dapat Anda ambil dengan benar dengan mengikuti kursus. Bersama dengan persyaratan utama CS (yang seharusnya memberi Anda matematika diskrit, variabel tunggal dan banyak variabel, dan aljabar linier) dan aljabar dan / atau analisis nyata, mengambil statistik mungkin akan memberi Anda minor dalam matematika. Mempelajari statistik dapat membantu Anda bekerja dengan ilmuwan lain dalam proyek mereka.

  5. Topik hangat saat ini - Dalam beberapa dekade sebelumnya, mungkin basis data, atau pemrograman berorientasi objek. Hari ini mungkin pemrograman web atau arsitektur berorientasi layanan. Apapun tren saat ini, pastikan untuk mengambil kursus di dalamnya. Kalau hanya untuk melihat apa isengnya.

  6. Masalah penghentian - Sebagian besar masalah tidak dapat diselesaikan oleh mesin. Ini adalah ide yang cukup mendalam bahwa budaya kita telah menyerap dengan sangat baik sehingga tidak lagi terdengar mengejutkan. Hal yang sama berlaku untuk radio, Goedel, dan bom atom; Baru setelah seni postmodern dan perang dingin kita dapat sekali lagi mengatasi konsep-konsep ini. Namun, mengambil kursus dalam teori komputabilitas dapat membuat Anda kembali peka terhadap bukti yang sangat menakjubkan ini.

  7. Pemrograman fungsional murni - Anda kemungkinan besar tidak akan masuk ke pemrograman fungsional murni, kecuali jika Anda melakukan penelitian di dalamnya atau bekerja untuk beberapa perusahaan tertentu, tetapi mengetahui itu akan membantu Anda menjadi programmer yang lebih baik. Alasannya adalah bahwa Anda akan belajar banyak bentuk abstraksi baru, dan konsep-konsep seperti nomor dan kelanjutan Gereja dan monad dan, ya, rekursi, dan alat-alat ini dapat diterapkan pada program Java Anda berikutnya juga.

  8. P dan NP - OK, ini sudah di jalur kritis Anda, tetapi perhatikan juga. Anda ingin memastikan bahwa Anda dapat memperbaiki seseorang ketika mereka salah memanggil NP "non-polinomial." Seolah!

  9. Topik-topik dari kursus yang pasti Anda benci - Ini bisa berupa kursus CS yang Anda temukan terlalu rendah, terlalu teoretis, atau kursus non-CS yang Anda anggap terlalu tidak pantas, terlalu keras, atau terlalu membosankan . Jika kursus seperti ini tampaknya menjadi masalah bagi Anda, dan Anda menemukan diri Anda menjelaskan kepada orang lain mengapa Anda sangat senang Anda tidak perlu mengambil ini dan itu, itu akan memberi tahu Anda bahwa Anda akan belajar banyak. dengan mengikuti kursus! Mungkin Anda tidak akan mempelajari materi kursus, tetapi Anda akan belajar tentang batasan Anda sendiri dan mungkin lebih banyak tentang pembenaran yang Anda buat untuk diri sendiri. [Petunjuk: Mereka biasanya lemah.]

  10. Kursus non-CS yang pasti Anda sukai - Pada akhirnya, Anda harus bersenang-senang. Ini adalah kursus yang mungkin paling tidak Anda dapatkan, tetapi tetap saja lakukan. Lakukan sekali. Jika Anda menyukai banyak kursus, maka itu baik untuk Anda, tetapi pastikan itu tidak menghalangi seluruh program dalam daftar ini.

Pendekatan saya di sini praktis, berdasarkan pada kursus yang benar-benar dapat Anda ambil. Dan saya telah fokus pada tujuan pembelajaran yang mungkin dipelajari. Catatan: Jawaban ini diadaptasi dari posting blog saya di Sepuluh Hal yang Harus Dipelajari Setiap Ilmu Komputer .

Macneil
sumber
Penjelasan untuk downvote akan sangat membantu. Mungkin saya bisa mengubah jawaban saya, dan kemudian Anda bisa berubah pikiran.
Macneil
Profesor, saya tidak akan memilih jawaban Anda, tetapi ada satu hal yang akan saya bahas. Bukti Penulisan: Sampai hari ini saya masih tidak dapat menulis bukti diskrit kecuali Anda meminta saya untuk membuktikan nomor ganjil atau genap. Saya gagal melihat hubungan antara ini dan industri. Mungkin saya melewatkan "Aspek Pemecahan Masalah?". Saya tidak pernah bisa membungkus otak saya dengan Induksi Matematika atau Lemma Pemompaan. Saya tidak berpikir itu memperlambat saya.
Bryan Harrington
Menulis bukti seperti menulis program. Belajar bagaimana membuktikan bahwa * 0 = 0, misalnya, adalah jenis FizzBuzz matematika (yah, mungkin itu sedikit lebih sulit). Pada awalnya terasa menakutkan, tetapi segera Anda mengambil trik-trik kecil, seperti yang Anda lakukan ketika belajar memprogram. Bukti dapat memiliki struktur berbeda yang dapat membantu Anda berpikir secara rekursif dan struktural. Seperti yang saya katakan, kursus matematika diskrit tidak memotongnya untuk belajar bukti nyata. Anda memerlukan teori kelompok atau analisis nyata untuk itu.
Macneil
Sementara pengetahuan tentang pujian tentu saja bermanfaat, saya percaya pengetahuan tentang komplemen lebih relevan dengan ekonomi.
ijw
1
@ijw: Mengenai ekonomi bagi siswa CS, Joel memiliki baik diskusi layak dibaca: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

Setelah berbicara dengan beberapa perwakilan perusahaan dan teman-teman yang memiliki banyak wawancara:

  • Database
  • OOP
  • Algoritma
  • Struktur data

cenderung menjadi "keharusan" untuk karyawan baru (atau seperti yang mereka katakan, kursus "sangat dianjurkan").

Kursus lain yang mungkin berguna adalah keamanan komputer, perakitan, dan arsitektur mesin. Banyak profesor saya telah merekomendasikan kepada saya kursus kompiler juga. Juga, jika Anda punya waktu, saya akan sangat merekomendasikan kursus matematika seperti teori grafik, matematika diskrit, dan kombinatorik. Anda belajar banyak keterampilan penalaran di kelas-kelas yang sebagian besar kursus CS menyelinap, tetapi akhirnya menjadi sangat berguna ketika menulis program yang sangat kompleks.

Semoga itu bisa membantu!

K-RAN
sumber
1
Setuju dengan OOP dan struktur data.
apoorv020
4
Struktur data dasar ... sooooooooooo penting. LEBIH lebih penting, menurutku, daripada OOP. Anda harus dapat berpikir tentang cara menyimpan dan mengatur informasi. Dan jika pada sistem yang disematkan tata letak di-memori dari struktur data Anda adalah benda hidup atau mati.
cepat,
3
+1 untuk kelas matematika. Mereka juga membantu Anda belajar melacak masalah / sistem besar.
Michael K
1
Jaringan juga baik untuk dilakukan.
Keyo
OOP? Anda dapat memprogram di Haskell atau C tanpa OOP ... Saya akan memberi Anda itu banyak digunakan, tapi saya tidak berpikir itu mendasar. Paparan berbagai paradigma, di sisi lain, tampaknya cukup berguna.
Matthieu M.
6

Ini sangat tergantung pada apa yang Anda rencanakan lakukan dengan gelar. Tampaknya sebagian besar jurusan CS berakhir sebagai semacam insinyur perangkat lunak. Dengan pemikiran itu, saya benar-benar tidak yakin mengapa lebih banyak orang tidak hanya mengambil jurusan rekayasa perangkat lunak. Saya menduga bahwa tidak ada cukup program rekayasa perangkat lunak yang tersedia terutama di lembaga-lembaga publik.

Saya berasal dari tanah yang tertanam. Setiap orang yang bekerja dengan saya memiliki gelar EE atau CE dan itu sebagian karena ketika "orang tua" ketika kuliah, tidak ada banyak program CE yang tersedia. Jadi, sangat jelas bahwa jika Anda ingin bekerja di bidang tertanam bahwa latar belakang perangkat keras diinginkan.

Terlepas dari bidang mana Anda ingin bekerja, saya percaya bahwa setiap programmer harus mengambil kursus merakit pemrograman. Anda mungkin tidak pernah menggunakannya, tetapi itu akan mengajarkan dengan tepat apa yang terjadi di tingkat prosesor selama panggilan fungsi, bagaimana interupsi ditangani, bagaimana memori disusun atau bagaimana berbagai mode pengalamatan digunakan. Saya percaya semua hal ini akan membuat Anda menjadi programmer yang lebih baik.

Juga, meskipun mungkin tidak jelas sehingga beberapa di antaranya adalah topik penting ketika mempertimbangkan Struktur Data dan Algoritma untuk platform tertentu.

Pemda
sumber
+1 karena gelar ilmu komputer memberi Anda pengalaman dengan beragam mata pelajaran / teknologi. Pastikan untuk memperhatikan kursus desain perangkat lunak.
Tn. Ant
+1 Untuk perakitan, selalu bijak untuk benar-benar memahami apa yang terjadi di bagian bawah tumpukan. Akan menyenangkan jika semua orang tahu perangkat keras juga, tetapi bagi banyak orang itu akan menjadi langkah terlalu jauh.
Orbling
5

Ada 2 cara untuk menjawab pertanyaan Anda. Biarkan saya mencoba keduanya. Cara pertama adalah untuk melihat hal-hal dari sudut pandang pasar kerja potensial, keterampilan pengkodean dll. Jadi inilah daftar saya:

  1. Struktur data
  2. Analisis Algoritma
  3. Pemrograman berorientasi objek
  4. Entah kursus khusus dalam C ++ atau Java
  5. Sistem operasi
  6. Desain Antarmuka Pengguna
  7. Pemrograman Paralel

Cara kedua adalah melihat sesuatu dari perspektif yang agak abstrak, dan siapa tahu, mungkin juga sedikit filosofis. Daftar berikut ini mungkin tidak memiliki keterampilan terpanas yang diminta pasar kerja, tetapi saya cukup yakin pada saat Anda keluar dari kursus ini, Anda akan memiliki apresiasi yang lebih dalam terhadap seni mengembangkan perangkat lunak.

  1. Teori Bahasa Hingga dan Automata
  2. Konstruksi Penyusun
  3. Teori grafik
  4. Kecerdasan buatan
Fanatic23
sumber
Jangan hanya mendaftar satu set kursus yang menurut Anda penting, berikan alasan dan pengalaman yang mendikte daftar Anda.
2

Saya juga akan menambahkan Rekayasa Perangkat Lunak atau Praktik Desain ke daftar, meskipun konten mereka biasanya diambil oleh siswa di industri.

Juga, menurut saya (tidak didukung oleh banyak pengalaman) perusahaan tidak benar-benar menginginkan sebagian besar hal-hal teoritis yang diajarkan dalam kursus seperti database dll., Mereka ingin orang-orang mengerti dan dapat menggunakan hal-hal ini.

EDIT: Karena downvote, saya merasa ingin menjelaskan jawaban saya. Saya seorang mahasiswa tahun terakhir ilmu komputer, dan pengalaman saya didasarkan pada magang dan wawancara kerja dengan perusahaan-perusahaan terkemuka di lapangan. Dalam pengalaman saya, orang jarang diminta untuk menggunakan algoritma yang rumit atau kode struktur data yang sangat rumit dalam wawancara atau pekerjaan.

Lebih berguna jika Anda dapat membuat dan menggunakan basis data, menggunakan kontrol sumber, tahu cara men-debug dengan benar, tahu cara menggunakan pola desain dll. Namun, seperti yang saya katakan, keterampilan ini biasanya diambil di industri dan tidak tercakup dalam kursus. Rekayasa Perangkat Lunak / Praktik Desain biasanya melibatkan pembangunan proyek menengah, sangat berguna untuk mempelajari semua keterampilan tesis ini.

apoorv020
sumber
Harap berikan lebih banyak detail tentang pengalaman Anda dan mengapa seseorang harus mengikuti kursus tersebut.
@ Mark: Bisakah Anda menjelaskan alasan di balik downvote?
apoorv020
@ apoorv020 tanpa menjelaskan mengapa Anda merekomendasikan Rekayasa Perangkat Lunak atau Praktik Desain, jawaban Anda tidak berguna. Hasil edit Anda masih tidak menjelaskan mengapa Anda merekomendasikannya.
@ apoorv020 satu- satunya nilai penebusan untuk mengambil Rekayasa Perangkat Lunak atau Praktik Desain adalah Anda biasanya membangun proyek menengah (apa pun artinya)? Apa yang Anda pelajari secara pribadi dari mengikuti kursus itu?
Mereka baik untuk diketahui, tetapi ini bukan subjek CS.
Thomas Owens
2

Hal-hal yang saya pelajari di perguruan tinggi yang saya gunakan setiap hari:

  • Metodologi desain berorientasi objek
  • Pola desain
  • Ekspresi reguler
  • Algoritma dan analisis dasar
  • Struktur data

Saya berharap saya mengambil kursus basis data. (Saya telah mengambil cukup untuk bertahan sejak saya lulus, tetapi saya berharap saya tahu lebih banyak.) Saya juga berharap kontrol versi diajarkan - itu ada di mana-mana, sangat berguna, dan sama sekali diabaikan dalam kurikulum sekolah saya.

Saya harus mengikuti beberapa kursus matematika. Saya belum pernah menggunakan kalkulus sejak saya lulus. Saya berharap saya mengambil kursus statistik. (Sekali lagi, saya sudah mengambil cukup banyak untuk lulus sejak lulus, tapi saya berharap saya tahu lebih banyak.)

Di luar departemen CS, ikuti kursus menulis. Keterampilan komunikasi tertulis yang baik sangat penting untuk kesuksesan.

pwc
sumber
+1 Terkejut bahwa basis data tidak wajib dalam kursus Anda, biasanya dianggap sebagai komponen penting.
Orbling
Dulu. Saya keluar dari masalah teknis dan menyesalinya.
pwc
@Orbling: Seringkali departemen kecil (berbeda dengan yang ada di sekolah negeri besar) tidak punya cukup dosen untuk meminta setiap topik utama. Di sekolah saya, misalnya, basis data adalah pilihan.
Macneil
@ Macneil: Pada kursus saya, kursus database primer adalah prasyarat (mencakup semua dasar-dasar: pemodelan ER, bentuk normal, SQL (bukan hanya SQL dasar, gabungan / bersarang, dll), penempatan indeks, dll), yang terakhir, lebih kompleks , kursus basis data adalah pilihan (saya pikir ada tiga total). Saya tidak pernah memilih untuk mengambilnya, karena saya pikir itu adalah hal-hal yang bisa saya serap secara mandiri lebih mudah daripada kursus lain yang akan saya lewatkan. Pikir saya mengambil OR maju sebagai gantinya.
Orbling
@ pwc: Saya bertaruh, apakah Anda ingat mengapa Anda keluar dari itu, yang bertentangan dengan bagaimana?
Orbling
2

Ada banyak kursus penting, tergantung arah mana yang akan Anda tuju. Namun, dengan asumsi Anda dapat memprogram sama sekali, kursus yang paling penting adalah:

  • Struktur dan algoritma data

    Sebenarnya segala sesuatu dalam komputasi kembali ke penanganan data menggunakan algoritma. Berikan perhatian khusus pada array dan hashtable, karena mereka sejauh ini merupakan struktur data yang paling berguna dalam penggunaan umum, tetapi daftar dan pohon dan grafik (well, daftar adalah jenis pohon terbatas, dan pohon adalah jenis grafik terbatas) akan menjadi penting juga. Selain itu, memahami algoritma sangat penting untuk menghasilkan kode yang tidak buruk. (Kalau tidak, Anda akan melakukan hal-hal yang hanya mengerikan, seperti menggunakan algoritma O ( n 3 ) di mana O ( n log n ) akan dilakukan.) Jika gelar CS Anda tidak memiliki kursus wajib DS + A di atasnya, itu bukan CS. Atau rekayasa perangkat lunak. Atau bahkan hanya pemrograman.

Selain itu, kursus yang menurut saya paling berguna selama bertahun-tahun di berbagai bidang adalah:

  • Konkurensi

    Ada banyak aspek konkurensi, tetapi saya berharap pemahaman tentang perbedaan antara memori bersama dan pesan-lewat. Saya juga ingin ada cakupan yang kuat dari strategi penguncian (mutex, semaphores, dll) dan transaksi.

    Ini sangat penting untuk memahami paralelisasi, tentu saja, tetapi juga penting untuk apa pun yang didistribusikan (misalnya, menulis layanan yang terpapar ke internet, meskipun itu adalah single-threaded karena klien akan tetap tidak sinkron). Saya mengerti bahwa ini juga berguna untuk menulis game (yang biasanya multithreaded) dan bekerja dengan perangkat yang disematkan.

Selain itu, saya pikir ini adalah kepentingan terbaik sebagian besar mahasiswa untuk mendapatkan banyak ide berbeda. Banyak bahasa dan paradigma pemrograman. Banyak bidang aplikasi yang berbeda. Jumlah matematika yang masuk akal (sekali lagi, karena sangat berguna) dan juga beberapa paparan faktor manusia dan psikologi (karena setiap perangkat lunak yang berinteraksi dengan pengguna berurusan dengan orang-orang). Bagaimanapun, Anda tidak pernah tahu persis apa yang akan Anda lakukan di masa depan, jadi perencanaan untuk fleksibilitas adalah strategi kehidupan yang hebat.

Donal Fellows
sumber
1

Ketika saya masih kuliah, ada beberapa topik yang tidak bisa saya gunakan dalam kehidupan saya yang sebenarnya dan kadang-kadang intuisi itu terbukti benar (Metode Formal benar-benar hanya praktis untuk masalah sepele dalam banyak kasus) dan di lain waktu telah sepenuhnya salah (notasi Big-O sangat berguna) jadi saya kira secara keseluruhan diri saya yang lebih muda adalah bagian yang benar.

Jika Anda ingin mempersiapkan diri Anda untuk dunia nyata, selain hal-hal yang direkomendasikan oleh K-Ran di atas, saya sarankan membaca Kode Lengkap dan menggunakannya sebagai dasar untuk penelitian yang lebih mendalam mengenai topik apa pun yang Anda rasa sulit atau tidak merasa Anda miliki. cukup tertutup.

glenatron
sumber
Saya kadang-kadang menemukan metode formal bermanfaat, walaupun jelas hanya pada komponen kecil. Saya memikirkan Dijkstra et al. seperti mengatakan sesuatu seperti "Jika Anda ahli matematika yang sempurna, Anda bisa menjadi programmer yang baik."
David Thornley
Saya menduga jika Anda bekerja pada kode yang hidup akan tergantung pada dasarnya Anda harus memiliki pemahaman yang kuat tentang hal ini. Tetapi untuk pekerjaan yang saya lakukan itu tidak pernah perlu. Jika saya memang membutuhkannya sekarang, saya harus kembali dan mempelajari kembali dari awal ...
glenatron
Hal-hal seperti Z hanya benar-benar digunakan untuk perangkat lunak mission-critical dalam organisasi di mana, seperti yang Anda katakan, nyawa berada dalam risiko. Namun, saya pikir belajar mereka menanamkan kesadaran yang jauh lebih besar tentang kebenaran kode dan memberikan kedalaman untuk kembali pada spesifikasi dari semua jenis. Terkadang apa yang Anda pelajari bukan untuk kepentingan sendiri, tetapi membantu memastikan apa yang ada di atas.
Orbling
Anggap saja membuat blok bangunan lebih besar yang solid. Jika Anda telah membuktikan komponen Anda benar (dan mengujinya untuk menemukan kesalahan bodoh yang Anda buat dalam desain dan bukti), Anda memiliki lebih sedikit hal yang perlu dikhawatirkan saat menulis dan debugging.
David Thornley
1

Saya pikir Anda harus mempelajari yang berikut:

Sistem Operasi: - Meskipun Anda mungkin tidak membutuhkannya untuk bekerja sebagai programmer tetapi perlu untuk mengetahui bagaimana sistem operasi bekerja dan diharapkan dari lulusan CS. Buku bagus apa pun bisa membantu.

OOP: - Ini roti dan mentega. Harus. Buku jika Anda ingin bertanya: Buku pertama Anda harus: - kepala OOAD pertama, maka Anda bisa pergi untuk buku Grady Booch dan Ivar Jacobson

Struktur Data dan Algoritma: - Sangat penting untuk mengembangkan pemikiran dan pola pikir logis.

Bagi saya ini sudah cukup. Tidak ada kata terlambat. :)

Abhi
sumber
1

Sebagai seseorang yang mewawancarai kandidat secara rutin untuk pekerjaan pemrograman, dan seseorang yang setelah berada di industri selama 12+ tahun merasa cukup berhasil, saya akan menyarankan yang berikut ini

  • Desain Basis Data & SQL: Sungguh menakjubkan betapa banyak programmer tidak tahu SQL sederhana, dan mereka yang memiliki keterampilan SQL yang baik sangat berharga. Untuk dapat merancang basis data yang baik mungkin tidak berguna di perusahaan yang memiliki struktur basis data yang ditetapkan, untuk pemula dan perusahaan yang sedang mengalami perubahan, itu HARUS!
  • Pola desain. Mereka hanya akan membantu Anda membuat keputusan yang lebih baik tentang desain yang baik
  • OOP: Ini biasanya merupakan pra-req untuk sebagian besar kursus, tetapi ini akan membantu.
  • Algoritma: Karena sangat sedikit orang yang tahu apa itu rekursi, apalagi mengerti kapan itu bisa menyelamatkan mereka dari banyak pengkodean kompleks
  • Struktur Data: Sebagian besar bahasa modern menangani hal ini untuk Anda, tetapi memahami mereka adalah kunci untuk desain yang baik.

Kemudian, beberapa pekerjaan ekstra kurikuler, baca:

  • Buku jenis sertifikasi. Mereka sering mengajarkan Anda di bawah jenis sampul sintaks dan operator. Adalah jauh lebih penting untuk TAHU mengapa Anda melakukan sesuatu, daripada 'karena itu berhasil', yang sudah biasa.
Codemwnci
sumber
1

ITU TERGANTUNG , tidak ada jawaban yang bagus untuk pertanyaan ini.

Programmer adalah dunia umum untuk mengidentifikasi seseorang yang menulis perangkat lunak komputer.

Sekarang, di luar sana ada semua jenis perangkat lunak. Misalnya, menggunakan wikipedia sebagai sumber generalisasi, kami dapat menemui 3 generalisasi hebat :

  • pemrograman sistem
  • perangkat lunak pemrograman
  • aplikasi piranti lunak

Pada bidang pertama, pemrograman sistem mengembangkan driver perangkat, sistem operasi, server, jadi misalnya Anda dapat mengikuti kursus sistem operasi.

tetapi bagaimana dengan pemrograman perangkat lunak ? di sini sebagai wikipedia menulis Anda dapat mengkompilasi kode, debuggers, interpreter, linker, editor teks, sehingga, kursus dalam teori otomatis, teori bahasa, bahasa dan kompiler dapat berguna.

Bukankah kita dapat berbicara tentang perangkat lunak aplikasi dalam bentuk apa pun:
- video game: aljabar, fisika, kursus berorientasi objek?
- perangkat lunak matematika: kursus matematika?
- pengeditan gambar: matematika, fisika, kursus algoritma?
- otomasi industri: matematika, fisika, algoritma, kursus robot?
- Perangkat lunak medis: biologi, medis, kursus apa lagi?
- Banyak hal di sini: banyak kursus di sini.

Seperti yang Anda lihat ada banyak saja yang bisa Anda ikuti dan akan berguna untuk pekerjaan Anda.

Dalam pengalaman saya, saya adalah rekayasa perangkat lunak sistem dan perangkat lunak aplikasi dalam bidang keamanan (Anda ingin mengikuti kursus keamanan?), Mulai dari sedikit pengalaman dalam pemrograman, saya menjadi lebih menarik dalam algoritme dan sistem terdistribusi, dan lagi-lagi saya merasa tidak nyaman dalam kesederhanaan dari aplikasi tujuan umum yang saya tulis (sniffer, sistem deteksi intrusi jaringan, protokol dissector dan detektor, dll).

Seperti yang telah Anda pelajari dengan buruk dalam ilmu komputer teoretis! sudahkah Anda mengikuti kursus ini? : P

Misalnya, Anda telah belajar bahwa semua bahasa komputer dapat dipasang dalam satu set fungsi matematika yang dapat dihitung dan misalnya jika pengalaman Anda mendapatkan jalur yang sama, segera Anda akan merasa tidak nyaman dalam set kecil kalkulus ini dan seperti saya, Anda dapat mulai melihat bagaimana mengembangkan perangkat lunak tidak begitu menarik dan menakjubkan karena POLA DESAIN yang sama kembali lagi dan lagi (sudahkah Anda mengikuti kursus pola desain?) dan misalnya Anda dapat mulai lebih tertarik pada MENGAPA dan BAGAIMANA bahasa dapat diterjemahkan dalam fungsi matematika dan mulai belajar bahwa bahasa komputer tidak terlalu rumit! Anda dapat segera misalnya menjadi lebih terkejut tentang orang dan psikologi, dan Anda bisa mendapatkan lebih banyak minat tentang hal itu dan menjadi manajer proyek yang baik! Sudahkah Anda mengikuti kursus tentang siklus hidup perangkat lunak?

Jadi sekarang, apa kursus HARUS MEMILIKI dalam karir CS Anda?

Saya sarankan untuk belajar sebanyak mungkin yang dapat Anda pelajari di semua bidang, khususnya di bidang teori, karena di bidang pekerjaan umum Anda dapat segera merasa sangat bosan dengan kompleksitas kecil di sekitar Anda, dan menjadi pekerja penuh waktu Anda memiliki waktu yang sangat sedikit untuk belajar bagaimana hal-hal benar-benar bekerja dan lebih banyak waktu untuk melihat bagaimana orang-orang dengan pengetahuan teoretis yang kuat telah memproyeksikan hal-hal untuk bekerja dan memberi Anda kemungkinan kode untuk mendapatkan makanan di rumah.

ada rasa realitas yang salah dalam ilmu komputer. Ilmuwan komputer misalnya kadang-kadang sangat jauh dari pengembang perangkat lunak.

lihat penjelasan wikipedia.

bersenang-senang dengan hidup :)

2 sen saya.

maaf untuk bahasa inggris saya yang benar-benar buruk.

ejekan
sumber
1

Turunkan hal nomor satu yang harus fasih siswa CS adalah bahasa Inggris.

Tanpa pemahaman bahasa Inggris lisan dan tulisan, Anda selamanya akan dirugikan.

Lihat saja segudang pertanyaan yang muncul di situs Stack. Terlalu banyak dari mereka yang sulit diuraikan. Beberapa orang menggunakan campuran l33t, mengirim pesan teks (tidak yakin istilah yang benar). Yang lain membuat pernyataan dan hanya menambahkan tanda tanya sambil kehilangan sedikit pemikiran penting seperti kata kerja atau kata sifat.

Jika Anda tidak dapat berkomunikasi maka Anda tidak akan bisa membuat diri Anda mengerti apalagi memahami apa yang dikatakan orang lain.

Yang lainnya hanyalah detail. Jika Anda dapat berkomunikasi, paling tidak memiliki kecerdasan rata-rata dan dapat memahami apa yang Anda baca maka Anda juga dapat memiliki pemrograman karier yang sukses.

Bukan saya
sumber
1

Saya datang pada ini dari perspektif yang sedikit berbeda dalam bahwa saya tidak lulus di CS, saya lulus di Teknik Elektronik (dengan minor dalam bisnis).

Berdasarkan itu saya pikir daftar hal-hal yang harus Anda pahami relatif singkat karena saya (dan banyak lulusan CS non-lainnya) bertahan hidup bahagia tanpa mengetahui apa pun tentang desain kompiler atau sejenisnya.

Apa yang akan saya katakan saya telah mengambil yang saya temukan berguna:

  • Desain RDBMS - RDBMS berada di belakang sebagian besar sistem dan situs dan Anda harus memahami setidaknya dasar-dasar apa yang sedang terjadi (saya mempelajari ini di tempat kerja).
  • Desain UI Dasar - semua programmer terbaik yang pernah bekerja sama dengan saya dapat menghasilkan aplikasi yang dapat digunakan yang tidak jelek. Kecuali satu tapi dia pengecualian yang membuktikan aturan itu.
  • Beberapa pemrograman dasar - dan maksud saya dasar. Saya belajar beberapa C (untuk pemrosesan gambar dan sistem tertanam), beberapa Bahasa Perakitan (yang saya lupakan dalam beberapa minggu setelah menyelesaikan kursus) dan beberapa Pascal (kursus komputasi dasar adalah standar untuk semua insinyur). Ketika mewawancarai saya terkejut betapa sedikit lulusan CS yang benar-benar dapat memprogram dengan cara apa pun yang dianggap bermanfaat oleh organisasi komersial, jadi saya tidak berharap banyak, tetapi saya berharap mereka tahu dasar-dasarnya.
  • Logika - Saya mempelajarinya melalui elektronik digital, matematikawan melalui teori, lulusan CS melalui pemrograman tetapi bagaimana pun Anda mempelajarinya, Anda harus memiliki pemahaman yang baik tentang hal itu.
  • Keterampilan komunikasi - Saya melakukan beberapa kursus di universitas di luar tingkat saya yang sebenarnya, keterampilan presentasi dan ketegasan. Banyak akal sehat tetapi tidak ada salahnya untuk mengatakan hal-hal yang masuk akal beberapa kali.
  • Dasar-dasar bisnis dan akuntansi. Beberapa programmer bertindak seperti itu tidak masalah tetapi bagi saya itu penting bagi siapa saja yang bekerja di perusahaan - ini adalah cara kerjanya dan itu akan mengendalikan hidup Anda jadi mengapa Anda tidak ingin tahu setidaknya dasar dari bagaimana dan mengapa sesuatu terjadi?

Dan jika Anda mendapatkan kesempatan untuk belajar tentang manajemen proyek sama sekali maka itu benar-benar tidak ada salahnya tetapi itu diajarkan cukup buruk di universitas dalam banyak hal dan itu adalah sesuatu yang Anda akan pelajari sedikit tentang pekerjaan hanya dengan mengerjakan proyek.

Jon Hopkins
sumber
0

Saya juga akan menambahkan beberapa mata kuliah dasar Sumber Daya Manusia / Psikologi.

Ini mungkin tampak seperti tambahan yang aneh, tetapi bagian dari pekerjaan secara profesional adalah belajar bagaimana menjual diri sendiri dan bernegosiasi. Berjalan ke wawancara 'nyata' pertama Anda tanpa pengetahuan yang kuat tentang motivasi drone-HR adalah resep untuk bencana dan kemungkinan berakhir dengan siswa menjadi kacau balau dengan gaji rendah.

Kenali musuh Anda sehingga Anda dapat melindungi diri sendiri.

Peter Bernier
sumber
-1

Tahun 1:

  1. OOP dasar dalam bahasa tingkat tinggi
  2. Struktur data

Tahun ke-2:

  1. Compiler, Anda membangun goresan satu bentuk sederhana
  2. Konkurensi

Tahun ke-3:

  1. Algoritma
  2. Sistem Operasi, Anda menambahkan fungsionalitas dan peningkatan ke yang sederhana
  3. Bahasa formal

Tahun ke 4:

  1. Jaringan
  2. Sistem Terdistribusi
  3. Antarmuka pengguna
  4. Kompiler tingkat lanjut
  5. Sistem Operasi Lanjutan
  6. Kecerdasan buatan
  7. Grafik Komputer

Kursus-kursus tersebut harus menyediakan banyak teori dan praktik pengkodean.

Thierry Lam
sumber
-2

Aneh tidak ada yang menyebut Arsitektur Komputer.

Sorantis
sumber
Saya pikir arsitektur komputer penting untuk diketahui jika Anda ingin memahami dampak dari cache memori, kesalahan halaman, dll.
apoorv020