- Programming is great
- Software development is the crap bit. You'll spend more time configuring, integrating and faffing rather than writing logic most of the time.
- Test Driven Development makes development easier as it forces you to decouple your code. - Your core logic should be pure, dependency free C\#, Java, Python etc. - Your frameworks and libraries should be on the edge of the system.
- Most people do this for some of their code, e.g. your data access.
- What about the other parts of a system? - Web frontend - REST api's - Console applications - Desktop clients
- Why should we couple our applications with these layers?
- [Hexagonal Architecture](http://alistair.cockburn.us/Hexagonal+architecture) is a solution to limit coupling
- Easily switch out your delivery mechanism, e.g. test runner adapter for testing, HTML adapter for production.
- [Great example](http://silkandspinach.net/2005/03/22/the-middle-hexagon-should-be-independent-of-the-adapters/) from Kevin Rutherford.
- [Excellent video](https://www.youtube.com/watch?v=WpkDN78P884) by Uncle Bob though terminology differs.
- Implementation details should be hidden behind adapters. - Tested manually in the majority of cases - Few integration tests for comfort - Third party code after all.
- Inner hexagon should only communicate via ports (interfaces) - keeps domain pure.
- Last few major projects involved with were due to the delivery mechanism becoming out of date. - Flash to Web - Web to Mobile
- Easier to test
- Easier to change
- CRUD apps - sometimes it's just CRUD.
- Lightweight projects might not need hexagonal architecture
- SOA or Microservices could mean hexagonal architecture actually introduces overhead or complexity - judge on context.