Summary
We are often urged to keep code, design and architecture simple. What, however, is the motivation for this? And what does this mean in practice? Is simplicity just an aesthetic or does it also have social, economic and technical implications? Does simplicity reduce cost of change, of maintenance, of ownership? When we say ‘simple’, is one person’s ‘simple’ necessarily the same as another person’s ‘simple’? And, of course, if simplicity is so important, how do we simplify?
Overview
In this masterclass ...
- We’ll consider simplicity from a number of viewpoints, including essential versus accidental complexity, value demand versus failure demand, simple versus simplistic.
- We’ll also look at typical sources of complexity in our coding habits, along with code examples in various languages.
- We'll see that many practices and approaches can be used both to simplify and to complicate. It's all in knowing how and when versus how not to and when not to use them. For example, we can encourage reuse through code libraries, platforms and services, but we can also make an architecture needlessly complex and draw in unnecessary dependencies, with implications for maintainability and security. Similarly, AI assistance can be employed to make code simpler and easier to work with but, without attention and guidance, it can make things harder in the long run, becoming a new source of legacy.
- We’ll explore verbose and convoluted code, the effect of programming paradigm and how we can turn down the imperative noise of many languages and styles with declarative techniques.
- We'll learn it’s not just in our programming and languages where we find complexity: our development processes, tools, architectures and organisational cultures can often encourage unnecessary complexity, costing us time, effort and opportunity where simplicity would have had the opposite effect.
- We’ll look at how we can work with incomplete knowledge without adding speculative complexity of so-called future proofing.
- We’ll acknowledge technical debt and neglect for what they are and understand why ‘legacy’ is so often the opposite of ‘simple’, no matter what its backstory. We want to make sure that as well as recognising unnecessary complexity in the small and the large, that we also have an idea of the practices that can help with simplification.
As well as presenting concepts, examining themes and considering code, this masterclass will also offer plenty of opportunity for questions and discussion, plus a couple of small refactoring exercises.
Topic summary
- What kinds of complexity do we find in software systems?
- What are the costs of accidental complexity in code and architecture?
- Where does complexity appear in our organisations and processes?
- The technical debt consequences of long-term technical neglect
- Why and how details matter
- Refactoring as an act of simplification, discovery and evolution
- Examples and consequences of refactoring
- Kinds of refactoring resistance
- The role of testing in keeping code, architecture, delivery and life simple
- How to be the human in the loop when working with AI code generation
- Programming paradigms and their effect on complexity
- Declarative programming versus imperative programming
- Keeping code, architecture and development process lean
- Practices for getting started
For who?
For this workshop, we target developers and architects.
Learning Objectives
As well as presenting concepts, examining themes and considering code, this workshop will also offer plenty of opportunity for questions and discussion, plus as a couple of small coding exercises, offering a good start to your conference week!
Requirements
Participants need to have a development background. They do not need to bring a laptop as all the exercises will be group exercises with flipcharts/whiteboards.