Of Poker, Microservices and Software Craftsmanship

Last week I was at Craft Conference in Budapest. I attended a one day workshop called Lean Poker. I’m really glad I attended the workshop. I learned a lot about many different aspects of software delivery and I will share my learnings with you here.
Continuous Delivery
ThoughtWorks, where I work, practice continuous delivery. This basically means you can push the code to production with every commit. In practice it means updating software as and when you need it and not having to wait.The benefits seem obvious but I can understand why developers and companies are reluctant to perform continuous delivery. Often time a mistake looks worse than a delayed delivery. Looking internally, you’re more likely to get fired if you deliver something that doesn’t work than if you are late and can blame a string of processes and developers down the chain. Looking externally, what does 5 mins of downtime matter to customers when your service is providing them with what they need now? Delivering before your competitors is equally advantageous (if not more so) than a sturdy service. As long as you can quickly deploy a fix (again, continuous delivery) you should be happy to go to production as often as possible. You have to ensure, however, that there is a warning system for when things break. Which brings me to my next point.
Watching Metrics
My team are the blue line above. We lost. One of the main reasons for this is we did not have someone early on watching the graphs and watching the games play out. We used Ruby whereas the other teams used strongly typed languages (C# and C++). What we did not realise is we were sending the wrong type to the API. It was not until we looked at the plays and started putting out logs that we realised this. It would also have helped if we went through the documentation. We were all developers and so we wanted to jump into the code base (which resulted in merge conflicts and delayed deploy as we were pushing faster than our logic dictated). Other teams split into a code pair and a business logic pair for the first iteration. This worked well. One thing I noted was one team had a quality analyst and his take home was not to concentrate so much on the quality of the code but more on the output of the code. How well was the bot doing? Especially since performance was related to the other bots. For a startup, you are in a competitor ecosystem. If you have tunnel vision on your own code/service, you will most likely miss a trick and this could be what sets you apart. That being said, the lesson for watching metrics brings me to my next hard lesson learned.
Team Communication and Cohesion
Very early on, it became apparent that team communication was the key. After the first iteration my team restructured our seating to work in a circle facing each other. We discussed very briefly what aspect we would be implementing and shouted out whenever we were going to push. For the first few iterations (starting to bet and implement some logic based on the card in your hand), the team which set a structure and communicated well had the upper-hand. It had very little to do with code or team knowledge. Having someone look into applying the logic, figuring out which baby steps to implement first, and ultimately guiding the programming team worked best in this scenario. That being said, it was important these people were able to understand the key is to getting functionality out the door asap and not to try to apply an advanced algorithm all at once, which brings me to my next lesson learned.
Not Overthinking
Looking at LeanPoker, one might think the smartest algorithm will win. This is not the case. My biggest take away was this, the simplest and quickest response to the game play is what will win. The dives my team and the C# team took were mostly owing to the introduction of bugs and failing code. Because of this, the battle for second place was between us. The winning team had no down time but also moved from implementing the pocket pair logic (very simply) to using an external resource for getting odds on the river much more quickly than anyone else. Their first implementation was basically a logic matrix translated into a giant if/elsif/else statement. But this got them what they needed such that they could move onto the logic on the river and watch the games to tweak betting strategies. This left the remaining teams fighting for second place where it came down to who was most aggressively betting on the pocket pair.
For me, this became a very interesting lesson in startup battles. It’s not just getting to market first but being able to constantly react to it. It also highlighted the importance of metrics and remediation time over test coverage. I learned a lot and would recommend everyone play Lean Poker.
Microservices
Craft Conference is a generalist conference and as such the talks could not be too specific. There was a very clear theme however and the was microservices. The interesting aspect was how this architectural technique is either a) changing development style and business structure or b) a result of changing development style and building structure. To tweet Josh Long from Pivotal Labs
“A microservice is a function of organisational agility” - @starbuxman #craftconf
— Girl Meets Code (@GirlMeetsCode)April 28, 2016
An insightful snippet from him is how one can make software robust not by reducing downtime but by reducing the time to start back up.
“Microservices architecture means that if you can reduce remediation time to zero you achieve 100% availability” - @starbuxman #craftconf
— Girl Meets Code (@GirlMeetsCode)April 28, 2016
This was enough to get me interested in microservices. My favourite part of the conference was Josh’s demo spinning up microservices using Java in the cloud.
However, Dan North wondered how far are we going to take microservices. Are we going to see a one character nanoservice? I’m interested in how the microservices ecosystem will develop as was noted at the conference:
“Tomorrow’s legacy code will be microservices ” #craftconf
— Girl Meets Code (@GirlMeetsCode)April 28, 2016
Craftsmanship
One thing that surprised me about Craft Conference was how much focus there was on human to human interaction rather than human to machine interaction. Software development, as a huge money making industry, is limited by the people more so than the programme. Software craftsmanship involves not just programming but understand people and business value.
This applies to every industry. And as Josh rightly said:
“Any industry plus software puts you in the software industry. Or at least, you will be beaten by better software” - @starbuxman #craftconf
— Girl Meets Code (@GirlMeetsCode)April 28, 2016
Dan North also shed a very interesting light on the value of code noting code is not an asset. Until it is deployed and being used by customers it is a liability.
Goals of software development = “sustainably minimise lead time to positive business impact” - @tastapod #craftconf
— Girl Meets Code (@GirlMeetsCode)April 29, 2016
Therefore,
“Kill code fearlessly” - @tastapod #craftconf 💀
— Girl Meets Code (@GirlMeetsCode)April 29, 2016
Another interesting point for me, someone just starting in development, is the importance of having devops skills. It is a big ask for long time developers but with the popularisation of microservices the label “full-stack” is not enough. A developer should be able to build a piece of software all the way to business value.
Charity Majors gave a very colourful talk on why developers need to know devops. Even if it is not their speciality they need to know what happens to their code once it is deployed.
“I want to know how you think about the consequences of your code after it has left your desktop” - @mipsytipsy on interview devs #craftconf
— Girl Meets Code (@GirlMeetsCode)April 29, 2016
Something that was of particular interest to me was when the speakers talked about building skills. How making sure your developers build devop skills is a skill in itself. How to manage an environment of experimentation and constant learning. Charity gave the harsh truth, most managers just expect people to overwork.
“Don’t tell people how awesome they are for burning themselves out” - @mipsytipsy #craftconf
— Girl Meets Code (@GirlMeetsCode)April 29, 2016
This gives rise to imposter syndrome, you can never be good enough. Yet by thinking you should be better and striving to get better, that’s what makes you a good programmer.
“A bad programmer is one that does not want to improve” - @emilybache #craftconf
— Girl Meets Code (@GirlMeetsCode)April 29, 2016
Diversity
It was clear the conference organisers cared about diversity. The numbers were announced at the start.
24% female speakers @CraftConf #CraftConf. Kicking off now. Head to @thoughtworks booth if you want #GoogleCardboard
— Girl Meets Code (@GirlMeetsCode)April 28, 2016
In attendance was a male colleague whose first tech conference was Craft Conference. He was shocked at how low the numbers were for attendance and yet Craft had made a huge effort. It highlighted to me how much the issue can be highlighted and yet the reality is not clear until you step outside your own small circle and look at the larger picture.
One thing I really liked, besides the amount of female speakers, was the fact that the keynote speaker was aware of the issue even in his talk.
Nice to hear keynote speaker @tastapod using female names to refer to developers in his example scenarios @CraftConf #craftconf #womenintech
— Girl Meets Code (@GirlMeetsCode)April 28, 2016

