Welcome to The Zebra! © 2021 John Apostol

There’s a non-trivial amount of preparation you made when hiring for your team. You had to anticipate the need, make the requisition, screen candidates, interview the best ones, and finally make the offers.

There’s a moment of triumph you feel after a candidate signs. Recline, spin in your chair, you’re done.

But you’re not. You’re forgetting something. You have the biggest opportunity you will ever have to set them up for success.

Employee experience begins with the application, continues through the interview, and then kicks up after accepting the position. …

Austin Central Library. © 2021 John Apostol

A while back, I had a personal website built to show the portfolio of projects I had completed up to that point. It was built on Rails, my technology of choice at the beginning of my software career. Many years later, I decided to rebuild my site as a blog to jumpstart my motivation and creativity.

Here’s how I built this site using modern technologies and sensibilities.

The Use Case

I love building things and writing. That said, I didn’t have an up-to-date place to put up anything. I figured that I should try to share my work and thoughts in a blog…

View from Hope Outdoor Gallery in Austin, TX.
View from Hope Outdoor Gallery in Austin, TX.
View from Hope Outdoor Gallery in Austin, TX. © 2020 John Apostol

This is for myself, to remember my feelings and learnings from this unique time.

A Realization

I had planned for 2020 to be the most important year in my career. This was the year to solidify my career goals concretely beyond “work with great people and make great things.”

I have a career in tech across corporations and startups of varying sizes. I know what kind of teams I want to work with and what kind of teams I want to avoid. For a while, these were the biggest career problems I faced. After a few proving years, having a well-paying job…

Computer screen with Chrome extension code.
Computer screen with Chrome extension code.
My baby Chrome extension.

Honestly, I thought that Chrome extensions were more effort than they were worth to develop. I thought my extension would have to be useful for other people on the Chrome Web Store. Here’s how I was wrong.

Skip to “Making the Extension” if you just want the goods.

The Use Case

I work at The Zebra. It’s a neat place with smart software engineers collaborating on interesting problems.

Any place that has software engineers has people griping and sniping about their tools. We’re craftspeople and take pride in our efficiency.

At The Zebra, we have an expectation that developers will squash their commits…

View of the Bernese Alps from Schilthorn. © 2019 John Apostol

This is a step-by-step guide to building your own serverless React app with the practicality afforded by Next.js and the Firebase ecosystem.

After reading about Next.js’s new serverless mode and attending ServerlessDays ATX, I got the itch to wire up a simple example for a Firebase-flavored serverless app.

Read before you proceed: Firebase bundles all of your functions together and doesn’t natively support per-function bundling. A sufficiently large app with many routes may run into scaling issues. See this comment.

I wrote this all before I found this out so I’m publishing this anyway. Proceed if you dare!

First, let’s…

Redux is a popular state management library for JavaScript apps that is routinely paired with frameworks like React or Angular. What follows is an explanation of how I’ve used Redux to make a production vanilla JS app more maintainable.

I’m hoping this is useful for anyone out there who is looking for a real-world Redux + vanilla JS example beyond a button incrementer or to-do app.


Let’s go back to late 2017/early 2018. The subject app is in production and has ~8 engineers actively developing. This ain’t your trendy universal React app. It’s purpose-built for managing content for our company.

It works, it’s reliable, it’s fast, and it feels great!

Writing software for people is satisfying! Each feature is an opportunity to create a well-measured solution to a problem. In modern software development, we aren’t just asked to solve these problems. We are also expected to delight our users.

Photo by Alistair MacRobert on Unsplash

I’ve found that when our job is to delight users, we can get lost in details. Mapping data from a database to UI elements on the screen is easier than ever. We’re tempted to rush through simple problems to spend extra time on more flashy interaction effects or ultra-efficient code.

Sometimes that results in unreliable code with a pretty veneer.


John Apostol (he/they)

Engineering Manager at The Zebra — johnapostol.com

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store