top of page

Software Craftsmanship Training

This course equips your software teams with the principles and practices of software craftsmanship to build resilient, maintainable, and intuitive systems. Designed to foster technical excellence and grow leadership from within, it’s an investment in upskilling your engineering organization—empowering developers to innovate, collaborate more effectively, and drive long-term product success.

Benefits for your software teams:

Software Craftsmanship

Learn about the importance of craftsmanship skill over process (Agile, Scrum, SAFe/LeSS, VSM, Lean, Kanban) in creating high-quality, maintainable code. This includes mentorship and critical feedback on real coding tasks to cultivate excellent design skills.

Software Architecture Importance

Discover the critical role of software architecture in determining the success or failure of a project, emphasizing the enduring impact of early decisions. Understand why relying solely on testing and refactoring strategies falls short in producing high-quality, maintainable software systems.

Conquering Technical Debt

Understand the unique challenges of software engineering, which requires strategic organization of complex systems and vigilant monitoring of Technical Debt. Learn to identify, measure, and manage technical debt efficiently, turning it into Technical Wealth with each software delivery. Focus on controlling the natural increase in disorder over time by adopting practices that maintain order and minimize entropy.

Customized Strategy Development

Understand the unique challenges of software engineering, which requires strategic organization of complex systems and vigilant monitoring of Technical Debt. Learn to identify, measure, and manage technical debt efficiently, turning it into Technical Wealth with each software delivery. Focus on controlling the natural increase in disorder over time by adopting practices that maintain order and minimize entropy.

Critical Analysis of Mainstream Design Advice

Explore the drawbacks of widely accepted design principles and Design Patterns, understanding how they can add complexity instead of simplifying projects. This section critically assesses conventional approaches, promoting simplicity in design and a focus on principles that genuinely improve maintainability and quality.

Methodology Customization

Discover why a one-size-fits-all approach doesn't work for software development. Customize your software engineering methodologies to meet your specific business needs. Learn to identify and approach the complex, complicated, and obvious aspects of your larger development projects appropriately. Additionally, differentiate between rapid prototyping and long-term sustainable development.

Developing Abstraction Skills

Use OO techniques to design intuitive and maintainable class ecosystems. By aligning software abstractions with the real world and problem domain, software designers can achieve much more highly intuitive & maintainable designs.

Course Outline

01

Software is still eating the world!

Because code is invisible, software engineering in the large has become the hardest kind of engineering. We need powerful mechanisms to give our software structure and shape; this provides strong mind-sync among the software team and domain experts.

02

Eras of Software Engineering

Just as industrial engineering influenced Agile/Scrum and civil engineering inspired the waterfall model, software engineering has drawn from other disciplines. But the unique nature of software demands a fundamentally different way of thinking.

03

Design Patterns: SW Design Snake Oil

Gang of Four design patterns are often overused and misapplied, leading to unnecessary complexity and poor abstraction. Avoid treating them as universal solutions; instead, focus on clarity, simplicity, and contextually appropriate design.

04

Edensoft's Post-Agile Engineering Way

Agile methodologies, focusing primarily on delivering working code, inadvertently act as antipatterns when it comes to ensuring software quality and highly maintainable source code. This section distinguishes the Technical Wealth Method from standard Agile/Scrum philosophies.

05

Customizing Software Engineering Methodology to Your Business

There are two very distinct ways of developing software - prototype mode and sustained mode. You need to know where your development falls on the spectrum.

06

Software Engineering is Young & Immature

While the most mature engineering fields have progressively developed over the span of thousands of years, software engineering has only been practiced for around 65 years. Given the immaturity of this field, we should expect that even ideas that are widely accepted today may be proven to have unforeseen flaws that will lead to their decline in the future.

07

Pitfalls of popular software design advice

Mainstream software development advice is based on four commandments: Decoupling, Separation of Concerns, Information Hiding, and No Duplicated Code. These might be desirable, but they are the wrong fundamental principles of software development.

08

Identifying & Avoiding Computer Science Hype

Robert Glass once said hype is the plague of software. This section explores how to critically assess trends and avoid chasing buzzwords that degrade engineering discipline.

09

The Edensoft Labs Automated Software Factory

Every line of code and test undergoes rigorous human review. This full-spectrum review process creates codebases that are both durable and high quality.

10

Software Craftsmanship

Great process doesn’t substitute for great skill. Becoming a master software designer requires ongoing practice, critique from experienced mentors, and exposure to real-world complexity.

11

What is software architecture and why does it matter?

Software architecture is the high level structural shape of a software system that once set is very difficult to drastically change and defines the mix of quality attributes that have been emphasized and de-emphasized. Since the best predictor of software project failure is size, good architecture is our primary tool to contain cognitive complexity as the codebase grows.

12

Software Architecture Case Studies

Through real-world examples, this section illustrates how poor architectural decisions in growing codebases can lead to severe productivity loss, failed projects, and full rewrites—while showing how thoughtful architecture can turn failure into long-term success.

13

What is Software Quality?

Quality lives in the non-functional requirements—performance, usability, security, etc. These "ilities" aren't free; they come with substantial costs in design complexity, testing, and maintenance.

14

Achieving Software Quality?

Quality attributes, not functionality, are the hard part of software. Engineering teams often focus purely on functional requirements and delay quality attribute testing until the architecture is already set and it’s too late.

15

How Continuous Delivery & DevOps can Hamper Quality

You don't test quality in, you design it in. Don't be led astray by the hype of DevOps, Continuous Delivery, and Microservices.

16

Code Reuse in the Large via Durable Codebases

Code reuse in the large refers to successfully fielding reusing large amounts of your existing code base to field new products in a fraction of the time that would be possible if you had to start from scratch. Our Durable Codebase has been the greatest single factor in us delivering sophisticated solutions fast without sacrificing high quality.

17

Leveraging our Durable Codebase to Build Products

Our durable codebase is a massive collection of proven, well-tested modules. But a subtler kind of reuse of well written code is the ability to copy large chunks of high-quality code into new programs while making small tweaks throughout to fit different design goals.

18

Christopher Alexander's Thoughts on Large Scale Design

Dive into the ideas of Christopher Alexander, whose work on architectural patterns inspired he Gang of Four’s design patterns. Understand what was lost—and what remains relevant.

19

Drive Designs from the Top Down to Achieve Conceptual Integrity

Decisions at the system level set constraints on decisions at the process and class level. Thus, top-down design can set constraints on the software architecture in a good way. However, Bottom up design promoted by Agile is an anti-pattern for achieving conceptual integrity at the macro levels.

20

The Heavy Influence of Early Decisions and Code

Software engineering today doens’t appreciate that software architecture is heavily influenced by early decisions and code rather than by the decisions and code written in the mid or late stages of a product development effort.

21

Defining Good Software Designs

Good designs must be evaluated within the context and associated constraints. Once an architecture is in place, it becomes hard to change—so getting it right early is essential.

22

Principle 1: Conquer Complexity with Simplicity

Complexity is the enemy. To manage large codebases, you must ruthlessly pursue simplicity in both design and implementation.

23

Complexity Sin: Overpursuit of Quality Attributes

Quality attributes aren’t free. Over-pursuit of quality attributes results in a more complex, over-engineered, and less maintainable solution. Developers should count the complexity costs before adopting any idea that promotes gains in quality attributes.

24

Complexity Sin: Improper focus on micro design rather than macro design

When battling our #1 enemy of complexity, software must be designed for simplicity at the macro level before the micro level.

25

Complexity Sin: Overpursuit of Modularity

Breaking a large software application into many smaller pieces usually doesn’t create greater maintainability. Some modularization is necessary to achieve optimal maintainability, but over-modularization decreases maintainability.

26

Complexity Sin: Overuse of Indirection

Indirection adds complexity, and unnecessary use of indirection will just make it harder for maintenance programmers to see the big picture.

27

Complexity Sin: Misjudgment of what factors lead to maintainability

Practically all popular software design advice out there claims to help you yield more maintainable code, but this advice falls short. Such advice biases software practitioners into overly complex solutions which are harder to maintain than necessary.

28

Complexity Sin: Overpursuit of Flexibility

Flexible software architectures are always more complex and awkward to maintain. Software developers should think harder about what you should omit rather than what additional things you should put in.

29

Principle 2: Write Software for People First, Computers Second (Achieving Maintainability)

Great software designers create software optimized not for their own pleasure but for others’ comprehension. Creating intuitive designs requires empathy and humility.

30

Principle 3: Model after the Real World and Problem Domain

Real-world objects provide objective, hard, black & white boundaries. A good abstraction should result in it being very obvious whether a particular method or data belongs in that class or not.

31

Principle 4: Iterate Until it's Great

Designs from the ivory tower architect rarely work out, but neither do evolutionary designs. To have great designs you need to ride the elevator up and down.

32

Principle 5: Strive to Reduce Entropy

Software maintenance tends to increase entropy, so to contain complexity you need to make concerted efforts to keep entropy down.

33

Leveraging & Managing Technical Debt

Severe underinvestment in code reviews and rigorous systematic testing leads many Agile projects into rapid accumulation of massive amounts of technical debt.

bottom of page