Note: I asked this question in early 2009. A couple of months later, I found a great job. I've previously updated this question with some tips for whoever ends up in a similar situation, and now cleaned it up a little for the benefit of the fresh batch of graduates.
Original post:
In my early 20s I abandoned a great C++ development career path in a major company to go to graduate school and get a research masters (3 years). I did another year in industrial research, and then moved to the US to attend graduate school again, getting another masters and a Ph.D in software engineering from a top school (another 6 years down the drain). I was coding the whole way throughout my degrees (core Java and Eclipse plug-ins) and working on research related to software engineering (usability of APIs).
I ended up graduating the year of the recession, with a son on the way and the prospects of no healthcare. Academic jobs and industrial research jobs are quite scarce. Initially, I was naive, thinking that with my background, I could easily find a coding job. Big mistake. It turns out that I'm in a complicated position.
Entry level positions are usually offered to college undergraduates. I attended my school's career fairs, but you could immediately see signs of Ph.D. aversion and overqualification issues. Some of the recruiters I spoke with explicitly told me that they wanted 20 year olds with clean slates, and some were looking for interns since they are in various forms of hiring freezes.
I managed to get a couple of interviews from these career fairs and through recruiters. However, since I've been out of school for a long time and programming primarily in Java, I am also no longer proficient in C/C++ and the usual range of college-level interview questions that everyone uses. I had no problems with this when I was 19 and interviewing for my first job since a lot of what you do in C is manipulate pointers and I was coding C++ for fun and for school. Later I was routinely doing pointer manipulation on the job, and during my first masters taught college courses with data structures and C++. But even though I remember many properties of C++ well, it's been close to ten years since I regularly used C++ and pointers. As a Java developer I rarely had to work at this level, but experience in OOD and in writing good maintainable code is meaningless for C++ interviews. Reading books as a refresh and looking at sample code did not do the trick.
I also looked at mid-to-senior level Java positions, but most of them focused on J2EE APIs rather than on core Java and required a certain number of years in industrial positions. Coding research tools and prior C++ experience doesn't count.
So that sends me back to entry-level jobs that are posted through job-boards, and these are not common (mostly they are Monster junk), and small companies are even less likely to answer a Ph.D. compared to the giants who participate in top-10 career fairs. Even worse, in many companies initial screening is done by HR folks who really don't want to deal with anything anomalous like a Ph.D.
Any tips on how I should approach this intractable position? For example, what should I write in cover letters?
Note that while immigration is not an issue for me, I cannot go freelance as I need the benefits (and in particular group health insurance). During my studies I had no time to contribute to open-source projects or maintain a popular blog, so even if I invested in that now there would be no immediate benefit.
Updates:
In the two months after posting this I received several offers to work as a core Java developer in the financial industry and accepted one from a firm where I am working to this day. For those who find themselves in similar situations, here are my tips:
Give up on trying to find an entry level positions. You can't undo time.
Accept the fact that there is Ph.D. discrimination in the job market (some might say rightfully so). It is legal to discriminate based on education. No point fighting it.
The most important tip is to focus on the language you are comfortable with. The sad truth about programming in a particular language is that it is not like riding a bike. If you haven't used a language in the last few years, and can't actually apply it routinely (not just as a refresher) before you start your search, it is going to be very difficult to do well in an interview. Now that I'm interviewing others, I routinely see it in folks with a mixed C++/Java background. We maintain "a shadow" of the old language but end up with a weird mix that makes it hard to interview on either. Entry-level folks are at an advantage here since they usually have one language. Memory can help you do great in a screening interview, but without recent day-to-day experience, code tests will be difficult.
Despite the supposed relation, core Java programming and J2EE programming are two different things with different skillsets. If you come from academia, you likely have very little J2EE experience and may find it hard to get accepted for a J2EE job. J2EE jobs seem to have a larger list of acronyms in their requirements. In addition, from interviewing J2EE developers it seems that for many there is a focus on mastering specific APIs and architectures, whereas core Java development tends to be secondary. In the same way that I can no longer manipulate pointers well, a J2EE developer may have difficulties doing low level Java manipulation. This puts you at a relative advantage in competing for core Java jobs!
If you are able to work for startups (in terms of family life and stability) or migrate to startup-rich areas such as the west coast, you can find many exciting opportunities where advanced degrees are a benefit. I've since been approached by several startups, although I had to decline.
Work through a recruiter if possible. They have direct contacts with the hiring parties, allowing you to "stand out". It is better to get a clear yes/no confirmation from a recruiter on whether a company might be interested in interviewing you, than it is to send your resume and hope that someone will ever see it. Recruiters are also a great way of bypassing HR. However, also beware of recruiters. They have a vested interest and will go to various shady practices and pressure tactics. To find a good recruiter, talk to a friend who declined a job offer he got through a recruiter. A good recruiter, to me, is measured in how they handle that.
Interview for the jobs that require your core strength. If you're rusty or entirely unfamiliar with a technology around which the job revolves, you're probably not a good match. Yes, you probably have the talent to master them, but most companies would want "instant gratification". I got my offers from companies that wanted core Java developer. I didn't do well on places that wanted advance C++ because I am too rusty and not up to date on recent libraries. I also didn't hear from companies that wanted lots of J2EE experience, and that's ok. Finding companies that want core Java without web is harder, but exists in specific industries (e.g., finance, defense). This requires a lot more legwork in terms of search, but these jobs do exist.
There are different interview styles. Some companies focus on puzzles, some companies focus on algorithms, and some companies focus on design and coding skills. I had the most success in places where the questions were the most related to the function I would have been performing. Pick companies accordingly as well.
As someone who's also coming out of a Ph.D. program in the middle of a recession but who happens to have been hired for a job I like very much, I'm a little confused by this post. Here's my advice:
Stop perpetuating the nasty stereotypes people have about PhDs [1].
You do have prior industrial experience at Intel and IBM Research, neither of which are shabby places. You were awarded an IBM Ph.D. Fellowship, and you're coming out of the top computer science program in the country with a Ph.D. that focuses on software engineering. And you're saying you can't find a job? I think you're just not selling yourself well.
It really frustrates me when other grad students shy away from the gory details of coding. Granted, most of us came to grad school to work on hard problems, and the hard parts of many of these had more to do with math or theory than with actually becoming proficient at coding.
But coding is what this computer science stuff boils down to at the end of the day, and if you plan to do something practical (e.g. industry or government work) after you're done, then you should know how to code! Heck, even if you're planning on going back into academia, if you're publishing about something practical like software engineering then you should know how to code!
Sell yourself better.
The confusing thing about this post is that you really do seem to know what you're doing. You've got industry experience, you have your own freely available open-source project [2] that seems to involve some reasonably sophisticated static analysis, and you're pretty active on StackOverflow. This sounds like really good coding experience to me!
It seems like to me you've encountered the tough job market and gotten a little scared, and you're worried that employers are going to realize that you don't know all the details of the latest J2EE framework. But this is the sort of thing that you can pick up. Open a book, learn the architectural features, and don't worry about the nitty-gritty details. I think you have more than enough coding experience to show you can figure that stuff out in an interview.
The thing you should really be worried about is giving people the impression that you're one of these software-scared PhDs. If you talk to employers and say "hey, I don't really know these frameworks but do I still have a chance at a job with your company" then of course they're not going to be interested. But if you roll up your sleeves, brush up on the practical stuff that it's obvious you know how to do, and say "I've done significant research on software development, I keep up with the industry blogs and websites, I've worked on real projects before, and here are some ways I think I could contribute to your project" then I think you're going to get a much better reaction.
Use your connections.
The only other recommendation I have for you is not to seek jobs through career fairs or monster.com. CMU has to have an extensive network of alums. Use it! And if you worked at the places you listed on your resume, you must have some pretty good connections. Use them!
Also, there are plenty of industry places (e.g. Google) that consider a Ph.D. a plus because they work on really hard problems. But again, they expect you to know how to code. There's no substitute for this. You need to just roll up your sleeves, learn it, and show people you have practical skills and can work on practical problems, even if you
Dude...if you have a PhD and claim to have been able to code all those algorithms in your early college career then there is no excuse for you to not be able to remember your C coding with barely a day's effort. Stop whining and making excuses for yourself. There's no pity party for you here. Most people have a difficult time finding a new job. Most people haven't worked on the particular tasks they are being interviewed for in years (if ever). The difference is that most people begin studying for positions they apply for when they apply; Not after hearing back from the company. If you want a job, put in the effort it takes to find one. Finding a job is a full-time job. While there are some exceptions, your PhD gives you an enormous advantage. Maybe you are short selling yourself and that is your problem. Rather than entry level positions, you should be looking for senior level positions. I've never worked at a company that has hired a PhD at an entry level position. They always come in at a more senior positon. If I had a PhD willing to come at entry level I'd be wondering what's wrong with them? Rather than having an attitude that you lack too many skills, you should have an attitude that you have skills that others will never have, because you do. Otherwise, why do you have a PhD? People pick up on your confidence level. If you don't have confidence in yourself then how are they supposed to have confidence enough to hire you?
It's a bit late, since you are already graduating, but taking an undergrad algorithms or systems course would have helped. I pushed down my "but I am a grad student!" pride and took the Systems class (15-213), even though I took an equivalent in my undergrad, much like you did. It's been a blessing -- apparently the most common screening question during this interview season is "write strcmp or strcat in C." (but I am a systems/databases guy, your experience may be different).
Since you don't have time for that sort of thing -- get on the course websites, download the posted slides, and go through them. You already know this stuff, you just need a refresher.
In terms of getting the job -- the resume is critical. I took the liberty of checking yours out on your website. The first thing you list is work experience -- that's good. But it ends in 2004 -- that's bad. Can't change the facts, so change the appearance. The first thing on your resume should be a summary. Something along the lines of "Software Engineer with 11 years of experience. Expert in Java/J2EE and the Eclipse development. Extensive experience in both industry and academia."
Your software development skills section is a bit soft -- it lists too many things you are probably not an expert in (Pascal?), thereby casting the things you probably do know well as being just so much alphabet soup. Get rid of the cruft. Focus on the stuff you are great at, and show it. Almost everyone says they know Java and Eclipse. Unlike most other people, you are probably a veritable Java and Eclipse GURU. "Development of eclipse plugins" doesn't quite carry that message.
The same kind of critique can be applied to the other sections -- you are severely underselling yourself, and this is not the market to do that in. Don't just say "several projects" -- briefly describe them in such a way that makes a programmer who is reviewing your resume say, "I want to find out more about that." You need to make yourself look like an absolute rock star.
Finally, as others have suggested, this is all about networking. Develop your LinkedIn profile, make sure your friends and acquaintances and former colleagues know you are available.
Good luck.
The PhD sometimes can be a problem for simple programming jobs. Even though you are screaming at your prospective employer, saying "yes I've done all the crazy stuff during the PhD, but now just want a job to code to feed my family", they may not hire you not so much of over-qualification, but rather over-thinking. For basic developer jobs, usually employers look for someone that codes like a robot, and not having any academic questions of whether we should use this or that design for the application etc.
Having been to that exact situation myself - trying to get a plain ol' developer position but got rejected because I have a PhD, I felt really-really bad (and constantly asking the question: shouldn't the PhD provide me with all the opportunities?). But I kept searching and found something more suited to my PhD skills, and more intellectually rewarding.
That is both the curse and the advantage of the PhD; it opens you the doors for higher quality jobs, but given not the state of economy, but the state of society - how fast things change and similarly how software comes and goes - companies want the 20 year-olds to code quick and turn out an app with a 6-month lifetime.
But still as other people mentioned in their responses, there are places both in private and government sector that invest in long-term budgeted and well researched software projects. So you should be looking for a place like that, but it takes time; It took 6-8 months for me, almost 10 phones interviews and 3 on-site.
And most important get your ego up. I completely understand how you feel, 6-8 years in graduate school under constant stress torn your ego into to pieces. But once you get through that - let's say - psychological training, you can stand any stressful deadline, juggle many things in your head from software design to implementation, think more broadly etc. These are qualities which none of the 20-year old developers have. Many employers look for those traits, and again get your ego up, think that after 8 years of graduate school you went through things that few people could stand, and get out there and snatch that job.
I can think of thee ways of dealing with this issue.
A few suggestions, from someone who's about to be in the same position:
This could be any type of conference, academic, industrial, or just a local Python/Java/whatever User Group thing. If there are name badges, attach "hire me" to yours. The people you're talking to will notice, and someone will probably have both be looking for someone, and think you're smart from talking to you.
If you give a talk its even better. You can probably offer to give a talk at your local Java User Group thing. People love to hear about academic research. I gave a Google Tech Talk [1], spoke at some companies, and some more local things [2]. Afterwards, people were very interested in hiring me. I'm giving a SO devdays [3] talk in London in October, and I expect it to be great job-seeking opportunity.
Presumably you've been to a ton of conferences, and gotten a ton of business cards. Send them a "I hope you remember me, we met at X, I'm looking for a job". They probably won't, but they'll likely pretend they do and might help anyway.
I'm actually shocked at how easy finding jobs via Linkedin [4] is. I fixed up my profile a small bit [5], "friended" old colleagues, and joined a "Compiler Experts" group and posted an introduction. In 12 hours I had three "please send me your CV" messages.
The best part about LinkedIn is that its designed for that, so there isn't any awkwardness about contacting people out of the blue.
There are recruiters who specialize in placing PhD graduates. In compilers, Julia Cort [6] seem to be the go to people. There's probably something like that in your area.
Presumably, you're worried about the algorithm portion. Its not your fault -- if you're anything like me you spent 80% of your research time engineering, 19% reading related work, and a scant 1% doing anything cool. So brush up. I plan on spending two weeks perusing topcoder [7], reading Skiena [8], Cormen [9] and Programming Pearls [10], and generally practicing [11] before applying to Google. Practice writing on paper, do them in C/C++ if that's what you need. I was recommended reading how others solved topcoder problems. Don't just look at the problems, do them. Consider it an investment.
Its important to read what others have said/done, to experiment and to talk to peers. The best thing you could probably have done is post this question -- I wouldn't be surprised if you don't get a couple of people asking you to apply to their companies after this.
Your resume makes it look like you have a lot of experience, and are smart and good. But it might be worth making it a lot prettier. Your website is very attractive, so you probably have some idea of how important this is.
[1] http://www.youtube.com/watch?v=kKySEUrP7LADo you have any experience with any well-known open-source projects? If so, that would be worth moving high-up your cover letter. If not, then, depending on your time-frame, it might be worth joining one.
Demonstrable contribution to a well-run open-source project shows an employer that you have valuable, "real world" experience (builds, SCC, working with others, etc).
The concern a lot of employers (in my experience) have with people from academia is that they don't have the wider life-cycle experience and that they are not used to working to tight deadlines. You could convince them otherwise if you have the right open-source experience.
I think you should start with exactly what kind of position you are looking for, title and all. Senior Developer? Development Lead? If coding is what you want to do all day for your daily bread, that title is pretty much the top of the heap. Everything beyond that is architecture and management.
If it feels like a tedious step backward going back to the days of linked lists, design patterns, and annoying Napoleonic project managers who don't know code from their own a## (but think they do,) you may need to reassess your career path.
I have been tagged as the tech-interview guy at the last several companies I have been at. Almost universally, the more formal CS education the candidate has, the less likely I am to recommend them for hiring. There are two reasons for this :
1) People who are really good at something tend to be drawn to it informally. IT is one of the few areas where a non-formal person can be successful. Those that have natural aptitude and passion for the art tend to pick up the skills on their own, faster than they could have been taught them in school. You can find people in highschool who would be worthy of hiring (from a tech perspective, maybe not social/otherwise).
2) The trained people tend to be too much theory, not much practice. They show me very over-engineered solutions to simple problems (here are my 40 one function classes than I chain together to solve your problem, just because i'm following the "a class should only have one purpose" rule.
This is true in general IT, but if you are writing OS/AI/Something really complex, then the math/theory degrees start being more useful.
Admitedly, I may be prejudiced. However, I'm the person that is hiring you. You have to break through my prejudices.
The suggestions in previous posts are on the money. Get involved in a "real" open source project. Don't pick something too theoretical or esoteric. It has to be something that I could relate to a standard IT job.
This will both give you good paper experience, and teach you some practical experience. the more core to the project you can make yourself the better. (Remember if its open source, they can probably go find your checkins!)
Write a techninal blog for a month or two, posting practical answers to problems you encounter in code. This will show you can find the "real world" answer to a problem, and expose some of your coding and writing skills.
Both of these things will be fairly "google-able" which will help.
I think you just have to practice the basic stuff that they might ask you in the interviews. If you do that for a few weeks, refresh your C++
, coding data structures and practice published job interview questions then you should be fine.
Let me tell you something that was very hard for me to hear and has made all the difference in my job search:
you don't know what your talking about
I mean that in the kindest of ways. Your better off than you think because what you think is not true. You don't know what people will/wont wont in a job search, because every company is different, don't prejudge yourself.
you can speculate and as a highly educated person argue well thought out reasons for why you can't find a job to yourself. But, realistically, it's your responsability to represent your value to companies, regardless of your situation.
Go out and put your Ph.D to work regardless of your experience, the economy, or whatever else. It will take alot of effort to get over the innertia of renetering the job market but it's worth it.
From my experience interviewing a lot of candidates with varying levels of education from no degree up through PhD, the thing I am looking for the most is the ability to work through a problem and come up with a solution using all the resources at hand. When we ask a candidate to code an algorithm during an interview we are not looking for them to have it memorized and write it out on the first try, we are looking for someone who can start breaking down the problem and then deal with the edge cases. The worst answer to a question is "I don't know"...The better answer is "I haven't worked with that for a while, but this is how I would come up with a solution".
If you're genuinely looking for something entry-level, why not stop including the fact that you have a Ph.D. when you apply? "Ph.D. aversion" doesn't usually mean they want 20-yr-olds with clean slates, it means they don't want to pay a Ph.D.-level salary for an entry-level position. Snag the job, then out-perform the position like crazy. This will leverage your skills into something better internally, or into a position at a similar company, and at in the meanwhile you'll (1) have an income, (2) polish up whatever low-level skills you feel are rusty, and (3) gain valuable time of "experience in the industry" for your resume.
Have you talked to anyone at CMU, particularly your dissertation adviser? I don't know of any computer science PhD students in any department having trouble finding a job. I've just never heard of it. I don't really know of any masters students around here having trouble. Here is my question, why are you trying to get entry level programming jobs when you have completed a PhD? Have you looked at any PostDoc stuff. Google and many other big companies (IBM etc) are still recruiting PhDs (though I think Google is really not putting out as much research as they should be given the amount of PhDs they have).
If you really want these kinds of entry level programming jobs, I don't know why a PhD would hurt you. You could downplay it on your cv. Honestly, there are many people with significantly less experience as you that are getting pretty lucrative jobs so I do wonder how you are in this situation. Nevertheless, WHY are you trying to get entry level jobs with a PhD?
Please talk to your faculty. I find it hard to believe that CMUs is letting their PhDs go out into the wild without things work.
I suggest you get yourself a copy of "Programming Interviews Exposed" [http://www.piexposed.com/] and try to understand the solutions to the problems instead of memorizing them. Once you do this, low level programming questions should no longer be a problem (most of them are similar).
I understand most of the work in the "Real world" doesn't require you to code these things, but I think employers feel a little bit more comfortable knowing that you know what goes on under the hood.
A few more ideas :
Get some certifications. Pick your target specialty, and get some Java/Microsoft certifications.
Consulting companies will often hire based on the results of technical test results. Get a consulting company to hire you, and work there for a few years, that will give you all the paper experience you need. Likely all the practical experience you need, and make lots of nice buisness ocntacts for you.
Just realize that you are starting at the bottom of the heap, and people with less education, who are likely younger than you are going to be telling you what to do, or getting into debates with you on the right way to do things.
If you pull out your "I learned this in school" card, you are gonna get all the stereotypes I discussed above going. Be humble, and take it as a learning tool and you will accelrate quickly.
In the end, if you learn the practical lessons, that knowledge added to your education will make you a powerhouse.
Don't tell prospective employers about your graduate work upfront if looking for something entry level. Leave that ambiguous or completely out of your resume. It's not like they're going to fire you if they find out later.