plan.txt 34 KB

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