One Year of Shipping It: A Retrospective
In January of this year I started an experiment to ship one new thing every month for one year. As December comes to a close I would like to reflect on the past year to evaluate how the experiment went. Here is a breakdown of what I worked on this year & some quick thoughts about each project.
In January of this year I started an experiment to ship one new thing every month for one year. As December comes to a close, I would like to reflect on the past year to evaluate how the experiment went.
Here is a breakdown of what I worked on this year & some quick thoughts about each project.
One Blog Website
The first thing I shipped this year was this blog. It was a step towards doing more things in public & voicing my opinions on various topics. This year I published 10 articles with little consistency or predictability about when articles would be completed. Truthfully, I wasn't sure I would keep this blog longer than one year. I have enjoyed what little writing I did & it worked well as a source of pressure to keep me accountable to completing the year of shipping it.
Six Public Web Applications
APIs have always been my bread & butter. I know how to build them quickly & I have enough experience building them to know how they should be organized without giving it much thought. As a result, they were by far the type of project I focused on the most. I did, however, try to experiment with new approaches to API design & technology selection.
Here is a quick breakdown of each of the applications.
Random(ish) - Random(ish) is a free to use random data generating API. It is fully serverless, including the static documentation. Azure Functions hosts the API endpoints & serves up the documentation from a Blob Storage bucket.
Sessionify - Sessionify is a web app used to create custom schedules for conference attendees. I went to NDC Minnesota this year & was flabbergasted at how difficult it was to get a coherent schedule of the sessions I wanted to attend, their times, & where they were located.
Lyre - There are countless different music streaming services these days. My coworkers & I like to share music with each other, the problem is most of us use different streaming services. The Lyre API was the first step to making a centralized platform to share links to different songs & artists that would be streaming platform agnostic.
prot0[config] - After building numerous different projects, I began to realize how much of a pain managing configuration across each of them was. proto[config] is the API that now serves up the configuration data for all my other various applications. It is private for now, but I may explore making this a full SaaS product in the future.
proto[id] - While building proto[config] I wanted to use true JWT authentication for the API. proto[id] is the identity service used to maintain the users & API identities for proto[config] & any future APIs I develop.
prototypd.io - I toyed with the idea of consulting & on-site training as a side hustle. This is the landing page for that idea.
Two Enhancements to Existing Web Sites
After I had completed Sessionify, Azure provided an updated way to use SSL certificates for App Services by adding support for Let's Encrypt auto-renewing certificates. Previously, the easiest way to get an SSL cert for your site was to purchase one at a ridiculous price from Azure. Because of that, I opted to go without SSL at first.
Once I was able to use Let's Encrypt easily, I went back & updated Sessionify to use SSL certs.
Around the same time, I received my first month's bill for this blog. Due to a poor setup it ended up being ~$100, which wasn't super appealing. I decided to save some money & remove it from my own hosting infrastructure by using the SaaS offering from ghost.io. This gave me automatic SSL, automatic updates, & support for 1/3rd the cost.
One Online store
At the end of June, I was feeling really burnt out. I was running myself ragged on this experiment & my full-time work had picked up. As a result, I did not have any interest in looking at code when I wasn't being forced to. I explored different options for how to still produce something without it needing to be code based.
I had recently started purchasing the most recent set of Magic: The Gathering cards in high volume. Due to a shipping mistake, I ended up with double what I had initially ordered. So, I decided to look into TCG Player's seller program to sell some of the single cards of value I had obtained as a result. The store took around 1 hour to set up, including setting my inventory & I ended up making ~$500 across 2 weeks of selling cards.
One Personal Use Project Template
One of the biggest learnings from this year has been that most applications use the same code. Things like, configuration, user/account management, billing are the same across every application I built & there isn't really a great solution for managing all those concerns yet. I ended up needing to re-write the same code over & over again to accommodate these repeated needs.
That ended up being a huge roadblock for several projects. I simply did not want to start writing the same things that I had just done with slightly different branding. So, I wouldn't & my productivity suffered.
In December I decided enough was enough & created a Visual Studio solution template to solve this problem. It contains 3 projects:
- A Web Application project pre-loaded with my preferred user setup using the Microsoft Identity library.
- A data access project containing all the necessary user repositories & entity framework models for the user accounts.
- A SQL Server project that contains the schema needed for the Identity tables used by the application.
This template allows me to hit the ground running with new projects by already having a place to apply my bootswatch theme, a immediate way to deploy my DB without relying on Code First Migrations, & all the identity pages wired up to my own abstractions for user management.
It was suggested that I make this project template open source & put it out on Github. Because the setup is very opinionated to how I like things I haven't done that.
I have quite a few thoughts I am still digesting & will be posting my plan for 2020 once I have figured them all out.