On Software Craftsmanship
Reflecting on the role and meaning of software development as craftsmanship.
Seeing software development as handiwork implies the revaluation of certain inherent aspects formerly considered as important and those traditionally given less importance, and how this revaluation impacts the individual developer, a software development team, and the process of developing software as a whole.
"The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by the exertion of the imagination." [📖MM, p. 7]
Due to the close connection of computer programs with automatism and technology, the role of software developers is merely considered supportive. As an example, a written program may exist as a runtime executable or as a utility function in computer memory and is as such not tangible for the user. The ease of work for a problem domain is appreciated by the computer's user, but the creator(s) behind the product is just a means to an end: Software supporting complex technicalities often obscures the fact that behind the written code a person or/and a team exists that successfully applied their expertise and skills gathered through years of practical and theoretical experience. As an implication of the lack of appreciation, developers lose the connection to their creation and tend to view their code as a commodity that's of a short lifetime, not of much worth, and easily replaceable.
Experts in the fields of software development - such as Pete McBreen [📖SCS], the "Pragmatic Programmers" Andrew Hunt and David Thomas [📖PP] and Robert C. Martin [📖CC] consciously connect writing software with the notion of "crafting":
"You must gain the knowledge of principles, patterns, practices, and heuristics that a craftsman knows, [...]" [📖CC, p. xxvi]
Thomas and Hunt state in the Preface to the first edition of the Pragmatic Programmer, that "Programming is a craft" [📖PP, p. xix] but also acknowledge that software development is usually connotated with the task of engineering:
"There should be engineering in software construction. However, this doesn't preclude individual craftsmanship." [📖PP, p. xxii]
In Software Craftsmanship, crafting software facilitated with technical tools and agile methodologies which support diligence and discipline is seen as a creative process whereas engineering software emphasizes technical aspects of the discipline. Of course, neither the creative process nor the engineering process is less valuable than the other. However, weighing in on the creativity involved in writing software allows the developer to forge a closer bond with the product that emerges out of this process - closer than one would probably expect from an intangible product.
"Not only working software, but also well-crafted software.
Not only responding to change, but also steadily adding value.
Not only individuals and interactions, but also a community of professionals.
Not only customer collaboration, but also productive partnerships."