What technical topics should you be prepared to address?
Before you dig into the technical topics you may be asked about during your interview, connect with your recruiting point of contact to understand the subjects/skills you’ll most likely be discussing and demonstrating. In general, our technical interviews typically require you to perform coding and system design white boarding exercises. Also keep in mind that invention is in our DNA, and technology is the fundamental tool we wield to evolve and improve every aspect of the experience we provide our customers. When reviewing the below topics, keep the customer top of mind.
|Programming language||Data structures||Algorithms|
|Distributed computing||Operating systems||Internet topics|
Scroll down to see all Technical topics or click one of the topics above to jump to that section.
We do not require that you know any specific programming language before interviewing 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 usage in various applications. You will be expected to know the runtimes for common operations as well as how they use memory.
Your interview will not be focused on rote memorization of algorithms. However, having a good understanding of the most common algorithms will likely make solving some of the questions a lot easier. Consider reviewing common algorithms such as traversals, divide and conquer, breadth-first search vs. depth-first search and understand the tradeoffs for each. Knowing the runtimes, theoretical limitations, and basic implementation strategies of different classes of algorithms is more important than memorizing the specific details of any given algorithm.
Expect to be asked to write syntactically correct code—no pseudo code. If you feel a bit rusty coding without an IDE or coding in a specific language, 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 Audible 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 validate 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, long-lived code. We know it’s possible to solve any given software problem in almost limitless 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, along with how to write software in an object-oriented way. You likely won’t be asked to describe the details of how specific design patterns work, but expect to have to defend your design choices.
Most of the software that we write is backed by a data store. Many of the challenges tech people face arise when figuring out how to most efficiently retrieve and store data for future use. Audible 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 with non-relational databases, you should be familiar with broad database concepts and their applications. The more you know about tradeoffs between relational and non-relational databases, the better prepared you will be.
Systems at Audible have to work under very strict tolerances at a high load. While we have some internal tools that help us with scaling, it’s important to have an understanding of a few basic distributed computing concepts. Understanding topics such as service-oriented architectures, map-reduce, distributed caching, load balancing, and others, will help you formulate answers to some of the more complicated distributed architecture questions you might encounter.
You won’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, synchronization, paging, and multithreading).
We expect our engineers to be familiar with the fundamentals of how the internet works. 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 how the worldwide web works is a requirement.