Konsep apa dalam Ilmu Komputer yang menurut Anda telah membuat Anda menjadi programmer yang lebih baik?
Gelar saya di Teknik Mesin jadi setelah berakhir sebagai programmer, saya agak kurang dalam hal dasar. Ada beberapa konsep Ilmu Komputer standar yang saya pelajari baru-baru ini yang memberi saya pemahaman yang jauh lebih dalam tentang apa yang saya lakukan, khususnya:
Fitur Bahasa
- Pointer & Rekursi (Terima kasih Joel!)
Struktur data
- Daftar Tertaut
- Hashtables
Algoritma
- Jenis Gelembung
Jelas, daftarnya agak pendek saat ini jadi saya berharap saran untuk:
- Konsep apa yang harus saya pahami,
- Sumber daya yang bagus untuk memahaminya dengan benar (karena Wikipedia terkadang bisa sedikit padat dan akademis).
computer-science
Jon Artus
sumber
sumber
Jawaban:
Lihatlah posting blog ini oleh Steve Yegge (sebelumnya dari Amazon, sekarang di Google):
Ini menjelaskan beberapa detail tentang lima konsep terpenting yang harus diketahui oleh pengembang:
sumber
Anda pasti harus memahami Big-O notasi dan Big-O estimasi algoritma - apa itu, bagaimana ia digunakan, mengapa penting, bagaimana Anda membandingkan dua algoritma yang diberikan estimasi Big-O mereka, bagaimana Anda membangun Big-O estimasi untuk algoritma sederhana.
sumber
Saya merasa agak lucu bahwa Anda mencari mata pelajaran ilmu komputer , tetapi menganggap wikipedia terlalu akademis: D
Bagaimanapun, ini dia, tanpa urutan tertentu:
sumber
Beberapa konsep yang membantu perkembangan saya (kecerdasan dan kode):
Ini adalah seluruh domain matematika diskrit, tetapi pengantar yang serius diperlukan untuk Ilmu Komputer:
Meskipun ceramah dan artikel oleh Mark Jason-Dominus sering diarahkan ke peretas Perl, saya pikir setiap programmer akan mendapat manfaat dari presentasi yang jelas dan kode sebenarnya, terutama di Perl Orde Tinggi .
sumber
Saya akan mengatakan saat ini pemahaman tentang Pemrograman Berorientasi Objek adalah suatu keharusan, bahkan jika Anda tidak perlu menggunakannya setiap hari.
Dari sini saya juga akan mengatakan memahami pola yang paling umum juga dapat membantu.
sumber
Saya melihat beberapa konsep CS yang bagus teridentifikasi tetapi sedikit pembicaraan tentang Matematika.
Saya menyarankan agar Anda melihat ke dalam matematika diskrit . Ini memiliki berbagai macam masalah berguna dimulai dengan bukti logis yang membantu Anda menulis kondisi dalam kode. Teori grafik dan kombinatorik juga membantu dalam penyelesaian masalah yang kompleks dan optimisasi algoritma.
Sementara kita berada pada subjek matematika, aljabar linier biasanya merupakan prasyarat untuk kelas grafis komputer tingkat lanjut.
sumber
Matriks Kompetensi Programmer membahas ini secara mendetail, tetapi saya akan menyoroti beberapa:
sumber
Saya menemukan grafik dan beberapa algoritma terapan seperti kedalaman pertama, pencarian nafas pertama, jalur terpendek dll sangat berguna. Orientasi objek juga merupakan konsep yang sangat umum.
sumber
Aturan 1: Perangkat Lunak adalah Penangkap Pengetahuan . Software berarti sesuatu. Jika Anda tidak mengerti artinya, luangkan lebih banyak waktu untuk berbicara dengan pengguna untuk memahami apa yang mereka lakukan.
Algoritma dan Struktur Data adalah dua sisi dari mata uang yang sama. Algoritma bergantung pada struktur data, struktur data bergantung pada algoritma.
Lupakan jenis gelembung secepat mungkin. Sungguh. Semua bahasa modern (Java, Python, dll.) Memiliki kelas koleksi yang menerapkan pengurutan yang lebih baik daripada pengurutan gelembung. Sama sekali tidak ada keadaan di mana Anda harus menggunakan jenis gelembung untuk apa pun. Anda harus mencari kelas koleksi yang menyertakan metode sortir. Lebih baik, Anda harus mencari algoritma yang menghindari penyortiran seluruhnya.
Anda harus mempelajari beberapa bahasa.
Bahasa pemrograman (Java, Python, dll.)
Bahasa kulit.
Bahasa database (SQL)
Bahasa presentasi (HTML dan CSS)
Bahasa representasi data lainnya (XML, JSON)
Anda harus mempelajari beberapa struktur data.
Urutan (daftar, tupel, file)
Hierarki (seperti dokumen XML dan HTML, serta sistem file dasar)
Relasional (seperti database, dan sistem file dengan tautan keras dan lunak dimasukkan)
Peta (atau Indeks atau Array Asosiatif) termasuk Peta Hash dan Peta Pohon
Set
Ditambah beberapa analisis kompleksitas algoritmik. Terkadang disebut "Big O". Mengapa semacam gelembung itu buruk adalah O ( n ^ 2), di mana quicksort adalah O ( n log n ).
sumber
Nah kaleng cacing sudah dibuka sekarang! :)
Saya memulai di bidang Teknik Elektro.
Desain Basis Data Relasional: Melacak data seperti Arnold dalam "Kindergarden Cop".
Ini bisa menjadi kekacauan total. Itu harus dikontrol.
Bagaimana cara menyimpan data Anda, di lokasi paling sedikit, dengan duplikasi informasi paling sedikit. Bagaimana menjaga data Anda tetap ringan, dan mudah diakses. Bagaimana mengontrol pertumbuhan dan integritas data.
Desain Antarmuka Pengguna (UI): Ini adalah bagaimana Pengguna harus mengakses data yang kami lacak.
Sebagian besar UI dirancang oleh pengembang. Jadi, sayangnya sebagian besar UI, paralel dengan desain database. Pengguna sama sekali tidak peduli dengan desain data. Mereka hanya menginginkan apa yang mereka inginkan. Mereka ingin mendapatkannya dengan mudah. Biasanya ini menuntut pemisahan besar dari desain data dan Antarmuka Pengguna. Belajarlah untuk memisahkan "rekayasa" Anda dari "keramahan selatan" Anda.
Pemrograman Berorientasi Objek: Banyak bahasa bermuara pada format ini.
Pemrosesan Paralel - Multi-Threading: Banyak prosesor membuat pekerjaan menjadi cepat!
Komputer paralel telah ada selama beberapa dekade. Mereka sudah ada di desktop kita selama beberapa waktu sekarang. Dengan peristiwa "komputasi awan", pemrosesan paralel besar-besaran tidak hanya wajib tetapi juga lebih disukai. Ini sangat kuat! Ada banyak potensi pekerjaan untuk pengembang paralel.
Memahami Aturan Bisnis: Ini membantu Anda membuat banyak logika Anda, berbasis tabel.
Banyak kondisi IFblock dapat ditempatkan di tabel aturan bisnis. Untuk mengubah logika, cukup ubah informasi dalam tabel. Sedikit / Tidak ada pengodean ulang. Sedikit / Tidak ada kompilasi ulang.
Acara Mengawasi ... Metode melakukan pekerjaan:
Pisahkan hal-hal dalam kode Anda. Ini mempermudah orang lain untuk melakukan pembaruan di masa mendatang. Ini juga agak sejajar dengan kerangka Model / View / Controller (MVC).
PJ
sumber
Bagi saya, saya mendapat banyak dari kursus berikut di universitas
Hal-hal yang saya harap telah saya lakukan di universitas
sumber
LOGIC - Saya hanya melebih-lebihkan pentingnya logika dalam pemrograman. Kamu bilang kamu kuliah di Teknik Mesin jadi kamu harus tahu seberapa banyak matematika bisa membuat hidupmu lebih mudah.
Proposisi Logika , Pertama-Order Logic , Kedua-Order Logic : ini adalah alat yang sangat kuat. Mungkin hal terpenting (dan satu-satunya) yang saya pelajari di universitas. Logika seperti artileri berat seorang programmer - banyak masalah yang sangat kompleks (dan juga yang tidak terlalu rumit) menjadi jauh lebih sederhana setelah Anda memasukkannya ke dalam bentuk yang terorganisir dan logis. Ini seperti Aljabar Linear untuk Insinyur Mekanik.
sumber
Saya pikir pemahaman yang baik tentang cara kerja kompiler adalah baik untuk diketahui. Aho memiliki buku klasik tentang konsep yang digunakan dalam membuat kompiler. Judulnya adalah Penyusun: Prinsip, Teknik, dan Alat. Nama panggilannya adalah Buku Naga. Untuk benar-benar memahami buku itu, Anda harus memiliki pemahaman tentang bahasa formal. Hopcroft memiliki buku bagus tentang itu - Pengantar Teori Automata, Bahasa, dan Komputasi.
sumber
Enkapsulasi
Dalam ilmu komputer, enkapsulasi adalah penyembunyian mekanisme internal dan struktur data dari suatu komponen perangkat lunak di balik antarmuka yang ditentukan, sedemikian rupa sehingga pengguna komponen (perangkat lunak lain) hanya perlu mengetahui apa yang dilakukan komponen tersebut, dan tidak dapat. membuat diri mereka bergantung pada detail cara melakukannya
sumber
Banyak tanggapan yang baik telah disebutkan di sini, tetapi saya ingin menambahkan bagian dari apa yang penting, tetapi sejauh ini belum dibahas.
Setelah 15 tahun pengembangan Perangkat Lunak profesional pasca sarjana, saya mendapati bahwa saya secara teratur menggunakan beberapa konsep berikut dari sekolah:
Jika bahasa / platform Anda tidak mendukung Pengumpulan Sampah, alokasi dan pembersihan memori sangat penting, dan akan ditambahkan ke daftar.
sumber
Saya memilih matematika Diskrit. Ilmu komputer adalah abstraksi. belajar berpikir seperti seorang matematikawan sangat membantu.
Saya juga ingin menambahkan apa yang dikatakan S. Lott tentang bahasa. Mempelajari banyak JENIS bahasa juga penting. Tidak hanya dikompilasi vs scripting. Tetapi fungsional (ML, Lisp, Haskell) logis (Prolog) berorientasi objek (C ++, Java, Smalltalk) imperatif (C, Pascal, FORTRAN bahkan).
Semakin banyak paradigma pemrograman yang Anda ketahui, semakin mudah untuk mengambil bahasa baru saat bahasa baru yang keren datang!
sumber
Beberapa konsep OS
[Buku bagus " Sistem Operasi Modern , 2nd Edition, Andrew S. Tanenbaum"]
Pengetahuan dasar jaringan komputer
[buku bagus oleh Tanenbaum
Konsep OOPS
Autometa terbatas
Sebuah bahasa pemrograman (saya belajar C terlebih dahulu kemudian C ++)
Algoritma (Kompleksitas ruang \ waktu, urutkan, pencarian, pohon, daftar tertaut, tumpukan, antrian)
[buku bagus Pengantar Algoritma ]
sumber
Berusaha keras untuk kopling rendah, kohesi tinggi .
(Saya mencuri gambar ini dari situs web yang ditautkan di atas)
sumber
Cobalah untuk memahami semua level pemrograman. Dari level terendah (perakitan) hingga level tertinggi.
Ambil contoh rekursi yang merupakan fitur yang mudah :) Cobalah belajar assembly dan buat program yang akan menggunakan rekursi dalam assembly.
sumber
Algoritma.
Belajar menggunakan bahasa pemrograman dengan cara yang menurun adalah sesuatu yang dapat Anda pelajari sambil jalan, tetapi hampir tidak mungkin untuk menemukan sendiri semua Algoritma yang banyak digunakan .. Seseorang setidaknya harus menyadari apa yang bisa dan tidak bisa dilakukan dengan beberapa masalah.
Misalnya seseorang tidak bisa menulis beberapa program dengan bubble-sort dan berharap itu dianggap baik, tidak peduli seberapa bagus kodenya.
Singkatnya - lihat Pengantar Algoritma
Tidak perlu menguasainya, ketahuilah apa yang terjadi ...
sumber
Sebagai lulusan baru dari gelar ilmu komputer, saya akan merekomendasikan yang berikut ini:
Seperti disebutkan dalam berbagai tulisan Big O notation
Desain OO
Struktur data & Algoritma (tidak dapat mengingat judul persis buku yang saya gunakan akan diperbarui jika saya ingat)
Sistem Operasi http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580
Masalah NP
sumber
Ini jelas merupakan pemahaman yang baik tentang pemrograman berorientasi Objek, prinsip-prinsip panduan yang baik seperti Prinsip SOLID dan mengikuti pola dan praktik yang sudah ada.
Jika Anda melihat SOA, atau DDD, semuanya pada akhirnya kembali ke beberapa bentuk konsep OOP.
Saya akan merekomendasikan Anda untuk mendapatkan beberapa buku OOP yang bagus dan juga memilih bahasa yang kaya seperti C # atau Java untuk memulai
OOP oleh Grady Booch
(PHP, kawan-kawan ruby tolong jangan meremehkan saya, saya hanya memberikan beberapa contoh untuk memulai, Anda dapat memberikan jawaban dan saran Anda sendiri di sini)
sumber
Struktur dan Interpretasi Program Komputer . Jika Anda memahami buku ini, segala sesuatu yang lain dapat dibangun dengan mudah di atas fondasi itu. Jika Anda memiliki masalah dengan konsep dalam buku, Anda mungkin seorang pengembang perangkat lunak tetapi bukan ilmuwan komputer.
sumber
Saya tidak akan memberi tahu Anda konsep khusus apa pun untuk dipelajari, tetapi sebaliknya akan merekomendasikan agar Anda melakukan banyak bacaan ringan di berbagai topik. Jangan khawatir tentang mendapatkan pemahaman mendalam tentang setiap subjek yang Anda baca - pada titik ini, yang lebih penting adalah Anda dapat mengenali jenis masalah yang Anda cari, sehingga Anda dapat melakukan beberapa hanya- belajar tepat waktu ketika Anda benar-benar dihadapkan pada hal itu. Dengan kata lain, tidak apa-apa jika Anda tidak tahu cara menyelesaikan masalah kombinatorik, selama Anda cukup tahu untuk mencari "kombinatorik" saat Anda perlu melihat berapa banyak cara untuk mengatur sekumpulan objek atau memilih subset .
Wikipedia adalah sumber yang cukup bagus untuk jenis penjelajahan yang luas ini, terutama jika Anda baru saja membaca sekilas. Yang lebih baik, terutama jika Anda menganggap Wikipedia terlalu akademis atau tidak dapat diakses, adalah wiki C2 . (Hal ini, cukup menarik, para wiki asli diciptakan oleh Ward Cunningham).
sumber
Saya pikir penting untuk memahami teori dasar di balik multi-threading, tanpa ini akan sulit untuk melihat bahwa mungkin ada masalah, sampai Anda melakukan debug di server langsung pada jam 4 pada hari Minggu pagi.
Semaphore, bagian & acara penting.
sumber
Tidak, bukan bubble sort, quicksort. Ini adalah rata-rata pengurutan gelembung benda-O besar O (n ^ 2), quicksort adalah O (n * log (n)).
sumber
Saya akan mengatakan di bawah ini adalah hal yang paling penting
Kemudian Pergi ke hal-hal yang berhubungan dengan bahasa tertentu. Saya harap ini membantu !!
sumber
Saya akan mulai dengan kutipan:
Prinsip yang paling penting, IMO, adalah mengetahui banyak paradigma pemrograman, bahasa, dan mengetahui dengan baik tentang alat yang Anda gunakan. Masalah apa pun dapat diselesaikan dalam hampir semua bahasa yang Anda pilih, baik itu bahasa utama yang sangat populer dengan pustaka defaultnya yang besar atau bahasa khusus kecil seperti AutoHotKey. Tugas pertama programmer adalah menentukan apa yang akan digunakan sesuai dengan spesifikasi masalah. Beberapa konsep memberikan pendekatan topik yang lebih baik, apa pun tujuan utama Anda - kecanggihan, kebingungan, kinerja, portabilitas, pemeliharaan, ukuran kode kecil ...
Jika tidak, Anda akan menyelesaikan seperti beberapa programmer yang mati-matian mencoba melakukan sesuatu dalam 1 bahasa yang mereka kuasai, sementara masalahnya bisa jadi sepele untuk dipecahkan dalam konteks pemrograman yang berbeda.
Saran ini sejalan dengan kecenderungan saat ini untuk proyek multi-bahasa (ambil aplikasi web misalnya, yang mungkin melibatkan beberapa bahasa dalam aplikasi tunggal, seperti C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... dan bahkan paradigma pemrograman yang berbeda (misalnya, C # baru-baru ini memperkenalkan beberapa konsep dari paradigma pemrograman fungsional, lambda).
Jadi, yang paling dasar adalah belajar terus menerus, selamanya :)
sumber
Saya pikir Grafik 3D adalah sesuatu yang harus dipelajari setiap orang. Atau setidaknya bagaimana menggunakan vektor homogen dan transformasi matriks dengan benar.
Ini dapat membantu tidak hanya untuk membuat aplikasi 3d tetapi juga di bidang mekanik seperti kinematika terbalik pada robot, menghitung momen, dan banyak hal lainnya.
Saya tidak sepenuhnya memahami aljabar linier sampai saya membaca grafik-3d, salah satu kursus terbaik yang pernah saya ambil meskipun guru kami buruk.
sumber
Karena mesin dengan banyak inti (baik CPU dan GPU) menjadi standar, saya akan mengatakan untuk menyertakan Algoritma Terdistribusi (dari banyak utas ke banyak mesin). Sangat penting untuk memahami pemrosesan multi-threading dan terdistribusi. Mohon maaf karena tautan tersebut tidak memberikan banyak bantuan.
sumber