Lint your architecture
David Seddon
david@seddonym.me
Blog: http://seddonym.me
Please note: this talk was given for an
earlier version of Layer Linter.
Check the latest docs before attempting to implement.
layer-linter.readthedocs.io
This talk
1. The shape of a code base
2. A tool to stay in shape
How many modules in
your code base?
a. Less than 10
b. 10s
c. 100s
d. 1,000s +
'Accidental complexity'
How much does accidental complexity
affect your productivity?
a. Not at all
b. A little
c. Somewhat
d. A lot
1. The shape of a
code base
Graph
Directed Graph
# pets/dogs.py
from . import cats
Your modules form a Directed Graph
What is your application
shaped like?
"The goal of an architect is to minimize the human resources required to build and maintain the required system.
"What is it that saps this kind of
people-power? Coupling."
'Uncle Bob' Martin, Clean Architecture, 2018 (p. 160)
Using layers to
reduce coupling
Layers
An ordered
list of Python modules.
No layer import from a layer above it.
Layers between components
Layers within components
Layers between and
within components
Do your applications have
designed dependency flows?
If you do, is the design
always adhered to?
2. A tool to stay
in shape
layer-lint pets
layers.yml
Contract
Contract
Text
$ layer-lint pets
============
Layer Linter
============
---------
Contracts
---------
Analyzed 23 files, 44 dependencies.
-----------------------------------
My layer contract KEPT
Contracts: 1 kept, 0 broken.
Text
$ layer-lint pets
============
Layer Linter
============
---------
Contracts
---------
Analyzed 23 files, 44 dependencies.
-----------------------------------
My layer contract BROKEN
Contracts: 0 kept, 1 broken.
----------------
Broken contracts
----------------
My layer contract
-----------------
1. pets.cats.fur imports pets.dogs.walkies:
pets.cats.fur <-
pets.utils <-
pets.dogs.walkies
Top level layers:
packages:
- pets
layers:
- dogs
- cats
- rabbits
layers.yml
Layers within components:
packages:
- pets.dogs
- pets.cats
- pets.rabbits
layers:
- personality
- traits
- physical
Layers within components:
packages:
- pets.dogs
- pets.cats
- pets.rabbits
layers:
- personality
- traits
- physical
Top level layers:
packages:
- pets
layers:
- dogs
- cats
- rabbits
Text
Top level layers:
packages:
- pets
layers:
- dogs
- cats
- rabbits
whitelisted_paths:
- pets.cats.whiskers <- pets.utils
Whitelisted paths
Upcoming features
-
Closed layers
-
Independent layers
Design
Whitelist
Reduce whitelist
How to begin
Feedback wanted!
In summary
- Think of your code base as a
directed graph.
- Be an architect! Reduce coupling by imposing constraints on this graph.
- Layer Linter can help you do this.
Layer Linter
layer-linter.readthedocs.io
This talk's slides:
slides.com/davidseddon/lint-your-architecture
My blog:
seddonym.me
Work at Octopus Energy:
octopus.energy/careers/
David Seddon
david@seddonym.me @seddonym seddonym.me
Graphs of well
known codebases
http://www.grokcode.com/864/snakefooding-python-code-for-complexity-visualization/
Requests
http://www.grokcode.com/864/snakefooding-python-code-for-complexity-visualization/
Flask
http://www.grokcode.com/864/snakefooding-python-code-for-complexity-visualization/
Celery
http://www.grokcode.com/864/snakefooding-python-code-for-complexity-visualization/
Django
Lint your architecture
By David Seddon
Lint your architecture
Code bases have a nasty habit of becoming a complicated web of circular dependencies. To stop this happening, you need constraints on your project's structure. Meet Layer Linter, a tool to control the dependencies between modules in your Python project. https://layer-linter.readthedocs.io/
- 2,172