Engineering vs Craftsmanship

Why Should We Master Both?

Engineering vs Craftsmanship

Why Should We Master Both?

In the world of software development, two terms often arise when discussing the qualities of experienced professionals: engineering and craftsmanship. While we sometimes use these terms interchangeably, they represent distinct skill sets and mindsets.

Emily Bache and Dave Farley published the video What Is A Software Engineer? | Craftsmanship Movement Was A “Step Backwards”. It inspired me to write this post with a different opinion: combining the two approaches leads to superior software development.

The Engineer’s Mindset

Engineer
Engineer - Photo by Daniel McCullough on Unsplash

Software engineers have a systematic problem-solving approach, emphasizing precision, efficiency, and scalability. The following are some essential qualities of a software engineer:

  • Systematic Thinking: Engineers approach problems with a structured mindset, breaking down complex issues into manageable components
  • Measurements and Metrics: They make decisions based on quantitative data gathered from the system
  • Efficiency and Optimization: They strive to create efficient algorithms and optimize code to ensure optimal performance
  • Scalability: Engineers design systems that can handle growth, ensuring that software can smoothly scale as user demands increase
  • Reliability: They prioritize building robust and reliable systems, often employing rigorous testing and validation techniques to minimize bugs and errors
  • Documentation and Standards: Engineers follow industry standards and best practices, maintaining comprehensive documentation for future reference and collaboration

In other words, engineers focus on building systems that satisfy functional and non-functional requirements. They achieve this by heavily relying on theoretical knowledge.

Unfortunately, this mindset doesn’t consider a crucial human element: the developer who’ll maintain or understand the code.

The Craftsman’s Touch

Craftsman
Craftsman - Photo by Dominik Scythe on Unsplash

The software craftsmanship movement emerged as a response to the perceived decline in software quality and the industrialization of software development. It emphasizes the importance of quality, professionalism, and pride in one’s work. Key principles of software craftsmanship include:

  • Continuous Learning: Craftsmen commit to continuous learning and improvement, staying updated with the latest practices and technologies.
  • Professionalism: The movement advocates for a professional attitude towards software development, where developers take pride in their work and strive for excellence. It also includes communication with clients and teammates.
  • Collaboration and Mentorship: Experienced craftsmen mentor less experienced developers, fostering a culture of knowledge sharing and collective growth.
  • Quality Focus: They emphasize delivering high-quality software that meets user needs and is maintainable in the long term. Their toolkit includes maintaining code quality, refactoring, and TDD.
  • Community Engagement: Active participation in the software development community through conferences, meetups, and online forums is encouraged to promote best practices and innovation.

In summary, craftsmen focus on pragmatism and the human element in software development. But even the most beautifully written code won’t satisfy the clients if it doesn’t perform well in production.

Orthogonal Skillsets: A Symbiotic Relationship

While engineering and craftsmanship represent different aspects of software development, they are not mutually exclusive. In fact, they complement and strengthen each other, creating a holistic approach to software development. Here’s why combining the theoretical knowledge of an engineer and the pragmatism of a craftsman is essential:

  • Balanced Approach: Integrating the engineer’s systematic thinking with the craftsman’s attention to detail results in well-rounded solutions that are both efficient and maintainable
  • Enhanced Collaboration: Engineers and craftsmen bring unique perspectives to the table, fostering a collaborative environment where diverse ideas lead to innovative solutions
  • Professional Growth: Developing skills in both areas allows professionals to grow more comprehensively, enhancing their ability to tackle a wide range of challenges
  • Product Success: Combining the strengths of engineering and craftsmanship leads to higher-quality software that meets user needs while being reliable, scalable, and maintainable
  • Continuous Improvement: Combining measurements with the strive for quality is a powerful combination that enables keeping a codebase healthy and maintainable

How To Grow

Education (including universities and bootcamps) worldwide has traditionally focused on the engineering aspects of software development. Computer science programs often emphasize the theoretical and technical foundations for engineering robust and scalable systems. Here are some reasons for this focus:

  • Rigorous Curriculum: University programs are designed to provide a solid grounding in computer science theory, algorithms, data structures, and systems design
  • Industry Demand: There is a high demand in the industry for engineers who can build scalable, efficient, and reliable systems, driving universities to prioritize these skills
  • Research and Innovation: Academic research often focuses on pushing the boundaries of what is technically possible, fostering a mindset of innovation and engineering excellence
  • Standardization and Accreditation: University curricula are often standardized and accredited by professional bodies, emphasizing engineering competencies to ensure graduates meet industry standards
  • Lack of Legacy Experience: During education, students often work on green-field projects that won’t teach them the importance of maintainability or prepare them for the challenges of legacy codebases

While engineering focus is essential, it sometimes leaves gaps in the practical, hands-on skills cultivated through craftsmanship. Bridging this gap requires incorporating craftsmanship principles into the educational experience.

This is easier said than done. Luckier developers work for companies with a healthy culture that fosters the necessary skills. Alternatively, they involve external coaches to evolve their employees, for example, by onboarding the SW Craftsmanship Dojo®.

Unfortunately, most craftsmen aren’t that lucky. They gain their knowledge by learning from colleagues, reading, and personal experience. A non-comprehensive list of recommended books:

Despite every difficulty and failure, we value every drop of sweat because each is a lesson learned and a step toward becoming a better professional.

Conclusion

Craftsmanship isn’t a step backward. By embracing both the structured, efficient mindset of an engineer and the artistic, detail-oriented approach of a craftsman, we can achieve a balanced skill set that enhances our work and contributes to the success of our products. We should strive to integrate both qualities into our professional development to build better software and become more versatile, effective, and happy professionals.


See also