Ronnie Mitra & Irakli Nadareishvili

alt text

Coding is one of the most expensive activities any software engineering team can undertake. Recoding a functionality that was initially designed based on wrong assumptions is a horrible, time-consuming, and expensive task. (Mitra & Nadareishvili 2021, 53)

Sharing data spaces is a primary killer of independent development and independent deployability, in monoliths. By contrast, in a microservices architecture, independent deployability is emphasized as a core value and consequently, data sharing is prohibited - microservices are never allowed co-own responsibility for a data space in a database. It should be very clear which microservice owns any dataset in the database, or as we commonly state the principle: microservices must own (embed) their data. (Mitra & Nadareishvili 2021, 77)

Data lakes are read-only, query-able data sinks. (Mitra & Nadareishvili 2021, 81)

Using automation and DevOps techniques to build our services improves the predictability, quality, and speed of our microservices deployment. (Mitra & Nadareishvili 2021, 241)

ArgoCD is a GitOps deployment tool, designed to use a Git repository as the source for the desired deployment state for our workloads and services. When it checks a repository that we’ve specified, it determines whether the target state we defined matches the running state in the environment. If it doesn’t, ArgoCD can “synchronize” the deployment to match what we declared in our Helm charts (Mitra & Nadareishvili 2021, 255)

A classic problem in software development is overengineering and premature optimization. This happens when we design software or architecture to resolve a problem that hardly ever occurs. Or when our solution to a predicted problem is more costly than the problem itself will ever be. (Mitra & Nadareishvili 2021, 264)

Writing IaC requires a bit more up-front effort, but the payoff when it comes to changes makes it a worthwhile investment. (Mitra & Nadareishvili 2021, 270)

A complicated system can be very sophisticated and hard to understand, but in its essence is predictable and based on a finite number of well-defined rules. In contrast, a complex system is by essence nondeterministic, composed of many components that interact at a high degree of freedom, and can consequently produce emergent behaviors. (Mitra & Nadareishvili 2021, 284)

O’Reilly