I have learned software development more or less by doing it. My education was more aimed towards hardware.
In my early years as proffesional software developer, i thought that 'growing' towards designer and - later when the
term became mainstream and popular - architect would be a good thing. - The classical idea that thinking before doing and possibly - some people think and some people carry out - moreover people who think are the smart ones and the other guys - well - we need them too.
I don't regret that. It was just a phase in learning a bout software development.
Later i learned that doing and thinking go togheter. And doing and thinking cannot be taken apart. Lukily I like them both.
I think that skill and practice are at the core of craftmanship, toghether with eagerness to learn and a tiny bit of arrogance.
All of that and my elaboration below, is woth nothing without a sense of urgency to get things done. Urgency is often put on the team in terms of deadlines, and still in some environments is see people walking around, rethinking and resuggesting issues, like seem to have an eternity at their disposal.
Let me elaborate a bit:
- skill in design principles
- skill in programming - the idioms and possibilities in the languages that one uses;
- skill in thinking in abstractions; translating it into code and translating it into a language that other - less technical - people understand;
- skill in grasping and expressing, managing other aspects of a design - eg. dynamic behaviour in a system
- skill in development practices (like test driven developent)
I know a lot of people that are quite good at thinking in abstract terms and talking about software and systems in those terms. I hate to listen to them, because i tend to distrust their ability to get things running. My lack of trust increases when one refuses to accept my invitation to look at code. It is of utmost importance to see for yourself what the consequences of abstract thoughts are in concrete code.
Arrogance and eagerness to learn;
I think it is ok to think that you are good at what you do. If you don't you fail to take challenges. Maybe arrogance is a too strong expression in this context, that's why i added eagerness to learn. Eagerness to learn is about humbleness. Here's the paradox. You need to be arrogant and humble at the same time.
My Puzzle about Craftsmanship is this one:
The term and the conference, tend towards technical stuff alone, while i think that the people bit of software development is equally if not more important.
Wait - Before kicking me out of the conference - i said it was a puzzle - it's probably about balance.
I know it's a bit of a mess - i might cut it to a shorter version later.