Over the last three months, I have had the wonderful opportunity to join FreeAgent’s Workflow team as an Engineering Intern. As the internship draws to an all-too-soon close, I’ll look back at some of the things I’ve been able to participate in this summer.
When I entered the office on the first Monday morning, I was introduced to the other members of Workflow, where we were promptly whisked off to a retrospective on the previous two-week sprint. Having never really been exposed to these before, it was all a little bit overwhelming. That said, it was incredibly useful to see how the review and planning process operated and, as the weeks went on, I was able to contribute more to these.
My first task was to look into sending emails whenever a user performed various security-related actions on their account, such as changing password or email address. This was my first dive into FreeAgent’s codebase, and so there were inevitably a few stumbling blocks, but people were always happy to explain things!
While developing these emails, I was also given my first proper exposure to the rest of the “process” outside of just writing code. Both in terms of how the spec developed as we explored how things should function in more detail, and how we ensured we shipped something of quality. While various contributions I’ve made elsewhere had exposed me to code review and quality assurance, it’s been really beneficial receiving much more through critique of my code. Over the time I’ve been here, I’ve also become more comfortable giving useful (I hope at least!) feedback on what other people have produced.
Over the internship, I’ve been able to work on all sorts of different parts of the app. An earlier project Struan1 and I tackled was updating our exchange rate importer to use the latest version of XE’s API. This was a relatively untouched2 part of the app, and so it was a fantastic opportunity to both update our XE integration, and rethink how the importer was designed.
One of the other projects I worked on was adding the ability to disable the notifications we send when an email bounces. This inevitably involved modifying the database’s schema, and so I was dunked into the ever-complex world of online migrations. As someone who’s never had to worry about uptime, it was an illuminating process.
I think one of my biggest takeaways this summer is being able to see all sorts of technologies being used in practice, rather than just in my own toy projects. I’d fiddled with Rails and React before starting the internship, but one’s small programs don’t really compare with a project with more than 10 years worth of work behind it. It’s always a little bit of a surprise when you can no longer hold the whole architecture within your head.
I’ve spent a little bit of time working on optimising a couple of bits of the app and, while I can’t say I’ve made much impact on those areas, it was a really enjoyable process trying to find various bottlenecks and reduce them. As part of that, it was interesting trying to find solutions to problems which were both somewhat elegant and efficient. I’ve definitely felt at times like I’m “fighting” ActiveRecord/ActiveModel, so there’s the fun challenge of balancing the dynamic between clean abstraction and performance.
Engaging with Engineering
One part of the week I’ve really enjoyed is the “Engineering Forum”. This is an opportunity for people to talk about projects they’ve been developing over the recent weeks and months, as well as discussing interesting bugs, or just showing off personal projects.
This is great, not only as a way for the various engineering teams to keep in contact, but also in allowing you to see technologies or domains one would otherwise not. I can’t say I’m an expert on data centre flips, but it was fascinating to see how a system could be architected to facilitate it.
Another thing I’ve really appreciated is how engineering is well connected with the rest of the company. Throughout the first few weeks Struan and I met with the head of each department, which meant we had a wider understanding of what the various teams did. Similarly, the weekly town hall was both a great way to know what other teams were up to, but also to see the problems that people outside of engineering were tackling.
One of the later projects I worked on with Struan was developing the spending categories insight and report. Not only was this an interesting engineering project, it required all sorts of coordination with other departments, from establishing what would be useful to accountants, to communicating the changes to our user base. It was a delight to be privy to this process and I must say a massive thank you to our product manager, Ruth, for wrangling everyone and keeping up the momentum as the project drew to a close.
All in all, it has been a real privilege to be part of FreeAgent these past few months, and I am insanely grateful to everyone both in Workflow and the wider company for helping me feel welcome and putting together a fantastic internship.
 The other engineering intern in workflow.
 XE’s API hadn’t really been changed since the library was first written, and so much of the code was 10 years old. It was actually really interesting going through the test data, and seeing currencies no longer in circulation.