Software Development Metaphors

Jeffrey Palmero recently had a great post where defends his belief that software development is not too hard, but instead it’s far to easy. While the post is great, covers a wide variety of opposing views and successfully defends it’s premise, I think that he left one section uncompleted. Jeffrey begins to build a new paradigm of software developer levels that should replace the Mort, Elvis, Einstien theory that has successfully been trashed recently by Scott Bellware. Unfortunately, Jeffrey doesn’t expound on the idea to the depths that I think it could, and should, be explored.

The interesting premise in Jeffrey’s post is that software developers are Apprentices, Journeymen and Masters. First let us explore the definition of each title.

Apprentice: One of the definitions that I found for this title was “One who is learning a trade or occupation”. An apprentice programmer could be anyone who is in the technical and/or professional infancy of their career. Apprentices require knowledge, training, mentoring and experience. We were all apprentices when we first started in the industry and, if you were as lucky as I was, you had a mentor who helped you learn technically and professionally. There are people who will never surpass this level in the industry. Those who do need passion, desire and a natural curiosity. Successful Apprentices also need to be willing to sit back and listen to other people. They should take what they hear, apply it to their daily work and always ask questions when they’re not sure. Like an apprentice cabinet maker, the apprentice programmer needs to learn which tools to use and when to use them. They need to learn how to visualize what they are building, and how to apply the tools to the raw ideas and materials in a way that will result in the desired end product.

Journeyman: The definition of journeyman that I feel is most appropriate is “An experienced and competent but undistinguished worker”. Journeymen (or journeywomen) are software development professionals that have learned how to use their tools, have been exposed to all aspects the software development life cycle and have the ability to take business domains and determine how to apply them through software. Journeyman programmers will continue to work with their tools, learning both the tools and the personal capabilities that they have. Although they will still need some, limited guidance, journeymen will begin to develop the skills need to become mentors. Journeymen programmers are the people that you will staff the majority of your team with. They are reliable and capable of coding moderately difficult systems. One of the distinguishing differences between an apprentice and a journeyman is professional posture. Journeymen can sit with the client and, with confidence, discuss their needs, present solution options, and assist the client in deciding which option is best given the constraints of the day. Journeymen programmers can be left to their own devices when making some technical decisions and good journeymen will show flashes of inspiration and creativity in their solutions. Like the journeyman carpenter or cabinet maker, journeymen programmers make up the largest portion or the workforce in our industry. A large number of professionals that achieve journeyman status will remain at this career level throughout there time in the industry.

Master: The term Master can be defined as “A worker qualified to teach apprentices and carry on the craft independently”, but I don’t think that it fully covers the breadth of skills required to achieve this level. Master programmers must be able to fully mentor apprentices and journeymen in addition to successfully implementing the most difficult technical and business systems. The full scope of a Master level programmer’s knowledge is not limited to technical subjects. These programmers will be knowledgeable, experienced and skilled in estimation, business process and the software development life cycle. Master programmers are people that have the ability to schedule, coordinate and staff entire development teams. Technically a Master programmer will have extensive knowledge of their toolset and they will understand that there are other tools and that any of them may become useful. Another trait of Master programmers is their creativity and innovative solutions and designs. Like Master craftsmen around the world, Master programmers are at the peak of their career. They will be sought after for advice, knowledge and guidance. True Master level professionals are not very common. When you do work with one you will know immediately. Not only will you sit back in awe of what they do with such apparent ease, but they will also engage you in their work.

In addition to the Apprentice/Journeyman/Master metaphor, I’ve also touched on a craftsmanship metaphor. To me this is a very important way to define software development. Commonly you will see it described as “construction” or “building”, but, to me, both of those have a cold, mechanical process to them. Software development is creative. Like a wood carver who creates a sculpture, we must create the application out of raw material. In our case that material is in an electronic form, but it is still a material. On new projects we start with nothing and we begin to chip away at the material until we have a rough shape. We don’t do this willy-nilly. Now you can claim that what I just said points to a mechanical and orderly process and this is true, but only to a certain extent. Like a craftsman, we will encounter situations that we have to react to. What if, after a few days of carving, the block of wood begins to show a knot? What if, after a couple of weeks, the system no longer responds to the infrastructure? This is when software development becomes a craft. We (software development practitioners) must now use our instinct, intuition, experience and skill to determine what the best course of action is. Maybe we will design an innovative solution, but we also may determine that the issue that has arisen is a fundamental flaw. In addition to being able to solving problems with skill and experience, software development includes a component of passion. If you’ve ever talked to a glassblower or an artistic blacksmith about their vocation, you will be met with an endless and inspiring conversation. Although it is not as common in software development, there are practitioners that exude this same excitement and energy. The best way I’ve heard this put in a long time was by JP Boodhoo last Thursday when he said “Programming should be fun”. If it is fun, the passion will bubble to the surface, just like it does for the artisan.

I like the craftsman metaphor because it encompasses the skill, training, experience (apprentice, journeyman, master), the creativity and the passion that I think software development requires.

I’m the Igloo Coder, and I’d like to hear about your software development passion.