plan.txt 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  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 * 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. ##########################################################################################
  9. ## Interview Prep:
  10. ##########################################################################################
  11. * - Videos:
  12. * - https://www.youtube.com/watch?v=oWbUtlUhwa8&feature=youtu.be
  13. * - https://www.youtube.com/watch?v=qc1owf2-220&feature=youtu.be
  14. Articles:
  15. - http://dondodge.typepad.com/the_next_big_thing/2010/09/how-to-get-a-job-at-google-interview-questions-hiring-process.html
  16. - http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
  17. - http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions
  18. - http://www.google.com/about/careers/lifeatgoogle/hiringprocess/
  19. Additional (not suggested by Google but I added):
  20. - https://courses.csail.mit.edu/iap/interview/materials.php
  21. - http://www.coderust.com/blog/2014/04/10/effective-whiteboarding-during-programming-interviews/
  22. - https://www.youtube.com/watch?v=rEJzOhC5ZtQ&feature=youtu.be
  23. - https://www.youtube.com/watch?v=aClxtDcdpsQ&feature=youtu.be
  24. - https://www.youtube.com/watch?v=2cf9xo1S134&feature=youtu.be
  25. - https://www.youtube.com/watch?v=YJZCUhxNCv8
  26. * - https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4
  27. * - https://medium.com/always-be-coding/four-steps-to-google-without-a-degree-8f381aa6bd5e#.asalo1vfx
  28. * - https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1
  29. ##########################################################################################
  30. ## Knowledge:
  31. ##########################################################################################
  32. You need to know C, C++, or Java to do the coding part of the interview.
  33. They will sometimes make an exception and let you use Python or some other language, but the language
  34. must be mainstream and allow you write your code low-level enough to solve the problems.
  35. You'll see some C, C++ learning included below.
  36. There are a few books involved, see the bottom
  37. * - how computers process a program:
  38. * - https://www.youtube.com/watch?v=42KTvGYQYnA
  39. * - https://www.youtube.com/watch?v=Mv2XQgpbTNE
  40. * - Computer Arch Intro:
  41. (first video only - interesting but not required) https://www.youtube.com/watch?v=zLP_X4wyHbY&list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq&index=1
  42. * - Parity & Hamming Code:
  43. Parity:
  44. https://www.youtube.com/watch?v=DdMcAUlxh1M
  45. Hamming Code:
  46. https://www.youtube.com/watch?v=1A_NcXxdoCc
  47. https://www.youtube.com/watch?v=JAMLuxdHH8o
  48. Error Checking:
  49. https://www.youtube.com/watch?v=wbH2VxzmoZk
  50. * - C
  51. * - K&R C book (ANSI C)
  52. - C++
  53. * - basics
  54. * - pointers
  55. * - functions
  56. * - references
  57. * - templates
  58. * - compilation
  59. * - scope & linkage
  60. * - namespaces
  61. * - OOP
  62. * - STL
  63. * - functors: http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html
  64. * - C++ at Google: https://www.youtube.com/watch?v=NOCElcMcFik
  65. * - Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html
  66. - Google uses clang-format (Google setting)
  67. - C++ Core Guidelines: http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
  68. * - Efficiency with Algorithms, Performance with Data Structures: https://youtu.be/fHNmRkzxHWs
  69. - review of C++ concepts: https://www.youtube.com/watch?v=Rub-JsjMhWY
  70. * - compilers:
  71. * - https://class.coursera.org/compilers-004/lecture/1
  72. * - https://class.coursera.org/compilers-004/lecture/2
  73. * - C++: https://www.youtube.com/watch?v=twodd1KFfGk
  74. * - Understanding Compiler Optimization (C++): https://www.youtube.com/watch?v=FnGCDLhaxKU
  75. ----------------------------------------------------------------
  76. The Gauntlet:
  77. Each day I take one subject from the list below, watch videos about that subject, and write an implementation in:
  78. C - using structs and functions that take a struct * and something else as args.
  79. C++ - without using built-in types
  80. C++ - using built-in types, like STL's std::list for a linked list
  81. Python - without using built-in types
  82. and write tests to ensure I'm doing it right, keep it simple with just assert() statements
  83. Each subject does not require a whole day to be able to understand it fully.
  84. Why code in all of these?
  85. 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)
  86. Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python))
  87. 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)
  88. ----------------------------------------------------------------
  89. arrays
  90. No need to spend a whole day on this.
  91. * - Description:
  92. - https://www.coursera.org/learn/data-structures/lecture/OsBSF/arrays
  93. - https://www.coursera.org/learn/data-structures/lecture/EwbnV/dynamic-arrays
  94. - Implement:
  95. - Practice coding using arrays and pointers, and pointer math to jump to an index instead of using indexing.
  96. * - new raw data array with allocated memory (can allocate int array under the hood, just not use its features)
  97. * - size() - number of items
  98. * - capacity() - number of items it can hold
  99. * - is_empty()
  100. - at(index) - returns item at given index
  101. - cannot append or move if full - will not tackle allocating and copying to new memory
  102. - append(item)
  103. - insert(index, item)
  104. - prepend(item) - can use insert above at index 0
  105. - delete(index)
  106. - remove(item)
  107. - find(item)
  108. - Time
  109. - O(1) to add/remove at end (amortized for allocations for more space), index, or update
  110. - O(n) to insert/remove elsewhere
  111. - Space
  112. - contiguous in memory, so proximity helps performance
  113. - space needed = size of object * number of items to store
  114. linked lists
  115. - singly-linked
  116. * - Description: https://www.coursera.org/learn/data-structures/lecture/kHhgK/singly-linked-lists
  117. * - Lynda.com:
  118. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Introduction-lists/149042/177115-4.html
  119. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Understanding-basic-list-implementations/149042/177116-4.html
  120. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-singly-doubly-linked-lists/149042/177117-4.html
  121. - https://www.lynda.com/Developer-Programming-Foundations-tutorials/List-support-across-languages/149042/177118-4.html
  122. * - C Code: https://www.youtube.com/watch?v=QN6FPiD0Gzo
  123. - not the whole video, just portions about Node struct and memory allocation.
  124. * - why you should avoid linked lists:
  125. - https://www.youtube.com/watch?v=YQs6IC-vgmo
  126. - implement (with tail pointer), item is the data item in a node:
  127. - push_front
  128. - get_front
  129. - pop_front
  130. - push_back
  131. - get_back
  132. - pop_back
  133. - insert_before(node, item)
  134. - insert_after(node, item)
  135. - size()
  136. - is_empty()
  137. - find(item) - assume each item is unique
  138. - remove(item) - assume each item is unique
  139. - doubly-linked list
  140. - Description: https://www.coursera.org/learn/data-structures/lecture/jpGKD/doubly-linked-lists
  141. - reverse a singly-linked list
  142. stacks
  143. - see: https://class.coursera.org/algs4partI-010/lecture
  144. - https://www.coursera.org/learn/data-structures/lecture/UdKzQ/stacks
  145. queues
  146. - see: https://class.coursera.org/algs4partI-010/lecture
  147. - https://www.coursera.org/learn/data-structures/lecture/EShpq/queues
  148. Vectors
  149. - Vector calculus ?
  150. heaps
  151. - https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees
  152. - min heap
  153. - max heap
  154. Priority Queue
  155. - https://www.coursera.org/learn/data-structures/lecture/2OpTs/introduction
  156. - see: https://class.coursera.org/algs4partI-010/lecture
  157. - https://class.coursera.org/algs4partI-010/lecture/39
  158. - https://en.wikipedia.org/wiki/Priority_queue
  159. Disjoint Sets:
  160. - https://www.coursera.org/learn/data-structures/lecture/JssSY/overview
  161. - https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees
  162. hashtables
  163. - https://www.youtube.com/watch?v=C4Kc8xzcA68
  164. - https://class.coursera.org/algs4partI-010/lecture/52
  165. - https://www.coursera.org/learn/data-structures/home/week/3
  166. - see: https://class.coursera.org/algs4partI-010/lecture
  167. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/m7UuP/core-hash-tables
  168. - test: implement with only arrays
  169. tries
  170. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries
  171. Circular buffer/FIFO:
  172. - https://en.wikipedia.org/wiki/Circular_buffer
  173. Bit operations
  174. - count on bits
  175. - https://youtu.be/Hzuzo9NJrlc
  176. - max run of off bits
  177. - bit shifting
  178. binary search
  179. Sorting
  180. - no bubble sort - it's terrible
  181. - at least one n*log(n) sorting algorithm, preferably two (say, quicksort and merge sort)
  182. - Which algorithms can be used on lists? Which on arrays? Which on both? Is Quicksort stable?
  183. - algos:
  184. - mergesort
  185. - quicksort
  186. Caches
  187. - LRU cache
  188. Trees
  189. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/ovovP/core-trees
  190. - see: https://class.coursera.org/algs4partI-010/lecture
  191. - basic tree construction
  192. - traversal
  193. - manipulation algorithms
  194. - binary search trees BSTs
  195. - https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction
  196. - applications:
  197. - https://class.coursera.org/algs4partI-010/lecture/57
  198. - n-ary trees
  199. - trie-trees
  200. - at least one type of balanced binary tree (and know how it's implemented):
  201. - red/black tree
  202. - https://class.coursera.org/algs4partI-010/lecture/50
  203. - splay trees
  204. - https://www.coursera.org/learn/data-structures/lecture/O9nZ6/splay-trees
  205. - AVL trees
  206. - https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees
  207. - https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation
  208. - https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge
  209. - 2-3 Search Trees
  210. - https://class.coursera.org/algs4partI-010/lecture/49
  211. - B-Trees:
  212. - https://class.coursera.org/algs4partI-010/lecture/51
  213. - BFS (breadth-first search)
  214. - DFS (depth-first search)
  215. - know the difference between
  216. - inorder
  217. - postorder
  218. - preorder
  219. Graphs:
  220. There are three basic ways to represent a graph in memory:
  221. - objects and pointers
  222. - matrix
  223. - adjacency list
  224. - familiarize yourself with each representation and its pros & cons
  225. - now their computational complexity, their tradeoffs, and how to implement them in real code
  226. - If you get a chance, try to study up on fancier algorithms:
  227. - Dijkstra
  228. - A*
  229. Other data structures:
  230. - You should study up on as many other data structures and algorithms as possible
  231. - You should especially know about the most famous classes of NP-complete problems, such as traveling salesman and the knapsack problem, and be able to recognize them when an interviewer asks you them in disguise.
  232. - Find out what NP-complete means.
  233. Recursion
  234. - when it is appropriate to use it
  235. Algorithmic complexity
  236. open-ended problems
  237. - manipulate strings
  238. - manipulate patterns
  239. design patterns:
  240. - strategy
  241. - singleton
  242. - adapter
  243. - prototype
  244. - decorator
  245. - visitor
  246. - factory
  247. Combinatorics (n choose k)
  248. Probability
  249. Dynamic Programming
  250. Processes, Threads, Concurrency issues
  251. - difference: https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread
  252. - threads: https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M
  253. - stopped here: https://www.youtube.com/watch?v=_N0B5ua7oN8&list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M&index=4
  254. - locks
  255. - mutexes
  256. - semaphores
  257. - monitors
  258. - how they work
  259. - deadlock
  260. - livelock
  261. Process resource needs
  262. Thread resource needs
  263. Modern concurrency constructs with multicore processors
  264. Context switching
  265. - How context switching is initiated by the operating system and underlying hardware
  266. Scheduling
  267. Weighted random sampling
  268. Implement system routines
  269. Distill large data sets to single values
  270. Transform one data set to another
  271. Handling obscenely large amounts of data
  272. System design:
  273. - features sets
  274. - interfaces
  275. - class hierarchies
  276. - designing a system under certain constraints
  277. - simplicity and robustness
  278. - tradeoffs
  279. Performance analysis and optimization
  280. Testing
  281. -------------------------------------------------------------------
  282. Extras that can't hurt:
  283. Information theory:
  284. - Markov processes:
  285. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation
  286. - https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation
  287. - https://www.khanacademy.org/computing/computer-science/informationtheory/moderninfotheory/v/symbol-rate-information-theory
  288. - includes Markov chain
  289. Bloom Filter
  290. - https://www.youtube.com/watch?v=-SuTGoFYjZs
  291. - http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/
  292. Fast Fourier Transform
  293. - http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/
  294. C (for basis of C)
  295. C++ (for interview answers)
  296. Machine Learning:
  297. - http://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/
  298. - review videos
  299. - intro in Goodreader on iPad
  300. - http://www.dataschool.io/
  301. ---
  302. Be thinking of:
  303. Biggest challenges faced
  304. Best/worst designs seen
  305. Ideas for improving existing products
  306. ##########################################################################################
  307. ## Videos:
  308. ##########################################################################################
  309. 6.042: Math for CS (25 videos):
  310. - https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B
  311. 6.006: Intro to Algorithms (47 videos):
  312. - https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False
  313. 6.033: Computer System Engineering (22 videos):
  314. - https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484
  315. 6.046: Design and Analysis of Algorithms (34 videos):
  316. - https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp
  317. 6.851: Advanced Data Structures (22 videos):
  318. - https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf
  319. Stanford: Programming Paradigms (17 videos)
  320. - https://www.youtube.com/watch?v=jTSvthW34GU&list=PLC0B8B318B7394B6F&nohtml5=False
  321. ##########################################################################################
  322. ## Articles:
  323. ##########################################################################################
  324. - https://www.topcoder.com/community/data-science/data-science-tutorials/the-importance-of-algorithms/
  325. - http://highscalability.com/blog/2016/4/4/how-to-remove-duplicates-in-a-large-dataset-reducing-memory.html
  326. - http://highscalability.com/blog/2016/3/23/what-does-etsys-architecture-look-like-today.html
  327. - http://highscalability.com/blog/2016/3/21/to-compress-or-not-to-compress-that-was-ubers-question.html
  328. - http://highscalability.com/blog/2016/3/3/asyncio-tarantool-queue-get-in-the-queue.html
  329. - http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html
  330. - http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html
  331. - http://highscalability.com/blog/2016/2/15/egnyte-architecture-lessons-learned-in-building-and-scaling.html
  332. - http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html
  333. - http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html
  334. - http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html
  335. - http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html
  336. - http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html
  337. - http://highscalability.com/blog/2015/12/16/how-does-the-use-of-docker-effect-latency.html
  338. - http://highscalability.com/blog/2015/12/14/does-amp-counter-an-existential-threat-to-google.html
  339. - http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html
  340. ##########################################################################################
  341. ## Papers:
  342. ##########################################################################################
  343. Computing Weak Consistency in Polynomial Time
  344. - http://delivery.acm.org/10.1145/2770000/2767407/p395-golab.pdf?ip=104.200.154.80&id=2767407&acc=OA&key=4D4702B0C3E38B35%2E4D4702B0C3E38B35%2E4D4702B0C3E38B35%2E5945DC2EABF3343C&CFID=769944592&CFTOKEN=71654301&__acm__=1460506755_42d28e3f230cc8e733e2e9ed1ebe3605
  345. How Developers Search for Code: A Case Study
  346. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf
  347. Borg, Omega, and Kubernetes
  348. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44843.pdf
  349. Continuous Pipelines at Google
  350. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf
  351. AddressSanitizer: A Fast Address Sanity Checker
  352. - http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf
  353. ##########################################################################################
  354. ## Books:
  355. ##########################################################################################
  356. Mentioned in Coaching:
  357. The Algorithm Design Manual
  358. http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202
  359. Algorithms and Programming: Problems and Solutions:
  360. http://www.amazon.com/Algorithms-Programming-Solutions-Alexander-Shen/dp/0817638474
  361. Read first:
  362. Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition:
  363. http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html
  364. Read second:
  365. Cracking the Coding Interview, Fourth Edition:
  366. - http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/
  367. Additional (not suggested by Google but I added):
  368. * - C Programming Language, Vol 2
  369. * - C++ Primer Plus, 6th Edition
  370. Programming Pearls:
  371. - http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880
  372. If you see people reference "The Google Resume", it was replaced by "Cracking the Coding Interview".
  373. Clean Code
  374. Code Complete
  375. Introduction to Algorithms
  376. ##########################################################################################
  377. ## Coding exercises/challenges:
  378. ##########################################################################################
  379. Recommended: LeetCode: https://leetcode.com/
  380. HackerRank: https://www.hackerrank.com/
  381. Codility: https://codility.com/programmers/
  382. Project Euler: https://projecteuler.net/index.php?section=problems
  383. InterviewCake: https://www.interviewcake.com/
  384. InterviewBit: https://www.interviewbit.com/invite/icjf
  385. ##########################################################################################
  386. ## Code References:
  387. ##########################################################################################
  388. For review questions in C book:
  389. https://github.com/lekkas/c-algorithms
  390. ##########################################################################################
  391. ## Once you've got the job (this is mainly for me):
  392. ##########################################################################################
  393. C++ Talks at CPPCon:
  394. - https://www.youtube.com/watch?v=hEx5DNLWGgA&index=2&list=PLHTh1InhhwT75gykhs7pqcR_uSiG601oh
  395. Compilers:
  396. - https://class.coursera.org/compilers-004/lecture
  397. Computer and processor architecture:
  398. - https://class.coursera.org/comparch-003/lecture
  399. Long series of C++ videos:
  400. - https://www.youtube.com/playlist?list=PLfVsf4Bjg79Cu5MYkyJ-u4SyQmMhFeC1C
  401. ##########################################################################################
  402. ## Done. ##
  403. ##########################################################################################