Wednesday, 24 November 2021

Collaborating On Software: Optimising For Recovery

One of the mantras I like to follow when creating software systems is to "optimise for recovery" over "optimising against failures". This is embracing the fact that we're all human and thus mistakes will happen. In practice this means I focus on how quickly we can detect failures and repair them[0]Which is part of the reason I love TDD, the act of predicting and preventing failures BEFORE they even happen :D.

What I find novel is embracing this approach with how we work together. Accepting that we're not always perfect[1]Shocking, I know! and that we will make mistakes in how we communicate and collaborate.

Perhaps one of the most painful parts of this approach is dealing with the "production outage" level of mistake - a breakdown in trust.

Trust is tantamount in any relationship. In working relationships, I really like the definition of trust from Agile Conversations: 

1) I have expectations about what you will do that have been met before
2) I believe you will meet those expectations again, when we collaborate again in future

This is touched upon in Jeffrey and Squirrel’s podcast on Choosing Grief Over Guilt. It's unpleasant to experience behaviour contrary to my expectations, it is a violation of trust. It's not something to just skip over. The associated negative emotions won’t simply go away, or in the very least they won’t for me! Squirrel makes an excellent point: I can’t be curious[2]If I'm not in the mindset to be curious then my ability to effectively communicate is greatly inhibited.

If I was to try to power through this then it would probably lead to poor communication.

Poor communicate will probably lead to poor collaboration... and thus the spiral towards the Dark Side continues!
until I deal with my emotions.


When trust is broken, guilt is not the answer. Guilt isn't helpful and neither is ignoring emotions. To recover from a breakdown in trust, it is more effective to first drain off the sadness, the anger and the frustration. I find this helps me get into a mindset where I can cultivate curiosity and thus more effectively communicate/collaborate.

So when working with others, I will take up the mantra of optimising for recovery. When mistakes are made, we can deal with the emotions first, so that we can move forward to rebuilding trust. I predict that, just as with software, it will make our relationships more robust in the long term.

Wednesday, 17 November 2021

Guilt Free Refactoring - Not Just The Codebase!

Last Tuesday we hit a really important milestone internally and we unveiled the fruits of our labour. It was a pleasure to see the culmination of work I've been doing with my amazing team since June 2020!

Reflecting on the week since Tuesday, I'm anxious with how little coding I've done. We've got so much work to do and I feel ashamed I'm not demonstrably making progress toward it.

I've found the best weapon against my shame[0]Thank you to David Genn who introduced me to my "shadow side" being a cause of my shame - neat little snippet on it is within this post. has been to council myself as I would council my friends or my family. I'm kind to them and firmly root things in reality. With this in mind, I ask, if you haven't been coding then what have you been doing? Here's the list:

  • An emotional team retro involving a lot of shared vulnerability
  • Discussing the migration to centralised authentication/authorization
  • Catching up with one of our Product Directors on our shared vision
  • Jointly designing the evolving cross-company microservice architecture
  • Delving into the tradeoffs between Trunk Based Development & Feature Branching with one of the team leads
  • Testing new remote pair programming tools[1]Tuple seems amazing. Cloud9 is great if you're on AWS and only want the "hit and run" cost.
  • Organising sponsorship for the London Java Community Unconference
  • Canvasing the web for new hires to join us on our epic quest
  • Reviewing CVs and getting a feel for people brave enough to reach out to me!
  • Diving into the intricacies of one of our legacy systems
  • Facilitating a cross-functional retrospective tackling resolving conflict, decision making and communication
  • Aligning product managers and technology teams on how we manage resource contention across products
  • Digging back into one of our data sources, which I haven't touched since May
  • As always, dealing with my anxiety!
Gee whizz, sounds kind of ridiculous to be ashamed when it is all written out in black and white like that. Perhaps that is what is needed though, to simply face the reality and accept it as it is[2]“When you argue with reality, you always lose – but only 100% of the time” - The Work by Byron Katie.[2a]Thank you kindly to livingunbound.net for helping me track down the quote/source!
.

I've done very little feature development and delivered very little into production this week. The important thing to note is I've made a tradeoff, that I've focussed my effort on what is effectively "refactoring the organisation". I never feel guilty when I'm refactoring code as part of TDD. So it feels odd to me to feel guilty when refactoring processes/communication/architecture across the organisation.

Naturally there is a balance to be struck here, it would be quite unlikely that I would be productive from simply refactoring all the time! I do want to take the stigma away from it though. Refactoring is something I want that to be proud of, whether it is codebase or a company! 

Tuesday, 27 April 2021

Skimmer's Guide - Don't Make Me Think (2nd Edition - Steve Krug)


WHAT STOOD OUT? 

Yes, it's a thin book (p. 6)
If something even LOOKS like it takes effort to use, it is less likely to be used. Steve has deliberately designed the book to be thin and thus appear to have "low opportunity cost". I find the meta beauty of this to be outstanding.

If something is hard to use, I just don't use it as much (p. 9) 
If a product is PAINFUL to use, I will actively seek to remove it from my life (glares at Windows and Internet Explorer).  

When you're creating a site, your job is to get rid of the question marks (p. 13) 
Don't make the user think! Bias your designs to making things obvious to the user. For instance, it should never be a question about whether something is clickable or not.

Conventions are useful, but boring to use! (p. 35) 
Web conventions are incredible useful, as they have well established patterns of usage. You don't have to train a user on how to use a navigation bar, it's standard now. On the other hand, conventions are terribly boring. It's hard to imagine your peers praising you for "great use of conventions".
The interesting piece of advice Steve offers out of this is: "Innovate when you know you have a better idea. Take advantage of conventions when you do not."

Omit needless words (p. 45)
A great quote from E. B. White, a rule in "The Elements of Style":

"Vigorous writing is concise. A sentence should contain no unnecessary words, a paragraph no unnecessary sentences, for the same reason that a drawing should have no unnecessary lines and a machine no unnecessary parts."

Get rid of "happy talk" on the site, anything that sounds like "blah blah blah". Same goes for instructions, make them unnecessary. Failing that, make them concise.

Some users search, some users browse (p. 56)
Steve likens searching a website with searching for an item in a store. Some shoppers will go direct to a person and ask for help, others will happily wonder around themselves. On websites, users may go direct to a search box or they may start browsing. It is important to cater for both styles.

Make sure that your search finds the right results and is effortless to use as well. Poor search capability leads to unsatisfied users, as per the story on page 69!

Show the navigation for all the potential levels before worrying about colours (p. 71)
Users usually end up spending as much time on lower-level pages as they do the top. This means that top-to-bottom navigation is important to work out from the beginning. To facilitate this, it's vital to have samples for each level of navigation. I liken this to seeing the forest through the trees, before you start arguing what colour the leaves should be :)

IF YOU READ NOTHING ELSE...

Don't make me think! (p. 11) 
Unsurprisingly the eponymous chapter of this book is a must read. Steve pleads with us that "if you have room in your head for only one usability rule, make this the one".
Someone who can barely work the Back button should look at your site and say "Oh, it's a ____".
This is further compounded by the later chapter where Steve implores us to make the choices on our website mindless.

We don't make optimal choices. We satisfice (p. 24)
A term coined by Herbert Simon, a portmanteau of satisfactory and sufficing. Steve points out that when we are faced with a problem, our normal behaviour is to pick the first reasonable solution for that problem. Users are unlikely to pour over your website to find the best option for what they want, they will most likely just pick "whatever looks good enough".

Keep the noise down to a dull roar (p. 38/39) 
A picture speaks volumes and the msnbc.com menu example is a great example of how simple black lines can ruin the user experience. When you're constantly fighting for the user's attention, you don't want a load of visual distractions to add unwanted noise.

Sunday, 15 September 2019

Obsessive Colouring Launch

My wonderfully talented wife has launched obsessivecolouring.co.uk - it's full of beautiful colouring pages which are designed to help calm the mind and relieve stress. I'm always in awe of her attention to detail and really happy to see her pursue her dreams :D


If you have a moment, please go check it out and let us know what you think!

Tuesday, 2 July 2019

Situation, Behaviour, Impact - SBI Feedback

Dan North gave a presentation at QCon on "Making a Sandwich: Effective Feedback Techniques" which you can watch here: https://www.infoq.com/presentations/feedback-models-techniques/

I found the parts around the "SBI model" (Situation, Behaviour, Impact) triggered me to reflect on how I give/seek feedback. In short, the model breaks down effective feedback into 3 steps:
  1. Situation - specify a real incident that happened, e.g. "when we talked with Alfred on Wednesday..."
  2. Behaviour - state a fact, e.g. "you spoke across me multiple times..."
  3. Impact - describe how it affected you, e.g. "I felt that I my opinions were being ignored"
For steps 1 and 2, the rule of thumb I follow is that I can only comment on "things that are observable on a video tape". So saying something like: "they don't respect my opinion" wouldn't count, but "when I described my strategy, they rolled their eyes" is valid.

Step 3 is what I find most interesting and uncomfortable. The model is pushing me to focus on how I was affected, which I feel is very self centred. This brings up an uncomfortable truth: when I am giving feedback I am an attempting to control the other person. For me it boils down to:
  • Positive feedback: "...and that helped me avoid some pain - keep it up"
  • Negative feedback: "...and that caused me some pain - please stop"
I feel I can give the most effective feedback when I have something to gain.  Flipping this around and looking at how I seek feedback, if I really want to improve myself then I should be finding those that have something to gain from my change in behaviour.

Curiously enough, this isn't always going to be my mentors, who I traditionally turn to for feedback. Taking the SBI model to heart, I can get effective feedback from people that I impact. If I'm not impacting the person I'm talking to, I'm unlikely to get effective feedback.

My conclusion of all of this is that I can get the most effective feedback from people that I impact the most: i.e. those that are highly dependent on me.

Time to start teaching my kids about SBI... "Last night you gave me a popsicle and read me a story, that made me feel like I love you 3000"

Thursday, 11 April 2019

A View On Redux (x-post from TIM Dev Blog)

tl;dr I like using Redux as it helps me keep state changes simple. There are problems to be aware of with Redux but overall my experience with it has been overwhelmingly positive. [This post was originally shared here]

The Benefits of Redux


What I like most about Redux is that I can use it to apply event sourcing to an entire React application's state.[0]This isn't unique to Redux at all. If you know of better alternatives, please let me know!

In this case, the events are actions and they are processed by reducers which update state. If all of the application's state is contained within Redux, then state can only change as a result of a reducer processing an action.

This is useful for me as I can think purely from the point of view of actions when I am thinking about state changes. I can reason about a series of actions and the resulting state. This reasoning transcribes neatly into test form, for example:
import myMathReducer from "./myMathReducer"
import {plus, times, minus} from "./myMathActions"

describe("my maths reducer", () => {
    it("performs basic arithmetic on my number", () => {
        const INITIAL_STATE = {myNumber: 5};
        const actions = [plus(1), times(2), minus(3)];
        const newState =
            actions.reduce(myMathReducer, INITIAL_STATE);

        expect(newState.myNumber).to.eql(9)
    });
});
I find this great because:
  • If the test makes sense to my pair[1]Does it makes sense to you? I'm hoping it is clear that we're asserting ((5 + 1) * 2) - 3 = 9, then I've gained confidence that I've got the state transitions clear in my head.
  • The test acts as documentation on what actions are available and how they change the state.
  • I've tested logic within my React app without having to go near mounting components and/or clicking buttons.

The Pitfalls of Redux


I've found Redux to be hard to use in anger at times. There are some nasty surprises which make for some very painful lessons.

The worst moment was bashing up against a bug for ages and finally finding out it was related to Redux blocking updates to components. This is when I learnt that the connect function has 3rd and 4th parameters you can pass to it. The fix was to mark my component as "impure"[2]The interesting implication here is that my code is not pious enough and the Redux Gods are smiting me for my heresy, via the 3rd parameter being passed to the connect function.

Luckily there aren't too many bumps along the road but they are quite noticeable. God forbid you ever accidentally give two actions the same type!

Redux is a big plus overall


I've found that, in the long term, using Redux has been massively helpful.

For me, the constraints imposed by Redux have helped me to keep things simple.[3]Lord knows I love the KISS principle

Redux changed the way I think and improved the way I write React apps. I recommend giving it a go yourself.

Thursday, 8 February 2018

Cognitive Distortions: XTC Meetup Agenda

A wise man once told me, XTC is group therapy for angry people to share their problems[1]Others may tell you that XTC is the Extreme Tuesday Club. It may have been founded around Extreme Programming but I've yet to have a session related to XP practices :P They definitely meetup every fortnight on Tuesday though :). With that in mind, I submitted a random candidate into the vote for the next session...

The results of the vote[2]The XP topic came second to bottom, further proof that XTC only liked XP before it was cool.

Turns out almost everyone wanted to talk about it! So on February 20th you can join us at The City Pride to talk about The 10 Cognitive Distortions. We will be reflecting on the thoughts that drive us and if they are potentially making you unhappy.

The focus should be on thoughts that reflect your opinion of yourself. Factual statements like "I don't know Scala" should be discarded. Thoughts like "I should be better at Scala" are the ones you want to go after, especially if they make you stressed or frustrated.

The rough agenda will be:
  1. Get into groups to collect together "Negative Thoughts"
  2. See what Cognitive Distortions match up
  3. Think about the positive and negative effects of the thoughts
  4. Now shake off the distortions and rewrite the thoughts, whilst preserving the positive effects!
Between now and the session, if you jot down any negative thoughts you have then it will give you better examples to work with. Look forward to seeing you all there![3]Free pizza and rants, what's not to love?

Thursday, 31 August 2017

Having Compassion - The Autobahn Metaphor

At the XTC meeting on Tuesday 23rd August I had the pleasure of meeting Sven! He shared with me a way of relating to other people’s world view and actions which centred around “how fast do you drive on the Autobahn?”.



The autobahn is the German motorway - famous for having no speed limit. 

On the Autobahn<link> there is no speed limit, a driver can as fast as they like. Say we are driving at 80mph, we could then say that we perceive:
  • 80mph is the CORRECT speed!
  • The drivers going 50mph are delaying me and it is a nuisance overtaking them.
  • The drivers going 180mph are dangerous and are risking crashing into me.

This leads to an interest situation where you can bisect the population of drivers as “agreeing” with your world view and those that are “detrimental” to you. Naturally this leads you somewhat into conflict… it would be GREAT if everyone just drove at YOUR speed right?!

How do we overcome this and actually relate to all the other drivers on the road then?

Monday, 7 August 2017

Developer Diary: Starting At TIM Group

Today was my first day working at TIM Group! I'm humbled to be working with so many enthusiastic and intelligent people. The culture and way of working at the company is a massive departure from what I am used to. Everyone in technology is responsible for themselves, trusted to get the work done and nurtured to improve. People understand the value of happiness and real work/life balance.

Even after a single day there I am seeing and feeling the difference. Little things like:

  1. We managed to break something as I was being onboarded. A colleague spotted this before us, fixed it and notified us. No fuss, no muss.
  2. For lunch we took 90 minutes and sang sea shanties, it was silly and glorious. It could have been embarrassing but it felt like a safe space :)
  3. Everyone, including the CEO, started walking out at 5.30pm
  4. For 7 years I've come home and gotten changed. There is relief when I can take off the suit. Today I walked in the door and I was already comfortable in my skin.
Exciting times :)

Friday, 23 June 2017

Parenting: Uncovering Unconcious Bias

One of the challenges of bringing up children[1] Up there with leaving the house & making sure they are alive at the end of every day is not passing on any biases or prejudices you have. On the face of things this would seem like an easy problem to solve, just don't discriminate and teach your children the values of equality. The problem arises when we actually stop and think about how we really perceive the world and the people around us. If we really get introspective then we can uncover personal bias that we don't even realise we have.

Let's look at an example. How many fathers out there think on public transport: "it's polite to give up your seat to a woman"? On the face of it you are doing a nice thing. However if you teach that to your son then you are teaching him to treat women differently. This isn't ideal when you want to foster the ideas of equality. In this case you may wish to opt for "it's polite to give up your seat to anyone less able to stand". Women are just as capable as men in standing up :)



Tackling unconscious bias is a tough problem for everyone to solve, you're dealing with how your brain is hardwired to think about things. Only by consciously making an effort to question yourself can you discover these "things that I didn't even know I believed in". Luckily (depending on how you look at it), as your child grows up they will inevitably develop a perfect mechanism to help you with this: The incessant stream of "Why? Why? Why?..."

Monday, 19 June 2017

Destiny 2 - Akimbo Sidearms?

Will Guardians Be Dual Wielding Sidearms?

We got the strongest hint at Akimbo weapons from the Bungie Podcast released 9th June 2017.

Here is a snippet from the podcast (starting from 35:22)
JON:
It's interesting because one of those hard questions we asked ourselves when we were putting this out there was like: "well there's sidearms... is there any reason to run sidearm, sidearm?"
That sounds really dumb. That sounds like a bad game *chuckles*

LUKE:
It's not. It's really fun! *more laughter*

JON:
And yeah! It's pretty cool.

LUKE:
And we won't... We won't talk about why...

What's interesting here is that:
  • Simply having two sidearms which you switch between is deemed dumb
  • There is some reason why that combination is really fun
  • This reason is being kept secret from us
So what is the big surprise in store for us? Well let's take a look at what Mark Noseworthy said on an interview on Gamertag Radio (starts 1:07:22):
MARK: The first two slots, Kinetic and Energy, they can have the same weapon types. So, you can have a Handcannon in your Kinetic slot, and then like a solar Handcannon, if you want to rock two Handcannon, in the second slot. The reason we've done this is because it gives players more choice, right, you can play the way you want to play, and really change things up. You know, we might even have some interesting interactions between weapons sometimes.
Put this all together and it strongly implies that something "outside of the norm" happens with certain weapon pairings. My best guess is Destiny 2 is going to introduce dual wielding! Sidearms are an excellent candidate for this but there are things to consider though...

Tuesday, 4 April 2017

Corda - First Impressions

Today I was lucky enough to attend my first day of training on Corda, an "an open-source distributed ledger platform designed to record, manage and automate legal agreements between businesses".

Roger Willis and Richard Green did a fantastic job and I walked away excited for the 2nd day of training tomorrow. Between then and now I've got a whole load of thoughts/questions on my mind...


Corda isn't a traditional blockchain

Corda doesn't have the concepts of blocks or mining that you will find in Bitcoin and Ethereum. Transactions are purely point-to-point and validated individually in Corda. This stands opposed to the others which group up transactions and calculates a hash for all of them together (turning them into a block).

Immutability

What is there to stop the transaction history being modified? Well transactions are digitally signed and assuming all parties keep their private key safe, no one can realistically change history. On top of this, the ledger isn't reliant on mining and is designed to be immutable. This means that the only change parties expect to see is on current state.

Data Privacy

Transactions aren't broadcast globally to the entire network and only sent on a need-to-know basis. This protects against data leakage as parties in the network don't have free access to monitor who everyone is interacting with. Keeping the data contained also limits the damage if your private key is somehow compromised because your encrypted data isn't freely available to a potential attacker.

Thursday, 20 October 2016

BattleStrats Vs Aksis - A Strategy Refined

Perfect Practice Makes Perfect
As per the BattleStrats mantra, we have been honing our Aksis Phase 2 strategy. Collectively we have now got a very firm grasp of the fight and we can knock the Normal mode fight in one go!

BattleStrats Aksis Phase 2 - Strategy Overview & Kill

The most important points to consider here are:
  • Jordy had NEVER even attempted this fight before
  • We made a handful of mistakes but still succeeded
  • Explaining the strategy and killing Aksis took us less than 20 minutes
Practice (or rather deliberate/perfect practice) has been the secret to our success. Let's look at how exactly we practiced...

Sunday, 16 October 2016

Aksis vs. BattleStrats - A Retrospective

Introduction
BattleStrats has conquered Aksis. He tested the abilities of each of our players and the effectiveness of our team's communication. We passed this test but there is still much to learn. Our three main areas of focus are:
  1. What did we do well?
  2. Where did we stumble?
  3. How can we improve for the future?

The Plus Points
The biggest takeaway is that the clan is improving. We managed to kill Aksis on our first try with 5 players in the team had never killed Aksis before!
BattleStrats Aksis Kill - Black Spindle FTW! 

The main takeaways from that final successful run are:
  • We communicated empowerment really well
  • Everyone had the right gear/abilities to take down Captains
  • We had consistent slams on Aksis (which maybe a function of us not being tired)
  • Team DPS was solid enough for us to clutch us through missing a damage phase
  • People stayed alive

Wednesday, 31 August 2016

Trimming Videos On YouTube

This is a really quick and simple method of cutting/cropping videos that you have uploaded to YouTube (from your PS4 or any source).

Trimming/Splitting Videos On YouTube - Uploaded From Your PS4  

I prefer editing videos this way rather than faffing around with other tools such as the SHAREfactory on PS4. By doing this directly you can always quickly share whole clips from your PS4 without getting completely dragged out of the game :)

Saturday, 16 July 2016

Pokemon Go APK Install Instructions

For all those that can't officially download and play Pokemon Go on their Android devices, here is a quick video tutorial on how to get it up and running.

Download & Setup Pokemon Go On Android  

I've been having a load of nostalgic fun with it and I was inspired to start recording videos for it. After some quick searching I managed to stumble upon this absolutely awesome screen capture application: Shou

The app is meant for live streaming as well but I find that it is a very easy to use to record your screen to your local SD card.

Tuesday, 22 March 2016

Flappy Whale v1.3.0 (Animated Whale)

It has taken us this long but our Flappy Whale is now actually flapping when you tap :D Play the game and check it out yourself by clicking on the show button below!


Flappy Whale! v1.3.0 - ewry games

We toyed between the idea of having the Whale constantly flapping or having it flap only when you tapped. In the end we liked having it flap whenever you tapped as it provided extra positive feedback to the player. Note the Whale will remain stationary as it plummets, reinforcing the need to tap/flap.

Animating the Whale and the glowing rocks has really given me a profound respect for the intricacies involved in animation. It's fun to see how a handful of static images can produce motion but incredibly painful to tweak all the timings to produce the perfect effect.

Thursday, 17 March 2016

Flappy Whale v1.2.0 (Pulsating Rocks! - ewry games)

We have decided to pivot and changed the flying obstacles to floating rocks :D. Try to enjoy the gentle pulsating glow of the rocks without crashing right into them! Click the show button below to launch the game.


Flappy Whale! v1.2.0 - ewry games

We're starting to wrap up the game now and there are only a few more visual items we need to tweak. Depending on feedback I may ramp up the difficulty for the Killer mode as well :P

Wednesday, 16 March 2016

Flappy Whale v1.1 - Animated Skyscrapers


We have just released a new alpha version which you can see a video of above. Alternatively give it a go and play it yourself here (https://goo.gl/eTFNZ7)!

Note that there are some visual artifacts and some bugs. Depending on how things go, we might start to port over to Unity very soon.

Tuesday, 8 March 2016

Flappy Whale v1.0.0 (ewry games)

 @RumziYousef and I are proud to present v1.0.0 of our very first game: Flappy Whale!


Flappy Whale! v1.0.0 - ewry games

Rumzi has been busy creating some awesome artwork to help put the finishing touches to our project. I've also added 3 difficulty modes to the game as well :D


  • Checkout the great new background and our floating skyscrapers.
  • Try out the Easy, Hard and Killer difficulty modes.
Hope you enjoy it!