December 16, 2008

Are you a software craftsman?

I had the pleasure to attend the craftsmanship summit on Saturday. The discussions on the mailing list are still going on but some intermediate works is worth remembering already. We tried for example to imagine what questions should be asked to a candidate to understand if he/she cares/understands what software craftsmanship is. The following list is a personal selection of the most interesting ones with (my) answers. Some of them are for sure a must use during the next interview.

I don’t want to call anybody directly to answer the questions (like the “when you started programming” meme) but if you’re so inclined, please copy paste the questions and link this page. So first the list, no answers:

Do you follow a particular process to create your work?
What tools have you built to enhance your work?
When do you stop re-factoring and enhancing your code?
What are your training techniques?
How much time do you spend per week coding outside your main job?
How do you react when you discover a bug in your own software?
What are the first things you would teach a new apprentice?
How many languages do you know and can use consistently in the same project?
What are your most important influences in the programmers community?
Who is the best developer in the world in your opinion?
What make you passionate about software?
Who else would call you a craftsman?
Do you consider your self involved with the software community?
Can you deliver consistent results in your code?
Can you define what good code is?
Can you point to some source code that you consider a masterpiece?
How do you react to something that you are forced to ship but is not consistent with your practices? (for example not tested?)
How do you stay current with industry standard?
Would you go back to a past customer project to fix your own bugs?
How do you define aesthetics and pragmatism in software?

And now the answers (if you care ;)

Do you follow a particular process to create your work?

Yes I do. I mainly follow Extreme Programming practices with particular focus on TDD/BDD (it’s a long time I don’t write production code without first creating a test) and acceptance testing. I’m also adopting the pomodoro technique to estimate and track time at the task (half an hour) level.

What tools have you built to enhance your work?

Right now I’m mostly an integrator of tools I didn’t write personally. I use a timer, Quicksilver and Keeptempo to keep track of pomodoros worked and as a reporting tool for retrieving metrics about my work. I also created some applescript and bash script to automate common command line operations while programming.

When do you stop re-factoring and enhancing your code?

I usually time-box re-factoring and enhancing operations so that I’m sure I don’t end up lost in some unexpected complexity. If that happens, I re-schedule the re-factoring with a new estimate and in relation to the priorities of other tasks.

What are your training techniques?

I spike a lot. I have a specific directory for that where I can create all possible spikes. Whenever I need to understand a new tool or technique I jump into that directory and I create a full project that reproduce my current programming environment. Over there I learn and experiment. Then I go back to the main project to apply what I learned. Only recently I started to practice some Kata.

How much time do you spend per week coding outside your main job?

Usually not too much, unfortunately. I’ve plenty of ideas I fail to put in practice. I’m trying to improve that side of me. I usually attend a lot of user groups and in those occasion I practice the code along with the speaker.

How do you react when you discover a bug in your own software?

First of all I usually close what I’m doing at the moment sending the bug fixing to the task queue. The I create a test to reproduce the problem. After I have that test in place, I fix the bug.

What are the first things you would teach a new apprentice?

I’ll probably teach him/her to be patient with me whenever for some reason I’m not able to provide enough explanation and to always make a lot of questions, including silly ones and never stop to be curious about how something works.

How many languages do you know and can use consistently in the same project?

I think I know many: Java, C#, Ruby, Python, Perl, C++. For some of them I need to clean the rust off but it’s a matter of looking at my old projects for a bit.

What are your most important influences in the programmers community?

I have some big names that everyone knows and are always part of my learning experience: Uncle Bob, Martin Fowler, Kent Beck. There are other ones that influenced specific portions of my programming life: Rickard Oberg, Peter Coad (and his Connie’s Convenience Store), The GOF. From all of them I read at least one book.

Who is the best developer in the world in your opinion?

Hard to say. I would probably go for Alan Kay. What impress me the most about him is the way he introduced “childish” concepts, for example in Squeak, demonstrating how effective they are for everyone no matter the age. I think he has not only outstanding programming skills but also a great sense for innovations.

What make you passionate about software?

The fact that it you can build entire worlds without leaving your desk. This is by far the most fascinating thing about software. There are no physical limits.

Who else would call you a craftsman?

Hopefully many people. But I never asked directly. I have to blame my self I don’t provide enough information to the outside world: apart from co-workers, I should give more source code to the “community” to decide about my craft. I think it would be a good achievement if I could list in my resume a list of people who can recommend me as a software craftsman.

Do you consider your self involved with the software community?

Yes, but I can definitely do more. I have a blog and I give presentations sometimes. I’m still missing the real software craft, some kind of open source project that can be used to discuss about my craftsmanship.

Can you deliver consistent results in your code?

Yes, definitely. I worked a lot on this aspect of maintaining a steady development pace. Once I recognize a good tool, practice or habit, that becomes part of my development style and it takes a while to be replaced. This has the side effect of maintaining consistency.

Can you define what good code is?

Good code is the code that best describes the actual requisites, guarantees reasonable performance and costs and it’s easy to change and extend.

Can you point to some source code that you consider a masterpiece?

Sure: JINI the spontaneous networking framework by Sun. I had the pleasure to dig deep into the source code and there are truly amazing pieces of software there. For example the RMI Activation protocol or the way information are packed into UDP to carry only the strictly relevant data to be contacted back. And more and more.

How do you react to something that you are forced to ship but is not consistent with your practices? (for example not tested?)

Well, I’m not happy. But when I’m forced because the situation doesn’t allow me to recover otherwise, I do the dirty fix. I consider this always a personal/team failure, never an environment (customer or market) failure. I then try to understand why it was not possible to prevent the situation ahead of time with the goal to not repeat the same error again.

How do you stay current with industry standard?

Articles (10%), blogs(40%), tweets(5%), books(30%), user groups(10%), conferences(5%). Interesting to see how I trust blogs more than formal articles.

Would you go back to a past customer project to fix your own bugs?

Sure. The fact that I’m working on something else today doesn’t mean I don’t feel responsible about what I’ve done in the past.

How do you define aesthetics and pragmatism in software?

Coding is both rationality/pragmatism and pleasure/aesthetics. Needless to say, they both have to be present. Pragmatism is about building code around business requirements. Aesthetics is about building code “per se”, because it works nice or because the solution is particularly appealing. Even if the latter is not strictly related to the business, is a great motivational fuel and must be always present in the correct percentage.

Comments (View)
blog comments powered by Disqus