This post is from the CollabNet VersionOne blog and has not been updated since the original publish date.
Building Software Craftsmen
I see Craftsmanship as the answer to an issue that has been rising in importance over the past several years. Agile, as a development methodology, has hit the mainstream. While in many ways this is a good thing, there are some drawbacks. The majority of attendees at the major conferences are now project managers, while in the past they were developers, or at least a fair mix of both. This has helped socialize the ideas around agile development and is a good thing, but we also need to seek balance in the Force. This has given rise to the Software Craftsmanship movement, which is focused on the Art of Writing Software, and what is required to create great software, especially in the agile world. In a previous post, I mentioned how important Craftsmen are to the agile world. But how does one become a Craftsman?
First, lets take a look at the state of affairs of our industry, job-wise. It is pretty well known that being a software
developer is a lucrative career, but the numbers are still somewhat surprising. According to the U.S. Bureau of Labor Statistics, the median salary for software developers in the United States is around $93,000. The statistics further show that the number of jobs in the software development field will grow by 22% in the next 10 years. This is significantly higher than the rest of the job market. So how are we going to fulfill these needs with high-quality developers?
Obviously, we need to train a lot of really talented people. We need them to be able to create software well, and also to be able to work well together. Currently, the primary source of education in software development is via the universities and colleges. Unfortunately, not only is this failing to provide enough programmers for the jobs, it is also failing to provide the high level of quality and experience we will need.
Now, universities are great for a lot of things. They provide a strong level of theory and understanding of the underlying science and logic. What they don’t provide is real-world experience and practical applications of knowledge. This needs to come from somewhere else. My suggestion is to turn the clock back a few hundred years, and turn your team room into a workshop. Let’s populate that workshop with Craftsmen. We may not have all of the Craftsmen we need to begin with, so we need to build and grow them. This can be done by applying an apprenticeship program and using the craftsmen’s model for further career development. Let’s take a look at how this would work.
Let’s begin with the idea of hiring apprentices. An apprentice is someone who may or may not have a formal education in software development. What she will have is the desire to learn. The question remains, “What will she learn and how will she learn it?” For starters, we will focus on five main areas:
- Crafting Code – The art of using one or more programming languages to create clear, well-factored code. We want our apprentices to be polyglots by the time they become journeymen, so we will do this in more than one language.
- Applied Principles – Well-written code isn’t enough. An apprentice needs to understand principles like SOLID, and know how to apply them.
- Technologies and Tools – While programmers need to be able to practice activities like Refactoring by hand, they also need to know how to use certain tools, as well as which tool to choose for a particular task.
- Work Habits – Programming is about more than just showing up, slinging some code, and going home to play Mine-Craft. Especially in an agile software development shop, we need to be able to build muscle memory around the activities that make good programmers great, such as TDD, Continuous Integration, etc.
- Soft Skills – The days of the socially inept programmer are over. Software apprentices will learn how to work in a team, how to communicate with others, and other soft skills that tend to be forgotten in the traditional learning environment.
An apprentice will learn these foundational areas through working on real projects, under the tutelage of a mentor. Ideally, that mentor might be a Master Craftsman, but if one isn’t available, then experienced, well-versed Journeymen will make good mentors as well. At the beginning of her apprenticeship, the apprentice might do some basic things like creating and maintaining the continuous integration environment, some bug fixing, or other tasks. Over time, she will work with her mentor and other Craftsmen on real-world activities and projects, continually adding value to the team. When the apprentice has demonstrated her ability to move on to bigger and more challenging projects and tasks, it’s time for her to be recognized as a Journeyman. We will explore more about the life of a Journeyman in another article. In order to become a Journeyman, the apprentice must show her expertise by doing, not by taking tests. Real work pieces that evidence her abilities in various areas and languages, coupled with having paired with everyone on the team, will determine an apprentice’s ability to move on.