This was my first visit to QCon, unfortunately only managed to get to go for one day, but it was well worth it. Here are my quick notes from the talks I made it to.
Patrick Copeland – Innovation at Google – video
- Ideas on their own are pretty worthless
- You are better off making sure you have the relentless innovators who can turn ideas into something real
- Test your ideas as cheaply as you can to see if they will work in the real world
- Aim to fail fast, and try lots of things
- Use Pretotypes – low tech, cheap simple “pretend” mockups of ideas to see whether they make sense in practice – e.g. for phone apps sketches on paper is adequate
- If you go ahead to build a working prototype then get stats on returning visitors to measure if people will actually use it
- If users keep returning over a period of time then the idea is worth pursuing – if you get sustained growth then you might have a Facebook on your hands
Ulf Wiger – Testing for the Unexpected – slides
- Random testing is initially more effort than unit testing, but pays of in the long run as system complexity grows
- Various problems with traditional test methods:
- The spec can rarely be trusted as it is just someones idea of what correctness is
- It is hard to anticipate what the unexpected scenarios you need to test for are
- coverage is an unreliable metric, so you don’t get a sense of how good your testing is
- Random testing with a tool like QuickCheck flushes out gaps in spec and is great for finding issues with particular combinations of activity, or issues with certain inputs (e.g. negative numbers in factorial example)
- To use random testing you effectively needed to formalise your spec around expected inputs
- If you are testing bad inputs, then best practice is to send messages that are just a little bit bad
- Stateful components are much harder to test
- Have a good error handling strategy for your app, so you can effectively test it
- QuickCheck can help you home in on the precise combinations/inputs that cause errors
Jon Jagger – Deliberate Practice – slides
- Agile is about being able to change direction quickly – not just delivering quickly
- If you practice something you can already do you reduce effort, awareness and change
- Deliberate Practice is doing something you can’t quite do, which increases effort, awareness and change
- A Team is a group of people who learn together
- Designing Deliberate Practice:
- Addition – don’t try stopping bad habits it doesn’t work (Orange Penguins), you need to displace them by learning good habits
- Challenge – it has to be something you can’t quite do already – note this means it might not be fun
- Pair Practice – the extra discussion and feedback generated will magnify the value of the practice
- Coaching – a good coach should be able to break down learning into small manageable chunks
- Visibility
- Feedback – we are all bad at self-evaluation, so need others to feedback – but it isn’t actually feedback if nothing changes as a result
- Aim is not to complete the task, but to learn from it
- Books referenced in the talk:
Roy Osherove – Team Leadership in the Age of Agile – slides
- 3 stages of agile team maturity each with their own needs from a team lead
- Chaos – team always fire fighting, too much to do, no time to learn, constantly being pulled in different directions
- Main goal is to get out of survival mode
- Lead needs to take control – a bit of command and control wouldn’t hurt here
- Focus on shielding the team from management whims
- Get daily standups, build automation, code reviews, build by feature and pair programming in place
- Don’t worry about TDD yet, team has too much else to do
- Learning – team has capacity to learn (slack), but aren’t yet self organising
- Lead needs to go more into coaching mode here – don’t fix their problems for them
- Mantra for dealing with problems should be “What are you going to do about it?”
- Think about commitment language – be specific, make sure people commit to a precise thing, by a precise time
- Build culture of integrity – ream should notify if commitments won’t be met
- Useful influence model – need both motivation and ability at the personal, social and structural level
- Self Organising – team is fully self organising
- Influence team direction by changing constraints and goals, but in general get out of their way
- Books
Jurgen Appelo – Complexity vs Lean: The Big Showdown – slides
- Complexity Theory is a big messy area taking ideas from various field, including Systems Thinking, Chaos Theory, Game Theory and bunch of others
- Simple & Complicated refer to how easy it is to understand the structure of a system
- Ordered, Complex & Chaotic refer to how easy it is to predict a system
- Jurgen has identified 6 main areas for successfully managing teams in his Management 3.0 book
- Energize People
- Empower Teams
- Align Constraints
- Develop Competence
- Grow Structure
- Improve Everything
- Jurgen went through the 7 pillars of Lean and the 5 elements of Kanban. For each of them he showed that “it is probably a bit more complicated than that”. See his slides for details.
- In summary, while the Lean tools are useful, they don’t represent the entire picture, so don’t follow them blindly without thinking for yourself.
- Books
Jez Humble – Remediation patterns – how to achieve low risk releases – slides
- Tree main ways to reduce the risk and impact of bugs in production
- Prevention – don’t release buggy code
- Low Risk Releases – release patterns to enable fast rollback, or to minimise the impact of issues
- Incremental Delivery – by minimising the amount of change in each release you minimise the risk
- Basic assumption of talk – people are running unit tests and using continuous integration (i.e. no feature branches)
- Deployment Pipelines (Unit Test -> Acceptance Test -> Manual Testing -> Deploy)
- Don’t start one stage until release candidate has passed other stages
- If failures detected at any stage, then automated tests of previous stage not good enough
- Hard Stuff
- Production Like Environments
- Testing cross functional requirements (e.g. performance or security)
- Acceptance test maintainability
- Automate Deployment
- Ensure developers, testers and support/operations people talk about changes
- Canary Releases
- Release to a limited number of power users first
- Because previous version still supported rollback should be easy and almost automatic
- Bugs have reduced impact as not entire community
- Makes it easier to do A/B testing which is useful for checking things like performance
- Immune System
- Measure key metrics of new system (preferably with just Canary users)
- If any metrics get worse (e.g. performance, number of orders processed, revenue) then rollback
- For this to work you need good monitoring in place
- Use Feature Toggles/Branching by Abstraction to enable/disable features
- Need to test all the combinations of features you expect to support in production
- Could combine with random testing to turn different combinations of features on/off
- Makes rollback of just one feature easy
- Important to clean up and remove old unused code paths
- Be aware of impact on things like coverage reports after a code path becomes unused
- Dark Launching
- Hide a feature in a production system without exposing its UI
- Gradually expose more functionality (e.g. connectivity, sending messages) to test impact on system before eventually turning on UI
- To measure effectiveness of release process answer following 2 questions
- How long would it take to validate and release a one line change?
- If your data centre blew up how long would it take to redeploy?
- Books: