Chapter 2: Finding jobs to apply

Are you overreaching when applying to a position?

You started searching for software jobs. You went to one of the job search websites, put in some search keywords, and found a list of available jobs. You notice that of all the job requirements, you satify maybe 30%, for the other 30% you have an experience in the area but for the years that is mentioned in the job posting, and for the remaining 40% requirements, you don't have any expertise. You like the company, and would like to try out for the role, but are you being overambitious in applying for the role? Instead, should you just not apply! The answer, according to me: possibly you are being over-ambitious but that's not bad; And, you should apply for the role.

Generally a job posting gets made as follows: A manager in the some team within the company identifies if the team needs additional developers. This can either be to back-fill for developers who left the company, or moved to another team in the company. The manager gets in touch with the technical lead for the group to identify the list of required experiences that the team is looking for. There can be some miscommunication at this step. For example, let's say that the tech lead asked for someone good in webservices, say, Django. But the manager realizes that the team also uses CI/CD tools like Jenkins, and Github and AWS are also used by the team. So, they also add in the requirement that the candidate must be skilled in Jenkins, Github and AWS even though it may be the case that all the deployment pipelines are already made and a candidate will not directly work with Jenkins and AWS. For Github, even though it is needed, the tech lead thought that it is too easy to learn and it is not a blocker is the candidate doesn't know about it. But there's more before the job posting gets opened.

Realize that as part of the interview process, many applications will be received for a job opening. There will be candidates who will apply for multiple similar job positions at the same company. Some may be more experienced than needed, some may be less experienced (which is not bad, because they can still contribute to code development and gain experience along the way). Also, maybe the tech lead initially said that they want someone who can write code for webservices, but later they realized that they would prefer someone who can also write front-end code. Also, by going through the interview process with a candidate, the company would have spent a good amount of money in the process (paying recruiter, invite candidate for on-site visit, developers spending time to interview the candidate, during which time they could instead be writing code), and so if a candidate is good, then the company would want to hire them in a capacity that matches their skill level, otherwise, the money spent in the interview process is simply lost. All-in-all, this means that a good job posting in't one where all the requirements are identified and fixed. It's good to have more requirements than what's needed so that a candidate can be referred to suitable group in the company, and be hired at a certain level based on their experience and how they performed in the interview.

In conclusion, if you see a role for which you are meet 50% of the requirements, you should still apply to such roles. When you apply to such roles, two things can happen: Either you will still be interviewed, after which you'll be assigned a team and given a compensation matching your skill level that meets 50% of the requirements in the job posting; Or, your resume will not be considered, and you'll either get a canned response or no response, followed by a little hurt of self-pride. But you won't be asked to pay a penalty for sending a resume to a position that you are not qualified for, nor will you be publicly shamed. However, if you don't apply, then 100% of time, you will never get any interview calls. So, my suggestion is to still apply for such roles. Generally, the industry terminology goes as: Entry level (0-2 years experience); the next tier requires 3-6 years experience; the next is senior software engineer, requiring 7-10 years experience; then staff software engineer. If you are reading this article, chances are that you'd want to target from entry level up to senior software engineer position.

[UPDATE] I recently learnt that for positions in US where the employer is willing to sponsor a H1B work visa, the candidate MUST be meeting all the "necessary requirements" listed in the job description without any exception. So, if you are an international looking for a position where you want the employer to sponsor your work visa, then you will only be invited for roles that have a simpler "necessary requirements". This also means that the associated pay levels may not be as high. Still - remember 2 things: (i) It is better to apply and then get reject message than to pre-emptively not apply for the position, (ii) It is better to apply for a role even if it seems that the role may not be as high paying, compared to pre-emptively not applying for the position. This is because your compensation won't just be based on the job title alone and the company will (should..) also factor in your interview performance. You can always negotiate your compensation before you accept the offer. Also, after you join, you can work with your manager on improving / raising / leveling-up your job title and the associated pay level. However, if the company is not appraising your efforts, then use the extra experience under your belt to switch to a different company which is willing to compensate you better.

Trying a new position

Another criteria in identifying a new position to which you may apply to is to pick a role that you have almost no experience in! This is a risky strategy and so, it is best done at some point early in the career, or even better, use this strategy to move within the company to a new role. The reason behind this suggestion is that by trying out various roles, you get a chance to gain expertise in different inter-related areas related to software engineering. This is important because as you transition to a senior software engineer role in future, you can provide technical guidance to your team in these different areas. On the other hand, if you continue to stay in your area of expertise, then your learning curve will eventually flatten out and you will stop developing any new skills. Over time, this may cause your skillset to become outdated and this reduces your employability outside your existing role. Also, as you try out new areas, maybe you'll find a new favorite field within software engineering that you'd like to contribute to, or maybe you find new appreciation for your old field that was otherwise starting to feel mundane!

Consultancy positions

A software consultancy company is one that doesn't itself create a software product, but provides software developers to other companies, also called client companies, or simply clients. The primary reason for a client using a consultancy company is that sometime a client company may have more work than expected, but the work is temporary in nature. Hiring a full time worker for such temporary workfloads are not a financially optimal thing to do because after the project is over, then the worker will be without a project to work on. So, it is preferred to get developers from consultancy companies for the duration of the temporary project.

When looking for new software engineer position, it is suggested to also look at roles in consultancy companies. An advantage of such roles is that due to the nature of consultancy, one gets an opportunity to work in wide variety of temporary projects and in various companies. This helps one to gain a wide variety of experience that may not be possible in many of the full-time roles. Side-note: Realize that consultancy companies will most-likely ask you to sign a "non-compete" agreement when you join. This means that you may not be able to join a client company for whom you may have worked on a contract while you were employed by the consulting company. So, while you get the experience of working in different client companies, you may not be able to switch from the consulting company to working full time for the client company.

Note that there are also downsides to consultancy roles. Working in different projects means that the work stress is higher because you need to constantly learn new skills. In these roles, your employer is the consultancy company and not the client. Hence, due to presence of a "middle-man" between yourself (the software engineer) and the end client, your compensation is not as good as positions in non-contracting companies. A portion of the amount that the consultancy company charges to the client for your service is also used to maintain a sales team that finds new contract positions for the software engineers in the company. This is another reason why the consultancy companies provide a lower compensation. It may also happen that a new contract isn't available as soon as the existing contract finishes. This can cause one to be out of job (also called as being "benched") for a small duration of time. If you are in US, and working for a contracting company under a work visa, the company cannot just not pay you; And so, getting benched transforms into instead using up the vacation days ..except that you can't quite plan anything because it's not known how long you'll be benched for.

Despite all these disadvantages, there's one main advantage of working for a consultancy company in that may be very appealing to some! Since you are directly employed by the consulting company and not the end client, and you will be working with the end client as part of a contract, so the end client will not interview you as thoroughly as it would do a person looking for full-time employment. This difference in vetting standards by the end-client between a consultant vs a full time employee can allow one to transition from another field to software engineering and contribute to software projects as a consultant to the end client; And it would be have been a lot harder or even impossible to do so as a full time employee of the end client. So, if you are looking to change into software engineering, then starting with a consultant role may be a preferable route compared to joining as a full time employee.

Application management

As you work towards finding a new position, you will apply to many roles in different companies. The suggestion here is to create a directory in your computer/laptop where you store information about the different jobs that you have applied to. For example, you can download the html job description page and store a copy of it locally, you can also store the date when you first applied, if you applied directly through company pages or via another job search website, a copy of the resume and cover letter that you added in the application. As you receive email responses from the company/recruiter, you can store a copy of it in the same folder. Maybe also store the list of questions that you'd want to ask in your phone-screening interview or in the onsite interview. The main goal here is to have an organized list with details on your job search efforts. This becomes even more important if you are tweaking your resume and cover letter ever so slightly to match the requirements for each company, or if you just want to take a stock of how the job application process is going so far and identify any actionable insights that can be applied to future job searches.

Application timeline

How long does a software job application process take? The answer to this question depends on your level of preparation. Provided below are timelines associated with common steps inolved in job application process. Some steps can be done in parallel, like, preparing your resume, preparing a general list of questions to ask and sharpening your knowledge of data structures and algorithms. You can also skip certain steps, like, if you feel that your technical skills are top notch and you don't want to invest time in improving them. Note that the timeline for any of the preparation step can get longer or shorter depending on how much time and effort you can put into it. So, if you want to improve your understanding of data structures and algorithms, then doing so will take longer if you are also working on a full time job, compared to if you can dedicate entire day without any other engagements. Finally, also note that the duration between landing the first interview to getting first job offer is indeterminate and depends on the count of companies that invite you for interview and your performance in the interview. Bottom line: you'd want to start the job search process sufficiently early. It is very unlikely you'll get a good, new job in a few days or weeks!