DHO is Mostly Confused

Rants from Devon H. O'Dell

Interviewing in Software Engineering

I’ve recently been asked several times for tips on how to “ace an interview” or how to “wow folks” during an interview. Having interviewed many times over the past 13 years, I’ve had a number of successes and failures. This post isn’t necessarily useful only for those looking for jobs in software engineering, but it is tailored to that crowd.

How do you get that job? Software engineers are in very high demand these days, and that demand extends into virtually every field of engineering. In this post, I’m going to discuss some of the “dos and don’ts” of interviewing: how to get an interview, how to perform in an interview, how to follow up after an interview. Many of these tips are tailored towards those with little to no actual professional experience; veterans may find little useful in this article.

I am speaking to a very particular audience (software engineers) and not all information in this article may be generally relevant. Indeed, I prefer to only speak from my own experience. I’m not a Windows developer; I’m not a mobile developer. There are likely more specific resources for those in fields outside my own, and I don’t want to provide advice that I can’t back up with my own experience.

Getting an Interview

Although recruiters, job agencies, job postings, and websites like Dice provide an in for communicating with a hiring companies, word of mouth and internal referrals are by far the best means for getting your foot in the door. The first step to getting a job is networking within the communities of your potential employers.

For younger people, this may seem difficult. To some extent, you do need to find yourself in the right place at the right time. In software engineering, it’s fairly easy to find these networks. The Internet provides a plethora of tools for finding and joining networks relevant to your interests as a software engineer: find them and use them. Some resources I’ve found to be extremely valuable include well-established open source projects, IRC, mailing lists, and Google’s Summer of Code program. I’ll get to these in a minute.

Personal acquaintences and mentors with connections in the business community are by far the best resources for a young engineer. As a high school student, I participated in a summer program that got me involved with educators and businesspeople in my local area. When I graduated high school, one of my mentors from this program recognized value in a website I made for fun and introduced me to a number of people who were looking to hire web developers. As I continue down my career path, growing my network and getting personal referrals continues to be the best way to find a job. Indeed, as someone without a college degree (although my experience speaks for itself at this point), it would have been nearly impossible for me to get that initial job without a referral from my network.

Meet people. Go to conferences and events relevant to your aspiring professional interests. Play around with your own projects. Never stop learning. If learning suggests you need to make a change to what you’re doing, make that change. Be dynamic.

Open Source Projects

Many prominent open source projects are primarily developed by existing companies. On top of this, many other companies use these projects in their own environments. I became involved with FreeBSD and PHP very early on in my career. These communities had plenty of open projects and communities rife with knowledge and willing mentors. It’s easy to become involved with these projects, simply introduce yourself on the mailing list(s) or an IRC channel (if one exists) and ask what you can do to help out.

You may be provided with links to bug trackers, documentation, and the like. Do your best to go through these resources and be a self-starter. If people become short with you (everyone has bad days) just remember:

It's good advice.

Cliché perhaps. Arguing or otherwise contributing to the negativity of a community will not win you points anywhere. I learned this the hard way.

Some open source projects are unfortunately bastions of abusive people. It is perfectly acceptable to politely walk away from such projects. It is perfectly acceptable to politely walk away from employers who do the same. Do not feel stuck in your search. I learned this the hard way.

Forums

Mailing lists, IRC, and other online fora are good places to communicate with others regarding the work that you want to do. Not only will participating in these discussions help you network with others, it will also provide you with a form of real-world teamwork experience.

Summer of Code

Google’s Summer of Code program for college / university students and their Code-In program for high-school students provide fantastic means to develop experience in interesting areas, to network, and learn about software engineering at a professional level. All while helping the open source software community. I’ve served as a mentor and administrator of the Plan 9 umbrella organization, and have seen this platform be beneficial to many students on all of the aforementioned topics.

There are many other networking resources you have at your disposal: user groups, conferences, friends, family. Make use of them all.

Setting up an Interview

You’ve built a network and experience. How do you initiate an interview? In some cases, it may be as simple as finding someone in your network and asking if they know anyone hiring for your skillset. This is by far the most effective method of obtaining an interview that will lead to a job – but it is not guaranteed. Sometimes people misunderstand what companies in their network are looking for – even if it’s their own company. Don’t become discouraged if it doesn’t turn into anything.

If you can’t find anyone in your network with immediate connections to a company that’s hiring, what do you do? My answers to this question aren’t in any particular order (nor will they be in subsequent sections). Feel free to re-order them as they make sense to you.

What’re You Looking For?

Figure out what you want to do, first. If you’re interested in a broad range of things, great! But get a good idea before you start searching for jobs.

This also includes figuring out what kind of salary you would like. Sometimes in-person interviews go well enough that you’re asked what your expected salary would be then and there. It is an absolute must to be honest with yourself about what you’re worth and to be firm with the company about your expectations.

Find a Relevant Company

Even if you’re a generalist, find a company that uses technologies with which you have familiarity. I don’t do interviews for Ruby on Rails, Windows development, operations, or a wide variety of other fields. Although I am a generalist and do have some experience in these fields, I wouldn’t be able to find a non-junior position with them.

If you’re just starting out and don’t have much professional experience, do some soul searching to figure out what it is that you actually want to do. You probably won’t get this right the first few times, but you’ll continue to gain professional experience and you’ll learn more about yourself.

Be Willing to Relocate

This is mostly for younger folks, and it isn’t always relevant as many companies are hiring remote workers these days. It sounds great, but telecommuting is much harder (and less fun) than it sounds. I’ve tried it at my current job, found that I don’t do a good job at it, and am relocating. Your mileage may vary, but keep an open mind. I absolutely do not recommend telecommuting for your first job, and I would be skeptical of working for any company that offered that opportunity.

Research the area. If the job doesn’t work out in a year, are you willing to move again if you can’t find another job in that area? Do you have local sure you have the best information before considering moving anywhere.

If your company doesn’t assist with your move, it’s likely that you may deduct your moving expenses from your taxes. Many companies will help with these costs. Human Resources departments will also help provide tips and resources for moving: information about the area, local resources for finding apartments, and more. Don’t be afraid to ask for help if you get the job!

Willingness to relocate greatly expands your ability to find a job, especially if you are from a relatively remote area (as I have been several times) with few local job opportunities. Besides, travelling is fun. Meet new friends and keep the old, all that jazz.

Find a Job Posting

You can find job postings on the websites of most companies. Larger companies sometimes outsource all of their hiring endeavors, so sites like Dice and Monster can still be good resources for finding jobs. Connecting with recruiters and hiring companies can also be good – but be careful with this. Some recruiters sell contact information and call at inappropriate times. If you find yourself working with a recruiting company that makes you uncomfortable, stop!

Of these options, submitting your credentials directly to the company is (in my experience) the best.

Submitting Your Resume

Some places value cover letters more than others. I generally do not include a formal cover letter when blindly submitting a resume and choose instead to introduce myself via email with my resume as an attachment. The cover letter should be tailored to the company you’re applying to. Speak briefly about who you are and what you find interesting about the company.

Don’t waste your time saying why you’d be a good fit. There are two reasons for this:

  1. Your resume should speak for itself. If it’s small because you don’t have experience, it should still be obvious from your resume that you are a fit for the job you are attempting to get.

  2. The company is ultimately deciding whether you are a fit. They will make their own determinations on this throughout the hiring process, regardless of whether you think you’re a good fit.

There are many tips and templates relating to resume creation, so I won’t get into that much here. A few specific pointers I will give:

  1. Keep it short. My resume is two pages long after over 13 years of work.

  2. Keep it relevant. When I was a teenager, I worked at Subway for a while and I worked at an internet cafe for a while. Guess which one of those didn’t go on my resume when I handed it in for my first software engineering job.

  3. Don’t list every software package and programming language you’ve ever used. I learned this the hard way. At some point, you will talk to the person who created the language. Similarly, if you’re applying for a job as a software engineer, I’d assume that you know how to use a word processor – Microsoft Word isn’t a skill.

  4. Use a bulleted list when talking about experience. Keep your list points short. Speak generally and actively about your contributions (you can and should get into detail about them during the interview, not on your resume). Write in past tense for previous jobs and present tense for current jobs.

  5. Include an objective and make it relevant. “I’m interested in the mature web and hope to innovate products and improve that problem space using dynamic languages” is a fantastic objective. Unless you’re applying for a job working on device drivers. As you continue to gain experience and find your niche, your objective will stabilize. This should be the only real per-company tailoring to your resume you need to do (if you do any).

  6. Include relevant projects. Sometimes including personal activities and interests is OK, but don’t spend too much time on them. And I really don’t need to know everything entailed in “President of the Local Metalheads Group.” I’m personally probably interested, and I’ll probably ask you about it. But that’s not useful on a resume; list it and be done.

Once you’ve submitted your resume, wait. This entire process can take anywhere from one day to six months. If you don’t hear back after a week, it is ok to ask whether your resume was received and whether there is a status update. Do this once only. If you don’t hear back, you didn’t want to work there, anyway. I promise.

Interviewing

Your resume is rock-star quality and you got an interview. There are generally several stages to this process. Some companies have more, some fewer. In this section, I’ll talk a bit about the dos and don’ts of these stages and how to “wow” everyone you speak to.

HR Phone Screen

Some companies (especially larger ones) will have an HR representative speak with you over the phone if the team expresses interest in your resume. Most companies will at least do this step via email. This step exists to get some basic and obvious gut-check information about you. Most of this is intended to look for easy-to-spot negative traits.

  • Do you communicate effectively? If you leave the interviewer confused, dodge questions, or are short, you will likely not complete this process.
  • Are you a positive person? You will probably be asked why you are leaving your previous job (if this is relevant). Don’t spend time talking about how much you hate it there and how horrible the people were. Spin everything positively. It’s OK to be honest and say, “The environment wasn’t conducive to a positive work experience.” Leave it at that.
  • Do you have obvious technical experience in this area? Some companies provide simple QA sheets to their HR representatives. These questionnaires are not generally open-ended and have specific, obvious answers. Make sure you understand the problem space the company deals with beforehand and study up!

It should be obvious at the conclusion of this interview whether you’ll be continuing to a technical phone screen. If you are, ask if there’s anything specific you need to do to prepare. (Some phone screens also involve writing code, for instance.)

Phone Screen

Another one? Yep. Inviting people into an office can be expensive, especially if you, the candidate, are not local to the area. In addition to this cost, your interview costs time from engineers who would otherwise be busy doing other work relevant to the company’s interest. Phone screens are a relatively cheap way to avoid sinking these costs for unqualified candidates.

These screens can vary wildly. You’ll be asked relatively easy questions related to the field of the job. If you apply for a job as a systems software engineer, you’ll probably be asked about syscalls and standard APIs. If you’re dealing with networks, you’ll probably be asked about the 3-way handshake of TCP, socket multiplexing (select, poll, epoll, kqueue, portfs, etc). In either case, you may also be asked about threads and concurrency. Try to have good answers.

Protips:

  • Don’t sit behind a computer and look up answers. We can hear you type. Even if we can’t, the long pause after every question is very telling.
  • “I don’t know” is a valid answer. If you resort to this answer, make sure to explain where you would look or what you would do to gain the knowledge to answer the question.
  • Speak clearly. Please don’t get frustrated if you are misunderstood, it can be hard to hear on the phone.

Occasionally, phone screens include use of collaborative editing tools to assess your skills at writing code. Make sure you’re prepared to do this. If not, be polite. “I’m sorry, I don’t have access to a computer right now” is a much better answer than “Nobody told me I had to write code” when asked if you are able to do this.

Again, if you’ve not heard anything for a week after your phone screen, send a gentle nudge to your contact at the company asking when you might expect an update. Never ever send an angry email if you don’t hear back.

Second Phone Screen

Another one? Uh oh.

Generally, a second phone screen means that the first screen wasn’t conclusive, and the company wants to make sure that you’re a good fit before spending the time and money for an in-person interview. This isn’t necessarily a bad thing. Do your best, be prepared, and hopefully you’ll get to the in-person. If, for instance, you weren’t at a computer to complete a collaborative coding session, make sure you are now.

In-Person Interview

Congratulations!

There are some steps you can take to ensure you do your best once you’re at the interview.

  1. Research the interview process. Sites like Glassdoor provide information on the interview process and common questions at many companies. Deduce from there and study.

  2. Study. If you’re interviewing for a web developer position, make sure you’re clear on your HTML / JavaScript / CSS / $DYNAMIC_LANGUAGE fundamentals.

  3. Make sure you can write code from memory. Understand the syntax for the language(s) you’ll likely use at the company and be ready to write code in that language. Don’t write pseudocode unless asked.

  4. Practice legible whiteboard writing. Your interviewers may have scrawly whiteboard writing, but you don’t have to.

  5. Be ready to answer questions about your past work experience. Why did you make that design decision? What was the hardest problem you’ve solved? What’s your biggest weakness as a developer? Your greatest strength? Do not answer in platitudes. Bullshit is not appreciated.

  6. Do as much research into the company as you can. Figure out questions to ask them: an interview is a two-way process. You are also trying to find out why you should work there. “What’s your favorite thing about $COMPANY?” is a good open-ended question that allows you to dig deeper into what it’s really like to work for this company.

Once you’re actually in the interview(s), here are some tips to impress:

Be Yourself

Be yourself, be fun. Small companies need culture to create cohesion in teams. They need people who can help maintain culture during growth. Once a company stops being fun, it starts to fall apart. (If it doesn’t, you don’t want to be there anyway, I promise.)

Be Honest

If you don’t know an answer to a question, just say so. Ask for help if you don’t know an answer. If that doesn’t lead anywhere fruitful, explain how you would find the answer. Don’t ask for handholding. Make sure you have good knowledge of data structures, algorithms and storage / time complexity.

Be Comfortable and Confident

It’s a theme: stay calm and carry on. Answer questions definitively when you definitely know the answer. Stay relaxed. Give yourself time to think critically. (That’s a big thing that we’re all looking for.)

Don’t be cocky: any company you interview with that is worth working for is going to have someone brilliant talking to you that will know more about something that you’re an “expert” at than you do. I learned that the hard way, and changed my resume significantly after I figured it out. For example, if you can write Python code, but aren’t familiar with its idioms and can’t write it on demand, don’t bother putting it on your resume in the first place.

Be Humble

You can’t possibly know everything. We don’t either. Nobody’s solved P=NP yet, and that’s probably not what your potential employer needs from a software engineer. (That said, don’t downplay your awesome achievements. Everyone is incredible in their own right.)

Exude Passion for your Work

Be passionate about what you do. Start-ups don’t need nine-to-fivers. It’s hard work, and it can be a lot of work. But it is also fun work, and start-up culture can be a lot of fun. You’ll sacrifice some things working for a start-up. As someone who did the 9-5 thing most of my career, I’m actually having a blast. But on top of that, a passionate person is someone who will continue to learn, develop, and grow in their skillset.

That’s a valuable asset to demonstrate anywhere, start-up or not.

Be Curious

Have questions for the interviewer. You don’t know everything about what they do and curiosity shows that you are interested in learning more. If you get an interesting answer demonstrating an unsolved problem at the company, start a little side-discussion about how you might solve it. Don’t feel like you can’t ask multiple people the same question. Ask subjective questions. I actually really encourage that, because you’ll get answers to compare for yourself. An interview is also for you to find out whether you want to work for the interviewer.

Be a Good Communicator

You are selling yourself as an asset. Pimp your brain, pimp your attitude, pimp yourself. If you can’t sell yourself, you can’t win. If you can’t communicate well with others, it will unfortunately be difficult to find a job in a team setting.

Don’t Feel Defeated

If you don’t get the job, apply for another one. If you’ve been following the steps in this post, it’s not the end of the world, anyway. For one, your network can give you pointers and introductions to other companies that need folks. For two, the market for software engineers is SUPER HUGE right now. Lastly, just because the employer doesn’t end up finding that your skillset matches their immediate needs doesn’t mean that will be the case somewhere else.

Keep calm and carry on.

The process after this takes a varying amount of time at different companies. Places like Google and Facebook can take months to get from the interview to the next step. Again, if you haven’t heard anything for a week, send a gentle reminder of your interest to your contacts.

Always send a short thank you email to your contacts after your in-person interview (either immediately or the next day). It was very kind of the company to spend their time and money to consider you as a candidate, whether you got the job or not.

Negotiating an Offer

Hopefully you have done enough research into the company, area you will be relocating to (if that’s the case), etc. You have an expected salary. If you are asked for an expected salary prior to the offer, give a range. How?

If you think your minimum expected salary is fair and firm, start from that and give a range to roughly 25% above it. For example, if your expected base salary is $60,000, ask for something between between $60,000 - $75,000. If you think your expected base salary might be high for what the company is willing to pay, put it in the middle. If this hypothetical base is $170,000, ask for something between $150,000 and $190,000 (a roughly 25% spread on $170,000). When you start getting into the higher numbers, the spread formula works best.

Asking for a range gives you the power to negotiate after you get an offer. It also tells you a lot about how the company values their employees up front. In some cases, you will be offered something above your requested base salary. If your expected base salary is fair and firm at $60,000, you gave a range between $60,000 and $75,000, and you are offered $50,000, it is fair for you to say politely, “Thank you for the offer. I’d love to work for you, but I’m afraid that I am firm on starting at a minimum of $60,000. Is there anything we can do to get me there?”

Similarly, if you are hinged on getting closer to $170,000 and you are offered $150,000, meet them halfway. You can gently ask, “Is there any way we can work out a base closer to $160,000?” This is completely fair and normal. Don’t feel ashamed to negotiate, you are worth it!

Understand that if you are working for a start-up, especially one at an early stage, you may need to accept less money in hopes of a profit if the company takes off later.

Ultimately, it is up to you to accept an offer extended to you. Make sure you are happy with what you are getting before you sign.

After You Start

Keep your resume updated, always. When you work on new interesting or large projects, don’t forget to add them. Career advancement does not stop once you are hired, although the job search does. Keep up on your education, make personal notes as to the things you enjoy and dislike about your work environment later.

In all likelihood your first job will not be your last, and you will work for a majority of your life. Do your best to enjoy every last second.

Now get out there and build your career!

More Posts