# ezyVet Architecture Plan
## Challenges
* Knowledge/communication bottleneck = too many dependencies = lack of clear responsibility = inability to give clear ownership = ineffective engineering
* Complex legacy code - Difficult to offload ownership, document, test and innovate. Lacking a strategy to tackle this.
* Messy data model, ad-hoc, needs to be untangled.
* Inconsistent language - Creates unnecicary cognitive load, creates barrier between engineering and the rest of the business.
* CI Team - pushing hard tasks that are large scope and short term resolutions
## Plan
### 0-12 Months
* Improve system architectural knowledge, implementing architectural strategy.
* Make large architectural changes possible, through long term thinking/planning.
* Improve our ability to develop & communicate our architecture.
* Make architectural decisions based on a shared understanding.
* Ensuring projects align with architecture.
* Ensuring architecture meets current requiremnts.
* Ensuring architecture supports buisness agility.
* Work towards the sotfware architecture a key aspect of the buisiness strategy
* Establish trust and support from the company for bold initatives.
* Ensure system architecture supports the business strategy.
* Building a cononical data model.
* Used for interservice communication including our federated graph gateway.
* Requires that we define have consistent, unambigious language
* Ubiquitous language
* Ensure the consistent use of terms within the UI, code, data, API & support documentation.
* This will also require some untangling of ambiguios terms. e.g. invoice comments
* This will improve communication in the organisation, which has been a no. 1 issue raised at strategy days. This is particularly important for us as we have a fairly rich set of features to reason about.
* This will reduce cognitive load of our engineers, product, support, documentation & our customers, by using clear & consistent terminology that matches documentation.
* Removing a lot of ambiguity is also a requiremnt cononical data model.
* Optimzing architecture for speed/scale
* Modularising system, decoupling to create independent deployablility
* Reduce feedback loop time.
* Bridging the gap between engineers and customers.
* Interchangability/feature flags for feature experimentation.
* Releasing at different speeds based on requirements.
* Core features can be more cautious. e.g. Invoicing, appointments
* New features can release on demand.
* Increase team autonomy.
* Reduce need for communication/alignment meetings
* Increased ownership over feature.
* Team have deeper understanding of domains.
* Unconstrained/unburdened by the rest of the application.
* Making teams responsible for their own components, having a direct feedback loop. Fix their own issues, paged at any hour to increase a focus on quality.
* Building MVP for expermentation, not constrained by requirements of sustainability.
* If proven valuable we can rebuild to well tested, modular & maintainable code.
* If lacking sufficient value, we can drop the feature.
* Minimal investment to validate, significantly less risk than building the wrong thing the right way.
* Imporving ezyVet piece by piece.
* As we learn new approaches, we can improve each module without the need to do a full rewrite.
* We can experiment with new technologies, withing a limited scope.
* We can potentially keep unsupported legacy components running, without polluting the codebase of activlly supported components.
* Observability
* As our architecture landscape increases in complexity, we need to also invest time in having good monitoring tools.
* To support team ownership, and page those responsible.
* Telemetry
* We need to invest in telemetry to ensure we have fast feedback from features, and allow us to iterate faster.
* Allows us to have better insight into our users behaviours, this will also be improtant as we add pet owner support, whom we may have less intimate contact with.
*
* Optimise API for performance to support conversions as well as pet owner offerings.
* Open API, JSON Schema standards for REST endpoints
* Determine scope of pet owner offering
* Design & build infrastructure
* Adapt ezyVet users/permissions to incorperte pet owners(also suppliers, referring vets).
* All of the above should be considered users.
* Will likely need to add record based access control to do this well.
* Technologies/pardigms/frameworks to invest
* Federated GraphQL API Gateway aka Data Layer
* Allow us to provide a static interface for applications while changing the internal workings of our internal services, i.e. Stangler Pattern (Agility)
* Reducing the blast radius of failures, API can function without other services, we can utilise caching for data retrieval. (Risk Managment)
* Event/Messaging system
* Reduce coupling (Agility)
* Reducing the blast radius of failures, sytems can funcution (Risk Managment)
* UUID
* Decouple database/internal database structure from the API(Agility).
* If we restructure the database, it doesn't matter(Agility)
* If we use a graph db or nosql, the internal id does not matter(Agility, Performance)
* Communicate the story of the record before it is saved to the database(Observability).
* Mechanism to centralise data sources & replicate data between services to reduce communication loads(Agility, Performance).
* Used for handling 3 way merge from concurrent record editing(Customer Value).
* Remove forclass, forid construct, as the UUID provides something that is unique enough.
* File attachments could use this as it has no concern of the user.
* REST API Caching
* We need to eliminate unnecicary database queries.
* As we move to having services responsible for their own data we need to ensure that also provides a good cache invalidation mechanism.
* The gateway will not know about this, but could eventually have it's own caching.
* Contract testing
* https://docs.pact.io/
* Required to ensure we have stability as we move to having indpendent services.
* Observability & Telemetry TODO
* Reactive programming
* TOGAF
* DSL To Support thinking/capturing the right information speak the same language, mental template. BDD reuse for testing. Investigate
### 12-36 Months
* Async API
TODO: Get input from architects @ Idexx, understand what their current strategy is. I think moving to well defined micro services for any products we want to bring forward, particularly those we want to integrate, will help the enterprise be a large scale agile software company.
* Improve enterprise architectural knowledge, incorperate ezyVet into Idexx architecture landscape.
* Discover opportunities to consolidate services
* Align business & technical strategy
* Increased investment into pet owner application.
* Continued modularisation of ezyVet.
* Breaking up ezyVet into services
* Breaking up ezyVet site databases for each service.
* To remove DB level coupling.
* Allow DB to be the right type for the purpose of the service.
* Horizontal scaling.
* And scaling out software engineering.
* Machine Learning
* Investiagate Machine Learning and opportunities for vet practices, pet owners & ezyVet.
* Incorperating identified Machine Learning opportunities into our architecture strategy/technology roadmap.
### 36-72 Months
* Consolidating ezyVet & Idexx services.
* Exploiting dig data & AI.