How to get ready for this full-stack job

When we interview candidates, we are evaluating how well they will work here at Zanbato. Often, we are often looking for technical aptitude to show that they are capable of learning our stack. However, what’s even better is technical achievement to show that they have already done something similar. If you don’t have industry experience but have a background in Computer Science and can converse fluently in data structures and algorithms, my advice for how to get ready for this job is just one sentence.

As a side project, build and deploy a full-stack web application from scratch and maintain the codebase for at least 2 months after your first release.

If you can do that, then you can start with zero practical experience and will have learned the fundamentals of web development. You should have plenty to talk about during an interview and be ready to do full-stack web development as a day job.

Of course, that one sentence isn’t a useful guide without knowing what goes into a full-stack web application, so here are more detailed steps about how to do this.

Setup a personal website on a server (which will also be your development and production environment)

These days, you can develop an app on your personal computer and ship it on heroku with some configuration. Consider me old school, but I think it’s valuable to be fluent with configuring and creating an environment from scratch. Here’s what I would recommend:

  1. Buy a personal domain (e.g. YOURNAME.com) from a domain registrar
  2. Setup a Virtual Private Server (VPS) from linode or digitalocean running the latest version of Ubuntu
  3. Get your DNS records setup to link your domain to your server
  4. ssh into your server and setup a web server (e.g. apache or nginx)
  5. Build a real HTML landing page so that you see something when you navigate to http://yourname.com in your browser

Both linode and digitalocean have many great setup guides. However, all servers are configured differently, so choose a guide and riff off of that.

Throughout this project, you will do a lot of configuration. Most of it is “easy once you know how,” so you just need to get through it. It is often frustrating and generally less satisfying than writing code, but you will learn a lot from going through it.

At Zanbato, we mostly work on EC2 instances running Ubuntu and have our production environment in AWS as well. Although you can start with AWS, I recommend other services because you get more bang for your buck and don’t need most of the services anyways.

Use your VPS as your development environment, production environment, sandbox, and everything else.

Maintaining and configuring servers is a job all unto itself. As a full-stack engineer, you will do many little things that are each a job unto itself. However, it will suffice for you to know just enough UNIX to get things to work. Use the command line to move project files around and use a command line editor.

I personally am a vim evangelist. Check out my guide if you want more depth into it.

Come up with a project idea.

This is the least important step, but you need to start somewhere with a project. It can be a “bad” idea as long as it’s something that you will be remain interested in. Clone another web app or build something that you wanted to use yourself.

Setup a code repository and use its project tools to track everything you want to do

Here at Zanbato, we use git. A lot of people use git. We also use GitHub. A lot of people use GitHub (though you might also spring for GitLab). GitHub/GitLab are handy because they:

  1. host your repo remotely, so you won’t lose your code when you break your server
  2. host your code publicly, so others (e.g. recruiters and interviewers) can see exactly you have done
  3. provide issue tracking, so you can plan your features and track bugs. It’s a great stepping stone to the issue trackers used in industry

You can do tutorials, but I recommend learning git as you go. There are many git tricks, but it’s easier to start with a working understanding of git. You can always pick up tips along the way and learn how git works conceptually later.

Build a mockup of one page of your app using a HTML/CSS style guide.

Despite the multitude of libraries to ease web development, it still comes down to HTML and CSS to actually display content in a browser. Both are easy once you know how, and unless you really like tutorials, I would recommend that you just learn it as you go. To get going quickly and learn best practices, use a framework like Bootstrap to get the components that you need in-place. Google plenty along the way (and prefer MDN links over w3schools links), and you will be fine.

At Zanbato, we have our own style guide, and we compile LESS into CSS. We do write a lot of LESS/CSS, so you will eventually get familiar with the tricks with CSS as well.

Build the front-end for that one page with a reactive JavaScript framework.

Now we’re getting into real coding, so you will probably need to do a tutorial before jumping in with this.

Right now, the JavaScript ecosystem is in a really wacky spot with too many options and not enough consensus on what tools you should use and how it should work together. I recommend using either React/Redux or Angular 2. Both are great, popular frameworks for building out interactions and managing data in JavaScript. Do the tutorial, then get going on your own project with the starter projects, then reference the documentation.

For React, do the React tutorial and Redux tutorial, then start your own project with the React starter project. For Angular, do the Angular tutorial then use Angular CLI to setup your project.

At this point, you probably will have googled and been inundated with tutorials, boilerplates, and libraries. A lot of the content is fantastic, but I recommend that you prefer to figure things out on your own. We believe in learning by doing, and anyways, it will give you more to talk about during your interview.

At Zanbato, we use React written in ES6, bundled with webpack, and loaded into Django.

Build the back-end API for that one page with a framework of your choice.

This guide assumes that the architecture of your app is a single-page app that connects to a REST API server using AJAX requests. It’s a very common pattern today where you can navigate through an app without page reloads, and it will request data from the server as it needs it.

My recommendation would be one of Django/Django Rest Framework, Ruby on Rails, or Node.js/Express. Again, find a tutorial to get your feet wet first, then start working on your own thing.

At Zanbato, we use Django, which provides a tutorial as well.

One thing I will note is that authentication is very, very annoying to do, so don’t be alarmed if it’s really hard to figure out how to register users and get them signed in. I recommend that you find a library to do single sign-on (SSO) and use Google/Twitter/Facebook for authentication instead.

Build the rest of your app, then ship it.

Now that you have touched the full stack, you can build the rest of your web app. When you get to a minimum viable product (MVP), set it up on a domain (or a subdomain of YOURNAME.com) and run it live on the web so that anyone can check it out. Share it with your friends on Facebook: be proud because you built something.

Maintain your app.

After you ship, keep working on it for at least 2 months but preferably for as long as possible. Build new features. Fix bugs. Integrate new libraries. Refactor aggressively. Live in your code.

Frameworks today are very powerful, and you can easily bootstrap a web app just by following tutorials. However, the real lessons about software engineering come over time. You learn when you reach and have to grapple with the limitations of a framework. You learn when you see the shortcomings of your original schema and need to refactor your entire codebase around a data migration. These are the issues you want to think deeply about and can talk about in an interview.

Bonus: Write tests.

One blessing of being a software engineer is that you can use code to build tools to write better code. The result of that, however, is that you can go down an endless road of build tools, linters, plugins, and whatever else.

All of it is valuable, but amongst that, the one particularly valuable skill is writing tests for your code. Few personal projects have code, but every professional project should have tests, so it’s good to get into. Every framework and language has its testing framework, so use whatever is provided.

As a software engineer, you can use code to build tools to write better code. Unfortunately, you can also go down an endless road of build tools, linters, plugins, and whatever else.

One particularly valuable skill amongst those is writing tests. Few personal projects have code, but every professional project should have tests, so it’s good to get into. Every framework and language has its testing framework, so use whatever is provided to write unit tests for specific functions and integration tests for your entire app. Your users will appreciate the reliability.

Final Thoughts

I know all of that sounds like a lot of work, and that’s pretty much the point. As I see it, there are 3 parts to being ready for a full-stack job:

  1. Computer Science fundamentals, which you can learn in school
  2. Web development technology, which you can pick up in a week
  3. Software engineering wisdom, which you only learn through experience by living in a codebase for as long as possible

If you have the first two and have a headstart on 3, you pretty much have done this job, which should put you well on your way to getting and starting this job!