Ask HN: 8 years working, now 3-4 months off to learn. Looking for advice
Now at age 33 I'm considering taking 3-4 months after this contract to take the following 3 courses:
- http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/Syllabus/
- http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-- 2011/Syllabus/
- http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2015/calendar/
I want to stop contracting and apply to a company solving real problems after this process, google, facebook, zalando, amazon, etc..
I have always felt terrified of the google interview process, or any test on a whiteboard for that matter.
In the 3 months, I plan to work 6-7 hours a day and get a tutor 3-4 times a week on chegg.com. If I have time left I would also like to work through cracking the coding interview.
Would love any feedback on this idea, i.e. if I'm missing the mark, or picking bad courses it's best to know now.
121 comments
[ 271 ms ] story [ 680 ms ] threadCracking the coding interview is pretty good, but you'll go crazy if you just try to work through it straight without any other content to broaden your perspective.
I'd suggest doing challenges on Topcoder, Hackerrank, etc. to help reinforce the concepts. These questions are very similar in format (if not content) to those you'll see in your interviews, so it's helpful to get thinking in these kinds of modes.
If you're not already comfortable coding on a white board, or talking and coding at the same time, you'll want to work on those as well. Even some simple rubber duck programming will be useful.
Note that the above is probably not going to be anything new to you - you've probably already read this in a bunch of other blogs you found while googling. I repeat it only to reinforce its accuracy.
Buy a whiteboard and a rubber duck and practise away. Take a video of yourself, review and polish. 4-6 weeks should be more than enough. So then you could treat yourself to a vacation.
All suggestions here are great but don't forget that whiteboard coding is the main part but not the only part of the interview. Practice answering architecture questions (conveniently, they can be practised without actually building any services) and other types of questions (find out which ones).
Also think hard about your goal. "Getting into Google" is too abstract. Google has all sorts of teams, from the ones doing hardcore legacy maintenance to the ones doing some crazy cutting-edge stuff. The catch is that competition to get into more prestigious ones is crazy. Try to figure out (don't know how to do it though) if you have a chance of making a team that does something that you personally find interesting, or you are bound to be disappointed.
What are some good resources to learn about system architecture?
I find suggestions in part 4 of this article: http://blog.triplebyte.com/how-to-pass-a-programming-intervi... quite reasonable. The rest of the article is also excellent. And it is short!
The key here seems to be breadth - even if you have designed a few successful systems yourself, your breadth may be inadequate to talk smoothly about a system design problem which is unfamiliar to you in an hour-long interview. So learn your building blocks, get some ideas from architecture talks and blog posts by tech companies and sharpen your talking and hand-waving skills.
Domain Driven Design (The book is hard to read, but worth it I think) http://martinfowler.com/tags/domain%20driven%20design.html
This uncle bob talk is not too bad https://www.youtube.com/watch?v=WpkDN78P884
I think the microsoft guide is the most comprehensive, but don't limit yourself to it.
I would add: if you have additional time, it's worth starting to learn about machine learning. More and more problems are being attacked with machine learning models, that a few years ago would have required with hand-coded algorithms/rules or basis statistical techniques.
Learning about ML may not help you much with the core of the interview process (algorithms, data structures, and system design), but it will give you a better idea about the types of problems you might want to work on.
[0]: https://www.careercup.com/video
I mean I do not want to underestimate your skills and intellect but look at what happened to Geohot and I believe he is above your average MIT/Stanford graduate
Cracking the iphone was great, but disparaging top notch organizations (Carnege, Tesla, Vicarious, etc.) sounds more like narcissism than reality.
'From 2007 on, Hotz became a coding vagabond. He briefly attended Rochester Institute of Technology, did a couple five-month internships at Google, worked at SpaceX for four months, then at Facebook for eight. The jobs left him unsatisfied and depressed. At Google, he found very smart developers who were often assigned mundane tasks like fixing bugs in a Web browser; at Facebook, brainy coders toiled away trying to figure out how to make users click on ads. “It scares me what Facebook is doing with AI,” Hotz says. “They’re using machine-learning techniques to coax people into spending more time on Facebook."' http://www.bloomberg.com/features/2015-george-hotz-self-driv...
However, the problems solved at Amazon, Google and Facebook aren't necessarily more "real" than what you're solving now. Google also builds a lot of Java webapps. Sure, there are many advantages to working at these companies, but be aware that you most likely won't end up on the team that builds the algorithms for the self driving car or the machine learning powered object detection for photos.
If you got the savings, I would say go for it and take the time to learn. I don't know how helpful the math for computer science course will be but understanding various algorithms is useful for general knowledge and especially for interviews. Once you know basic algorithms, start on cracking the coding interview, hackerrank etc.
Lastly, I would say the grass is always greener on the other side, so don't disregard all you have accomplished and all that you will continue to do. If you think you will enjoy a job at a top company, go for it, but don't do it because you think what you are doing is inadequate.
Based on your plan, you would become better versed in several areas of theory, but still limited to being a Java programmer - which in turn will probably lock you into the enterprise space. Unlikely to give you real problem solving opportunities.
@grobaru hit the nail on the head. The established firms you list are either going to hire you for your general programming knowledge or for a specific project. In the latter case domain knowledge and experience is going to be valuable.
I think you need to revisit your goals. What industries do you prefer to work in? What domain knowledge do you bring to the table? Look at what languages, frameworks are used in those areas and then get some experience with them. And have you considered startups? Their mission and problem domain(s) tends to be more focused than the big companies.
I'm not a particularly social person: I mostly just like staying home and working on coding projects in my off-hours. I didn't made friends or "expand my network" at my last few jobs; I just showed up, did work, and went home.
People always say "do contracting to save up money if you want to do a startup", but I have no idea how to get off the ground. I certainly have a lot of skills, but I'm not sure who I could possibly sell them to.
Is this when I just start cold-calling? I get the sense that nobody on HN is ever really bothering with inbound marketing for contracting services; I constantly see "programming talent is a seller's market" and "just use your network", but never anything about running ads for your services or anything.
it requires being social and talking to people. if you can't do this, just get a normal job, dude. you're barking up the wrong tree. nobody just sits around and gets contracts handed to them. anyone who tells you that is bullshitting you.
Depending upon your areas of interest, you might also want to look into related open source projects and attempt to contribute. Chances are that you'll learn a fair bit in the process.
[0] https://www.edx.org/course/introduction-functional-programmi...
I have recently found "Elements of Programming Interviews" [1]. For people with 5+ years of experience trying to clear Google style interviews, this is the perfect book for following reasons:
+ The quality of problems is much much better than the other two books popular in this category ([2,3]). I am not saying problem are hard, but they found a right balance between quality and solvability in interview setting. + The solutions are methodical and of high standard. For experienced people, problems in [2,3] may appear too dumb down. + It has some 260 or more problems covering various areas of CS. By going through this book, you should get CS fundamentals and interview prep in one shot.
I have all three books but strongly recommend EPI
[1] Elements of Programming Interviews [2] Cracking the Coding Interviews [3] Programming Interviews Exposed.
I have no affiliation with authors/publishers of [1]
[2] has a good soft skills section and is a medium difficulty workbook. I felt that Gayle did a poor job explaining the solution to the problems. I used the book in a guess and check manner.
[1] wastes little time explaining the basics and ramps up very quickly. It does a very good job of explaining the problems, although there is an assumption that the reader is advanced. Some problems are so difficult that they would never appear on interviews.
If you're starting out fresh, I recommend the sequence: [3] -> easy leetcode -> [2] -> medium leetcode -> [1]
[2] 4.5 stars (216 reviews) $27 https://amzn.com/dp/0984782850
[3] 4.5 stars (94 reviews) $16 https://amzn.com/dp/B008SGNJOW
For example, you want to do some graphics programming, maybe a raytracer, and that leads to thinking about projective geometry and linear algebra and whoah, a few years later all of that stuff is useful when you end up in a machine learning job. (maybe)
But back to the plan, if that's your thing. All the blog posts that complain about the "interview process" seem to be about how they don't understand dynamic programming. So, put that at the top of your list! (And by the way it is loads of fun.)
But yes, learning new things is always good. I too 1 1/2 year off to do a master degree in CS.
The bigger the company, the smaller the feeling of doing something 'real'. Just my experience.
For learning Algorithms and data structures for interviews
1. Coursera courses on Algorithms by Prof Roughgarden
2. Coursera courses on Algorithms by Prof Sedgewick
3. OCW 6.006 as listed above would be good too.
4. Prof Skiena's algorithms course
5. Berkeley CS 61b by Prof Shewchuk for refreshing basic Data structures like Linked list, tree traversals which are not covered in above mentioned courses.
For practice,
1. geeksforgeeks.org
2. leetcode.com
3. interviewbit.com
4. careercup.com
5. Hiredintech.com
6. topcoder, hackerrank , spoj etc are good sites for practice in general but their problems are embedded with extraneous information not seen in interviews. For example, interviewer is not going to explain you 2 page story, instead he will tell you directly what needs to be done.
In books,
1. Cracking the Coding Interview
2. Programming Interviews Exposed
3. Elements of Programming Interviews
Books on Design Patterns
1. GoF
2. Head first design patterns
3. Software Architecture books by Robert Martin
4. Elements of Enterprise Architecture Patterns by Fowler
5. System Design research papers, gainlo.co has many design questions
I wouldn't prepare specifically for the interview yet. I know that others are very skeptical of the algorithms interview, but I conducted it myself many times, and I'd like to defend it. When done right, the goal is to see how you think about algorithms. I didn't care about whether you jumped to the solution as much as I wanted to hear you think out loud.
My goal was to decide whether I could see myself developing a new algorithm with you as a peer. For many interviewees who lacked a former CS background, the answer was clearly, "No." You need to have a basic and intuitive understanding of Big-O notation, and you need to be able to develop an algorithm yourself. These courses will teach you exactly that (though you absolutely must do the problem sets as well).
Now, it is true that the interview process has its own quirks. So, get experience. Apply to a bunch of jobs, and try to setup interviews with other companies before you even have a phone screen with a company you really want to work for. As with developing algorithms, nothing beats experience. However, I really believe that this step should be secondary to learning the fundamentals. They truly are the basis for the rest.
[1] https://www.coursera.org/learn/algorithm-design-analysis
Understand all of Cracking the Coding Interview. Surround yourself with other developers who know the material well.
Long answer:
The big 4 hire thousands of engineers a year.
They have an interview process that brings in developers who can "get the job done". What I mean by this is that 99% of those thousands of developers won't be building anything groundbreaking.
Before you decide you want to work for these guys ask yourself why you want to work for a big company.
Is it:
- To get away from contracting - do you feel trapped?
- You're not learning any more or getting anything out of contracting?
- You just want to try something different?
- You want to work on a specific team in a specific company because their problem is interesting and unique?
Another thing that's interesting - you say the interview process terrifies you.
You need to ask yourself why it scares you.
A lot of the time when something terrifies you it means that you need to expose yourself to it.
Ask yourself:
- What's the worst that could happen? (you fail the interview and you're in the same place as you were today, just with more experience)
- What do I lose by going into one of these interviews without being prepared (you can't interview again with this company for a year)
- What do I gain by going into one of these interviews without being prepared (you get a feel for how the interview process works)
Don't be afraid of failure - it's the key to success.
The bigcorps are the only people hiring here (Vancouver, BC) that pay anything sensible. :/
If the answer is "well actually I haven't tried yet, but I hear it's really scary" then maybe a better plan is to go interview with google.
They really want to find people who are good at programming computers, which you seem to be. They want that even more than they want to humiliate people with impossible algorithm trivia, believe it or not.
Seems like you might save yourself a few months of no fun, and end up landing your dream job in the process.
But generally you're right, he should apply sooner than later. But it's not worth it without feeling pretty solid on the material that's public knowledge that they quiz you on.
(I'm someone who only had a week and a half to prepare for my interview at Google and I don't recommend that little preparation)
Even if your BS in SW had been heavy on math, it wouldn't likely matter much now that several years have passed where you haven't used that education.
As others have said, practicing for the type of interview you'll be subject to at these companies is probably a better plan than taking a bunch of online courses.
My concern is that you seem to equate "solving real problems" with only a handful of companies, and it turns out that those companies are somewhat known to all have this particular interview style which will require you to memorize algorithms and data structures (even if you won't use those skills on a daily basis at that job).
Essentially, you're talking about taking a few months to prepare for the interview that most entry-level candidates with "Big4" aspirations prepare for after graduation.
Another option would be to consider whether there are other companies solving real problems (of course there are), and whether or not these other companies would subject you to the same style of interview (probably not).
Other companies won't interview the same way, and still solve big problems. I'm not sure if this is something you'd considered, but thought I'd throw it out there.