This is a fork of a study plan for going from web developer (self-taught, no CS degree) to Google (Google-level) software engineer.
-
Articles:
- http://www.google.com/about/careers/lifeatgoogle/hiringprocess/
- http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
- all the things he mentions that you need to know are listed below
- (very dated) http://dondodge.typepad.com/the_next_big_thing/2010/09/how-to-get-a-job-at-google-interview-questions-hiring-process.html
- http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions
-
Additional (not suggested by Google but I added):
- https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4
- https://medium.com/always-be-coding/four-steps-to-google-without-a-degree-8f381aa6bd5e#.asalo1vfx
- https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1
- http://www.kpcb.com/blog/lessons-learned-how-google-thinks-about-hiring-management-and-culture
- http://www.coderust.com/blog/2014/04/10/effective-whiteboarding-during-programming-interviews/
- http://alexbowe.com/failing-at-google-interviews/
- A Gentle Introduction to Algorithm Complexity Analysis: http://discrete.gr/complexity/
- TopCoder (includes recurrence relations and master theorem):
- Computational Complexity: Section 2: https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-2/
- Cheat sheet: http://bigocheatsheet.com/
- Logarithms: http://tutorial.math.lamar.edu/Classes/Alg/LogFunctions.aspx#ExpLog_Log_Ex1_a
- [х] Combinatorics: https://www.topcoder.com/community/data-science/data-science-tutorials/basics-of-combinatorics/
- Probability theory basics
- Learn definitions https://arbital.com/p/probability/
- Statistics basics
- Linear algebra basics
- Trigonometry basics
- Calculus basics
- Good info source: https://courses.cs.washington.edu/courses/cse326/00wi/handouts.html
-
- Description:
-
- Description: http://openbookproject.net/thinkcs/python/english3e/queues.html
- Write an implementation of the Priority Queue ADT using a linked list. You should keep the list sorted so that removal is a constant time operation. Compare the performance of this implementation with the Python list implementation.
-
- http://www.linuxjournal.com/content/hash-tables%E2%80%94theory-and-practice
- https://www.cs.auckland.ac.nz/~jmor159/PLDS210/niemann/s_has.htm
- Implement stuff from here http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html
- implement with array using linear probing
- hash(k, m) - m is size of hash table
- add(key, value) - if key already exists, update value
- exists(key)
- get(key)
- remove(key)
- Very good: http://interactivepython.org/runestone/static/pythonds/index.html
- Mandatory: http://openbookproject.net/thinkcs/python/english3e
- Tad bit more advanced (but the best of three) http://interactivepython.org/runestone/static/pythonds/index.html
-
- https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search
- Implement:
- binary search using recursion
-
- http://interactivepython.org/runestone/static/pythonds/Trees/toctree.html
- basic tree construction
- traversal
- DFS (depth-first search)
- notes: time complexity: O(n) space complexity: best: O(log n) - avg. height of tree worst: O(n)
- inorder (DFS: left, self, right)
- postorder (DFS: left, right, self)
- preorder (DFS: self, left, right)
-
- http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html
- Implement:
- insert // insert value into tree
- get_node_count // get count of values stored
- print_values // prints the values in the tree, from min to max
- delete_tree
- is_in_tree // returns true if given value exists in the tree
- delete_value
- get_successor // returns next-highest value in tree after given value
-
- visualized as a tree, but is usually linear in storage (array, linked list)
- http://interactivepython.org/runestone/static/pythonds/Trees/BinaryHeapImplementation.html
- Implement a min-heap:
- MinHeap() creates a new, empty, binary heap.
- put(k) adds a new item to the heap.
- find_min() returns the item with the minimum key value, leaving item in the heap.
- del_min() returns the item with the minimum key value, removing the item from the heap.
- is_empty() returns true if the heap is empty, false otherwise.
- len() returns the number of items in the heap.
- _from_list(list) builds a new heap from a list of keys.
- heap_sort() - take an unsorted array and turn it into a sorted array in-place using a min heap - not implement, just read
-
- Know least one type of balanced binary tree (and know how it's implemented):
- Red/black trees - just read on them
-
stability in sorting algorithms ("Is Quicksort stable?")
-
For heapsort, see Heap data structure above. Heap sort is great, but not stable.
-
http://interactivepython.org/runestone/static/pythonds/SortSearch/toctree.html
- Bubble sort - no need to implement
- Selection sort - no need to implement
- Insertion sort - no need to implement
- Merge sort - implement
- Quick sort - implement
Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.
-
Notes from Yegge:
- There are three basic ways to represent a graph in memory:
- objects and pointers
- matrix
- adjacency list
- Familiarize yourself with each representation and its pros & cons
- BFS and DFS - know their computational complexity, their tradeoffs, and how to implement them in real code
- When asked a question, look for a graph-based solution first, then move on if none.
- There are three basic ways to represent a graph in memory:
-
Graphs (review and more):
-
Read on:
- http://interactivepython.org/runestone/static/pythonds/Graphs/TopologicalSorting.html
- http://interactivepython.org/runestone/static/pythonds/Graphs/StronglyConnectedComponents.html
- http://interactivepython.org/runestone/static/pythonds/Graphs/ShortestPathProblems.html - Important
- http://interactivepython.org/runestone/static/pythonds/Graphs/PrimsSpanningTreeAlgorithm.html
-
Implement:
-
DFS with adjacency list (recursive)
-
http://interactivepython.org/runestone/static/pythonds/Graphs/ImplementingKnightsTour.html - I am pretty sure code from here is wrong
-
http://interactivepython.org/runestone/static/pythonds/Graphs/GeneralDepthFirstSearch.html
-
BFS with adjacency list
-
http://interactivepython.org/runestone/static/pythonds/Graphs/DijkstrasAlgorithm.html
-
-
Problems:
-
- how is tail recursion better than not?
-
- Intro https://www.codechef.com/wiki/tutorial-dynamic-programming
- http://www.geeksforgeeks.org/dynamic-programming-set-3-longest-increasing-subsequence/
- https://www.hackerearth.com/practice/algorithms/dynamic-programming/2-dimensional/tutorial/
- Knapsack http://www.thelearningpoint.net/computer-science/algorithms-dynamic-programming---the-integer-knapsack-problem
- Longest common subsequence http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/
- REDO once more competent http://www.geeksforgeeks.org/dynamic-programming-set-12-longest-palindromic-subsequence/
- REDO once more competent http://www.geeksforgeeks.org/dynamic-programming-set-8-matrix-chain-multiplication/
- Coin change problem http://www.algorithmist.com/index.php/Coin_Change
- https://www.hackerrank.com/challenges/fibonacci-modified
- Not really DP - https://www.hackerrank.com/challenges/stockmax
- https://www.hackerrank.com/challenges/play-game
- https://www.hackerrank.com/challenges/red-john-is-back
- https://www.hackerrank.com/challenges/strplay
- Began solving, got stuck. Inspect stolen solution in python file! https://www.hackerrank.com/challenges/equal
- https://www.hackerearth.com/practice/notes/dynamic-programming-i-1/
- Final read https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/
- Loads of problems: http://www.geeksforgeeks.org/fundamentals-of-algorithms/#DynamicProgramming
-
- Know about the most famous classes of NP-complete problems, such as traveling salesman and the knapsack problem, and be able to recognize them when an interviewer asks you them in disguise.
- Know what NP-complete means.
- http://stackoverflow.com/questions/1857244/what-are-the-differences-between-np-np-complete-and-np-hard/1857342#1857342
- http://stackoverflow.com/questions/1857244/what-are-the-differences-between-np-np-complete-and-np-hard/19510170#19510170
- https://www.quora.com/How-do-you-explain-NP-Complete-and-NP-hard-to-a-child
-
- https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread
- Covers:
- Processes, Threads, Concurrency issues
- difference between processes and threads
- processes
- threads
- locks
- mutexes
- semaphores
- monitors
- how they work
- deadlock
- livelock
- CPU activity, interrupts, context switching
- Modern concurrency constructs with multicore processors
- Process resource needs (memory: code, static storage, stack, heap, and also file descriptors, i/o)
- Thread resource needs (shares above (minus stack) with other threads in same process but each has its own pc, stack counter, registers and stack)
- Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy.
- Context switching
- How context switching is initiated by the operating system and underlying hardware
- Processes, Threads, Concurrency issues
- concurrency in Python:
Scalability and System Design are very large topics with many topics and resources, since there is a lot to consider when designing a software/hardware system that can scale. Expect to spend quite a bit of time on this.
- Considerations from Yegge:
- scalability
- Distill large data sets to single values
- Transform one data set to another
- Handling obscenely large amounts of data
- system design
- features sets
- interfaces
- class hierarchies
- designing a system under certain constraints
- simplicity and robustness
- tradeoffs
- performance analysis and optimization
- scalability
- START HERE: System Design from HiredInTech: http://www.hiredintech.com/system-design/
- https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023
- 8 Things You Need to Know Before a System Design Interview: http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/
- Algorithm design: http://www.hiredintech.com/algorithm-design/
- Database Normalization - 1NF, 2NF, 3NF and 4NF
- https://github.com/checkcheckzz/system-design-interview - There are a lot of resources in this one. Look through the articles and examples. I put some of them below.
- How to ace a systems design interview: http://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/
- Numbers Everyone Should Know: http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/
- How long does it take to make a context switch?: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
- Transactions Across Datacenters
- A plain english introduction to CAP Theorem: http://ksat.me/a-plain-english-introduction-to-cap-theorem/
- Paxos Consensus algorithm:
- https://en.wikipedia.org/wiki/Object-oriented_programming
- https://tproger.ru/translations/oop-principles-cheatsheet/
- SOLID OOP Principles:
- Additional on solid:
- http://codebetter.com/raymondlewallen/2005/07/19/4-major-principles-of-object-oriented-programming/
- https://habrahabr.ru/post/87205/
- OOP in Python:
- DRY
- KISS
- YAGNI
- Общие советы http://makedev.org/principles/general.html
- Scalability:
- Short series:
- http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones
- http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database
- http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache
- http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism
- Scalable Web Architecture and Distributed Systems: http://www.aosabook.org/en/distsys.html
- Fallacies of Distributed Computing Explained: https://pages.cs.wisc.edu/~zuyu/files/fallacies.pdf
- Pragmatic Programming Techniques: http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html
- extra: Google Pregel Graph Processing: http://horicky.blogspot.com/2010/07/google-pregel-graph-processing.html
- Introduction to Architecting Systems for Scale: http://lethain.com/introduction-to-architecting-systems-for-scale/
- Twitter:
- Timelines at Scale: https://www.infoq.com/presentations/Twitter-Timeline-Scalability
- For even more, see "Mining Massive Datasets" video series in the Video Series section.
- Short series:
- Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
- review: System Design from HiredInTech: http://www.hiredintech.com/system-design/
- cheat sheet: https://github.com/jwasham/google-interview-university/blob/master/extras/cheat%20sheets/system-design.pdf
- flow:
- Understand the problem and scope:
- define the use cases, with interviewer's help
- suggest additional features
- remove items that interviewer deems out of scope
- assume high availability is required, add as a use case
- Think about constraints:
- ask how many requests per month
- ask how many requests per second (they may volunteer it or make you do the math)
- estimate reads vs. writes percentage
- keep 80/20 rule in mind when estimating
- how much data written per second
- total storage required over 5 years
- how much data read per second
- Abstract design:
- layers (service, data, caching)
- infrastructure: load balancing, messaging
- rough overview of any key algorithm that drives the service
- consider bottlenecks and determine solutions
- Understand the problem and scope:
- Exercises:
- Design a CDN network: old article: http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci
- Design a random unique ID generation system: https://blog.twitter.com/2010/announcing-snowflake
- Design an online multiplayer card game: http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html
- Design a key-value database: http://www.slideshare.net/dvirsky/introduction-to-redis
- Design a function to return the top k requests during past time interval: https://icmi.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf
- Design a picture sharing system: http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html
- Design a recommendation system: http://ijcai13.org/files/tutorial_slides/td3.pdf
- Design a URL-shortener system: copied from above: http://www.hiredintech.com/system-design/the-system-design-process/
- Design a cache system: https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets: http://www.joelonsoftware.com/articles/Unicode.html
- What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text http://kunststube.net/encoding/
- To cover:
- how unit testing works
- what are mock objects
- what is integration testing
- what is dependency injection
- Steve Freeman - Test-Driven Development (that’s not what we meant): https://vimeo.com/83960706
- TDD is dead. Long live testing.: http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.htmlg
- Test-Driven Web Development with Python: http://www.obeythetestinggoat.com/pages/book.html#toc
- Dependency injection:
- How to write tests: http://jasonpolites.github.io/tao-of-testing/ch4-1.1.html
- https://sourcemaking.com/design_patterns
- Learn these patterns:
- builder
- strategy https://sourcemaking.com/design_patterns/strategy
- singleton https://sourcemaking.com/design_patterns/singleton/python/1
- adapter https://sourcemaking.com/design_patterns/adapter
- decorator
- visitor
- factory, abstract factory https://sourcemaking.com/design_patterns/abstract_factory
- bridge - need to rehearse
- facade
- observer https://sourcemaking.com/design_patterns/observer
- command https://sourcemaking.com/design_patterns/command
- state https://sourcemaking.com/design_patterns/state
- memento https://sourcemaking.com/design_patterns/memento
- iterator https://sourcemaking.com/design_patterns/iterator
- composite
- Good overview of different python features and some design patterns https://www.toptal.com/python/python-design-patterns
- https://github.com/faif/python-patterns
- http://python-3-patterns-idioms-test.readthedocs.io/en/latest/PatternConcept.html
- MVC
- http://reinout.vanrees.org/weblog/2011/12/13/django-mvc-explanation.html
- http://djangobook.com/model-view-controller-design-pattern/
- https://docs.djangoproject.com/en/1.11/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names
- https://community.modeanalytics.com/sql/tutorial/introduction-to-sql/
- https://sqlbolt.com/
- SELECT
- Update
- Insert
- Create, Alter, Drop table
- Subquery
- Union, intersection
- https://docs.microsoft.com/en-us/sql/relational-databases/databases/contained-databases
- https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user
- https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-login
- https://docs.microsoft.com/en-us/sql/relational-databases/databases/databases
- User-Schema separation https://msdn.microsoft.com/en-us/library/ms190387(v=sql.105).aspx
- https://msdn.microsoft.com/en-us/library/aa337545(v=sql.105).aspx
- https://msdn.microsoft.com/en-us/library/dd207005(v=sql.105).aspx
- https://msdn.microsoft.com/en-us/library/aa337562(v=sql.105).aspx
- Metaclasses, with django ORM example https://habrahabr.ru/post/145835/
- How web works introduction, continues on web sockets and async http://mrjoes.github.io/2013/06/21/python-realtime.html
- solve all : http://pyobject.ru/blog/2010/02/04/python-quiz/
- Solutions 1 https://habrahabr.ru/post/145369/
- Solutions 2 https://habrahabr.ru/post/147783/
- data types, etc
- functions
- iterators
- modules
- classes
- metaclasses and descriptors
- https://habrahabr.ru/post/50026/
- https://habrahabr.ru/post/132554/
- I dont understand at all, I need some pipe prequesites http://www.python-course.eu/pipes.php
- http://www.python-course.eu/sys_module.php
- http://www.python-course.eu/exception_handling.php
- https://habrahabr.ru/post/193890/
Currently here
- Tour of Go
- Basics
- Methods and interfaces - currently covered up to readers
- Concurrency
- https://gobyexample.com/
- Exercism tasks http://exercism.io/languages/go/about
-
Core JS - Estimated completition time: 3 days.
- rehearse lang basics https://javascript.info/
- https://javascript.info/async
- Great stuff on promises! https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
-
VueJS
- https://vuejs.org/v2/guide/
- Essentials
- Transitions
- Reusability and composition
- Tooling
- https://vuejs.org/v2/guide/
-
NodeJS
-
Testing
- http://www.typescriptlang.org/docs/handbook/interfaces.html#toc-handbook
- http://www.typescriptlang.org/docs/handbook/basic-types.html
- http://www.typescriptlang.org/docs/handbook/variable-declarations.html
- http://www.typescriptlang.org/docs/handbook/interfaces.html
- Read up to Advanced techniques - http://www.typescriptlang.org/docs/handbook/classes.html
- https://www.typescriptlang.org/docs/handbook/generics.html
- Read about half of it https://www.typescriptlang.org/docs/handbook/advanced-types.html
- https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html
- https://www.typescriptlang.org/docs/handbook/modules.html
- http://www.rabbitmq.com/tutorials/tutorial-three-javascript.html
- http://www.rabbitmq.com/tutorials/tutorial-four-javascript.html
- http://www.rabbitmq.com/tutorials/tutorial-five-javascript.html
- https://facundoolano.wordpress.com/2016/06/26/real-world-rpc-with-rabbitmq-and-node-js/
- Overview http://elliot.land/post/docker-explained-simply
- Parts 1-5 https://docs.docker.com/get-started/
- Great guide, not only for Docker, but for all web system design https://github.com/docker/labs/tree/master/12factor
- https://blog.docker.com/2017/09/microsoft-sql-on-docker-ee/
-
http://docs.ansible.com/ansible/latest/intro_getting_started.html
-
http://docs.ansible.com/ansible/latest/playbooks_variables.html
-
Extras:
- Apt
- dpkg
- Tar https://www.computerhope.com/unix/utar.htm
- Cat http://www.linfo.org/cat.html
- Setup gitlab using ansible and docker image https://www.djouxtech.net/posts/gitlab-installation-with-ansible-and-docker/
- A well-written guide, explains all steps and settings
- Good ansible playbook organization
- https://stackoverflow.com/questions/145131/whats-the-best-strategy-for-unit-testing-database-driven-applications?rq=1
- BEST PRACTICE for integration testing with Docker, amazing! https://hharnisc.github.io/2016/06/19/integration-testing-with-docker-compose.html
- [ ]
- Understand your azure spending https://www.petri.com/understand-your-microsoft-azure-spending
- https://social.msdn.microsoft.com/Forums/en-US/8c6372b6-a707-49a2-867e-5c93105ac3e8/azure-vm-updownrunning-monitoring-and-alerting?forum=WAVirtualMachinesforWindows
-
Improving my code quality
-
Improving system architecture quality
-
Improving my work ethic and approaches
Read first:
- Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition: http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html
Read second (recommended by many, but not in Google coaching docs):
- Cracking the Coding Interview, 6th Edition:
- http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/
- If you see people reference "The Google Resume", it was a book replaced by "Cracking the Coding Interview".
Where you will be in 5 years and other stuff
- Not a lot of detail, but a broad range of topics http://www.programmerinterview.com
Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.
- Great intro (copied from System Design section): Algorithm design: http://www.hiredintech.com/algorithm-design/
- http://www.javaprobs.com/
- http://algorithms.tutorialhorizon.com/
- LeetCode: https://leetcode.com/
- Project Euler (math-focused): https://projecteuler.net/index.php?section=problems
- Codility: https://codility.com/programmers/
- InterviewCake: https://www.interviewcake.com/
- InterviewBit: https://www.interviewbit.com/invite/icjf
- Codewars: https://www.codewars.com/
- Exercises for getting better at a given language: http://exercism.io/languages
- http://www.codefool.org/wiki_165/index.php?title=Google_Interview_Questions - primarily use as a source of topics to study
- http://haseebq.com/my-ten-rules-for-negotiating-a-job-offer/
- http://haseebq.com/how-not-to-bomb-your-offer-negotiation/