-
Framework design
- App Architecture Guide
- A Language for Software Architecture
- An Architect Makes It To The Big Show
- Cross-Cutting Concerns
-
Layer
- Presentation
- Distributed
- Domain service
-
Data access
-
ORM
- NHibernate
- Entity Framework
- Database
- Technical selection
-
Project management
-
Process
- Agile/Scrum/XP
- Monitoring
- Technical debt
-
Design
- Functionality
-
Non functional
- Performance
- Scalability
-
Security
- Authorization
- Authentication
- Disaster Recovery
- Backout Plan
-
Identify risk
- 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?
- The Hidden Architectural Driver
- Clean Architecture
- checklist
- Coding