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).
- Apa ini?
- Mengapa menggunakan ini?
- Bagaimana cara menggunakannya
- Jangan merasa anda kurang pintar
- Tentang Sumber Video
- Proses Interview dan Preparasi Wawancara Secara Umum
- Pilih Satu Bahasa Pemrograman untuk Wawancara
- Daftar Buku
- Sebelum Anda Mulai
- Apa yang Tidak Akan Dibahas
- Ilmu Prasyarat
- Rencana Harian
- Kompleksitas Algoritma / Big-O / Analisis Asimptotik
- Struktur Data
- Lebih Banyak Pengetahuan
- Trees
- Penyortiran
- selection
- insertion
- heapsort
- quicksort
- merge sort
- Graphs
- directed
- undirected
- adjacency matrix
- adjacency list
- traversals: BFS, DFS
- Bahkan Lebih Banyak Pengetahuan
- Pengulangan (Recursion)
- Pemrograman Dinamis
- Pemrograman Berorientasi Objek
- Pola desain (Design patterns)
- Kombinatorik (n pilih k) & Probabilitas
- Algoritma NP, NP-Complete dan Approximation
- Cache
- Proses dan Thread
- Testing
- Penjadwalan
- Pencarian & manipulasi string
- Tries
- Angka Floating Point
- Unicode
- Endianness
- Jaringan
- Perancangan Sistem, Skalabilitas, Penganganan Data (jika anda memiliki pengalaman 4 tahun lebih)
- Ulasan Akhir
- Latihan Pertanyaan Pemrograman
- Latihan / tantangan coding
- Menjelang Proses Interview
- Resume Anda
- Pikirkan saat wawancara datang
- Bertanyalah Pada Pewawancara
- Saat Anda Berhasil Mendapatkan Pekerjaannya
---------------- Semua dibawah ini bersifat opsional ----------------
- Buku Tambahan
- Pembelajaran Tambahan
- Kompilator
- Emacs and vi(m)
- Unix command line tools
- Teori Informasi
- Pariti & Kode Hamming
- Entropi
- Kriptografi
- Kompresi
- Jaringan (bersiaplah mendapatkan pertanyaan jaringan apabila anda ingin menjadi system engineer)
- Keamanan komputer
- Pengumpulan sampah (Garbage collection)
- Pemrograman Paralel
- Pengiriman Pesan, Serialisasi, dan Sistem Queueing
- A*
- Transformasi Fourier Cepat
- Bloom Filter
- HyperLogLog
- Locality-Sensitive Hashing
- van Emde Boas Trees
- Augmented Data Structures
- Tries
- N-ary (K-ary, M-ary) trees
- Balanced search trees
- 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
- k-D Trees
- Skip lists
- Aliran Jaringan
- Disjoint Sets & Union Find
- Matematika untuk Pemrosesan Cepat
- Treap
- Pemrograman Linear
- Geometri, Convex hull
- Matematika Diskrit
- Pembelajaran Mesin
- Detail Tambahan tentang Beberapa Subjek
- Seri Video
- Kursus Ilmu Komputer
- Implementasi Algoritma
- Dokumen
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
- Para engineers/programmer di google adalah orang-orang pintar, tapi banyak dari mereka berpikir bahwa mereka tidak cukup pintar, walaupun mereka bekerja di Google.
- Mitos dari programmer yang jenius
- Hal yang berbahaya untuk pergi sendirian: Bertarung dengan monster yang tidak kelihatan di dunia teknologi
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.
- ABC: Selalu Menjadi Coding
- Papan tulis (Whiteboarding)
- Memperlihatkan Perekrutan Teknologi
- Cara Mendapatkan Pekerjaan di Big 4:
- Memecahkan Set Wawancara Coding 1:
- Memecahkan Wawancara Coding Facebook:
- Kursus Persiapan:
- Wawancara Insinyur Perangkat Lunak Unleashed (kursus berbayar):
- Pelajari cara mempersiapkan diri Anda untuk wawancara insinyur perangkat lunak dari mantan pewawancara Google.
- Python untuk Struktur Data, Algoritma, dan Wawancara (kursus berbayar):
- Kursus persiapan wawancara sentris Python yang mencakup struktur data, algoritma, wawancara tiruan, dan banyak lagi.
- Pengantar Struktur Data dan Algoritma menggunakan Python (kursus gratis Udacity):
- Kursus algoritme dan struktur data sentris Python gratis.
- Struktur Data dan Algoritma Nanodegree! (Nanodegree berbayar Udacity):
- Dapatkan praktik langsung dengan lebih dari 100 struktur data dan latihan algoritme serta panduan dari mentor yang berdedikasi untuk membantu mempersiapkan Anda untuk wawancara dan skenario di tempat kerja.
- Grokking Interview Perilaku (Kursus gratis edukatif):
- Sering kali, bukan kompetensi teknis Anda yang menahan Anda untuk mendapatkan pekerjaan impian Anda, melainkan bagaimana Anda melakukan wawancara perilaku.
- Wawancara Insinyur Perangkat Lunak Unleashed (kursus berbayar):
Anda dapat menggunakan bahasa yang Anda sukai untuk melakukan bagian pengkodean dalam wawancara, tetapi untuk perusahaan besar, ini adalah pilihan yang tepat:
- C++
- Java
- Python
Anda juga bisa menggunakan ini, tapi bacalah dulu. Mungkin ada peringatan:
- JavaScript
- Ruby
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:
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/
- http://blog.codingforinterviews.com/best-programming-language-jobs/
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.
- Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition
- jawaban di C++ and Java
- direkomendasikan di Google candidate coaching
- ini adalah pemanasan yang baik untuk Cracking the Coding Interview
- tidak terlalu sulit, kebanyakan masalah mungkin lebih mudah daripada apa yang akan anda lihat dalam sebuah wawancara (dari apa yang saya baca)
- Cracking the Coding Interview, 6th Edition
- jawaban in Java
- Elements of Programming Interviews (versi C++)
- Elements of Programming Interviews in Python
- Elements of Programming Interviews (Java version)
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.
- Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching
- Algorithms in C++ Part 5: Graph Algorithms
- Open Data Structures in C++
- Kumpulan Struktur dan Algoritma Data yang kaya dan terperinci
- Bagus untuk pemula
Jika anda memiliki rekomendasi yang lebih baik untuk C++, tolong beritahu saya. Mencari sumber daya yang komprehensif.
- Algoritma (Sedgewick dan Wayne)
- video dengan konten buku (dan Sedgewick!) di coursera:
Atau:
- Struktur Data dan Algoritma di Java
- oleh Goodrich, Tamassia, Goldwasser
- digunakan sebagai teks opsional untuk kursus pengenalan CS di UC Berkeley
- lihat laporan buku saya pada versi Python dibawah. Buku ini mencakup topik-topik yang sama.
- Struktur Data dan Algoritma dengan Python
- oleh Goodrich, Tamassia, Goldwasser
- Saya mencintai buku ini. Mencakup segala hal dan lainnya.
- kode Pythonic
- laporan buku saya: https://googleyasheck.com/book-report-data-structures-and-algorithms-in-python/
- Struktur Data Terbuka di Python
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:
- Repo website flashcards
- Database flashcards saya (lama - 1200 kartu):
- Database flashcards saya (baru - 1800 kartu):
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:
- SQL
- Javascript
- HTML, CSS, dan teknologi front-end lainnya
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:
- C - menggunakan structs dan functions yang mengambil sebuah struct * dan sesuatu yang lain seperti args.
- C++ - tanpa menggunakan built-in types
- C++ - menggunakan built-in types, seperti STL's std::list untuk daftar link
- Python - menggunakan built-in types (untuk terus berlatih Python)
- dan menulis tes untuk memastikan saya melakukannya dengan benar, kadang-kadang hanya menggunakan assert() statements yang sederhana
- Anda mungkin bisa menggunakan Java atau sesuatu yang lain, ini hanyalah pendapat saya.
Anda tidak perlu semua ini. Anda hanya perlu satu bahasa untuk wawancara.
Mengapa meng-kode di semua ini?
- Latihan, latihan, latihan, sampai saya sakit karenanya, dan dapat melakukannya tanpa masalah (beberapa memiliki banyak kasus dan rincian pembukuan untuk diingat)
- Bekerja dalam batasan baku (mengalokasikan/membebaskan memori tanpa bantuan dari sekumpulan sampah (kecuali Python))
- Menggunakan built-in types jadi saya memiliki pengalaman menggunakan alat built-in untuk digunakan di dunia nyata (tidak akan menulis daftar pelaksanaan saya sendiri di produksi)
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
- C ada dimana-mana. Anda akan melihat contoh di buku, lecture, video, di mana-mana saat Anda belajar
- Bahasa Pemrograman C, Vol 2
- Ini adalah buku singkat, tetapi akan memberi Anda pemahaman yang baik tentang bahasa C dan jika Anda mempraktikkannya sedikit, Anda akan segera menjadi mahir. Memahami C membantu Anda memahami bagaimana program dan memori bekerja
- Jawaban atas pertanyaan
-
Bagaimana komputer memproses program:
- Tidak ada yang bisa diterapkan
- Ada banyak video di sini. Cukup tonton sampai Anda memahaminya. Anda selalu dapat kembali dan mengulas
- Jika beberapa kuliah terlalu matematis, Anda dapat melompat ke bawah dan menonton video matematika diskrit untuk mendapatkan pengetahuan latar belakang
- Harvard CS50 - Notasi Asimtotik (video)
- Notasi Big O (tutorial singkat umum) (video)
- Notasi Big O (dan Omega dan Theta) - penjelasan matematika terbaik (video)
- Skiena:
- Pengantar Lembut untuk Analisis Kompleksitas Algoritma
- Orders of Growth (video)
- Asimtotik (video)
- UC Berkeley Big O (video)
- UC Berkeley Big Omega (video)
- Analisis Amortisasi (video)
- Mengilustrasikan "Big O" (video)
- TopCoder (includes recurrence relations and master theorem):
- Cheat sheet
-
- Menerapkan vektor yang mengubah ukuran secara otomatis.
- Deskripsi:
- Array (video)
- UC Berkeley CS61B - Array Linear dan Multi-Dim (video) (Mulailah menonton dari 15m 32s)
- Array Dinamis (video)
- Array Bergerigi (video)
- Menerapkan vektor (array yang bisa berubah dengan ukuran otomatis):
- Berlatih coding menggunakan array dan pointer, dan matematika pointer untuk melompat ke indeks daripada menggunakan pengindeksan.
- Array data mentah baru dengan memori yang dialokasikan
- dapat mengalokasikan array int di bawah tenda, hanya saja tidak menggunakan fitur-fiturnya
- start dengan 16, atau jika angka awal lebih besar, gunakan pangkat 2 - 16, 32, 64, 128
- size() - jumlah item
- capacity() - jumlah barang yang bisa ditampungnya
- is_empty()
- at(index) - mengembalikan item pada indeks tertentu, meledak jika indeks di luar batas
- push(item)
- insert(index, item) - menyisipkan item pada indeks, menggeser nilai indeks dan elemen tambahan ke kanan
- prepend(item) - dapat menggunakan sisipan di atas pada indeks 0
- pop() - hapus dari akhir, nilai kembali
- delete(index) - hapus item pada indeks, menggeser semua elemen tertinggal ke kiri
- remove(item) - mencari nilai dan menghapus indeks yang menahannya (meskipun di banyak tempat)
- find(item) - mencari nilai dan mengembalikan indeks pertama dengan nilai itu, -1 jika tidak ditemukan
- resize(new_capacity) // fungsi pribadi
- saat Anda mencapai kapasitas, ubah ukurannya menjadi dua kali lipat
- saat memunculkan item, jika ukurannya 1/4 dari kapasitas, ubah ukurannya menjadi setengah
- Waktu
- O(1) untuk menambah/menghapus di akhir (diamortisasi untuk alokasi untuk lebih banyak ruang), indeks, atau pembaruan
- O(n) untuk memasukkan/menghapus di tempat lain
- Ruang
- berdekatan dalam memori, jadi kedekatan membantu kinerja
- ruang yang dibutuhkan = (kapasitas array, yaitu >= n)*ukuran item, tetapi meskipun 2n, tetap O(n)
-
- Deskripsi:
- Kode C (video) - bukan keseluruhan video, hanya bagian tentang struct Node dan alokasi memori
- Linked List vs Array:
- mengapa Anda harus menghindari linked list (video)
- Gotcha: Anda perlu pengetahuan pointer ke pointer: (untuk saat Anda meneruskan pointer ke fungsi yang dapat mengubah alamat tempat pointer itu menunjuk) Halaman ini hanya untuk memahami pointer ke pointer. Saya tidak merekomendasikan gaya traversal daftar ini. Keterbacaan dan pemeliharaan menderita karena kepintaran.
- Implementasikan (saya lakukan dengan tail pointer & tanpa):
- size() - mengembalikan jumlah elemen data dalam daftar
- empty() - bool mengembalikan nilai true jika kosong
- value_at(index) - mengembalikan nilai item ke-n (mulai dari 0 untuk yang pertama)
- push_front(value) - menambahkan item ke depan daftar
- pop_front() - hapus item depan dan kembalikan nilainya
- push_back(value) - menambahkan item di akhir
- pop_back() - menghapus item akhir dan mengembalikan nilainya
- front() - dapatkan nilai barang depan
- back() - dapatkan nilai item akhir
- insert(index, value) - masukkan nilai pada indeks, maka item saat ini pada indeks tersebut ditunjuk oleh item baru pada indeks
- erase(index) - menghapus node pada indeks tertentu
- value_n_from_end(n) - mengembalikan nilai node pada posisi ke-n dari akhir daftar
- reverse() - membalikkan daftar
- remove_value(value) - menghapus item pertama dalam daftar dengan nilai ini
- Doubly-linked List
- Deskripsi (video)
- Tidak perlu diimplementasikan
-
- Stack (video)
- Tidak akan diterapkan. Implementasi dengan array itu sepele
-
- Queue (Antrean)
- Queue (video)
- Circular buffer/FIFO
- Implementasikan menggunakan linked-list, dengan tail pointer:
- enqueue(value) - menambah nilai pada posisi di ekor
- dequeue() - mengembalikan nilai dan menghapus elemen yang paling baru ditambahkan (depan)
- empty()
- Menerapkan menggunakan array berukuran tetap:
- enqueue(value) - menambahkan item di akhir penyimpanan yang tersedia
- dequeue() - mengembalikan nilai dan menghapus elemen yang paling baru ditambahkan
- empty()
- full()
- Biaya:
- implementasi yang buruk menggunakan daftar tertaut di mana Anda mengantre di bagian depan dan antrean di bagian ekor akan menjadi O(n) karena Anda memerlukan elemen di sebelah terakhir, menyebabkan traversal penuh setiap dequeue
- enqueue: O(1) (diamortisasi, daftar tertaut dan larik [probing])
- dequeue: O(1) (daftar dan larik tertaut)
- empty: O(1) (daftar dan larik tertaut)
-
-
Video:
-
Kursus Online:
-
Implementasikan dengan array menggunakan probing linier
- hash(k, m) - m adalah ukuran tabel hash
- add(key, value) - jika kunci sudah ada, perbarui nilai
- exists(key)
- get(key)
- remove(key)
-
-
- Pencarian Biner (video)
- Pencarian Biner (video)
- detail
- Implementkan:
- pencarian biner (pada susunan bilangan bulat yang diurutkan)
- pencarian biner menggunakan rekursi
-
- Bits cheat sheet - Anda harus mengetahui banyak pangkat 2 dari (2^1 hingga 2^16 dan 2^32)
- Dapatkan pemahaman yang sangat baik tentang memanipulasi bit dengan: &, |, ^, ~, >>, <<
- Pelengkap 2s dan 1s
- Hitung bit set
- Tukar nilai:
- Nilai mutlak:
-
- Seri: Trees (video)
- konstruksi pohon dasar
- traversal
- algoritma manipulasi
- BFS(breadth-first search) dan DFS(depth-first search) (video)
- Catatan BFS:
- level order (BFS, menggunakan queue)
- kompleksitas waktu: O(n)
- kompleksitas ruang: terbaik: O(1) terburuk: O(n/2)=O(n)
- Catatan DFS:
- kompleksitas waktu: O(n)
- kompleksitas ruang: terbaik: O(log n) - rata-rata. ketinggian tree terburuk: O(n)
- dalam urutan (DFS: kiri, sendiri/self, kanan)
- pasca urutan (DFS: kiri, kanan, sendiri/self)
- pra urutan (DFS: sendiri/self, kiri, kanan)
- Catatan BFS:
-
- Ulasan Binary Search Tree (video)
- Serial (video)
- starts with symbol table and goes through BST applications
- Pendahuluan (video)
- MIT (video)
- C/C++:
- Binary search tree - Implementasi di C/C++ (video)
- Implementasi BST - alokasi memori di stack dan heap (video)
- Temukan min dan max elemen dalam binary search tree (video)
- Temukan ketinggian pohon biner (video)
- Binary tree traversal - strategi luas-pertama dan mendalam-pertama (video)
- Pohon biner: Level Order Traversal (video)
- Binary tree traversal: Preorder, Inorder, Postorder (video)
- Periksa apakah pohon biner adalah binary search tree atau bukan (video)
- Hapus node dari Binary Search Tree (video)
- Penerus Berurutan di binary search tree (video)
- Implementasikan:
- insert // masukkan nilai ke dalam pohon
- get_node_count // dapatkan hitungan nilai yang disimpan
- print_values // mencetak nilai di pohon, dari min hingga maks
- delete_tree
- is_in_tree // mengembalikan nilai true jika nilai yang diberikan ada di pohon
- get_height // mengembalikan tinggi dalam node (tinggi node tunggal adalah 1)
- get_min // mengembalikan nilai minimum yang disimpan di pohon
- get_max // mengembalikan nilai maksimum yang disimpan di pohon
- is_binary_search_tree
- delete_value
- get_successor // mengembalikan nilai tertinggi berikutnya di pohon setelah nilai yang diberikan, -1 jika none
-
- Heap (tumpukan)
- Priority Queue (Prioritas Antrian)
- Binary Heap (Biner Heap)
- divisualisasikan sebagai pohon, tetapi biasanya linier dalam penyimpanan (array, linked list)
- Heap
- Pendahuluan (video)
- Penerapan Naif (video)
- Pohon Biner (video)
- Keterangan Tinggi Pohon (video)
- Operasi Dasar (video)
- Pohon Biner Lengkap (video)
- Pseudocode (video)
- Urutan Heap - lompat untuk memulai (video)
- Urutan Heap (video)
- Membangun heap (video)
- MIT: Heaps dan Heap Sort (video)
- CS 61B Kuliah 24: Antrian Prioritas (video)
- Linear Time BuildHeap (max-heap)
- Menerapkan sebuah max-heap:
- insert
- sift_up - dibutuhkan untuk memasukkan
- get_max - mengembalikan item maksimal, tanpa menghapusnya
- get_size() - mengembalikan jumlah elemen yang disimpan
- is_empty() - mengembalikan nilai true jika heap tidak berisi elemen
- extract_max - mengembalikan item maksimal, menghapusnya
- sift_down - dibutuhkan untuk extract_max
- remove(i) - menghapus item pada indeks i
- heapify - membuat heap dari larik elemen, dibutuhkan untuk heap_sort
- heap_sort() - mengambil array yang tidak disortir dan mengubahnya menjadi array yang diurutkan di tempat menggunakan heap maks atau heap min
-
Catatan:
- Terapkan sort & ketahui kasus terbaik / kasus terburuk, kompleksitas rata-rata masing-masing:
- tidak ada bubble sort - ini mengerikan - O(n^2), kecuali jika n<=16
- Stabilitas dalam algoritme pengurutan ("Apakah Quicksort stabil?")
- Algoritme mana yang dapat digunakan pada linked lists? Yang mana pada array? Yang mana pada keduanya?
- Saya tidak akan merekomendasikan pengurutan linked lists, tetapi penggabungan semacam bisa dilakukan.
- Merge Sort Untuk Linked List
- Terapkan sort & ketahui kasus terbaik / kasus terburuk, kompleksitas rata-rata masing-masing:
-
Untuk heapsort, lihat struktur data Heap di atas. Jenis heap bagus, tapi tidak stabil
-
UC Berkeley:
-
Kode Merge sort:
-
Kode Quick sort:
-
Implementasi:
- Mergesort: O(n log n) rata-rata dan kasus terburuk
- Quicksort: O(n log n) kasus rata-rata
- Sortir seleksi dan sortir penyisipan keduanya merupakan kasus rata-rata O (n ^ 2) dan terburuk
- Untuk heapsort, lihat struktur data Heap di atas
-
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:
- Ada 4 cara dasar untuk merepresentasikan Graf dalam memori:
- objek dan pointer
- matriks kedekatan (adjacency matrix)
- daftar kedekatan (adjacency list)
- peta kedekatan (adjacency map)
- Biasakan diri Anda dengan setiap representasi beserta pro & kontranya
- BFS dan DFS - mengetahui kompleksitas komputasi mereka, trade off mereka, dan bagaimana menerapkannya dalam kode nyata
- Saat ditanya pertanyaan, cari solusi berbasis Graf terlebih dahulu, lalu lanjutkan jika tidak ada
- Ada 4 cara dasar untuk merepresentasikan Graf dalam memori:
-
MIT (video):
-
Kuliah Skiena - pengantar yang bagus:
- CSE373 2012 - Lecture 11 - Graphs Struktur Data (video)
- CSE373 2012 - Lecture 12 - Breadth-First Search (video)
- CSE373 2012 - Lecture 13 - Algoritma Graph (video)
- CSE373 2012 - Lecture 14 - Algoritma Graph (con't) (video)
- CSE373 2012 - Lecture 15 - Algoritma Graph (con't 2) (video)
- CSE373 2012 - Lecture 16 - Algoritma Graph (con't 3) (video)
-
Graphs (ulasan dan lainnya):
- 6.006 Masalah Jalur Terpendek Sumber Tunggal (video)
- 6.006 Dijkstra (video)
- 6.006 Bellman-Ford (video)
- 6.006 Mempercepat Dijkstra (video)
- Aduni: Algoritma Graphs I - Sortasi Topologi, Pohon Rentang Minimum, Algoritma Prim - Kuliah 6 (video)
- Aduni: Algoritma Graphs II - DFS, BFS, Algoritma Kruskal, Struktur Data Union Find - Kuliah 7 (video)
- Aduni: Algoritma Graphs III: Jalur Terpendek - Kuliah 8 (video)
- Aduni: Algoritma Graphs IV: Pengantar algoritma geometris - Kuliah 9 (video)
-
CS 61B 2014 (mulai dari 58:09) (video) - CS 61B 2014: Graphs berbobot (video)
- Algoritma Serakah: Minimum Spanning Tree (video)
- Komponen yang Sangat Terhubung Algoritma Graphs Algoritma Kosaraju (video)
-
Kursus Coursera Penuh:
-
Saya akan menerapkan:
- DFS dengan daftar kedekatan (rekursif)
- DFS dengan daftar adjacency (iteratif dengan stack)
- DFS dengan matriks adjacency (rekursif)
- DFS dengan matriks adjacency (iteratif dengan stack)
- BFS dengan daftar kedekatan
- BFS dengan matriks adjacency
- jalur terpendek sumber tunggal (Dijkstra)
- pohon rentang minimum
- Algoritme berbasis DFS (lihat video Aduni di atas):
- periksa siklus (diperlukan untuk pengurutan topologi, karena kami akan memeriksa siklus sebelum memulai)
- sortir topologi
- menghitung komponen yang terhubung dalam graf
- daftar komponen yang sangat terhubung
- periksa graf bipartit
-
- Kuliah Stanford tentang rekursi dan backtracking:
- Kapan saat yang tepat untuk menggunakannya?
- Bagaimana rekursi ekor lebih baik daripada tidak?
-
- Anda mungkin tidak akan melihat masalah pemrograman dinamis dalam wawancara Anda, tetapi ada baiknya mengenali masalah sebagai kandidat untuk pemrograman dinamis (Dynamic Programming).
- Subjek ini bisa sangat sulit, karena setiap masalah pemecahan masalah pemrograman dinamis harus didefinisikan sebagai relasi rekursi, dan menyelesaikannya bisa rumit.
- Saya sarankan untuk melihat banyak contoh masalah pemrograman dinamis sampai Anda memiliki pemahaman yang kuat tentang pola yang terlibat.
- Video:
- video Skiena mungkin sulit untuk diikuti karena terkadang dia menggunakan papan tulis, yang terlalu kecil untuk dilihat
- Skiena: CSE373 2012 - Kuliah 19 - Pengantar Pemrograman Dinamis (video)
- Skiena: CSE373 2012 - Kuliah 20 - Edit Jarak (video)
- Skiena: CSE373 2012 - Kuliah 21 - Contoh Pemrograman Dinamis (video)
- Skiena: CSE373 2012 - Kuliah 22 - Aplikasi Pemrograman Dinamis (video)
- Simonson: Pemrograman Dinamis 0 (dimulai pada 59:18) (video)
- Simonson: Pemrograman Dinamis I - Kuliah 11 (video)
- Simonson: Pemrograman dinamis II - Kuliah 12 (video)
- Daftar masalah individu Pemrograman Dinamis (masing-masing pendek): Pemrograman Dinamis (video)
- Catatan Kuliah Yale:
- Coursera:
-
- Optional: UML 2.0 seri (video)
- Prinsip SOLID OOP: Prinsip SOLID (video)
-
- Ulasan UML cepat(video)
- Pelajari pola-pola ini:
- strategy
- singleton
- adapter
- prototype
- decorator
- visitor
- factory, abstract factory
- facade
- observer
- proxy
- delegate
- command
- state
- memento
- iterator
- composite
- flyweight
- Bab 6 (Bagian 1) - Patterns (video)
- Bab 6 (Bagian 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (video)
- Bab 6 (Bagian 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (video)
- Serial video (27 video)
- Head First Design Patterns
- Saya tahu buku kanoniknya adalah "Design Patterns: Elements of Reusable Object-Oriented Software", tapi Head First sangat bagus untuk pemula hingga OO.
- Referensi praktis: 101 Pola Desain & Tip untuk Pengembang
-
- Keterampilan Matematika: Bagaimana menemukan Faktorial, Permutasi dan Kombinasi (Pilih) (video)
- Jadikan Sekolah: Probabilitas (video)
- Jadikan Sekolah: Lebih Banyak Kemungkinan dan Rantai Markov (video)
- Khan Academy:
- Tata letak kursus:
- Hanya videonya - 41 (masing-masing sederhana dan masing-masing pendek):
-
- Ketahui tentang kelas paling terkenal dari masalah NP-complete, seperti travelling salesman dan knapsack problem, dan kenali mereka saat pewawancara meminta Anda secara tidak langsung.
- Ketahui arti NP-complete.
- Kompleksitas Komputasi (video)
- Simonson:
- Skiena:
- Kompleksitas: P, NP, NP-completeness, Reductions (video)
- Kompleksitas: Algoritma Perkiraan (video)
- Kompleksitas: Algoritma Parameter Tetap (video)
- Ppeter Norvig membahas solusi yang hampir optimal untuk masalah penjual keliling:
- Halaman 1048 - 1140 di CLRS jika Anda memilikinya.
-
- Ilmu Komputer 162 - Sistem Operasi (25 video):
- untuk proses dan thread lihat video 1-11
- Sistem Operasi dan Pemrograman Sistem (video)
- Apa Perbedaan Antara Proses dan Thread?
- Meliputi:
- Masalah Processes, Threads, Concurrency
- Perbedaan antara proses dan thread
- Processes
- Threads
- Locks
- Mutexes
- Semaphores
- Monitors
- Bagaimana cara kerjanya?
- Deadlock
- Livelock
- Aktivitas CPU, interupsi, pengalihan konteks
- Konstruksi konkurensi modern dengan prosesor multi inti
- Paging, segmentasi, dan memori virtual (video)
- Interrupts (video)
- Kebutuhan resource proses (memori: kode, penyimpanan statis, stack, heap, dan juga deskriptor file, i /o)
- Kebutuhan sumber daya thread (berbagi di atas (dikurangi stack) dengan thread lain dalam proses yang sama tetapi masing-masing memiliki pc, penghitung stack, register, dan stacknya sendiri)
- Forking benar-benar menyalin saat menulis (hanya baca) hingga proses baru menulis ke memori, lalu menyalin penuh.
- Peralihan konteks
- Bagaimana peralihan konteks dimulai oleh sistem operasi dan perangkat keras yang mendasarinya?
- Masalah Processes, Threads, Concurrency
- thread di C ++ (seri - 10 video)
- Konkurensi (Concurrency) dengan Python (video):
- Ilmu Komputer 162 - Sistem Operasi (25 video):
-
- Meliputi:
- bagaimana unit testing bekerja
- apa itu objek tiruan (mock objects)
- apa itu pengujian integrasi (integration testing)
- apa itu dependency injection
- Pengujian Perangkat Lunak Agile dengan James Bach (video)
- Kuliah Terbuka oleh James Bach tentang Pengujian Perangkat Lunak (video)
- Steve Freeman - Pengembangan Berbasis Test (bukan itu yang kami maksudkan) (video)
- Dependency injection:
- Bagaimana menulis tes
- Meliputi:
-
- Di OS, bagaimana cara kerjanya?
- Dapat diperoleh dari video Sistem Operasi
-
- Sedgewick - Suffix Array (video)
- Sedgewick - Pencarian Substring (video)
- Pola pencarian dalam teks (video)
Jika Anda membutuhkan detail lebih lanjut tentang subjek ini, lihat bagian "String Matching" di Detail Tambahan tentang Beberapa Subjek.
-
- Perhatikan bahwa ada berbagai jenis percobaan. Beberapa memiliki prefiks, beberapa tidak, dan beberapa menggunakan bit untuk melacak jalur
- Saya membaca kode, tetapi tidak akan menerapkan
- Sedgewick - Tries (3 video)
- Catatan tentang Struktur Data dan Teknik Pemrograman
- Video kursus singkat:
- Trie: Sebuah Struktur Data Terabaikan
- TopCoder - Menggunakan Tries
- Kuliah Stanford (kasus penggunaan dunia nyata) (video)
- MIT, Advanced Data Structures, Strings (bisa sangat tidak jelas sekitar setengahnya) (video)
-
- Endian Besar Dan Kecil
- Endian Besar Vs Endian Kecil (video)
- Endian Big And Kecil Dalam/Luar (video)
- Pembicaraan yang sangat teknis untuk pengembang kernel. Jangan khawatir jika sebagian besar di atas kepala Anda.
- Paruh pertama sudah cukup.
-
- jika Anda memiliki pengalaman jaringan atau ingin menjadi insinyur keandalan (reliability engineer) atau insinyur operasi (operations engineer), tunggu pertanyaan
- Jika tidak, ini bagus untuk diketahui
- Khan Academy
- UDP dan TCP: Perbandingan Transport Protocols (video)
- TCP / IP dan Model OSI Dijelaskan! (video)
- Transmisi Paket melalui Internet. Tutorial Jaringan & TCP / IP. (video)
- HTTP (video)
- SSL dan HTTPS (video)
- SSL / TLS (video)
- HTTP 2.0 (video)
- Seri Video (21 video) (video)
- Subnetting Demystified - Bagian 5 CIDR Notation (video)
- Socket:
Anda dapat mengharapkan pertanyaan desain sistem jika Anda memiliki pengalaman 4+ tahun.
- Skalabilitas dan Desain Sistem adalah topik yang sangat besar dengan banyak topik dan sumber daya, karena ada banyak hal yang perlu dipertimbangkan saat merancang sistem perangkat lunak / perangkat keras yang dapat diskalakan. Berharap untuk meluangkan sedikit waktu untuk ini
- Pertimbangan:
- Skalabilitas (Scalability)
- Saring kumpulan data besar menjadi nilai tunggal
- Ubah satu kumpulan data ke kumpulan lainnya
- Menangani data dalam jumlah yang sangat besar
- Desain sistem (System design)
- set fitur (features sets)
- antarmuka (interfaces)
- hierarki kelas (class hierarchies)
- merancang sistem di bawah batasan tertentu
- kesederhanaan dan ketahanan (simplicity and robustness)
- pengorbanan (tradeoffs)
- analisis dan pengoptimalan kinerja
- Skalabilitas (Scalability)
- MULAI DI SINI: Primer Desain Sistem
- Desain Sistem dari HiredInTech
- Bagaimana Saya Mempersiapkan Untuk Menjawab Pertanyaan Desain Secara Teknis?
- 8 Hal Yang Perlu Diketahui Sebelum Wawancara Desain Sistem
- Desain algoritme
- Normalisasi Basis Data - 1NF, 2NF, 3NF dan 4NF (video)
- Wawancara Desain Sistem - Ada banyak sumber daya yang satu ini. Lihat artikel dan contoh. Saya taruh beberapa di bawah ini
- Bagaimana menjadi ace wawancara desain sistem
- Nomor yang Harus Diketahui Setiap Orang
- Berapa lama waktu yang dibutuhkan untuk membuat pengalih konteks?
- Transaksi di Seluruh Pusat Data (video)
- Pengantar bahasa Inggris sederhana untuk Teorema CAP
- Algoritma Konsensus:
- Hashing yang Konsisten
- Pola NoSQL
- Skalabilitas:
- Anda tidak membutuhkan semua ini. Pilih saja beberapa yang menarik bagi Anda.
- Tinjauan bagus (video)
- Seri pendek:
- Arsitektur Web yang Skalabel dan Sistem Terdistribusi
- Kekeliruan Komputasi Terdistribusi Dijelaskan
- Teknik Pemrograman Pragmatis
- Jeff Dean - Membangun Sistem Perangkat Lunak di Google dan Pelajaran yang Dipetik (video)
- Pengantar Sistem Arsitek untuk Skala
- Menskalakan game seluler ke audiens global menggunakan App Engine dan Cloud Datastore (video)
- Bagaimana Google Melakukan Rekayasa Skala Planet untuk Infra Skala Planet (video)
- Pentingnya Algoritma
- Sharding
- Scale at Facebook (2012), "Building for a Million Users" (video)
- Teknik untuk Permainan Panjang - Astrid Atkinson Keynote (video)
- 7 Tahun Pelajaran Skalabilitas YouTube Dalam 30 Menit
- Bagaimana PayPal Mengukur Miliaran Transaksi Setiap Hari Hanya Dengan Menggunakan 8VM
- Cara Menghapus Duplikat dalam Kumpulan Data Besar
- Sekilas tentang skala dan budaya teknik Etsy dengan Jon Cowie (video)
- Apa yang Membawa Amazon ke Arsitektur Layanan Mikro Sendiri
- Untuk Mengompresi Atau Tidak Mengompresi, Itu Pertanyaan Uber
- Asyncio Tarantool Queue, Masuk Antrian
- Kapan Perkiraan Pemrosesan Kueri Digunakan?
- Transisi Google Dari Pusat Data Tunggal, Ke Failover, Ke Arsitektur Native Multihomed
- Kunci pas
- Pemrograman Didorong Pembelajaran Mesin: Pemrograman Baru Untuk Dunia Baru
- Teknologi Pengoptimalan Gambar Yang Melayani Jutaan Permintaan Per Hari
- A Patreon Architecture Short
- Tinder: Bagaimana Salah Satu Mesin Rekomendasi Terbesar Memutuskan Siapa yang Akan Anda Lihat Selanjutnya?
- Desain Cache Modern
- Streaming Video Langsung Pada Skala Facebook
- Panduan Pemula Untuk Menskalakan Lebih dari 11 Juta Pengguna di Amazon AWS
- Bagaimana Penggunaan Latensi Efek Docker?
- Tampilan 360 Derajat Dari Seluruh Tumpukan Netflix
- Latensi Ada Di Mana-Mana Dan Itu Membebani Penjualan Anda - Cara Menghancurkannya
- Serverless (sangat lama, hanya perlu intinya)
- What Powers Instagram: Ratusan Instans, Lusinan Teknologi
- Arsitektur Cinchcast - Menghasilkan 1.500 Jam Audio Setiap Hari
- Arsitektur Penyiaran Video Langsung Justin.Tv
- Arsitektur Permainan Sosial Playfish - 50 Juta Pengguna Bulanan Dan Berkembang
- Arsitektur TripAdvisor - 40 Juta Pengunjung, 200 Juta Tampilan Halaman Dinamis, 30 TB Data
- Arsitektur PlentyOfFish
- Arsitektur Salesforce - Bagaimana Mereka Menangani 1,3 Miliar Transaksi Sehari
- Arsitektur ESPN Dalam Skala - Beroperasi pada 100.000 Duh Nuh Nuhs Per Detik
- Lihat cara "Sistem Perpesanan, Serialisasi, dan Antrean" di bawah ini untuk info tentang beberapa teknologi yang dapat merekatkan layanan
- Twitter:
- Untuk informasi lebih lanjut, lihat serial video "Menambang Kumpulan Data Besar-besaran" di bagian Seri Video
- Mempraktikkan proses desain sistem: Berikut adalah beberapa ide untuk dicoba di atas kertas, masing-masing dengan beberapa dokumentasi tentang bagaimana hal itu ditangani di dunia nyata:
- review: Primer Desain Sistem
- Desain Sistem dari HiredInTech
- contekan (cheat sheet)
- aliran:
- Pahami masalah dan cakupannya:
- Tentukan kasus penggunaan, dengan bantuan pewawancara
- Sarankan fitur tambahan
- Hapus item yang dianggap pewawancara di luar jangkauan
- Asumsikan ketersediaan tinggi diperlukan, tambahkan sebagai kasus penggunaan
- Pikirkan tentang kendala:
- Tanyakan berapa banyak permintaan per bulan
- Tanyakan berapa banyak permintaan per detik (mereka mungkin menawarkannya secara sukarela atau meminta Anda menghitungnya)
- Perkirakan persentase membaca vs. menulis
- Ingat aturan 80/20 saat memperkirakan
- Berapa banyak data yang ditulis per detik
- Total penyimpanan yang dibutuhkan selama 5 tahun
- Berapa banyak data yang dibaca per detik
- Desain abstrak:
- Lapisan (layanan, data, caching)
- Infrastruktur: load balancing, perpesanan
- Gambaran kasar tentang algoritme kunci apa pun yang menggerakkan layanan
- Pertimbangkan kemacetan dan tentukan solusinya
- Pahami masalah dan cakupannya:
- Latihan:
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.
- Seri video subjek pendek berdurasi 2-3 menit (23 video)
- Seri video subjek pendek berdurasi 2-5 menit - Michael Sambol (18 video):
- Video Sedgewick - Algoritma I
- Video Sedgewick - Algoritma II
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:
- Pengenalan masalah, dan di mana struktur data dan algoritme yang tepat cocok
- Mengumpulkan persyaratan untuk masalah tersebut
- Berbicara tentang masalah seperti yang akan Anda lakukan dalam wawancara
- Coding di papan tulis atau kertas, bukan di komputer
- Hadir dengan kerumitan ruang dan waktu untuk solusi Anda
- Menguji solusi Anda
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:
- Matematika untuk Topcoders
- Pemrograman Dinamis - Dari Pemula hingga Mahir
- Materi Wawancara MIT
- Latihan untuk menjadi lebih baik pada bahasa tertentu
Baca dan Lakukan Masalah Pemrograman (dalam urutan ini):
- Wawancara Pemrograman Terkena: Rahasia Mendaratkan Pekerjaan Berikutnya Anda, Edisi ke-2
- jawaban di C, C++ dan Java
- Cracking the Coding Interview, Edisi ke-6
- jawaban di Java
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:
- IDeserve (88 video)
- Tushar Roy (5 playlist)
- Super for walkthroughs of problem solutions
- Nick White - LeetCode Solutions (187 Video)
- Good explanations of solution and the code
- You can watch several in a short time
- FisherCoder - Solusi LeetCode
Situs tantangan:
- LeetCode
- My favorite coding problem site. It's worth the subscription money for the 1-2 months you'll likely be preparing
- LeetCode solutions from FisherCoder
- See Nick White Videos above for short code-throughs
- HackerRank
- TopCoder
- InterviewCake
- Geeks for Geeks
- InterviewBit
- Project Euler (math-focused)
- Code Exercises
Situs pembelajaran bahasa, dengan tantangan:
Repo tantangan:
Wawancara Mock:
- Gainlo.co: Mock pewawancara dari perusahaan besar - Saya menggunakan ini dan itu membantu saya bersantai untuk layar ponsel dan wawancara di tempat
- Pramp: Wawancara mengejek dari / dengan teman sebaya - model wawancara praktik peer-to-peer
- Refdash: Wawancara tiruan dan wawancara yang dipercepat - juga membantu kandidat mempercepat dengan melewatkan beberapa wawancara dengan perusahaan teknologi
- interviewing.io: Berlatih wawancara tiruan dengan insinyur senior - wawancara desain algoritme / sistem tanpa nama dengan insinyur senior dari FAANG secara anonim.
- Memecahkan Wawancara Coding 2 Set (video):
- Lihat Lanjutkan item persiapan di Cracking The Coding Interview dan bagian belakang Wawancara Pemrograman Terkena
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.
- Mengapa Anda menginginkan pekerjaan ini?
- Apa masalah sulit yang telah Anda selesaikan?
- Tantangan terbesar yang dihadapi?
- Desain terbaik / terburuk terlihat?
- Ide untuk meningkatkan produk Google yang sudah ada.
- Bagaimana Anda bekerja dengan baik, sebagai individu dan sebagai bagian dari tim?
- Keterampilan atau pengalaman mana yang akan menjadi aset dalam peran tersebut dan mengapa?
- Apa yang paling Anda nikmati di [job x / project y]?
- Apa tantangan terbesar yang Anda hadapi di [pekerjaan x / proyek y]?
- Bug tersulit apa yang Anda hadapi di [pekerjaan x / proyek y]?
- Apa yang Anda pelajari di [pekerjaan x / proyek y]?
- Apa yang akan Anda lakukan lebih baik di [pekerjaan x / proyek y]?
Beberapa milik saya (saya mungkin sudah tahu jawaban tetapi ingin pendapat atau perspektif tim mereka):
- Seberapa besar tim Anda?
- Seperti apa siklus pengembang Anda? Apakah Anda melakukan waterfall / sprint / agile?
- Apakah terburu-buru ke tenggat waktu biasa terjadi? Atau apakah ada fleksibilitas?
- Bagaimana keputusan dibuat dalam tim Anda?
- Berapa banyak pertemuan yang Anda lakukan per minggu?
- Apakah Anda merasa lingkungan kerja membantu Anda berkonsentrasi?
- Apa yang sedang kamu kerjakan?
- Apa yang Anda suka tentang itu?
- Seperti apa kehidupan kerja?
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.
-
- Tua tapi bagus
-
Baris Perintah Linux: Pengantar Lengkap
- Pilihan modern
-
- Pengenalan lembut untuk pola desain
-
Pola Desain: Elemen Perangkat Lunak Object-Oriente yang Dapat Digunakan Kembali
- Alias buku "Gang Of Four", atau GOF
- Buku pola desain kanonik
-
Buku Pegangan Administrasi Sistem UNIX dan Linux, Edisi ke-5
-
Manual Desain Algoritma (Skiena)
- Sebagai review dan pengenalan masalah
- Porsi katalog algoritme jauh di luar cakupan kesulitan yang akan Anda dapatkan dalam wawancara
- Buku ini memiliki 2 bagian:
- Kelas buku teks tentang struktur data dan algoritma
- Kelebihan:
- Merupakan review yang bagus seperti buku teks algoritma apapun
- Cerita bagus dari pengalamannya memecahkan masalah di industri dan akademisi
- Contoh kode di C
- Kekurangan:
- Bisa padat atau tidak bisa ditembus seperti CLRS, dan dalam beberapa kasus, CLRS mungkin menjadi alternatif yang lebih baik untuk beberapa mata pelajaran
- Bab 7, 8, 9 bisa menyakitkan untuk dicoba diikuti, karena beberapa item tidak dijelaskan dengan baik atau membutuhkan lebih banyak otak daripada yang saya miliki
- Jangan salah paham: Saya suka Skiena, gaya mengajarnya, dan tingkah lakunya, tapi saya mungkin bukan materi Stony Brook
- Kelebihan:
- Katalog algoritma:
- Inilah alasan sebenarnya Anda membeli buku ini
- Akan sampai ke bagian ini. Akan memperbarui di sini setelah saya berhasil melewatinya
- Kelas buku teks tentang struktur data dan algoritma
- Bisa menyewanya di kindle
- jawaban:
- Errata
-
Tulis Kode Hebat: Volume 1: Memahami Mesin
- Buku itu diterbitkan pada tahun 2004, dan agak ketinggalan jaman, tetapi merupakan sumber yang hebat untuk memahami komputer secara singkat
- Penulis menemukan HLA, jadi ambillah sebutan dan contoh di HLA dengan sedikit garam. Tidak banyak digunakan, tetapi contoh yang layak tentang seperti apa perakitan itu
- Bab-bab ini layak dibaca untuk memberi Anda dasar yang bagus:
- Bab 2 - Representasi Numerik
- Bab 3 - Aritmatika Biner dan Operasi Bit
- Bab 4 - Representasi Titik Mengambang
- Bab 5 - Representasi Karakter
- Bab 6 - Organisasi Memori dan Akses
- Bab 7 - Tipe Data Komposit dan Objek Memori
- Bab 9 - Arsitektur CPU
- Bab 10 - Arsitektur Set Instruksi
- Bab 11 - Arsitektur dan Organisasi Memori
-
- Penting: Membaca buku ini hanya akan memiliki nilai yang terbatas. Buku ini adalah ulasan yang bagus tentang algoritme dan struktur data, tetapi tidak akan mengajari Anda cara menulis kode yang baik. Anda harus dapat membuat kode solusi yang layak secara efisien
- Alias CLR, terkadang CLRS, karena Stein terlambat ke permainan
-
Arsitektur Komputer, Edisi Keenam: Pendekatan Kuantitatif
- For a richer, more up-to-date (2017), but longer treatment
-
- Beberapa bab pertama menyajikan solusi cerdas untuk masalah pemrograman (beberapa sangat lama menggunakan pita data) tetapi itu hanya intro. Ini adalah buku panduan tentang desain dan arsitektur program
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.
-
- Biasakan diri Anda dengan editor kode berbasis unix
- vi(m):
- emacs:
-
- Khan Academy
- Lebih lanjut tentang proses Markov:
- Lihat lebih lanjut dalam seri Informasi dan Entropi MIT 6.050J di bawah ini
-
- Lihat juga video di bawah ini
- Pastikan untuk menonton video teori informasi terlebih dahulu
- Teori Informasi, Claude Shannon, Entropi, Redundansi, Kompresi Data & Bit (video)
-
- Lihat juga video di bawah ini
- Pastikan untuk menonton video teori informasi terlebih dahulu
- Khan Academy Series
- Kriptografi: Funsgi Hash
- Kriptografi: Enkripsi
-
- Pastikan untuk menonton video teori informasi terlebih dahulu
- Computerphile (video):
- Video Kepala Kompresor
- (opsional) Google Developers Live: GZIP saja tidak cukup!
-
- Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k)
- Filter Bloom (video)
- Filter Bloom | Penambangan Kumpulan Data Besar-besaran | Universitas Stanford (video)
- Tutorial
- Cara Menulis Aplikasi Bloom Filter
-
- Digunakan untuk menentukan kesamaan dokumen
- Kebalikan dari MD5 atau SHA yang digunakan untuk menentukan apakah 2 dokumen / string sama persis
- Simhashing (semoga) menjadi sederhana
-
-
Ketahui setidaknya satu jenis pohon biner yang seimbang (dan ketahui bagaimana implementasinya):
-
"Di antara pohon pencarian seimbang, AVL dan 2/3 trees sekarang sudah ketinggalan zaman, dan red-black trees tampaknya lebih populer. Struktur data pengorganisasian mandiri yang sangat menarik adalah splay trees, yang menggunakan rotasi untuk memindahkan kunci apa pun yang diakses ke root." - Skiena
-
Dari jumlah tersebut, saya memilih untuk menerapkan splay tree. Dari apa yang saya baca, Anda tidak akan menerapkan pohon pencarian seimbang (balanced search tree) dalam wawancara Anda. Tapi saya ingin eksposur ke pengkodean satu dan hadapi saja, splay trees adalah lutut lebah. Saya memang membaca banyak kode red-black tree code
- Splay tree: menyisipkan, mencari, menghapus fungsi Jika Anda akhirnya menerapkan pohon merah / hitam coba ini saja:
- Fungsi pencarian dan penyisipan, melewatkan penghapusan
-
Saya ingin mempelajari lebih lanjut tentang B-Tree karena digunakan secara luas dengan kumpulan data yang sangat besar
-
AVL trees
- Dalam praktek: Dari apa yang saya tahu, ini tidak banyak digunakan dalam praktiknya, tetapi saya bisa melihat di mana mereka akan berada: AVL trees (Pohon AVL) adalah struktur lain yang mendukung pencarian, penyisipan, dan penghapusan O(log n). Ini lebih seimbang daripada red-black trees, menyebabkan penyisipan dan pemindahan lebih lambat tetapi pengambilan lebih cepat. Ini membuatnya menarik untuk struktur data yang dapat dibangun sekali dan dimuat tanpa rekonstruksi, seperti kamus bahasa (atau kamus program, seperti opcode assembler atau interpreter)
- MIT AVL Trees / AVL Sort (video)
- AVL Trees (video)
- Implementasi AVL Tree (video)
- Split Dan Merge
-
Splay trees
- Dalam praktek: Splay trees (pohon bentang) biasanya digunakan dalam implementasi cache, pengalokasi memori, router, pengumpul sampah, kompresi data, tali (pengganti string yang digunakan untuk string teks panjang), di Windows NT (dalam memori virtual, jaringan, dan kode sistem file) dll.
- CS 61B: Splay Trees (video)
- Kuliah MIT: Splay Trees:
- Menjadi sangat matematis, tetapi perhatikan 10 menit terakhir dengan pasti.
- Video
-
Red/black trees
- Ini adalah terjemahan dari sebuah 2-3 tree (lihat dibawah).
- Dalam praktek: Red/black trees (Pohon merah / hitam) menawarkan jaminan kasus terburuk untuk waktu penyisipan, waktu penghapusan, dan waktu pencarian. Hal ini tidak hanya membuatnya berharga dalam aplikasi yang sensitif terhadap waktu seperti aplikasi waktu nyata, tetapi juga menjadikannya sebagai blok bangunan yang berharga dalam struktur data lain yang memberikan jaminan kasus terburuk; sebagai contoh, banyak struktur data yang digunakan dalam geometri komputasi dapat didasarkan pada red/black trees, dan Penjadwal yang Benar-Benar Adil yang digunakan dalam kernel Linux saat ini menggunakan red/black trees. Di Java versi 8, Collection HashMap telah dimodifikasi sedemikian rupa sehingga alih-alih menggunakan LinkedList untuk menyimpan elemen identik dengan kode hash yang buruk, red/black trees digunakan
- Aduni - Algoritma - Kuliah 4 (link lompat ke titik awal) (video)
- Aduni - Algoritma - Kuliah 5 (video)
- Red-Black Tree
- Pengantar Pencarian Biner Dan Red-Black Tree
-
2-3 search trees
- Dalam praktek: 2-3 trees memiliki penyisipan yang lebih cepat dengan mengorbankan pencarian yang lebih lambat (karena ketinggian lebih banyak dibandingkan dengan AVL trees).
- Anda akan sangat jarang menggunakan 2-3 trees karena implementasinya melibatkan berbagai jenis node. Sebaliknya, orang menggunakan red–black trees.
- Intuisi dan Definisi 23-Trees (video)
- Tampilan Biner dari 23-Trees
- 2-3 Trees (pengajian siswa) (video)
-
2-3-4 Trees (aka 2-4 trees)
- Dalam praktek: Untuk setiap 2-4 trees, ada red–black trees yang sesuai dengan elemen data dalam urutan yang sama. Operasi penyisipan dan penghapusan pada 2-4 trees juga setara dengan pembalikan warna dan rotasi pada red–black trees. Hal ini membuat 2-4 trees menjadi alat penting untuk memahami logika di balik red–black trees, dan inilah mengapa banyak teks algoritme pengantar memperkenalkan 2-4 trees tepat sebelum red–black trees, meskipun 2-4 trees tidak sering digunakan dalam praktik.
- CS 61B Kuliah 26: Pohon Pencarian Seimbang (video)
- Bawah Atas 234-Trees (video)
- Atas Bawah 234-Trees (video)
-
N-ary (K-ary, M-ary) trees
- catatan: N atau K adalah faktor percabangan (cabang maks)
- pohon biner adalah pohon 2-ary, dengan faktor percabangan = 2
- 2-3 pohon adalah 3-ary
- K-Ary Tree
-
B-Trees
- Fakta menyenangkan: ini adalah misteri, tetapi B bisa berarti Boeing, Balanced, atau Bayer (co-inventor).
- Dalam praktek: B-Trees banyak digunakan dalam database. Kebanyakan filesystem modern menggunakan B-tree (atau Variants). Sebagai tambahannya penggunaannya dalam database, B-tree juga digunakan dalam sistem file untuk memungkinkan akses acak cepat ke sembarang blokir di file tertentu. Masalah dasarnya adalah mengubah alamat file blok i menjadi blok disk (atau mungkin ke alamat sektor kepala silinder)
- B-Tree
- Struktur Data B-Tree
- Pengantar B-Trees (video)
- Definisi dan Penyisipan B-Tree (video)
- Penghapusan B-Tree (video)
- MIT 6.851 - Model Hirarki Memori (video) - covers cache-oblivious B-Trees, very interesting data structures - the first 37 minutes are very technical, may be skipped (B is block size, cache line size)
-
-
- Bagus untuk menemukan jumlah titik dalam persegi panjang atau objek berdimensi lebih tinggi
- Cocok untuk tetangga terdekat
- Kd Trees (video)
- Algoritma kNN K-d tree (video)
-
-"Ini adalah semacam struktur data kultus" - Skiena
-
- Combination of a binary search tree and a heap
- Treap
- Struktur Data: Penjelasan hierarki (video)
- Aplikasi dalam operasi set
-
- lihat video di bawah ini
-
- Kenapa ML?
- Alat pembelajaran Mesin Cloud Google (video)
- Resep Pembelajaran Mesin Google Developers (Scikit Learn & Tensorflow) (video)
- Tensorflow (video)
- Tutorial Tensorflow
- Panduan Praktis untuk mengimplementasikan Jaringan Neural dengan Python (menggunakan Theano)
- Kursus:
- Kursus pemula yang bagus: Pembelajaran Mesin - video saja - lihat video 12-18 untuk review aljabar linier (14 dan 15 adalah duplikat)
- Jaringan Neural untuk Pembelajaran Mesin
- Nanodegree Deep Learning Google
- Nanodegree Machine Learning Engineer Google / Kaggle
- Nanodegree, Insinyur Mobil Mengemudi Mandiri
- Kursus Online Metis ($99 selama 2 bulan)
- Sumber:
--
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
- Bob Martin SOLID Principles of Object Oriented and Agile Design (video)
- S - Single Responsibility Principle (Prinsip Tanggung Jawab Tunggal) | Tanggung jawab tunggal untuk setiap Objek
- O - Open/Closed Principle (Prinsip Terbuka / Tertutup) | Pada tingkat produksi, Objek siap untuk ekstensi tetapi tidak untuk modifikasi
- L - Liskov Substitution Principle (Prinsip Substitusi Liskov) | Class Dasar dan Class Turunan mengikuti prinsip 'IS A'
- I - Interface segregation principle (Prinsip pemisahan antarmuka) | klien tidak boleh dipaksa untuk mengimplementasikan antarmuka yang tidak mereka gunakan
- D - Dependency Inversion principle (Prinsip Ketergantungan Inversi) | Kurangi dependency dalam komposisi objek.
-
Union-Find
-
Lebih banyak Pemrograman Dinamis (videos)
- 6.006: Pemrograman Dinamis I: Fibonacci, Jalur Terpendek
- 6.006: Pemrograman Dinamis II: Justifikasi Teks, Blackjack
- 6.006: DP III: Tanda kurung, Edit Jarak, Knapsack
- 6.006: DP IV: Guitar Fingering, Tetris, Super Mario Bros.
- 6.046: Pemrograman Dinamis & DP Lanjutan
- 6.046: Pemrograman Dinamis: Jalur Terpendek Semua Pasangan
- 6.046: Pemrograman Dinamis (pengkajian siswa)
-
Pemrosesan Graph Lanjutan (video)
-
MIT Probabilitas (matematika, dan lakukan perlahan, yang bagus untuk hal-hal matematika) (video):
-
Pencocokan String
- Rabin-Karp (videos):
- Knuth-Morris-Pratt (KMP):
- Algoritma pencarian string Boyer – Moore
- Coursera: Algoritma pada String
- dimulai dengan baik, tetapi pada saat melewati KMP, hal itu menjadi lebih rumit dari yang seharusnya
- penjelasan yang bagus tentang percobaan
- bisa dilewati
-
Penyortiran
- Kuliah Stanford tentang penyortiran:
- Shai Simonson, Aduni.org:
- Steven Skiena memberi kuliah tentang 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)
- Suka makalah klasik?
- 1978: Mengkomunikasikan Proses Berurutan
- 2003: Sistem Berkas Google
- digantikan oleh Colossus pada tahun 2012
- 2004: MapReduce: Pemrosesan Data yang Disederhanakan pada Kluster Besar
- kebanyakan digantikan oleh Cloud Dataflow?
- 2006: Bigtable: Sistem Penyimpanan Terdistribusi untuk Data Terstruktur
- 2006: Layanan Chubby Lock untuk Sistem Terdistribusi yang Dirangkai Secara Longgar
- 2007: Dynamo: Toko Nilai Kunci Amazon yang Sangat Tersedia
- Makalah Dynamo memulai revolusi NoSQL
- 2007: Yang Harus Diketahui Setiap Programmer Tentang Memori (sangat panjang, dan penulis mendorong untuk melewatkan beberapa bagian)
- 2010: Dapper, Infrastruktur Pelacakan Sistem Terdistribusi Skala Besar
- 2010: Dremel: Analisis Interaktif Kumpulan Data Skala Web
- 2012: Colossus Google
- kertas tidak tersedia
- 2012: AddressSanitizer: A Fast Address Sanity Checker:
- 2013: Spanner: Google’s Globally-Distributed Database:
- 2014: Pembelajaran Mesin: Kartu Kredit Berbunga Tinggi dari Hutang Teknis
- 2015: Continuous Pipelines di Google
- 2015: Ketersediaan Tinggi dalam Skala Besar: Membangun Infrastruktur Data Google untuk Iklan
- 2015: TensorFlow: Machine Learning Skala Besar pada Sistem Terdistribusi Heterogen
- 2015: Bagaimana Pengembang Menelusuri Kode: Studi Kasus
- 2016: Borg, Omega, dan Kubernetes
Terjemahan Bahasa Indonesia dipersembahkan oleh