Two major sources of design principles are applied in this project:
- I follow the principles of Domain-Driven Design (Eric Evans) which aims to to build software that is valuably involved in the activities of stakeholders. This is achieved through mutual understanding of those activities between the domain experts and the developers. This understanding is communicated through "ubiquitous" language - abstracted and disambiguated, evolving, and mutually agreed terminology that must be used "everywhere".
- I follow the principles of the Clean architecture (Uncle Bob), which divide components into a spectrum that spans "detail" - volatile concrete implementations, and "policy" - stable abstractions focussed on the domain solution. Martin argues that decisions related to detail components should be deferred for as long as possible, but he more broadly makes the case for change and readiness for change regardless of where the change comes from. He considers UI, DB, and frameworks in general to be details. So I embrace these ideas in the knowledge that I've already placed my bets on iOS. The principles of clean architecture, which you'll see laid out in our code below, will allow me to make such significant changes in a straightforward way.
The color coding in the following diagrams adheres to the colors used in this public description of clean architecture.
Each tier represents general areas of responsibility of components and the strict direction of their dependencies going from concrete volatile blue components down to the most abstract and stable yellow components. The outer layers know about any inner layers but not vice versa.
Employed industry best practices to continuously improve coding practices and test-driven development within an agile development framework.
Created proof of concepts to try new technologies and tools before adding them to the current tech stack.
Wrote high-quality, maintainable and reusable code using best practices (unit testing, source control, and design patterns).
Act as a communication bridge between globally distributed teams.
Implement Robust processes to deploy code from a code repository to the cloud.
Took ownership of the success of the team with a "gets things done" attitude.