In the early years of software development, large numbers of software projects tends to be over budget and over time. The community then tries to bring in engineering practices to help make software projects predictable. Thus ‘Software Engineering’ was born.
The problem with engineering is that it:
- Treats all developers equally as resources or automatons even though we know that developers are vastly different to each others
- Assumes highly degree of control and predictability, but software projects is often unpredictable
- Requires approved body of knowledge, certifications and college degree before you can call yourself engineers. In software, there are many highly achieving developers with only high school diploma and no more
- Generally has end-goal set in advance. For example, a bridge will have to connect point a to point b. The two point will be unlikely to change. Contrast this with software project that changes on daily basis
Craftsmanship places the craftsman in the center of the process.
Craftsman are people who:
- Dedicates their working life to getting better at their craft
- Learns their skills through apprenticeship to a master craftsman
- Aims for mastery of the craft
- Teaches others through apprenticeship
- Builds a reputation based on what they have delivered and not what exams they have passed
Passion is often a positive modifier for craftsman. I argue that passion is optional as you could succeed in a craft without passion although it definitely help.
But with the rise of industrialization there are fewer and fewer craftsmen. One of the biggest remaining groups is computer programmers.
~ Paul Graham
The concept isn’t new. The classics embraces it.
Pragmatic Programmer comes with ‘Journeyman to Master’ subtitle, which reflects the classic craftsmanship journey.
Software Craftsmanship: The New Imperative talked about the situation that our profession is facing right now. “As the demand for software has exploded, the software engineering establishment has attempted to adapt to the changing times with short training programs that teach the syntax of coding languages. But writing code is no longer the hard part of development; the hard part is figuring out what to write. This kind of know-how demands a skilled craftsman, not someone who knows only how to pass a certification course.” still true 15 years after the book is published.
Apprenticeship Pattern is similar to the design patterns and refactoring books. it goes through many patterns that we can follow on the path to mastery.
There is also a sequel to the Agile Manifesto, aptly titled Manifesto for Software Craftsmanship where you can sign and list your name on the page.
Stages of Craftsmanship
We all started as a Novice in a craft. As we pick up a few skills, we become Initiate. Once an initiate feels she wanted to pursue the craft, she should find a master to apprentice to.
In the medieval Europe, an apprentice who wants to learn new craft will have to look for a master to study from. Thankfully for us, with the advent of the internet and printing press, it’s easy to learn from the masters of the craft through books, videos and courses.
In modern times, I consider university student to be on apprenticeship stage. Just starting their craftsmanship journey, learning from the professors.
“The journeyman is focused on building an ever-larger portfolio of applications that demonstrates his progress in the craft; he moves between projects and masters, seeking to diversify and deepen his portfolio; he seeks to elevate his status within the community; and he strives to become ready to be a master.”
~ Apprenticeship Patterns, p. 31
That quote perfectly describes this stage.
In the old days, a expert journeyman has to produce a ‘Masterpiece’ that has to be accepted by other masters before allowed to join the guild.
In software craftsmanship, this would be the people who has mastered their craft, produced masterpieces and shared their superior skills to advance their professions and the wider world. There is no certification for it. We can’t just copy someone else’s masterpiece either, because you have to create your own.
On scale of 1-10, on a good day, you might rate yourself as 8s or 9s. but once you see the works of the masters, you realize the scales goes up to 100s or 1000s.
Linus Torvalds is one of those people. his masterpiece is, of course, Linux and Git which changed the whole computing landscape forever.
My other favourite masters are Chris Lattner for creating LLVM, CLang, and Swift; and Richard Stallman for creating the GNU projects & the Free Software Foundation that started the open-source movement.
There are many other masters that has directly impacted our lives through their masterpieces, and all of us should aspire to do better than them.
Growing one’s skill is an integral part of any craftsman’s career. As we touched before, thanks to the internet, it is not very easy to learn from books, videos and courses from great masters.
Despite the newer technologies, books are still the most time and cost effective way to learn new skills. There are several books that is a must for every aspiring software craftsman to read:
And books that I have read and personally recommend:
The old saying “Practice makes perfect” is only half true. Not all kinds of practice are created equal. Studies have shown that Deliberate Practice is the superior method to practice.
In other word, the practice has to be about improving specific skill, repeated, with feedback from expert and must be challenging. There is no point to keep practicing a skill that has already been mastered.
One way to practice software skills is to do Code Kata.
This way of practicing comes from the martial arts world. When a Karate practitioner is alone, he can’t practice Kumite (sparring). To practice, he can do a Kata, which is a set pattern of movements involving stepping, punching, kicking and other moves.
Code Kata is similar to that. You will solve a short programming exercise that can be done in multiple ways. Those katas are usually 15-60 minutes.
Remember to always get feedback for your practice to minimize errors and avoid forming bad habits.
Imagine that you have two groups of people. on the left you have team mango. on the right team avocado. they are about to attend a lecture.
Team mango was told that they will have to teach the material to others. Team avocado was told that they will be tested on this.
Which team do you think scores better on a test?
“When teachers prepare to teach, they tend to seek out key points and organize information into a coherent structure, our results suggest that students also turn to these types of effective learning strategies when they expect to teach.”
~ John F. Nestojko
Team mango performs significantly better than team avocado.
This is based on a study in St Louis Washington University
Even the intention to teach will improve your retention. So I want you to approach your learning from now on with different perspective.
We teach to learn more effectively.
I know most of us codes everyday and can’t really be bothered to write after we get home, But blogging/writing is one of the most cost effective way to share knowledge. It benefit you as you need to deconstruct what you have learned and structure it.
Personally I have been blogging on and off for several years on different topics. Never consistently. I am planning to change that with the new revelation about the effectiveness of sharing and craftsmanship. There will be consistency.
It helps to keep me accountable.
Brown Bag Sessions
This is where you gather your work colleagues and do knowledge sharing over take-away lunch (usually in brown paper bags). An intimate atmosphere where you know most people and conducted in familiar place. After you’ve done a couple of those, try to find a larger forum to share. For example, Meetup group.
The easiest way to share with more people is to find a meetup group in your niche and register. You can then ask the organizer if they are still looking for people to speak. They usually are. When it is confirmed, just prepare yourself and practice, then deliver it confidently.
Software development is more craft than engineering because it relies more on the skill and experience of the craftsman than the process of engineering.
A good craftsman will always strive to grow themselves through continuous learning and sharing.
Beside helping others, sharing will also help you because it forces you to learn effectively and understand the material more.
Thanks for reading and I hope this essay benefit you.