#Coding Interview University >Επίσημη έκδοση: [Αγγλικά](https://github.com/jwasham/coding-interview-university/blob/master/README.md) ## Τι είναι Είναi το πλάνο διαβάσματός μου για να γίνω από web developer (αυτοδίδακτος, χωρίς πτυχίο στην Επιστήμη των Υπολογιστών), μηχανικός λογισμικού για μία μεγάλη εταιρία. ![Coding at the whiteboard - from HBO's Silicon Valley](https://dng5l3qzreal6.cloudfront.net/2016/Aug/coding_board_small-1470866369118.jpg) Αυτό το έργο προορίζεται για νέους μηχανικούς λογισμικού ή για αυτούς που μεταβαίνουν από την ανάπτυξη λογισμικού/ιστοσελίδων στην τεχνολογία λογισμικού(εκεί που η γνώση για την επιστήμη των υπολογιστών ειναι προαπαιτούμενο). Αν έχεις αρκετά χρόνια εμπειρίας και αξιώνεις πολλά χρόνια εμπερίας στην τεχνολογία λογισμικού, πρέπει να περιμένεις μία δυσκολότερη συνέντευξη. Εάν έχεις αρκετά χρόνια εμπειρίας στην ανάπτυξη λογισμικού/ιστοσελίδων, σημείωσε ότι οι μεγάλες εταιρίες λογισμικού όπως οι Google, Amazon, Facebook και Microsoft βλέπουν την τεχνολογία λογισμικού ως ενα διαφορετικό κομμάτι από την ανάπτυξη λογισμικού/ιστοσελίδων, και απαιτούν γνώσεις πάνω στην επιστήμη υπολογιστών. Εάν θέλεις να είσαι ένας αξιόπιστος μηχανικός ή μηχανικός συστημάτων, διάβασε περισσότερο απο την προεραιτική λίστα(δίκτυα, ασφάλεια). --- # Πίνακας περιεχομένων - [Τι είναι](#Tι-είναι) - [Γιατί να το χρησιμοποιήσεις](#Γιατί-να-το-χρησιμοποιήσεις) - [Πώς να το χρησιμοποιήσεις](#Πώς-να-το-χρησιμοποιήσεις) - [Μη νιώθεις ανίκανος](#Μη-νιώθεις-ανίκανος) - [Σχετικά με τα βίντεο](#Σχετικά-με-τα-βίντεο) - [Διαδικασία Συνέντευξης & Γενική προετοιμασία συνέντευξης](#Διαδικασία-Συνέντευξης--Γενική-προετοιμασία-συνέντευξης) - [Pick One Language for the Interview](#Διάλεξε-μία-γλώσσα-για-τη-συνέντευξη) - [Book List](#Λίστα-βιβλίων) - [Before you Get Started](#before-you-get-started) - [What you Won't See Covered](#what-you-wont-see-covered) - [Prerequisite Knowledge](#prerequisite-knowledge) - [The Daily Plan](#the-daily-plan) - [Algorithmic complexity / Big-O / Asymptotic analysis](#algorithmic-complexity--big-o--asymptotic-analysis) - [Data Structures](#data-structures) - [Arrays](#arrays) - [Linked Lists](#linked-lists) - [Stack](#stack) - [Queue](#queue) - [Hash table](#hash-table) - [More Knowledge](#more-knowledge) - [Binary search](#binary-search) - [Bitwise operations](#bitwise-operations) - [Trees](#trees) - [Trees - Notes & Background](#trees---notes--background) - [Binary search trees: BSTs](#binary-search-trees-bsts) - [Heap / Priority Queue / Binary Heap](#heap--priority-queue--binary-heap) - balanced search trees (general concept, not details) - traversals: preorder, inorder, postorder, BFS, DFS - [Sorting](#sorting) - selection - insertion - heapsort - quicksort - merge sort - [Graphs](#graphs) - directed - undirected - adjacency matrix - adjacency list - traversals: BFS, DFS - [Even More Knowledge](#even-more-knowledge) - [Recursion](#recursion) - [Dynamic Programming](#dynamic-programming) - [Object-Oriented Programming](#object-oriented-programming) - [Design Patterns](#design-patterns) - [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability) - [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms) - [Caches](#caches) - [Processes and Threads](#processes-and-threads) - [Papers](#papers) - [Testing](#testing) - [Scheduling](#scheduling) - [Implement system routines](#implement-system-routines) - [String searching & manipulations](#string-searching--manipulations) - [Tries](#tries) - [Floating Point Numbers](#floating-point-numbers) - [Unicode](#unicode) - [Endianness](#endianness) - [Networking](#networking) - [System Design, Scalability, Data Handling](#system-design-scalability-data-handling) (if you have 4+ years experience) - [Final Review](#final-review) - [Coding Question Practice](#coding-question-practice) - [Coding exercises/challenges](#coding-exerciseschallenges) - [Once you're closer to the interview](#once-youre-closer-to-the-interview) - [Your Resume](#your-resume) - [Be thinking of for when the interview comes](#be-thinking-of-for-when-the-interview-comes) - [Have questions for the interviewer](#have-questions-for-the-interviewer) - [Once You've Got The Job](#once-youve-got-the-job) ---------------- Everything below this point is optional ---------------- - [Additional Books](#additional-books) - [Additional Learning](#additional-learning) - [Compilers](#compilers) - [Emacs and vi(m)](#emacs-and-vim) - [Unix command line tools](#unix-command-line-tools) - [Information theory](#information-theory) - [Parity & Hamming Code](#parity--hamming-code) - [Entropy](#entropy) - [Cryptography](#cryptography) - [Compression](#compression) - [Computer Security](#computer-security) - [Garbage collection](#garbage-collection) - [Parallel Programming](#parallel-programming) - [Messaging, Serialization, and Queueing Systems](#messaging-serialization-and-queueing-systems) - [A*](#a) - [Fast Fourier Transform](#fast-fourier-transform) - [Bloom Filter](#bloom-filter) - [HyperLogLog](#hyperloglog) - [Locality-Sensitive Hashing](#locality-sensitive-hashing) - [van Emde Boas Trees](#van-emde-boas-trees) - [Augmented Data Structures](#augmented-data-structures) - [N-ary (K-ary, M-ary) trees](#n-ary-k-ary-m-ary-trees) - [Balanced search 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](#k-d-trees) - [Skip lists](#skip-lists) - [Network Flows](#network-flows) - [Disjoint Sets & Union Find](#disjoint-sets--union-find) - [Math for Fast Processing](#math-for-fast-processing) - [Treap](#treap) - [Linear Programming](#linear-programming) - [Geometry, Convex hull](#geometry-convex-hull) - [Discrete math](#discrete-math) - [Machine Learning](#machine-learning) - [Additional Detail on Some Subjects](#additional-detail-on-some-subjects) - [Video Series](#video-series) - [Computer Science Courses](#computer-science-courses) --- ## Γιατί να το χρησιμοποιήσεις Όταν άρχισα αυτό το πρότζεκτ, δεν ήξερα τη διαφορά μίας στοίβας από μία ουρά, δεν ήξερα τίποτα σχετικά με τον συμβολισμό Big-Ο, τίποτα σχετικά με τα δέντρα ή πως να διασχίσω ένα δέντρο. Εάν έπρεπε να γράψω σε κώδικα έναν αλγόριθμο ταξινόμησης, μπορώ να σου πω ότι δεν θα ήταν πολύ καλός. Κάθε δομή δεδομένων που είχα χρησιμοποιήσει ήταν πακέτο της γλώσσας, και δεν ήξερα καθόλου πως δούλευαν "κάτω από το καπό". Ποτέ δεν είχα να διαχειριστώ τη μνήμη εκτός εάν μία διεργασία που έτρεχα, μου επέστρεφε ένα σφάλμα του τύπου: "out of memory", και μετά έπρεπε να βρώ μία λύση. Έχω χρησιμοποιήσει μερικούς πολυδιάστατους πίνακες στη ζωή μου και χιλιάδες συναφείς πίνακες, αλλά δεν είχα δημιουργήσει δομές δεδομένων από το 0. Είναι ένα μακροπρόθεσμο πλάνο. Μπορεί να σου πάρει μήνες. Εάν είσαι οικείος με πολλά από αυτά ήδη, θα σου πάρει πολύ λιγότερο χρόνο. ## Πώς να το χρησιμοποιήσεις Οτιδήποτε παρακάτω είναι μία συνοπτική περιγραφή, και πρέπει να τα καταλάβεις από την αρχή μέχρι το τέλος. Χρησιμοποιώ τη χαρακτηρηστική markdown γλώσσα του Github, σεμπεριλαμβανομένων και των tasks lists για να ελέγχω την εξέλιξη του πρότζεκτ. **Δημιούργησε ένα καινούργιο branch [x]** Κάνε fork το branch και ακολούθησε τις παρακάτω εντολές `git checkout -b progress` `git remote add jwasham https://github.com/jwasham/coding-interview-university` `git fetch --all` Μάρκαρε όλα τα κουτιά με X αφού ολοκληρώσεις τις αλλαγές `git add . ` `git commit -m "Marked x" ` `git rebase jwasham/master ` `git push --force ` [Περισσότερα σχετικά με την Github-flavored markdown](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) ## Μη νιώθεις ανίκανος - Οι επιτυχυμένοι μηχανικοί λογισμικού είναι έξυπνοι, αλλά πολλοί έχουν την ανασφάλεια ότι δεν είναι αρκετά έξυπνοι. - [The myth of the Genius Programmer](https://www.youtube.com/watch?v=0SARbwvhupQ) - [It's Dangerous to Go Alone: Battling the Invisible Monsters in Tech](https://www.youtube.com/watch?v=1i8ylq4j_EY) ## Σχετικά με τα βίντεο Μερικά βίντεο είναι διαθέσιμα μόνο κάνοντας εγγραφή σε μία Coursera, EdX, or Lynda.com τάξη. Αυτές καλούνται MOOCs. Μερικές φορές οι τάξεις δεν είναι διαθέσιμες, έτσι πρέπει να περιμένεις 1-2 μήνες, έτσι ώστε να αποκτήσεις πρόσβαση. Τα μαθήματα του Lynada.com δεν είναι δωρεάν. Θα εκτιμούσα τη βοήθεια σου να προσθέσεις δωρεάν και πάντοτε-διαθέσιμες ανοικτές πηγές, όπως βίντεο από το Youtube να συνοδεύσουν τα online μαθήματα βίντεο. Μου αρέσει να χρησιμοποιώ πανεπιστημιακές διαλέξεις. ## Διαδικασία Συνέντευξης & Γενική προετοιμασία συνέντευξης - [ ] [ABC: Always Be Coding](https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4) - [ ] [Whiteboarding](https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1) - [ ] [Αποτελεσματικό Whiteboarding κατά τη διάρκεια των Programming Interviews](http://www.coderust.com/blog/2014/04/10/effective-whiteboarding-during-programming-interviews/) - [ ] [Demystifying Tech Recruiting](https://www.youtube.com/watch?v=N233T0epWTs) - [ ] Cracking The Coding Interview Set 1: - [ ] [Gayle L McDowell - Cracking The Coding Interview (video)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ) - [ ] [Cracking the Coding Interview with Author Gayle Laakmann McDowell (video)](https://www.youtube.com/watch?v=aClxtDcdpsQ) - [ ] How to Get a Job at the Big 4: - [ ] [How to Get a Job at the Big 4 - Amazon, Facebook, Google & Microsoft (video)](https://www.youtube.com/watch?v=YJZCUhxNCv8) - [ ] Μαθήματα προετοιμασίας: - [ ] [Software Engineer Interview Unleashed (paid course)](https://www.udemy.com/software-engineer-interview-unleashed): - Learn how to make yourself ready for software engineer interviews from a former Google interviewer. - [ ] [Python for Data Structures, Algorithms, and Interviews! (paid course)](https://www.udemy.com/python-for-data-structures-algorithms-and-interviews/): - A Python centric interview prep course which covers data structures, algorithms, mock interviews and much more. ## Διάλεξε μία γλώσσα για τη συνέντευξη Μπορείς να χρησιμοποιήσεις μία γλώσσα με την οποία είσαι άνετος για να κάνεις το προγραμματιστικό κομμάτι της συνέντευξης, αλλά για τις μεγάλες εταιρίες, υπάρχουν ατόφιες επιλογές: - C++ - Java - Python Μπορείς, επίσης, να χρησιμοποιήσεις αυτές, αλλά διάβασε γύρω από αυτό πρώτα. Μπορεί να υπάρχουν προειδοποιήσεις: - Javascript - Ruby Πρέπει να είσαι πολύ εξοικιωμένος με τη γλώσσα και γνώστης. Διάβασε περισσότερα σχετικά με τις παραπάνω επιλογές: - http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/ - http://blog.codingforinterviews.com/best-programming-language-jobs/ [Βρες πόρους για τη γλώσσα εδώ](programming-language-resources.md) Θα δείς λίγη γνώση σχετικά με τις C, C++ και Python να περιέχεται παρακάτω, επείδη μαθαίνω. Υπάρχουν μερικά εμπλεκόμενα βιβλία, δες το κάτω μέρος. ## Λίστα βιβλίων - [ ] [Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition](http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html) - απαντήσεις στην C++ και στην Java - αυτό είναι ένα καλό ζέσταμα για να είσαι άριστος/η στο Coding Interview - όχι τόσο δύσκολο, τα περισσότερα προβλήματα ίσως είναι ευκολότερα από ότι θα δείς στην συνέντευξη (από αυτά που έχω διαβάσει) - [ ] [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/) - απαντήσεις στην Java Εάν έχεις αρκετό ελεύθερο χρόνο: - [ ] [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) - [ ] [Elements of Programming Interviews (Java version)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/) ### Αρχιτεκτονική Υπολογιστών Αν έχεις λίγο χρόνο: - [ ] [Write Great Code: Volume 1: Understanding the Machine](https://www.amazon.com/Write-Great-Code-Understanding-Machine/dp/1593270038) - Το βιβλίο δημοσιεύτηκε το 2004, και είναι λίγο απαρχεωμένο, αλλά είναι ένας υπέροχος πόρος για να κατανοήσεις έναν υπολογιστή εν συντομία. - Ο συγγραφέας εφηύρε το HLA, έτσι μην παίρνεις τις αναφορές του και παραδείγματά του για το HLA, τοις μετρητοίς. - Αυτά τα κεφάλαια αξίζουν το διάβασμα για να σου δώσουν ισχυρά θεμέλια: - Chapter 2 - Numeric Representation - Chapter 3 - Binary Arithmetic and Bit Operations - Chapter 4 - Floating-Point Representation - Chapter 5 - Character Representation - Chapter 6 - Memory Organization and Access - Chapter 7 - Composite Data Types and Memory Objects - Chapter 9 - CPU Architecture - Chapter 10 - Instruction Set Architecture - Chapter 11 - Memory Architecture and Organization Αν έχεις αρκετό χρόνο (Το θέλω αυτό το βιβλίο): - [ ] [Computer Architecture, Fifth Edition: A Quantitative Approach](https://www.amazon.com/dp/012383872X/) - Για μία πλουσιότερη, περισσότερο ενημερωμένη (2011), αλλά εκτενέστερη αντιμετώπιση ### Συγκεκριμένη γλώσσα **Θα πρέπει να επιλέξεις μία γλώσσα για τη συνέντευξη (δες παραπάνω).** Εδώ είναι οι προτάσεις μου ανά γλώσσα. Δεν έχω τους πόρους για όλες τις γλώσσες. Καλοδεχούμενες οι προσθήκες. Εάν διαβάσεις μία από αυτές, θα πρέπει να έχεις όλη την γνώση σχετικά με δομές δεδομένων και αλγόριθμους που θα χρειαστείς για να αρχίσεις να λύνεις προβλήματα προγραμματισμού. **Μπορείς να παραλείψεις όλες τα βίντεο-διαλέξεις που περιέχονται σε αυτό το πρότζεκτ**, εκτός εάν θέλεις να κάνεις μία ανασκόπηση. [Επιπρόσθετοι πόροι που αφορούν συγκεκριμένες γλώσσες εδώ.](programming-language-resources.md) ### C++ Δεν έχω διαβάσει αυτά τα δύο, αλλά έχουν λάβει υψηλές αξιολογήσεις και έχουν γραφτεί από τον Sedgewick. Είναι φοβερός. - [ ] [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/) - [ ] [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/) Εάν έχεις μία καλύτερη πρόταση για τη C++, παρακαλώ ενημέρωσέ με. Ψάχνοντας για έναν περιεκτικό πόρο. ### Java - [ ] [Αλγόριθμοι σε Java(Sedgewick)](http://www.skroutz.gr/books/142957.%CE%91%CE%BB%CE%B3%CF%8C%CF%81%CE%B9%CE%B8%CE%BC%CE%BF%CE%B9-%CF%83%CE%B5-Java.html) - Διδάσκεται στο Τμήμα Πληροφορικής του Οικονομικού Πανεπιστημίου Αθηνών - βιντεο με το περιεχόμενο του βιβλίου (and Sedgewick!): - [Algorithms I](https://www.youtube.com/user/algorithmscourses/playlists?view=50&sort=dd&shelf_id=2) - [Algorithms II](https://www.youtube.com/user/algorithmscourses/playlists?shelf_id=3&view=50&sort=dd) Ή: - [ ] [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/) - by Goodrich, Tamassia, Goldwasser - used as optional text for CS intro course at UC Berkeley - see my book report on the Python version below. This book covers the same topics. ### Python - [ ] [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/) - by Goodrich, Tamassia, Goldwasser - I loved this book. It covered everything and more. - Pythonic code - my glowing book report: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/ ### Προαιρετικά Βιβλία **Ορισμένοι συστήνουν αυτά, αλλά το παρακάνουν, εκτός εάν έχεις πολλά χρόνια εμπειρίας και περιμένεις μία δυσκολότερη συνέντευξη:** - [ ] [Algorithm Design Manual](http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) (Skiena) - As a review and problem recognition - The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview. - This book has 2 parts: - class textbook on data structures and algorithms - pros: - is a good review as any algorithms textbook would be - nice stories from his experiences solving problems in industry and academia - code examples in C - cons: - can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects - chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have - don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material. - algorithm catalog: - this is the real reason you buy this book. - about to get to this part. Will update here once I've made my way through it. - Can rent it on kindle - Half.com is a great resource for textbooks at good prices. - Answers: - [Solutions](http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition)) - [Solutions](http://blog.panictank.net/category/algorithmndesignmanualsolutions/page/2/) - [Errata](http://www3.cs.stonybrook.edu/~skiena/algorist/book/errata) - [ ] [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844) - **Important:** Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently. - Half.com is a great resource for textbooks at good prices. - aka CLR, sometimes CLRS, because Stein was late to the game - [ ] [Programming Pearls](http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880) - The first couple of chapters present clever solutions to programming problems (some very old using data tape) but that is just an intro. This a guidebook on program design and architecture, much like Code Complete, but much shorter. - ~~"Algorithms and Programming: Problems and Solutions" by Shen~~ - A fine book, but after working through problems on several pages I got frustrated with the Pascal, do while loops, 1-indexed arrays, and unclear post-condition satisfaction results. - Would rather spend time on coding problems from another book or online coding problems.