| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Class Author: Giovanni Pascotto Bonin
I am more than willing, and would be happy to mentor anyone - who is highly motivated - in any stage and give advice based on my experiences. I am also just in the start of my career, but I've had to overcome all kinds of obstacles and there is plenty of advice I can give for people looking for jobs in the Bay Area. Feel free to email me: pbonin.giovanni@gmail.com
I decided to create this class to teach while I am the president of IEEE at the University of Miami to supplement the school's curriculum, open doors for students to engage in discussions and interactions on the subject, as well as create a foundational framework for our organization on campus for future semesters.
If someone else decides to run something similar to this on their campus, I am also running guest speakers (in addition to each of these sessions), and that's a really good way to engage professional experience in your organization, as well as have experienced engineers potentially help you with the program.
I was initially going to use a Slack channel for this, but then I realized that most people don't have their Slack account open all the time, and realistically most won't download the app and have notifications on. So we will be using the IEEE Facebook group chat, to take advantage of the sad fact that people are on Facebook all the time and thus will receive the notifications. Send me an email or let me know in class that you want to be added to the group. We will also send announcements on orgsync, so if you don't have fb it's ok.
First meeting and announcement:
Here the plan is to announce the program to the general body meeting, get input from the students on final things they might be interested in learning on top of the program, as well as finding out times that will work for most people.
Guest Speaker (CEO of Kairos Analytics): Feb 23rd 6:30 pm at MEA 202
Before anything else:
There is nothing like working your hardest in the road to achieving your dreams. This lecture series is just a compilation of advice both from various amazing people I have met, and some I observed on my own. I am passing this advice along, but keep in mind the only way for you to be able to solve new problems is to develop the foundation through discovery yourself. Practicing to solve these problems on your own is the only way to create those neural pathways.
I actually learned a lot about learning in this Coursera class I took in my last semester in college:
To practice, get one of the recommended books with a list of exercises and hammer through it! Do all these problems, do one per day, or do two, or three, depending on how much time you have. There's no excuse to not do at least one of them a day until you feel comfortable enough to go to an interview feeling that you will make it.
Success leads to confidence (conversely from what people believe), so the more you successfully solve problems the more confident you will be. Start small, build your skills, and you will make it. It's hard to properly emphasize just how helpful these books are.
This program will help you understand computer systems, algorithm efficiency, data structure performance, low-level languages, and how it all works together. These subjects are extremely important, and the hiring process for Google (and Silicon Valley companies in general) places a huge importance on them. There is no shortage of studying, the more you know about these subjects, the better.
Before I started college I started learning computer science on my own, although I'd wish I had started even earlier given I was already 17. But due to some obstacles in my career choices I didn't dive in until that point, but when I did I committed as if I was born to do this. Before college, I had a gap year. During that period, when I found websites such as Coursera, MIT OpenCourseware, and a multitude of other content on the internet such as free textbooks and all that, I realized there is nothing short of motivation that can stop any of us from becoming one of the best at any field we want to excel in.
When I started college, I realized that I could actually learn better on my own than I could learn in class, so if that's the case for you, embrace it and pursue your passion in the way you know works best. The goal of this is to be a list of resources that can be followed and give you a good coverage on what's important, specifically filling in the gaps left by a typical computer science or software engineering curriculum. It turned out for me that by the end of my college career I wanted to work for a startup, as that way I can have a bigger impact in something that is in its early stages and really needs to be pushed forward. These experiences with learning told me to go work for a startup fixing education with technology.
This is a long plan, and some interviewers will even tell you that some of this stuff is more advanced than you need. In fact, I found this guide after accepting my full-time offer with my favorite startup in the world (Coursera), and I am going through it now (for fun) since practice is never too much, and some of this stuff I haven't had time to cover before, but it is well worth it to be good at what we do.
So yes, it might be true that some of these things don't often show up in an interview. But that's until it does, and you start thinking to yourself DAMN this is my favorite company, I should really have spent that weekend learning about this, now I have to wait a year to reapply.
This is not the SAT or MCAT. The reason why software companies want us to know these subjects is because it is important for our jobs, and the more we know about it the more we can build, the faster we can create, and innovate. Although you might not be designing algorithms on a daily basis as a software engineer (although some engineers do exactly that), becoming good at this will develop the right way of thinking that you need to solve problems of all sorts in systematic and efficient ways.
I remodeled the guide as a curriculum to be conducted on a weekly basis, as well as adding a lot to it. Again, it's a work in progress that I am doing in my free time, and I plan on properly breaking down the outline so that it evenly fits across weeks. We will try to meet twice a week and have extra content for the ambitious who want to do more at home, but the idea is that during the sessions we will cover one or two pieces of content for each subject and have extra to be done at home.
For those wanting to track their progress at home, just fork the repo and mark an [x] on the items you have done, commit and push it.
Instructions: not familiar with git yet? No worries http://rogerdudler.github.io/git-guide/ Or, if you are a University of Miami student, you have a free subcription to Lynda.com and you can take this quick start Git and GitHub course: https://www.lynda.com/Git-tutorials/Up-Running-Git-GitHub/409275-2.html
People put too much emphasis on IQ as opposed to emotional intelligence. After a certain level of IQ what really matters is dedication, passion, and good discipline toward your work. Most of the famous genius engineers that we all know and heard of struggled with these topics too at one point, but with the right discipline and passion they became really good at it by sticking to it. So never be discouraged!
Check the home assigned readings and videos for "The Myth of the Genius Programmer"
Inspiration for these technical challenges we will tackle:
Reading at home:
[ ] Start reading 20 minutes a day (or whatever fits your learning style/routine): Book: How Google Works
Talk points:
If they give you a hint, take it, don't be cocky
Discuss last session's coverage, and home readings. Very encouraged for students to share their insights with each other and motivations (20 minutes of discussion)
Cracking the Coding Interview with Author Gayle Laakmann McDowell (video)
'How to Get a Job at the Big 4 - Amazon, Facebook, Google & Microsoft' (video)
Reading at home:
1: You can use a language you are comfortable in to do the coding part of the interview, but for Google, these are solid choices:
You need to be very comfortable in the language, and be knowledgeable, so pick one, and do all the practice problems in that language. The more you practice the more natural it will look like you feel at developing with the language, and that's important even though knowing the syntax itself isn't. But there is a subconscious feeling we get by looking at the flow of someone working with something, and it's important to give interviewers that feeling
Use methods that will improve your memory for leaning, like spaced repetition, diffusive and focus modes of thinking, and etc (the learning how to learn course on Coursera was the most helpful resource on learning I used, but I continue to learn about this). But here's some basics stuff for you to get started:
I personally don't use flash cards because I just scan my notes and upload to Drive so they are always accessible from my phone.
Again, though interviewers say they don't care about you memorizing details, they do want to see that you're really good at what you do, so if you easily recall the details, you will look much better.
One of my struggles was trying to do too much at the same time. I not only wanted to get a job at my favorite companies, despite not going to a school where those companies would recruit, I also wanted to take a bunch of online classes on things that wouldn't help me with the interview or school, but would benefit my personal learning goals and career (such as machine learning and even stuff like philosophy and history and business). It is indeed possible to be good at all these things, but you can't do them all at once. ****Forget multi-tasking. ***** just schedule time in your calendar and focus on one thing at each time. If you can dedicate 2 hours of focused time to this guide every day, you will go a long way.
For each subject covered, read and watch the content covering it, and then implement it. Please, don't skip the implementation part, this is the most important one. Do not look at AVL trees and think "Oh we covered that in my algorithms class", the interviewer will never care what your class covered, he or she will ask you to implement it.
Also, write tests to make sure the code works. Most interviewers also ask you to do that. (Or at least run through test cases, but run them on paper, not simply by plugging the input in, because on the whiteboard they want to see if you can think through the code you just wrote.
So basically the process is:
Note: you should use standard libraries of python when practicing. Unless, for example, the question is sorting an array, then you should ask the interviewer whether he expects you to use the standard library or implement it yourself. When in doubt, always ask for clarification! Don't make assumptions, and don't be afraid to ask questions, it's a good thing.
The right answer is: the one that makes you the best. Period. Every artist and craftsman has the tools that make them the best as they can be. If that's Vim (which is for me) or Emacs, or Eclipse it's up to you. But try new stuff out. Check out some stuff about vim and emacs and you will understand how many different useful things editors can do beyond the basics:
You should be so comfortable (afte preparing and going through this) with algorithm complexity and Big-O notation that it is a natural process for you.
You should be able to look at algorithms and spit out what the algorithm complexity is, and as the name might suggest otherwise, it is not complex at all. In fact it is a method for quickly managing complexity while getting a good evaluation on how the algorithm will run for large-scale applications.
Imagine if you could do math, and simply get rid of all constants and lower order terms, and just say how the given function grows as the input grows, this is basically it.
Home reading
Here I will give a lecture on how data structures and algorithms relate to Big-O, why choosing the appropriate data structures and algorithms
can have a significant impact on asymptoptic complexity (Big-O). Furthermore I will make a clear distinction between algorithms and data structures,
and show that at the same time they work together, and that efficient algorithms make use of efficient data structures to boost performance.
I will focus on the big picture, giving an overview of popular and extremely useful data structures and algorithms, and in the future sessions we will dive into understanding the list of algorithms and data structures that students are expected to know.
Video:
We use queues in our daily lives everywhere, in front of lines in our rollercoaster rides, medical systems, banking, finance, everywhere. And they come in all sorts of forms. The most basic takes only time in consideration, namely the first elements will be the first to be attended.
Breadth-first search basically starts with an element and considers all the elements connected to it, before going to the next level. Whereas A* search looks into factors such as the cost of moving to the node and the estimated distance reduction to the goal. Video:
Hash Tables are beautiful things and extremely useful in a very large and diverse domain of applications. If you have seen them before, and you are under the impression that they are complicated, just forget anything you know about them. They are quite straightforward:
Videos: - [ ] [Core Hash Tables (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/m7UuP/core-hash-tables) - [ ] [Data Structures (video)](https://www.coursera.org/learn/data-structures/home/week/3) - [ ] [Phone Book Problem (video)](https://www.coursera.org/learn/data-structures/lecture/NYZZP/phone-book-problem)
We can see that finding an element here only takes O(log(n)) time for a generally balanced tree. We will also looking at the problem of unbalenced trees later (where most the height of one of the children is much larger than the other, and worst case run time is O(n), to solve this we have balancing algorithms)
Videos:
Videos:
Concept:
Example Application:
Binary search https://www.coursera.org/learn/object-oriented-java/lecture/Zmla4/core-binary-search
Quicksort
Talk points: Here we will see the importance of algorithms in designing efficient applications, and how we can benefit from using the advantages of efficient data structures and algorithms together to create very powerful systems.
One of the most basic algorithms is sorting. Everyone is familiar with sorting. In real life we might have a bookshelf sorted by alphabetical order, which is useful for retrieving and finding the correct book at a later time.
There are many problems where sorting first will help to solve the problem more efficiently.
Home:
Advanced String searching & manipulations - [ ] Sedgewick - Suffix Arrays (video) - [ ] Sedgewick - Substring Search (videos) - [ ] 1. Introduction to Substring Search - [ ] 2. Brute-Force Substring Search - [ ] 3. Knuth-Morris Pratt - [ ] 4. Boyer-Moore - [ ] 5. Rabin-Karp - [ ] Search pattern in text (video)
Home Videos:
Intro:
Classification:
Intro:
K-Means:
Applications:
For interviews, definitely know the properties and implementation of binary search trees. For balanced trees, know the general advantages of each, but you will probably not be asked to straight up implement an AVL Tree. You might have to do something that uses that idea where you would more or less end up inventing it on the fly.
AVL trees - https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees - https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation - https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge
2-3 search trees
Red-black trees
B-trees
Splay trees - In practice: Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors, data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory, networking, and file system code) etc. - [ ] [CS 61B: Splay Trees (video)](https://www.youtube.com/watch?v=Najzh1rYQTo&index=23&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd
MIT Lecture: Splay Trees: - Gets very mathy, but watch the last 10 minutes for sure. - Video
Red/black trees - In practice: Red–black trees offer worst-case guarantees for insertion time, deletion time, and search time. Not only does this make them valuable in time-sensitive applications such as real-time applications, but it makes them valuable building blocks in other data structures which provide worst-case guarantees; for example, many data structures used in computational geometry can be based on red–black trees, and the Completely Fair Scheduler used in current Linux kernels uses red–black trees. In the version 8 of Java, the Collection HashMap has been modified such that instead of using a LinkedList to store identical elements with poor hashcodes, a Red-Black tree is used. - [ ] Aduni - Algorithms - Lecture 4 (link jumps to starting point) (video) - [ ] Aduni - Algorithms - Lecture 5 (video) - [ ] Black Tree - [ ] An Introduction To Binary Search And Red Black Tree - https://www.coursera.org/learn/algorithms-graphs-data-structures/lecture/8acpe/red-black-trees - https://www.coursera.org/learn/algorithms-graphs-data-structures/lecture/JV7KI/rotations-advanced-optional - https://www.coursera.org/learn/algorithms-graphs-data-structures/lecture/jPL2x/insertion-in-a-red-black-tree-advanced
2-3-4 Trees (aka 2-4 trees) - In practice: For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce 2-4 trees just before red–black trees, even though 2-4 trees are not often used in practice. - [ ] CS 61B Lecture 26: Balanced Search Trees (video) - [ ] Bottom Up 234-Trees (video) - [ ] Top Down 234-Trees (video)
B-Trees - fun fact: it's a mystery, but the B could stand for Boeing, Balanced, or Bayer (co-inventor) - In Practice: B-Trees are widely used in databases. Most modern filesystems use B-trees (or Variants). In addition to its use in databases, the B-tree is also used in filesystems to allow quick random access to an arbitrary block in a particular file. The basic problem is turning the file block i address into a disk block (or perhaps to a cylinder-head-sector) address. - [ ] B-Tree - [ ] Introduction to B-Trees (video) - [ ] B-Tree Definition and Insertion (video) - [ ] B-Tree Deletion (video) - [ ] MIT 6.851 - Memory Hierarchy Models (video) - covers cache-oblivious B-Trees, very interesting data structures - the first 37 minutes are very technical, may be skipped (B is block size, cache line size)
Some Applications of Trees:
Heaps:
Dijkstra Graph Search Algorihtm
Use this: https://www.coursera.org/learn/algorithms-on-graphs
Graphs are a huge subject in computer science, there are many applications in which they are powerful. From modeling the relationships between people in social networks, to representing connections of genomic data in trying to understand patterns of diseases, they are very useful. There are many ways to represent them and we will understand them below:
Union-Find
Advanced Graph Processing (videos)
use resources from here https://www.coursera.org/learn/algorithms-on-graphs
https://www.coursera.org/learn/algorithms-graphs-data-structures
Knapsack:
Optimal Substructure:
Dynamic programming is quite simple. It takes advantages of two things seen previously: data structures and recursion.
Videos:
Weighted independent sets:
https://www.coursera.org/learn/algorithms-greedy/lecture/VEc7L/principles-of-dynamic-programming
Optimal Substructure
https://www.coursera.org/learn/algorithms-greedy/lecture/GKCeN/problem-definition
https://www.coursera.org/learn/algorithms-greedy/lecture/rUDLu/optimal-substructure
https://www.coursera.org/learn/algorithms-greedy/lecture/0qjbs/proof-of-optimal-substructure
https://www.coursera.org/learn/algorithms-greedy/lecture/3wrTN/a-dynamic-programming-algorithm-i
https://www.coursera.org/learn/algorithms-greedy/lecture/5ERYG/a-dynamic-programming-algorithm-ii
List of individual DP problems (each is short): Dynamic Programming (video)
More Dynamic Programming (videos)
See from skiena's slides, and within the extra content here in the guide and:
Edit distance: https://www.coursera.org/learn/dna-sequencing/lecture/ZDDOH/practical-implementing-dynamic-programming-for-edit-distance TSP: https://www.coursera.org/learn/advanced-algorithms-and-complexity/lecture/71PHI/tsp-dynamic-programming
Backtracking https://www.coursera.org/learn/comparing-genomes/lecture/TDKlW/dynamic-programming-and-backtracking-pointers
https://www.coursera.org/learn/algorithms-greedy
Probability:
MIT Probability (mathy, and go slowly, which is good for mathy things) (videos)
Complexity:
Bit manipulation C Programming Tutorial 2-10: Bitwise Operators (video) Binary: Plusses & Minuses (Why We Use Two's Complement) (video) 4 ways to count bits in a byte (video)
- [ ] LRU cache:
- [ ] [The Magic of LRU Cache (100 Days of Google Dev) (video)](https://www.youtube.com/watch?v=R5ON3iwx78M)
- [ ] [Implementing LRU (video)](https://www.youtube.com/watch?v=bq6N7Ym81iI)
- [ ] [LeetCode - 146 LRU Cache (C++) (video)](https://www.youtube.com/watch?v=8-FZRAjR7qU)
- [ ] CPU cache:
- [ ] [MIT 6.004 L15: The Memory Hierarchy (video)](https://www.youtube.com/watch?v=vjYF_fAZI5E&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-&index=24)
- [ ] [MIT 6.004 L16: Cache Issues (video)](https://www.youtube.com/watch?v=ajgC3-pyGlk&index=25&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-)
Very Basics first:
[What Is The Difference Between A Process And A Thread?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread
Understanding the Python GIL (2010) - reference - [ ] David Beazley - Python Concurrency From the Ground Up: LIVE! - PyCon 2015 - [ ] Keynote David Beazley - Topics of Interest (Python Asyncio)
Give talk on design and testing
This section will have shorter videos that can you watch pretty quickly to review most of the important concepts. It's nice if you want a refresher often.
Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.
Now that you know all the computer science topics above, it's time to practice answering coding problems.
Coding question practice is not about memorizing answers to programming problems.
Why you need to practice doing programming problems:
There is a great intro for methodical, communicative problem solving in an interview. You'll get this from the programming interview books, too, but I found this outstanding:
No whiteboard at home? That's fine, buy one. Or don't if that's really an issue, but just practice on paper and practice whiteboarding skills at school or something. You should really practice on whiteboard though, to mimick the real interview setting. But the main thing you want to practice is to practice under stress, there's nothing like coding in front of a guy who is going to decide whether you get a job or not, and then you're as nervous as you've never been before.
The solution? Practice that. How? Every interview you get the opportunity in doing, do it. Even if it's a company you don't care much about, you will still be practicing coding while someone else is looking at you and your subconscious mind constantly fighting you by making you afraid of being embarassed. Trust me, I had the biggest issues with this, the only way to get over it was to interview dozens and dozens of times, just like speaking in public or anything of the sort. The more you do it, the more you realize the worst case scenario is not nearly as big of a deal as your pessimistic-self anticipates, and in that process you will become less and less nervous each time you attempt something similar.
Supplemental:
Think of about 20 interview questions you'll get, along the lines of the items below. Have 2-3 answers for each. Have a story, not just data, about something you accomplished.
| Back | FazBrowse Home | New Git URL |