In my previous post, I told you about software architecture and mainly the basics of software design. And we saw that the two indicators of software quality, the most important (Ease of use and maintainability) were the most neglected because most of the architects are limited to the delivery of functional software.
And that is all there, the difference between an industrialist who merely happens to repeatedly chain products based on a model and an artisan who uses his knowledge to create artistic works (Architecture of buildings, Software Architecture, …) and its cognitive functions to improve over time. Hence the software craftsmanship movement.
A software craftsman is above all one who designs his software well, in the sense of software architecture of course. Hence the four values advocated by the craftsmanship of software are
- Not just operational software, but also well-designed software.
- Not just adapting to changes, but also constantly adding value.
- Not just individuals and their interactions, but also a community of professionals.
- Not just collaboration with customers, but also productive partnerships.
From these values that any aspiring software craftsman must respect, it is clear the desire to do things well, to constantly improve, to share know-how and to integrate the customer into the software life cycle.
I have had to read on many blogs people who say that a company needs to industrialize its processes in order to be able to produce and that a craftsman has no place in a company, these people have entirely reason, except that the goal of a software craftsman is not to transform an industrial company into a craft company but rather to design software worthy of the greatest artistic works by:
- Best assigning responsibilities in the code (Single responsibility principle)
- Making the code as extensible as possible (principle of opening / closing)
- Allowing objects of the same family to substitute for each other (Liskov’s principle of substitution)
- Limiting access to objects to methods they do not need (Principle of interface segregation)
- Ensuring that the dependencies between the different modules are managed by abstraction (Principle of inversion of dependencies)
These different principles (SOLID) stated by Uncle Bob aim to simplify software design techniques and to make designed software maintainable, scalable, and understandable.
To come back to the industrialization of work processes, it is obvious that the second value of the manifesto of the craftsmanship of the software which aims to constantly create added value goes through the implementation of the automation processes of the test phases. and deployment of the created work (software) but in no way amounts to industrializing the design phase itself.
To conclude, I will say that the craft of software is the art of designing software well through know-how and continuous learning and can be/should be considered as a technical complement to agility.