plan.txt 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. ##########################################################################################
  2. ## How to read this
  3. ##########################################################################################
  4. Everything below is an outline, and you should tackle the items in order from top to bottom.
  5. I put an asterisk/star (*) at the beginning of a line when I'm done with it. When all sub-items are done,
  6. I put a * at the top level, meaning the entire block is done. Sorry you have to remove all my *
  7. to use this the same way. If you search/replace, there are a couple of places to look out for.
  8. Sometimes I just put a * at top level if I know I've done all the subtasks, to cut down on * clutter.
  9. ##########################################################################################
  10. ## Interview Prep:
  11. ##########################################################################################
  12. * - Videos:
  13. * - https://www.youtube.com/watch?v=oWbUtlUhwa8&feature=youtu.be
  14. * - https://www.youtube.com/watch?v=qc1owf2-220&feature=youtu.be
  15. * - https://www.youtube.com/watch?v=8npJLXkcmu8
  16. * - Articles:
  17. * - http://www.google.com/about/careers/lifeatgoogle/hiringprocess/
  18. * - http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
  19. - all the things he mentions that you need to know are listed below
  20. * - (very dated) http://dondodge.typepad.com/the_next_big_thing/2010/09/how-to-get-a-job-at-google-interview-questions-hiring-process.html
  21. * - http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions
  22. * - Additional (not suggested by Google but I added):
  23. * - https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4
  24. * - https://medium.com/always-be-coding/four-steps-to-google-without-a-degree-8f381aa6bd5e#.asalo1vfx
  25. * - https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1
  26. * - http://www.kpcb.com/blog/lessons-learned-how-google-thinks-about-hiring-management-and-culture
  27. * - http://www.coderust.com/blog/2014/04/10/effective-whiteboarding-during-programming-interviews/
  28. * - Cracking The Coding Interview Set 1:
  29. * - https://www.youtube.com/watch?v=rEJzOhC5ZtQ
  30. * - https://www.youtube.com/watch?v=aClxtDcdpsQ
  31. * - How to Get a Job at the Big 4:
  32. * - https://www.youtube.com/watch?v=YJZCUhxNCv8
  33. ##########################################################################################
  34. ## Knowledge:
  35. ##########################################################################################
  36. This short section were prerequisites/interesting info I wanted to learn before getting started on the daily plan.
  37. You need to know C, C++, or Java to do the coding part of the interview.
  38. They will sometimes make an exception and let you use Python or some other language, but the language
  39. must be mainstream and allow you write your code low-level enough to solve the problems.
  40. You'll see some C, C++ learning included below.
  41. There are a few books involved, see the bottom.
  42. Some videos are available only by enrolling in a Coursera or EdX class. It is free to do so.
  43. * - how computers process a program:
  44. * - https://www.youtube.com/watch?v=42KTvGYQYnA
  45. * - https://www.youtube.com/watch?v=Mv2XQgpbTNE
  46. * - how floating point numbers are stored:
  47. * - simple 8-bit: http://math.stackexchange.com/questions/301435/fractions-in-binary
  48. * - 32 bit: https://www.youtube.com/watch?v=ji3SfClm8TU
  49. * - 64 bit: https://www.youtube.com/watch?v=50ZYcZebIec
  50. * - Computer Arch Intro:
  51. (first video only - interesting but not required) https://www.youtube.com/watch?v=zLP_X4wyHbY&list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq&index=1
  52. * - C
  53. * - K&R C book (ANSI C)
  54. * - Clang: https://www.youtube.com/watch?v=U3zCxnj2w8M
  55. * - GDB:
  56. - https://www.youtube.com/watch?v=USPvePv1uzE
  57. - https://www.youtube.com/watch?v=y5JmQItfFck
  58. - Valgrind: https://www.youtube.com/watch?v=fvTsFjDuag8
  59. - C++
  60. * - basics
  61. * - pointers
  62. * - functions
  63. * - references
  64. * - templates
  65. * - compilation
  66. * - scope & linkage
  67. * - namespaces
  68. * - OOP
  69. * - STL
  70. * - functors: http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html
  71. * - C++ at Google: https://www.youtube.com/watch?v=NOCElcMcFik
  72. * - Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html
  73. * - Google uses clang-format (there is a command line "style" argument: -style=google)
  74. * - Efficiency with Algorithms, Performance with Data Structures: https://youtu.be/fHNmRkzxHWs
  75. - C++ Core Guidelines: http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
  76. - review of C++ concepts: https://www.youtube.com/watch?v=Rub-JsjMhWY
  77. * - compilers:
  78. * - https://class.coursera.org/compilers-004/lecture/1
  79. * - https://class.coursera.org/compilers-004/lecture/2
  80. * - C++: https://www.youtube.com/watch?v=twodd1KFfGk
  81. * - Understanding Compiler Optimization (C++): https://www.youtube.com/watch?v=FnGCDLhaxKU
  82. ----------------------------------------------------------------
  83. The Daily Plan:
  84. Each subject does not require a whole day to be able to understand it fully, and you can do multiple of these in a day.
  85. Each day I take one subject from the list below, watch videos about that subject, and write an implementation in:
  86. C - using structs and functions that take a struct * and something else as args.
  87. C++ - without using built-in types
  88. C++ - using built-in types, like STL's std::list for a linked list
  89. Python - using built-in types (to keep practicing Python)
  90. and write tests to ensure I'm doing it right, sometimes just using simple assert() statements
  91. You may do Java or something else, this is just my thing.
  92. Why code in all of these?
  93. Practice, practice, practice, until I'm sick of it, and can do it with no problem (some have many edge cases and bookkeeping details to remember)
  94. Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python))
  95. Make use of built-in types so I have experience using the built-in tools for real-world use (not going to write my own linked list implementation in production)
  96. I may not have time to do all of these for every subject, but I'll try.
  97. You don't need to memorize the guts of every algorithm.
  98. Write code on a whiteboard, not a computer. Test with some sample inputs.
  99. Then test it out on a computer to make sure it's not buggy from syntax.
  100. ----------------------------------------------------------------
  101. * - Before you get started:
  102. The myth of the Genius Programmer: https://www.youtube.com/watch?v=0SARbwvhupQ
  103. Google engineers are smart, but many have an insecurity that they aren't smart enough.
  104. * - Algorithmic complexity / Big O / Asymptotic analysis
  105. - nothing to implement
  106. - Harvard CS50 - Asymptotic Notation: https://www.youtube.com/watch?v=iOq5kSKqeR4
  107. - Big O Notations (general quick tutorial) - https://www.youtube.com/watch?v=V6mKVRU1evU
  108. - Big O Notation (and Omega and Theta) - best mathematical explanation:
  109. - https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN
  110. - Skiena:
  111. - video: https://www.youtube.com/watch?v=gSyDMtdPNpU&index=2&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b
  112. - slides: http://www3.cs.stonybrook.edu/~algorith/video-lectures/2007/lecture2.pdf
  113. - A Gentle Introduction to Algorithm Complexity Analysis: http://discrete.gr/complexity/
  114. - Orders of Growth: https://class.coursera.org/algorithmicthink1-004/lecture/59
  115. - Asymptotics: https://class.coursera.org/algorithmicthink1-004/lecture/61
  116. - UC Berkeley Big O: https://youtu.be/VIS4YDpuP98
  117. - UC Berkeley Big Omega: https://youtu.be/ca3e7UVmeUc
  118. - Amortized Analysis: https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN
  119. - Illustrating "Big O": https://class.coursera.org/algorithmicthink1-004/lecture/63
  120. - Cheat sheet: http://bigocheatsheet.com/
  121. * - Arrays: (Implement an automatically resizing vector)
  122. * - Description:
  123. - Arrays: https://www.coursera.org/learn/data-structures/lecture/OsBSF/arrays
  124. - Arrays: https://www.lynda.com/Developer-Programming-Foundations-tutorials/Basic-arrays/149042/177104-4.html
  125. - Multi-dim: https://www.lynda.com/Developer-Programming-Foundations-tutorials/Multidimensional-arrays/149042/177105-4.html
  126. - Dynamic Arrays: https://www.coursera.org/learn/data-structures/lecture/EwbnV/dynamic-arrays
  127. - Jagged: https://www.lynda.com/Developer-Programming-Foundations-tutorials/Jagged-arrays/149042/177106-4.html
  128. - Resizing arrays:
  129. - https://class.coursera.org/algs4partI-010/lecture/19
  130. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Resizable-arrays/149042/177108-4.html
  131. * - Implement a vector (mutable array with automatic resizing):
  132. * - Practice coding using arrays and pointers, and pointer math to jump to an index instead of using indexing.
  133. * - new raw data array with allocated memory
  134. - can allocate int array under the hood, just not use its features
  135. - start with 16, or if starting number is greater, use power of 2 - 16, 32, 64, 128
  136. * - size() - number of items
  137. * - capacity() - number of items it can hold
  138. * - is_empty()
  139. * - at(index) - returns item at given index, blows up if index out of bounds
  140. * - push(item)
  141. * - insert(index, item) - inserts item at index, shifts that index's value and trailing elements to the right
  142. * - prepend(item) - can use insert above at index 0
  143. * - pop() - remove from end, return value
  144. * - delete(index) - delete item at index, shifting all trailing elements left
  145. * - remove(item) - looks for value and removes index holding it (even if in multiple places)
  146. * - find(item) - looks for value and returns first index with that value, -1 if not found
  147. * - resize(new_capacity) // private function
  148. - when you reach capacity, resize to double the size
  149. - when popping an item, if size is 1/4 of capacity, resize to half
  150. * - Time
  151. - O(1) to add/remove at end (amortized for allocations for more space), index, or update
  152. - O(n) to insert/remove elsewhere
  153. * - Space
  154. - contiguous in memory, so proximity helps performance
  155. - space needed = (array capacity, which is >= n) * size of item, but even if 2n, still O(n)
  156. * - Linked Lists
  157. * - Description:
  158. * - https://www.coursera.org/learn/data-structures/lecture/kHhgK/singly-linked-lists
  159. * - Lynda.com:
  160. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Introduction-lists/149042/177115-4.html
  161. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Understanding-basic-list-implementations/149042/177116-4.html
  162. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-singly-doubly-linked-lists/149042/177117-4.html
  163. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/List-support-across-languages/149042/177118-4.html
  164. * - C Code: https://www.youtube.com/watch?v=QN6FPiD0Gzo
  165. - not the whole video, just portions about Node struct and memory allocation.
  166. * - Linked List vs Arrays:
  167. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/rjBs9/core-linked-lists-vs-arrays
  168. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/QUaUd/in-the-real-world-lists-vs-arrays
  169. * - why you should avoid linked lists:
  170. - https://www.youtube.com/watch?v=YQs6IC-vgmo
  171. * - Gotcha: you need pointer to pointer knowledge:
  172. (for when you pass a pointer to a function that may change the address where that pointer points)
  173. This page is just to get a grasp on ptr to ptr. I don't recommend this list traversal style. Readability and maintainability suffer due to cleverness.
  174. - https://www.eskimo.com/~scs/cclass/int/sx8.html
  175. * - implement (I did with tail pointer & without):
  176. * - size() - returns number of data elements in list
  177. * - empty() - bool returns true if empty
  178. * - value_at(index) - returns the value of the nth item (starting at 0 for first)
  179. * - push_front(value) - adds an item to the front of the list
  180. * - pop_front() - remove front item and return its value
  181. * - push_back(value) - adds an item at the end
  182. * - pop_back() - removes end item and returns its value
  183. * - front() - get value of front item
  184. * - back() - get value of end item
  185. * - insert(index, value) - insert value at index, so current item at that index is pointed to by new item at index
  186. * - erase(index) - removes node at given index
  187. * - value_n_from_end(n) - returns the value of the node at nth position from the end of the list
  188. * - reverse() - reverses the list
  189. * - remove_value(value) - removes the first item in the list with this value
  190. * - Doubly-linked List
  191. - Description: https://www.coursera.org/learn/data-structures/lecture/jpGKD/doubly-linked-lists
  192. - No need to implement
  193. * - Stacks
  194. * - https://www.coursera.org/learn/data-structures/lecture/UdKzQ/stacks
  195. * - https://class.coursera.org/algs4partI-010/lecture/18
  196. * - https://class.coursera.org/algs4partI-010/lecture/19
  197. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-stacks-last-first-out/149042/177120-4.html
  198. * - Will not implement. Implementing with array is trivial.
  199. * - Queues
  200. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-queues-first-first-out/149042/177122-4.html
  201. * - https://class.coursera.org/algs4partI-010/lecture/20
  202. * - https://www.coursera.org/learn/data-structures/lecture/EShpq/queue
  203. * - Circular buffer/FIFO: https://en.wikipedia.org/wiki/Circular_buffer
  204. * - https://class.coursera.org/algs4partI-010/lecture/23
  205. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Priority-queues-deques/149042/177123-4.html
  206. * - Implement using linked-list, with tail pointer:
  207. - enqueue(value) - adds value at position at tail
  208. - dequeue() - returns value and removes least recently added element (front)
  209. - empty()
  210. * - Implement using fixed-sized array:
  211. - enqueue(value) - adds item at end of available storage
  212. - dequeue() - returns value and removes least recently added element
  213. - empty()
  214. - full()
  215. * - Cost:
  216. - a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n)
  217. because you'd need the next to last element, causing a full traversal each dequeue
  218. enqueue: O(1) (linked list and array)
  219. dequeue: O(1) (linked list and array)
  220. empty: O(1) (linked list and array)
  221. Hash tables
  222. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Understanding-hash-functions/149042/177126-4.html
  223. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-hash-tables/149042/177127-4.html
  224. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Supporting-hashing/149042/177128-4.html
  225. * - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Language-support-hash-tables/149042/177129-4.html
  226. * - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/m7UuP/core-hash-tables
  227. * - https://www.youtube.com/watch?v=C4Kc8xzcA68
  228. * - https://class.coursera.org/algs4partI-010/lecture/52
  229. * - https://class.coursera.org/algs4partI-010/lecture/53
  230. * - https://class.coursera.org/algs4partI-010/lecture/55
  231. * - https://class.coursera.org/algs4partI-010/lecture/56
  232. * - https://www.coursera.org/learn/data-structures/home/week/3
  233. * - https://www.coursera.org/learn/data-structures/lecture/NYZZP/phone-book-problem
  234. * - distributed hash tables:
  235. - https://www.coursera.org/learn/data-structures/lecture/DvaIb/instant-uploads-and-storage-optimization-in-dropbox
  236. - https://www.coursera.org/learn/data-structures/lecture/tvH8H/distributed-hash-tables
  237. * - MIT:
  238. https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8
  239. https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb
  240. https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb
  241. - implement with array using linear probing
  242. - add(key, value)
  243. - exists(key)
  244. - get(key)
  245. - remove(key)
  246. - upsert(key, value) - adds key if it doesn't exist, or updates value if it does
  247. Tries
  248. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries
  249. Disjoint Sets:
  250. - https://www.coursera.org/learn/data-structures/lecture/JssSY/overview
  251. - https://www.coursera.org/learn/data-structures/lecture/EM5D0/naive-implementations
  252. - https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees
  253. - https://www.coursera.org/learn/data-structures/lecture/qb4c2/union-by-rank
  254. - https://www.coursera.org/learn/data-structures/lecture/Q9CVI/path-compression
  255. - https://www.coursera.org/learn/data-structures/lecture/GQQLN/analysis-optional
  256. Heap (data structure):
  257. - https://en.wikipedia.org/wiki/Heap_(data_structure)
  258. - https://www.coursera.org/learn/data-structures/lecture/2OpTs/introduction
  259. - https://www.coursera.org/learn/data-structures/lecture/z3l9N/naive-implementations
  260. - https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees
  261. - https://www.coursera.org/learn/data-structures/supplement/S5xxz/tree-height-remark
  262. - https://www.coursera.org/learn/data-structures/lecture/0g1dl/basic-operations
  263. - https://www.coursera.org/learn/data-structures/lecture/gl5Ni/complete-binary-trees
  264. - https://www.coursera.org/learn/data-structures/lecture/HxQo9/pseudocode
  265. - see: https://class.coursera.org/algs4partI-010/lecture
  266. - https://class.coursera.org/algs4partI-010/lecture/39
  267. Priority Queue
  268. - https://en.wikipedia.org/wiki/Priority_queue
  269. * - Parity & Hamming Code:
  270. Parity:
  271. https://www.youtube.com/watch?v=DdMcAUlxh1M
  272. Hamming Code:
  273. https://www.youtube.com/watch?v=1A_NcXxdoCc
  274. https://www.youtube.com/watch?v=JAMLuxdHH8o
  275. Error Checking:
  276. https://www.youtube.com/watch?v=wbH2VxzmoZk
  277. Bit operations
  278. - http://graphics.stanford.edu/~seander/bithacks.html
  279. - count on bits
  280. - https://youtu.be/Hzuzo9NJrlc
  281. - max run of on/off bits
  282. - bit shifting
  283. Binary search
  284. Sorting
  285. - stability in sorting algorithms:
  286. - http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms
  287. - http://www.geeksforgeeks.org/stability-in-sorting-algorithms/
  288. - Which algorithms can be used on linked lists? Which on arrays? Which on both? Is Quicksort stable?
  289. - Implement & know best case/worst case, average complexity of each:
  290. - mergesort
  291. - quicksort
  292. - insertion sort
  293. - selection sort
  294. - no bubble sort - it's terrible at O(n^2)
  295. Caches
  296. - LRU cache
  297. Binary trees:
  298. - https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees
  299. Binary Heap:
  300. Min Heap / Max Heap
  301. Trees
  302. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/ovovP/core-trees
  303. - see: https://class.coursera.org/algs4partI-010/lecture
  304. - basic tree construction
  305. - traversal
  306. - manipulation algorithms
  307. - Binary search trees: BSTs
  308. - https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction
  309. - applications:
  310. - https://class.coursera.org/algs4partI-010/lecture/57
  311. - n-ary trees
  312. - trie-trees
  313. - at least one type of balanced binary tree (and know how it's implemented):
  314. - red/black tree
  315. - https://class.coursera.org/algs4partI-010/lecture/50
  316. - splay trees
  317. - https://www.coursera.org/learn/data-structures/lecture/O9nZ6/splay-trees
  318. - AVL trees
  319. - https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees
  320. - https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation
  321. - https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge
  322. - 2-3 Search Trees
  323. - https://class.coursera.org/algs4partI-010/lecture/49
  324. - B-Trees:
  325. - https://class.coursera.org/algs4partI-010/lecture/51
  326. - BFS (breadth-first search)
  327. - DFS (depth-first search)
  328. - know the difference between
  329. - inorder
  330. - postorder
  331. - preorder
  332. Graphs:
  333. There are three basic ways to represent a graph in memory:
  334. - objects and pointers
  335. - matrix
  336. - adjacency list
  337. - familiarize yourself with each representation and its pros & cons
  338. - BFS and DFS - know their computational complexity, their tradeoffs, and how to implement them in real code
  339. - If you get a chance, try to study up on fancier algorithms:
  340. - Dijkstra's algorithm
  341. - https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
  342. - A*
  343. - https://en.wikipedia.org/wiki/A*_search_algorithm
  344. - when asked a question, look for a graph-based solution first, then move on if none.
  345. Other data structures:
  346. - You should study up on as many other data structures and algorithms as possible
  347. - You should especially know about the most famous classes of NP-complete problems, such as traveling salesman
  348. and the knapsack problem, and be able to recognize them when an interviewer asks you them in disguise.
  349. - Know what NP-complete means.
  350. Recursion
  351. - when it is appropriate to use it
  352. open-ended problems
  353. - manipulate strings
  354. - manipulate patterns
  355. design patterns:
  356. - description:
  357. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Foundations-Programming-Design-Patterns/135365-2.html
  358. - strategy
  359. - singleton
  360. - adapter
  361. - prototype
  362. - decorator
  363. - visitor
  364. - factory
  365. Combinatorics (n choose k)
  366. Probability
  367. Dynamic Programming
  368. Operating Systems (25 videos):
  369. - https://www.youtube.com/watch?v=-KWd_eQYLwY&index=2&list=PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c
  370. Covers:
  371. Processes, Threads, Concurrency issues
  372. - difference
  373. - threads:
  374. https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M
  375. - stopped here: https://www.youtube.com/watch?v=_N0B5ua7oN8&list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M&index=4
  376. - locks
  377. - mutexes
  378. - semaphores
  379. - monitors
  380. - how they work
  381. - deadlock
  382. - livelock
  383. CPU activity, interrupts, context switching
  384. Modern concurrency constructs with multicore processors
  385. Process resource needs (memory: code, static storage, stack, heap, and also file descriptors, i/o)
  386. Thread resource needs (shares above with other threads in same process but each has its own pc, stack counter, registers and stack)
  387. Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy.
  388. Context switching
  389. - How context switching is initiated by the operating system and underlying hardware
  390. Scheduling
  391. Weighted random sampling
  392. Implement system routines
  393. Distill large data sets to single values
  394. Transform one data set to another
  395. Handling obscenely large amounts of data
  396. System design:
  397. - features sets
  398. - interfaces
  399. - class hierarchies
  400. - designing a system under certain constraints
  401. - simplicity and robustness
  402. - tradeoffs
  403. Performance analysis and optimization
  404. Familiarize yourself with unix-based souped-up code editor: emacs & vi(m)
  405. vi(m):
  406. - https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr
  407. - set of 4:
  408. - https://www.youtube.com/watch?v=SI8TeVMX8pk
  409. - https://www.youtube.com/watch?v=F3OO7ZIOaJE
  410. - https://www.youtube.com/watch?v=ZYEccA_nMaI
  411. - https://www.youtube.com/watch?v=1lYD5gwgZIA
  412. emacs:
  413. - https://www.youtube.com/watch?v=hbmV1bnQ-i0
  414. - set of 3:
  415. - https://www.youtube.com/watch?v=ujODL7MD04Q
  416. - https://www.youtube.com/watch?v=XWpsRupJ4II
  417. - https://www.youtube.com/watch?v=paSgzPso-yc
  418. - https://www.youtube.com/watch?v=JWD1Fpdd4Pc
  419. Testing
  420. -------------------------------------------------------------------
  421. Once you're closer to the interview:
  422. - Cracking The Coding Interview Set 2:
  423. - https://www.youtube.com/watch?v=4NIb9l3imAo
  424. - https://www.youtube.com/watch?v=Eg5-tdAwclo
  425. - https://www.youtube.com/watch?v=1fqxMuPmGak
  426. -------------------------------------------------------------------
  427. Extras that can't hurt:
  428. Computer Security:
  429. - MIT (23 videos): https://www.youtube.com/playlist?list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh
  430. Information theory:
  431. - Markov processes:
  432. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation
  433. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation
  434. - https://www.khanacademy.org/computing/computer-science/informationtheory/moderninfotheory/v/symbol-rate-information-theory
  435. - includes Markov chain
  436. Bloom Filter
  437. - https://www.youtube.com/watch?v=-SuTGoFYjZs
  438. - http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/
  439. Fast Fourier Transform
  440. - http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/
  441. Machine Learning:
  442. - great course: https://www.coursera.org/learn/machine-learning
  443. - http://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/
  444. - http://www.dataschool.io/
  445. Parallel Programming:
  446. - https://www.coursera.org/learn/parprog1/home/week/1
  447. ------------------------
  448. Be thinking of for when the interview comes:
  449. Think of about 20 interview questions you'll get, along the lines of the items below:
  450. have 2-3 answers for each
  451. Have a story, not just data, about something you accomplished
  452. Why do you want this job?
  453. What's a tough problem you've solved?
  454. Biggest challenges faced?
  455. Best/worst designs seen?
  456. Ideas for improving an existing Google product.
  457. How do you work best, as an individual and as part of a team?
  458. Which of your skills or experiences would be assets in the role and why?
  459. What did you most enjoy at [job x / project y]?
  460. What was the biggest challenge you faced at [job x / project y]?
  461. What was the hardest bug you faced at [job x / project y]?
  462. What did you learn at [job x / project y]?
  463. What would you have done better at [job x / project y]?
  464. ---------------------------
  465. Have questions for the interviewer.
  466. Some of mine (I already may know answer to but want their opinion or team perspective):
  467. - How large is your team?
  468. - What is your dev cycle look like? Do you do sprints/agile?
  469. - How are decisions made in your team?
  470. - How many meetings do you have per week?
  471. - Do you feel your work environment helps you concentrate?
  472. - What are you working on?
  473. - What do you like about it?
  474. - What is the work life like?
  475. ##########################################################################################
  476. ## Books:
  477. ##########################################################################################
  478. Mentioned in Coaching:
  479. The Algorithm Design Manual
  480. - Book (can rent on kindle): http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202
  481. - Answers: http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition)
  482. Algorithms and Programming: Problems and Solutions:
  483. http://www.amazon.com/Algorithms-Programming-Solutions-Alexander-Shen/dp/0817638474
  484. Once you've understood everything in the daily plan:
  485. read and do exercises from the books below. Then move to coding challenges (below)
  486. Read first:
  487. Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition:
  488. http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html
  489. Read second:
  490. Cracking the Coding Interview, 6th Edition:
  491. - http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/
  492. Additional (not suggested by Google but I added):
  493. * - C Programming Language, Vol 2
  494. * - C++ Primer Plus, 6th Edition
  495. Introduction to Algorithms
  496. Programming Pearls:
  497. - http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880
  498. If you see people reference "The Google Resume", it was replaced by "Cracking the Coding Interview".
  499. ##########################################################################################
  500. ##########################################################################################
  501. ##
  502. ##
  503. ##
  504. ## Everything below is my recommendation, not Google's, and
  505. ## you may not have enough time to watch or read them all.
  506. ## That's ok. I may not either.
  507. ##
  508. ##
  509. ##
  510. ##########################################################################################
  511. String search algorithm:
  512. Knuth-Morris-Pratt (KMP):
  513. - https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
  514. - https://www.youtube.com/watch?v=2ogqPWJSftE
  515. Boyer–Moore string search algorithm
  516. - https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
  517. - https://www.youtube.com/watch?v=xYBM0_dChRE
  518. ##########################################################################################
  519. ## Videos:
  520. ##########################################################################################
  521. CSE373 - Analysis of Algorithms (25 videos):
  522. - https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=1
  523. MIT 6.042: Math for CS (25 videos):
  524. - https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B
  525. MIT 6.006: Intro to Algorithms (47 videos):
  526. - https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False
  527. MIT 6.033: Computer System Engineering (22 videos):
  528. - https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484
  529. MIT 6.046: Design and Analysis of Algorithms (34 videos):
  530. - https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp
  531. MIT 6.858 Computer Systems Security, Fall 2014 ():
  532. - https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh
  533. MIT 6.851: Advanced Data Structures (22 videos):
  534. - https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=1
  535. Stanford: Programming Paradigms (17 videos)
  536. - https://www.youtube.com/watch?v=jTSvthW34GU&list=PLC0B8B318B7394B6F&nohtml5=False
  537. MIT 6.050J Information and Entropy, Spring 2008 ()
  538. - https://www.youtube.com/watch?v=phxsQrZQupo&list=PL_2Bwul6T-A7OldmhGODImZL8KEVE38X7
  539. Introduction to Cryptography:
  540. - https://www.youtube.com/watch?v=2aHkqB2-46k&feature=youtu.be
  541. ##########################################################################################
  542. ## Google:
  543. ##########################################################################################
  544. - How Search Works:
  545. https://www.google.com/insidesearch/howsearchworks/thestory/
  546. https://www.youtube.com/watch?v=BNHR6IQJGZs
  547. https://www.google.com/insidesearch/howsearchworks/
  548. ##########################################################################################
  549. ## Articles:
  550. ##########################################################################################
  551. - https://www.topcoder.com/community/data-science/data-science-tutorials/the-importance-of-algorithms/
  552. - http://highscalability.com/blog/2016/4/4/how-to-remove-duplicates-in-a-large-dataset-reducing-memory.html
  553. - http://highscalability.com/blog/2016/3/23/what-does-etsys-architecture-look-like-today.html
  554. - http://highscalability.com/blog/2016/3/21/to-compress-or-not-to-compress-that-was-ubers-question.html
  555. - http://highscalability.com/blog/2016/3/3/asyncio-tarantool-queue-get-in-the-queue.html
  556. - http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html
  557. - http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html
  558. - http://highscalability.com/blog/2016/2/15/egnyte-architecture-lessons-learned-in-building-and-scaling.html
  559. - http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html
  560. - http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html
  561. - http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html
  562. - http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html
  563. - http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html
  564. - http://highscalability.com/blog/2015/12/16/how-does-the-use-of-docker-effect-latency.html
  565. - http://highscalability.com/blog/2015/12/14/does-amp-counter-an-existential-threat-to-google.html
  566. - http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html
  567. ##########################################################################################
  568. ## Papers:
  569. ##########################################################################################
  570. Computing Weak Consistency in Polynomial Time
  571. - http://dl.acm.org/ft_gateway.cfm?id=2767407&ftid=1607485&dwn=1&CFID=627637486&CFTOKEN=49290244
  572. How Developers Search for Code: A Case Study
  573. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf
  574. Borg, Omega, and Kubernetes
  575. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44843.pdf
  576. Continuous Pipelines at Google
  577. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf
  578. AddressSanitizer: A Fast Address Sanity Checker
  579. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf
  580. ##########################################################################################
  581. ## Coding exercises/challenges:
  582. ##########################################################################################
  583. - https://courses.csail.mit.edu/iap/interview/materials.php
  584. LeetCode: https://leetcode.com/
  585. TopCoder: https://www.topcoder.com/
  586. More:
  587. HackerRank: https://www.hackerrank.com/
  588. Codility: https://codility.com/programmers/
  589. Project Euler: https://projecteuler.net/index.php?section=problems
  590. InterviewCake: https://www.interviewcake.com/
  591. InterviewBit: https://www.interviewbit.com/invite/icjf
  592. ##########################################################################################
  593. ## Maybe:
  594. ##########################################################################################
  595. http://www.gainlo.co/ - Mock interviewers from big companies
  596. ##########################################################################################
  597. ## Code References:
  598. ##########################################################################################
  599. For review questions in C book:
  600. https://github.com/lekkas/c-algorithms
  601. ##########################################################################################
  602. ## Once you've got the job (this is mainly for me):
  603. ##########################################################################################
  604. Books:
  605. Clean Code
  606. Code Complete
  607. * - C++ Seasoning:
  608. - https://www.youtube.com/watch?v=qH6sSOr-yk8
  609. * - Better Code: Data Structures:
  610. - https://www.youtube.com/watch?v=sWgDk-o-6ZE
  611. C++ Talks at CPPCon:
  612. - https://www.youtube.com/watch?v=hEx5DNLWGgA&index=2&list=PLHTh1InhhwT75gykhs7pqcR_uSiG601oh
  613. Compilers:
  614. - https://class.coursera.org/compilers-004/lecture
  615. Computer and processor architecture:
  616. - https://class.coursera.org/comparch-003/lecture
  617. Long series of C++ videos:
  618. - https://www.youtube.com/playlist?list=PLfVsf4Bjg79Cu5MYkyJ-u4SyQmMhFeC1C
  619. ##########################################################################################
  620. ## Done. ##
  621. ##########################################################################################