Talk done at Spotify for the whole CSAT Tribe.
The goal was to reflect "agile" beyond the current mainstream, too focused on Scrum and tools.
Some topics discussed: Lean, Kanban, eXtreme Programming, #NoEstimates, technical excellence (TDD, pair programming), trunk-based development, MVP, simplicity, etc.
CSAT Lunch & Learn, 15.11.2018
What is “agile”?
“The New New Product development game” (Hirokata Takeuchi, 1986)
OOPSLA 1995: presented by Jeff Sutherland and Ken Schwaber
The Scrum guide (November 2017):
● It’s a FRAMEWORK (not a methodology, not a method)
● Only mentions “software” as one of several contexts (“for
developing, delivering, and sustaining complex products”)
● Values, team, events, artifacts, DoD.
● Push system
Best book ever about Scrum: “The people’s Scrum”
eXtreme Programming (2000)
Agile manifesto (2001)
… and more...
● Crystal (Alistair Cockburn)
● FDD (Feature-Driven Development)
What is “agile” for me?
1. People first
a. Antimatter principle (Bob Marshall): “Attend to folk’s needs”
2. Risk management
a. “Inspect and adapt”... so fast as possible.
Spotify Engineering Culture
Spotify Engineering Culture (Henrik Kniberg 2014)
“However, a few years later, we found out that some of the standard
Scrum practices were actually getting on the way, so we decided
to make all this optional”
“Modern” agile real case
● 15 years old company (Telecommunications sector)
● Company with VERY positive EBITDA
● “Huge” codebase (33 µservices, 80 customers, ~2.500 containers in
● 25 people in the whole company
● Engineering team: 6-8 people
Mission, Vision, Values...
Values come first…
… then the principles…
… and THEN the practices
IO Vision 2018 (Operations Tribe): based in Google re:Work
● Core Values, Purpose, Vision, Strategy, Goals
● Avoid silos
● Avoid bottlenecks
● The product is a consequence of the team.
● The goal is not to create a product, but to create a team who can
handle the/any product
Communication is KEY
● Talks, workshops and sessions to improve our communication skills:
○ Non Violent Communication
● Feedback given every month (besides retrospectives):
○ everybody gives feedback to everybody in an open and transparent way
○ Simple Spreadsheet, matrix based on our values and other topics (e.g. business-
● Retrospectives: ~ 1 - 1.5 hours
● Investing in time for synchronizing and communicating is the
Pair/mob programming BY
TDD/BDD/ATDD for the win!!
● TDD/BDD by default.
● It's not (only) about testing, but about FOCUS and KISS.
● Simplicity, flow, quick feedback...
● Though not always was done. Some exceptions:
○ Legacy code where it was not so easy to understand things
Aiming for Technical excellence
● 4 rules of simple design (test, reveal intent, DRY, less is more)
● Clean code, refactoring, scout rule.
● SOLID principles, Object calisthenics, DRY, KISS, DAMP, etc.
● Design patterns
● Hexagonal/onion/clean architecture
● TDD/BDD (“Interaction-Driven Design”)
● Continuous learning culture:
○ talks, meetups, conferences, coding dojos, books, videos, etc.
○ 20% of our time (every Friday)
● DELIBERATE PRACTICE:
○ You won’t improve much as a SW Eng. just coding at work N hours/day
No need for on-call (seriously)
“One in remote, all in remote”
Your own space
● Whiteboards around
● Monitor with
● No need to worry about
bothering other squads
● One of our values as a team: taken VERY seriously
● Feedback: open, everybody to everybody
● No private conversations to “convince” someone or “win allies” for
● Or not so radical: not open salaries :-(
1. No Version Control System (VCs) at all: floppy disks.
a. Creating a branch was highly costly
a. Feature branching: https://martinfowler.com/bliki/FeatureBranch.html
i. Master, Develop, Feature, Release and Hotfix branches
Why do people do Pull
● For feeling safer
○ Peer review: Someone else can take a look to it and detect problems
● For rising the code quality (e.g. design solution)
● For sharing/spreading knowledge
● For getting the control:
○ "Safe" way to accept contributions from other people/teams
Problems with Pull Requests
● It completely breaks the flow
○ You are NOT doing Continuous Integration, let alone Continuous
○ You better wait for that PR to be merged before creating a new one… or fight with
● It’s too late:
○ Someone already worked several hours (days?) on it. Waste.
● You don’t have the context of the person for every decision made
● Review hundreds of lines and tenth of files… are you kidding?
● Merge race...
Trunk-based development for
● Pushing to Master. Yep. Mean it when saying “Continuous
● It's not about PR vs TBD...
● ...but about PR vs TDD + Pair programming + TBD
● If you don't trust your code enough… then you know where to focus
● Still branching:
○ Spike, too much uncertainty:
■ Done 3-4 times in 2 years
■ After the spike, start from scratch with the new knowledge in master
Some other important practices
(not only) for TBD
● Canary releases
○ First, deployed only to some representative environment
● Feature toggles (a.k.a “feature flags”)
● Parallel changes
○ Feature toggle
○ Branch by abstraction
○ Postel’s law: “Be conservative in what you do, be liberal in what you accept from
○ Strangler Application
○ Anti-Corruption Layer
When do pull requests make
● Distributed team with very different time zones
○ Not really possible to do pair programming
● For some exceptional reason, someone worked on their own
(though we usually made code reviews in local instead of PR)
● No QA, Architect, Technical Lead, Tech Owner nor any other
● Role !== Position
● The only “label” (not officially): one person more focused on product
● Engineering FLAT team: “specialized generalist”, T-shape
● No boss, no project manager, no Scrum Master, no Agile Coach…
Collective ownership of the
● Visualize EVERYTHING in a Trello board
○ E.g. also the action from the retros.
● Limit WIP
○ Little’s law
■ Throughput time = flow units in process x cycle time
■ Cycle time: average time between 2 slow units
● Avoid waste
● Lead time, Cycle time, Cumulative flow, throughput
○ Disclaimer: we didn’t measure it… we didn’t “need” it
● Flow efficiency vs Resource efficiency
● Pull, not push (Sprint)
● Man-days (sorry)
● Ideal man-days
● Ideal man-days weighted (technology, complexity, etc.)
● Story points
● T-shirt sizes
● Yesterday’s weather
● Monte Carlo simulation
● Throw dice
Alternative to estimates
Most of the time, estimations are not REALLY needed (usually because
someone else asks for it).
In 2 years, we “estimated”... 2, 3 times?
● Split in small chunks. Really small. What’s the most simple thing
that we can build next, so that we can learn and deliver some
● Talk a lot. Clarify very well expectations, uncertainties, etc.
● Prioritize continuously.
● Limit WIP
Some more things...
● Some tools like “Story mapping” can help
● If you really “need” to measure something… go Lean:
○ count “stories”
○ Cumulative flow
○ Lead time
○ Cycle time
● From both the business and technical point of view
● Evolutionary design.
○ Example with new product persistence: first InMemoryRepository, then File, then
○ A monolith is OK at the beginning… and probably for a (very) long time :-)
First, make it work
… then, make it right
… then, make it fast
… then, scale it
How to determine salaries
without a boss?
● No open salaries :-(
● Poker chips:
● Self setting salaries:
● No long term solution. Short term: formula for raising more those with lower
Things to be improved
● No Continuous Deployment, "only" Continuous Delivery
● Lost of service for 10 seconds in the website (no Blue-Green
● Not enough rotation in pairing
● Not all the company was “so agile”
● Missing architecture documentation
● Missing company-wide retrospectives
Main key points (I)
● KISS / MVP: think about the business/customer...
● Technical excellence AS IF YOU MEAN IT: e.g. TDD, SOLID, clean
● Pair/mob programming by default
● Trunk-based development by default
● Continuous Delivery/Deployment
Main key points (II)
● Investing lots of time communicating and synchronizing
○ No silos
○ It really pays off in the long term
● Radical transparency
● LONG TERM VISION: probably you need to slow down
temporarily… to keep a good long term sustainable pace
○ #NoEstimates (Allen Holub)
○ The State of NoEstimates (Woody Zuill)
● Trunk-based development
○ Escape merge hell: why I prefer TBD over feature branching and GitFlow
● The speed vs quality fallacy discussion
● 7 minutes, 26 seconds, and the Fundamental Theorem of Agile Software Development (JBrains)
Books for mastering your craft
Books for mastering your craft
Books for mastering your craft
Thanks for the feedback!!