Books
While there are many books to help prepare with software engineering interviews, there is 1 that is considered a must to have: Cracking the Coding Interview, by Gayle Laakmann (Amazon). This book doesn't just contains technical question but provides a holistic information on different aspects of the interview process. This also means that the information in the book is super condensed. My suggestion is that readers should go over both the technical and non-technical sections of the book multiple times to get a deeper understanding of the content in those sections.
Another good book covering technical questions is Elements of Programming Interview, by Adnan Aziz, Tsung-Hsien Lee and Amit Prakash (Amazon). This book covers only the technical sections of the interview, and so, is a good book to understand various data structures, algorithms and system design aspects. Like "Cracking the Coding Interview", I strongly suggest that someone preparing for the software engineer interview also completes this book.
The last book that I'd recommend is actually an online course. It's the course Grokking the system design interview on Educative. Software system design / architecture type questions are common on any non-entry level software engineer position and this couse provides a comprehensive details on how to approach and solve such questions.
Interview preparation websites
A simple google or bing search will reveal various websites that can be used to practice solving technical interview questions. Some of the common websites are: Leetcode, HackerRank, CodeWars. A search on queries like "websites like leetcode", "websites like hackerrank", etc. should identify other websites that can used to practice coding.
In addition to algorithm and data structure related topics, I also suggest that candidates should gain a working knowledge of Git. For someone not familiar with Git, Atlassian's page is a good place to proceed. A quick search should reveal multiple other sites / tutorials to learn about Git. In all, the git commands that you'll need to know of are git clone {repo}
, git checkout -b {new branch}
, git checkout {existing branch}
, git branch
, git branch {branch name}
, git branch -d {branch name}
, git push -u {remote repo} {remote branch name}
, git push
, git pull
, git merge {branch name}
, git rebase {branch name}
(related: try to understand what is a code resolve issue, why it happens and how to fix it). While there are many more commands in git, these commands should be able to take you through most of the development activities.
Another good skill to learn is to write tests using mock and spy objects. I would suggest that someone preparing for a software role should get comfortable writing tests in their coding language of choice (..don't have to become a master in writing tests, but at least know how to write tests). I don't know of any single website that can prepare someone in writing tests; However, searcing for online documentation and writing tests by referencing those documentations is a good way to gain practice in writing tests.
Related non-technical keywords
When preparing for a software engineering role, I'd strongly recommend understanding various non-technical and business related terms. Generally, people get exposure to such terms while working in a software role, so if you are new to the field, then it may be good to understand what these terms mean. Some keywords are: software development lifecycle (SDLC), scrum methodology, kanban board, waterfall methodology, product manager, project manager, test driven development, unit test, functional test, Git, Github flow and the terms "trunk", "branch" and "tag" in software development. I encourage the readers to do an online search and read up about these terms.
Networking
I like to think of networking as "human" equivalent of searching for some documentation on the internet. On internet, if you want to seach for some information, then you would probably use a search engine (like, Google or Bing) to find websites that contain the information you are looking for. Similarly, if you want to learn from someone's personal experience, or if you want to get information about a job opening that is not mentioned in the job posting, or if you want to know/learn about a team that has job openings, then you'd want to find a related search platform (like, LinkedIn) and search for other software engineers or recruiters who can provide you the necessary information.
- Few things I'd suggest when network with others:
- Most important: Don't be afraid to make a cold call, meaning, just send an invite to connect with them. You can always give reasons like you are connecting because you work in same area, or have similar interests, or just want to connect!
- Second most important: Be courteous! The other person is not obligated to answer to you. If they do.. good; And if they don't, then maybe send another reminder, but don't be rude, or feel that you are somehow betrayed or violated. They might not be in a physical/mental place to respond to you, or they may be overwhelmed, or maybe your emails are getting filtered out by automatic spam filtering, so the other person has actually never received your question.
- If you are reaching out to the other person with a question, then try to keep that question short and simple? Asking "how can I be a software engineer" is a short question but is not simple. Telling your entire life story, likes/dislikes and then asking what are your resume shortcomings that you can work on is simple question but not short. Try to ask something that you feel the other person would be able to answer in 1-2 minutes, or, I'd say, at most 5 minutes. You also don't want to start an epic back-and-forth of questions. Just think about how many questions you'd feel comfortable answering, or how long of an answer you'd feel comfortable writing if a college student reached out to and asked about transitioning from school to work life. Expect that the other person you're trying to connect to would have similar comfort levels towards answering your questions, if not less.
- Do some research (i.e., mostly online search, or getting information from your existing contacts) on your own side before reaching out to others for answers. Show to the other person that there's a problem you are trying to solve, and you have done your best to get the answer, and you are reaching out to get additional perspectives/insights to approaching the problem. Finally, when you get a response back, then follow up on it and perform additional research before reaching out again. You don't want the other person to feel as if they are being used as a tool and are there just to serve you relevant information on a plate!
Networking with recruiters
A common way to search for jobs is via online job websites like Indeed, Glassdoor, Google jobs, etc. Another way is to let recruiters know that you are looking for new opportunities, and go through posts from recruiters to identify is their company is hiring for some positions. An advantage of working with recruiter is that you can ask them questions about the team and company culture, and may even ask them for feedback on whether they feel that you resume matches the requirement for a job position. As mentioned above, do some background research on the company so that you are not asking for information that is otherwise easily available.
Networking with other software engineers
One way to learn about something is to do it on own and learn from the experience. Another good and faster way is to find someone else who has gone through the same experience and are willing to share their insights with you. Networking with other software engineers is a good way to learn from others' experience. You can also request for help in identifying what new skills you should learn, what career opportunities are available to you, and if they have any knowledge of open positions at their company.
Job search websites
- Some websites to search for jobs are as follows. Most, if not all, also allow searching for remote roles.
- Indeed. They also have a good career advice section.
- Jobs on Google search results page
- Glassdoor
- Kaggle hosts data science competitions. It is also used by recruiters to reach out to canidates who do good on those competitions!
- StackOverflow job board; This could be a good option if you are an active contributor on StackOverflow.
- Finally, do a Google or Bing search for "best job search website" and it will open up pages identifying any new websites through which you can apply for job.
Resume / Cover letter
The book, Cracking the Coding Interview, by Gayle Laakmann (Amazon) also contains information on how to structure resume. I strongly suggest software engineering applicants to go through the section about resume and to re-create the resume after applying the insights. Particularly, highlight your achievements in the resume using X-Y-Z format (Reference: Inc.com article). Considering that it has become a standard practice to pass resumes through automatic screeners, you may want to ensure that your resume can be parsed by machines. I would also suggest searching for online blogs on writing resume and incorporating insights from them. For example, this article on Glassdoor about writing resume. If you are in college, then I would highly suggest using the college / university's resources to help students with their resume. If that is not possible, then there are various resume review services that can be used. For example, this resume review service from Indeed.
When writing cover letter, the suggestion in the previous section can be reused, i.e., to search online for helpful tips while writing letters, and using university's resources to get feedback on the cover letter. In reality though, most places won't ask you for a cover letter as part of your application. If you do want to write cover letter, I'd suggest keeping it small (at most 1.5 pages) and keeping the focus on your past achievements that provide evidence on your ability to perform in the role for which you are applying. Rather than saying "I'm awesome because I did this.." or "It's my dream to pursue this field...", structure your cover letter to convey "I did something similar to what is asked in this role, and I was awesome in that, so I feel I'd be awesome in the role to which I'm applying to". In your past project, if you were the one who identified and/or implemented an impactful task, provided leadership / guidance / mentored other team mates, influence the business process and UI design, then you should also mention these details in the cover letter. For interns, I would suggest providing evidences of past activities or school projects to demonstrate that you will be successful in the role; And how you plan to use the skills in future. The goal is to show that you are not stranger to field, you are interested in the field and that the internship aligns with your career goals in immediate future.