A friend of mine:
Rachel, I’m lost with so many names: Scrum, Kanban, Scrumban, Extreme Programming, Agile methodologies and DevOps. And now you are talking about Software Craftsmanship. Absolutely lost. Where are we going? What methodology should I choose?
It was a difficult question and I needed to organize the mentioned methodologies and cultures.
At that time, I remembered one of the reflection moments that came up when preparing a talk.
I talked about Software as a Craft at the University of Tarragona with a lot of students as attendees. However, I forgot to ask them if the Waterfall model was still taught there and how.
Taking the definition of Extreme Humility as a reference, I came up with these reflections.
There was a lack of humility, because it was thought that we could make each phase correctly one after another.
Developers were not expected to think, because they only had to program what other people thought. And experienced developers were promoted to think and they lose their expertise in programming.
There were also a separation between master (first phases) and apprentice (coding phase), the difficulty in giving feedback and a clear separation with Testing and Deployment phases at the end (quick, quick, we’re late).
Alternatives to the Waterfall model were both the iterative development and the incremental development. Its combination led to new development methodologies.
The idea of Scrum for software development was presented by Jeff Sutherland and Ken Schwaber at OOPSLA conference in 1995. All activity in the Scrum Development Process takes place within two inspect-and-adapt cycles: sprint and daily meeting.
Kanban System was developed by Taiichi Ohno, a vice president of Toyota, and Shigeo Shingo and it consists of a set of cards containing all the information required to be done on a product. They are used to control the work-in-progress (WIP), production and inventory flow.
Scrumban was born as a way to transition from Scrum to Kanban, when introducing Kanban to visualize, understand and continuously improve the way of working.
On the other hand, Kent Beck created Extreme Programming in 1996 and it takes values, principles and practices to extreme levels. As Kent Beck wrote:
(…) there are certain things that you have to do to be doing XP. You don’t get to choose whether or not you will write tests - if you don’t, you aren’t extreme (…)
- Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
- Continuous attention to technical excellence and good design enhances agility.
- At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.
These 3 principles are focused on professionalism and well-craft software. However, in 2008, Robert C. Martin proposed a fifth value for the Agile Manifesto: Craftsmanship over Crap.
More discussions came up with an extension of the Agile Manifesto in 2009: Manifesto for Software Craftsmanship.
Software Craftsmanship is an approach to software development that inspires me the apprentice/master relationship, professionalism, practice to improve coding skills and the existence of communities.
Finally, DevOps term comes from DevOpsDays, the conference that brings development and operations together since 2009. I understand DevOps as a culture of collaboration and cooperation between development and IT operations, working together towards a common objective.
So I think that we are travelling to a coding-centered methodology as follows:
- More humility when postponing decisions
- More humility when trying concrete experiments
- More humility when doing small and simple steps
- Getting fast feedback and embracing change
- Working together with a better communication
- Having common objectives as a team (business people and customer included)
- Having a common responsibility
- Having a better knowledge transmission
- Having a set of agile technical practices
And following a learning culture in order to share and improve our skills.
[UPDATE] Of course, coding-centered doesn’t mean only coding, nor to remove analysis and design, but focused on getting value and feedback as soon as possible. As Kent Beck said in an interview:
We were taught that the way that you develop software is you think very carefully about what you’re going to do first (…) you draw lots of diagrams and you write lots of text and you specify exactly what the system needs to do - not exactly how it’s going to accomplish it - and then, you design exactly the computer system that will implement those ideas (…) When you start implementing it, you realize “hey, this is not what we want the system to do”. And even if that is what we want the system to do, the way we were guessing isn’t going to work to make that happen (…) It’s a question of the order of the decisions (…) Nobody’s saying you don’t have to decide what the system has to do, but the question is how much of it you have to decide when.
My friend again:
Thanks, I have a general idea now. And which are the rules of that software development methodology?
There aren’t rules.
It consists of values:
- Values from Extreme Programming
- Values from Manifesto for Agile Software Development
- Values from Manifesto for Software Craftsmanship
- Principles from Extreme Programming
- Principles from Manifesto for Agile Software Development
- Principles from Continuous Delivery
- Lean Software Development Principles
- Practices from Extreme Programming
- Other test-driven programming workflows
- Property-based testing (link of the canonical framework)
- Continuous Delivery
- Trunk based development
- Mob programming: remote mob programming
- The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt and David Thomas
- Software Craftsmanship: Professionalism, Pragmatism, Pride by Sandro Mancuso
- Release It! Design and Deploy Production-Ready Software by Michael T. Nygard
- Agile Technical Practices Distilled by Pedro Moreira Santos, Marco Consolaro, and Alessandro Di Gioia
I usually simplify the terms with methodologies or cultures. However, there are more terms as methods, models, frameworks, processes or approaches, among others.
For example, the authors of Scrum called it “Scrum development process” to avoid the method or methodology debate. However, it’s also referred as an agile framework.
In this post, I usually used the terms that appear at the Wiki by Ward Cunningham.
I’ve seen this keynote by Mary Poppendieck about The Future of Software Engineering:
She talks about:
- From Scale up to Scale out
- Infrastructure as code
- Autonomous teams (autonomous = independent deployment)
- The new technology stack
- The dependency problem
- Resilience Engineering
- From defect free to fault tolerant
- Builing a deployment pipeline
- End-to-end feedback
- From delivery teams to problem solving teams
- A process without requirements, features, estimates or a backlog of stories, based on experimentation and learning:
- Start with signals
- Focus on problems
- Plan with hypotheses
- Do multiple experiments
- Use data to decide