Nothing strikes more anxiety and self-doubt than the dreaded job interview. The thought of participating in an activity designed for the sole purpose of evaluating your worth and the potential for rejection is enough to discourage many people from applying to jobs for which they lack all of the qualifications requested by the job posting. While qualification is important to accomplish the advertised job, it is not everything an employer looks for in a person they want to hire to be a part of the team, to grow with the company and help the company grow. The goal of this article is to provide a guide based on my personal experience for how to prepare for getting offers from jobs for which you don’t have all the qualifications.

Close The Expectation Gap

So you want to be a software engineer? What kind of software do you want to engineer? Building applications and consumer software products? Building big data crunching applications for marketers to design more personalized campaigns? Creating open source tools for programmers to be productive and automate away painful and repetitive tasks? Making enterprise applications for companies and government agencies using a repository of templates? Building new products for startups using the latest and greatest stack? Maintaining legacy systems and refactoring them to mitigate obsolescence?

If you don’t know what these mean and what kind of special skills you need to be qualified for these roles, then you have an expectation gap.

Expectation is a strong belief that something will happen. Not doing research to substantiate your belief with facts creates an expectation gap. Expectation gap is the difference between reality and fantasy. It leads people to pursue unrealistic goals instead of working on high-value-added goals.

I want to be a professional software engineer so that means understanding:

  1. What it’s like to live as a software engineer.
  2. What knowledge and skills are expected of a software engineers.
  3. What are the different career paths and specializations for software engineers.

The following resources helped me close my expectation gap and establish good goals to work towards:

Close The Skills Gap

There’s no shortcut. When you don’t meet the basic requirements for the job, you won’t get the job. In a market economy, money is exchanged for value created. If you lacked the basic requirements to meet the bare minimum expectations for the job, employers would not be willing to exchange money for your service.

You need to close the skills gap as much as possible for the profession that you are in or want to enter. Not meeting all the requirements for the job is not a deal breaker. When you are assessed as a highly talented employer and a great addition to the team who will be of tremendous value to the company once you are up-to-speed, employers are willing to make an investment in you. This means, they will pay you a salary for the first few weeks or months to learn what you need on the job so you can perform at the highest level. How much they are willing or able to pay you to close your skills gap depends on many variables such as the employer’s budget, other qualified candidates, and how quickly they need someone to fill a position. Getting an internship, formal education, entering a training program, or self-study are all methods for closing the skills gap.

The distinction between paying for a service now and making an investment is important. A good analogy is startup funding. Most of us are a fan of Shark Tank or know what Shark Tank is. When you are a startup founder pitching to investors, you are promising a huge payoff for investors in exchange for money upfront to get their product to market. But an investor is not going to hand out money based on a promise. They want to see your track record. They want an action plan (the business plan) for how you will to execute the necessary steps to turn the idea to a product that will sell. You get extra credit if you already have started working on the product on your own.

These are the principles that guided my preparation for closing the skills gap. I took the following actions to prepare myself for a career as a software engineer:

1. Identify Skills Gap

I reviewed job postings and researched trends to help me identify what I need to learn and work on. I read Medium articles and use Stackshare to explore the current trends in programming, libraries, and tools. I check in with my college friends who got jobs at companies and startups at Silicon Valley what they use at their jobs and what I need to work on in terms of building professional software engineering skills and experience. One friend gave me the advise that the ability to implement automated tests is a big thing employers look for because delivering code with no bugs is an integral part of a software engineering.

2. Develop a strong foundation in Computer Science

Having a strong foundation in computer science basics opens doors to opportunities like Facebook and Google who administer white board interviews to gauge your abilities in algorithms and data structure and fundamental problem solving skills.

I studied Electrical and Computer Engineering in college with an emphasis on software engineering. I’ve completed courses in many computer science fundamentals: principles of computing; principles of programming; data structure and algorithm; cryptography, computer security, and web security; mathematical proofs; web development, distributed systems, and machine learning. Yet, I understand the importance of continuing to review and practice these fundamental concepts and their applications. There are also things I did not learn, such as functional programming, which I studied on my own through:

Don’t think because you are not interviewing for a Haskell job, you don’t need to learn functional programming. Functional programming is a powerful problem solving framework. A friend of mine was asked at a JavaScript interview what a pure function is. As software is becoming increasingly complex, functional programming concepts and techniques have been integrated into the mainstream industry practices.

3. Develop Software Design Knowledge

Developing skills in software architecture and design means being effective at putting that fundamental knowledge into practice. I want to work as a web developer so I’ve been educating myself about design patterns in web development such as REST API, server rendering, client rendering, streaming, socket IO using the incredible amount of learning resources on the web.

If you don’t know what you need to know, get a textbook to learn web framework and web application design principles. I bought several books from Manning, which publishes a ton of programming books from people working in the field to provide the most up-to-date information and guides. The best books are those that best balances theory with practical knowledge and walks you through the process of actually building a website:

4. Learn To Work With The Latest Tools

When you learn the latest tools, you increase your opportunity of getting a job in the future. Newer tools are created to address shortcomings of older tools and are thus designed to supersede the older tools, making them obsolete in the future. Making older tools your learning objective also puts you at a disadvantage of acquiring an obsolete skills or soon-to-be obsolete skill where competition is more fierce for fewer and fewer jobs. Further, Getting experience with a new tool puts you at a more even playing field with the software engineers with more years of experience than you because you are all learning the new tool at around the same time. Lastly, new tools are generally easier to work with than old tools because they are designed to be more powerful and user (programmer) friendly than the older tools.

The best way to learn a new tool is to start with the official documentation. Facebook maintains the gold standard for documentation for React. It includes quick setup, examples, tutorials, gotchas, etc. React also has a vibrant community contributing companion tools like React Router and Redux, tutorials, sample projects, FAQs on Stackoverflow, and issue support on Github.

Programming language

A programming language is a tool also. It provides an interface for programmers to solve problems. It confuses me why anyone would get religious about a programming language and will want to use it for everything. While many languages are designed to be a general purpose language or for a specific purpose (e.g., JavaScript was made to only run in the browser initially) but they have evolved to fit specific niches and are all tools to add to a developer’s toolbox. there’s a time and a place for using each programming language. For instance:

  • JavaScript - Designed to only run in the browser. Now has evolved to build entire websites (thanks to Node.js), cross-platform mobile apps (React Native) and OS-agnostic desktop apps (Electron).
  • Python - Designed to be a general purpose scripting language. Used as a scripting language for processing data and automating tests and processes. Python tried to break into the web application space with Django but it can’t really compete with the versatility of JavaScript or the simplicity of Ruby.
  • Ruby - Designed to be a general purpose programming language aimed to maximize developer productivity. Ruby on Rails is a web app framework that you can use to very quickly build a web app for which performance is not a requirement. Ruby does not scale well (It’s very slow).
  • Java - Designed to be a general purpose programming language for building applications that can be run on any device that has the Java Virtual Machine installed. Back in the day, it was used by many enterprise systems, especially banking. It was once the language to build Android applications but that was replaced by Kotlin. With tools like React Native, I see little incentive to use Kotlin or Swift to write applications that can only run on one type of device.
  • Go - Designed to build concurrent applications. Being used to build concurrent applications. I’ve talked to a few startups who use Go to build their web app’s backend that requires speed and high performance.
  • C++ - Designed to be a system programming language. This means writing applications for embedded systems (microprocessors, game consoles) where there are not that much memory to be elegant but inefficient. System programming are defined by their main operating loops and low level logic (e.g., final state machines).

A consideration is Performance/Correctness vs rapid development. Languages like C, C++, and Java offer great performance but takes long to develop and compile time ramps up when your code grows. These languages often provide type safety features such as static type checking at compile time, which contributes to compile time. Type checking at compile time is a useful feature to prevent type errors (inconsistencies). Languages that support dynamic typing doesn’t help you catch type errors and let these type errors manifest in runtime errors, or worse, incorrect or inconsistent behavior during runtime, which would result in many hours of debugging.

Having to compile before you can run your code can really hurt rapid development. That’s why languages like Ruby and Python are popular with developers concerned with making something quick. But Ruby and python are notorious for being slow.

XKCD Compiling XKCD Compiling

Since the JavaScript is what I decided to use for building my web app and mobile app projects, I’ve a collection of JavaScript books that I always have handy for reference when I’m stuck on a problem or studying something in-depth:

  • JavaScript: The Good Parts by Douglas Crockford - covers Grammar, Object, functions, inheritance, arrays, regular expressions, methods, good parts and bad parts about JavaScript. Note, this book was published in 2008 before ES6 came out.
  • Learning JavaScript Design Patterns by Addy Osmani - Addy Osmani works at Google and wrote a few books. He’s also a progressive web app evangelist.
  • Programming JavaScript Applications by Eric Elliot - Eric Elliot publishes a lot of JavaScript articles on Medium about JavaScript. His writing is pretty opinionated and sometimes preachy but I can’t help agreeing with most of what he says.

5. Develop Your Practical Knowledge

The best way to develop your practical knowledge as a web developer is to be a web developer. When you are building real apps, you encounter questions like how do I create a web page that looks good on any device, how do I design my databases to get the least latency when fetching and writing to the database, how do I improve reusability of my code and make it easier to maintain and test, or how do I keep my code organized using a good folder structure.

For practical knowledge, my strategy is to start my own projects building websites. I started with vanilla HTML with a CSS framework like MaterializeCSS, then added a bit more complexity by turning it into a single page application with React and D3, followed by adding a backend with a JSON API to serve data to the single page application, and finally graduating to isomorphic web app with the capability of both server render and client render.

Along the way, I gained an understanding and an appreciation for the process of developing a web app, learned to be resourceful and efficient with doing research, leveraging Github, StackOverflow, documentations, other people’s blogs and open source sample projects. I find it much easier to google for answers and do research when you know the key words.

“Best Practice” books exists to help you develop your practical problem solving skills by introducing you to the industry lexicon and mental framework for being a professional software engineer or designer.

Unlike the programming books, which I always read on my laptop so I can try out the examples as I read, I read these best practice books on my smart phone while I’m riding the subway or on the elliptical at the gym. The best practice books are there to make you think, and inspire you to try something different.

Many Github repositories also exists dedicated to best practices, including

There are also articles, websites, and guides dedicated to best practices:

Acquire The Right Mental Framework for The Industry

While having a diversity of thought in a company is valuable in spurring an overall improvement in creativity and adaptability of the company, having people who don’t speak the same language and are not on the same page working together impedes productivity in the workplace. Thus, acquiring the mental framework and lexicon for the industry is essential for ensuring a “culture fit”.

These are some resources for acquiring the perspective and learning the thought processes that I find extremely useful:

  • High Scalability Articles to read for fun that teaches you how to think about difficult problems like the tradeoff between time and space, automation vs. “roll your own”, and optimization.
  • Algorithms to Live By The Computer Science of Human Decisions by Brian Christian and Tom Griffiths - Peter Norvig, the director of Research at Google, highly praised this book at Talks at Google for its value in teaching you about how to apply computational, mathematical, and statistical thinking in problem solving.
  • Coders At Work by Peter Seibel
  • 97 Things Every Programmer Should Know - Collective Wisdom from the Experts.
  • Experts Explain: What is DevOps - Even if you don’t want to be a DevOps person, you should learn DevOps. Some companies like Facebook does not have a DevOps department. Every engineer own his/her own piece of work from development until deployment.

I like to read these articles and books on my phone while riding the subway, exercising on the elliptical, or waiting in line for coffee.

Job Hunt

Getting Invited To Interviews

I don’t have a lot to say about how many resumes you should send out or how to meet people at networking events to connect you with people who will give you an interview.

I never sent out a single resume or applied to any job post. I let the recruiters come to me.

In my experience, if you focus on building your skills and marketing yourself on LinkedIn and your personal website/blog, and establishing an online presence through open source contributions and writing for programming publications on Medium, recruiter will come to you.

If you don’t put your work out there, no one will know what you are capable of. There are professional recruiters whose job is to look for qualified candidates for tech companies. Over the past few years, I’ve been putting more and more of my work on the internet and keep updating my LinkedIn and GitHub. I start seeing a rising trend of more recruiters coming to me about job opportunities from more well known companies. I had recruiters text me for a call that same day at 8PM for a software development job at Goldman Sachs. I had recruiters from LinkedIn and Facebook calling me to schedule interviews. I had a well funded startup founder asking me to join as an early employee to help build the React Native app that’s the core of their product. I had a CEO who sold his previous company for $600 million ask me to have coffee to talk about opportunities at his new startup. I recently signed up for AngelList, uploaded my resume, and got placed on the A-List, which fast-track your AngelList profile to hundreds of top startups. From AngelList’s FAQ:

What does it mean to be in the top 1%, and why was I chosen for A-List?

We built an algorithm that selects recently active candidates and gives them a score based on work experience, education, and skills. The A-List team then goes through the candidates with high scores and selects who to invite.

AngelList’s algorithm selected me for the A-List even though I never worked as a day getting paid as a programmer. That’s validation that I’m doing something right with respect to building up my work experience on my own!

Coding Interview Prep

  • Cracking the Coding Interview (CTCI) is a study guide written by the founder of CareerCups. The one advice I got from a friend of mine who recently got a job at Facebook is to practice whiteboard problems from this book.
  • The same friend who recommended CTCI also recommended to do a few “mock interviews” with companies that I don’t want to work for, as practice.
  • CareerCup has a bunch of coding questions.
  • CoderByte provides a collection of coding challenges in various languages.
  • The Algorithms Design Manual - The Facebook recruiter told me to do problems from there
  • Edabit contains a bunch of coding challenges.
  • leetcode is like a one-stop shop for preparing for interviews, including introduction to data structures and algorithms, problem sets problem sets to practice on, and mock interviews (premium)
  • Betterteam’s Interview Questions By Industry

My Journey

I wouldn’t be on the A-List and getting 2-3 emails a day inviting me to interviews in 2018 if I hadn’t taken the time and effort to steadily build up my skills and my body of work since 2014. You need to maintain relevant and up-to-date skills to be competitive in the labor market and you need to do everything you can to build up your portfolio with samples of your work, which are used to substantiates your knowledge and accomplishments listed on your resume. The resume get you an interview but you won’t get the job if you totally bomb your coding challenge interview because you don’t have the relevant knowledge and skills they need for the role they are hiring for.

I spent the past 5 years preparing myself for a job transition as a programmer. I worked on my own coding projects so I could get really good at coding, learn the latest and greatest stack and software design patterns, and build a brand for myself as a programmer. I build my brand by putting my work out there on Github, contributing to open source projects, contributing programming articles on Medium, and publishing programming articles on my personal website. This is not something you can do in a weekend. Since 2014, I’ve dedicated between 10 to 40 hours a week outside of my 9-5 day job coding, learning how to code, reading about programming, writing about programming, and talking to my friends about programming. I saved up my vacation time each year so I can take a two weeks off of work to dedicate to my coding projects. Preparing for a job transition is a full time job! Here’s more details on the highlights and milestones in my journey to transition my career:

2014

  • Graduated from university. Moved to a new city and started working at a 9-5 job where my day-to-day government job which involves no coding at all.
  • Met someone who wanted to make mobile apps for teaching and learning math to 3-8 year olds. Despite never having any experience building mobile apps before this, I built a few iOS apps using online tutorials and documentation, deployed them to the app store, and founded NumberShapes with that person.
  • Started working on a web app for NumberShapes using Angular.js (1) and Node.js.

2015

  • Started attending programming meetups on a regular basis. Talked to people and discovered what are the “hot” tools and frameworks to learn and get good at.
  • Started building a single page application for a startup idea I had (LooseLeaf) in plain HTML, CSS, React and D3, and Backbone. Addy Osmani’s Backbone Fundamentals and Scott Murray’s Interactive Data Visualization for the Web kickstarted my front-end web development journey.
  • Started learning Scala from Functional Programming in Scala and learning functional programming.

2016

  • Joined Medium.com, which allows anyone to publish articles under topics like programming, entrepreneurship, etc. Subscribed to a few topics related to programming and read articles everyday from Medium’s “Daily Digest” email. I’ve been using Medium to keep up-to-date on the latest trends. It’s a great resource for learning and finding inspiration to start working on your own projects.
  • Made the LooseLeaf single page application more sophisticated, with multiple React components, higher order components, and communicating with a server API. Backend was built in Scala and the Play framework.
  • Made the single page application Hosting any prototype or work-in-progress versions of the website on Github.
  • Completed all available courses on Coursera at the time for Scala. Documented my learning through creating and contributing to a learning repository - coursera-scala-specialization - on Github.

2017

  • Work on a side project to build a travel app in React Native while figuring out what to do next for LooseLeaf and how to develop a better business model. I chose this side project because I was making preparations fora trip to Japan and can use this app to facilitate my trip planning. Also, I wanted an opportunity to learn to use React Native to build an actual app and get more experience with JavaScript.
  • Ported the web app for LooseLeaf to my day job computer network (intranet) to be used as a productivity tool at work.
  • Made a “career change” at my day job. I asked and succeeded in convincing my boss at the time for a job transfer to a different department that deals with software product department because I was working at a basically mechanical engineering job which had little to no overlap with what I want to eventually do.
  • Created my personal website using the code I wrote for LooseLeaf’s single page application. Using Github for free hosting: http://xiaoyunyang.github.io/.

2018

  • Started the #100DaysOfCode challenge on January 1. Coded and committed to Github everyday for more than 100 days non-stop and counting. Started building the LooseLeaf app with full stack JavaScript.
  • Started Publishing programming articles via DailyJS and via HackerNoon. Added this under the extracurricular section of my resume under “Side Projects”.
  • Rebuilt my personal website in Hugo and started writing a lot of blog posts to build my personal brand, master the topics that I’m writing about and putting my work out there to let the world know who I am and what I’m capable of.

A Parting Thought

There’s certainly a lot of jobs being created in this booming industry and needing people with the right skills to work there. The number of coding bootcamps have grown 10x since the first bootcamps launched in 2012 and are turning people in their late 20s who have never coded in their lives into professional developers through their 14-week programs. This is both scary and amazing. The profound realization is that there’s a desperate need for developers with the right skills, experience, and intelligence to be a high contributor in an industry that is at the forefront of change demands people with the ability and passion for solving challenging problems, constantly learning new things, and adapting to changes.