plan.txt 40 KB

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