Good book! At some point in a software developer's career, books about architecture start being more and more important.
Notes from the book:
* Info sources:
** infoq
** dzone refcardz
** thoughtworks technology radar
* Types of architects:
** control-freak arch. (will dictate the implementation of components; the a.'s job should be to create the components (as ideas), and then let the developers to implements them. When transitioning from developer to architect, ppl tend to become control-freaks)
** armchair architect: sets boundaries that are too loose. Possibly hasn't coded in a long time. Does not take into consideration feedback from developers
** effective arch.: somewhere in the middle of those extremes
* "According to Michael, architecturally significant decisions are those decisions that affect the structure, nonfunctional characteristics, dependencies, interfaces, or construction techniques."
* Standards for diagrams:
** C4 model: good for monoliths, not so good for microservices
** Archimate model
* ADR types:
** Enterprise
** Integration
** Application
* ADR (arch. decision records). Author sugests adding 2 sections: Compliance (how we ensure compliance) and Notes (metadata. author, date). Main sections:
** title
** status (proposed, accepted, superseded by)
** context
** decision (and justification)
** consequences
** +compliance
** +notes (author, date of approval)
* Architectural anti-patterns:
** Covering your assets anti-pat. (delaying decisions too much out of fear of making a bad decision). To solve, wait till the last moment, but not longer. Second way is to collaborate with devs.
** Groundhog day anti-p. (when decisions are discussed over and over, mostly because justifications were not properly or completely provided)
** Email-driven architecture anti-p. (don't send architecture decisions in emails, because they're hard to update and not all people care about that email...and info is hard to find, which might lead to groundhog-day anti-p.)
* microservices: if transactions across multiple uservices are required, one should rather refactor the microservice structure, to remove the requirement, rather than to implement distributed transactions - if possible
* space-based architectures are comprised of: processing units, virtualized middleware (to coordinate thr pr.un.), data pumps, data writers (to update the db), data readers (to read from the db, at startup)
* service based architecture: independently running backends, frontends, but 1 single db
* "layer sync-hole" anti-pattern: when there are lots of layers that do nothing but pass stuff along to other layers
* layered architectures are a good default
* "business delegate pattern"?
* DDD doesn't work well with layers
* fallacies of distributed computing: 8 of them
** network is reliable
** latency is 0
** bandwidth is infinite
** the network is secure
** topology never changes
** there is only 1 administrator (for the network)
** transport cost is 0 ($: extra hardware)
** network is homogenous (not all hardware works with other hw, and packets get lost)
**
* distributed architecture styles: service based, event driven, space-based, service oriented, microservices
* Monolithic architecture styles: layered, pipeline, microkernel
* "Architecture katas" -> look them up online, for practicing architecture skills
* "Conaisence" (cə-ney-sens): 2 components are conaiscent, if a change in one, requires a change in the other, for the system to maintain correctness
* Java 1.1 worked only with .class files in folders. Java 1.2 added .jar files, which now allowed for classes with the same fully qualified name to exist in 2 places, overriding the initial intention (for name clashes to be impossible)