Mengapa belajar ilmu komputer?
Ilustrasi oleh Kevin Ku
Ada 2 jenis insinyur perangkat lunak: mereka yang memahami ilmu komputer dengan cukup baik untuk melakukan pekerjaan yang menantang dan inovatif, dan mereka yang bertahan karena mereka terbiasa dengan beberapa alat tingkat tinggi.
Keduanya menyebut diri mereka insinyur perangkat lunak, dan keduanya cenderung mendapatkan gaji yang sama di awal karier mereka. Tetapi para insinyur Tipe 1 maju menuju pekerjaan yang lebih memuaskan dan diupah dengan baik dari waktu ke waktu, baik itu pekerjaan komersial yang berharga atau terobosan proyek-proyek sumber terbuka, kepemimpinan teknis atau kontribusi individu berkualitas tinggi.
Insinyur tipe 1 menemukan cara untuk mempelajari ilmu komputer secara mendalam, baik melalui cara konvensional atau dengan tanpa henti belajar sepanjang karier mereka. Insinyur tipe 2 biasanya tetap berada di permukaan, mempelajari alat dan teknologi tertentu daripada fondasi yang mendasarinya, hanya mengambil keterampilan baru ketika angin perubahan mode teknis.
Saat ini, jumlah orang yang memasuki industri meningkat pesat, sementara jumlah lulusan CS relatif statis. Kelebihan pasokan insinyur Tipe 2 ini mulai mengurangi kesempatan kerja mereka dan membuat mereka keluar dari pekerjaan industri yang lebih memuaskan. Apakah Anda berusaha untuk menjadi insinyur Tipe 1 atau hanya mencari lebih banyak keamanan kerja, mempelajari ilmu komputer adalah satu-satunya jalan yang dapat diandalkan.
Apa sih yang dipelajari di ilmu komputer?
Programming
Sebagian besar program Ilmu Komputer sarjana dimulai dengan "pengantar" untuk pemrograman komputer. Versi terbaik dari kursus-kursus ini melayani tidak hanya untuk pemula, tetapi juga bagi mereka yang melewatkan konsep dan model pemrograman yang bermanfaat saat pertama kali belajar kode.
Rekomendasi standar kami untuk konten ini adalah Struktur klasik dan Interpretasi Program Komputer, yang tersedia online secara gratis baik sebagai buku, dan sebagai satu set kuliah video MIT. Sementara kuliah-kuliah itu hebat.
Kami merekomendasikan bekerja melalui setidaknya tiga bab pertama SICP dan melakukan latihan. Untuk latihan tambahan, bekerja melalui serangkaian masalah pemrograman kecil.
Mengapa? Karena SICP unik dalam kemampuannya — setidaknya berpotensi — untuk mengubah keyakinan mendasar Anda tentang komputer dan pemrograman. Tidak semua orang akan mengalami ini. Beberapa akan membenci buku itu, yang lain tidak akan melewati beberapa halaman pertama. Tetapi potensi hadiah membuatnya layak untuk dicoba.
Jika Anda tidak menikmati SICP, cobalah Menulis Program. Jika itu masih tidak sesuai, coba Cara Mendesain Program. Jika tak satu pun dari ini tampaknya menghargai usaha Anda, mungkin itu pertanda bahwa Anda harus fokus pada topik lain untuk beberapa waktu, dan meninjau kembali disiplin pemrograman dalam satu atau dua tahun lagi.
Kami berasumsi bahwa Anda adalah programmer yang kompeten tanpa latar belakang dalam ilmu komputer, mencari untuk mengisi beberapa kesenjangan pengetahuan. Fakta bahwa kami telah memasukkan bagian tentang "pemrograman" hanyalah pengingat bahwa mungkin ada lebih banyak untuk dipelajari.
Arsitektur komputer
Arsitektur Komputer — kadang-kadang disebut “sistem komputer” atau “organisasi komputer” —adalah pandangan penting pertama dalam komputasi di bawah permukaan perangkat lunak. Dalam pengalaman kami, ini adalah area yang paling diabaikan di antara insinyur perangkat lunak otodidak.
Buku pengantar favorit kami adalah Sistem Komputer: Perspektif Seorang Programmer, dan kursus arsitektur komputer pengantar yang khas menggunakan buku itu akan mencakup sebagian besar bab 1-6.
Kami menyukai CS: APP untuk pendekatan praktis, berorientasi pada programmer. Walaupun ada lebih banyak arsitektur komputer daripada apa yang dibahas dalam buku ini, ini berfungsi sebagai titik awal yang bagus bagi mereka yang ingin memahami sistem komputer terutama untuk menulis perangkat lunak yang lebih cepat, lebih efisien dan lebih dapat diandalkan.
Bagi mereka yang lebih memilih pengantar yang lebih lembut untuk topik dan keseimbangan masalah perangkat keras dan perangkat lunak, kami menyarankan The Elements of Computing Systems, juga dikenal sebagai "Nand2Tetris". Ini adalah buku ambisius yang berusaha memberi Anda pemahaman yang kohesif tentang bagaimana segala sesuatu di komputer bekerja. Setiap bab melibatkan membangun bagian kecil dari keseluruhan sistem, dari menulis gerbang logika dasar dalam HDL, melalui CPU dan assembler, sampai ke aplikasi ukuran game Tetris.
Kami merekomendasikan membaca enam bab pertama buku ini dan menyelesaikan proyek terkait. Ini akan mengembangkan pemahaman Anda tentang hubungan antara arsitektur mesin dan perangkat lunak yang berjalan di atasnya.
Paruh pertama buku ini (dan semua proyeknya), tersedia secara gratis dari situs web Nand2Tetris. Ini juga tersedia sebagai kursus Coursera dengan video yang menyertainya.
Dalam mencari kesederhanaan dan keterpaduan. Secara khusus, dua konsep yang sangat penting dalam arsitektur komputer modern adalah pipelining dan hirarki memori, tetapi keduanya sebagian besar tidak ada dalam teks.
Algoritma dan Struktur Data
Kami setuju dengan beberapa dekade kearifan umum bahwa keakraban dengan algoritma umum dan struktur data adalah salah satu aspek yang paling memberdayakan dari pendidikan ilmu komputer. Ini juga merupakan tempat yang bagus untuk melatih kemampuan pemecahan masalah umum seseorang, yang akan terbayar di setiap bidang studi lainnya.
Ada ratusan buku yang tersedia, tetapi favorit kami adalah The Algorithm Design Manual oleh Steven Skiena. Dia jelas menyukai pemecahan masalah algoritmik dan biasanya berhasil memupuk antusiasme yang sama di antara siswa dan pembacanya. Menurut pendapat kami, dua teks yang lebih umum disarankan (CLRS dan Sedgewick) cenderung sedikit terlalu bukti bagi mereka yang mempelajari materi terutama untuk membantu dengan pemecahan masalah praktis.
Bagi mereka yang lebih suka kuliah video, Skiena dengan murah hati menyediakan online-nya. Kami juga sangat menyukai kursus Tim Roughgarden, tersedia di Coursera dan tempat lain. Apakah Anda lebih suka gaya ceramah Skiena atau Roughgarden akan menjadi masalah pilihan pribadi. Sebenarnya, ada lusinan alternatif bagus, jadi jika Anda menemukan alternatif lain yang Anda sukai, kami anjurkan Anda untuk tetap menggunakannya!
Untuk latihan, pendekatan pilihan kami adalah agar siswa memecahkan masalah pada Leetcode. Ini cenderung menjadi masalah yang menarik dengan solusi dan diskusi pendamping yang layak. Mereka juga membantu Anda menguji kemajuan terhadap pertanyaan yang biasanya digunakan dalam wawancara teknis di perusahaan perangkat lunak yang lebih kompetitif. Kami menyarankan untuk menyelesaikan sekitar 100 masalah leetcode acak sebagai bagian dari studi Anda.
Akhirnya, kami sangat merekomendasikan Cara Memecahkannya sebagai panduan yang sangat baik dan unik untuk pemecahan masalah umum; itu berlaku untuk ilmu komputer seperti halnya untuk matematika.
Matematika untuk Ilmu Komputer
Dalam beberapa hal, ilmu komputer adalah cabang matematika terapan yang tumbuh terlalu besar. Sementara banyak insinyur perangkat lunak mencoba — dan pada tingkat yang berbeda berhasil — mengabaikan ini, kami menganjurkan Anda untuk menerimanya dengan studi langsung. Melakukannya dengan sukses akan memberi Anda keunggulan kompetitif yang sangat besar di atas mereka yang tidak.
Bidang matematika yang paling relevan untuk Ilmu Komputer secara luas disebut "matematika diskrit", di mana "diskrit" adalah kebalikan dari "kontinu" dan secara longgar kumpulan topik matematika terapan yang menarik di luar kalkulus. Dengan definisi yang tidak jelas, tidak berarti mencoba untuk mencakup seluruh “matematika diskrit”. Tujuan yang lebih realistis adalah membangun pemahaman logika, kombinatorik dan probabilitas, teori himpunan, teori grafik, dan sedikit teori bilangan yang menginformasikan kriptografi. Aljabar linier adalah bidang studi tambahan yang bermanfaat, mengingat pentingnya dalam grafik komputer dan pembelajaran mesin.
Titik awal yang kami sarankan untuk matematika diskrit adalah kumpulan catatan kuliah dari László Lovász. Profesor Lovász melakukan pekerjaan yang baik untuk membuat konten dapat didekati dan intuitif, jadi ini berfungsi sebagai titik awal yang lebih baik daripada teks yang lebih formal.
Sistem operasi
Konsep Sistem Operasi ("buku Dinosaurus") dan Sistem Operasi Modern adalah buku "klasik" tentang sistem operasi. Keduanya mendapat kecaman karena kurang jelas dan tidak bersahabat dengan siswa pada umumnya.
Sistem Operasi: Tiga Potong Mudah adalah alternatif yang baik yang tersedia secara online secara gratis. Kami terutama menyukai struktur dan keterbacaan buku, dan merasa bahwa latihan ini bermanfaat.
Setelah OSTEP, kami mendorong Anda untuk mengeksplorasi keputusan desain sistem operasi tertentu, melalui buku-buku gaya "{OS} Internal" seperti komentar Lion tentang Unix, Desain dan Implementasi Sistem Operasi FreeBSD, dan Mac OS X Internals. Untuk Linux, kami menyarankan Pengembangan Kernel Linux yang fantastis dari Robert Love.
Cara yang bagus untuk mengkonsolidasikan pemahaman Anda tentang sistem operasi adalah membaca kode kernel kecil dan menambahkan fitur. Salah satu pilihan adalah xv6, port Unix V6 ke ANSI C dan x86, dikelola untuk kursus di MIT. OSTEP memiliki lampiran laboratorium xv6 potensial yang penuh dengan ide-ide hebat untuk proyek-proyek potensial
Jaringan komputer
Mengingat begitu banyak rekayasa perangkat lunak ada di server web dan klien, salah satu bidang ilmu komputer yang paling berharga adalah jaringan komputer. Siswa otodidak yang mempelajari jaringan secara sistematis menemukan bahwa mereka akhirnya memahami istilah, konsep, dan protokol yang telah mereka kelilingi selama bertahun-tahun.
Buku favorit kami tentang topik ini adalah Jaringan Komputer: Pendekatan Top-Down. Proyek-proyek kecil dan latihan-latihan dalam buku ini layak dilakukan, dan kami terutama menyukai "laboratorium Wireshark", yang telah mereka berikan dengan murah hati secara online.
Bagi mereka yang lebih suka ceramah video, kami sarankan kursus Pengantar Jaringan Komputer Stanford yang sebelumnya tersedia melalui platform MOOC Stanford Lagunita, tetapi sayangnya sekarang hanya tersedia sebagai daftar putar tidak resmi di Youtube
Databases
Dibutuhkan lebih banyak pekerjaan untuk belajar sendiri tentang sistem basis data dibandingkan dengan kebanyakan topik lainnya. Ini adalah bidang studi yang relatif baru (yaitu pasca 1970-an) dengan insentif komersial yang kuat untuk ide-ide untuk tinggal di belakang pintu tertutup. Selain itu, banyak penulis buku pelajaran berpotensi unggul lebih suka bergabung atau memulai perusahaan.
Mengingat keadaannya, kami mendorong pelajar mandiri untuk umumnya menghindari buku teks dan mulai dengan rekaman CS 186, kursus database Joe Hellerstein di Berkeley, dan untuk maju membaca makalah setelah.
Satu makalah yang secara khusus layak disebut untuk siswa baru adalah "Arsitektur Sistem Database", yang secara unik memberikan pandangan tingkat tinggi tentang bagaimana sistem manajemen basis data relasional (RDBMS) bekerja. Ini akan berfungsi sebagai kerangka yang berguna untuk studi lebih lanjut.
Bacaan dalam Sistem Basis Data, lebih dikenal sebagai database "Buku Merah", adalah kumpulan makalah yang disusun dan diedit oleh Peter Bailis, Joe Hellerstein dan Michael Stonebraker. Bagi mereka yang telah maju melampaui tingkat konten CS 186, Buku Merah harus menjadi perhentian Anda berikutnya.
Jika Anda bersikeras menggunakan buku teks pengantar, kami menyarankan Sistem Manajemen Basis Data oleh Ramakrishnan dan Gehrke. Untuk siswa yang lebih mahir, Pemrosesan Transaksi klasik Jim Gray: Konsep dan Teknik bermanfaat, tetapi kami tidak menganjurkan menggunakan ini sebagai sumber pertama.
Akhirnya, pemodelan data adalah aspek yang diabaikan dan kurang diajarkan untuk bekerja dengan database. Buku yang kami sarankan pada topik ini adalah Data dan Realitas: Perspektif Abadi tentang Perceiving dan Mengelola Informasi di Dunia Imprecise Kami.
Bahasa dan Kompiler
Sebagian besar programmer belajar bahasa, sedangkan kebanyakan ilmuwan komputer belajar tentang bahasa. Ini memberi ilmuwan komputer keuntungan berbeda dari programmer, bahkan dalam domain pemrograman! Pengetahuan mereka digeneralisasi; mereka mampu memahami pengoperasian bahasa baru dengan lebih dalam dan cepat daripada mereka yang hanya mempelajari bahasa tertentu.
Teks pengantar yang kami sarankan adalah Penerjemah Crafting yang sangat baik oleh Bob Nystrom, tersedia secara online gratis. Ini terorganisir dengan baik, sangat menghibur, dan cocok untuk mereka yang tujuan utamanya adalah untuk lebih memahami bahasa dan alat bahasa mereka. Kami sarankan meluangkan waktu untuk mengerjakan semuanya, mencoba mana saja dari "tantangan" yang mempertahankan minat Anda.
Rekomendasi yang lebih tradisional adalah Compiler: Prinsip, Teknik & Alat, biasa disebut "Buku Naga". Sayangnya, ini tidak dirancang untuk belajar sendiri, tetapi bagi instruktur untuk memilih topik 1-2 semester untuk kursus mereka.
Jika Anda memilih untuk menggunakan Buku Naga, hampir penting Anda memilih topiknya, idealnya dengan bantuan seorang mentor. Sebenarnya, cara kami yang disarankan untuk memanfaatkan Buku Naga, jika Anda mau, adalah sebagai referensi tambahan untuk seri ceramah video. Yang kami rekomendasikan adalah Alex Aiken, di edX.
Sistem Terdistribusi
Ketika komputer meningkat jumlahnya, mereka juga menyebar. Di mana bisnis sebelumnya akan membeli mainframe yang lebih besar dan lebih besar, ini merupakan ciri khas sekarang bahkan untuk aplikasi yang sangat kecil dijalankan di beberapa mesin. Sistem terdistribusi adalah studi tentang bagaimana bernalar tentang trade-off yang terlibat dalam melakukannya.
Buku yang kami sarankan untuk dipelajari sendiri adalah Aplikasi Intensif Data-Desain Martin Kleppmann. Jauh lebih baik daripada buku teks tradisional, DDIA adalah buku yang sangat mudah dibaca yang dirancang untuk praktisi, yang entah bagaimana menghindari pengorbanan kedalaman atau kekakuan.
Bagi mereka yang mencari teks yang lebih tradisional, atau yang lebih suka teks yang tersedia secara online gratis, kami sarankan Sistem Terdistribusi Maarten van Steen dan Andrew Tanenbaum, Edisi ke-3.