Skip to content

Latest commit

 

History

History
168 lines (91 loc) · 24.3 KB

README.md

File metadata and controls

168 lines (91 loc) · 24.3 KB

Belajar Sendiri Ilmu Komputer

Dokumen ini adalah terjemahan dari TeachYourselfCS. Untuk versi aslinya, lihat di sini.

Catatan: panduan ini telah diperbarui pada Mei 2020. Untuk versi sebelumnya, lihat di sini.

Jika Anda adalah seorang engineer autodidak atau lulusan bootcamp, Anda berutang pada diri Anda untuk mendalami ilmu komputer. Untungnya, Anda bisa mendapat pendidikan ilmu komputer kelas dunia tanpa harus menghabiskan waktu dan uang untuk program sarjana 💸.

Ada banyak sumber belajar di luar sana, tapi beberapa lebih baik dari yang lain. Anda tidak perlu lagi artikel "200+ Kursus Online Gratis". Anda perlu jawaban dari pertanyaan ini:

  • Mata pelajaran apa yang harus dipelajari, dan mengapa?
  • Apa buku atau seri video pembelajaran terbaik untuk setiap mata pelajaran?

Panduan ini adalah upaya kami untuk menjawab pertanyaan tersebut.

TL;DR:

Pelajari kesembilan mata pelajaran di bawah, dalam urutan yang disajikan, baik menggunakan buku teks atau seri video pembelajaran yang disarankan, tapi lebih ideal menggunakan keduanya. Targetkan 100-200 jam belajar untuk setiap topik, lalu ulas kembali topik favorit sepanjang karir Anda 🚀.

Mata pelajaran Mengapa dipelajari? Buku Video
Pemrograman Jangan menjadi orang yang "tidak mengerti" sesuatu seperti rekursi. Structure and Interpretation of Computer Programs Berkeley CS 61A oleh Brian Harvey
Arsitektur Komputer Jika Anda tidak memiliki pemahaman yang kuat tentang cara kerja komputer, semua abstraksi tingkat tinggi Anda akan rapuh. Computer Systems: A Programmer's Perspective Berkeley CS 61C
Algoritma dan Struktur Data Jika Anda tidak tahu cara menggunakan struktur data yang sering digunakan seperti tumpukan, antrian, pohon, dan grafik, Anda tidak akan dapat memecahkan masalah yang menantang. The Algorithm Design Manual Video perkuliahan oleh Steven Skiena
Matematika untuk Ilmu Komputer Ilmu komputer pada dasarnya adalah cabang matematika terapan, jadi mempelajari matematika akan memberi Anda keunggulan kompetitif. Mathematics for Computer Science MIT 6.042J oleh Tom Leighton
Sistem Operasi Sebagian besar kode yang Anda tulis dijalankan oleh sistem operasi, jadi Anda harus tahu bagaimana mereka berinteraksi. Operating Systems: Three Easy Pieces Berkeley CS 162
Jaringan Komputer Internet telah menjadi suatu hal yang penting: pahami cara kerjanya untuk membuka potensi penuhnya. Computer Networking: A Top-Down Approach Stanford CS 144
Basis Data Data adalah bagian terpenting inti dari sebuah program, tetapi hanya sedikit yang memahami bagaimana sistem basis data bekerja. Readings in Database Systems Berkeley CS 186 oleh Joe Hellerstein
Bahasa Pemrograman dan Kompiler Jika Anda memahami cara kerja bahasa pemrograman dan kompiler, Anda dapat menulis kode dengan lebih baik dan mempelajari bahasa pemrograman baru dengan lebih mudah Crafting Interpreters Kursus online oleh Alex Aiken di edX
Sistem Terdistribusi Saat ini, sebagian besar sistem adalah sistem terdistribusi. Designing Data-Intensive Applications MIT 6.824

Masih terlalu banyak?

Jika mempelajari 9 topik selama beberapa tahun terasa berlebihan, kami sarankan Anda fokus hanya pada dua buku: Computer Systems: A Programmer's Perspective dan Designing Data-Intensive Applications. Berdasarkan pengalaman kami, kedua buku ini memberikan manfaat yang sangat besar atas waktu yang diinvestasikan, terutama untuk engineer autodidak dan lulusan bootcamp yang bekerja pada aplikasi yang terhubung dengan jaringan. Kedua buku tersebut juga berfungsi sebagai pengantar untuk topik dan sumber belajar lain yang tercantum di atas.

Mengapa mempelajari ilmu komputer?

Ada 2 jenis software engineer: mereka yang memahami ilmu komputer dengan baik sehingga dapat melakukan pekerjaan yang menantang dan inovatif, dan mereka yang dapat bertahan hanya karena mereka terbiasa menggunakan framework, library dan alat-alat lain.

Keduanya disebut software engineer, dan keduanya cenderung mendapat gaji yang sama di awal karir mereka. Tetapi engineer jenis pertama punya perkembangan menuju pekerjaan yang lebih memuaskan dengan bayaran yang meningkat seiring waktu, baik itu dari pekerjaan biasa atau proyek open source yang memberi terobosan baru, menjadi pemimpin dalam hal teknis, atau dari kontribusi sebagai individu berkualitas tinggi.

Engineer jenis pertama menemukan cara mempelajari ilmu komputer secara mendalam, baik melalui cara konvensional atau dengan belajar tanpa henti sepanjang karir mereka. Engineer jenis kedua biasanya hanya berada di atas, mempelajari alat dan teknologi tertentu daripada mempelajari fondasi yang mendasarinya, hanya menambah keterampilan baru ketika tren berubah.

Saat ini, jumlah orang yang memasuki industri ini meningkat pesat, sementara jumlah lulusan ilmu komputer relatif tetap. Kelebihan pasokan engineer jenis kedua ini dapat mengurangi kesempatan kerja dan menjauhkan mereka dari pekerjaan yang lebih memuaskan pada industri ini. Apakah karena Anda ingin menjadi engineer jenis pertama atau sekadar mencari keamanan kerja yang lebih tinggi, mempelajari ilmu komputer adalah satu-satunya jalan yang dapat diandalkan.

Panduan mata pelajaran

Pemrograman

Sebagian besar program sarjana ilmu komputer dimulai dengan "pengantar" pemrograman komputer. Versi terbaik dari kursus ini tidak hanya diperuntukkan bagi pemula, tetapi juga bagi mereka yang melewatkan konsep dan model pemrograman yang penting ketika pertama kali belajar.

Rekomendasi kami untuk topik ini adalah buku klasik Structure and Interpretation of Computer Programs, yang tersedia secara daring dan gratis baik sebagai buku, maupun sebagai seri video perkuliahan dari MIT. Meskipun seri video tersebut bagus, kami lebih menyarankan video kuliah SICP oleh Brian Harvey (untuk kursus 61A di Berkeley). Video kuliah ini lebih baik dan lebih pantas ditargetkan pada mahasiswa baru daripada video kuliah dari MIT.

Kami merekomendasikan untuk setidaknya menyelesaikan tiga bab pertama SICP beserta latihannya. Untuk latihan tambahan, Anda bisa mengerjakan masalah pemrograman seperti yang ada pada exercism.

Sejak panduan ini pertama kali diterbitkan pada tahun 2016, salah satu pertanyaan yang paling sering diajukan adalah apakah kami akan merekomendasikan rekaman terbaru kuliah 61A yang diajarkan oleh John DeNero, dan/atau buku panduannya Composing Programs, yang "sesuai dengan tradisi SICP" tetapi menggunakan Python. Menurut kami sumber belajar dari DeNero juga bagus, dan beberapa siswa mungkin akhirnya lebih menyukainya, tetapi kami tetap menyarankan SICP, Scheme, dan video kuliah oleh Brian Harvey sebagai rangkaian sumber belajar pertama untuk dicoba.

Mengapa? Karena SICP sangat unik dalam kemampuannya—setidaknya secara potensial—untuk mengubah pemahaman dasar Anda tentang komputer dan pemrograman. Tidak semua orang akan merasakannya. Beberapa akan membenci buku itu, bahkan ada yang tidak akan melewati beberapa halaman pertama. Tetapi potensi manfaatnya membuatnya layak untuk dicoba.

Jika Anda tidak dapat menikmati SICP, cobalah Composing Programs. Jika masih tidak sesuai, maka cobalah How to Design Programs. Jika tidak ada satu pun dari buku-buku ini yang memberi manfaat bagi Anda, mungkin itu pertanda bahwa Anda harus fokus pada topik lain untuk sementara waktu, dan meninjau kembali disiplin ilmu pemrograman dalam satu atau dua tahun ke depan.

Dan terakhir, satu poin klarifikasi: panduan ini TIDAK dirancang untuk mereka yang baru memulai pemrograman. Kami berasumsi bahwa Anda adalah seorang programmer yang kompeten tanpa latar belakang ilmu komputer, yang ingin mengisi kesenjangan pengetahuan. Alasan kami menyertakan bagian tentang "pemrograman" hanyalah pengingat bahwa mungkin masih ada banyak hal untuk dipelajari. Bagi mereka yang belum pernah menulis kode sebelumnya, dan ingin memulai, Anda mungkin lebih suka panduan seperti ini.

Arsitektur Komputer

Perangkat keras adalah platformnya

Mike Acton, Engine Director Insomniac Games

Arsitektur Komputer—kadang disebut "sistem komputer" atau "organisasi komputer"—adalah hal pertama yang patut dilihat pada komputasi di balik perangkat lunak. Dari pengalaman kami, inilah bagian yang paling sering diabaikan para software engineer autodidak.

Buku pengantar favorit kami adalah Computer Systems: A Programmer's Perspective, dan kuliah pengantar arsitektur komputer yang menggunakan buku ini biasanya akan mencakup sebagian besar bab 1 sampai 6.

Kami menyukai buku CS:APP karena pendekatannya yang praktis dan berorientasi pada pemrogram. Meskipun masih ada banyak hal tentang arsitektur komputer yang tidak terdapat dalam buku ini, CS:APP sangat cocok sebagai pengantar bagi mereka yang ingin memahami sistem komputer terutama untuk membuat perangkat lunak yang lebih cepat, lebih efisien, dan lebih andal.

Bagi mereka yang lebih suka pengenalan topik arsitektur komputer yang lebih ringan dan seimbang antara perangkat keras dan perangkat lunak, kami menyarankan The Elements of Computing Systems, juga dikenal sebagai Nand2Tetris. Buku ini mencoba memberi Anda pemahaman yang padu tentang cara kerja segala sesuatu yang terdapat pada komputer. Setiap bab membangun bagian kecil dari keseluruhan sistem, mulai dari menulis logic gate dasar dalam HDL, melalui CPU dan assembler, hingga aplikasi seukuran permainan Tetris.

Kami menyarankan Anda untuk membaca enam bab pertama buku ini dan menyelesaikan proyek latihannya. Hal ini dapat mengembangkan pemahaman Anda tentang hubungan antara arsitektur sebuah mesin dan perangkat lunak yang berjalan di atasnya.

Separuh pertama buku ini (dan semua proyek latihannya) tersedia secara gratis melalui situs web Nand2Tetris. Materi buku ini juga tersedia dalam bentuk video melalui kursus daring dari Coursera.

Nand2Tetris menukar pembahasan yang mendalam dengan kesederhanaan dan keterpaduan. Khususnya dua konsep yang sangat penting dalam arsitektur komputer modern, yaitu pipelining dan memory hierarchy, tetapi keduanya hampir tidak ada dalam buku ini.

Setelah Anda merasa nyaman dengan Nand2Tetris, kami sarankan untuk mencoba kembali buku CS:APP, atau mempertimbangkan Computer Organization and Design oleh Patterson dan Hennessy, sebuah buku teks klasik yang sangat bagus. Anda tidak harus membaca setiap bagian dari buku ini; kami menyarankan Anda untuk mengikuti kuliah CS61C Great Ideas in Computer Architecture dari Berkeley untuk bacaan tertentu dalam buku ini. Catatan kuliahnya tersedia secara daring, dan kuliah sebelumnya terdapat di Internet Archive.

Sistem Operasi

Operating System Concepts ("Dinosaur book") dan Modern Operating Systems adalah dua buku "klasik" tentang sistem operasi. Keduanya menuai kritik karena kurang jelas dan tidak ramah bagi siswa pada umumnya.

Operating Systems: Three Easy Pieces adalah alternatif yang tersedia gratis secara daring. Kami sangat menyukai struktur dan keterbacaan buku ini, dan merasa bahwa latihan yang terdapat pada buku ini sangat bermanfaat.

Setelah OSTEP, kami ingin Anda mengeksplorasi beberapa keputusan pada rancangan sistem operasi tertentu, melalui beberapa buku "{nama sistem operasi} Internals" seperti Lions' commentary on Unix, The Design and Implementation of the FreeBSD Operating System, dan Mac OS X Internals. Untuk Linux, kami menyarankan buku Robert Love yang luar biasa, yaitu Linux Kernel Development.

Cara yang bagus untuk memperkuat pemahaman Anda tentang sistem operasi adalah dengan membaca source code dari kernel sistem operasi kecil dan mencoba menambahkan fitur baru. Salah satu pilihan adalah xv6, sebuah port sistem operasi Unix V6 ke bahasa ANSI C dan arsitektur x86, yang dikembangkan untuk pembelajaran di MIT. Pada buku OSTEP terdapat lampiran xv6 labs yang penuh dengan ide-ide hebat untuk proyek-proyek potensial.

Jaringan Komputer

Anda tidak bisa menatap bola kristal dan melihat masa depan. Apa yang akan menjadi Internet di masa depan adalah apa yang dibuat oleh masyarakat.

Bob Kahn

Mengingat begitu banyak rekayasa perangkat lunak ada di server dan klien web, salah satu bidang ilmu komputer yang paling penting adalah jaringan komputer. Siswa kami yang mempelajari jaringan secara autodidak menemukan bahwa mereka akhirnya memahami istilah, konsep, dan protokol yang telah berada di sekitar mereka selama bertahun-tahun.

Buku favorit kami tentang topik ini adalah Computer Networking: A Top-Down Approach. Proyek-proyek kecil dan latihan dalam buku ini sangat layak untuk dikerjakan, dan kami sangat menyukai Wireshark labs yang telah mereka sediakan gratis secara daring.

Bagi mereka yang lebih menyukai materi dalam bentuk video, kami menyarankan video kuliah Introduction to Computer Networking dari Stanford yang sebelumnya ada pada platform belajar online mereka, tapi sayangnya sekarang hanya tersedia sebagai playlist tidak resmi di YouTube.

Pertanyaan yang sering diajukan

Untuk siapa panduan ini dibuat?

Kami paham bahwa Anda adalah seorang software engineer autodidak, lulusan bootcamp atau siswa SMA yang ingin tahu, atau mahasiswa yang ingin melengkapi pendidikan formal Anda dengan belajar mandiri. Pertanyaan tentang kapan memulai perjalanan ini sepenuhnya bersifat pribadi, tetapi kebanyakan orang cenderung mendapat manfaat dari memiliki beberapa pengalaman profesional sebelum menyelam terlalu jauh ke dalam teori ilmu komputer. Misalnya, kami melihat bahwa siswa suka belajar tentang sistem basis data jika mereka telah bekerja dengan basis data secara profesional, atau tentang jaringan komputer jika mereka pernah mengerjakan satu atau dua proyek aplikasi web.

Bagaimana dengan AI/grafis/topik favorit X?

Kami telah mencoba membatasi daftar kami pada topik ilmu komputer yang kami rasa perlu diketahui oleh setiap software engineer, terlepas dari spesialisasi atau industri, tetapi dengan fokus pada sistem. Dari pengalaman kami, ini akan menjadi topik dengan manfaat terbesar untuk sebagian besar engineer autodidak dan lulusan bootcamp, dan memberikan dasar yang kuat untuk studi lebih lanjut. Selanjutnya, Anda akan berada dalam posisi yang jauh lebih baik untuk membaca buku teks atau makalah lanjutan dan mempelajari konsep utama tanpa banyak panduan. Berikut adalah titik awal yang kami sarankan untuk beberapa "topik pilihan" umum:

  • Untuk topik kecerdasan buatan: selesaikan kursus pengantar AI dari Berkeley dengan menonton video dan mengerjakan proyek Pacman yang luar biasa. Untuk buku teks, gunakan Artificial Intelligence: A Modern Approach oleh Russell dan Norvig.
  • Untuk topik machine learning: selesaikan kursus di Coursera oleh Andrew Ng. Bersabarlah, dan pastikan Anda memahami dasar-dasarnya sebelum beralih ke topik baru yang menarik seperti deep learning.
  • Untuk grafik komputer: pelajari materi CS 184 Berkeley, dan gunakan Computer Graphics: Principles and Practice sebagai buku teks.

Seberapa ketat urutan yang disarankan?

Jika diperhatikan, semua mata pelajaran ini memiliki sejumlah bagian yang saling tumpang tindih, dan saling merujuk satu sama lain. Anda dapat mengambil contoh hubungan antara matematika diskrit dan algoritma: mempelajari matematika terlebih dahulu akan membantu Anda menganalisis dan memahami lebih dalam algoritma Anda, tetapi mempelajari algoritma terlebih dahulu akan memberikan motivasi dan konteks yang lebih besar untuk matematika diskrit. Idealnya, Anda akan mengunjungi kembali kedua topik ini berkali-kali sepanjang karier Anda.

Dengan demikian, urutan yang kami sarankan dapat membantu Anda untuk langsung memulai... jika Anda memiliki alasan kuat untuk memilih urutan yang berbeda, maka lakukanlah. Beberapa "prasyarat" yang menurut kami penting adalah: arsitektur komputer sebelum sistem operasi atau database, dan jaringan dan sistem operasi sebelum sistem terdistribusi.

Apa perbedaan panduan ini dengan kurikulum Open Source Society atau freeCodeCamp?

Ketika panduan ini pertama kali ditulis pada tahun 2016, panduan OSS membahas terlalu banyak mata pelajaran, menyarankan sumber belajar yang tidak lebih baik dari kebanyakan, dan tidak memberikan alasan atau panduan seputar mengapa atau aspek apa dari kursus tertentu yang lebih bermanfaat. Kami berusaha untuk membatasi daftar kursus kami hanya untuk kursus yang benar-benar harus Anda ketahui sebagai software engineer, terlepas dari spesialisasi Anda, dan untuk membantu Anda memahami mengapa setiap kursus disertakan. Di tahun-tahun berikutnya, kualitas panduan OSS telah meningkat, tetapi kami masih berpikir bahwa panduan ini memberikan jalur pembelajaran yang lebih jelas dan lebih terpadu.

freeCodeCamp sebagian besar berfokus pada pemrograman, bukan ilmu komputer. Untuk alasan mengapa Anda mungkin ingin mempelajari ilmu komputer, coba lihat di atas. Jika Anda baru memulai pemrograman, kami sarankan untuk memprioritaskan kurikulum tersebut, dan kembali ke panduan ini dalam satu atau dua tahun ke depan.

Bagaimana dengan bahasa pemrograman X?

Mempelajari bahasa pemrograman tertentu adalah hal yang sangat berbeda dengan mempelajari bidang pada ilmu komputer — mempelajari bahasa pemrograman jauh lebih mudah dan tidak lebih penting manfaatnya. Jika Anda sudah mengetahui beberapa bahasa pemrograman, kami sangat menyarankan Anda untuk mengikuti panduan kami dan menyesuaikan penguasaan bahasa pemrograman di sela waktu, atau setelah menyelesaikannya. Jika Anda telah mempelajari pemrograman dengan baik (seperti melalui Structure and Interpretation of Computer Programs), dan terutama jika Anda telah mempelajari kompiler, Anda hanya akan membutuhkan waktu setidaknya satu akhir pekan untuk mempelajari bahasa pemrograman baru, setelah itu Anda dapat mempelajarinya tentang library/tooling/ekosistem di tempat kerja.

Bagaimana dengan teknologi terbaru X?

Tidak ada satu teknologi pun yang lebih penting sehingga belajar menggunakannya harus menjadi bagian inti dari pendidikan Anda. Di sisi lain, adalah hal yang sangat bagus bahwa Anda bersemangat untuk mempelajari teknologi tersebut. Triknya adalah memulai dari bidang atau konsep yang mendasari teknologi tertentu, dan mempelajarinya secara mendalam sebelum melihat bagaimana teknologi terbaru Anda mengisi gambaran yang lebih besar.

Mengapa Anda masih merekomendasikan SICP?

Anda perlu mencoba buku SICP. Beberapa orang menganggap SICP mencengangkan, ciri yang hanya dimiliki oleh segelintir buku. Jika Anda tidak menyukainya, Anda dapat mencoba buku lain dan setelah itu mungkin kembali ke SICP.

Mengapa Anda masih merekomendasikan Dragon book?

Dragon book masih merupakan sumber tunggal terlengkap untuk topik seputar kompiler. Buku tersebut sering mendapat reputasi buruk, biasanya karena terlalu menekankan pada topik tertentu yang kurang populer untuk dibahas secara detail, seperti parsing. Masalahnya adalah, buku itu tidak pernah dimaksudkan untuk dipelajari dari sampul ke sampul, hanya untuk menyediakan materi pembelajaran yang cukup bagi seorang instruktur untuk menyusun materi kuliah. Demikian pula, seorang pembelajar mandiri dapat memilih petualangan mereka melalui buku, atau lebih baik mengikuti saran yang telah dibuat oleh dosen dalam garis besar mata kuliah mereka.

Bagaimana saya bisa mendapatkan buku teks yang terjangkau?

Kebanyakan dari buku teks yang kami sarankan tersedia secara daring dan gratis, berkat kemurahan hati penulisnya. Untuk buku yang tidak tersedia gratis, kami sarankan untuk membeli buku bekas edisi lama. Sebagai aturan umum, jika suatu buku teks punya lebih dari beberapa edisi, kemungkinan besar edisi lama sudah cukup memadai. Jelas tidak mungkin versi terbaru 10x lebih baik daripada yang lama, meskipun harganya berbeda!

Siapa yang menulis panduan ini?

Panduan ini ditulis oleh Oz Nova dan Myles Byrne, dengan pembaruan pada tahun 2020 oleh Oz. Panduan ini dibuat berdasarkan pengalaman kami mengajar dasar-dasar ilmu komputer kepada lebih dari 1000 engineer autodidak atau lulusan bootcamp dalam kelompok kecil di San Francisco dan secara daring. Terima kasih kepada semua siswa kami atas masukan tentang sumber belajar mandiri.

Kami yakin Anda dapat mempelajari semua hal di atas, dengan waktu dan motivasi yang cukup. Tetapi jika Anda lebih menyukai program intensif, terstruktur, dan dibimbing oleh instruktur, Anda mungkin tertarik dengan program Computer Science Intensive dari kami. Kami TIDAK menyarankan untuk mengejar gelar magister.