Dec 9, 2015 11:26 AM
(This post was last modified: Apr 27, 2016 11:47 AM by 6577657534735.)
Light introduction to landing top developer jobs, whether you are a new grad or have been in the industry a bit. All of these are Computer Science degree fundamentals. This is also a really minimal list, there are many things you should know which realistically you won't be asked about in an interview though. Anyway:
Two obstacles:
-Getting your resume noticed
-Passing technical screenings (phone and on-site)
To get your resume noticed have a good GPA and some past internships, and if you don't have either of those make sure you have some amazing personal projects. Not little trivial ones but really cool ones that demonstrate CS fundamentals
-Design a programming language
-Write an online chat program
-Write an emulator
-Make your own high level wrapper/framework for a tedious task
-Make a game from the ground up
Employers don't care about obscure language features, or even OS or API specific knowledge. This can be learned trivially by anyone with a grasp of the fundamentals. They care about raw CS knowledge i.e. data structures and algorithms, something never ever discussed on HF.
The primary data structures are:
-Arrays
-Linked lists
-Stacks
-Binary search trees (balanced and unbalanced, RB vs AVL vs Splay)
-N-ary trees
-Heaps (min and max, often used for implementing priority queues)
-Queues (FIFO, LIFO, priority)
-Hash tables (chaining and probing collision resolution methods)
-Graphs
The primary algorithms are:
-Search, insert, and delete on all of the above data structures
-Sorting (selection and other shitty ones, then top ones which are quick sort, merge sort (online and offline), and heap sort)
-Graph traversal (breadth first search, depth first search, A*)
For all of these data structures and algorithms, Big-O notation is absolutely foundational. It's not just some dumb thing taught in one class at the beginning of a CS degree that you can forget, it is 100% relevant to every single moment you spend programming for the rest of your life and if you don't understand it, at the very least at an intuitive level if not at the mathematical proof level, then you will suffer as a developer
Furthermore it's not just reciting algorithms you've memorized it's understanding them fully, understanding the tradeoffs in different implementation methods for each data structure, and understanding the advantages of some data structures over others, both at the Big-O complexity level and the actual CPU overhead level. In some use cases a binary search tree will be faster for retrieval than a hash table despite its Big-O complexity being higher.
Know how to combine data structures i.e. "I'd use a linked list but with a hash table mapping values to linked list node pointers for O(1) access and assume values are unique". Or "I'd map IDs to a binary search tree via a hash table, and each binary search tree will store the current values associated with the ID for O(1) retrieval and deletion of the max and min value". Knowing what data structure is best for the job is mandatory
Then there are fundamental programming and systems concepts you need to know, the main ones are:
-A language in-depth, preferably both an interpreted and compiled one
-Memory management (garbage collection vs. malloc vs RAII)
-Multiprocessing with both processes and threads
-Caching (both fundamentally for memoized algorithms, and both CPU memcaching and OS filesystem buffer caching)
-How high level languages map to assembly language, what stack frames are and what information they hold, the advantages of recursive vs. iterative algorithms that do the same thing
-OS concepts like how system calls work, what a kernel is
-How threads and processes are implemented in the kernel, what process scheduling is and how it's implemented internally via timer interrupts, block and run queue, etc.
-Networking: Ethernet/802.11 vs IP vs UDP/TCP vs DNS/HTTP/FTP vs HTML vs Javascript etc., from the bottom up
-Bit manipulation using masking with | and &, generating masks of desired size i.e. (1<<n)-1 etc.
-Have a vague idea of how to answer any "how does it work?" question from the top to the bottom i.e. "What happens when you hit enter on a google search?" or "what happens when you press the 'b' button on the keyboard?"
Know all of these things inside and out and you can land a top job. I mean inside and out, 100% can implement any of these algorithms or explain any of these concepts off the top of your head without reference material, and also be able to explain them and combine them and discuss tradeoffs and make design decisions where the answer isn't clear. You will be asked questions where you need to design a set of data structures which work together to solve the problem, and there may be an obvious solution but that obvious solution is shit and slow, and you need to keep moving forward to find the solution with the best Big-O complexity
If you can do all of these things but also do them confidently while simultaneously knowing the limits of your knowledge, you will land a top job. But once you know these things that's still not enough, you need to:
-Apply to a shitload of companies, both top ones being optimistic but also fallback companies in case you need a backup
-Practice interviews, take every interview you can because the act of whiteboard coding is SO much different than doing it on an actual computer with access to the internet
-Write a good resume, doesn't matter if you can pass an interview if you can't even get them
That's a very light explanation of what to do. Hopefully some people will benefit from it
There is a lot of emphasis on, well, other topics on HF, mainly related to malware writing. Obscure OS specific API knowledge. And yeah those topics are good but they won't really help you get a job as a developer. But ones I listed will
Guide of the general course layout of a CS degree at most universities:
Freshmen year:
Intro to programming (Java, Python, maybe C)
Object Oriented Programming (generally Java)
Basic Algorithms and Data Structures (sorting methods, linked lists, binary search trees)
Calculus 1-2 (unless you did AP in high school then you can start at Calculus 2 or 3)
Discrete Math (proofs, number theory, algorithmic complexity analysis (Big-O notation))
Statistics (normal, student's T distributions and others, statistics tests for equality, etc.)
Sophomore year:
Digital Logic Circuit Design (designing clocks, adder/division/multiplication circuits using NAND gates and AND/OR/NOT gates, etc.)
Computer Architecture (assembly, CPU design) (assembly language mainly but a bit of CPU design for buses, conditional expressions, etc)
Calculus 3
Linear Algebra
Junior year:
More advanced Algorithms and Data Structures (hash tables, balanced binary search trees, dynamic programming)
Programming Language design (interpreted vs. compiled, static vs. dynamic, etc)
Operating Systems (how they work, interrupts for process switching and scheduling, file I/O buffer, etc.)
Theory of Computation (finite state machines, Turing machines, halting problem, P vs. NP and NP completeness)
Embedded Programming (programming an Arduino for instance and learning how to do so without helper libraries whatsoever)
Senior year:
Varies but generally lots of electives of your choice, such as:
Database design
Advanced Operating Systems (internals)
Low Level Networking Protocols (TCP/IP, UDP, HTTP, FTP, etc.)
Compiler Design
Advanced/Applied Algorithms and Data Structures
Computer and Network Security
Computer and Network Forensics
Artificial Intelligence
Natural Language Processing
Intro to Machine Learning
tl;dr
Data structures and algorithms, know them and you will make bank. This is actually the only legit "Follow this guide and you will make 100k a year" guide on HF.
Suggested books
General CS knowledge:
-Introduction to Algorithms (CLRS) - THE algorithms and data structures introductory textbook
https://en.wikipedia.org/wiki/Introducti...Algorithms
-The C Programming language - Book on C written by the creator of C himself. If you graduate with a degree in CS and don't know C you have failed
http://www.amazon.com/The-Programming-La...0131103628
Just look up syllabuses from CS programs at top schools and look up the topics listed, read the textbook chapters listed. You can get textbooks free online in pdf form. Here's a great example. Once again it's a thing where realistically you won't use many of these specific algorithms and concepts at a job, but the fact that you know them, are familiar with them, and have them in the back of your mind, means you will be a better algorithmic thinker. One aspect of an obscure algorithm might come in handy making a new one to solve a problem. Once again this stuff is a MINIMUM level of knowledge required, not some golden ticket. This is only the beginning.
https://www.cs.utexas.edu/~lin/cs314h/syllabus.pdf
http://www.fas.harvard.edu/~libcs124/E124/syllabus.html
Interview practice:
-Cracking the Code Interview (CtCI) - algorithm interview questions to study (NOT memorize, but actually attempt yourself to learn the concepts behind them)
http://www.amazon.com/Cracking-Coding-In...098478280X
-How to Prepare Yourself for an Interview with Google
https://www.mtu.edu/career/students/tool...repare.pdf
Classics:
https://en.wikipedia.org/wiki/The_Mythical_Man-Month
https://en.wikipedia.org/wiki/Code_Complete
https://en.wikipedia.org/wiki/Structure_...r_Programs
-Operating Systems concepts
http://codex.cs.yale.edu/avi/os-book/OS8...slide-dir/
-Theoretical CS. This is where stuff starts to get interesting:
http://www.amazon.com/Introduction-Theor...113318779X
-Artificial Intelligence:
http://aima.cs.berkeley.edu/
tl;dr v2
Get a degree in CS from a respected university. Really nail down the data structures and algorithms. While doing so, the more useless and theoretical a topic feels to you as a beginner the more important it probably is. Study EVERYTHING. Few people can self study a full CS degree instead of just a minor subset of it. If you are reading this guide you are probably not one of them.
Also importantly for interview and job seeking tips, browse the cscareerquestions subreddit frequently and soak it in. This sub has made me tons of money with its great tips that I followed. Seeing the career success of others can also help give you motivation to study the topic itself as well:
https://www.reddit.com/r/cscareerquestions
Two obstacles:
-Getting your resume noticed
-Passing technical screenings (phone and on-site)
To get your resume noticed have a good GPA and some past internships, and if you don't have either of those make sure you have some amazing personal projects. Not little trivial ones but really cool ones that demonstrate CS fundamentals
-Design a programming language
-Write an online chat program
-Write an emulator
-Make your own high level wrapper/framework for a tedious task
-Make a game from the ground up
Employers don't care about obscure language features, or even OS or API specific knowledge. This can be learned trivially by anyone with a grasp of the fundamentals. They care about raw CS knowledge i.e. data structures and algorithms, something never ever discussed on HF.
The primary data structures are:
-Arrays
-Linked lists
-Stacks
-Binary search trees (balanced and unbalanced, RB vs AVL vs Splay)
-N-ary trees
-Heaps (min and max, often used for implementing priority queues)
-Queues (FIFO, LIFO, priority)
-Hash tables (chaining and probing collision resolution methods)
-Graphs
The primary algorithms are:
-Search, insert, and delete on all of the above data structures
-Sorting (selection and other shitty ones, then top ones which are quick sort, merge sort (online and offline), and heap sort)
-Graph traversal (breadth first search, depth first search, A*)
For all of these data structures and algorithms, Big-O notation is absolutely foundational. It's not just some dumb thing taught in one class at the beginning of a CS degree that you can forget, it is 100% relevant to every single moment you spend programming for the rest of your life and if you don't understand it, at the very least at an intuitive level if not at the mathematical proof level, then you will suffer as a developer
Furthermore it's not just reciting algorithms you've memorized it's understanding them fully, understanding the tradeoffs in different implementation methods for each data structure, and understanding the advantages of some data structures over others, both at the Big-O complexity level and the actual CPU overhead level. In some use cases a binary search tree will be faster for retrieval than a hash table despite its Big-O complexity being higher.
Know how to combine data structures i.e. "I'd use a linked list but with a hash table mapping values to linked list node pointers for O(1) access and assume values are unique". Or "I'd map IDs to a binary search tree via a hash table, and each binary search tree will store the current values associated with the ID for O(1) retrieval and deletion of the max and min value". Knowing what data structure is best for the job is mandatory
Then there are fundamental programming and systems concepts you need to know, the main ones are:
-A language in-depth, preferably both an interpreted and compiled one
-Memory management (garbage collection vs. malloc vs RAII)
-Multiprocessing with both processes and threads
-Caching (both fundamentally for memoized algorithms, and both CPU memcaching and OS filesystem buffer caching)
-How high level languages map to assembly language, what stack frames are and what information they hold, the advantages of recursive vs. iterative algorithms that do the same thing
-OS concepts like how system calls work, what a kernel is
-How threads and processes are implemented in the kernel, what process scheduling is and how it's implemented internally via timer interrupts, block and run queue, etc.
-Networking: Ethernet/802.11 vs IP vs UDP/TCP vs DNS/HTTP/FTP vs HTML vs Javascript etc., from the bottom up
-Bit manipulation using masking with | and &, generating masks of desired size i.e. (1<<n)-1 etc.
-Have a vague idea of how to answer any "how does it work?" question from the top to the bottom i.e. "What happens when you hit enter on a google search?" or "what happens when you press the 'b' button on the keyboard?"
Know all of these things inside and out and you can land a top job. I mean inside and out, 100% can implement any of these algorithms or explain any of these concepts off the top of your head without reference material, and also be able to explain them and combine them and discuss tradeoffs and make design decisions where the answer isn't clear. You will be asked questions where you need to design a set of data structures which work together to solve the problem, and there may be an obvious solution but that obvious solution is shit and slow, and you need to keep moving forward to find the solution with the best Big-O complexity
If you can do all of these things but also do them confidently while simultaneously knowing the limits of your knowledge, you will land a top job. But once you know these things that's still not enough, you need to:
-Apply to a shitload of companies, both top ones being optimistic but also fallback companies in case you need a backup
-Practice interviews, take every interview you can because the act of whiteboard coding is SO much different than doing it on an actual computer with access to the internet
-Write a good resume, doesn't matter if you can pass an interview if you can't even get them
That's a very light explanation of what to do. Hopefully some people will benefit from it
There is a lot of emphasis on, well, other topics on HF, mainly related to malware writing. Obscure OS specific API knowledge. And yeah those topics are good but they won't really help you get a job as a developer. But ones I listed will
Guide of the general course layout of a CS degree at most universities:
Freshmen year:
Intro to programming (Java, Python, maybe C)
Object Oriented Programming (generally Java)
Basic Algorithms and Data Structures (sorting methods, linked lists, binary search trees)
Calculus 1-2 (unless you did AP in high school then you can start at Calculus 2 or 3)
Discrete Math (proofs, number theory, algorithmic complexity analysis (Big-O notation))
Statistics (normal, student's T distributions and others, statistics tests for equality, etc.)
Sophomore year:
Digital Logic Circuit Design (designing clocks, adder/division/multiplication circuits using NAND gates and AND/OR/NOT gates, etc.)
Computer Architecture (assembly, CPU design) (assembly language mainly but a bit of CPU design for buses, conditional expressions, etc)
Calculus 3
Linear Algebra
Junior year:
More advanced Algorithms and Data Structures (hash tables, balanced binary search trees, dynamic programming)
Programming Language design (interpreted vs. compiled, static vs. dynamic, etc)
Operating Systems (how they work, interrupts for process switching and scheduling, file I/O buffer, etc.)
Theory of Computation (finite state machines, Turing machines, halting problem, P vs. NP and NP completeness)
Embedded Programming (programming an Arduino for instance and learning how to do so without helper libraries whatsoever)
Senior year:
Varies but generally lots of electives of your choice, such as:
Database design
Advanced Operating Systems (internals)
Low Level Networking Protocols (TCP/IP, UDP, HTTP, FTP, etc.)
Compiler Design
Advanced/Applied Algorithms and Data Structures
Computer and Network Security
Computer and Network Forensics
Artificial Intelligence
Natural Language Processing
Intro to Machine Learning
tl;dr
Data structures and algorithms, know them and you will make bank. This is actually the only legit "Follow this guide and you will make 100k a year" guide on HF.
Suggested books
General CS knowledge:
-Introduction to Algorithms (CLRS) - THE algorithms and data structures introductory textbook
https://en.wikipedia.org/wiki/Introducti...Algorithms
-The C Programming language - Book on C written by the creator of C himself. If you graduate with a degree in CS and don't know C you have failed
http://www.amazon.com/The-Programming-La...0131103628
Just look up syllabuses from CS programs at top schools and look up the topics listed, read the textbook chapters listed. You can get textbooks free online in pdf form. Here's a great example. Once again it's a thing where realistically you won't use many of these specific algorithms and concepts at a job, but the fact that you know them, are familiar with them, and have them in the back of your mind, means you will be a better algorithmic thinker. One aspect of an obscure algorithm might come in handy making a new one to solve a problem. Once again this stuff is a MINIMUM level of knowledge required, not some golden ticket. This is only the beginning.
https://www.cs.utexas.edu/~lin/cs314h/syllabus.pdf
http://www.fas.harvard.edu/~libcs124/E124/syllabus.html
Interview practice:
-Cracking the Code Interview (CtCI) - algorithm interview questions to study (NOT memorize, but actually attempt yourself to learn the concepts behind them)
http://www.amazon.com/Cracking-Coding-In...098478280X
-How to Prepare Yourself for an Interview with Google
https://www.mtu.edu/career/students/tool...repare.pdf
Classics:
https://en.wikipedia.org/wiki/The_Mythical_Man-Month
https://en.wikipedia.org/wiki/Code_Complete
https://en.wikipedia.org/wiki/Structure_...r_Programs
-Operating Systems concepts
http://codex.cs.yale.edu/avi/os-book/OS8...slide-dir/
-Theoretical CS. This is where stuff starts to get interesting:
http://www.amazon.com/Introduction-Theor...113318779X
-Artificial Intelligence:
http://aima.cs.berkeley.edu/
tl;dr v2
Get a degree in CS from a respected university. Really nail down the data structures and algorithms. While doing so, the more useless and theoretical a topic feels to you as a beginner the more important it probably is. Study EVERYTHING. Few people can self study a full CS degree instead of just a minor subset of it. If you are reading this guide you are probably not one of them.
Also importantly for interview and job seeking tips, browse the cscareerquestions subreddit frequently and soak it in. This sub has made me tons of money with its great tips that I followed. Seeing the career success of others can also help give you motivation to study the topic itself as well:
https://www.reddit.com/r/cscareerquestions


![[Image: wvrJJDa.png]](https://i.imgur.com/wvrJJDa.png)

![[Image: i6qo9eY.png]](https://i.imgur.com/i6qo9eY.png)
