Chapter 1: Useful resources

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.

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

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.