How to Pass Amazon Online Coding Test

Introduction

If you are sitting for the onsite interview,  please check this blog on how to pass amazon onsite interview.

A few years ago, I managed to successfully pass the Amazon online coding test. It was extremely challenging. In this blog, I am explaining how I prepared my self for it.

Purpose of the Coding Test

The purpose of the online coding test is to identify candidates who may do well on the onsite interview. It basically measures how good of a problem solver, and a coder you are. There are some questions to judge whether you are the correct cultural fit for the company.

Exam / Test

Amazon uses an online coding tool for the test. Your recruiter will send you a link to the exam. You can always follow the link and look around to get familiar with the tool. You should be even able to do some practice tests. You can take an exam in most of the popular programming languages (like Java, C++, Python, Ruby…).

The test has two coding questions.  You will have 90 mins to complete both questions. After 90 minutes tool will auto submit your code and close the window. The tool should provide few tests, which you can use to validate you code. You can always add extra tests to improve the accuracy of your algorithm.

Cultural question is given after the coding exam. These questions are MCQs and not timed.

Preparation

Brush up your algorithm knowledge before the test. I would recommend Sorting, Searching, Hashing, Tree Traversal, Graph Traversal, and Dynamic Programming algorithms. Get familiar with data structures like Linked Lists, HashMaps, Trees. Do not waste your time looking at too complex data structures/algorithms like the red-black trees.

Language – Choose Wisely

If you are familiar with several languages use the one with most API support. For example, if it’s C vs Java, choose Java. This will help you to save time.

Be ready to take the full advantage of language-provided data structures and algorithms. For example, if you are planning to code with Java, get familiar with the Java Collections framework. Get familiar with data structures like Maps, Lists, LinkedHashMap, Priority Queues, TreeSets, and TreeMaps; and the methods available in the API classes.  Also, check utility methods available in the Collections and Array classes; also Comparators.

Learn to Calculate Time / Memory Complexity

You are usually asked to provide the time/memory complexity of your code. So another area of study if you don’t remember how it is calculated.

Practice Practice Practice

The practice is the key. Do as much as practice questions you can. There are several online web sites which provide practice algorithmic questions. Make the best use of them.

Start your preparations as soon as you got the message from the recruiter. Generally, the link to the coding test expires within 1 – 2 weeks.

During the Exam

You can access the internet during the exam. You are allowed to use your own IDE. This useful because it compiles a bit faster and provides auto suggestions. But the risk is if you couldn’t submit your code on time, you don’t have anything to show.

Time is Precious

50% of the exam is about time management. Problems you get are complex enough to make it difficult to finish both within 90 minutes. If the first question is an easy one, don’t spend too much time on it. Finishing both questions is far more important than brushing up the code of the first problem.

If you are running out of time, prioritize the important bits of the algorithm. For example, if you are going to implement a sort, you should prioritize the Comparator since it’s going to be to the core logic of the program.

Write Good Code

This is the first time Amazon is going to see your code. So try to give the best first impression. Follow basics; use meaningful variable/method names, move the redundant code to functions. Try to create classes instead of using complex collections. Write comments where needed. Try to output the best program you can.

Do not Brute Force

You may be tempted to solve some problems by brute force. But try to provide an optimal solution as possible. Brute force solutions will not raise any eyebrows. So only be used as a last resort.

Cultural Questions

After coding questions, you will have to answer a questionnaire which evaluates whether you are a good cultural fit for Amazon. Don’t worry this questionnaire is not timed. Try to be your self and answer honestly. If you and company are not going to be a good match, it’s going to be a bad move for both the parties.

Also, don’t trust the tool too much save your work continuously as you progress.

Finally

Personally, I took about 3 weeks to prepare my self for the coding test. So start early and give your best shot at it.

SOLID Principles for a Good Software Design

Follow SOLID Principals

SOLID principles are widely accepted set of rules that let you design/implement reusable and flexible Classes and methods. They consist of the following five principles.

Single Responsibility Principal – Promotes Encapsulation

A class/method should have a single, well-defined functionality. They should only contain code responsible to a single actor (of a use case).

Classes and Methods change because the requirements of the actors change. If a class / a method only contain code that is responsible for a single actor, they only have only one reason to change. This is important because different actors have different requirements, which evolves in different phases and for different reasons.

Open Closed Principal – Promotes Abstraction + Polymorphism

Classes (even Systems) you develop should be open for extension and closed for modification. New functionalities should introduce new codes to a system, not changes to the existing code. The modules you design should never change. When requirement changes you should extend and add more modules to change the behavior of the system.

This principle promotes Abstraction and Polymorphism. Your module should be designed on top of immutable abstractions so it never changes. However, anyone can implement different derivations of these abstractions to introduce new behaviors to the system.

Things that change for different reasons and in different rates, should exist in different places in the code. It is impossible to make a system 100% agnostic for all changes. The designer should find the most probable changes and should make the system to be resilient against them.

Find this very interesting paper on the topic – link.

Liskov Substitution Principal – Abstraction and Hierarchy

Any subtype should be directly substituted in place of a supertype reference. This means that a reference of the supertype should be replaceable with a subtype object without breaking the program. For this principle to work, it is essential that subtype does not change the behavior of supertype. The subtype should provide all the features of the supertype, then some extra

Find the research paper here.

Interface Segregation Principle

A client should not be forced to depend on the method that it does not need. This principle enforces splitting large interfaces to several small interfaces.

Dependency Inversion Principle

Abstract modules should contain high-level business logic. Concrete implementations should contain implementation details. When a high-level module needs to call a low-level module, define an interface on the side of the high-level module to invert the dependency.

 

 

Install Ubuntu Mate in Raspberry PI using Mac and no Keyboard

Raspi-PGB001

Introduction

In this blog, I am going to explain how you can install your Raspberry PI using a mac and without any keyboards. Also, you need minimal technical knowledge to do so. You will need a mouse and a display device. So here it goes.

Step 1 – Download Ubuntu Mate

Get it from the following link. Then extract it to get the .img file.

https://ubuntu-mate.org/raspberry-pi/

Step 2 – Plug Micro SD card to your Mac

Connect your Micro USB card to the mac. If your mac is a new (fancy) one with only Thunderbolt ports you can buy a micro SD card adapter from Amazon for a couple of bucks.

Step 3 – Find the Device Identifier

Mac will auto-mount your micro sd card. Go to the Disk Utility, select your SD card. Note the disk identifier of your card. For my case, it is disk4. Then unmount your disk (do not Eject).

Screen Shot 2019-03-09 at 4.26.54 PM

Step 4 – Write Ubuntu Mate image to the SD card

Here is the command you should execute.

sudo dd bs=1m if=path_of_your_image.img of=identifier_of_your_disk conv=sync

For my case, here is the exact command I had to run.

sudo dd bs=1m if=~/downloads/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img of=/dev/disk4 conv=sync

This command takes some time to complete, so stay put.

Step 5 – Boot your Raspberry

Plugin the micro sd. You need to connect a mouse and display to it as well. Turn on the raspberry and boot it up.

Step 6 – Set up username/password without a Keyboard

When it boots up it will ask you to give a login and a password. But you can’t do it because you don’t have a keyboard. The trick is to copy any text from the window and paste it on the login and password text boxes. For this example, I used “computer” username and “computercomputer” as the password. Set it up, you are good to go.

Step 7 – Enable On Screen Keyboard

Go to Applications–> Universal Access –> Onboard

Hope this helps. Refer this blog to see how you can set up Ubuntu Mate after installation for programming.