Tuesday, October 27, 2015

Advice for aspiring software engineers

I went for my Master's Degree after living in Austin for several years and working at a low level programming job at a large company. I felt really stuck. The nature of my work hadn't changed significantly in many years, and my team wasn't even trying to keep up with new technology. I was bored and didn't see things changing.

When I completed my degree in 2008, I was now overqualified for my job, but I also lacked the experience to get the kinds of jobs I was aiming for. The economy was also a disaster. I bounced around a number of contract jobs for several years, not managing to get a reliable permanent job until 2011. Three years later, I got a call from a recruiter at Blizzard Entertainment, a company I've been a big fan of since I played Warcraft II in college. I went through two lengthy interviews and joined the web development team. I'm pretty happy with the track my career has taken.

Last December, my cousin David wrote to me on behalf of a friend in college who wanted to know how he should proceed in order to make himself attractive to employers and land a decent job. I sent him the advice below. Due to the nature of my online media activities, a lot of young people write to me with similar questions, so I thought I'd recreate the advice for everyone to read.

If you're looking for a future working with computers, you should start by figuring out a specialty, and use your spare time to become an expert in it. I personally think you can't go far wrong with web development, because today no company in the world can get by with a strong internet presence. In my case this means Java Enterprise Edition, but for someone else it could mean C# and Dot Net technologies, or Python servers, or Ruby. Whatever you pick, it will help you focus your job search on a few key areas, and you will become an expert in knowing what kind of interview questions you must prepare for after a few rounds.

Learn to talk up your experience with and understanding of those technologies. Build your own software, even if it's cheesy, and get it in a state where it can be demoed live. Writing an app for your smartphone of choice (Android, iPhone) is another smart move. Play this up on your resume and in interviews. You can pull out your phone and demonstrate what you've done in real time, which will work as both a conversation starter and a sales pitch.

I don't do this as much as I should, but I hear it's also good advice: look into being a collaborator on Open Source software in your field. Talk up this experience as well. This will give you real experience with (sometimes) high quality software, as well as collaboration with others.

Join some local interest groups. If you like Java, find a Java User Group. If you like mobile stuff, find a mobile developer group. Use meetings not only to geek out, but also to network like hell. Introduce yourself to as many people as you can, explain your situation, and get more specific advice or leads from them. Go to all the parties even if you don't really want to. Make sure lots of people know your name, and they think of you when they hear about a job opening. A lot of computer nerds are, well, nerds. It takes a long time to realize that writing programs requires as much skill in communication as in actual head-down clacking on a keyboard.

Use LinkedIn.com. Add your new friends on it. The more professional friends the better. Make LinkedIn the face of your professional self, and avoid using it like Facebook. That is to say, add all friends and only friends who have some possibility of advancing your career. Do post everything you can that's relevant to your skills, and don't post drunken selfies. ;)

Try Indeed.com as a way to find jobs in your area. Indeed can also be very helpful in getting a rough estimate of how valuable a certain skill is in your area, which in turn will inform what you may want to specialize in. If you search for Java or Ruby or C# jobs locally, you will get a good idea how in demand they are just by counting the hits.

If you try to apply for a job, and find yourself in touch with a recruiter instead of a company HR department, make friends with the recruiter. They do this for a living, and will often give you professional advice even if they don't have any immediate leads for you. Sometimes they might even buy you a nice lunch. Recruiters profit when you get as lucrative a job as they can find, so basically they have a strong incentive to be really nice to you. Enjoy it.

If you're in a position to consider moving, look for cities that have a high concentration of tech jobs. Rather than moving first and seeking a job later, you can widen your net in the job search and let that decide where you live. Google "best cities for tech jobs" any time and you can find information like this article. As I write this blog post, Austin is #8 on the list. Some other top locations include San Jose, Washington DC, and Boulder CO. When considering a place to live, you should think about not only average salary, but also cost of living, since that can reduce your real earnings.

What to study in school

Some majors to consider would be a BS in either computer science or computer engineering, or anything that looks similar on your school curriculum. I've never been 100% clear on what the difference is between the two, myself. My bachelor's degree is in CS, and my master's is in CE with a focus on software engineering. If you really want to know the difference then this page will explain it to you. But when you come right down to it, the nature of the degree is not as important as you might think. The fact that you completed a degree from an accredited school at all carries a significant amount of weight all by itself. Generally the knowledge you'll obtain in school will be valuable theoretical knowledge, but it won't come close to matching what you'll learn in your first year or two of holding a real job.

The received wisdom throughout my career has generally been that a BS is pretty important to get a foot in the door, and an MS will qualify you for substantially more income (and my anecdotal experience has borne this out). But a Ph.D isn't necessarily worth the effort unless you plan to go mainly into academics.

Learning the fundamentals of computer science takes a while, which is why a four year BS provides very good groundwork. Once you know how to think like a programmer, you can usually pick up any language in a matter of weeks or months. I've been able to debug code in a language I've never seen before, or at least be a valuable sounding board for somebody else trying to figure out where they went wrong. Also, there are many week-long training programs that can help you get started specializing in a particular type of programming, as well as many "Learn X in 21 days" type of books.

These resources are helpful and will give you a good start, but won't make you an expert, and many companies explicitly say "Must have X years in language Y." Having the required experience makes it easier to get these jobs, but like the Pirate Code, they're really "more like guidelines." If you have a number of years of general experience, and a much smaller amount of experience in the specific language, you can often talk your way into such a job, or make your past history seem more relevant.

Of course, people will often bring up the anecdotes that Bill Gates, Steve Jobs and Mark Zuckerberg all dropped out of school at some point. The fact that all three were extremely successful doesn't negate the broader fact that finishing that degree greatly increases your chance of success.

1 comment:

  1. Good advice. While I'm an expert in my area, I need to start branching out again in the CS arena and get some depth in particular solution areas and stacks. As a professional services consultant, I end up dabbling in whatever areas are needed to get my solutions deployed or integrated, but not anything deep in areas that would serve me well when looking for a job outside of professional services consulting and solution architecture.