From the Aikido Wikipedia page:
“Aikido training is based primarily on two partners practicing pre-arranged forms (kata) rather than freestyle practice. The basic pattern is for the receiver of the technique (uke) to initiate an attack against the person who applies the technique—the 取り tori, or shite 仕手 (depending on aikido style), also referred to as 投げ nage (when applying a throwing technique), who neutralises this attack with an aikido technique.
Both halves of the technique, that of uke and that of nage, are considered essential to aikido training. Both are studying aikido principles of blending and adaptation. Nage learns to blend with and control attacking energy, while uke learns to become calm and flexible in the disadvantageous, off-balance positions in which nage places them. This “receiving” of the technique is called ukemi. Uke continuously seeks to regain balance and cover vulnerabilities (e.g., an exposed side), while nage uses position and timing to keep uke off-balance and vulnerable. In more advanced training, uke will sometimes apply reversal techniques (返し技 kaeshi-waza?) to regain balance and pin or throw nage.
Ukemi (受身?) refers to the act of receiving a technique. Good ukemi involves attention to the technique, the partner and the immediate environment—it is an active rather than a passive receiving of aikido. The fall itself is part of aikido, and is a way for the practitioner to receive, safely, what would otherwise be a devastating strike or throw.”
Yesterday I applied for a job at Amazon. By that I actually mean that I applied for an opportunity to apply for a job at Amazon. I was contacted by one of their recruiters who informed me that they would be in my area in the next month and would be conducting interviews for Senior Software Developer and Project Manager positions. While I am nowhere near ready for either of those positions in my career as a Software Developer, I was very interested in the preliminary code interview. Based solely on my curiosity about the form and format of the code interview I proceeded with the preliminary code interview provided by the recruiter.
Interviews for Software Developer positions commonly contain a programming component. The interview for the position I currently, and happily, hold was contingent on the completion of a coding challenge. For my current position we were asked to solve FizzBuzz in C# using the Visual Studio Unit Testing Framework and Test Driven Development. The reason for my curiosity about the Amazon interview was two-fold. First, I am not accustomed to the coding portion of the interview coming so earlier in the interview, in this case before the interview has actually been offered. Secondly, the coding interview was timed. The timed component of the preliminary interview seemed like a challenge. Amazon had thrown down the gauntlet and I had to answer.
Here is the setup for the challenge:
“To begin your test:
Step 1: Click here: http://SomeCodeInterviewTool.Somewhere
Step 2: Read instructions and review sample question
Step 3: Fill in your full name (First name, Last name) and email address
Step 4: Start your test
General Instructions: The problems can be completed in a variety of OO languages (C++, C#, Java, etc.). Feel free to use a language in which you are comfortable and fluent. When solving this problem, consider performance, memory utilization, code clarity, elegance and of course correctness of your solution. (There are many ways to solve this problem. Please write the most efficient method possible). Our preference is you complete the problems in the SomeCodeInterviewTool text boxes. If you choose to solve offline and cut and paste into the tool, please state that at the very top of your solution.
Friendly Reminder: Your test is being recorded in real time. You have up to 60 minutes to complete your test. Plan accordingly, as you will be given each question one at a time and will not be given the opportunity to edit an answer after you have moved onto the next question. Submissions taking longer than 65 minutes will not be considered. When you are finished – click Submit Solution and you’re done! Once you are finished, you will be able to review your answers, but again, you WILL NOT be able to make any changes.”
The questions were fairly academic question and could easily be answered by anyone who had obtained a computer science degree. The difficulty came with the fact that the challenge was timed and that these types of questions do not have one correct answer.
The outcome of the challenge was something of a disappointment. I read the first question and went off to the races. My inner Software Developer kicked in immediately and I was analyzing requirements, designing features, and wallowing in creative bliss. After 45 minutes of feeding my ADD monster, I realized that I had forgotten about the YAGNI principle, implemented many more features than were required to answer the question, and most likely blown my chance at completing the “Amazon Challenge” in the allotted time. I quickly regrouped and attempted to answer the final two questions as quickly as I could with the most trivial answers I could manage. To me, this was already a failure, but when I submitted the final answer and fount that I had taken 85 minutes to complete a 60 minute challenge, it was a complete failure.
Through this long winded recount of my failure to meet the challenge presented by Amazon, we reach my purpose. The purpose of this blog is to take known coding interview questions, analyze them, formulate requirements, find a complete solution, and present one or more solutions for the question. The question will be the kata; the nameless interviewer will be the tori; and I will be the uke. Ukemi will come through actively participating in the exercise and practicing different techniques of solving the problems presented, thus expanding my problem solving toolset.
I am certain that had I managed my time with a clock and not succumb to my ADD monster that I would have completed the “Amazon Challenge” with time to spare. This was the first lesson I learned.