The wait was over.
They’d spent a fortnight self-organising into teams or solo enterprises, selecting from suggested projects or inventing their own, and now our intrepid hackers descended on the breakout area for the kickoff of the inaugural Black Pepper Hackathon. While lunchtime pizza was scoffed, our compere Giles, generally deep in voice but today abyssal in timbre, stifled his cold manfully while enthusing the audience with the prospects for the afternoon.
The teams would work until close of play that day – or through the night, eagerness and/or youth depending – before demonstrating the fruit of their labours the following midday. Prizes would be awarded! It takes very little for any given activity at Black Pepper to turn into a competition; nevertheless, we appreciated the unambiguity: this was definitely a competition.
To start, a spokesperson for each team was invited to describe their project and what they hoped to achieve. First up, the Sensible Beasts, with the Book Me project. This was to be a conversational Slack bot you could talk to in order to find out which meeting rooms were available at a given time, and maybe even book them. The Team Yet To Be Named chose Bar Me, an app for recording a user’s alcohol consumption. Simon had promised that quality assurance would be conducted at the pub after work, and few were surprised to see that this team had picked up the most members.
John C. chose Register Me, a virtual visitors’ book for reception, allowing the sign-in and sign-out of guests. Fresh from his Clojure conference Paul had another take on Book Me. Matt, seemingly tired of the tone of motivating feedback from fitness apps, introduced his Berate-a-Tron 5000. This would seek to improve the effectiveness of such feedback by replacing condescension with outright aggression.
Ian proposed his Smart Dash, a study in using neural networks to offer users functionality at appropriate times depending on their past behaviour. And finally Dan H. outlined some continuing work he wanted to undertake on his Solve Me Android puzzle game.
I joined John on Register Me with J.P. also interested in working on the initial design aspects, the new team coagulating under the name Faulty Towers. At least half of the reference had gone over my head but, knowing that code by any other name would smell as sweet, and eager to crack on, we started sketching the UI out on the whiteboards. John’s initial plan had been to leverage the Axon Framework to build the server-side application, but given the time constraints we decided to simplify and settle on using an AWS Lambda back-end with an Angular 2 client. We had little to no experience with either.
The clock was ticking, so dosed up on pizza and laughably impotent chilli oil, Faulty Towers and our fellow hackonauts decamped with our laptops to our meeting rooms.
After extolling the benefits of REST then CQRS architectures to J.P. at a garbled cadence and from a height of several thousand feet, we decided we should implement the back-end of our application as a RESTful JSON service whose endpoints exposed CRUD operations on a single ‘Visitor’ entity. With the architecture decided, J.P. left us to find himself a new challenge, and John picked up the Angular 2 client while I started to look at AWS.
First of all I had to register on Amazon’s site, enter my credit card details and wait for an authenticating call back which notably did not happen. John suggested using a landline number instead of my mobile which was then called successfully. But once authenticated, still nothing quite seemed right. The Amazon web interface was peppered with scary-looking ‘OptInRequired’ error messages and seemed to be working only partially. I followed the tutorial for generating a Lambda Microservice, but it glossed over the configuration complexities that I was seeing on screen.
Meanwhile, John had scaffolded an entire Angular 2 app out of existence with angular-cli and had implemented most of the functionality: a grid of dummy data rendering nicely, with ‘sign-in’ / ‘sign-out’ buttons working as expected. Your narrator however was bogged down in a smorgasbord of errors, UI glitches and arcane AWS authentication concepts: IAM, policies, roles, groups, secret keys, access keys, API keys – after a couple of hours and much muttering I had to accept that 1) my AWS account hadn’t been fully set up yet, and 2) there was far too much here to learn about in the available time. So I abandoned it, and knocked up our REST service trivially in Spring Boot. As my inner eight-year old would say: BOOM.
Now I could join John on the client – not that there was much more to do. While John wired the client up to the server, I added Bootstrap 4 to prettify it all a bit. Things weren't looking half bad now on a tablet, so we started work on the ‘add visitor’ component.
But then… the dying hour of the day was spent trying to get the two Angular 2 components to talk to each other, looking everywhere for the $scope but coming up short, reading up on Observables… but all in vain.
It was however 6:10pm and time to go to the pub. I saw Ian on the way out, lamenting his lack of progress. Things were looking up.
The pub debrief was a welcome end to the day. Simon enthusiastically demonstrated The Team Yet To Be Named’s Bar Me app on his mobile. I could tell immediately that this could easily be a winner, so dutifully acted completely uninterested. But otherwise our small band of hackateers laughed and refuelled in readiness for the big show the next day.
Long since home, at about 11pm I powered up my laptop and had the epiphany needed to fix our final glitch.
It was a normal morning at school until the showcase. At midday the hacksters gathered once again in the breakout area, informed that voting for our favourite project would be delayed until the following day because Ian and Dan were out of the office – rumours of shenanigans spreading like wildfire. Nevertheless, with Giles maintaining a militant three-minute time allowance, the presentations began.
Sensible Beasts demonstrated their Book Me bot first. Ask it which meeting rooms were available and it would oblige by querying our Google Calendar. It also demonstrated that it understood other queries – like a request to book a room – but it couldn’t act on these yet. The natural-language-processing-as-a-service was carried out by api.ai, which looked very nice.
The Team Yet To Be Named were up next and their Bar Me was, as feared, pretty good. A native Android app allowed quickly selecting a beverage and the resulting potential liver damage was stored in Firebase. Meanwhile you could see graphs of your renal irresponsibility courtesy of a separate web app built with Angular 2.
John demoed Faulty Towers’ app on the tablet. You could see the list of anticipated visitors for that day and sign them in and out by pressing the buttons, and new visitors could be added to the visitors’ book by entering their name and company and hitting OK. Underwhelming in comparison, perhaps, but functional.
Paul’s Book Me didn’t get quite as far as the Beasts’, with his bot understanding the available rooms request but not able to query the Google Calendar; however, with his team one-third the size, and having written it in Clojure of all things, this still represented a worrying achievement.
And finally Matt presented his much anticipated Berate-a-Tron 5000. With Paul still logged into the laptop with Strava, accessing the Heroku-hosted app happily connected to his profile and presented a webpage mocking his previous exercise and even his extensive friend list.
But wait – a new entry had appeared on the whiteboard, the Cake-a-Tron 5001! Dark horse J.P., apologising for introducing the day’s third Slack bot, demonstrated his Raspberry Pi-based solution for informing the company of the important news of freshly brewed coffee pots. Hitting a button in the kitchen, simulated by running a Python script in his demo, would post endearing coffee-related GIFs to the appropriate Slack channel. Hit another button, and a creepy robot voice would encourage you to take a photo of a nearby cake with the attached camera for posting to the same channel.
The Showcase (Again)
The following day, Dan and Ian were invited to present their hacks to everyone straight after the company standup.
Dan was first with his Solve Me puzzle game – he’d only gone and made a whole, playable native Android game! On each level, the screen would briefly show all its obstacles, then hide them, leaving the player to navigate across the level trying not to hit them. All the while, ambient, hippy-shop music tinkles at you, the playback of which across the various screens had been Dan’s focus for the hack.
And finally Ian. As soon as he took the laptop to demonstrate Smart Dash, I realised that I had been lied to that first evening. His Angular 2 app allowed a user to perform actions in a given time slot, and by doing so it ‘learned’ whether to offer the user a shortcut to that action in that time slot in a subsequent day. It worked perfectly.
Worryingly clever stuff. But at least it was over. Upstairs for the voting!
- Sensible Beasts (Book Me) – 3 votes
- The Team Yet To Be Named (Bar Me) – 1 vote
- Faulty Towers (Register Me) – 1 vote
- Paul (Book Me) – 1 vote
- Matt (Berate-a-Tron 5000) – 3 votes
- Ian (Smart Dash) – 4 votes
- Dan (Solve Me) – 2 votes
- J.P. (Cake-a-Tron 5001) – 7 votes
As you can see, the Electoral College was swept by late entrant J.P. in a landslide. Honourable runner-up prizes were also awarded to Ian, Matt and the Beasts. Giles and Simon had further prizes to award: Giles's went to Dan for the uniqueness of his solution and the amount he achieved, while Simon's went to Faulty Towers for our “polished looking solution and pragmatic approach”. Hurrah! Amazon vouchers all round – and with literally days left to start thinking about Christmas shopping.
With a prize under our belt, I can drop the faux ultra-competitiveness and congratulate everyone involved on some awesome work.
The feedback from the lumberhacks involved was almost unanimously positive, with the participants generally agreeing that a good time was had, some decent stuff was produced, and that they’d each learned something worthwhile.
Personally, I was grateful for the exposure to some new technologies and the chance to try something a little bit different. Huge thanks are due to Giles and Simon for a really well organised event.
Roll on Hackathon 2017!