DEV Community

Henrik Warne
Henrik Warne

Posted on • Originally published at henrikwarne.com on

Finding a New Software Developer Job

For the first time ever, I was laid off, and had to find a new software developer job. I managed to find a new one, but it took longer than I thought, and it was a lot of work. I was in contact with 30 companies, got a no from 8 companies, no reply from 6 companies, and offers from 3 companies. Here is what I learnt from the process.

Laid Off

At the end of October last year, I lost my job. I was completely surprised, but in retrospect, maybe I shouldn’t have been that surprised. The times were getting tougher, and many companies had been laying off people during all of 2023. If the company is not making enough money, eventually there will be layoffs. In my case, we were 17 people let go that day, including 8 developers.

A few minutes after I had the Zoom call with the CEO, my access to all company resources was cut off. Apart from not being able to finish what I was working on (I had several unpushed changes), it becomes harder to say goodbye to everybody. Many of my colleagues reached out on LinkedIn, which was great. Some even set up Zoom calls so we could talk about what had happened, and say a proper goodbye, which I really appreciated.

Being let go was a new experience for me. The closest I have been in the past is during the dot com bust, when the project I was working on at Ericsson was cut. They were not yet laying people off (that came a bit later), so we were offered other roles within Ericsson. But I decided to change to another company instead (they reached out directly to me, since I had worked with of them at Ericsson). All the other times I have changed jobs, it’s been on my own initiative, while still being employed. I typically stayed on for three months (the standard notice period in Sweden), finishing up what I was working on, before starting at the new company.

The upside of being cut off immediately is that I could immediately spend all of my time looking for a new job, while still getting paid for some time. Even though I was surprised that I was let go, I didn’t panic. My philosophy has always been that I should be prepared to find a new job at any time, since you never know what will happen. So I keep a list of companies that I would like to work at. I also stay friendly with recruiters that contact me, in case I need to get back to them.

Finding Roles

I started looking for another job immediately. The best source for this was LinkedIn, but I found some jobs through other means.

LinkedIn

Open to work. The first thing I did was to change my LinkedIn “open to work” status to “Immediately, I’m actively applying” (from “Flexible, I am casually looking”, which I normally use). I kept the visibility to recruiters only, not all LinkedIn members (which would set the green #OpenToWork photo frame). I have seen arguments for and against using #OpenToWork – it lets more people know you are looking, versus it makes you look desperate. It is hard to know which is better, but I decided to only let recruiters know.

As soon as I changed this setting, I got contacted by maybe five recruiters per day for the first week or so. I suppose the LinkedIn algorithm alerts recruiters to people that have just changed their status. The quality of the roles was about the same as I normally get (albeit at a much higher rate) – some I really liked, some were OK, and some were definitely not for me.

Applying to known companies. Next, I went through my list of companies I would like to work for, and looked to see if they had any open developer roles. I first looked on the company page on LinkedIn, then clicked on the Jobs tab. Many of the companies were actively recruiting. A good thing when you click on an ad is that you can see how many people have applied, and how old the ad is. Sometimes I would also go to the company home page and look at their career page. But I found it convenient to go through LinkedIn, where the format is the same, and you can see if any of your contacts work there. Sometimes you can also see who has posted the ad.

Job ads. I also looked through job ads on LinkedIn. There is a search function, and I tried different searches, for example “Golang Stockholm”. It works well enough, and I would click on anything that looked interesting. LinkedIn also has a “Recommended for you”-section and “Jobs where you’d be a top applicant”-section (only if you have Premium), and I guess they use your skills and previous searches to populate these. These also showed a good selection of job ads.

There are however two problems. The first is that searching for fully remote jobs is unreliable. Sometimes it turns up good ads, but sometimes it turns up roles that are e.g. remote only in the UK. It would be good to be able to search for fully remote roles in Sweden, fully remote in EU, or fully remote worldwide.

The second problem is that it is not possible to get only the latest ads, for example ads that are less than a week old. So I ended up having to page through a lot of ads I had already seen. After I had found a new job, I saw a good solution for this in a tweet: use Google, set the time interval to last week, and search for e.g. “golang fully remote site:linkedin.com/jobs”.

Reaching out. I also reached out to around 15 recruiters that had contacted me on LinkedIn in the past, but nothing came out of that. I knew that the roles they contacted me for would not be open, but I thought that they might be recruiting for something similar. On a few occasions I sent a direct message (InMail) to managers that were recruiting (some encouraged you to do this in their bios), but I don’t think I got a single response. Perhaps I was not a good enough fit, but it was still disappointing.

Other Sources

In Sweden there is a site that is matching developers with employers called Demando. You fill out a profile, listing your skills, and giving a minimum salary you will accept. Companies advertise jobs there too, and you get a message if there is a match. I already had an inactive profile there that I activated, setting a relatively high minimum salary. I got contacted by one company there, which I later got an offer from. I also found a job ad there for a company I would like to work for. I did not find that ad on LinkedIn. I applied to them, and got an offer from them too. So pretty good payoff from using that site.

I also briefly looked at a site called RemoteOK, but didn’t find anything that I applied to there. My general sense was that the quality of job ads there was much lower than on LinkedIn. I also had a look at Efianancialcareers, but there are almost no fully remote roles there (and they are hard to search for). On the first of every month, there is Hacker News thread called Who’s hiring. I looked there briefly too, but I found it too hard to find something relevant there.

I later found another good way of finding companies to check to see if they have any open roles: google “competitor to” or “alternative to” and a company name, to find similar companies.

Applying and Tracking

All recruiters I was in contact with asked for my CV, even though it is mostly the same information that is already on my LinkedIn profile. It is almost as if it is a sign that you are serious. This is fine with me, since once I had an up-to-date CV, I just attached that one. When applying to companies directly, most companies ask for a CV (even when including your LinkedIn profile), and many also asked for a cover letter. I saved all the cover letters I wrote, and when I needed to write a new one, I copied the most similar previous one I had, and modified it to fit the new application.

Soon after I started to send out applications, I created an Excel sheet to keep track of my applications. I included company name, date the application was sent, recruiter or contact person, and a column for general notes. Looking at it now, it has 30 entries, but I didn’t send applications to all of them. In some cases, I added an entry after speaking to a recruiter, but then nothing came of it.

6 companies I applied to never responded at all. In some cases, the ad was more than a month old. But if the ad is no longer relevant, they should take it down instead of leaving it up and not responding. In some cases, I tried to contact the recruiter that had posted the ad, but I didn’t get a response that way either.

Ideally, all companies should respond. But I don’t mind too much if I don’t get a response if I haven’t been in contact with a person at the company. However, if I have had an interview with them, I think they should at least let you know if they are not interested. At one company, I had an initial interview with a recruiter at the company. She said she would set up an interview with a manager. Then crickets. I mailed her after two weeks, asking what was happening, but didn’t get a response. Two weeks later, I sent another mail saying I was no longer interested, and got an half-hearted apology back (but no reason for why she never got back to me). So this exchange now colors my view of that company.

Tools I Paid For

I have never had LinkedIn Premium before, but I decided this was a good time to try it, so I paid for a month. However, it was quite disappointing. Maybe I could see more profile viewers, I am not sure, but it is definitely not showing who all of them are. And even if it had been, it has limited value in a job search. I also got a number of InMails to send each month (maybe 5?). I sent a couple, but they were not very useful for me either. Then there was the “Jobs where you’d be a top applicant”, but that too wasn’t very useful for me. So I cancelled after one month. Before cancelling, I had the option of extending it for two months for the price of one.

I also paid for a GoLand license for two months (quite expensive), since I was looking for Go jobs and wanted to practice in an environment I am used to. I signed up for Github CoPilo t too, because I wanted to try it. It’s quite good, but I didn’t use it much, because I wanted to make sure I did all coding by myself at interviews. I already had a subscription to ChatGPT , and that came in very handy for many take-home assignments.

I signed up for Leetcode too, as I have done in the past when preparing for interviews. Mostly I like the paid version because you can get the editorial explanation for the solutions. I practiced a bit in Leetcode, so it was worth the expense. One company used an IQ test from Alva labs, so I paid for a practice course called Alva Logic Cram Course from 12minprep (there were lots of vendors, but this was relatively cheap). It was definitely worth it, I did much better on the test than I would have, had I not practiced beforehand.

Reflections

Times are definitely harder now compared to the previous decade. There were still many open positions to apply for, but it looked like there were many more applicants for each role than in the past. On LinkedIn, where you can see how many applicants there are, many job ads would have more than a hundred applicants. Further evidence of times being tougher is the number of companies that I never heard back from, even though I believe I would be great for the role.

There is also a big focus on having experience in a given language. In the past, I have started a job developing in Python without any Python experience. The same for Golang. It didn’t take me long to get productive in each language. Partly this is because many imperative languages are very similar. Of course, knowing the libraries and ecosystems is good, but in my experience not strictly necessary. But many recruiters now told me that it was a hard requirement from the hiring companies to have at least two or three years’ experience in the given language.

The Interview Process

For a typical job there were four or five interviews: an initial interview with a recruiter, an interview with a hiring manager, one or two technical interviews (either live coding, or going through a take-home assignment). There could also be an interview with a product manager, and/or one with a CTO or founder. All in all, quite a time commitment.

I was applying for both local and remote roles. For the remote ones, all interviews were naturally on Zoom/Meet/Teams. For local jobs in Stockholm, most companies wanted in-person interviews. This caused some problems, because it takes time to travel into the city. I could easily do many remote interviews in a day, but one in-person interview would take half a day with commuting. Mostly I managed to schedule in-person interviews on the same days, which helped. The advantage of the in-person interviews is that you get a better feel for the other person, and you can see what the office looks like.

Preparations

Since before, I had a Word document that I called Interview Tips. In it I wrote down things to think about before an interview, in a format that is easy to review quickly. One section I added now was Behavioral Questions. These are questions of the form “Tell me about a time when you disagreed with a coworker. How did you resolve it?”. Typically, you should answer them using the STAR framework: Situation, Task, Action, Result, Reflection. In the past, I have failed interviews because of these questions – I hadn’t prepared, and couldn’t come up with good examples on the spot in the interviews.

This time I went through a good list of such questions (Rock the Behavioral Interview) from Leetcode, and thought about examples to use. Once I had good examples, I wrote the question and my answer down in the document. Before an interview, I would review what I had written down, so I would be able to come up with good examples. This worked well, I didn’t fail any interviews because of behavioral questions.

In the document I also wrote down little snippets of code in both Python and Go. I tried to cover many common patterns and idioms. I did this so I could refresh my memory and quickly come up with the right syntax in a coding interview. I ran all the snippets first, to see that I hadn’t made any mistake, and included relevant output. Reviewing these snippets before an interview made me feel calmer and more prepared.

I also watched a good video by Gergely Orosz, Confessions from a Big Tech Hiring Manager: Tips for Software Engineering Interviews, on technical interviews in general. Some takeaways: be curious and collaborative, and ask questions.

Interviews

In all my initial interviews, I was open with the fact that I had been let go from my previous job due to cut backs. I didn’t seem like disclosing this was to my disadvantage. I was never nervous talking to recruiters or managers – I always knew what to say, since I had done it many times, both in the past and for this round of interviews. It is easy for me to articulate what I am looking for in a job, and what my strengths are, because it is very clear in my mind. I was also not nervous before non-coding technical interviews, since I feel I know most technologies I have worked with quite well.

However, I was nervous when I had coding interviews. I don’t exactly know why, but my brain seems to work at only 50% capacity every time I have to do live coding. So, it can be hard for me to come up with a solution, or remember some syntax, when trying to solve a problem. Luckily, all live coding interviews went well this time, but probably mostly because I had prepared a lot.

Of all non-coding interviews, I failed only one (I failed several coding and take-home assignments though). For the one I failed, I was asked what timeout I would set on a database connection. I was more thinking about how long an individual user could be prepared to wait for a page to render, so blurted out too high of a number. This was enough to fail an interview that otherwise went pretty well.

Coding Tests

Compared to when I last interviewed a few years ago, there were more take-home assignments this time. Take-home assignments are a lot less stressful than live coding, but they also take much more time. Regardless of what the companies claim, I would say each assignment took at least six hours. There is an unfortunate asymmetry here: it is easy for a company to demand that you do a take-home assignment early on in the process, with almost no cost in effort to them. For the job-seeker, it is at least six hours of work that may or may not pay off. Even so, I noticed that each time I got going with an assignment, I loved the programming – being immersed in a task, structuring the code well, finding good names etc. It was extra obvious because I wasn’t programming as much as when I had a developer job.

I did five take-home assignments, two in Java, two in Python, and one in Go. I failed one and a half. For the Go assignment, I wrote a working solution, but did not include tests. This wasn’t stated as a requirement, but I should have included some even so (when developing the solution, I used a more interactive approach, which meant running the code a lot as I developed). That assignment was also failed because I did not include caching to speed it up (to me it was not clear that it would be run more than once though).

The other assignment, I failed because of hidden test cases and sloppy coding from me. The task was really good – I was given test cases, but no implementation. I implemented enough of the system to pass all the existing test cases. My instinct told me that I should add more test cases on my own (that’s what I would have done if this was on the job). However, I thought that I had already spent a lot of time on it, so I didn’t. When we went through my solution in the interview afterwards, they had run some extra (hidden) test cases on my solution, and discovered two errors in my code. Both had to do with cases with empty input. I felt really stupid for not being more careful implementing the solution. In the end, I still got an offer from that company, and that’s why I am counting it as only half a failure.

For the take-home assignments, it was quite helpful to have access to ChatGPT. Getting a working framework up for what I wanted to do was a lot quicker that way.

Of the live coding assignments, I passed three and failed two. In the first one I failed, I had to write a limited chess program, that only supported two kinds of pieces. It needed a project structure, a data model, valid movements for the pieces, and tests. I started from nothing, and had to be send the solution in within two hours. It was very tight and stressful. I got most of it working, but not all functionality. I also had a bug in the movement code. That combination made it a fail.

The other live coding was less well prepared from the company. I downloaded a repo from Github with some initial code. But there were no working tests, and it took a while to set up an environment to work in. I also had to ask many questions on how the logic was supposed to work (with 50% of my brain capacity), and in the end I took too long. For all live coding tests, I used the IDE on my computer, and shared the screen over Zoom.

Salary

A couple of times in the beginning, I gave too high of a salary number, resulting in cancelled interviews. So I changed my tactics to instead tell them what my salary had been each year for the past four years, to give them a sense of what I was ideally looking at (I had had quite good salaries). Often, they would say “well, we can’t pay that”. To this I would respond that since I currently don’t have a job, I don’t really have a minimum acceptable salary, it will depend on what they (and others) can offer. This would often mean that we could continue the process. Sometimes it also meant that I had a chance to show what I had to offer, which might later translate to a better offer than they initially intended.

Once I had my first offer, it became easier. Surprisingly often when I asked the companies what the salary range for the role was, I would get an answer. This was really good, because I could say no to the ones that offered less than I was prepared to accept. In one case, it didn’t check what salary they were prepared to pay. I only found out when I got an offer from them (after a lot of interviews and a take-home assignment). I did this because I really liked the company, but their offer was very low. In hindsight, I should have checked upfront, instead of wasting a lot of time and effort on them.

Even before this job-hunting round, I had quite a good sense of what salaries companies in Stockholm pay developers. It got even better after talking to many companies. In Sweden, you think in terms of the monthly salary. You also have to consider if pension contributions are included or not (in most cases they are included, and can be an additional 10 to 15 percent, which is implicitly included). A very average developer salary would be 55K – 65K SEK per month. Almost all companies are prepared to pay that. Getting a salary of 80K a month and over is more difficult, but definitely not impossible, even in a tight market. In addition to salary, many companies can offer options or equity, and/or a bonus.

In the end, you also have to weigh other aspects of the job. How interesting is the product and company? What language will you work in? What will you learn? Who will your colleagues be?

Choosing

One company I interviewed with was very positive, and ended up asking for two references, which I provided. But the next day, they announced that they would go with another candidate. I was quite surprised, since I thought I would get an offer from them. It’s ok if they find somebody else, but I was upset that they wasted the time of two of my references. The recruiter later apologized and said that she was convinced they wanted to give me an offer, but the manager had picked somebody else. I don’t know what to think, but it was quite a disappointment.

Even if you fail to get offers at most companies you apply to, you only need to have one where you are successful. In a sense it is a numbers game – go through enough processes so that you get at least one offer.

In the end, I had three and a half offers to choose from (I didn’t formally get an offer from one of the companies, mostly because I knew it would pay less than two of the offers I already had, so I am only counting it as a half). I managed to get them more or less at the same time. I tried to slow some companies down, and speed other ones up, by delaying interviews, or being able to have interviews as soon as possible.

I was lucky to have more than one offer, because then I was in a much better negotiating position. The top two offers were both very good, and I could see my self taking either. In the end I got everything I was looking for – a very interesting job, and a good salary.

Lessons Learned

Stressful. Looking for a new job is a lot of work. It is hard to relax, even on weekends, because there is always some interview preparation you can do. It wasn’t until I had a firm job offer that I could enjoy my time off (I had a few weeks off before I started).

Takes time. I thought it would be quicker to find a new job. But there are four or five interviews to schedule, and often a take-home assignment to do. You also want to read up on the company and product. Then the companies usually can’t schedule the interviews as fast as you would like. Add that you will fail interviews, and the process can easily take months.

A numbers game. Even if you fail a lot of interviews, it only takes one company where you are successful for you to have a new job. So apply to many. I also realized that I am bad at judging if I did well or not. Almost every time I was rejected, I was surprised.

People to discuss with. I have two former colleagues, Patrik and Peter, that I discussed my jobhunting process with. These discussions were really useful. There are so many aspects to consider, and having somebody who understands to talk to helps immensely!

Responsive recruiters. Recruiters that consistently get back to you quickly are great! It is such a simple way to build confidence in the company they represent, yet so many recruiters really are bad at it.

Reach out. If a colleague of yours is let go, reach out to them (through LinkedIn or other means) to say goodbye. It meant a lot to me, and I think most people would appreciate it.

Conclusion

I am lucky. I love programming, and I have a lot of experience. Even in a tougher market it was comparatively easy for me. It still took a lot of work, but I ended up with a great new job as a senior developer at Swissblock. I hope my jobhunting experience can be helpful to other developers looking for their next jobs.

Top comments (0)