Journeyman: Agical

Late to the party, I was completely oblivious to the notion of a community of developers, exchanging ideas and experiences freely and willingly. When I at long last discovered that there was in fact such a thing, I largely did so through the monthly events hosted by Agical. Throughout the years, Agical's office in Gamla stan proved to be a nexus of inspiration and creating connections. Therefore I jumped at the chance of getting to work with them for a week.

As luck would have it, I ended up working with Linus and Kristoffer on a Clojure project using Datomic. Kristoffer had been part of my old team at Mag+ so it was great working with him so soon again and Linus turned out to be every bit as pleasant to work with as I had imagined.

But I'm getting ahead of myself. Let's start at the beginning.

Enter Clojure

Earlier this year the Mag+ developer team had a book club, reading Brian Marick's excellent Functional Programming for the Object-Oriented Programmer. Since the exercise language is Clojure, this meant finally giving a Lisp language an honest chance. Once doing so, I had to admit that the language is pretty nifty. Working through the Clojure Koans with Kim, backed up by some brilliant Clojure screencasts was a lot of fun. However, I didn't do anything real with Clojure in the sense of building an actual application. I expected seeing a real world application written in Clojure to be enlightening. Datomic, the append-only database with a temporal twist, was equally enticing.

The project

The project itself, while mostly shrouded in the mists of an NDA had a number of interesting properties, both technical as well as organisational. At the heart of a yet to be launched peer-to-peer lending platform resides the Clojure and Datomic powered backend. The frontend was being developed by a third party and this posed the need for continous synchronisation. With hindsight comes clarity and I believe most, if not all of the involved parties would agree on this being the part of the project most susceptible to misunderstanding or miscommunication.

Just as many ways for information to fall between the cracks or get out of sync, there are as many ways to combat that happening. As it would turn out, I could distinctly identify a technique being applied each day during my stay.

Monday: visualise it

The first day began with turning the information firehose fully on, flooding my brain with the history of the project, the parties involved, the backend code, Clojure, Datomic, and more. Linus patiently explained. Kristoffer helpfully clarified. To their aid came a very helpful diagram, depicting the flow and possible state transitions. Now, spending time on constantly updating said diagram by hand would surely have been a waste of time, but in this case it was generated from meta data already in use by the DSL governing the various state transitions. This effectively rendered visualisation of the current state of the backend for free. With this overview, it was easy to see what requests and states were handled and which were not.

Linus also covering both sides of an A3 when explaining the system was certainly very helpful in grasping it.

Linus draws

Tuesday: a frank conversation

Having spent the first day at Agical's office, the next day saw us going to the customer's office to go through the current state of affairs and come to an understanding of what had to be done to get the entire system into a demonstrable state. We were joined by another "Agicalist", Ville, providing additional insights and suggestions as real options were discussed. A straight, honest talk can sort out a lot of issues. Have them often and liberally.

At the end of the day, I felt beat. Internalising a new problem domain, an unfamiliar code base, a mostly unfamiliar language, and the project history over two days was fun but quite taxing.

Wednesday: inclusive mob programming

If the previous day had given me the impression that Agical had found a good customer in Youple, the next day impressed me even more as Peter not only joined our mob, but actively participated in it, rotating in and out as a driver like anyone else of us. Since this was the first time during my stay that I too actively got into doing and not only attempting to understand, this day was very rewarding as I found myself considerably more in the know after it as well as energised rather than drained. I especially loved hearing Peter exclaim "we should have done this much earlier" as the value of mob programming dawned.

Mob programming

Thursday: everyone in the same room

My last day proved to be somewhat abridged as people were leaving early to prepare for the midsummer celebrations. Nevertheless, once more we worked from the clients office, kicking off the morning with a feasability discussion on actually getting the frontend and backend into shape enough to be demonstrable. This was enabled by finally having more or less all the key players from the various parties involved in the project in the same place, at the same time.

Following that, Linus and I worked for a few hours before departing. The following week would see much work to get things into shape before the summer and a project retrospective were I'd loved to have been a fly on a wall, but by then I would be in Gothenburg visting Elabs.

Final thoughts

As projects grow and additional parties join the fun, the need for communication grows exponentially. In the end it all boils down to building trust and committing to actively share information early and often. The pitfalls are plentiful. Under the best circumstances, with the best people at hand, lapses of communication are still legion.

Recovering from this is were a developer's mettle is truely tested and I'm glad to have seen it expertly demonstrated up close. What could have crippled lesser teams seems to have turned out as a mere bump on the road.

Many, many thanks Agical and Youple for having me, and all the best in launching the new service!