What programming languages do you use? Which three do you prefer, or are most familiar with?
This question will give you an idea of the candidate’s programming knowledge, their level of proficiency, and whether they are a good fit for your company.
GitHub, a code-sharing website used by developers from around the world, listed the following as ten of the most commonly used programming languages and technologies at the end of 2017:
- Python is a powerful, general purpose language that gained extensive popularity in 2018. It’s widely used for a range of tasks, including web development, machine learning, and data analysis.
- Ruby is a dynamic, object-oriented, general purpose open-source programming language with a focus on simplicity and productivity. It’s primarily used for web applications, in particular via the Rails server-side MVC framework.
- PHP is an open-source, server-side scripting language used for the development of web applications.
- C++ is an object-oriented programming language typically used for operating systems, games, and embedded software. It can also be used for building higher-level systems such as remote-device and network management applications.
- Cascading Style Sheets (CSS) is a mainstay of the web and used for formatting web page content. CSS files help define critical aspects (font, color, layout sizes, spacing, etc.) as well as maintain a continuous look and feel throughout multiple pages of a website.
- C# is an object-oriented language developed by Microsoft. It is designed for improving productivity in web development and is often used with XML-based web services on the .NET platform.
- C is a high-level, general-purpose programming language. Originally developed for writing system software, nowadays it’s often used for developing firmware or portable applications.
Tell us a bit about the latest project you worked on. Was it completed successfully? Explain how you contributed to its success and how you handled any obstacles you may have run into.
This question should give you insight into the candidate’s overall contribution to the project, their management skills and how they work with a team, as well as their interaction with project management and other stakeholders. Software projects almost always face roadblocks and complications, and being able to identify obstacles, solve issues quickly and efficiently, and get the job done properly and within deadline is a key attribute for a software engineer/developer.
Talk about a time when you had to make a critical decision during production. What happened? How did you manage it?
This question should help you judge whether a candidate is able to think for themselves, analyze and evaluate issues quickly and clearly, and recognize the most logical relationship between ideas.
Critical thinkers often also have an explorative mindset which can lead to innovation and the improvement of production systems and processes.
How would you explain APIs to non-technical stakeholders?
Being able to communicate well is one of the most important skills a candidate can have. A question like this will give you an idea of how the candidate handles the most difficult or complex conversations.
A candidate might answer like this:
An API (Application Programming Interface) may be used for a web-based system, software library, computer hardware, and an operating or database system. It is a set of rules (code) and specifications that software programs can follow in order to communicate. Simply put, it works as an interface between different programs and facilitates their interaction.
While this answer is accurate enough, it may come across as “just more tech-speak” to a non-tech-savvy audience. A better answer would be:
“API” is a very generic term—it can be used in all sorts of programming contexts: websites, mobile apps, desktop software, and even operating systems (e.g. Windows, macOS, or Linux). It’s a specification for how a piece of software can be used by other pieces of software.
This is a little better: There’s less of an academic tone, and some precision was traded for slightly more relatable terms like “web site” over “web-based system” and “desktop software” over “software library”. However, it still gets too technical in that it has to have an aside to define OSes, which the audience may not be familiar with.
Compare that with:
An API tells programmers how to automate a product—anything from web apps like Twitter all the way down to Windows itself. For example, I could use Twitter’s API to fetch our company’s most recent tweets and then display them on our website. That way our social media specialist can simply tweet, without having to always take extra steps to copy the tweet to our website.
Here, the answer gets across three key aspects of the topic:
- What it is, in very relatable terms: Everyone has heard of programmers, Twitter, and Windows.
- What it does, using a concrete example. Here the example again uses familiar concepts: Tweeting and displaying something on a web site.
- Why it’s beneficial, building on the example and highlighting the “before and after” difference: It saves time and lets employees focus more on creativity over monotony.
This should give you an idea of what to look for, but feel free to choose a more familiar technical term than “API,” if applicable. Communication is one thing, but it would be a definite red flag if your candidate’s answer wasn’t even correct!
Here is a simple programming challenge. Could you have a go at solving it?
Example question 1 (shorter time frame): Write a function to compute the Nth Fibonacci number.
Example question 2 (longer time frame): Write a function that takes the current position of a knight on a chessboard, and returns a preliminary list of possible moves the knight could make. (That is, the current positions of other pieces are not provided, so you can’t check against capturing pieces on the knight’s own side nor making their king vulnerable to capture.)
Giving candidates a simple programming challenge may seem trivial, but it’s useful for several reasons:
- It gives you an opportunity to see how well they work under pressure. (It’s important to have them do this in front of you—you need to hire people who can write code under stress when needed!)
- It demonstrates their educational foundation.
- It shows simply whether they can write code or not, and how experienced they are.
- Depending on what kind of challenge you choose, it can help you differentiate skill sets. It also helps tease out their scientific/mathematical background and whether they are a high-level thinker.
What do you think are the most important aspects to pay attention to when reviewing another team member’s code?
Code reviews are fundamental to the software development process, even when there’s only one engineer. By posing this question you’ll get an idea of the candidate’s knowledge and problem-solving skills, their attention to detail, and whether they can keep an overview of the project.
Here is a sample answer:
“I first look for security, functionality, and readability. Is the code simple, or cluttered, bloated, and inefficient? How many lines of unnecessary code will I need to re-write or remove? I check for any weaknesses that could cause vulnerabilities and confirm that regulatory requirements have been met.”
Everyone has their own coding style and every developer or team will have requirements that are specific to their codebase. Effective code reviews often have checklists. Below is a limited list of general suggestions you could consider including:
- The software passes automated and manual testing
- Code follows applicable conventions and is easy to understand
- Code is not duplicated
- No negatively named boolean variables
- Scrutinize methods with boolean parameters
- Blocks of code inside loops are as small as possible
- No memory leaks
But more important than which exact points a candidate brings up is their reasoning for doing so. Be wary of candidates who get stuck on tabs-versus-spaces bikeshedding at the expense of more crucial engineering elements: The above items shouldn’t all carry the same weight.
Do you consider unit testing essential, or a waste of time?
Every engineer/developer worth considering should be familiar with unit testing. Asking this question will give you an understanding of their attitude toward it, and what level of priority they give it in their working process. Do they follow test-driven development (TDD) or behavior-driven development (BDD), or are unit tests something they tack on afterward for the sake of process conformance or mere appearances?
Typically regarded by most industry professionals as being a best practice in code maintenance and software development, unit tests are usually part of an overall testing strategy. They test for logic errors and coding flaws, helping to prevent bugs from advancing to the finished product. Plus, because they’re automated, they prevent regressions, where bugs return that had already been fixed.
What has your experience been like as part of an agile software development process, if any?
The Manifesto for Agile Software Development outlines an approach based on iterations rather than a waterfall model. Requirements and solutions are generated through the collaboration of self-organizing and cross-functional teams and their end users. Among other things, it encourages a flexible planning style and a rapid response to change.
Knowing how a developer feels about agile development can help you understand how they will fit into your own process. Open-minded developers that are also able to see flaws in how agile processes have been run can provide valuable feedback to help your team’s methodology grow and evolve.
On the other hand, if they’re dead-set against a core process of yours, there may end up being too much friction for them to stay productive.
How familiar are you with object-oriented programming (OOP)?
OOP has been a standard convention for over 20 years and is organized around objects rather than actions, and data rather than logic. It is ever-present and it is very unlikely a candidate would not have run into it at some point.
Here are ten examples of terms they should be able to define:
- class, object (and the difference between the two)
- method (as opposed to, say, a C function)
- virtual method, pure virtual method
- class/static method
- static/class initializer
- superclass or base class
- subclass or derived class
NB. Some firms avoid OOP and prefer to use a functional programming (FP) language such as Clojure.
Please explain big-O notation in the simplest terms.
Big-O notation (Landau’s symbol) is used in computer science to describe the performance or complexity of an algorithm. It describes how the runtime or space requirement of a function grows as the input grows.
Two functions with the same Big-O notation will tend to have the same growth rate and thus have the same relative performance with large inputs.
For example, the bubble sort algorithm has an average time complexity of O(n^2) while merge sort and heap sort both have an average complexity of O(n log n). In average cases, merge sort and heap sort will demonstrate similar performance while they will both outperform bubble sort.
Candidates should be able to demonstrate a basic understanding of the fundamentals of big-O algorithmic complexity analysis.
They should know that algorithms usually fall into the following performance classes:
They should also be able to explain why a given operation falls into a particular complexity class.