Are there risks in the project that could be minimized by an early design activity?
1. It’s someone else’s responsibility to do requirements.
2. I learn the domain as I write the code; incrementally.
3. The requirements are already fully understood by the stakeholders.
4. Domains are irrelevant to architecture choice.
5. I already know the requirements.
ARCHITECTURAL PATTERNS
Modules
What is the structure of the actual modular units of code?
How are larger modules decomposed into smaller sub modules?
What other modules are using any given module?
Are the modules structured in layers?
What is the class structure of the modules (e.g. class inheritance)?
Components and Connectors
What is the structure of the actual runtime elements and their various interactions?
How are various processes or threads connected?
Where can threads run concurrently?
Where might threads compete for resources?
How is data produced and consumed by runtime elements?
Allocations
How does the system relate to elements like the hardware, file systems, networks and development teams in the environment?
Where is software deployed (e.g. to what hardware are software elements allocated to)?
How is software mapped to the file system(s)?
Which developers or development teams are assigned to work on a given structure?
patterns
anti-patterns
WHAT MAKES A GOOD ARCHITECTURE?
The architecture should be designed to meet a prioritized list of quality attributes.
The architecture should be driven by the non-functional requirements of the system .
The architecture should be well documented and easily communicated.
The architecture should identify any significant conflicts or tradeoffs, and clearly define the resolutions to these issues.
The architecture should maximize the ability to localize changes to any given part of the system without affecting other parts of the system.
The architecture should, whenever possible, lean on established architectural patterns which have proven most effective at solving the problems the software system is faced with.
The architecture should utilize architectural patterns such that, as often as possible, the system does similar things the same way throughout the entire system.
Bad Design
rigidity
it’s hard to change a part of the system without affection too many other parts of the system
fragile
when making a change, unexpected parts of the system break (introducing bugs)
immobile
Viscosity
Easy to do wrong things, hard to do right things
Needless complexity
complicated class design, overly generalized
Opacity
hard to understand
Layer architect
Principles
SOLID
DRY
KISS
You aren't going to need it.
Law of Demeter
The Cooperative Game Principle
The Peter Principle
Once And Only Once
Design By Contract
open-closed-principle design conventions
All member variables should be private
No global variables
avoid multiple if-then-else or switch-case statements
Principles of Package Design
Reuse/Release Equivalency Principle
Common Reuse Principle (CRP)
Common Closure Principle (CCP)
Acyclic Dependencies Principle (ADP)
Stable Dependencies Principle (SDP)
Stable Abstractions Principle (SAP)
Coupling and Cohesion
Proximity Principle
The boy scout rule
Separation of Concerns (SoC) Principle
Object Oriented Concepts
Data and Logic together
Inheritance is the last option
Composition over Inheritance
Focus on smart data-structure
Abstraction as design mechanism
Class design
coupling
Number of class that your class depends on
Cohesion
the object is focused on doing one thing well
high cohesion and low coupling
quality
Code Quality
Code review
Poor Software Quality
Lack of domain knowledge
Lack of technology knowledge
Unrealistic Schedules
Badly engineered software
measure the system quality
1- Software-quality requirements must be established before the design take place.
2- Software-quality metrics must be identified.
3- Software-quality metrics must be implemented.
4- The results of these metrics must be analyzed.
5- The software-quality metrics must be validated.
Metric
1. Source Lines of Code (SLOC)
2. Bugs per code_section/module/time_period
3. Code Coverage
4. Design/Development Constraints
Class/method length,
Number of methods/attributes in a class,
Method/constructor parameter counts,
Magical number, string usage in code files,
Comment lines percentage etc.
5. Cyclomatic Complexity
Mistakes
Management
1.- Believing that productivity is mainly associated with man power and working hours.
2.- Not managing customer expectations.
3.- Ignoring feedback from developers.
4.- Controlling as opposite of empowering.
5.- Being afraid of making decisions.
Managing crises
Effect on Productivity
Technical Debt
How much is it Really Costing you?
$$$ Making a fundamental mistake in architecture or the platform technology
$$-$$$ Error-prone code
$-$$ The system can’t be easily tested
$-$$ Not taking care of packaging and release and deployment
$-$$ Code that mysteriously works, but nobody is sure how or why
$-$$ Forward and backward compatibility adapters and compromises
$-$$ Out of date libraries and middleware stack
$-$$ Duplicate, copy-and-paste code
$-$$ Known, outstanding bugs in code and unresolved static analysis findings
$-$$ Inefficient design or implementation
$ Inconsistent use of programming idioms and patterns
$ Missing or poor error handling and exception handling.
$0.01 Hard coding, magic numbers, code that isn’t standards compliant, poor element naming, missing comments
$0.01 Out of date documentation
$0.00 Hand-rolled code that could have and should have been done using built-in language features or libraries, or existing framework or common services.
Principle
Quality from the start
Early interface validation
Divide and conquer
Safety net for the code
Confidence = Productivity
Light at the end of the tunnel
process
Harveynash High level design process
Harveynash Detail design process
Harveynash development process
Harveynash build process
Agile
principle
Avoid
must read
TA role
Characteristics of a software architect
Are You a Software Architect?
Software Architecture and Related Concerns
What is a good software architecture in a nutshell?