A lot of people on the Software Craftsmanship mailing list consider Practice to be not only an important part of Software Craftsmanship, but the main part. I have personally always had a bit of a love/hate relationship with practicing. When I was younger, that was my main way of learning how to program. I would sit there and go through tutorials, and dream up useless little example apps that I could use to explore a particular technology further. As time went on though, and I went through uni, and started full time work, all those technologies that I practiced became obsolete, but more importantly the practice didn’t really seem to teach me the fundamentals of what is really important in developing software: delivering value by understanding the business and communicating and collaborating with people. Sitting at home typing in source code with no value, and outside the constraints that guide the development of real software was fun, but only very superficially satisfying. A crude simile came to mind: it was like trying to learn about romance by masturbating. Sure the raw mechanics seem roughly similar, the technology is partially useful, but you are only really covering a small part of the issue. The entire human aspect is missing, the constraints are not there, all one really does is practices the easy bit: the typing in of source code. In fact, just as masturbation may in fact harm the ability to form real relationships, practicing may harm the ability to create real software (for example one may become so used to the freedoms of practicing alone on his own project, that he cannot deal with the real world constraints of business needs and working with others).
But I was just doing it wrong. Practicing is valuable, provided it emulates as close as possible the real world situation. You need to incorporate the planning aspect, the collaboration aspect, the delivering of value and business realities. Without those practice could do more harm than good.
One step I have taken to simulate planning for example, is the implementation at home, of a Kanban System to help balance the time I spend on practising with that on other household matters.
Each of us, my wife and I have a backburner as well as the Backlog that only shows the 4 most important items. Whoever has the yellow magnet in their backlog takes the next turn to Select an item from their backlog and move the corresponding post-it to the Selected column, provided there is a free slot. (The numbers in each section are the maximum number of items allowed in each section). At that moment the time is written on the post-it. When someone wants something to do, they choose an item from the Selected column, and move it to the In Progress column, writing once again the time on it. When the item is complete, it will be moved to To Verify, if the item was originally posted by the other person, or directly to Done if you just finished one of your own tasks. Once an item is verified and done, the Lead Time (time from Selected to Done) and the Cycle Time (time from In Progress to Done) can be calculated and can be averaged and used later in optimization and statistics.
It seems to be working ok, although we have only just started using it.
As far as the collaboration aspects go, I have already completed one small task that was inspired by a mailing list message. Someone was looking for a specific example, of a simple calculator application, that could be used to help practice and demonstrate Clean Code concepts. The specific example was unfortunately proprietary, so I took the initiative of starting a GitHub project to develop a calculator collaboratively, ideally helping myself and others to practice using Clean Code concepts.
I originally intended it to be a bit more collaborative, but ended up working on it alone. Still I think it will form a fairly good starting point for future endevours. Such as when learning new tools and libraries, I have at least a fairly simple project that I can play with.
It still doesn’t really deliver that much value though, so I have also joined another online project that may promise to be a fairly good simulation of a real world collaborative, agile project, but it is a bit slow getting underway (which is great really, that’s exactly the kind of issues that one doesn’t get to experience when working alone). Hopefully it will kick off soon and I can write something about it.
Apart from that, there has been some talk in the local use groups about starting weekend long coding dojo type things where we all meet up somewhere and just develop something together. So if that gets going I will be hopefully involved in that.
My current job mostly involves the maintenance of legacy C++ code, so I am really feeling the need for practice to develop the skills I get little chance to develop in my job. So with this new understanding of, and appreciation for practice I am pretty excited about the things I might be learning in the future.