Jun 7, 2014

How to Find a Software Job for New College Grads

Looking for a job after Masters doesn't always turn out to be as easy a task as expected. Interview calls sometimes dry out. At other times, you consistently fail in converting an opportunity into an offer because you just aren't prepared enough.

Some people do have it easy here. Some have landed great offers, others have converted their cool internships into full time. While most people did deservingly earn their job titles, sometimes it just so happens that the job market is hot and finding one doesn't become such a challenge after all.

I didn't have a smooth ride with my job search. Having finished my Masters in Computer Science, I was up for some rough months ahead of me. I had to stomach a string of rejects and watching the ticking timebomb - the "90 Day OPT Unemployment Period" sure was scary. I landed a good offer just in time with a few days left in my unemployment period.

Here I outline some of my learning that I so wish I knew before I graduated so I could have tackled this whole job thing better prepared. The audience that I have in mind are regular folks that don't have an awesome research profile, are from regular universities and not the Ivy-ies, and those from humble backgrounds that wrote their first of "Hello, World" programs not before undergrad.

Technical Competence:
Technical competence, to me, is the biggest game changer. You wouldn't believe how unprepared job seekers are for the kind of technical questions that'll be fired at them. You're probably conversant at a high-level (superficial level?) with your Operating Systems, Databases, your Computer Networks and Distributed Systems. Or, maybe you're not! No matter what, at some of my interviews, subject knowledge was not my only savior. I was more often bombarded with questions on intricate and obscure features of programming languages, tricky questions on data structures, questions on algorithms and their running times.

It is of prime importance that you keep strengthening your programming skills and expanding your coverage of the advanced features of languages, along with your subject knowledge.

Programming Languages:
You need to know one or two programming languages in-depth, which will serve you well rather than basic syntactical familiarity with a million languages. Preferably, one of the two languages be Object Oriented. C and C++ were my languages of choice as most of my projects were in these languages. Taking C for instance, typical verbal interview questions that interviewers start off with are what the differences between C and C++ or C and Java are, bit and string manipulations. Make sure that you are comfortable with bit manipulations such as:

Q: How do you check if a bit at a given position is set in a variable?
A: By ANDing with a mask that has a set bit in the position of interest and zeroes in other places and see if the resulting value is non zero.

Q: How do you unset a set bit in a variable?
A: By ANDing with the negated version of the above mentioned mask.

Having a high degree of comfort with C pointers is essential for solving data structure problems such as trees and lists. And there's no escaping these problem types in a coding interview. Know when you'd use a pointer and when you'd use a pointer to a pointer, and how you'd use the same function pointer to call two different functions. I have listed some resources in the end for you to work on your pointers and data structures. If you're a Java person, you are spared the agony of pointers, but nail down your references.

Data Structures and Algorithms:
When you're interviewing with the big names, you'll spend the majority of your interviewing time fielding questions on Data Structures and Algorithms. Invest time in practicing implementing basic search and sort algorithms in your language of choice, without leveraging any libraries. Know which sort algorithm is better suited for a particular domain than the rest. As for data structures, knowledge of trees and hashes is vital. While you don't need to be very highly acquainted with complex trees like Red-Blacks and B-trees at the code level, ensure that you aren't totally ignorant of these structures at the conceptual level. The two Stanford documents I have listed in the resources, if studied through diligently, will lay an excellent foundation in Data Structures, as well as pointer manipulations.

Going The Extra Mile:
Being involved with an open source project will add pounds of weight to your resume. While I do understand that with the hectic schedule of Masters it is next to impossible to find time for open source work and that the entry barrier to get into real world open source projects is usually dauntingly high, you can at least get to know about a couple well known open source projects without actually getting involved. My interests were in Operating Systems and so I got started reading the FreeBSD architecture and a book on the Linux kernel. Its another matter that I never got around to finishing them both. However, it made me aware of how overwhelmingly complex these projects are, the technical competency needed to get involved, and how watered down the projects we do in our academics are. It surely makes you stop being smug about your "cool" college projects.

People Networking:
I have never been big into networking. Being an introvert by nature, I don't enjoy continually expanding my social circle all the time. While networking will surely come handy in your job search, it is not the only means by which you'll get that interview call. I got all my interview calls by way of my own job applications without any referrals, and I did get calls from the big names in the industry. These days, with LinkedIn and Indeed, the need to be in the inner circles of the "right people" is even less. Moreover, if you are not particularly good in your area of study, networking will hardly help.

Networking with professors, now, is a different game. I'd say this would bring more rewards than networking with your peers. It would be good to keep a few professors in your radar right as the school season kicks off and then maintain a persistent channel of communication with them. Visiting the professors regularly during their office hours, discussing subject matter, asking for volunteer work in their projects, and performing well in their courses get the professors interested in you, which could lead to a TA or an RA, or at the least, will keep you in their good books. These professors have valuable industry connections and could recommend you for jobs.

I'd say my perspectives about the usefulness of networking are limited. I'd rather focus on the other points listed above far more.

Internships:
Getting an internship makes a significant difference when it comes to hunting down a full time job. For starters, internships are relatively easier to crack than full timers, even at the tech giants. You don't go through as much filtering as you do for a full time opportunity. And once you're in, you stand a good chance of converting your internship into a full time, although this does not always happen.

Job Search:
I used LinkedIn and Indeed as my primary job sites. The keywords I usually used for my search were "New college grad", "Junior software developer", "Entry level", etc. When you get hits for your search, along with checking out the job postings, make a note of the recruiter who has posted the job. Visit the recruiters' profile and see if they've put down their email IDs. If not, google the recruiter's name with the company name (Ex: Google "John Smith @intel") to see if you can find their email address in the search results. If you do fish their email address out, email them your resume directly. I suppose LinkedIn Premium, which is a paid LinkedIn service, lets you email recruiters directly, and you can sign up for that if you'd like. I have not used it, however.

Effort and Positive Attitude:
At various stages during your job search, if you aren't getting enough interview calls or are not converting calls, you'll surely go through disappointments and demoralization. It is important that you just suck it up and keep going. Applying to *A LOT* of jobs is crucial, since the ratio of interview calls to job applications can sometimes be really low. Visit the careers section of every company you can think of. Heck, I had even checked out sites like rapidshare and torrentz for jobs. And yes, even Disney and Walmart - companies that don't immediately come to mind when looking for software jobs - hire software engineers.

Resources:
Here I list some resources for your job preparation-

C++ - I referred to C++ wiki books for my C++ conceptual studies.

Careercup - A site where you find real interview questions from various companies. Try to get through a healthy number of problems here.

Cracking the Coding Interview - Highly recommended. Prepares you for the kind of questions asked at the gaints of the tech industry.

Stanford Linked Lists and Stanford Binary Trees - *A MUST*. These are two PDFs that you can easily google out, which cover almost all trick questions on Linked Lists and Trees. Working through these two docs religiously will save you from blowing your coding interview.

Its good to be skeptical of one person's opinions, no matter how right he sounds. My limited job search/life experiences have lead me to believe these items might work for a job seeker. There are people that might disagree with me with certain pointers, like say, people networking. Its up to you to make a rational, informed choice on what you think works for you. But no matter what, nothing will replace hard work and competency in the long run.

No comments :

Post a Comment