First the Zen...
Walk in like you're the hottest thing in programming since Joel Spolsky...
Translation - Be calm, cool and confident! (not arrogant!) Imagine that this company really, REALLY wants you... and you're gonna go in and evaluate whether its a cool company to work at...
Of course you need to back this up with some quick thinking and some even quicker coding/answering.
Then the Basics...
You need to go and
revise study all the "Data Structures & Algorithms" stuff you'd (hopefully) done back during your second year of engineering!
You need to be able to play with pointers in C...
You need to be able to analyse algorithm complexity... yes the big O is important!
And you need to really grok recursion!
And of course...Object Oriented Programming concepts...
I'd recommend Data Structures and Algorithm Analysis in C++ by Mark Allen Weiss & Object Oriented Programming in C++ by Balgurusamy.
The Next Level...
What you need to really seal the deal is some advanced programming techniques like Dynamic Programming, Memoization, Backtracking etc.
Just reading a couple of tutorials on these & solving a couple of the problems in your head is not going to work. You really need to get your hands dirty and practice coding these. The best place to get cracking at the "advanced techniques" is at the TopCoder Algorithm Contests. They've got tons of practice rooms that are made for this!
They've also got the best tutorials...
Course stuff... (for those fresh out of college)
Depending on who's interviewing you, they might ask you about the fundamentals of Networking, DBMS & Operating Systems if you've studied these courses. You should be able to talk about you're Degree Project. Why you chose it... and what you've done in it...
Work / Project stuff...
You should be able to talk about the area in which you've worked... and about you're specific contributions to the projects.
You should be abreast with the latest in the field... and you should also know about the domain of the company you're interviewing with.
Also... you REALLY should be able to explain how the Internet works today!
Must Read Articles... (apart from this one...)
Joel Spolsky's Guerrilla Guide to Interviewing
Steve Yegge On Interview Preparation (SteveY read my original post, drank some wine and basically elaborated on all of my points...; ))
General Interview Strategy...
Lessons from a Microsoft Interview...
There's lots more to add... but get the basics handled first... then we'll talk about the rest...
Feel free to comment and ask me anything...
Note : All these "Interview Tips" will help only when applied on top of an already solid base of interest, curiosity, passion and skill in programming and building software.
Don't think you're gonna be able to fake your way through multiple tech interviews.
(So what if I managed to do that both at Google and at Microsoft? ; ) )
Friday, 16 May 2008
First the Zen...
We need to hire a dev vendor in my team at Microsoft IDC, for the (top secret ; ) ) project I'm working on.
I was waiting with anticipation for some candidates to show up... because I'd just finished my "Smart Hiring @ Microsoft Interviewer Training", and I couldn't wait to get my hands on a smart but nervous, unsuspecting candidate... to experiment with! Bwahahaha!
One fine (late) morning I strolled into office to see a Candidate being interviewed by my teammates. The first bakra (erm bakri), had arrived! *evil grin*
Lets call her Candidate. Her resume said that she has a Masters in Computer Applications, and 3 years of work experience in "ITServicesCompany" . It also said that she was proficient in .NET, C#, ASP.NET etc...
They had asked her a few questions about C# etc, and she seemed to have done decently, though she had no clue about ASP.NET or web programming!
So we (My Dev Lead Kiran and I) decided test her "problem solving skills", "object oriented concepts" etc. We dint ask them what they thought of her cos we wanted to form my own independant opinion of her.
The First Question...
After some small talk, we gave her a simple warm up question -
Q. Write a function "IsSmaller" to compare 2 dates, where the dates are represented as integers with the 4 most significant digits being the year, then the month, then the day.
eg. int todaysDate = 20080516;
int tomorrowsDate = 20080517;
// Today's date will be smaller than tomorrow's.
She took 5 mins to settle down and understand the required function signature. (For some reason she wanted to print the smaller date in the function instead of returning a bool - reminding me of our college programming assignments...lol).
She : Ventures a guess - "We can use the .net class Date and its Convert function".
We : "Erm... How?"
She : Rambles unclearly about Date.Convert.
We : "We're glad you know about the Date class, but is there any other simple way of doing it... really simple... without any library classes? Use any language, even pseudo code is fine."
She : "We can convert it into string and then compare the year."
We : "Uh huh" (gave her some examples to work out...)
She : "We'll also need to parse the month."
We : "That's it? Only year and month?" (gave some more contradicting examples)
She : (still lost...)
We : "Apart from strings and converting...any other way?"
She : "Date Class"
We : *sigh* "Ohk... can you write a function to convert the integer to a string?"
She : "We can use the Int.ToString() method."
We : "Erm, we meant without using that library method!"
Struggling, she finally figured how to convert a single digit number to a character after lots of prodding and hinting. But she failed to realise why or how it wouldn't work if the number was more than one digit, say 12.
We gave up : "Ok... we'll get back to this problem... Moving on..."
The Next Question...
Q : How would you sort an array of a million integers where all the integers are within the range from 1000 to 2000?
She : (goes into QuickSort, MergeSort etc.)
We : "Ohk.. what all sorting techniques do you know?"
She : "QuickSort, MergeSort, BubbleSort... erm... umm... InsertionSort..."
We : "Complexities? "
She : "Quick and Merge are O(nlogn)... Bubble is erm... O(2n)"
We : (Scared to ask her what the "Big Oh" meant...)
We : "Are you sure... about BubbleSort... how many loops are there?"
She : (after fumbling for 2 mins) "N squared!"
We : Phew!
We : "Ohk... what if i have an array of 20 numbers all between 1 and 4?"
She had no clue we were trying to get her to think of CountingSort/BucketSort!
Then I had her sort 10 numbers manually... Still she couldn't describe the BucketSort Algorithm that she used!
We : "Ok... If you had to write a routine to sort 10 numbers, what would you use?"
She : "InsertionSort"
We : "1 million numbers?"
She : "QuickSort"
We : "10,000 numbers?"
She : "InsertionSort"
We : "Good...Why?"
She : Thinking... Struggling... "I had read this long back in a book... but I cant remember now!"
We : AARGH!
I gave up...
Kiran gave her some very basic, typical problem on inheritance, and overriding functions, and again she had no clue!
Frankly, I wouldn't hire her to write code if someone paid me for it! Cos I'd have to sit and clean up all her crap, after spending a day trying to explain to her what she needs to do and how!
It's not that the Candidate was stupid. The problem is that she probably doesn't care about programming and/or doesn't have very much of an aptitude for it. She probably just studied MCA to get a job in the "hot" IT industry.
I came out thinking...
"What a waste of time... She wasn't even cute! How can someone be so clueless?!
WHOA! I am SOOO much better than her! Ouch... did I just compare myself with her?
Now I know why it is so hard to find good programmers and why Microsoft/Google etc pay us so much!"
The interview gave me a brand new appreciation not only of my own programming skills, but of everyone at MS... Especially those guys who we sometimes judge for not being as sharp or fast or good programmers... Every single developer, every single tester and almost every PM at MS understands, likes, and "gets" software!
This is one of THE reasons I love working at Microsoft! I'm surrounded all day by awesome, supersmart, or at the very least super intelligent people who love what they do!
What about you? Can you answer the "super-tough" questions we asked our candidate? ; )
Which reminds me, I need to import my post on "Microsoft/Google Tech Interview Tips" from My Space to this Blog.
Thursday, 1 May 2008
"The hallmark of an architecture astronaut is that they don't solve an actual problem... they solve something that appears to be the template of a lot of problems."Well, I have seen a fair bit of this from Microsoft... and the big companies in general...
They tend to become so obsessed with being the "platform", and "enabling developers to make the coolest apps" etc, that they forget that the bright young kids they hire could possibly make "the coolest apps" inside Microsoft itself!
Its as if they'd rather leave the "creative", "awesome", "remarkable" apps that users love and need for the start ups and high school kids to write on top of their platform. And then they gloat about how their platform enables people to realise their potential!
(No wonder MS branding is not everything it could be...)
They'd rather attack the technically tougher challenge of building the platform, than the more creative challenge of dishing out killer apps!
But then again, that's one of their strengths isn't it? All the complex architecture and technology... That's something MS can do and a high school drop out start up simply can't.
Me thinks Joel's right about "solving a real problem and giving the customers what they need and want". Thats brilliant advice for everyone... From start ups and small companies... to the gigantic Microsoft, Google, IBM etc...
But on the other hand, someone's gotta be building the next big platform! Microsoft built the last big platform... Windows! And look what that got them... (a vibrant eco-system of software and developers... and... um... also billions of dollars year after year!)
They're out trying to build the next big platform - "The Cloud", and Live Mesh is an integral part of that strategy. They're simply leveraging their strengths (tons of experience and brilliant programmers), and following a tried and tested and successful strategy.
MS should continue building all these "cool new" platforms, but along with them, they should think about what the consumer wants, and deliver that killer app!
Look at Google... their "cloud strategy" started with Gmail (email had been done to death before that), then they added docs and spreadsheets, and reader, and tons of other really useful apps.
They've now gone all the way with Google Apps and AppEngine... Both cunsumers and developers love Google!
Microsoft could take a page out of their book...
The Next Big Thing?
Well, I can see where Joel's coming from here...
"It sort of bothers me, intellectually, that there are these people running around acting like they're building the next great thing who keep serving us the same exact TV dinner that I don't want night after night.
...it's a fun programming exercise that you're doing because it's just hard enough to be interesting but not so hard that you can't figure it out."
One of my friends, Archis actually works on Live Mesh, and I had been hearing "top secret" things about it since 2 years before I saw the demo...
I couldn't help but feel that it was... well... a teeny weeny little bit overhyped!
It dint make me go "WOW!"... I was like..."NICE! This thing does have some potential...!"
Though I have access to it, I haven't yet tried Live Mesh... Which goes to show that its not really super compelling to me...
But having said that, I do definitely plan to check it out soon... (I AM kinda struggling with keeping my files in sync and sharing files with friends... And Live Mesh does sound pretty cool!)
I know file syncing and sharing has been done. But "the idea's been done before", is just not enough reason to NOT do something cool and raise the bar while you're at it... Both Microsoft and Google have done this successfully time and again!
Live Mesh Potential...
Apart from "building a platform, and not just an app", I think the cool new thing about Live Mesh is connecting all your computing devices (computers, mobile phones, music players, xboxes etc) together seamlessly.
Ashutosh puts this point pretty well...
"Our desktops and other devices (e.g. phone) are like big silos of applications, data and information. They exist as isolated entities that connect to the net primarily through browser. That's the reason we see a crop of these web based applications (even a so called OS) that hardly integrate closely with the rest of my desktop.And it gets cooler...
I think Mesh is trying to break that model and open up those silos so that all my devices and their content is always accessible to me wherever I am."
The part I really like is the promise of customising the experience of the same app/data for different devices to make optimum use of the devices' capabilities, thus leveraging each devices unique advantages while making room for the weaknesses.
I can't wait to see some killer apps here!
Why's Joel Ranting?
I think Joel has some super revolutionary ideas (like Wasabi!?), but just can't afford the brilliant programmers to implement them... And is pissed off cos MS & Google have tons of them working on stuff he feels is over hyped...
The fact that MS and Google are driving up the cost of brilliant, apart from hoarding all of them seems to have pushed him over the edge!
I "get" you're pain Joel... But I'm one of them "unsuspecting comp-sci college grads" right now...
I've been "victimised" by both Google and Microsoft...
And I like it!
ReactOS® is an advanced free open source operating system providing a ground-up implementation of a Microsoft Windows® XP compatible operating system. ReactOS aims to achieve complete binary compatibility with both applications and device
drivers meant for NT and XP operating systems, by using a similar architecture and providing a complete and equivalent public interface.
ReactOS is the most complete working model of a Windows® like operating system available. Consequently, working programmers will learn a great deal by studying ReactOS source code and even participating in ReactOS development.
ReactOS has and will continue to incorporating features from newer versions and
sometimes even define the state of the art in operating system technology.
In short, ReactOS is aiming to run your applications and use your hardware,
a free operating system for everyone!
I found this old (July 2006) but useful review of ReactOS...I'm no Operating Systems expert... but I love their smart and pragmatic approach!
They're rebuilding the Windows Kernel from scratch. They realise that Windows NT Architecture is modern, and that NT has learned from and improved upon design flaws in UNIX. So they're incorporating the latest in OS design, and keeping the code lean. (Or at least they're trying to)
Through a windows clone, they lower the cost of switching from MS Windows to ReactOS, while keeping some of Windows' biggest advantages :
- Over 90% of computer users are comfortable & familiar with the Windows user experience (and hence also ReactOS)
- Windows has an amazing eco-system of software and developers writing for the platform.
They also get all the advantages of being Open Source...
Interesting... Definitely more interesting than Linux!
Should Microsoft be worried? Not yet methinks...