Global economic downturns, opportunities dried up, amidst these troubling times I shared the same fate as many others. Laid off during the 2nd round after 3 wonderful years at Ninja Van with Driver team, I was on a work visa timer, searching for a new spot in Singapore during Fall of 2024. This blog post provide a summary of my searching and interviewing experiences for Backend Software Engineer roles after around 150 applications, 96% rejection rate, 30 technical rounds, 5 final rounds and 2 offers.
Laid off
The laid off didn’t come as a surprise for many as it had been the global trend for the past few years.
The first round was a bit more shocking since the timing was much later than other tech companies, while the 2nd round had been looming ever since, hence everyone seemed more prepared. My severance package was decent and provided a runway for the next job search. Ninja Van was also active in helping those affected, through referrals, recommendations, resume feedback, mock interviews. My lovely colleagues offered plenty of support which helped immensely.
Resume building
Time to dust out the old resume and freshen it up. Originally I used a 2 column, 1-page resume. However, I wanted to highlight more of my projects and opted for 2 page with the most important part condensed into first page, while the second highlights projects and opensource contributions.
- Page 1:
- Short intro + contacts
- 2 column, concise list of skills
- Full list of experiences with focus on highlighting impact with brief mention of tech stack
- Page 2:
- Projects
- Education
- Any other certifications or achievements
I also included a generic cover letter to all applications but honestly not sure if anyone ever reads it.
I’d recommend applying at a slower rate in the beginning to get a feel of how well your resume is doing and revise as needed.
During interviews, I’ve had quite a few questions about projects on the 2nd page, so in my opinion it has some values. Helps if your projects are interesting, mine was about building a cache and web server, which closely relates to the role, hence a good conversation topic.
I used NodeFlair’s Resume Checker and Resume Builder to get feedbacks, they’re both free tools and I found their suggestions useful. There’s already tons of advice out there on how to write resume, key point being focus on business values, so I won’t dive deeper into it.
Interview process
The hardest part of our job as software engineer, is funny enough, how to get a job. Nothing I do during the job can compare in terms of difficulty but pay-off is well worth it for me.
Tech hiring process has been the same for a long time, well maybe even more difficult in recent years with extra surge in supplies. It consists of 3-5 rounds, excluding the HR resume screening:
- HR reach out via LinkedIn or email.
- HR round mainly to introduce the position, process, a brief background check and aligning on salary expectations.
- Online assignment, 30 minutes to 1 hour, consists of 2 to 3 coding exercises. Most companies have algorithm and data structure - ‘LeetCode’ style questions. There are a few exceptions where there’s trivia, multiple choice questions.
- Tech round 1, 45 minutes to 1 hour 30 minutes, more commonly referred to as ‘Phone screen’, features both pair coding and knowledge questions.
- Tech round 2, a.k.a ‘First onsite’, usually same as the previous round, there might be more coding or more knowledge questions, varying between companies.
- Tech round 3 - Onsite 2, more often than not, a system design question is asked.
- Hiring manager round, at least 45 minutes, conversation will involve a combination of background, behavioral and expertise.
Applying and studying
Since there is no job to distract me, I treated interviewing as a job and spent the days following the cycle of applying, studying, interviewing, and back to studying. Woke up at 10AM and worked till around 7pm, taking rests in between.
Based on previous experience, I expected it would take at least one to two weeks to get a callback if any, from the time of application. Therefore, the first two weeks, I mainly focused on studying, and only applied around 10 applications a day. My line of thinking is applying too much too early, and not having enough time to study, there’s no way I could pass the interview.
With so much material to cover, having proper priorities is crucial. I focused on subjects in this order:
- Algorithm and data structure
- Relevant knowledge on frequently used tech, theory behind them, especially those mentioned on resume.
- How to tell a good story
- System design
One important aspect I wished I had spent more time on, is picking out the best story and tell it well.
All rounds start with an introduction and quick background inquiries. Interviewers only have a short period to determine your abilities, so first impression, bringing out your best version, matters a lot.
It’s no surprise algorithm is the main focus. After all, it’s considered the trickiest part of interviews. So much so that we have sites and courses dedicated to it.
The dreaded algorithm and data structure questions
First thing I did on the coding journey is buying LeetCode premium subscription. I’m not advocating everyone to buy it, but personally, the return of investment is well worth it. I used it mainly to unlock the learning course, read editorials and filtering problems by company. What worked for me 3 years ago was studying their courses such as this (costs money) and this (mostly free). Problems are grouped by types, it’s formally introduced, and you start with easy problems before moving on to harder ones. This way, our brain has time to commit these new problem patterns into memory. It’s similar to how math is taught, we start with single digit numbers then 2 digit, then multiple digits. We start with counting, plus, minus, and so on. So for algorithm, we start with arrays, then strings which are an array of characters, the all the special tricks you can do with arrays, then move on to linked list, and later, more complex data structure like trees and graphs.
From anecdotal experience, most companies asks arrays questions. Top companies ask more difficult questions involving dynamic programming and graphs. Difficulty levels are easy to medium, mostly medium but in context of a stressful interview, they can feel very hard to do. One way I gauge my performance is trying to solve a medium question under 15 minutes, while talking, explaining each steps.
My strategy was to spend no more than 45 minutes on a problem, reason being if I can’t solve it quickly enough, I’m either never exposed to this type before or there is an insight in the problem that requires more practice to spot.
To help internalize, I commented every solution with reasoning, stored in this repo. If I failed to solve it, I would read the editorial and implement their ideas step by step.
Another feature I liked about LeetCode is their mock assessment which gives you a random set of 2-3 questions that needs to be solved under time constraint. This is a great way to solidified learnings because now we need to recognize what we’ve learned in the wild.
Overall I’ve solved around 100 problems in one and a half month, combined that with those solved during job search period 3 years ago, I’ve solved around 250 problems. Yet during interviews, it still feels so difficult, even when I’ve faced the same problem or pattern before. Often times I would just straight up ask for hints if I couldn’t find any insight
within reasonable time. As long as the thought process is communicated properly, and you’re stepping slowly in the right direction, the interviewers I’ve met have been happily and proactively offered help. However, I don’t know how good or bad it might affect performance score.
Another thing I noticed is product companies asks more algorithm while consultancy asks more ‘build this small app based on these requirements’ type of questions so make sure to try a bit of that question type as well.
Most commonly seen problems in coding, both online assignment and interview:
- Medium level array questions making use of sliding window, hashmaps, two pointers techniques.
Most surprising problem:
- Parsing JSON config and implementing some validations
Knowledge, things from your computer science courses
In all rounds, it will usually start with a quick introduction and on to knowledge questions before other exercise, there’s plenty of books and online resource regarding these, here I’ll simply list the ones I faced a lot:
- HTTP, HTTPS, how do they work? Which leads to certificate signing and TCP vs UDP.
- DNS, how does it work?
- Programming language comparison which is a primer leading to Just-in-time, Ahead-of-time compilation, garbage collection, how they work, difference between types of collector, and collectors from different language.
- A special shout out goes to HashMap, one of the most used but also interesting data structure. Make sure you clearly understand the implementation, trade-offs, and variations of Map and alternatives data structure.
- On the OS side, process vs threads and stack vs heap are quite common.
- Message queues, how do you handle duplicate message delivery, consumption and how to scale up to handle high volume of messages?
A quick reminiscent of “ACID principles in relational database”, this question was asked a lot 3 years ago, but I haven’t encountered this time around.
Be prepared for at least 3 levels deep into all these concepts, as well as anything you’ve written on resume
A simple progression would go:
- I (interviewer): Do you know REST API?
- C (candidate): Yes, I use it a lot, GET vs POST, bla bla bla, built on HTTP.
- I: Ok, can you tell me a little more about HTTP?
- C: Sure, it’s bla bla bla, there’s also secure version HTTPS, bla bla, it’s built on TCP.
- I: Well how does HTTPS work?
- C: Some certificate signing stuff, symmetric, asymmetric encryption stuff.
- I: You also mentioned TCP? Can you explain a bit more?
- C: Yup, handshake yo, reliable vs unreliable of UDP, built on IP layer.
- I: What’s IP layer? what’s the other layers?
- C: Start freaking out because you’ve studied it in class but haven’t used or talk about it for a long time and forgot 90% of it. Such is life
Most surprising question: What is a socket? What is a port? what is a shell? These really made me stop for a moment to think about despite using them daily.
Art class
Though technically less difficult than coding questions, system design comes with its own twists and turns.
System design rounds is like painting: requires you to draw, requires experience and creativity, has a lot of principles and theory involved, and last but not least, subjective.
Different interviewers will focus on different things and have their own opinions which we can’t influence. I’ve had engineers focused on estimation process, a few would ask about your current company’s system, some focused on the database schemas, while others wants to improve general reliability and performance.
Best thing we can objectively prepare is learning fundamentals and explanation skills, being able to justify each decision of our design.
For this subject, Hello Interview has been godsend for me. They go into details, provide easy to follow but concrete frameworks for thinking. I read as much as their blogs as I could. Watched their explanation videos and try to practice using their AI powered mock tool. Same idea as coding practice, i’ll try to solve a problem on my own, draw out the design while talking, then come back to read their solutions and compare.
Another popular and great material are ByteByteGo’s videos and their books, compared to Hello Interview, they have more breadth than depth which helps exposes you to more types of problems and what’s unique them.
Even with good preparations, you can still be caught off guard by interesting questions, combined with the time pressure, opinionated and fear of judgement factors, the system design round is still a challenge even if you’re exposed to complex systems before. Best if you could do mock interviews to get practical feedbacks. I asked for help from old colleagues (shout out Baron and Tu) which they gladly offered and the insights from one session with them alone is worth tens of hours self studying.
Most frequently seen problems: Design a url shortener. This is supposedly one of the simplest question, yet after the 3rd time I still struggle with it.
Mindset for background and behavioral questions
Honesty. That’s it.
It’s harder to tell lies than truths. Getting caught in a lie, which is likely to happen, leaves a far worse impression. If you’re an empathetic and team oriented person, behavioral part should be a breeze. There will likely be a few questions that requires having an opinion, might need to be careful how you express them without coming off too strong or controversial.
Expect knowledge questions in the final round as well. All engineering managers and directors I’ve met have asked technical questions, and they were even a level deeper than previous rounds which I was a bit surprised by, as most online advice said this round usually don’t involve these types of questions.
An important aspect to this round as well as all rounds, is your ability to tell a good story that highlights your skills and experience. Mock interview is key, having someone else to judge and directly tell you how your story sounds is crucial as we tend to get stuck in our own head. For this round I asked help from my previous manager (shout out Jan) and refined a lot of key points based on his feedbacks.
Which leads to my next point: don’t be afraid to ask for help. This goes for practice as well as in interview. Don’t know how well you’re explaining? Find mock interview on Exponent (previously Pramp), or friends and colleagues. Missing a bit of insight on the coding or design question? Ask the interviewer for small hints. Knowing how and when to ask for help is also a good sign of teamwork abilities.
Job search is mentally exhausting, so allow yourself some rests as well while your brain digests all that information. It takes time, do your best, trust the process.
Most common questions:
- Tell me about a time of conflicts and how you resolved it.
- What’s your proudest or most challenging projects?
Moment of truth
As time went on, I’ve applied to almost every job listing available, most were met with silence. Some interviews didn’t go well which resulted in rejection, thus morale was running low. Anxiety level was high waiting for results after each interview. There was only a few chances left and if those failed I was ready to pack up. Luckily, after around 1 and a half month, I managed to secure an offer and ultimately joined Rakuten Viki in Multimedia team, working with video encoding pipeline and user playback experience. I was reaching final rounds for a few companies but pulled out since the timing was a bit tight. I didn’t really want to accept one offer only to rescind later for a different one. The opportunity was great, and I was honestly tired and stressed out, securing the offer was a huge relief. I don’t have much salary negotiation experience to share. For me, it depends on how much one wants or needs the other. Having managed expectations, a bit of research and open communication is how I approached it.
Conclusion
- Drink a lot of water.
- Refine resume and apply actively.
- Study with focus, get good enough with one thing at a time and shift focus as the interview process progresses.
- Practice a lot, practice talking while solving as well.
- Mock mock mock interviews, get different perspective, avoid getting stuck with your own thoughts.
- Have enough rest
- Repeat
Overall, this was my first experience looking for a new job specifically in Singapore. These were everything I did and went through during that period, it had helped me secure a position so hopefully it would help anyone who’s reading this as well. Good luck y’all.