Hack Day round up
Roan Lavery
CEO, Co-founder
For a couple of days last week we downed tools on non-critical business activity for one of our regular Hack Day events. In the past, this has just involved the product team but this time the entire company got involved brainstorming ideas and turning them into a reality within 48 hours. The results were as varied as they were amazing, here are some highlights of what the teams produced, in their own words.
FeatureCreep
Olly, Derek, Thomas & Alberto
We receive a lot of features requests for FreeAgent, everything from small UI tweaks to monumental ideas. It's important that we track these internally so we can gauge what's popular and look at trends over time.
Up until now we've tried a few different methods for tracking these features, from bug tracking systems (too complex), Google Spreadsheets (too clunky) and old fashioned whiteboards. A whiteboard has worked well for us – it's quick and easy for the support team to add a new feature request, or quickly notch up the points next to an existing one. The trouble is, a chock-full whiteboard is really cumbersome, and you can't track trends since you don't know when votes were cast.
Since we love developing web apps, for Hack Days we thought we could write a simple web-based tool to solve all our problems. The requirements were simple: search and add features, vote on features, it has to be simple and it has to be fast.
So we made FeatureCreep.
We wanted to track who created and voted on the features, so the first thing we did was add Google Authentication. We use Google Apps at FreeAgent so we made the FeatureCreep account creation process almost invisible, and restricted access to the app to only FreeAgent staff.
To add or find an existing feature, just start typing. The existing features are automatically filtered as you type which helps prevent duplicate feature requests from being added. To vote, you just select the Vote button. We did all the filtering in the client side using Backbone.js, with a Rails 4 back-end and we tested it all using RSpec and Capybara. It's blazingly fast.
We now had an app that looked good and was really functional, but we wanted to go a step further. Wouldn't it be great to have a large screen in the office showing the top 10 feature requests which updated in real time as votes were cast and features were added?
We next created a ‘Kiosk' view for the app, to render the list without the header or voting buttons. We then used Web Sockets to enable push notifications between connected clients. Now, whenever someone adds a new feature or casts a vote, you'll see real-time notifications pop up on the screen. Cool, huh?
Project Dashboard
Robbie, Graeme, JB & Roan
Good communication with clients is vital for the smooth running of any project. FreeAgent is great for internal tracking of projects but we wanted to create something that was visible to clients too. Step forward the Project Dashboard, displaying important details of project progress such as time spent vs budget, invoices, task breakdown and expenses incurred.
It's easily shared via a secure URL, and we even included simple commenting functionality to allow discussion on the project.
While this seems like a relatively straightforward little project, we wanted to use it to prove a number of ideas that we had about how we can develop features in the future. The dashboard itself needs very little information in order to do its job, so while it was technically built as part of the FreeAgent application, we took care to allow it to be easily broken out and run as a completely separate system. Proving that this strategy worked opens the door to many new possibilities down the line, and contributed to the speed with which we were able to turn it around.
We're hopeful this might be available for all FreeAgent users in the not-too-distant future.
The Great British Freelancer
Danae, Rory, Tane, Adrian, David E & David G
We wanted to produce an end-of-year style report about the life of freelancing in 2013, using data mining from FreeAgent itself. We also wanted to do something that was a bit more fun, so we decided to make it a video.
Our big goal of the video was to not just talk about some stats surrounding freelancer's lives, but to frame it within the context that there are millions of freelancers in the UK, doing all sorts of different things. We decided to treat it like an old 1940's newsreel, with a big booming "you are important!" message. The team members went off to source music, write the script, mine the data, develop the concept and then start to pull everything together. We recorded the audio the next morning, and finalised the visuals last.
We had to take a few shortcuts - for example, we couldn't find royalty-free music so just subbed something in from a movie soundtrack. We also didn't have time to create the animations that we wanted, so we ended up doing still frames instead as a kind of storyboard – once we saw the final product, we think the animations might not even be necessary! Video projects can take forever if you let them, so embracing the hack day constraints was really brilliant for this video.
Go Faster Stripes
Harry, Paul & Donal
We wanted to speed up the FreeAgent test suite to reduce the pain of everyday life for engineers working on the app. We set out with a deliberately ambitious goal of halving the test suite run time and, while we did make improvements, we didn't quite achieve it.
The tests are generally run in two ways, either individually, when working on a specific part of the app, or as a whole, before deploying any changes. While the 50% improvement was aimed at the whole suite time we also wanted to improve individual test time as this run more often and sacrificing single test time to boost the performance of the suite as a whole wouldn't be a useful trade off.
We looked at several areas over the two day period but a few in particular paid off. Firstly getting the app working with Spring (a Rails preloader similar to Zeus) meant that running individual tests became much faster as waiting for Rails to load is a significant part of the test time when running single tests. Secondly we improved our own internal parallel test runner so tests were split more fairly between cores. In the past we'd noticed that the old implementation batched up all the tests at the start of the run meaning that some cores finished a long time before others did. Changing the way the tests were split up made it possible for all the cores to keep busy until the whole suite was completed.
We also looked into saving the state of the system (both the program state and the database state) after the tests were set up and before they were run so we could roll back to this state after each test rather than have to rerun the setup for the next test. This proved to be quite complicated and only worked for a limited number of tests so it was decided to leave this. The speed up just wasn't worth the additional complexity.
Stato
Murray, Anup & Nathan
Ever wished you had your own sentinel robot army? So did we but since we didn't want to start the new robot apocalypse just yet, we decided to build just one, Stato.
Basically we wanted to build a voice activated robot that could sit around the office and talk to our staff. I mean who needs real friends? We wanted to build a robot that could answer simple questions such as how many subscribers we had or answer how crazy he was feeling; these are obviously important questions. We also wanted the robot to react to changes in subscriber count and announce a new breakdown of subscriber partners for the current day.
Now that we've set your expectations high, let us tell you how Stato was born. Stato started life as a simple Raspberry Pi. He had good early life and grew up quickly; in fact within a couple of hours he had all of services he needed to say his first words. We managed to achieve this by writing provisioning tools using the magic of Puppet. Meaning our sentinel robot army can be automatically provisioned in the time it takes to make a cup of tea. Convenient!
Once we had provisioned Stato we then build a framework to allow him to respond to predefined commands and announce changes in stats. At his core he is built using some pretty nifty technology specifically Sphinx, Festival, Dino and of course Ruby. I've also heard that he has adamantium claws, but that might just be hearsay.
Everyone is excited about what we can do with him. We're like kids at Christmas. We are already keen to start using him for world domination and announcing the arrival of cake.
FreeAgent Connector
Ed & Ben
We built "FreeAgent Connector" - a Google Spreadsheet connected to FreeAgent. The spreadsheet gives users (and account managers) a simple but powerful way to analyse their FreeAgent data.
Since many users are already spreadsheet experts, they can use FreeAgent Connector to build custom reports, charts, and spreadsheets that go beyond those provided in the FreeAgent app.
Using FreeAgent Connector is easy:
- Make a personal copy of the spreadsheet
- Enter a secret code to give Google read-only access to a FreeAgent account
- Select "Refresh All" to import up-to-date FreeAgent data
Out of the box, FreeAgent Connector includes charts and reports on projected cashflow, profitability, debtor days, and more!
The spreadsheet and included Javascript code are all totally customisable, so users are free to add new reports and import additional data.
We found the Google Apps Javascript API to read and write to spreadsheets to be simple and powerful. Pulling data from FreeAgent was simple thanks to the FreeAgent API. The trickiest part was converting the structured JSON data returned from the API into flat rows suitable for a spreadsheet, but it became much simpler once we realised that our Google Apps Script could use 3rd party libraries like Underscore.js!
FreeAgent's Trial Balance API was our main resource, although it only contains year-to-date figures for each requested month. so we had to calculate the monthly deltas to be able to produce a monthly P&L view.
Google Charts - as embedded in these spreadsheets - is a pretty powerful charting toolkit and even more can be done programmatically to allow them to be configured dynamically.