# Lessons Learned from a Tech Interview Failure: Insights and Tips
Written on
Chapter 1 Overview of My Software Development Journey
Six years ago, I embarked on my career as a software developer, working with various technologies to create mobile applications and backend services. My expertise spans microservices and event-driven architecture. Daily, I tackle problem-solving through coding, complemented by a series of meetings and collaborative sessions.
A few months back, I applied for a senior software engineer position, refreshing my resume to highlight my latest skills and projects before reaching out to multiple companies. I was fortunate enough to receive an interview invitation from one of them. The interview process was standard, consisting of a coding round, a system design interview, cultural fit assessments, and a final conversation with a VP of Engineering. While the majority of the process went smoothly, the system design interview proved to be a significant challenge—one I’d like to discuss in detail.
This paragraph will result in an indented block of text, typically used for quoting other text.
Section 1.1 Coding and Cultural Interviews
The coding and cultural interviews were straightforward, so I'll briefly touch upon them. Feel free to skip this section if you're more interested in the system design aspect.
The coding interview presented a simple challenge, and while I managed to solve it within the allocated time, I overlooked some edge cases. I identified these edge cases and proposed potential solutions but didn't have enough time to implement them. Overall, my performance was satisfactory, allowing me to progress to the next stage.
The cultural interview was enjoyable and entirely non-technical, focusing on my work style, views on testing, collaboration, and meeting dynamics. It felt more like a casual conversation than an interview. There was a similar round that delved deeper into my motivations for joining the company and my past experiences, which I navigated without difficulty.
Section 1.2 The System Design Challenge
This is where things took a turn; I ultimately failed the system design interview. I want to unpack what went wrong and share some insights that could be beneficial for you.
The non-functional requirements specified that the system must be highly available, preventing redirection failures, and that no two URLs should generate the same short link. The anticipated daily user count was around 1,000.
I started by outlining the necessary endpoints to create short URLs and retrieve stored long URLs. This service would use a database to keep track of IDs, long URLs, short URLs, and creation timestamps. Several discussions followed.
The first video titled "I Flew 2,901 Miles to Fail All My Tech Interviews" offers a humorous take on the challenges of job hunting in tech. It highlights the lessons learned from failures in interviews, which often provide more insight than successes.
Section 1.2.1 Discussion 1: SQL vs. NoSQL
I began by selecting the appropriate database for the solution. I recommended a NoSQL database, mistakenly forgetting that scaling wasn't a concern due to the low expected user count. While I presented some valid arguments for NoSQL, I couldn't justify its necessity over a SQL database, leading to excessive explanations about its advantages.
Mistake 1: I Overexplained
While it's essential to clarify your thought process, lengthy explanations can be counterproductive. I spent too much time elaborating on points that could have been succinctly addressed.
Tip: Seek quick feedback from the interviewer to keep the conversation flowing.
Section 1.2.2 Discussion 2: Short URL Computation
The next critical aspect was devising the logic for generating short URLs, which involved creating a unique hash (SHA256) and encoding it with Base62. I struggled with ensuring the output was consistently seven characters long and managing duplicates.
Mistake 2: I Made Assumptions
I underestimated the depth of detail required in a system design interview. This oversight cost me time that could have been better utilized.
Tip: Prioritize key outcomes by confirming them with the interviewer to ensure you focus on what's most relevant.
Section 1.2.3 Discussion 3: Database Replication
As I outlined the service architecture, I brought up database replication. However, my explanations lacked depth since I had limited practical experience with this concept.
Mistake 3: I Hesitated to Admit Uncertainty
If you’re unsure about something, it’s better to acknowledge it. I often tried to fabricate answers instead of steering the conversation to areas where I was more knowledgeable.
Tip: Don’t hesitate to say "I don’t know," as it can provide you with the time needed to focus on more critical components.
Section 1.2.4 Discussion 4: Caching Strategies
To ensure low latency, caching the most frequently accessed URLs was essential. I proposed caching URLs after a miss and removing them when no longer in use, suggesting a least-recently-used (LRU) policy.
However, when asked about regional cache replication, I proposed database replication without fully fleshing out the details.
Mistake 4: I Lacked Confidence
Despite having experience with distributed caching, I faltered in my delivery. My solution was sound, yet I felt uncertain about its viability.
Tip: Confidence is crucial. Trust in your knowledge and express it clearly.
Conclusion: Reflections on the Experience
I hope my experience from that challenging 90-minute interview offers valuable lessons. Although it was a difficult moment, I found it enlightening, exposing gaps in my knowledge that I later addressed, ultimately aiding my success in subsequent interviews.
The second video titled "LeetCode Was Hard Until I Learned These 3 Things" provides practical strategies for tackling coding challenges, offering insights that can help enhance your interview performance.
For further reading, consider these articles:
6 Key Differences Between a Junior and a Senior Developer
Understand what differentiates these levels and how to elevate your career.
Yes, Impostor Syndrome Is Actually Good for Software Developers
Embracing it can lead to growth and self-improvement.
Some resources to explore:
donnemartin/system-design-primer
A comprehensive guide to designing large-scale systems, perfect for interview preparation.
Grokking the System Design Interview - Learn Interactively
An interactive course to navigate system design questions effectively.
Thank you for reading!