“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” - C.A.R. Hoare
"The competent programmer is fully aware of the limited size of his own skull. He therefore approaches his task with full humility, and avoids clever tricks like the plague." - Edsger Dijkstra
"Controlling complexity is the essence of computer programming." - Brian Kernighan
SPINE Model
| Needs | Maslow's Hierarchy of Needs | |
|---|---|---|
| Values | Excellence; Competence; Creativity; Correctness; Maintainability; Elegance; | |
| Principles | Loosely Coupling & Cohesiveness; SOLID; | |
| Practices | Design; Unit Testing; XP Practices: Code Reviews; Configurabilty; Standards; Often & Small Releases; | |
| Tools | LINX; Stadium; Basecamp; SVN; |
*when to adapt to tools?
| Loose Coupling & Cohesiveness | cohesion refers to the degree to which the elements of a module belong together. ... Cohesion is often contrasted with coupling, a different concept. High cohesion often correlates with loose coupling, and vice versa. |
|---|---|
| SOLID | SRP - Single Responsibility Principle |
| OCP - Open Close Principle | |
| LSP - Liskov Substitution Principle | |
| ISP - Interface Segregation Principle | |
| DIP - Dependency Inversion Principle | |
| DRY | Don't Repeat Yourself |
| KISS | Keep it simple |
| YAGNI Layers of Abstraction Side effects Temporal Coupling |
You Ain't Gonna Need It Ubiquitous domain language Indirection & Unintended consequences (braking SRP) Also a form of coupling |
Adhering to Principles driven by our values
Software design is the process of implementing software solutions to one or more sets of problems.
IEEE 42010-2011: Systems and software engineering — Architecture description
Architectural Patterns
Design Patterns
GOF
*discussion point WO model and factory patterns
Testing Triangle
TDD
Models
Code Smells
Test Patterns
Using models in software engineering has several advantages, including:
Form Consistent Abstractions
Abstraction is the ability to engage with a concept while safely ignoring some of
its details— handling different details at different levels. Any time you work
with an aggregate, you’re working with an abstraction. If you refer to an object
as a “house” rather than a combination of glass, wood, and nails, you’re making
an abstraction. If you refer to a collection of houses as a “town,” you’re making
another abstraction.
Kructhen 4+1 view model
*do not get stuck here
Golden Master Test Pattern
Input
Output
{fizz buzz example}
Black
Box
{real world example}
Books:
XUnit Test Patterns: Refactoring Test Code - Gerard Meszaros
Refactoring: Improving the Design of Existing Code - Martin Fowler
SOA Patterns - Arnon Rotem-Gal-Oz
C# 3.0 Design Patterns - Judith Bishop
Specifications:
Websites: