2019 in review

As software engineers, we're used to the process of retrospection at the end of a sprint of work, it helps keep ourselves honest with how we're performing as team and it acts as an opportunity to look back on what we're proud of achieving.

2019 has now drawn to a close, and here's a retrospective and roundup on the things I'm most proud of:

I hired my second front-end engineer

I was very fortunate to hire an excellent mid-weight front-end engineer to my team at the end of 2018. He started on the 2nd January 2018 and I could not be more impressed with how he's performed over the past year. Hiring is difficult, and it's amazing when the hard work pays off.

I became a React Native engineer

The company I work for have several products, one of which is a React Native project. As the product grew in popularity and the business signed more partnerships with some well known Premier League football clubs, it became clear that the business needed to focus all of it's efforts on this one product (rather than the three that were being worked on in parallel by a very small team). I offered to lend a hand as the most senior engineer on the team and joined the two React Native contractors working on the project, whilst overseeing the other two front-end engineers whilst they took ownership over the web projects.

Over the course of 8 months I dove in to the deep end of React Native and became a fully-autonomous React Native engineer whilst teaching the other two web engineers how to learn and become proficient in it.

I undertook a React Native upgrade

Those who have used React Native will fully appreciate how tedious it is to upgrade it. One of my first major projects as a newly-found React Native engineer was to upgrade the project a couple of major versions whilst maintaining functionality and quality. As a newcomer to React Native, it was pretty difficult but I got it done!

I learnt how to work full-stack using Serverless

So far in my software engineering career, I've mainly focussed on the front-end and whilst I have a basic understanding of how back-end works, I had never really taken the time to build anything significant with it. In 2019 I made a challenge to myself to build something fairly large as a full-stack product engineer which includes everything from the initial concept, design, back-end, dev-ops and front-end.

I build Internote from the ground-up using Typescript, AWS CDK, Lambda, S3, Cognito, Cloudwatch, DynamoDB, Next.js, React, Styled Components amongst other technologies. It was great to have full control over everything, giving me the flexibility to craft a codebase that is as elegant as the finished product! (you can tell I'm very proud of it!).

I built another state management library

I few years back I built Twine, a functional state management library focused on type-safety and ease-of-use. However, when I built it, I knew that I could have done a better job, but I couldn't figure out how.

I revisited this goal in 2019 and built Stately, a purely functional, type-safe state management library focused on simplicity and ease-of-use. I'm using it in a few side-projects and it's working really well.

I learnt how different the deployment process for native applications is

As a newly founded React Native engineer, I had to learn a completely new approach to application deployment, which is significantly different from the web. I had to take in to account breaking changes / backwards compatible API changes whilst working closely with my back-end colleagues to ensure that they fully understood how important it is!

I also had to learn how the Apple App store and Google Play stores work, along with code-signing, application bundles and React Native specific deployment practices work. I also implemented CodePush which helped us deliver features to our users much more quickly than was previously possible, which saved our skins more than I care to admit!

I helped define a product strategy for my company

Working alongside the product lead and CTO I helped define a robust product strategy that directly addressed clear retention and engagement problems our product is facing. We've chipped away at the roadmap over the past 6 months and have already orders of magnitude more engagement from our users than in the months prior.

I introduced my company to React Hooks

I was an early-adopter of React Hooks, and when they came out, I did what I was advised not to do and refactored a bunch of my side-projects to use them.

I was so impressed with how much simpler and more robust the codebase was that I prepared and presented a well-received internal talk to the engineering team and advised that we should start using them for new features as soon as possible.

Over the past 5-or-so months I onboarded all of the front-end developers to React Hooks and became a go-to resource for the team on the use and effectiveness them. We've used Hooks almost exclusively and the codebase is much more robust as a result.

I implemented i18n translations in to a native app

The two hardest parts of translating an application is process and regressions. In 2019 I implemented both the code and the process for translating our React Native application which consists of some pretty gnarly Typescript (which ensures that looking up a particular translation is completely type-safe) and some Google Sheets as well as a robust process for requesting and adding translations to the app as part of the standard feature development process.

I added exception tracking to a native app

An often overlooked aspect of a software engineers job is to ensure that exception tracking is both well implemented, robust and useful.

One of the first projects I undertook in 2019 was replacing the existing exception tracking tool (which was unfit for purpose) with Sentry, which captures both Native and JavasScript runtime errors, along with sourcemaps. I tied up the uploading of sourcemaps alongside the deployment pipeline of the application to ensure that the process for exception tracking is as hands-off as possible.

I made our Redux store completely type-safe

When using a type-safe language (like Typescript), one of the most important areas to make type-safe is state management. In 2019, I put forwards and implemented an architecture overhall to ensure that our Redux store is 100% type-safe by default.

As a result, our QA testing time reduced dramatically, our developer productivity increased due to increased intellisense and our bug count reduced.

I implemented (and re-implemented) search, filter and sort

One of the most important features in the application my company is working on is the effectiveness and ease-of-use of searching, filtering and sorting collections of items. I implemented a robust suite of custom React Hooks and components to make building, operating and using filters, search and sort in the application effortless and delightful.

I implemented a password-less experience

In one of my side-projects I wanted to do-away with password-based authentication, so I implemented a one-time-passcode / passwordless authentication experience using AWS Cognito, SES and Lambda.

Rounding up

So 2019 has drawn to a close. There are so many things I want to achieve in 2020, and I can't wait to continue learning, building, mentoring, designing and all the other things I enjoy so much.