Software development topics
What technical topics should you be prepared to discuss?
Before you start revising the technical topics that might come up during your interview, connect with your recruitment point of contact to find out which subjects/skills you’re most likely to be asked to discuss and demonstrate. Our technical interviews typically require you to perform coding and system design exercises on a whiteboard. You should also bear in mind that invention is in our DNA and technology is the fundamental tool we wield to evolve and improve every aspect of the customer experience. When reviewing the below topics, keep the customer at the forefront of your mind.
You do not need to know any specific programming language before attending an interview for a tech position. However, familiarity with a prominent language is generally a prerequisite for success. You should be familiar with the syntax of languages such as Java, Python, C#, C/C++ or Ruby. You should also know some of the languages’ nuances, such as how memory management works or the most commonly used collections, libraries, etc.
Most of the work we do involves storing and providing access to data in efficient ways. This requires a strong background in data structures. You’ll need to understand the inner workings of common data structures and be able to compare and contrast their use in various applications. You will be expected to know the runtimes for common operations as well as how they use memory.
You do not need to learn algorithms by heart for your interview. However, having a good understanding of the most common algorithms will probably make solving some of the questions a lot easier. Consider revising common algorithms such as traversals, divide and conquer, breadth-first search vs. depth-first search and make sure you understand the trade-offs for each. Knowing the runtimes, theoretical limitations and basic implementation strategies of different classes of algorithms is more important than memorising the specific details of any given algorithm.
Expect to be asked to write syntactically correct code rather than pseudo code. If your knowledge of coding without an IDE or coding in a specific language is rusty, it’s a good idea to dust off the cobwebs and get comfortable coding with a pen and paper. The most important thing a software development engineer does at Amazon is write scalable, robust and well-tested code. These are the main evaluation criteria for your code. Make sure that you check for edge cases and that no bad input can slip through. This is your chance to show off your coding ability.
Good design is paramount to extensible, bug-free, durable code. We know it’s possible to solve any software problem in an almost limitless number of ways, but when software needs to be extensible and maintainable, good software design is critical to success. One way to build lasting software is to use object-oriented design best practices. You should have a working knowledge of a few common and useful design patterns and know how to write software in an object-oriented way. You probably won’t be asked to give detailed descriptions of how specific design patterns work, but expect to have to defend your design choices.
Most of the software that we write is backed up on a data-storage system. Many of the challenges faced by tech people arise when figuring out how to most efficiently retrieve and store data for future use. Amazon has been at the forefront of the non-relational DB movement. We have made Amazon Web Services such as DynamoDB available to the developer community so that they can easily leverage the benefits of non-relational databases. While we don't expect any particular level of expertise in non-relational databases, you should be familiar with general database concepts and their applications. The more you know about trade-offs between relational and non-relational databases, the better prepared you will be.
Systems at Amazon have to work under very strict tolerances at a high load. While we have some internal tools that help us with scaling, you should be familiar with a few basic distributed computing concepts. Having an understanding of topics such as service-oriented architectures, map reduce, distributed caching and load balancing will help you to answer some of the more complicated distributed architecture questions you might be asked.
You don’t need to know how to build your own operating system from scratch, but you should be familiar with some OS topics that can affect code performance (e.g. memory management, processes, threads, synchronisation, paging and multithreading).
We expect our engineers to be familiar with the fundamentals of the internet. Brush up on how browsers function at a high level, from DNS lookups and TCP/IP to socket connections. Having a solid understanding of the fundamentals of the worldwide web is a requirement.
General machine learning and artificial intelligence
Expect to be asked about data-driven modelling, train/test protocols, error analysis and statistical significance. For example, given a problem definition, you should be able to formulate it as a machine-learning problem and propose a solution, including ideas for data sources, annotation, modelling approaches and potential pitfalls. It is a good idea to revisit your favourite ML and AI textbooks to make sure you understand basic AI/ML methods and algorithms.
We understand this was a relatively long list of topics to review. You should bear in mind that your interviewers won’t be evaluating your ability to memorise all the details of each of these topics. They will be analysing your ability to apply what you know and solve problems efficiently and effectively. Given that you sometimes have only limited time to prepare for a technical interview, we recommend reviewing computer science fundamentals and practising coding outside of an integrated development environment. This will likely yield the best results for your time.