Software engineers are familiar with the process of retrospection at the end of a sprint of work, it helps to keep ourselves honest with how we're performing 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 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 2019 and I could not be more impressed with how he's performed over the past year. Hiring is difficult, and it's amazing when you find someone who is truly excellent.
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 mentoring more junior engineers.
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 the applications functionality and high quality bar. As a newcomer to React Native, it was pretty difficult but I got it done!
So far in my software engineering career, I've focussed primarily on the front-end. Whilst I have a basic understanding of how back-end works, I had never taken the time to build anything significant "full stack". In 2019 I challenged myself to build something substantial as a full-stack product engineer including 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 few years back I built Twine, a functional state management library focused on type-safety and ease-of-use. After it was done, I knew that I could have done a better job, but at the time I could not 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.
As a newly founded React Native engineer, I had to learn a completely new approach to application deployment. iOS and Android is significantly different from web deployment. 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!
Working alongside our 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 seen a significant increase in engagement from our users.
I was an early-adopter of React Hooks, and when they came out I did what 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 my codebases were that I prepared and presented a well-received internal pitch 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 our front-end engineers to React Hooks and became a go-to resource for the team on the use and effectiveness them. We've now migrated the majority of our codebases to use React Hooks and the codebase is much more robust as a result.
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 consisted of some pretty gnarly Typescript (which ensures that looking up a particular translation is completely typesafe), some Google Sheets magic as well as a robust process for requesting and adding translations to the app as part of the standard feature development process.
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 built scripts to upload sourcemaps as part of the deployment pipeline of the application.
When using a type-safe language (like Typescript), one of the most important areas to make typesafe 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.
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.
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.
Here's to 2020 🍻