My Interview experience with Amazon

After making sure that my resumes are updated and well according to the standards. I scanned through the job portal for amazon jobs, after carefully reading the job description; i decided to apply during mid last year. I almost forgot about the application, out of the blue i got call from the recruiter asking whether you’re still available in market. I replied positively to the recruiter. They sent my profile to the hiring manager and asked me time slots for the interview. Got the response for the interview slots.

I prepared myself for the interview for about a week, brushed programming skills on data structures/algorithms, I took courses with MIT open course ware. Finally i am at peace before the interview, all the topics i covered was running in my mind like a dream. ok enough of story, let’s go through the interview questions.

The interviewer was very kind enough to explain about his role in the company and its business values. He asked me about my roles and responsibility in the team, following are the questions in order.

a. Tell me about your responsibilities and teams

b. Tell me about the challenging situation with the team and how do you handle it.

c. What proactive ideas you gave to the client and what is the response from them. And to follow-up this he asked me questions about the solutions.

d. Tell me about the situation where you took hard decision and its impacts. Specifically he was asking about breaching the dead line.

e. How did you handle changes in requirement and how did it impact the team.

f. How did you manage the conflicts in the team.

I answered the questions with utmost diligence. I complimented the team all along, it was the truth. Hey No cribbing about the management. After that he asked to open  http://collabedit.com for programming. He started to write the problem statement. Following is the problem statement. Create alogrithm for the dependency list of the package installer.

Amazon_interview_q

I looked at the diagram and got a bright idea to use undirected graph. He asked me why undirected graph, I though for a while and decided to use directed. Since there is no reverse dependency i.e core is not dependent on Apache so it is always one direction. He asked me to write the program and i started to create a graph class. Following is the solution i provided, i will just write in sudo code.

a. Created a class called “graph” which has a list of int, strings, and variable to store the max number of the vertices. Integer list has the index for the string in the string list, example string “Root Package” has index “0”.

b. A function to iterate through the graph and update if it is visited in boolean list. I chose Depth First algorithm for iteration.

c. In Public specifier; I added constructor, Add edge function, Get list function.

I was not silent in the call but kept on telling him what i was thinking, just to engage him in conversation. You may think why list of vertices, I will give you a pictorial representation of the list.

Amazon_interview_list

This list has the path to trace back to the parent, because he asked me to check for cycle. Anyways the coding went well and he said it is good. May be you have a better idea for this problem, but this is what I can come up during the interview session.

Code is available in my git hub page

 

Advertisements

Ideas on Designing Software based on my experience

I am going to put forth my ideas based on my experience. Software designing needs lots of patience and need to be open to ideas or changes. The first few phase are very trivial for software design. I had an opportunity of designing three software from conceptual phase.

1.Gathering the requirements

May be this sounds easier, but believe me it needs your time. For the first software which i designed, it took me two months for requirement elicitation. First step is to find out whether the product is for the internal or external customers. Both customers are very unique, internal customers are critics and external customers are consumers.

After determining the customers, bring the stake holder in for a discussion and understand the following:

  1. What is the end goal of the product?
  2. What is scope of adding features in future ?
  3. Is it aligned to the market trend
  4. What is the targeted time frame ?

These discussions will give you a fair idea about the software/product and it will be easier for you to communicate in their language. Create a database to store all the meeting minutes, requirements documents. Go through the requirements document and create an understanding document based on your understanding about the requirement and get it reviewed by the stake holders.

Initial tough phase is completed.

2. Finalize the technology

Now you have a fair idea about the product. Do a market research about the softwares that can be used, just to give an example.

Technology Difficulty level Is it easier to maintain License Is support available
C Medium yes GPL Yes, online forums

This phase is also very trivial since this is going to determine path for rest of your project.

3. Proof of concept

According to me, this is where your software gets life. This phase can eliminate the unnecessary complication on platform, technology. In my first project i ignored this phase and it lead to major complications. We were to design a cross platform software for a Embedded product. My fellow engineers chose wxWidgets just based on the initial market research. The development went fine on one platform until time came to test on windows, the entire software broke. We ended up debugging the software to create work around.

So don’t do this mistake. This phase will not resolve any un foreseen issue, but it will at least give you an heads up.

4. Decide on the design pattern

Here comes the dilemma, there are more design patterns available than anticipated. In phase 3 you might get some idea about the working of the software in very high level. Use that understanding to zero in on design patterns. A piece of advise, have two or three design patterns as fall back position.

5. Decide on building blocks/modules

The design should be structured, easier to maintain and expendable. Create building blocks of the software and find a common blocks which can be used by all modules. Blocks not the very low level of coding, I am just talking about the modules.

I will take an example of GSM messaging, Layer 3 messaging RR,CC, SMS etc,

Building blocks - Software

I created base block for the all the layers to be able to control completely if any changes in future.

6. Communication channel between modules

We have decided on the modules, number of building blocks and common blocks. Now we need to finalize on the mode of communication between these blocks. In my first project the softwares includes four services, a. Main GUI or tracing b. Configuration management c. Clock d. Simulation components. So How did i decide on the communication mechanism, its simple. First draw a map about who’s is going use those modules, is there any updates required during run time.

So in my case the configuration server holds all the information about the current running instance and needs to be update in runtime and broad casted. So i decided to go for a client server design on sockets, one for updating data and another for broadcast.

Communication - software.png

In your case it could be just a function call.

7.  Designing individual modules

If you have reached this phase, you have complete understanding of the software by now. The modules are tap points for the application layers. So make sure you make it very generic so that it can be completely controlled by the application layer. For instance we will take the GUI wants to connect to a server

GUI module:

function_connect_to_server();

Instead of this you can have

function_connect_to_server(url, password,username… etc);

8. Design document

You may be an architect but in order to make your design rolling, you need to document. Keep in mind that the engineer does not have extensive knowledge, since he/she is not involved from conceptual phase. In first project i got this wrong and assumed the engineer knows.

After you document the design, make sure to get the design review by SME’s, stake holders. This will give a chance to correct the design, if you have missed any trivial part. This does not mean that you have got all requirement correct 🙂

Before closing up this discussion. The above mentioned points are purely based on my experience. I always strive to make the design make very generic and to embrace changes based on the customer experience.

Good luck in your software design.