Published: 2024-04-02T22:09:49+01:00
About 4 months ago, I was laid off due to my company losing a large chunk of their customer base (itself due to the recession/inflation/take your pick). I started applying to new roles immediately, confident that my 15 years of experience in the software industry would make this an easy endeavor. I was wrong. I thought that much of my work being available as open source projects online would be enough to demonstrate my skills to potential employers. I was wrong on that too.
The Job Hunt
It took four months and about 55 job applications to find a new role. In the end, I found a job at a great company full of great people. They don't have a ridiculous interview process or use coding tests. Their offer came first, and it was also a company that I had hoped I'd get a job at in the first place! Lucky me!
Their process was:
- 1 hour introductory interview.
- 1 hour technical interview.
- A final references check (no action required on my part).
The entire process was essentially a vibe check to see if the company and I have similar values, and also a chance for us to talk in-depth about their platform and the tech behind it. Of course, it was also a chance for them to get to know about my skills, and for me to get to know about their situation and how they do things.
The recruitment process for this position took about a month, but only because of delays caused by external factors. The actual decision was made after 2 weeks, and the rest of the formalities took a bit longer. At the time I signed my new employment contract, I was still in another active recruitment process that had been going on for 6 weeks. Unlike the place I joined, this other company was still actively engaged in the hiring process (interviewing other candidates, making final decisions, etc).
Endless Interviews
On the same day that I signed my employment contract, the other company said that it would take them another week to reach a decision. That brings the total length of time for this other job application to 7 weeks.
Yes, 7 weeks.
The interview process began around mid-February, and consisted of the following:
- 30 minute introductory call.
- 1 hour technical interview/discussion.
- Technical assignment (admittedly: fairly-scoped, at least).
- 1.5 hour interview consisting of presenting the assignment and a systems design discussion.
After the last stage, there would have been a final formalities interview with a member of management. That makes 6 total steps! Or 5, if you consider the assignment review and systems design interview one event.
Just ... What?
I've only interviewed a few times since starting my professional career, as I tend to stay at one place for 4+ years. And each of those times, I've only had one or two interviews before getting an offer or rejection. Things have changed in the past decade. Almost every role I interviewed for during this job search required some variation of the complicated process detailed above. I didn't really have a choice, so I didn't decline most of those companies.
The Worst Offenders
Sometimes the tests would be before any further interviews, and other times they'd be after. The process above wasn't even the worst one. Among the businesses employing a convoluted interview process, there were a few places I actually declined to continue after learning about their hiring process. They had even MORE steps than the above process.
Highlights include:
- Multiple coding tests, including a leetcode-style algorithms test and a domain-specific “service implementation.”
- Intro call not considered part of the recruitment process, and a psychological “soft skills” test + coding test would be administered before a series of 3 interviews.
- Two time-limited live coding tests for a position that expected US eastern time availability from central Europe (i.e. work until 8pm every day).
A Sane Interview Process
As explained above, the role I ended up signing for had a hiring process consisting of two interviews. The first was with the director of software engineering and was somewhere between an intro call, vibe check, and technical interview. It felt like talking about software day jobs while hanging out at a bar.
The second interview was technically (ha) a technical interview, but it had much the same vibe as the first. A few formal questions about how I would handle scenario X or Y were asked, but otherwise it was very smooth and very laid-back.
There were no tests. No endless processes that linger for weeks and weeks. The final step was to check my references, and that was it.
Everybody is FAANG!
Many companies today seem to think that they're Google or Facebook. A 20-man startup demanded refactoring and implementation of purposefully bad code at multiple layers of a web application in a domain I was unfamiliar with. This took me about a week, and then they said my code wasn't senior-level quality. Right. They didn't even do me the courtesy of reviewing it with me in person.
If I had more options during the job search, I would have immediately and politely declined any recruitment process that involved a take-home test. Unfortunately, almost every company in this country seems to have a take-home test. There was only one interview process here that didn't, consisting of two interviews (I was ultimately rejected, which was fine, because it was not a good cultural fit).
Many businesses seem to have an unspoken expectation that they are the only place to which you are applying. Perhaps I should've started giving my hourly rate when presented with a test. I don't think anyone would've taken me up on it.
The Layoffs of 2024
The software job market has shifted—in many places—to the advantage of employers. With mass layoffs at the big tech firms, and smaller firms following suit (either because they want to, or have to), there's a lot of competition for new roles. That allows companies to be selective in who they recruit. And perhaps they HAVE to be selective. With coding boot camps and the rise of generative AI, many people can just BS their way into a job they can't actually perform.
The demand for software engineers where I currently live is actually still very high. Yet, many businesses employ a ridiculously rigorous recruitment process. Why? Likely because of the dearth of CAPABLE candidates, and it's apparently difficult to find a person who can actually prove that they're capable.
But this approach can and does backfire. Not only does it irritate candidates (see: this entire blog post), but companies can also lose out on good talent. The company that spent over 6 weeks taking me through their recruitment process lost any chance of having me simply because they were too slow! With every business wanting candidates to do these tests and numerous interviews, I had to be picky about which ones I spent my time on.
I have a life and family, and free time is in very short supply. I can't just sit down for 8 straight hours and work on contrived programming scenarios all day. On the rare occasions I CAN sit down for 8 straight hours and work on contrived programming scenarios, I want to work on my OWN contrived programming scenarios.
That allowed me to create things like gemfreely ...
... or the AI-driven text adventure game.
Standardization of Industry
The software industry is transforming, and not necessarily for the better. It's one of the only industries where this kind of ridiculousness is prevalent. One way to fix it could be to require actual licensing and testing for one to call themselves a software engineer. Actual engineers of physical materials have to do this, and for good reason. Broken software is usually less dangerous than say, a broken bridge, but the principle behind the idea is the same. Software permeates more and more of our everyday lives, and regulation is bound to happen at some point. We are seeing it already with efforts in Europe to apply the CE marking to software products.
A tiered certification system would be wonderful. The vast majority of developers would probably have some basic certification that demonstrates they are knowledgeable about software design and can provably engineer a system. More specialized and intensive certifications would be required for high-stakes industries like finance, healthcare, rocketry, etc. This would hopefully make most of this ridiculous interviewing and testing go away. Ideally, interviews would be more about cultural fit and vibe checks, which is a very important factor. Perhaps even more important than raw skill.
Lessons Learned
This job search was largely an exercise in frustration, and a reminder of what happens in situations where there is an imbalance of power between two parties. To be fair, I had plenty of interviews. Getting interviews was not the problem. Advancing further in the application process usually was..
I didn't keep super detailed records of the job search, but I kept enough data for some rough numbers.
- Of ~55 job applications, I had ~17 interviews.
- Of those 17: 4 advanced to final interview stages.
- Of those 4: 1 offer was given, 1 ended in rejection. 2 ended in limbo.
- Of the original 55: ~13 applications were ghosted completely.
My positive response rate (i.e. getting an interview) was around 30%. Most of the 17 interviews I had were intro calls only, and the recruitment process halted due to one of the following:
- Them declining to move forward after the intro call.
- Them declining to move forward after a coding test or technical interview.
- Me declining to move forward with the application.
What lessons did I learn from the application process?
- You don't need a LinkedIn account to get an interview!
- It doesn't take long to write a cover letter.
- Coding tests always take longer than they say.
In many ways, it's all a performance: the interviews, the coding tests, all of it. And it's a performance that we've all convinced ourselves we need to do in order to succeed. The number of what I'd call “genuine interactions” during this job search was quite low. These were almost always at the places where my application advanced to final stages. Many of the other interviews felt rigid and “overly professional.”
I suppose it's a difference of personality. Different people fit in with different working cultures. For me, “professional” doesn't mean overly rigid or formal. In fact, it means rather the opposite. I find that self-discipline and an innate dedication to success pair rather naturally with a relaxed work environment.
In a company composed of highly motivated and knowledgeable individuals, success will usually follow. It's an organic, infectious culture, in the best way possible. The team self-organizes around completing the task at hand, and motivation flows from supporting one another and seeing concrete success. In my experience, at my past 3 jobs, this has always led to a tight-knit team that knows how to succeed AND have fun.
This job search taught me exactly what I should look for in a company, and what to avoid.
During the interview process:
- A rapport between the candidate and interviewer(s) needs to be established during recruitment.
- If initial interactions don't feel right, you likely won't fit in.
- What feels right to one person may not feel right to another.
Coding Tests: the Magic Incantation
The coding tests, in particular, felt like guessing the correct mystical incantation that the interviewers wanted, in order to advance. I know my skills and what I am or am not capable of. In the test that I failed, my code style was not enough to their liking, and they said my unit tests were not complete enough.
But how far should I need to go? It's a simplified test scenario that shouldn't require fully production-grade code. Many interviewers even emphasize that point. But if you don't put enough effort in to make it complete, you could easily miss the one thing that they silently expected you to do.
This job search taught me:
- You should avoid these tests.
- If you can't avoid them, you shouldn't spend too much time on them.
- Decline tests that seem overbearing or overly complex.
- Be THOROUGH on any test you decide to complete (which might require spending time).
Are the Tests Necessary?
If you've made it this far in the post, you can probably guess that I despise coding tests. Despite that, I think they are sometimes necessary. They ARE useful for filtering out those who don't know how to actually develop software. This doesn't mean they should be used all the time, or as a “first line of defense.” If a candidate has code out in the open, it should be easy to evaluate their skills. Someone who has a demonstrated track record of contributions to open source projects and creating their own well-documented software shouldn't be subject to a coding test.
If a test MUST be employed:
- It should focus only on what would be day-to-day problems.
- It should not be long.
- It should have a narrow focus, not require a full implementation of all parts of the stack.
One of the tests I did met these requirements. It took me perhaps 8 hours over 3 days, and it was focused very specifically on the company's message passing setup. No database was required, and my test harness was a jQuery-powered web UI I yoinked from a 10 year old Spring tutorial.
In contrast, the test I failed met only the first requirement. It WAS focused on the company's day-to-day problems, but it was wide in scope and took many hours. It involved cleaning up and implementing a miniature service with an N-tier architecture.
Conclusion
Job hunting sucks. Job hunting when you don't have a job can be demoralizing and make you question your sanity. I was fortunate enough to have 3 months of severance (thanks, European workers' rights laws!), and only needed to cover one month with the final severance + unemployment benefits. I also got a LOT of practice interviewing, and I learned exactly what I do and do not want in a job.
I wish I didn't have to go through so much frustration and rejection to learn these lessons, but it is what it is. In the end, I am employed at a place that seems like a very good fit and that will give me a chance to make an impact. I am happy.
License: CC-BY-SA-4.0.
Written by: @[email protected]