Versi asli: Bahasa Inggris
Ini adalah rencana studi multi-bulan saya untuk beralih dari pengembang web (otodidak, tanpa gelar Ilmu Komputer) menjadi insinyur perangkat lunak untuk perusahaan besar.
Ini dimaksudkan untuk teknisi perangkat lunak baru atau mereka yang beralih dari pengembangan perangkat lunak/web ke rekayasa perangkat lunak (yang memerlukan pengetahuan ilmu komputer). Jika Anda memiliki pengalaman bertahun-tahun dan mengklaim pengalaman rekayasa perangkat lunak bertahun-tahun, nantikan wawancara yang lebih sulit.
Jika Anda memiliki pengalaman pengembangan perangkat lunak/web selama bertahun-tahun, perhatikan bahwa perusahaan perangkat lunak besar seperti Google, Amazon, Facebook, dan Microsoft memandang rekayasa perangkat lunak berbeda dari pengembangan perangkat lunak/web, dan mereka memerlukan pengetahuan ilmu komputer.
Jika Anda ingin menjadi insinyur keandalan atau insinyur operasi, pelajari lebih lanjut dari daftar opsional (jaringan, keamanan).
---------------- Semua dibawah ini bersifat opsional ----------------
Saya mengikuti rencana ini untuk mempersiapkan saya dalam menghadapi wawancara kerja Google. Sejak 1997, saya telah menciptakan berbagai situs, servis, dan mendirikan startup. Saya memiliki gelar ekonomi, bukan gelar ilmu komputer. Saya telah meraih kesuksesan dalam karir saya, tapi saya ingin bekerja di Google. Saya ingin masuk ke sistem yang lebih besar dan mempunyai pemahaman mendalam tentang sistem komputer, efesiensi algoritma, performa struktur data, bahasa tingkat rendah, dan bagaimana semuanya bekerja. Jika anda tidak mengetahui satu pun, Google tidak akan mempekerjakan anda.
Itu rencana yang panjang. Mungkin butuh waktu berbulan-bulan. Jika Anda sudah terbiasa dengan hal ini, Anda akan membutuhkan lebih sedikit waktu.
Apapun dibawah ini adalah garis besar, dan anda harus menguasai materi dari atas ke bawah secara runut.
Saya menggunakan markdown spesial dari Github, termasuk daftar tugas untuk mengecek perkembangan.
Buat branch baru sehingga anda bisa mencentang seperti ini, bubuhi tanda x dalam tanda kurung: [x]
Fork sebuah branch dan ikuti perintah berikut
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
Tandai semua kotak dengan tanda X setalah anda menyelesaikannya
git add .
git commit -m "Tandai x"
git rebase jwasham/main
git push --force
Lebih jauh tentang markdown Github
Beberapa video hanya tersedia dengan mendaftar di kelas Coursera atau EdX. Ini disebut MOOC. Terkadang kelas tidak dalam sesi jadi Anda harus menunggu beberapa bulan, jadi Anda tidak memiliki akses.
Saya menghargai bantuan Anda untuk menambahkan sumber publik yang gratis dan selalu tersedia, seperti video YouTube untuk menyertai video kursus online.
Saya suka menggunakan kuliah universitas.
Anda dapat menggunakan bahasa yang Anda sukai untuk melakukan bagian pengkodean dalam wawancara, tetapi untuk perusahaan besar, ini adalah pilihan yang tepat:
Anda juga bisa menggunakan ini, tapi bacalah dulu. Mungkin ada peringatan:
Berikut adalah artikel yang saya tulis tentang memilih bahasa untuk wawancara: Pilih Satu Bahasa untuk Wawancara Coding.
Anda harus sangat nyaman dalam bahasa tersebut dan berpengetahuan luas.
Baca lebih lanjut tentang pilihan:
Anda akan melihat beberapa pembelajaran C, C++, dan Python yang disertakan di bawah ini, karena saya sedang belajar. Ada beberapa buku yang terlibat, lihat bagian bawah.
Ini adalah daftar pendek yang saya gunakan. Ini disingkat untuk menghemat waktu Anda.
Anda harus memilih sebuah bahasa pemgrograman untuk wawancara (lihat diatas).
Berikut adalah rekomendasi bahasa dari saya. Saya tidak memiliki sumber daya untuk semua bahasa. Saya menyambut penambahan.
Jika meskipun anda membaca salah satu dari ini, anda harus memiliki semua pengetahuan struktur data dan algoritma, anda harus mulai melakukan pemecahan masalah koding. Anda dapat melewati semua video ceramah di proyek ini, kecuali jika anda ingin sebuah review.
Sumber daya khusus bahasa tambahan di sini.
Saya belum membaca keduanya. tapi mereka dinilai sangat bagus dan ditulis oleh Sedgewick. Dia mengagumkan.
Jika anda memiliki rekomendasi yang lebih baik untuk C++, tolong beritahu saya. Mencari sumber daya yang komprehensif.
Atau:
Daftar ini tumbuh selama berbulan-bulan, dan ya, menjadi sulit untuk diatur.
Berikut adalah beberapa kesalahan yang saya buat sehingga anda akan memiliki pengalaman yang lebih baik.
Saya menonton video berjam-jam dan mengambil catatan yang berlebihan, dan beberapa bulan kemudian disana ada banyak yang tidak saya ingat. Saya menghabiskan 3 hari melalui catatan saya dan membuat flashcards sehingga saya bisa meninjaunya dengan lebih cepat.
Tolong baca sehingga anda tidak akan membuat kesalahan seperti saya:
Menguasai Pengetahuan Ilmu Komputer
Sebuah kursus yang direkomendasikan kepada saya (belum pernah saya ambil): Belajar cara Belajar.
Untuk mengatasi masalah tersebut, saya membuat situs flashcards kecil di mana saya bisa menambahkan flashcards dari 2 jenis: umum dan code. Setiap kartu memiliki format yang berbeda.
Saya membuat sebuah mobile-first website jadi saya bisa mereview di telepon dan tablet saya, dimanapun saya berada.
Membuat punya anda sendiri secara gratis:
Perlu diingat aku pergi keluar kapal dan memiliki kartu meliputi segala sesuatu dari bahasa assembly dan Python trivia untuk pembelajaran machine learning dan statistik. Ini terlalu banyak untuk apa yang diminta oleh Google.
Catatan di flashcards: Pertama kali anda mengenali dan anda tahu jawabannya, jangan menandainya sebagai dikenal. Anda harus melihat kartu yang sama dan menjawab beberapa kali dengan benar sebelum anda benar-benar tahu akan hal itu. Pengulangan akan membuat pengetahuan yang lebih di otak anda.
Sebuah alternatif untuk menggunakan situs flashcards saya adalah Anki, yang telah direkomendasikan kepada saya berkali-kali. Ini menggunakan sistem pengulangan untuk membantu anda mengingatnya. Ini user-friendly, yang tersedia di semua platform dan memiliki sebuah sistem cloud sync. Ini memerlukan biaya $25 di iOS tapi ini gratis di platform lainnya.
Database flashcard saya di format Anki: https://ankiweb.net/shared/info/25173560 (terimakasih @xiewenya)
Anda perlu menerapkan apa yang Anda pelajari untuk memecahkan masalah, atau Anda akan lupa. Saya melakukan kesalahan ini. Setelah Anda mempelajari suatu topik, dan merasa nyaman dengannya, seperti daftar tertaut, buka salah satu buku wawancara pengkodean dan lakukan beberapa pertanyaan tentang daftar tertaut. Kemudian lanjutkan ke topik pembelajaran berikutnya. Kemudian, kembali dan lakukan masalah daftar tertaut lainnya, atau masalah rekursi, atau apa pun. Tapi tetaplah mengerjakan soal sambil belajar. Anda tidak dipekerjakan karena pengetahuan, tetapi bagaimana Anda menerapkan pengetahuan itu. Ada beberapa buku dan situs yang saya rekomendasikan. Lihat di sini untuk lebih lanjut: Latihan Pertanyaan Pemrograman.
Aku menyimpan satu set cheat sheet pada ASCII, OSI stack, Big-O notasi, dan banyak lagi. Saya mempelajarinya ketika saya memiliki waktu luang.
Mengambil istirahat dari masalah pemgrogramman selama setengah jam dan pergi melalui flashcards anda.
Ada banyak gangguan yang dapat menghabiskan waktu yang berharga. Fokus dan konsentrasi sulit. Nyalakan musik tanpa lirik dan Anda akan dapat fokus dengan baik.
Ini adalah teknologi yang lazim tetapi bukan bagian dari rencana studi ini:
Beberapa mata pelajaran mengambil satu hari, dan beberapa akan mengambil beberapa hari. Beberapa hanya belajar dan tidak ada yang diimplimentasikan.
Setiap hari saya mengambil satu subjek dari daftar di bawah ini, menonton video tentang subjek itu, dan menulis sebuah implementasi di:
Anda tidak perlu semua ini. Anda hanya perlu satu bahasa untuk wawancara.
Mengapa meng-kode di semua ini?
Saya mungkin tidak punya waktu untuk melakukan semua ini untuk setiap mata pelajaran, tapi saya akan mencobanya.
Anda dapat melihat kode saya di sini:
Anda tidak perlu susah payah menghafal setiap algoritma.
Menulis kode pada papan tulis atau kertas, bukan komputer. Uji dengan beberapa sampel masukan. Kemudian menguji itu pada komputer.
[ ] belajar C
[ ] Bagaimana komputer memproses program:
[ ] Video:
[ ] Kursus Online:
[ ] Implementasikan dengan array menggunakan probing linier
[ ] Catatan:
Untuk heapsort, lihat struktur data Heap di atas. Jenis heap bagus, tapi tidak stabil
[ ] UC Berkeley:
[ ] Kode Merge sort:
[ ] Kode Quick sort:
[ ] Implementasi:
[ ] Tidak wajib, tetapi saya merekomendasikan mereka:
Sebagai ringkasan, berikut adalah representasi visual dari 15 algoritma pengurutan. Jika Anda membutuhkan detail lebih lanjut tentang subjek ini, lihat bagian "Menyortir" di Detail Tambahan tentang Beberapa Subjek
Graf (Graphs) dapat digunakan untuk merepresentasikan banyak masalah dalam ilmu komputer, jadi bagian ini panjang, seperti pohon dan penyortiran.
Catatan:
[ ] MIT (video):
[ ] Kuliah Skiena - pengantar yang bagus:
[ ] Graphs (ulasan dan lainnya):
Kursus Coursera Penuh:
Saya akan menerapkan:
Jika Anda membutuhkan detail lebih lanjut tentang subjek ini, lihat bagian "String Matching" di Detail Tambahan tentang Beberapa Subjek.
Anda dapat mengharapkan pertanyaan desain sistem jika Anda memiliki pengalaman 4+ tahun.
Bagian ini akan memiliki video pendek yang dapat Anda tonton dengan cukup cepat untuk meninjau sebagian besar konsep penting.
Sangat menyenangkan jika Anda sering ingin penyegaran.
Sekarang setelah kamu mengetahui semua topik ilmu komputer di atas, sekarang saatnya berlatih menjawab soal coding.
Latihan pertanyaan coding bukan tentang menghafal jawaban atas masalah pemrograman.
Mengapa Anda perlu berlatih mengerjakan soal pemrograman:
Ada pengantar yang bagus untuk pemecahan masalah metodis dan komunikatif dalam sebuah wawancara. Anda juga akan mendapatkan ini dari buku wawancara pemrograman, tetapi menurut saya ini luar biasa: Kanvas desain algoritme
Tidak ada papan tulis di rumah? Itu masuk akal. Saya orang aneh dan memiliki papan tulis besar. Alih-alih papan tulis, belilah papan gambar besar dari toko seni. Anda bisa duduk di sofa dan berlatih. Ini adalah "papan tulis sofa" saya. Saya menambahkan pena di foto untuk skala. Jika Anda menggunakan pena, Anda pasti berharap dapat menghapusnya. Cepat berantakan. Saya menggunakan pensil dan penghapus.
Tambahan:
Baca dan Lakukan Masalah Pemrograman (dalam urutan ini):
Lihat Daftar Buku di atas
Setelah Anda mempelajari otak Anda, gunakan otak itu untuk bekerja. Ambil tantangan pengkodean setiap hari, sebanyak yang Anda bisa.
Video Pertanyaan Wawancara Coding:
Situs tantangan:
Situs pembelajaran bahasa, dengan tantangan:
Repo tantangan:
Wawancara Mock:
Pikirkan sekitar 20 pertanyaan wawancara yang akan Anda dapatkan, bersama dengan baris item di bawah ini. Miliki 2-3 jawaban untuk masing-masing. Memiliki cerita, bukan hanya data, tentang sesuatu yang Anda capai.
Beberapa milik saya (saya mungkin sudah tahu jawaban tetapi ingin pendapat atau perspektif tim mereka):
Selamat!
Terus belajar.
Anda tidak pernah benar-benar selesai.
*****************************************************************************************************
*****************************************************************************************************
Segala sesuatu di bawah poin ini bersifat opsional. Ini adalah rekomendasi saya, bukan Google.
Dengan mempelajari ini, Anda akan mendapatkan eksposur yang lebih besar ke lebih banyak konsep CS,
dan akan lebih siap untuk pekerjaan rekayasa perangkat lunak apa pun.
Anda akan menjadi insinyur perangkat lunak yang jauh lebih berpengalaman.
*****************************************************************************************************
*****************************************************************************************************
Ini ada di sini sehingga Anda dapat menyelami topik yang menurut Anda menarik.
Arsitektur Komputer, Edisi Keenam: Pendekatan Kuantitatif
Saya menambahkannya untuk membantu Anda menjadi insinyur perangkat lunak yang berpengetahuan luas,
dan untuk mengetahui teknologi dan algoritme tertentu, sehingga Anda akan memiliki kotak peralatan yang lebih besar.
AVL trees
Splay trees
Red/black trees
2-3 search trees
2-3-4 Trees (aka 2-4 trees)
N-ary (K-ary, M-ary) trees
B-Trees
-"Ini adalah semacam struktur data kultus" - Skiena
--
Saya menambahkan ini untuk memperkuat beberapa ide yang sudah disajikan di atas, tetapi tidak ingin memasukkannya di atas karena terlalu banyak. Sangat mudah untuk melakukannya secara berlebihan pada suatu subjek.
Anda ingin dipekerjakan di abad ini, bukan?
SOLID
Union-Find
Lebih banyak Pemrograman Dinamis (videos)
Pemrosesan Graph Lanjutan (video)
MIT Probabilitas (matematika, dan lakukan perlahan, yang bagus untuk hal-hal matematika) (video):
Pencocokan String
Penyortiran
Duduk dan nikmati. "Netflix dan keterampilan": P
Daftar masalah Pemrograman Dinamis individu (masing-masing pendek)
Luar Biasa - MIT Calculus Revisited: Single Variable Calculus
Ilmu Komputer 70, 001 - Musim Semi 2015 - Matematika Diskrit dan Teori Probabilitas
CSE373 - Analysis of Algorithms (25 videos)
UC Berkeley 61B (Musim Gugur 2006): Struktur Data (39 video)
~~ UC Berkeley CS 152: Arsitektur dan Teknik Komputer (20 video)~~
MIT 6.042J: Matematika untuk Ilmu Komputer, Musim Gugur 2010 (25 video)
Menambang Kumpulan Data Besar-besaran - Universitas Stanford (94 video)
Terjemahan Bahasa Indonesia dipersembahkan oleh