The recipe behind high-performance software engineering teams.

November 04, 2020

In a previous article, I spoke about psychological safety and how important it is to remove fear from your organisation in order to enable high-performance engineering teams.

To support this idea and unlock the real potential, over the years I have found two main sets of instruments that need to be present in any organisation: a technical safety net and supportive cultural behaviours.

Implement your technical safety net

Human error will always be present, mistakes will always be made. However, these mistakes are not the cause, but rather the effect of a non-perfect system that allows them to happen in the first place.

In software engineering teams, it is very important to automate as much as possible to diminish the risk of human mistakes. Also, if you want your team to be creative and take controlled risks fast and with minimal cost, they need to be supported by a system that ensures they can't inflict severe and critical damage. Without a safety net below, a tightrope walker wouldn't ever be able to master his craft.

net

Some of the components you may want to consider as part of your team's safety net are:

  • Use multiple environments: your team will need controlled sandboxes to integrate, test and validate the software before the real show starts.
  • Automate testing: your team will feel a more solid and fast development experience when they're certain about their new changes not breaking anything.
  • Ensure standards: use some of the XP practices like code reviewpull requestsvalidation or pair programming to ensure quality and standardisation as well as spreading the knowledge across the members of the team.
  • Streamline your code production: automate your code integration and deployments with CI/CD practices: don't waste any time at packaging, validating, archiving and deploying your artefacts manually and let your team focus on delivering real business value instead (as well as avoiding human errors, especially under stressful situations).
  • Enable a way out: your team needs to have the ability to operate your software. This absolutely needs to include the possibility to roll back any changes quickly should they cause any problems once deployed.
  • Code comfortably: provide your team with a high-quality local environment, as similar to production as possible to avoid big discrepancies. Extra bonus if your team can work offline to avoid connectivity issues.
  • Automate delicate or repetitive things: try to avoid manual intervention on complex and repetitive tasks, and encourage your team to automate this instead by the use of scripts or any other software mechanisms. Again, it will lead to fewer errors and more consistent outputs.

Promote supportive cultural behaviours

As much as you want to automate everything and build a perfect system, there are some aspects that can only be implemented from a human, cultural and social perspective. Teams are people, and they also need to contribute to creating a safe context for rapid delivery.

Support

  • Set clear boundaries: if you want your team to perform to the highest level they will need to understand goals and expectations, but they also need clear boundaries in order to be really effective.
  • Manage risk: Try to encourage a risk management culture by talking about potential issues upfront, assessing them and working on mitigating them before they materialise into actual problems.
  • Simpler is safer: removing complexity is an excellent way to avoid mistakes. "Divide and conquer" to make things easier to reason about.
  • Enhance your communication: be healthily transparent and open the silos. The higher quality the info is, the better decisions can be made by your teams.
  • Learn from failure: Failures happen constantly since teams and businesses are in constant evolution. A mistake is an opportunity to learn about the existent system, review it and fix it. It's ok to make mistakes provided lessons are learnt.
  • Be critical: Do not take mistakes too personally, put your ego aside and try to be critical with everything around you. Solutions that were useful in the past don't guarantee future success, so challenging the status quo can be a very healthy exercise.
  • Continuous learning: Make sure you create the habit of constantly reviewing where you and your team are at. Run retrospectives often since the context is constantly changing: project scope, applied technologies, your team, business pace, complexity...
  • Focus on facts: Try to leave emotions out of the table when it comes to learning after mistakes have been made. Create a safe and healthy environment to ensure the highest quality of the information is provided. Otherwise, the fix for your system may not be as effective as it could.

In every team, there will be a set of "hard processes" or automation that could be implemented in order to avoid mistakes and ensure predictability as well as consistent outputs. However, these measures won't be ever as effective without a healthy set of behavioural principles to complement them.

Teams and businesses are very complex - mistakes are very hard to remove from the equation completely. So we just need to learn to manage them in the best possible way!