<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Dan Lebrero</title>
    <description>The latest articles on Forem by Dan Lebrero (@danlebrero).</description>
    <link>https://forem.com/danlebrero</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F11997%2FnNY1OQxz.jpg</url>
      <title>Forem: Dan Lebrero</title>
      <link>https://forem.com/danlebrero</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/danlebrero"/>
    <language>en</language>
    <item>
      <title>Book notes: Design It!: From Programmer to Software Architect</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Tue, 28 Mar 2023 21:54:33 +0000</pubDate>
      <link>https://forem.com/danlebrero/book-notes-design-it-from-programmer-to-software-architect-5c10</link>
      <guid>https://forem.com/danlebrero/book-notes-design-it-from-programmer-to-software-architect-5c10</guid>
      <description>&lt;p&gt;These are my notes on &lt;a href="https://amzn.to/3q8oElm" rel="noopener noreferrer"&gt;Design It!: From Programmer to Software Architect&lt;/a&gt; by &lt;a href="https://twitter.com/michaelkeeling" rel="noopener noreferrer"&gt;Michael Keeling&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;"From Programmer to Software Architect" is a spot on subtitle.&lt;/p&gt;

&lt;h1&gt;
  
  
  Key Insights
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;SW design is a constant struggle to find the right balance between the things you want and the reality you must accept.&lt;/li&gt;
&lt;li&gt;Every team has at least one architect. The best teams have several.&lt;/li&gt;
&lt;li&gt;For every SW system you build, briefly describe the system and what you learned during your time developing it.&lt;/li&gt;
&lt;li&gt;Design Thinking Principles (From &lt;a href="https://amzn.to/3taqfJb" rel="noopener noreferrer"&gt;Design Thinking: Understand – Improve – Apply&lt;/a&gt;):

&lt;ol&gt;
&lt;li&gt;All design is social in nature: for and with people.&lt;/li&gt;
&lt;li&gt;Preserve ambiguity:

&lt;ul&gt;
&lt;li&gt;Minimalist architecture:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.bredemeyer.com/pdf_files/MinimalistArchitecture.PDF" rel="noopener noreferrer"&gt;Less is More with Minimalist Architecture&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;All design is redesign.&lt;/li&gt;

&lt;li&gt;Make ideas tangible to facilitate communication.&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;Emphasize:

&lt;ol&gt;
&lt;li&gt;Treat solutions as experiments.&lt;/li&gt;
&lt;li&gt;Focus on reducing risks.&lt;/li&gt;
&lt;li&gt;Work to simplify problems.&lt;/li&gt;
&lt;li&gt;Iterate quickly to learn quickly.&lt;/li&gt;
&lt;li&gt;Think about the problem and solution at the same time.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Use risk to decide what to focus on.&lt;/li&gt;

&lt;li&gt;Architecturally Significant Requirements:

&lt;ol&gt;
&lt;li&gt;Constraints:

&lt;ul&gt;
&lt;li&gt;Well-chosen constraints simplify the problem.&lt;/li&gt;
&lt;li&gt;Early design decisions can become constraints in the future.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Influential functional requirements:

&lt;ul&gt;
&lt;li&gt;Identifying influential functional requirements is equal part of art and science.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Quality Attributes.&lt;/li&gt;
&lt;li&gt;Others:

&lt;ul&gt;
&lt;li&gt;Tech trends.&lt;/li&gt;
&lt;li&gt;Architecture skills, knowledge.&lt;/li&gt;
&lt;li&gt;Team skills, knowledge.&lt;/li&gt;
&lt;li&gt;Team organization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Our confidence in a decision increases after seeing multiple alternatives.&lt;/li&gt;

&lt;li&gt;Decision matrix: Do not use numbers as they give a false sense of confidence and precision.&lt;/li&gt;

&lt;li&gt;Complexity is an inevitable by-product of every successful software system.&lt;/li&gt;

&lt;li&gt;Discussion lacking in disagreement may seem like positive progress, but it is more likely to be the opposite.&lt;/li&gt;

&lt;li&gt;Sometimes a simple table is all that is needed.&lt;/li&gt;

&lt;li&gt;Precision gets in the way of communication: accurate, not precise.&lt;/li&gt;

&lt;li&gt;A good-looking document tells readers the content is trustworthy and was created by a professional.&lt;/li&gt;

&lt;li&gt;Sometimes your pile of rejected decisions can be more telling than a lengthy explanation.&lt;/li&gt;

&lt;li&gt;Keep design authority when risks of failure are high.&lt;/li&gt;

&lt;li&gt;The discussion is often more important than the option picked.&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://medium.com/the-xplane-collection/updated-empathy-map-canvas-46df22df3c8a" rel="noopener noreferrer"&gt;Empathy map&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://agilewarrior.wordpress.com/2010/11/06/the-agile-inception-deck/" rel="noopener noreferrer"&gt;The Agile Inception Deck&lt;/a&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  All activities
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Understand
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Participants&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Choose one thing&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;All stakeholders&lt;/td&gt;
&lt;td&gt;Clear prioritization and disagreement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empathy map&lt;/td&gt;
&lt;td&gt;10-30m&lt;/td&gt;
&lt;td&gt;Solo or 3-5. Devs + Arch&lt;/td&gt;
&lt;td&gt;For the team to develop empathy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goal-Question-Metric workshop&lt;/td&gt;
&lt;td&gt;15-90m&lt;/td&gt;
&lt;td&gt;1-5 people.&lt;/td&gt;
&lt;td&gt;Prioritized metrics to gather.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interview stakeholders&lt;/td&gt;
&lt;td&gt;30-60m per interview&lt;/td&gt;
&lt;td&gt;1-2-1 or small stakeholder group&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List assumptions&lt;/td&gt;
&lt;td&gt;15-30m&lt;/td&gt;
&lt;td&gt;Whole team in 2-5 groups&lt;/td&gt;
&lt;td&gt;Take assumptions out of the shadows.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mini-Quality attributes workshop&lt;/td&gt;
&lt;td&gt;90-180m&lt;/td&gt;
&lt;td&gt;Arch + 3-5 stakeholders&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Point-of-View mad lib&lt;/td&gt;
&lt;td&gt;30-45m&lt;/td&gt;
&lt;td&gt;1-3 people. Any stakeholder&lt;/td&gt;
&lt;td&gt;Summarize business goals and other needs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response measure straw man&lt;/td&gt;
&lt;td&gt;Combine with other&lt;/td&gt;
&lt;td&gt;Architect prepares&lt;/td&gt;
&lt;td&gt;Get conversation moving.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stakeholder map&lt;/td&gt;
&lt;td&gt;30-45m&lt;/td&gt;
&lt;td&gt;1-25. Whole team + stakeholders&lt;/td&gt;
&lt;td&gt;Relations and interactions.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Explore
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Participants&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Personify the architecture&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;It is ok to feel silly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture flip book&lt;/td&gt;
&lt;td&gt;30-45m&lt;/td&gt;
&lt;td&gt;1-3 people&lt;/td&gt;
&lt;td&gt;Record all steps on design iteration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component responsibility collaborator cards&lt;/td&gt;
&lt;td&gt;30-90m&lt;/td&gt;
&lt;td&gt;Solo or 3-5&lt;/td&gt;
&lt;td&gt;Propose architectural elements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concept map&lt;/td&gt;
&lt;td&gt;30-60m&lt;/td&gt;
&lt;td&gt;1-3 technical stakeholders&lt;/td&gt;
&lt;td&gt;Uncover missing domain concepts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Divide and conquer&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Groups of 2-4&lt;/td&gt;
&lt;td&gt;To cover a lot of ground in parallel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event Storming&lt;/td&gt;
&lt;td&gt;90m&lt;/td&gt;
&lt;td&gt;2-12. Expert + dev team&lt;/td&gt;
&lt;td&gt;Identify domain events.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Group Posters&lt;/td&gt;
&lt;td&gt;20-30m&lt;/td&gt;
&lt;td&gt;Groups 2-5 people&lt;/td&gt;
&lt;td&gt;To summarize outcomes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Round-Robin design&lt;/td&gt;
&lt;td&gt;15-45m&lt;/td&gt;
&lt;td&gt;3-12 tech stakeholders&lt;/td&gt;
&lt;td&gt;Combine ideas + build consensus.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whiteboard Jam&lt;/td&gt;
&lt;td&gt;Up to the group&lt;/td&gt;
&lt;td&gt;3-5 tech stakeholders&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Make
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture Decision Records&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture haiku&lt;/td&gt;
&lt;td&gt;One-page uber-terse summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context diagram&lt;/td&gt;
&lt;td&gt;Agreement with system scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Greatest hits reading list&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inception deck&lt;/td&gt;
&lt;td&gt;10 important questions at the start of a new project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modular decomposition diagram&lt;/td&gt;
&lt;td&gt;Tree diagram that shows relationships at different granularities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paths not taken&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototype to learn or decide&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sequential diagram&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System metaphor&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Evaluate
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Participants&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture Briefing&lt;/td&gt;
&lt;td&gt;45-60m preparation. 30m present. 30m questions&lt;/td&gt;
&lt;td&gt;Arch + wide audience&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code review&lt;/td&gt;
&lt;td&gt;Ongoing&lt;/td&gt;
&lt;td&gt;2 to whole team&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision Matrix&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Arch + Stakeholders&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observer Behaviour&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Observability in production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Question-Comment-Concern&lt;/td&gt;
&lt;td&gt;30-90m&lt;/td&gt;
&lt;td&gt;Whole team&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk storming&lt;/td&gt;
&lt;td&gt;60-90m&lt;/td&gt;
&lt;td&gt;3-7 devs&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sanity Check&lt;/td&gt;
&lt;td&gt;5-10m&lt;/td&gt;
&lt;td&gt;Whole team&lt;/td&gt;
&lt;td&gt;Pop quiz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scenario walk-through&lt;/td&gt;
&lt;td&gt;20-30m per quality attribute&lt;/td&gt;
&lt;td&gt;3-7 people&lt;/td&gt;
&lt;td&gt;Use early&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sketch and Compare&lt;/td&gt;
&lt;td&gt;20-30m&lt;/td&gt;
&lt;td&gt;3-5 people&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
Part I - Introducing Software Architecture

&lt;ul&gt;
&lt;li&gt;Chapter 1 - Become a Software Architect&lt;/li&gt;
&lt;li&gt;Chapter 2 - Design Thinking Fundamentals&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Part II - Architecture Design Fundamentals

&lt;ul&gt;
&lt;li&gt;Chapter 3 - Devise a Design Strategy&lt;/li&gt;
&lt;li&gt;Chapter 4 - Empathize with Stakeholders&lt;/li&gt;
&lt;li&gt;Chapter 5 - Dig for Architecturally Significant Requirements (ASR)&lt;/li&gt;
&lt;li&gt;Chapter 6 - Choose an Architecture (Before It Chooses You)&lt;/li&gt;
&lt;li&gt;Chapter 7 - Create a Foundation with Patterns&lt;/li&gt;
&lt;li&gt;Chapter 8 - Manage Complexity with Meaningful Models&lt;/li&gt;
&lt;li&gt;Chapter 9 - Host an Architecture Design Studio&lt;/li&gt;
&lt;li&gt;Chapter 10 - Visualize Design Decisions&lt;/li&gt;
&lt;li&gt;Chapter 11 - Describe the Architecture&lt;/li&gt;
&lt;li&gt;Chapter 12 - Give the Architecture a Report Card&lt;/li&gt;
&lt;li&gt;Chapter 13 - Empower the Architects of Your Team&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Part III - The Architect's Toolbox

&lt;ul&gt;
&lt;li&gt;Chapter 14 - Activities to Understand the Problem&lt;/li&gt;
&lt;li&gt;Chapter 15 - Activities to Explore Potential Solutions&lt;/li&gt;
&lt;li&gt;Chapter 16 - Activities to Make the Design Tangible&lt;/li&gt;
&lt;li&gt;Chapter 17 - Activities to Evaluate Design Options&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part I - Introducing Software Architecture
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 1 - Become a Software Architect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What architects do?

&lt;ol&gt;
&lt;li&gt;Define the problem from an engineering perspective.&lt;/li&gt;
&lt;li&gt;Partition the system and assign responsibilities.&lt;/li&gt;
&lt;li&gt;Keep an eye on the bigger picture:

&lt;ul&gt;
&lt;li&gt;System as a whole.&lt;/li&gt;
&lt;li&gt;SW design is a constant struggle to find the right balance between the things you want and the reality you must accept.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Decide trade-offs among quality attributes.&lt;/li&gt;

&lt;li&gt;Manage technical debt.&lt;/li&gt;

&lt;li&gt;Grow the team's architecture skills:

&lt;ul&gt;
&lt;li&gt;Architecture design is a social activity.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;A system's software architecture is the set of significant design decisions about how the software is organized to promote desired quality attributes and other properties.&lt;/li&gt;

&lt;li&gt;Software structure's elements and relations:

&lt;ol&gt;
&lt;li&gt;Module: structure that exists at design time (class, DB table).&lt;/li&gt;
&lt;li&gt;Component and connector (C&amp;amp;C): exits at runtime (object, process).&lt;/li&gt;
&lt;li&gt;Allocations: how modules and C&amp;amp;C elements correspond to each other.

&lt;ul&gt;
&lt;li&gt;Aka: mapping structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Quality attribute is any externally visible characteristic by which stakeholders judge a SW system's goodness.&lt;/li&gt;

&lt;li&gt;Every team has at least one architect. The best teams have several.&lt;/li&gt;

&lt;li&gt;For every SW system you build, briefly describe the system and what you learned during your time developing it.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 2 - Design Thinking Fundamentals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Design thinking: problem-solving approach that puts humans at the center.&lt;/li&gt;
&lt;li&gt;Principles (From &lt;a href="https://amzn.to/3taqfJb" rel="noopener noreferrer"&gt;Design Thinking: Understand – Improve – Apply&lt;/a&gt;):

&lt;ol&gt;
&lt;li&gt;All design is social in nature:

&lt;ul&gt;
&lt;li&gt;For and with people.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Preserve ambiguity:

&lt;ul&gt;
&lt;li&gt;Minimalist architecture:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.bredemeyer.com/pdf_files/MinimalistArchitecture.PDF" rel="noopener noreferrer"&gt;Less is More with Minimalist Architecture&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Only focus on how high-priority quality attributes are achieved.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;All design is redesign.&lt;/li&gt;

&lt;li&gt;Make ideas tangible to facilitate communication.&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;To design an architecture:

&lt;ol&gt;
&lt;li&gt;Pick a mindset.&lt;/li&gt;
&lt;li&gt;Pick a practice within that mindset.&lt;/li&gt;
&lt;li&gt;Apply practice to learn something new.&lt;/li&gt;
&lt;li&gt;Goto (1).&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Design mindsets:

&lt;ol&gt;
&lt;li&gt;Understand:

&lt;ul&gt;
&lt;li&gt;Requires empathy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Explore.&lt;/li&gt;
&lt;li&gt;Make.&lt;/li&gt;
&lt;li&gt;Evaluate.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part II - Architecture Design Fundamentals
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 3 - Devise a Design Strategy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Emphasize:

&lt;ol&gt;
&lt;li&gt;Treat solutions as experiments.&lt;/li&gt;
&lt;li&gt;Focus on reducing risks.&lt;/li&gt;
&lt;li&gt;Work to simplify problems.&lt;/li&gt;
&lt;li&gt;Iterate quickly to learn quickly.&lt;/li&gt;
&lt;li&gt;Think about the problem and solution at the same time.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;How much design up front:

&lt;ul&gt;
&lt;li&gt;Barry Boehm, Architecting: how much and when. Chapter 10 of &lt;a href="https://amzn.to/3JS2POT" rel="noopener noreferrer"&gt;Making Software&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Total project time == dev time + architecture + rework.&lt;/li&gt;
&lt;li&gt;Architecture reduces rework time.&lt;/li&gt;
&lt;li&gt;Bigger systems benefit the most from more up-front architecture work.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://cosysmo.mit.edu" rel="noopener noreferrer"&gt;COSYSMO&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/COCOMO" rel="noopener noreferrer"&gt;COCOMO II&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a&gt;&lt;/a&gt;Use risk to decide what to focus on:

&lt;ul&gt;
&lt;li&gt;[conditions] might [consequences]&lt;/li&gt;
&lt;li&gt;Deal with risk:

&lt;ol&gt;
&lt;li&gt;Reduce probability.&lt;/li&gt;
&lt;li&gt;Reduce impact.&lt;/li&gt;
&lt;li&gt;Push out the time frame of the risk.&lt;/li&gt;
&lt;li&gt;Remove condition.&lt;/li&gt;
&lt;li&gt;Accept it and do nothing.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Which mindset:

&lt;ul&gt;
&lt;li&gt;Understand: risk is about problem.&lt;/li&gt;
&lt;li&gt;Explore: risk is about solution.

&lt;ul&gt;
&lt;li&gt;Have you seen enough solution alternatives?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Make: risk is about communication.

&lt;ul&gt;
&lt;li&gt;Do stakeholders fully understand design and architecture?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Evaluate: risk involves a design decision or the design's overall fit.

&lt;ul&gt;
&lt;li&gt;Do we need to make a design decision?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Create a design plan.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 4 - Empathize with Stakeholders
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a stakeholder map with stakeholders, stakeholders groups and their relationship.&lt;/li&gt;
&lt;li&gt;Record business goal statements:

&lt;ul&gt;
&lt;li&gt;Subject, outcome, context.&lt;/li&gt;
&lt;li&gt;Outcome: measurable.&lt;/li&gt;
&lt;li&gt;Context: insightful and not obvious.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Most systems only have three to five business goals.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 5 - Dig for Architecturally Significant Requirements (ASR)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;4 Categories:

&lt;ol&gt;
&lt;li&gt;Constraints:

&lt;ul&gt;
&lt;li&gt;Unchangeable. Non-negotiable.&lt;/li&gt;
&lt;li&gt;Well-chosen constraints simplify the problem.&lt;/li&gt;
&lt;li&gt;Technical: programming lang, platforms, components, technology.&lt;/li&gt;
&lt;li&gt;Business: team structure, schedule, budget, legal.&lt;/li&gt;
&lt;li&gt;Early design decisions can become constraints in the future.&lt;/li&gt;
&lt;li&gt;Keep a XLS: constraint, origin, type, context.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Influential functional requirements (FR):

&lt;ul&gt;
&lt;li&gt;Identifying influential functional requirements is equal part of art and science.&lt;/li&gt;
&lt;li&gt;Sketch notional architecture.&lt;/li&gt;
&lt;li&gt;Identify classes of requirements:

&lt;ul&gt;
&lt;li&gt;Group FR with the same architecture elements (like persistence).&lt;/li&gt;
&lt;li&gt;FR that seem difficult to implement.&lt;/li&gt;
&lt;li&gt;High-value, high-priority FR.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Try each class of requirements against the notional architecture:

&lt;ul&gt;
&lt;li&gt;If it is not obvious how to implement, the it might be an influential FR.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Others:

&lt;ul&gt;
&lt;li&gt;Tech trends.&lt;/li&gt;
&lt;li&gt;Architecture skills, knowledge.&lt;/li&gt;
&lt;li&gt;Team skills, knowledge.&lt;/li&gt;
&lt;li&gt;Team organization.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Quality Attributes:

&lt;ul&gt;
&lt;li&gt;Use quality attribute scenarios:

&lt;ul&gt;
&lt;li&gt;Parts:

&lt;ul&gt;
&lt;li&gt;Stimulus: event that triggers the scenario.&lt;/li&gt;
&lt;li&gt;Source: who.&lt;/li&gt;
&lt;li&gt;Artifact: part of the system.&lt;/li&gt;
&lt;li&gt;Response: externally visible action by the artifact as result of the stimulus.&lt;/li&gt;
&lt;li&gt;Response measure (Success criteria, Specific and measurable).&lt;/li&gt;
&lt;li&gt;Environment context: "normal", peak load, failure condition.&lt;/li&gt;
&lt;li&gt;Keep in XLS:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quality Attribute&lt;/th&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Availability&lt;/td&gt;
&lt;td&gt;When DB does not respond, respond with stale data within 3 secs&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Build an architect significant requirements doc:

&lt;ul&gt;
&lt;li&gt;Purpose and scope.&lt;/li&gt;
&lt;li&gt;Intended audience.&lt;/li&gt;
&lt;li&gt;Business context.&lt;/li&gt;
&lt;li&gt;Quality attribute requirements:

&lt;ul&gt;
&lt;li&gt;Top scenarios.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Influential FR:

&lt;ul&gt;
&lt;li&gt;Top users or user persona.&lt;/li&gt;
&lt;li&gt;Use cases or user stories.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Appendix A: Glossary.&lt;/li&gt;

&lt;li&gt;Appendix B: Quality Attributes Taxonomy.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 6 - Choose an Architecture (Before It Chooses You)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Our confidence in a decision increases after seeing multiple alternatives.&lt;/li&gt;
&lt;li&gt;You need to explore:

&lt;ol&gt;
&lt;li&gt;Architecture elements and their responsibilities.&lt;/li&gt;
&lt;li&gt;How elements interact with each other. Their interfaces.&lt;/li&gt;
&lt;li&gt;Understand the domain.&lt;/li&gt;
&lt;li&gt;Tech and framework that promote quality attributes.&lt;/li&gt;
&lt;li&gt;How app will be deployed.&lt;/li&gt;
&lt;li&gt;Look at past designs.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Decision matrix:

&lt;ul&gt;
&lt;li&gt;I personally like text + color (red, white, green).&lt;/li&gt;
&lt;li&gt;Do not use numbers as they give a false sense of confidence and precision.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Option A&lt;/th&gt;
&lt;th&gt;Option B&lt;/th&gt;
&lt;th&gt;Option C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Property 1&lt;/td&gt;
&lt;td&gt;promotes&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Property 2&lt;/td&gt;
&lt;td&gt;inhibits&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Property 3&lt;/td&gt;
&lt;td&gt;neutral&lt;/td&gt;
&lt;td&gt;o&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Create an element responsibility catalog:

&lt;ul&gt;
&lt;li&gt;Assign to each element the influential functional requirement.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 7 - Create a Foundation with Patterns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;See &lt;a href="https://danlebrero.com/2021/11/17/fundamentals-of-software-architecture-summary/#content" rel="noopener noreferrer"&gt;Fundamentals of Software Architecture&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 8 - Manage Complexity with Meaningful Models
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Complexity is an inevitable by-product of every successful software system.&lt;/li&gt;
&lt;li&gt;Abstractions help us focus on specific details at the expense of others.&lt;/li&gt;
&lt;li&gt;Good architecture models:

&lt;ul&gt;
&lt;li&gt;Establish the vocabulary of design.&lt;/li&gt;
&lt;li&gt;Direct attention to interesting details.&lt;/li&gt;
&lt;li&gt;Allows to reason about quality attributes.&lt;/li&gt;
&lt;li&gt;Captures the architect's intention.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Design a meta-model: concepts and rules to use those concepts.&lt;/li&gt;

&lt;li&gt;Building models into the code:

&lt;ul&gt;
&lt;li&gt;It is possible to shrink the model-code gap, but it cannot be closed completely.&lt;/li&gt;
&lt;li&gt;Use architecture vocabulary.&lt;/li&gt;
&lt;li&gt;Organize code following architecture elements.&lt;/li&gt;
&lt;li&gt;Enforce relations, so that it becomes impossible to violate the architecture.&lt;/li&gt;
&lt;li&gt;Add comments.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 9 - Host an Architecture Design Studio
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Design studio encourages group collaboration and has strict time constraints to help the team see a broad range of ideas in a short time frame.&lt;/li&gt;
&lt;li&gt;Creates buy-in of everybody involved.&lt;/li&gt;
&lt;li&gt;Outcomes:

&lt;ul&gt;
&lt;li&gt;Things to make.&lt;/li&gt;
&lt;li&gt;Things to research more.&lt;/li&gt;
&lt;li&gt;New open questions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Typically, few hours to a day.&lt;/li&gt;

&lt;li&gt;Steps:

&lt;ol&gt;
&lt;li&gt;Prepare:

&lt;ul&gt;
&lt;li&gt;Business and workshop goals.&lt;/li&gt;
&lt;li&gt;Quality attributes.&lt;/li&gt;
&lt;li&gt;ASRs.&lt;/li&gt;
&lt;li&gt;Choose participants:

&lt;ul&gt;
&lt;li&gt;3-10.&lt;/li&gt;
&lt;li&gt;Diverse background.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Discussion lacking in disagreement may seem like positive progress, but it is more likely to be the opposite.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kick-off:

&lt;ul&gt;
&lt;li&gt;Share context.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create:

&lt;ul&gt;
&lt;li&gt;Choose design activity:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://mydemolife.blogspot.com/2008/12/tell-show-tell-technique-what-else.html" rel="noopener noreferrer"&gt;Tell-show-tell&lt;/a&gt; to explain the activity.&lt;/li&gt;
&lt;li&gt;Time boxed. Minimum 5 mins.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Share:

&lt;ul&gt;
&lt;li&gt;3-5 mins.&lt;/li&gt;
&lt;li&gt;Only main points.&lt;/li&gt;
&lt;li&gt;No questions or comments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Critique:

&lt;ul&gt;
&lt;li&gt;Specific.&lt;/li&gt;
&lt;li&gt;Focus on facts.&lt;/li&gt;
&lt;li&gt;Point also good things.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Iterate:

&lt;ul&gt;
&lt;li&gt;Go to 3.&lt;/li&gt;
&lt;li&gt;Tweak the group dynamics.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Close:

&lt;ul&gt;
&lt;li&gt;Reflect.&lt;/li&gt;
&lt;li&gt;Decide specific actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Use a parking lot to record interesting ideas for other time, and keep the workshop moving.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 10 - Visualize Design Decisions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes a simple table is all that is needed.&lt;/li&gt;
&lt;li&gt;Sometimes precision gets in the way of communication:

&lt;ul&gt;
&lt;li&gt;Accurate, not precise.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tips:

&lt;ul&gt;
&lt;li&gt;Always include a legend.&lt;/li&gt;
&lt;li&gt;Add a descriptive title.&lt;/li&gt;
&lt;li&gt;Highlight patterns.&lt;/li&gt;
&lt;li&gt;Be consistent.&lt;/li&gt;
&lt;li&gt;Provide descriptive prose, and/or text annotations.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 11 - Describe the Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Which architecture description approach should I use?
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fdesign-it%2Fdescribe-architecture.jpg" alt="describe architecture"&gt;
&lt;/li&gt;
&lt;li&gt;Tribal:

&lt;ul&gt;
&lt;li&gt;Oral tradition, informal sketching, story telling.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Communal:

&lt;ul&gt;
&lt;li&gt;When you find yourself telling the same story to more than a few people.&lt;/li&gt;
&lt;li&gt;Architecture Haiku, ADR, architecturally evident coding style.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Formal:

&lt;ul&gt;
&lt;li&gt;High-risk systems or architecture decisions.&lt;/li&gt;
&lt;li&gt;Traditional SW architecture decision (SAD).&lt;/li&gt;
&lt;li&gt;Templates:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=484159" rel="noopener noreferrer"&gt;SEI views and beyond&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/ISO/IEC_42010" rel="noopener noreferrer"&gt;ISO/IEC/IEEE 42010&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Always keep the audience in mind:

&lt;ul&gt;
&lt;li&gt;Use &lt;a href="https://www.nngroup.com/articles/empathy-mapping/" rel="noopener noreferrer"&gt;empathy map&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;A good-looking document tells readers the content is trustworthy and was created by a professional.&lt;/li&gt;

&lt;li&gt;Establish viewpoints:

&lt;ul&gt;
&lt;li&gt;Arch from the point of view of a related set of stakeholder concerns.&lt;/li&gt;
&lt;li&gt;Example standard viewpoints:

&lt;ul&gt;
&lt;li&gt;SEI views and beyond.&lt;/li&gt;
&lt;li&gt;Simon Brown's &lt;a href="https://c4model.com/" rel="noopener noreferrer"&gt;C4 model&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Phillipe Krutchen's &lt;a href="https://ieeexplore.ieee.org/document/469759" rel="noopener noreferrer"&gt;4+1 view model&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Usually organized around quality attributes or stakeholder needs.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Explain rationale:

&lt;ul&gt;
&lt;li&gt;Sometimes your pile of rejected decisions can be more telling than a lengthy explanation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 12 - Give the Architecture a Report Card
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Benefits of evaluation:

&lt;ul&gt;
&lt;li&gt;Educate team.&lt;/li&gt;
&lt;li&gt;Create buy-in.&lt;/li&gt;
&lt;li&gt;Reduce delivery risks.&lt;/li&gt;
&lt;li&gt;Improve architecture.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Design Rubric:

&lt;ul&gt;
&lt;li&gt;2 parts:

&lt;ol&gt;
&lt;li&gt;Criteria:

&lt;ul&gt;
&lt;li&gt;ASR as a guide.&lt;/li&gt;
&lt;li&gt;Important, essential, distinct, observable and measurable, precise and unambiguous.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Rating:

&lt;ul&gt;
&lt;li&gt;Select scale:

&lt;ul&gt;
&lt;li&gt;1-2: all or nothing. Few reviewers.&lt;/li&gt;
&lt;li&gt;1-3: minimum acceptable threshold. Multiple reviewers.&lt;/li&gt;
&lt;li&gt;1-4: Detailed feedback desired.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Discuss any "1" score, even if the average is acceptable.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Organize an architecture evaluation workshop:

&lt;ul&gt;
&lt;li&gt;Steps: prepare, prime reviewers, assess, analyze, follow-up.&lt;/li&gt;
&lt;li&gt;It is important to understand why the design is fit (or not).&lt;/li&gt;
&lt;li&gt;Great designs can always be improved.&lt;/li&gt;
&lt;li&gt;Gold standard:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Architecture_tradeoff_analysis_method" rel="noopener noreferrer"&gt;ATAM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;See &lt;a href="https://amzn.to/3f7XMLS" rel="noopener noreferrer"&gt;Software Architecture in Practice&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Multi-day or multi-week.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Evaluate early, often, continuously:

&lt;ul&gt;
&lt;li&gt;Risks.&lt;/li&gt;
&lt;li&gt;Unknowns.&lt;/li&gt;
&lt;li&gt;Problems.&lt;/li&gt;
&lt;li&gt;Gaps.&lt;/li&gt;
&lt;li&gt;Arch erosion.&lt;/li&gt;
&lt;li&gt;Contextual drift.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Start with low ceremony methods.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 13 - Empower the Architects of Your Team
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Modern SW dev teams need a different kind of leader than the traditional top-down architect.

&lt;ul&gt;
&lt;li&gt;Coach, mentor, technical guru.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Teams who embrace the idea of SW architect as a way of thinking instead of as a role, produce better SW:

&lt;ul&gt;
&lt;li&gt;More eyes.&lt;/li&gt;
&lt;li&gt;Team buy-in. Ownership.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Create opportunities for safe practice:

&lt;ul&gt;
&lt;li&gt;Pair design.&lt;/li&gt;
&lt;li&gt;Create scaffolding:

&lt;ol&gt;
&lt;li&gt;Build templates for delegated work.&lt;/li&gt;
&lt;li&gt;Provide feedback during peer reviews.&lt;/li&gt;
&lt;li&gt;Create checklists.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Introduce architectural guide rails:

&lt;ul&gt;
&lt;li&gt;Guide rails (constraints) decreases the chances to mess up the architecture.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Host information sessions.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Keep design authority when risks of failure are high.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part III - The Architect's Toolbox
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 14 - Activities to Understand the Problem
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Choose One Thing:

&lt;ul&gt;
&lt;li&gt;Discuss priorities by presenting an extreme choice.&lt;/li&gt;
&lt;li&gt;If you only get one thing, what will it be?&lt;/li&gt;
&lt;li&gt;Clear prioritization.&lt;/li&gt;
&lt;li&gt;Clear disagreement.&lt;/li&gt;
&lt;li&gt;The discussion is often more important than the option picked.&lt;/li&gt;
&lt;li&gt;Use early.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Empathy Map:

&lt;ul&gt;
&lt;li&gt;Brainstorm and record responsibilities, thoughts and feelings for the team to develop empathy.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/the-xplane-collection/updated-empathy-map-canvas-46df22df3c8a" rel="noopener noreferrer"&gt;Updated version&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Goal-Question-Metric Workshop:

&lt;ul&gt;
&lt;li&gt;Identify metrics and response measures to connect data with business goals.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fdesign-it%2Fgoal-question-metric.png" alt="goal-question-metric"&gt;
&lt;/li&gt;
&lt;li&gt;Question to answer to know if we have met the goal.&lt;/li&gt;
&lt;li&gt;Result: prioritized data and metrics to gather.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Interview Stakeholders:

&lt;ul&gt;
&lt;li&gt;Unstructured interviews should still have a checklist.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;List assumptions:

&lt;ul&gt;
&lt;li&gt;Take assumptions out of the shadows.&lt;/li&gt;
&lt;li&gt;Write down everything mentioned, even obvious ones.&lt;/li&gt;
&lt;li&gt;Pause to discuss surprising assumptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mini-Quality Attribute workshop:

&lt;ul&gt;
&lt;li&gt;Prepare:

&lt;ol&gt;
&lt;li&gt;Quality attribute taxonomy (max 7).&lt;/li&gt;
&lt;li&gt;Quality attribute scenario templates.&lt;/li&gt;
&lt;li&gt;Quality attribute web.&lt;/li&gt;
&lt;li&gt;As homework, refine top raw quality scenarios. Present in a follow-up meeting.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Point-of-View Mad Lib:

&lt;ul&gt;
&lt;li&gt;Summarize business goals and other needs.&lt;/li&gt;
&lt;li&gt;Template:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fdesign-it%2Fpoint-of-view-mad-lib-template.png" alt="point of view mad lib"&gt;
&lt;/li&gt;
&lt;li&gt;Consensus is not required.&lt;/li&gt;
&lt;li&gt;Outcome focused.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Response Measure Straw Man:

&lt;ul&gt;
&lt;li&gt;Give stakeholders something to beat up until they arrive at their own answers.&lt;/li&gt;
&lt;li&gt;Response either:

&lt;ul&gt;
&lt;li&gt;Honest: if you are confident.&lt;/li&gt;
&lt;li&gt;Outrageous: to find boundaries.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Stakeholder Map:

&lt;ul&gt;
&lt;li&gt;To visualize relationships, hierarchies and interactions between people involved or impacted by the system.&lt;/li&gt;
&lt;li&gt;Once completed ask who are the most important stakeholders.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 15 - Activities to Explore Potential Solutions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Personify the architecture:

&lt;ul&gt;
&lt;li&gt;Give it human qualities so that you can explore interactions among elements.&lt;/li&gt;
&lt;li&gt;How it "reacts" or "feel", make it memorable through story telling.&lt;/li&gt;
&lt;li&gt;It is ok to feel a little silly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Architecture flip book:

&lt;ul&gt;
&lt;li&gt;Record every step of the design journey so others can follow along afterwards.&lt;/li&gt;
&lt;li&gt;Sketch + notes about incremental changes.&lt;/li&gt;
&lt;li&gt;Teach others how to think about design and modeling.&lt;/li&gt;
&lt;li&gt;On a slide deck, keep copying the last slide and editing it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Component responsibility collaborator cards:

&lt;ul&gt;
&lt;li&gt;Propose architectural elements, their responsibilities and how they come together to form a view of the architecture.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fdesign-it%2Fcrc-card.png" alt="crc card"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Concept map:

&lt;ul&gt;
&lt;li&gt;Visualize how concepts in the domain relate to one another.&lt;/li&gt;
&lt;li&gt;Helps to uncover missing, hidden, or implied domain concepts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Divide and conquer:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fdesign-it%2Fdivide-and-conquer.png" alt="divide and conquer"&gt;

&lt;ul&gt;
&lt;li&gt;Tight feedback loops work better.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Event Storming:

&lt;ul&gt;
&lt;li&gt;Collaborative brainstorming technique used to identify domain events.&lt;/li&gt;
&lt;li&gt;To better engage subject-matter experts.&lt;/li&gt;
&lt;li&gt;Concrete and specific examples, not abstract.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Group Posters:

&lt;ul&gt;
&lt;li&gt;Create a poster that conveys their design ideas for the architecture outcomes.&lt;/li&gt;
&lt;li&gt;To summarize outcomes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Round-Robin design:

&lt;ul&gt;
&lt;li&gt;Quickly explore a range of ideas, and then combine to start building consensus.&lt;/li&gt;
&lt;li&gt;Steps:

&lt;ol&gt;
&lt;li&gt;Sketch 5m.&lt;/li&gt;
&lt;li&gt;Rotate.&lt;/li&gt;
&lt;li&gt;Critique 3m.&lt;/li&gt;
&lt;li&gt;Rotate.&lt;/li&gt;
&lt;li&gt;Improve 5m.&lt;/li&gt;
&lt;li&gt;Review all sketches.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Whiteboard Jam:

&lt;ul&gt;
&lt;li&gt;Collaboratively draw diagrams on a whiteboard.&lt;/li&gt;
&lt;li&gt;Pictures won't make sense to someone who wasn't there.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 16 - Activities to Make the Design Tangible
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Architecture Decision Records:

&lt;ul&gt;
&lt;li&gt;Capture architecture design decisions using a lightweight text-based template.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Architecture haiku:

&lt;ul&gt;
&lt;li&gt;Create bit-sized architecture summaries that stakeholders will actually use.&lt;/li&gt;
&lt;li&gt;Think through and articulate the essential parts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Context diagram:

&lt;ul&gt;
&lt;li&gt;Help stakeholders understand where the software system fits in the world.&lt;/li&gt;
&lt;li&gt;Agreement with system scope.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Greatest hits reading list:

&lt;ul&gt;
&lt;li&gt;Help navigate the morass of design artifacts, so they can find relevant information.&lt;/li&gt;
&lt;li&gt;Links list with tile, overview and caveats.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inception deck:

&lt;ul&gt;
&lt;li&gt;Answer 10 important questions at the start of a new project to avoid common failures and align stakeholders.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agilewarrior.wordpress.com/2010/11/06/the-agile-inception-deck/" rel="noopener noreferrer"&gt;The Agile Inception Deck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Customize questions to your context.&lt;/li&gt;
&lt;li&gt;Effort to create should be proportional to size and cost of project.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modular decomposition diagram:

&lt;ul&gt;
&lt;li&gt;Simple tree diagram that shows how abstractions at different granularities are related.&lt;/li&gt;
&lt;li&gt;Root is the whole system.&lt;/li&gt;
&lt;li&gt;Child are more and more specific.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Paths not taken:

&lt;ul&gt;
&lt;li&gt;List options discarded with a brief explanation of why.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prototype to learn or decide:

&lt;ul&gt;
&lt;li&gt;Always prototype as quickly and cheaply as possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sequential diagram.&lt;/li&gt;
&lt;li&gt;System metaphor.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 17 - Activities to Evaluate Design Options
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Evaluation is a continuous activity.&lt;/li&gt;
&lt;li&gt;Architecture Briefing:

&lt;ul&gt;
&lt;li&gt;Brief presentation on some part of the architecture, to get meaningful feedback.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Code review:

&lt;ul&gt;
&lt;li&gt;From architecture point of view.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Decision Matrix:

&lt;ul&gt;
&lt;li&gt;Visual comparison of alternatives.&lt;/li&gt;
&lt;li&gt;No more than 7 factors.&lt;/li&gt;
&lt;li&gt;No more than 5 design options.&lt;/li&gt;
&lt;li&gt;Take notes when filling the matrix.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Observe Behaviour:

&lt;ul&gt;
&lt;li&gt;Add instrumentation to see runtime behaviours.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Question-Comment-Concern:

&lt;ul&gt;
&lt;li&gt;Collaborative, visual activity to shine light on knowledge gaps, articulate issues, and establish known facts about the architecture.&lt;/li&gt;
&lt;li&gt;Team puts sticky notes (comments, questions, concerns) on views of the architecture.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Risk storming:

&lt;ul&gt;
&lt;li&gt;Collaborative, visual technique for identifying risks in the architecture.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Sanity check:

&lt;ul&gt;
&lt;li&gt;To expose issues in team communication or understanding.&lt;/li&gt;
&lt;li&gt;Pop quiz-like.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Scenario walk-through:

&lt;ul&gt;
&lt;li&gt;Describe step-by-step how the architecture addresses a specific quality attribute scenario.&lt;/li&gt;
&lt;li&gt;Use early.&lt;/li&gt;
&lt;li&gt;Avoid problem-solving during the session.&lt;/li&gt;
&lt;li&gt;Architect + note taker + session moderator + few reviewers. 3-7 total.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Sketch and Compare:

&lt;ul&gt;
&lt;li&gt;Create two or more alternatives of the same design, so it is easier to see the pros/cons.&lt;/li&gt;
&lt;li&gt;Always summarize the findings.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>books</category>
      <category>architecture</category>
      <category>career</category>
    </item>
    <item>
      <title>Are you asking too much from your team/tech lead?</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Tue, 24 Jan 2023 23:05:43 +0000</pubDate>
      <link>https://forem.com/danlebrero/are-you-asking-too-much-from-your-teamtech-lead-42db</link>
      <guid>https://forem.com/danlebrero/are-you-asking-too-much-from-your-teamtech-lead-42db</guid>
      <description>&lt;p&gt;Somebody recently asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you learn to be a tech lead?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Knowing her background, I replied with another question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do you mean tech lead or team lead?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference was not obvious to me until I worked as a tech lead in a team that had a team lead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team vs Technical lead
&lt;/h2&gt;

&lt;p&gt;On that particular job, as a tech lead, my responsibilities were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose the right tool for the job: be aware of existing tools/libraries/frameworks, their trade-offs and what was appropriate for the company's context.&lt;/li&gt;
&lt;li&gt;Code contributions.&lt;/li&gt;
&lt;li&gt;Code quality (aka bugs).&lt;/li&gt;
&lt;li&gt;Production issues/outages.&lt;/li&gt;
&lt;li&gt;Design and architecture, including NFRs.&lt;/li&gt;
&lt;li&gt;Developer productivity: from testing, CI/CD, release, monitoring, …&lt;/li&gt;
&lt;li&gt;Technical mentoring.&lt;/li&gt;
&lt;li&gt;Awareness on other parts of the system: functionality available, technologies used, trade-off, high level workings, lessons learned.&lt;/li&gt;
&lt;li&gt;Applying the company's architecture constraints, principles and practices, and raising concerns when we wanted to deviate from those.&lt;/li&gt;
&lt;li&gt;Technology proof of concept.&lt;/li&gt;
&lt;li&gt;Technical assessment of candidates.&lt;/li&gt;
&lt;li&gt;Technical debt prioritisation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My &lt;a href="https://leonardoalmeida.com/"&gt;fellow team lead&lt;/a&gt; would take care of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People's career progression.&lt;/li&gt;
&lt;li&gt;Performance appraisals.&lt;/li&gt;
&lt;li&gt;1-2-1.&lt;/li&gt;
&lt;li&gt;Reporting up and down.&lt;/li&gt;
&lt;li&gt;Recruitment, team composition.&lt;/li&gt;
&lt;li&gt;Onboarding.&lt;/li&gt;
&lt;li&gt;Internal and inter-team conflicts.&lt;/li&gt;
&lt;li&gt;Project management.&lt;/li&gt;
&lt;li&gt;Inter-team coordination and dependencies.&lt;/li&gt;
&lt;li&gt;And a myriad of other things that I was not aware of.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What we will both do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backlog grooming: me for feasibility and rough sizing. Team lead to know if we had the capacity and for stakeholder management.&lt;/li&gt;
&lt;li&gt;Development process improvements: me more to suggest, team lead more as Scrum Master and lean/agile coach.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically I will become a software architect while the team lead would become an engineering manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choices
&lt;/h2&gt;

&lt;p&gt;Continuing with the conversation:&lt;/p&gt;

&lt;p&gt;Me: "What path are you asking about? You cannot do both."&lt;/p&gt;

&lt;p&gt;Tech lead: "Both is actually what I have been asked to do."&lt;/p&gt;

&lt;p&gt;Me: "How is the experience of trying to do both?"&lt;/p&gt;

&lt;p&gt;Tech lead: "Is it a lot. I spend most of the time doing management, admin and planning."&lt;/p&gt;

&lt;p&gt;Me: "So you are team leading, not tech leading. But if you are not doing the tech leading (because you have no time), then you should raise it with your manager."&lt;/p&gt;

&lt;p&gt;Tech lead: "Haven't you ever act as both the team and tech lead?"&lt;/p&gt;

&lt;p&gt;Me: "In my very early days (~2002-2004), in a very small company in a team of ~6 people. Of the list above, I know I did not had to (or did not know I had to):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production issues/outages: never got anything successful in production, hence no users, hence no production issues.&lt;/li&gt;
&lt;li&gt;Design and architecture: system that we built were simple.&lt;/li&gt;
&lt;li&gt;Developer productivity: mostly unknown things for me back then.&lt;/li&gt;
&lt;li&gt;Awareness on other parts of the system: there were no other parts, not other teams.&lt;/li&gt;
&lt;li&gt;Applying the company's architecture constraints: No such a thing.&lt;/li&gt;
&lt;li&gt;Technology proof of concept: no time for this.&lt;/li&gt;
&lt;li&gt;Technical debt prioritisation: &lt;/li&gt;
&lt;li&gt;People's career progression: we were trying to survive, not planning long or mid term, also I was probably not aware.&lt;/li&gt;
&lt;li&gt;Performance appraisals: see above.&lt;/li&gt;
&lt;li&gt;1-2-1: see above.&lt;/li&gt;
&lt;li&gt;Reporting up and down: company was small enough to not need this.&lt;/li&gt;
&lt;li&gt;Recruitment, team composition: recruitment yes, but the team composition was pretty static.&lt;/li&gt;
&lt;li&gt;Internal and inter-team conflicts: Internal yes, but no other teams.&lt;/li&gt;
&lt;li&gt;Inter-team coordination and dependencies: no other teams."&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;That is a long list of things I did not do. &lt;/p&gt;

&lt;p&gt;Are you asking too much from your team/tech lead? &lt;/p&gt;

&lt;p&gt;If so, what is she neglecting? Do you agree with her choices?&lt;/p&gt;

</description>
      <category>career</category>
      <category>architecture</category>
    </item>
    <item>
      <title>But life had other plans ...</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Wed, 22 Jun 2022 18:28:48 +0000</pubDate>
      <link>https://forem.com/danlebrero/but-life-had-other-plans--14kp</link>
      <guid>https://forem.com/danlebrero/but-life-had-other-plans--14kp</guid>
      <description>&lt;p&gt;In summer 2018 my mother-in-law was diagnosed with cancer.&lt;/p&gt;

&lt;p&gt;Further testing identified a &lt;a href="https://www.cancer.gov/about-cancer/causes-prevention/genetics/brca-fact-sheet"&gt;BRCA2 gene mutation&lt;/a&gt; as the cause. Having the BRCA2 mutation increases your chances of developing breast cancer to 45-70% and ovarian cancer to 11-17%.&lt;/p&gt;

&lt;p&gt;The mutation is hereditary, with a 50% chance to pass it to your children.&lt;/p&gt;

&lt;p&gt;In May 2020, my wife’s BRCA genetic test was positive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prevention
&lt;/h2&gt;

&lt;p&gt;Doctors recommended preventive surgery to remove breasts, ovaries, and Fallopian tubes which reduces the cancer risk by 90-95%.&lt;/p&gt;

&lt;p&gt;On top of the heavy physical and psychological toll, and the inherent risk of any operation, the surgery has two additional consequences: early menopause and no more children.&lt;/p&gt;

&lt;p&gt;A sibling for our lovely four-year-old daughter was in our plans, but with three heartbreaking miscarriages on our backs, and both of us over 40, we were ready to move past the childbearing stage of our lives.&lt;/p&gt;

&lt;p&gt;So given what my mother-in-law had gone through, we deemed the operation and its consequences to be the lesser evil, and my wife joined the public health service's waiting list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operation and recovery
&lt;/h2&gt;

&lt;p&gt;The operation was scheduled for the last quarter of 2021, but we were given the chance of moving it forward to May.&lt;/p&gt;

&lt;p&gt;We expected the recovery to take a couple of months, so having the surgery in May would mean that we will have enough time to recover strength before September's school season.&lt;/p&gt;

&lt;p&gt;But it wasn't like that.&lt;/p&gt;

&lt;p&gt;My wife was in constant pain, and the painkillers would make her sick and throw up, so she had no other option but to bear it day and night.&lt;/p&gt;

&lt;p&gt;But by the end of summer, something unsettling happened: her belly slowly started to swell.&lt;/p&gt;

&lt;p&gt;The swelling was too localized to attribute it to fattening, and it was unlikely to be an infection as she had no fever.&lt;/p&gt;

&lt;p&gt;These left us with the possibility that either something had gone wrong with the surgery, or …&lt;/p&gt;

&lt;h2&gt;
  
  
  Doctor's visit
&lt;/h2&gt;

&lt;p&gt;We scheduled a visit with a doctor as soon as possible.&lt;/p&gt;

&lt;p&gt;The doctor (a gynecologist) explained about peritoneal cancer, recommended an urgent tumor marker blood test, and, as the swelling was so bad, made an ultrasound scan to see if anything useful could be found.&lt;/p&gt;

&lt;p&gt;And indeed she did.&lt;/p&gt;

&lt;p&gt;My wife was pregnant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bCtZycyh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://danlebrero.com/images/blog/cto/day9/confused-wait.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bCtZycyh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://danlebrero.com/images/blog/cto/day9/confused-wait.gif" alt="wait what" width="498" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait, what?!?!? Hasn't she just gone through surgery to remove her ovaries? How was this even possible?&lt;/p&gt;

&lt;p&gt;Given that my wife didn't recall talking with any angel lately, the simple explanation was that she was already pregnant when she went through the surgery.&lt;/p&gt;

&lt;p&gt;She was five(!) months pregnant. &lt;/p&gt;

&lt;p&gt;At the time of the surgery, the embryo was young enough to not be detected but old enough to be out of the Fallopian tubes and not depend on the ovaries' hormones anymore. &lt;/p&gt;

&lt;p&gt;Older than one week, but younger than three. A two-week window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_OCrCjE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://danlebrero.com/images/blog/cto/day9/wow.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_OCrCjE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://danlebrero.com/images/blog/cto/day9/wow.gif" alt="wow" width="195" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Puzzles and odds
&lt;/h2&gt;

&lt;p&gt;The pregnancy made the pieces fall in place: no menopause symptoms, the anemia, throwing up every morning (not due to the painkillers!), and obviously the belly: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---k_so-k---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/cto/day9/belly.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---k_so-k---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/cto/day9/belly.jpeg" alt="belly" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When people ask why we didn't ever contemplate the possibility of a pregnancy, first we shout "no ovaries!", and then we explain that for 15 years we have been unable to conceive naturally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EeT3o51g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://danlebrero.com/images/blog/cto/day9/waitwhat.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EeT3o51g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://danlebrero.com/images/blog/cto/day9/waitwhat.gif" alt="wait what" width="384" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our daughter and all the unsuccessful pregnancies have been thanks to the more advanced types of fertility treatments. &lt;/p&gt;

&lt;p&gt;Never ever naturally. In 15 years.&lt;/p&gt;

&lt;p&gt;It feels like a prank.&lt;/p&gt;

&lt;p&gt;After 15 years of trying with no luck, after giving up for good, my wife gets pregnant with her &lt;strong&gt;very last egg&lt;/strong&gt;; the embryo narrowly avoids death and being detected, and then it survives to such a nasty surgery and recovery procedure, while previous miscarriages had a much easier time.&lt;/p&gt;

&lt;p&gt;But the most incredible thing: when have you seen the public health service being earlier than planned?&lt;/p&gt;

&lt;p&gt;Life.&lt;/p&gt;




&lt;p&gt;A healthy Lucas Lebrero was born on February 4th, and my mother-in-law helps with him every day.&lt;/p&gt;

</description>
      <category>life</category>
    </item>
    <item>
      <title>CTO last day: reflections, mistakes, and some learnings</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Tue, 31 May 2022 18:26:49 +0000</pubDate>
      <link>https://forem.com/danlebrero/cto-last-day-reflections-mistakes-and-some-learnings-mip</link>
      <guid>https://forem.com/danlebrero/cto-last-day-reflections-mistakes-and-some-learnings-mip</guid>
      <description>&lt;p&gt;In April 2021, I left my job at Akvo as CTO, after about two years in the position.&lt;/p&gt;

&lt;p&gt;Today, &lt;del&gt;six&lt;/del&gt; &lt;del&gt;seven&lt;/del&gt; &lt;del&gt;eight&lt;/del&gt; &lt;del&gt;nine&lt;/del&gt; ten months later, it seems like about time to stop procrastinating and write something about it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Leaving
&lt;/h1&gt;

&lt;p&gt;I realised that I needed to leave when Sunday evenings became the worst part of the week when I felt exactly the same as in my old school days: anxious and unhappy.&lt;/p&gt;

&lt;p&gt;But it was not only Sunday evenings. I have never minded some work problem popping in my head out of working hours -- I love solving problems -- but now it will just suck all the joy of whatever I was doing.&lt;/p&gt;

&lt;p&gt;And of course, the sleeping troubles that came with all of this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;True happiness occurs only when you find the problems you enjoy having and enjoy solving.&lt;br&gt;
&lt;cite&gt;Mark Manson, &lt;a href="https://danlebrero.com/2021/09/08/the-subtle-art-of-not-giving-a-fuck-summary/#content" rel="noopener noreferrer"&gt;The Subtle Art of Not Giving a F*ck&lt;/a&gt;.&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Root Cause Analysis
&lt;/h2&gt;

&lt;p&gt;No need to go through the &lt;a href="https://en.wikipedia.org/wiki/Five_whys" rel="noopener noreferrer"&gt;5 whys&lt;/a&gt; to see what the cause was: the compounded effect of the company’s financial situation, the impact of the decisions I was involved with, and the feeling of being completely unprepared.&lt;/p&gt;

&lt;p&gt;As an example, my translation of the new business strategy: stop product development.&lt;/p&gt;

&lt;p&gt;Who I was to push for halting the development of what has been the company’s flagship product since its inception, twelve years ago? Would a more experienced CTO see otherwise? Would a more experienced CTO change the business strategy? Changed how product development was financed? How contracts were negotiated? Find external investment?&lt;/p&gt;

&lt;p&gt;And the impact on the development team …&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This was the last decision that I helped make.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Mistakes and lessons learned
&lt;/h1&gt;

&lt;p&gt;Mandatory “lessons learned” section:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bye-bye coding.&lt;/li&gt;
&lt;li&gt;Complaints are good.&lt;/li&gt;
&lt;li&gt;Clarity is hard work.&lt;/li&gt;
&lt;li&gt;Business first, tech second.&lt;/li&gt;
&lt;li&gt;Conflicts: avoid being a broken telephone.&lt;/li&gt;
&lt;li&gt;Difficult conversations (with data).&lt;/li&gt;
&lt;li&gt;It is always a system problem.&lt;/li&gt;
&lt;li&gt;Self-blaming is pointless.&lt;/li&gt;
&lt;li&gt;It is all about teams.&lt;/li&gt;
&lt;li&gt;Don't make changes, run experiments.&lt;/li&gt;
&lt;li&gt;Feedback loops are loooong.&lt;/li&gt;
&lt;li&gt;Ring-fencing is a necessary evil.&lt;/li&gt;
&lt;li&gt;Lonely.&lt;/li&gt;
&lt;li&gt;I don’t dislike people management!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Bye-bye coding
&lt;/h3&gt;

&lt;p&gt;As much as it hurts, there will be always something more important than coding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fcto%2Fday8%2Fsad-crying.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fcto%2Fday8%2Fsad-crying.gif" alt="crying"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Complaints are good
&lt;/h3&gt;

&lt;p&gt;Not all complains and not all the time, but some level of complaining means that people trust you enough and that they care enough about the job.&lt;/p&gt;

&lt;p&gt;Complains are an opportunity to either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make an improvement.&lt;/li&gt;
&lt;li&gt;Provide &lt;a href="https://danlebrero.com/2021/03/24/97-things-every-engineering-manager-should-know-summary/#content" rel="noopener noreferrer"&gt;clarity&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Best outcome is delegating the improvement in the complainer after giving some additional clarity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clarity is hard work
&lt;/h3&gt;

&lt;p&gt;Not only &lt;a href="https://danlebrero.com/2020/04/15/on-the-importance-of-clear-communication-in-devops/#content" rel="noopener noreferrer"&gt;communication is messy&lt;/a&gt; and you will need to repeat yourself ten times, finding the clarity yourself in the first place requires a lot of work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Business first, tech second
&lt;/h3&gt;

&lt;p&gt;I understood that my main responsibility as CTO was to improve how we delivered software. Major mistake.&lt;/p&gt;

&lt;p&gt;I should have dug deeper from the very beginning on how the business works and how software supported and enabled it. &lt;/p&gt;

&lt;h3&gt;
  
  
  Conflicts: avoid being a broken telephone
&lt;/h3&gt;

&lt;p&gt;Foo complains about Bar because of Buzz. You talk with Bar about Buzz but Bar says Quux, which you have no clue about. So you go back to Foo to clarify Bar's Buzz's Quux and Foo replies Flob.&lt;/p&gt;

&lt;p&gt;What a waste of time, energy, and a source of confusion.&lt;/p&gt;

&lt;p&gt;The underlying issue is that Foo does not want to have a difficult conversation with Bar, which, as much I can empathise with, it needs to happen.&lt;/p&gt;

&lt;p&gt;So either, depending on circumstances:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask Foo to have a difficult conversation with Bar.&lt;/li&gt;
&lt;li&gt;Sit with Foo and Bar to have a difficult conversation.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Difficult conversations (with data)
&lt;/h3&gt;

&lt;p&gt;Two ingredients that made difficult conversations less difficult to have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Following the &lt;a href="https://danlebrero.com/2020/04/01/no-nonsense-leadership-summary/#respectful-confrontation" rel="noopener noreferrer"&gt;respectful confrontation&lt;/a&gt; script, which has a wonderful mix of hard-core objective real data and &lt;a href="https://danlebrero.com/2020/12/16/cto-diary-meeting-the-business/#content" rel="noopener noreferrer"&gt;fluffy feelings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Internalizing that all problems are system problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  It is always a system problem
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Everybody is doing their best, under the current circumstances. &lt;br&gt;
&lt;cite&gt;Gerald M. Weinberg, &lt;a href="https://danlebrero.com/2019/11/27/becoming-a-technical-leader-book-notes/#content" rel="noopener noreferrer"&gt;Becoming a Technical Leader&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With this in mind, it is amazing how much more productive conversations are once you move from blaming people to understanding, inspecting, and changing the system.&lt;/p&gt;

&lt;p&gt;The steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State that we are trying to understand how the system leads to the outcome.&lt;/li&gt;
&lt;li&gt;Repeat point 1.&lt;/li&gt;
&lt;li&gt;Agree that the outcome was undesirable.&lt;/li&gt;
&lt;li&gt;Collect the timeline/facts about the system behavior, to understand "the circumstances".&lt;/li&gt;
&lt;li&gt;Agree on what was the desirable outcome.&lt;/li&gt;
&lt;li&gt;Agree on what system change is needed to avoid (1) and promote (2).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note that "circumstances" can be a lack of knowledge or competency by the person doing the work. This is something that can be fixed.&lt;/p&gt;

&lt;p&gt;Change the system and people will follow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-blaming is pointless
&lt;/h3&gt;

&lt;p&gt;I always thought that acknowledging that "It is my fault!" was a brave thing to do, but if you really believe that something is your fault, then you are ready to believe that others can be at fault.&lt;/p&gt;

&lt;p&gt;Blaming and self-blaming are counterproductive. It is always a system problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is all about teams
&lt;/h3&gt;

&lt;p&gt;What teams, composition, responsibilities, the internal and external dynamics, ... this is going to be your main leverage point for system change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't make changes, run experiments
&lt;/h3&gt;

&lt;p&gt;Change is scary and comes with a lot of resistance, but running an experiment sends a different completely different signal: it is a temporal thing aimed to learn. &lt;/p&gt;

&lt;p&gt;Experiments are expected to "fail", which brings the psychological safety required for honest feedback and increases the willingness to participate.&lt;/p&gt;

&lt;p&gt;Feedback is high quality as it comes from empirical evidence, not theoretical "this will never work here".  &lt;/p&gt;

&lt;p&gt;And the most important reason:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Change culture by first changing what people do, not how people think.&lt;br&gt;
&lt;cite&gt;John Shook, &lt;a href="https://www.lean.org/downloads/35.pdf" rel="noopener noreferrer"&gt;How to Change a Culture: Lessons from NUMMI&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Feedback loops are loooong
&lt;/h3&gt;

&lt;p&gt;You will miss those 72 hours test suites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ring-fencing is a necessary evil
&lt;/h3&gt;

&lt;p&gt;I made several times the mistake of asking people for important-but-not-urgent work and expecting them to find the time for it. It rarely worked.&lt;/p&gt;

&lt;p&gt;As much as it pains me, the workaround is to explicitly ring-fence people's time, so that if other conflicting priority arises, they can rely on your authority to push back, or escalate the conflict to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lonely
&lt;/h3&gt;

&lt;p&gt;I have never talked so much and been in so many meetings, but nobody in your company will be in your same position, so I actually felt quite lonely at times.&lt;/p&gt;

&lt;p&gt;I ended up reaching out to random CTOs on LinkedIn, which was surprisingly useful. &lt;/p&gt;

&lt;h3&gt;
  
  
  I don’t dislike people management!
&lt;/h3&gt;

&lt;p&gt;You probably do not care but it was a big surprise for me. &lt;/p&gt;

&lt;p&gt;Even if the 1-2-1 days were really really draining, I actually enjoyed the time spent with other human resources.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is next?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fcto%2Fday8%2Fbeer.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fcto%2Fday8%2Fbeer.jpg" alt="beer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The experience was like my first beer, first &lt;a href="https://danlebrero.com/2016/03/17/lines-of-code/#content" rel="noopener noreferrer"&gt;blog post&lt;/a&gt; or first &lt;a href="https://danlebrero.com/2016/10/22/repl-driven-development-voxxed-days-belgrade-2016-video/#content" rel="noopener noreferrer"&gt;conference talk&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Trying once is not enough to make up my mind.&lt;/p&gt;

&lt;p&gt;But before starting a new job, the original plan was to take the rest of 2021 off, get a respite from work and COVID, and take care of my family while my wife went through some nasty surgery.&lt;/p&gt;

&lt;p&gt;But &lt;a href="https://danlebrero.com/2022/03/23/but-life-had-other-plans/#content" rel="noopener noreferrer"&gt;life had other plans&lt;/a&gt; ...&lt;/p&gt;

</description>
      <category>cto</category>
      <category>management</category>
      <category>teams</category>
      <category>lessons</category>
    </item>
    <item>
      <title>Book notes: Staff Engineering: Leadership beyond the management track</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Fri, 27 May 2022 13:28:16 +0000</pubDate>
      <link>https://forem.com/danlebrero/book-notes-staff-engineering-leadership-beyond-the-management-track-2fej</link>
      <guid>https://forem.com/danlebrero/book-notes-staff-engineering-leadership-beyond-the-management-track-2fej</guid>
      <description>&lt;p&gt;These are my notes on &lt;a href="https://amzn.to/3n4g2dF"&gt;Staff Engineering: Leadership beyond the management track&lt;/a&gt; by &lt;a href="https://twitter.com/Lethain"&gt;Will Larson&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Key Insights
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Staff-plus roles archetypes:

&lt;ol&gt;
&lt;li&gt;Tech lead.&lt;/li&gt;
&lt;li&gt;Architect.&lt;/li&gt;
&lt;li&gt;Solver.&lt;/li&gt;
&lt;li&gt;Right hand.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;What do Staff engineers actually do?

&lt;ol&gt;
&lt;li&gt;Setting technical direction.&lt;/li&gt;
&lt;li&gt;Mentorship and sponsorship.&lt;/li&gt;
&lt;li&gt;Providing engineering perspective.&lt;/li&gt;
&lt;li&gt;Exploration.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://noidea.dog/glue"&gt;Being glue&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;It is normal to end some days feeling like you haven't accomplished anything.&lt;/li&gt;
&lt;li&gt;Your work maintains an aloof indifference to your sacrifice rather than rewarding it.&lt;/li&gt;
&lt;li&gt;Look for low effort-high impact work.&lt;/li&gt;
&lt;li&gt;Durably useful engineering strategy and vision are the output of iterative, bottom-up organizational learning.&lt;/li&gt;
&lt;li&gt;Synthesize 5 design docs into a strategy, extrapolate 5 strategies into a vision.&lt;/li&gt;
&lt;li&gt;Design docs (RFC):

&lt;ul&gt;
&lt;li&gt;When:

&lt;ul&gt;
&lt;li&gt;Project capabilities will be used numerous times in the future.&lt;/li&gt;
&lt;li&gt;Big impact on users.&lt;/li&gt;
&lt;li&gt;Work takes longer than a month.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Start from the problem: The clearer the problem statement, the more obvious the solution.&lt;/li&gt;
&lt;li&gt;Gather and review together, write alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Specific statements create alignments; generic statements create the illusion of alignment.&lt;/li&gt;
&lt;li&gt;Best strategies feel too obvious.&lt;/li&gt;
&lt;li&gt;Vision:

&lt;ul&gt;
&lt;li&gt;Reconcile strategies, extrapolate how their trade-offs will play out over the next two to three years.&lt;/li&gt;
&lt;li&gt;Assume everything is going to go well, but don't assume infinite resources.&lt;/li&gt;
&lt;li&gt;Don't expect load of excitement:

&lt;ol&gt;
&lt;li&gt;Vision is for people writing strategies and these are few.&lt;/li&gt;
&lt;li&gt;Great visions are so obvious that it bores.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;At a well-run and successful company, most of your previous technical decisions won't meet your current quality threshold.&lt;/li&gt;
&lt;li&gt;Architect's decision degrade the further they get from doing real work on real code in real process.&lt;/li&gt;
&lt;li&gt;Your career depends more on being easy to involve than being technically correct.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Chapter 1 - Overview&lt;/li&gt;
&lt;li&gt;Chapter 2 - Operating at Staff&lt;/li&gt;
&lt;li&gt;Chapter 3 - Getting the title where you are&lt;/li&gt;
&lt;li&gt;Chapter 4 - Deciding to Switch Companies&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Overview
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Staff-plus roles archetypes:

&lt;ol&gt;
&lt;li&gt;Tech lead:

&lt;ul&gt;
&lt;li&gt;The most common type.&lt;/li&gt;
&lt;li&gt;Lead one team or a cluster of teams.&lt;/li&gt;
&lt;li&gt;Scope complex tasks, coordinate teams to solve it and unblocks them.&lt;/li&gt;
&lt;li&gt;Keep cross-team relationships.&lt;/li&gt;
&lt;li&gt;Roadmap shuffling.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Architect:

&lt;ul&gt;
&lt;li&gt;Responsible for the success of a specific technical domain.&lt;/li&gt;
&lt;li&gt;Intimate business knowledge and technical constraints.&lt;/li&gt;
&lt;li&gt;Either deep in codebase or no coding at all.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Solver:

&lt;ul&gt;
&lt;li&gt;Moved from one high execution risk problem to the next.&lt;/li&gt;
&lt;li&gt;Problem identified and prioritized by the org.&lt;/li&gt;
&lt;li&gt;Require little org-level chiropractices.&lt;/li&gt;
&lt;li&gt;Individual vs team.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Right hand:

&lt;ul&gt;
&lt;li&gt;Least common.&lt;/li&gt;
&lt;li&gt;Senior org leader without direct managerial responsibilities.&lt;/li&gt;
&lt;li&gt;Borrow authority from senior leader.&lt;/li&gt;
&lt;li&gt;Dive into a fire, edit the approach, delegate execution to the most appropriate team, go to the next fire.&lt;/li&gt;
&lt;li&gt;Problem are never purely technical.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;What kind of work energizes you?&lt;/li&gt;
&lt;li&gt;What do Staff engineers actually do?

&lt;ol&gt;
&lt;li&gt;Setting technical direction.&lt;/li&gt;
&lt;li&gt;Mentorship and sponsorship:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://larahogan.me/blog/what-sponsorship-looks-like/"&gt;What does sponsorship look like?&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Providing engineering perspective.&lt;/li&gt;
&lt;li&gt;Exploration.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://noidea.dog/glue"&gt;Being glue&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Time frames are longer than dev work.&lt;/li&gt;
&lt;li&gt;It is normal to end some days feeling like you haven't accomplished anything.&lt;/li&gt;
&lt;li&gt;Advantages:

&lt;ol&gt;
&lt;li&gt;Allow you to bypass informal gauges of seniority:

&lt;ul&gt;
&lt;li&gt;Do not need to recurrently prove yourself, which will free time and energy.&lt;/li&gt;
&lt;li&gt;More respected from the outset.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Being in the room:

&lt;ul&gt;
&lt;li&gt;To provide input for important decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compensation.&lt;/li&gt;
&lt;li&gt;Access to interesting work:

&lt;ul&gt;
&lt;li&gt;But not always.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 2 - Operating at Staff
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Work on what matters:

&lt;ul&gt;
&lt;li&gt;Your work maintains an aloof indifference to your sacrifice rather than rewarding it.&lt;/li&gt;
&lt;li&gt;Look for low effort-high impact work.&lt;/li&gt;
&lt;li&gt;Avoid snacking: low effort-low impact work that is "just" psychologically rewarding. &lt;/li&gt;
&lt;li&gt;Stop preening: low impact-high visibility work.&lt;/li&gt;
&lt;li&gt;Stop chasing ghost: low-impact high-effort:

&lt;ul&gt;
&lt;li&gt;Ghosts from previous org.&lt;/li&gt;
&lt;li&gt;When joining a new company, first understand context before making changes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What work?

&lt;ol&gt;
&lt;li&gt;Existential issues: company going through an existential risk.&lt;/li&gt;
&lt;li&gt;Work where there is room and attention:

&lt;ul&gt;
&lt;li&gt;Teaching a company to value (pay attention) something it does not care about is the hardest sort of work you can do, and it often fails.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Foster growth of your team.&lt;/li&gt;
&lt;li&gt;Edit: small, quick changes that shift a project's outcome with little effort.&lt;/li&gt;
&lt;li&gt;Finish things:

&lt;ul&gt;
&lt;li&gt;Push project to finishing line, by helping rescope or remove roadblocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Things that only you can do.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Writing engineering strategy:

&lt;ul&gt;
&lt;li&gt;Durably useful engineering strategy and vision are the output of iterative, bottom-up organizational learning.&lt;/li&gt;
&lt;li&gt;If you have rehashed the same discussion three times, it is time to write a strategy.&lt;/li&gt;
&lt;li&gt;When the future is too hazy to identify investments worth making, it is time to write another vision.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://multithreaded.stitchfix.com/blog/2020/12/07/remote-decision-making/"&gt;Technical Decision-Making and Alignment in a Remote Culture&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Synthesize 5 design docs into a strategy, extrapolate 5 strategies into a vision.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Design docs (RFC):

&lt;ul&gt;
&lt;li&gt;When:

&lt;ul&gt;
&lt;li&gt;Project capabilities will be used numerous times in the future.&lt;/li&gt;
&lt;li&gt;Big impact on users.&lt;/li&gt;
&lt;li&gt;Work takes longer than a month.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Start from the problem: The clearer the problem statement, the more obvious the solution.&lt;/li&gt;
&lt;li&gt;Keep template simple.&lt;/li&gt;
&lt;li&gt;Gather and review together, write alone.&lt;/li&gt;
&lt;li&gt;Prefer good to perfect.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Strategy docs:

&lt;ul&gt;
&lt;li&gt;Look for controversial decision that came up in multiple designs.&lt;/li&gt;
&lt;li&gt;Guide trade-offs and explain rationale.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://multithreaded.stitchfix.com/blog/2019/08/19/framework-for-responsible-innovation/"&gt;A Framework for Responsible Innovation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://slack.engineering/how-big-technical-changes-happen-at-slack/"&gt;How Big Technical Changes Happen at Slack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In &lt;a href="https://danlebrero.com/2020/08/31/good-strategy-bad-strategy-summary/#content"&gt;Good Strategy, Bad Strategy&lt;/a&gt; terms:

&lt;ul&gt;
&lt;li&gt;Strategy doc == diagnosis + guiding principles.&lt;/li&gt;
&lt;li&gt;Design doc == coherent action.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Advise:

&lt;ol&gt;
&lt;li&gt;Get started.&lt;/li&gt;
&lt;li&gt;Write the specifics:

&lt;ul&gt;
&lt;li&gt;Write until you start to generalize.&lt;/li&gt;
&lt;li&gt;Specific statements create alignments; generic statements create the illusion of alignment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Be opinionated.&lt;/li&gt;
&lt;li&gt;Show your work.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Best strategies feel too obvious.&lt;/li&gt;
&lt;li&gt;Strategies worth writing:

&lt;ol&gt;
&lt;li&gt;When should we write a design doc?&lt;/li&gt;
&lt;li&gt;Which DBs do we use for which cases?&lt;/li&gt;
&lt;li&gt;How should we stage migration from monolith to microservices?&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Vision:

&lt;ul&gt;
&lt;li&gt;Reconcile strategies, extrapolate how their trade-offs will play out over the next two to three years.&lt;/li&gt;
&lt;li&gt;Advice:

&lt;ul&gt;
&lt;li&gt;Grounded on serving your business and your users.&lt;/li&gt;
&lt;li&gt;Be ambitious, but not audacious.&lt;/li&gt;
&lt;li&gt;Assume everything is going to go well, but don't assume infinite resources.&lt;/li&gt;
&lt;li&gt;Stay concrete and specific.&lt;/li&gt;
&lt;li&gt;One or two pages long.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Don't expect load of excitement:

&lt;ol&gt;
&lt;li&gt;Vision is for people writing strategies and these are few.&lt;/li&gt;
&lt;li&gt;Great visions are so obvious that it bores.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Measure successful vision by comparing design docs before/after it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Managing technical quality:

&lt;ul&gt;
&lt;li&gt;At a well-run and successful company, most of your previous technical decisions won't meet your current quality threshold.&lt;/li&gt;
&lt;li&gt;Approaches, from cheaper to most complex:

&lt;ol&gt;
&lt;li&gt;Fix hot spots:

&lt;ul&gt;
&lt;li&gt;Unless your company is creating problems faster than you are able to fix hot spots.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Best practices:

&lt;ul&gt;
&lt;li&gt;Limit to 1 new practice at a time.&lt;/li&gt;
&lt;li&gt;Steps:

&lt;ol&gt;
&lt;li&gt;Document the approach.&lt;/li&gt;
&lt;li&gt;Experiment with few engaged teams.&lt;/li&gt;
&lt;li&gt;Sand down rough edges.&lt;/li&gt;
&lt;li&gt;Improve doc.&lt;/li&gt;
&lt;li&gt;Go to (2).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;See &lt;a href="https://danlebrero.com/2020/01/22/accelerate-high-performing-technology-orgs-summary/#content"&gt;Accelerate&lt;/a&gt; recommendations.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Leverage points:

&lt;ul&gt;
&lt;li&gt;When you want to roll out more than one practice at a time.&lt;/li&gt;
&lt;li&gt;Leverage points: prevent gross quality failures and reduce the cost of future quality investments.&lt;/li&gt;
&lt;li&gt;3 most typical:

&lt;ol&gt;
&lt;li&gt;Interfaces between systems: encapsulate implementation.&lt;/li&gt;
&lt;li&gt;Stateful systems: Failure modes, consistency behaviour, performance.&lt;/li&gt;
&lt;li&gt;Data models: Prevent invalid states, evolve over time.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Technical vectors:

&lt;ul&gt;
&lt;li&gt;Architect's decision degrade the further they get from doing real work on real code in real process.&lt;/li&gt;
&lt;li&gt;Technical vector: where technical decisions point to, hopefully towards the vision.&lt;/li&gt;
&lt;li&gt;Tools:

&lt;ol&gt;
&lt;li&gt;Direct feedback.&lt;/li&gt;
&lt;li&gt;Refine engineering strategy.&lt;/li&gt;
&lt;li&gt;Enforce in workflows and tooling.&lt;/li&gt;
&lt;li&gt;Train during onboarding.&lt;/li&gt;
&lt;li&gt;Use Conway's law.&lt;/li&gt;
&lt;li&gt;Curate technology change with architecture reviews or similar.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Measure technical quality:

&lt;ul&gt;
&lt;li&gt;Some examples in page 61.&lt;/li&gt;
&lt;li&gt;Be detailed in your definition of quality.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Technical quality team:

&lt;ul&gt;
&lt;li&gt;aka Dev Productivity, DevTools, Product Infra.&lt;/li&gt;
&lt;li&gt;1 for each 15 devs.&lt;/li&gt;
&lt;li&gt;For success:

&lt;ul&gt;
&lt;li&gt;Trust metrics over intuition.&lt;/li&gt;
&lt;li&gt;Keep intuition fresh: team embedding.&lt;/li&gt;
&lt;li&gt;Treat it as a product.&lt;/li&gt;
&lt;li&gt;Do fewer things, but better: Tool quality will impact the whole org.&lt;/li&gt;
&lt;li&gt;Don't hoard impact: Decentralized approach.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Quality program:

&lt;ul&gt;
&lt;li&gt;Hire a Technical Program Manager.&lt;/li&gt;
&lt;li&gt;Org wide change.&lt;/li&gt;
&lt;li&gt;Approach on page 66.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stay aligned with authority:

&lt;ul&gt;
&lt;li&gt;Don't surprise and don't get surprised by your manger.&lt;/li&gt;
&lt;li&gt;Feed them context:

&lt;ul&gt;
&lt;li&gt;Bring problems to inform them, make it clear that is not to solve them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;To lead, you have to follow:

&lt;ul&gt;
&lt;li&gt;Leader:

&lt;ol&gt;
&lt;li&gt;Has a vision on how things should be.&lt;/li&gt;
&lt;li&gt;Sees how things are.&lt;/li&gt;
&lt;li&gt;Takes action to narrow (1) and (2).&lt;/li&gt;
&lt;li&gt;This approach only creates early success.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Most effective leaders spend more time following than they do leading:

&lt;ol&gt;
&lt;li&gt;Follow if you disagree just in a minor way.&lt;/li&gt;
&lt;li&gt;Follow other trustworthy leaders.&lt;/li&gt;
&lt;li&gt;Make your feedback comments explicitly optional (non-blocking).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Learn to never be wrong:

&lt;ul&gt;
&lt;li&gt;At the same time:

&lt;ol&gt;
&lt;li&gt;Have a deep perspective on technology and architecture.&lt;/li&gt;
&lt;li&gt;Remain skeptical of yourself.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Meetings with multiple failed reframings almost always end with scheduling another meeting.

&lt;ul&gt;
&lt;li&gt;Ask three good questions before sharing your perspective:

&lt;ul&gt;
&lt;li&gt;Good questions are asked with the desire to learn, and they are specific.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Your career depends more on being easy to involve than being technically correct.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create space for others:

&lt;ul&gt;
&lt;li&gt;A good discussion is one that it turns out you didn't need to attend.

&lt;ul&gt;
&lt;li&gt;When you make a key contribution, think what needs to happen for someone else to make it next time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;In meetings:

&lt;ul&gt;
&lt;li&gt;Ask questions.&lt;/li&gt;
&lt;li&gt;Pull people not participating.&lt;/li&gt;
&lt;li&gt;Be the one taking notes (less time to speak).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Sponsor other to do "your" work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Build a network of peers:

&lt;ul&gt;
&lt;li&gt;Regulars with previous managers/colleges.&lt;/li&gt;
&lt;li&gt;Blogging/public speaking.&lt;/li&gt;
&lt;li&gt;Internal networks.&lt;/li&gt;
&lt;li&gt;Ambient networks: follow interesting people in Twitter.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Present to executives:

&lt;ul&gt;
&lt;li&gt;Always for planning, status reports or resolve misalignment.&lt;/li&gt;
&lt;li&gt;Goal is always to extract as much perspective from the executive as possible.

&lt;ul&gt;
&lt;li&gt;Never to change their mind.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Barbara Minto, &lt;a href="https://amzn.to/3r36wsd"&gt;The Pyramid Principle&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;The clearest sequence to present your ideas is always to give the summarizing idea before you give the individual ideas being summarized.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Recommended doc structure:

&lt;ol&gt;
&lt;li&gt;Situation: relevant context.&lt;/li&gt;
&lt;li&gt;Complication: why situation is problematic.&lt;/li&gt;
&lt;li&gt;Question: what is the core question to address.&lt;/li&gt;
&lt;li&gt;Answer: what is the best answer.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Mistakes to avoid:

&lt;ol&gt;
&lt;li&gt;Never fight feedback.&lt;/li&gt;
&lt;li&gt;Don't evade responsibility or problems.&lt;/li&gt;
&lt;li&gt;Don't present a question without an answer.&lt;/li&gt;
&lt;li&gt;Avoid academic-style presentations.&lt;/li&gt;
&lt;li&gt;Don't fixate on your preferred outcome.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Share early drafts with executives attending the meeting asking for feedback.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 3 - Getting the title where you are
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Opportunities are not evenly distributed across the company.&lt;/li&gt;
&lt;li&gt;Promotion packets:

&lt;ul&gt;
&lt;li&gt;Write them before, so it becomes a map to accomplishing your goal.&lt;/li&gt;
&lt;li&gt;Template:

&lt;ol&gt;
&lt;li&gt;What staff project?

&lt;ul&gt;
&lt;li&gt;Your role, project impact, complexity.&lt;/li&gt;
&lt;li&gt;Links to design documents. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;High-leverage ways you have improved the org.&lt;/li&gt;
&lt;li&gt;People mentored and through what.&lt;/li&gt;
&lt;li&gt;Glue work.&lt;/li&gt;
&lt;li&gt;Which teams/leaders are familiar with and advocate for your work.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Process:

&lt;ol&gt;
&lt;li&gt;Answer why you are doing it.&lt;/li&gt;
&lt;li&gt;Take it easy, it takes time.&lt;/li&gt;
&lt;li&gt;Bring your manger into the fold:

&lt;ul&gt;
&lt;li&gt;Make her aware of your goal.&lt;/li&gt;
&lt;li&gt;Ask for feedback, guidance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Write your promotion packet.&lt;/li&gt;
&lt;li&gt;WAit two days and edit.&lt;/li&gt;
&lt;li&gt;Edit with trusted peers.&lt;/li&gt;
&lt;li&gt;Edit with manager:

&lt;ul&gt;
&lt;li&gt;Ask for gaps nad how to address them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Review periodically with manager.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Find a sponsor.&lt;/li&gt;
&lt;li&gt;Staff project is usually not required, but worth pursuing for personal growth and ease the promotion.&lt;/li&gt;
&lt;li&gt;Must get into the meeting where important decision are made. You need:

&lt;ol&gt;
&lt;li&gt;Bring something useful that is different:

&lt;ul&gt;
&lt;li&gt;Expertise, detailed knowledge, similar past experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sponsor.&lt;/li&gt;
&lt;li&gt;Make your sponsor aware that you want to be there.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Folks evaluate leaders on how aligned their teams are with their approach.&lt;/li&gt;
&lt;li&gt;Being visible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 4 - Deciding to Switch Companies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/"&gt;Salary Negotiation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>books</category>
      <category>architecture</category>
      <category>career</category>
    </item>
    <item>
      <title>Book notes: Monolith to Microservices: Evolutionary Patterns to Transform Your Monolith</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Wed, 04 May 2022 16:17:57 +0000</pubDate>
      <link>https://forem.com/danlebrero/book-notes-turn-the-ship-around-3lba</link>
      <guid>https://forem.com/danlebrero/book-notes-turn-the-ship-around-3lba</guid>
      <description>&lt;p&gt;These are my notes on &lt;a href="https://amzn.to/3ISOj8Q" rel="noopener noreferrer"&gt;Monolith to Microservices&lt;/a&gt; by &lt;a href="https://twitter.com/samnewman" rel="noopener noreferrer"&gt;Sam Newman&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Practical and useful book on the subject.&lt;/p&gt;

&lt;h1&gt;
  
  
  Key Insights
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Microservices are independently deployable services modeled around a business domain.&lt;/li&gt;
&lt;li&gt;Don't focus on size but:

&lt;ol&gt;
&lt;li&gt;How many microservices can you handle.&lt;/li&gt;
&lt;li&gt;How to define boundaries to get the most out of the microservices, without everything becoming a horrible coupled mess.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Modular monolith still have the challenge of a monolith DB.&lt;/li&gt;
&lt;li&gt;DDD:

&lt;ul&gt;
&lt;li&gt;Aggregate: self-contained unit that have a life cycle around them.&lt;/li&gt;
&lt;li&gt;Bounded context (BC) + Aggregate == unit of cohesion.&lt;/li&gt;
&lt;li&gt;The aggregate is a self-contained state machine that focuses on a single domain concept in our system, with the BC representing a collection of associated aggregates, with an explicit interface to the wider world.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Microservices are not the goal.

&lt;ul&gt;
&lt;li&gt;What are you going to achieve that you cannot with your current architecture?&lt;/li&gt;
&lt;li&gt;Have you considered alternatives to using microservices?&lt;/li&gt;
&lt;li&gt;How will you know if the transition is working?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reuse it not an outcome.&lt;/li&gt;

&lt;li&gt;When not to use microservices:

&lt;ol&gt;
&lt;li&gt;Unclear domain.&lt;/li&gt;
&lt;li&gt;Startups.&lt;/li&gt;
&lt;li&gt;Customer installed and managed software.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Dr John Kotter's eight-step process for implementing org change (from &lt;a href="https://amzn.to/3FFEMjD" rel="noopener noreferrer"&gt;Leading Change&lt;/a&gt;):

&lt;ol&gt;
&lt;li&gt;Establish a sense of urgency.&lt;/li&gt;
&lt;li&gt;Creating the Guiding Coalition.&lt;/li&gt;
&lt;li&gt;Developing a Vision and Strategy.&lt;/li&gt;
&lt;li&gt;Communicating the change vision.&lt;/li&gt;
&lt;li&gt;Empowering employees for broad-based action.&lt;/li&gt;
&lt;li&gt;Generating short-team wins.&lt;/li&gt;
&lt;li&gt;Consolidating gains and producing more change.&lt;/li&gt;
&lt;li&gt;Anchoring new approaches in the culture.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Small changes, little steps.

&lt;ul&gt;
&lt;li&gt;The biggest the bet and bigger the accompanying fanfare, the harder is to pull out when it is going wrong.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Change Data Capture (CDC):

&lt;ul&gt;
&lt;li&gt;Use when there is no other option.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Database-as-a-Service interface.&lt;/li&gt;

&lt;li&gt;When you are relying on network analysis to determine who is using your database, you are in trouble.&lt;/li&gt;

&lt;li&gt;Split the DB first or the code?

&lt;ul&gt;
&lt;li&gt;Code first.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Static reference data:

&lt;ul&gt;
&lt;li&gt;Duplicate, dedicated schema, static library.&lt;/li&gt;
&lt;li&gt;Data service: only when creating microservices is cheap.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;BPM tools: issue is that they are non-dev tools that end up being used by devs.&lt;/li&gt;

&lt;li&gt;The more coupling, the earlier the pains will manifest:

&lt;ul&gt;
&lt;li&gt;2-10 services:

&lt;ul&gt;
&lt;li&gt;Breaking changes.&lt;/li&gt;
&lt;li&gt;Reporting.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;10-50: 

&lt;ul&gt;
&lt;li&gt;Ownership at scale.&lt;/li&gt;
&lt;li&gt;Developer experience.&lt;/li&gt;
&lt;li&gt;Running too many things.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;50+:

&lt;ul&gt;
&lt;li&gt;Loads of teams.&lt;/li&gt;
&lt;li&gt;Global vs local optimization.&lt;/li&gt;
&lt;li&gt;Orphaned services.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;In all:

&lt;ul&gt;
&lt;li&gt;Robustness and resilience.&lt;/li&gt;
&lt;li&gt;Monitoring and troubleshooting.&lt;/li&gt;
&lt;li&gt;End-to-end testing.

&lt;ul&gt;
&lt;li&gt;Solutions:

&lt;ul&gt;
&lt;li&gt;No cross team tests.&lt;/li&gt;
&lt;li&gt;Consumer-driven contracts.&lt;/li&gt;
&lt;li&gt;Use automated release remediation and progressive delivery in addition to end-to-end tests.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Without strong code ownership (one and only one team can change service, other teams can do pull requests to propose changes) a microservices' architecture will grow into a distributed monolith.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Chapter 1 - Just Enough Microservices&lt;/li&gt;
&lt;li&gt;Chapter 2 - Planning a Migration&lt;/li&gt;
&lt;li&gt;Chapter 3 - Splitting the Monolith&lt;/li&gt;
&lt;li&gt;Chapter 4 - Decomposing the database&lt;/li&gt;
&lt;li&gt;Chapter 5 - Growing Pains&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 1 - Just Enough Microservices
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Microservices are &lt;strong&gt;independently deployable&lt;/strong&gt; services modeled around a business domain.

&lt;ul&gt;
&lt;li&gt;Type of SOA.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Start with the technology that you know.&lt;/li&gt;

&lt;li&gt;Don't focus on size but:

&lt;ol&gt;
&lt;li&gt;How many microservices can you handle.&lt;/li&gt;
&lt;li&gt;How to define boundaries to get the most out of the microservices, without everything becoming a horrible coupled mess.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Modular monolith still have the challenge of a monolith DB.&lt;/li&gt;

&lt;li&gt;Other monoliths:

&lt;ul&gt;
&lt;li&gt;Distributed monolith.&lt;/li&gt;
&lt;li&gt;Third-party black-box systems, both on premise and SaaS.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Coupling types:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://danlebrer.com/2021/11/17/fundamentals-of-software-architecture-summary/#ch-3" rel="noopener noreferrer"&gt;Types&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Implementation coupling.&lt;/li&gt;
&lt;li&gt;Temporal coupling (in the sense of sync calls).&lt;/li&gt;
&lt;li&gt;Deployment coupling (release trains).&lt;/li&gt;
&lt;li&gt;Domain coupling.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;DDD:

&lt;ul&gt;
&lt;li&gt;Aggregate: self-contained unit that have a life cycle around them.&lt;/li&gt;
&lt;li&gt;Bounded context (BC):

&lt;ul&gt;
&lt;li&gt;Hide implementation and internal details.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;BC + Aggregate == unit of cohesion.&lt;/li&gt;

&lt;li&gt;The Aggregate is a self-contained state machine that focuses on a single domain concept in our system, with the BC representing a collection of associated aggregates, again with an explicit interface to the wider world.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Start by targeting services that encompass entire BC.

&lt;ul&gt;
&lt;li&gt;You can split them further latter, hiding this decision.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 2 - Planning a Migration
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Microservices are not the goal.&lt;/li&gt;
&lt;li&gt;Key questions:

&lt;ul&gt;
&lt;li&gt;What are you going to achieve that you cannot with your current architecture?&lt;/li&gt;
&lt;li&gt;Have you considered alternatives to using microservices?&lt;/li&gt;
&lt;li&gt;How will you know if the transition is working?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reuse it not an outcome.&lt;/li&gt;

&lt;li&gt;Limit the scope of expected outcomes.&lt;/li&gt;

&lt;li&gt;Possible whys:

&lt;ul&gt;
&lt;li&gt;Improve team autonomy, alternatives:

&lt;ul&gt;
&lt;li&gt;Modular monoliths.&lt;/li&gt;
&lt;li&gt;Assign responsibilities based on functional grounds.&lt;/li&gt;
&lt;li&gt;Self-servicing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reduce time to market, alternatives:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/03/10/value-stream-mapping-summary/#content" rel="noopener noreferrer"&gt;Value stream mapping&lt;/a&gt; to identify bottlenecks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Scale cost-effectively for load, alternatives:

&lt;ul&gt;
&lt;li&gt;Vertical or horizontal scaling.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Improve robustness:

&lt;ul&gt;
&lt;li&gt;Being able to react to expected variations.&lt;/li&gt;
&lt;li&gt;Alternatives:

&lt;ul&gt;
&lt;li&gt;Running multiple copies of your monolith.&lt;/li&gt;
&lt;li&gt;Use more reliable SW/HW.&lt;/li&gt;
&lt;li&gt;Automate manual processes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Scale number of developers, alternatives:

&lt;ul&gt;
&lt;li&gt;Modular monolith (but less).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Embrace new technology, alternatives:

&lt;ul&gt;
&lt;li&gt;None.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;When not to use microservices:

&lt;ol&gt;
&lt;li&gt;Unclear domain:

&lt;ul&gt;
&lt;li&gt;Getting services wrong can be expensive due to large number of cross-service changes and overly coupled components.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Startups.&lt;/li&gt;
&lt;li&gt;Customer installed and managed software:

&lt;ul&gt;
&lt;li&gt;Due to increased operational complexity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Dr John Kotter's eight-step process for implementing org change (from &lt;a href="https://amzn.to/3FFEMjD" rel="noopener noreferrer"&gt;Leading Change&lt;/a&gt;):

&lt;ol&gt;
&lt;li&gt;Establish a sense of urgency.&lt;/li&gt;
&lt;li&gt;Creating the Guiding Coalition:

&lt;ul&gt;
&lt;li&gt;Try to bring somebody from "the business".&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Developing a Vision and Strategy:

&lt;ul&gt;
&lt;li&gt;Vision: realistic yet aspirational.&lt;/li&gt;
&lt;li&gt;Commitment to vision is important, but overly commitment to strategy can be dangerous&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Communicating the change vision:

&lt;ul&gt;
&lt;li&gt;Face to face + broadcast.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Empowering employees for broad-based action:

&lt;ul&gt;
&lt;li&gt;Bandwidth change: increase capacity or reduce load.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generating short-team wins.&lt;/li&gt;
&lt;li&gt;Consolidating gains and producing more change:

&lt;ul&gt;
&lt;li&gt;Keep pushing on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anchoring new approaches in the culture:

&lt;ul&gt;
&lt;li&gt;Communicate successes and failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Small changes, little steps.&lt;/li&gt;

&lt;li&gt;Whiteboard is where the cost of change and the cost of mistake is the lowest.&lt;/li&gt;

&lt;li&gt;Where to start?

&lt;ul&gt;
&lt;li&gt;Identify BC and their relationships:

&lt;ul&gt;
&lt;li&gt;Just enough DDD to get started.&lt;/li&gt;
&lt;li&gt;Maybe use Event Storming&lt;/li&gt;
&lt;li&gt;Relationship show how easy/difficult should be to extract that BC (warn: code may disagree).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Plot BC in:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fmonolith-to-microservices%2Fwhere-to-start.jpg" alt="change curve"&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Is the transition working?

&lt;ul&gt;
&lt;li&gt;Regular checkpoints. Agenda:

&lt;ol&gt;
&lt;li&gt;Restate what you are trying to achieve. Does it still make sense?&lt;/li&gt;
&lt;li&gt;Review quantitative metrics.&lt;/li&gt;
&lt;li&gt;Ask for qualitative feedback: Happier in &lt;a href="https://dev.to/2021/12/01/sonner-safer-happier-summary-patterns-business-agility/#content"&gt;BVSSH&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Decide if any change is needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Avoid the skunk cost fallacy:

&lt;ul&gt;
&lt;li&gt;The biggest the bet and bigger the accompanying fanfare, the harder is to pull out when it is going wrong.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 3 - Splitting the Monolith
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;You have more options if you can change the monolith.

&lt;ul&gt;
&lt;li&gt;Best if you can copy (not move) existing code.&lt;/li&gt;
&lt;li&gt;Consider refactoring into modular monolith first.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Stranger Fig Application:

&lt;ul&gt;
&lt;li&gt;Steps:

&lt;ol&gt;
&lt;li&gt;Identify what to migrate.&lt;/li&gt;
&lt;li&gt;Copy to microservice.&lt;/li&gt;
&lt;li&gt;Reroute calls to new microservice.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Safe to rollback routing.&lt;/li&gt;
&lt;li&gt;There must be a clear way to redirect the calls to the new service.&lt;/li&gt;
&lt;li&gt;In case of HTTP, a reverse HTTP proxy in front of the monolith.

&lt;ul&gt;
&lt;li&gt;Consider Ngnix + Lua if need something custom.&lt;/li&gt;
&lt;li&gt;If custom logic is very complex (like changing protocol from SOAP to gRPC), consider:

&lt;ol&gt;
&lt;li&gt;Avoid putting the logic in the proxy, as it is a shared service between teams.&lt;/li&gt;
&lt;li&gt;Implement it in the microservice.&lt;/li&gt;
&lt;li&gt;Use service mesh.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;In message systems, the proxy consumes the monolith queue and does a content-based routing to two queues: new monolith queue and microservices one.&lt;/li&gt;

&lt;li&gt;While migrating, avoid any functionality change.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: UI Composition:

&lt;ul&gt;
&lt;li&gt;UI to call new microservice.&lt;/li&gt;
&lt;li&gt;Widget or page level.&lt;/li&gt;
&lt;li&gt;Mobile apps are monoliths, unless you can make changes without resubmitting them.&lt;/li&gt;
&lt;li&gt;Micro-frontend.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Branch by Abstraction:

&lt;ul&gt;
&lt;li&gt;Steps:

&lt;ol&gt;
&lt;li&gt;Create abstraction for the functionality to be replaced.&lt;/li&gt;
&lt;li&gt;Change clients to use new abstraction.&lt;/li&gt;
&lt;li&gt;Create new implementation that uses the new microservice.&lt;/li&gt;
&lt;li&gt;Switch over the new implementation.&lt;/li&gt;
&lt;li&gt;Cleanup.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Verify branch by abstraction:

&lt;ul&gt;
&lt;li&gt;If call to new implementation fails, call the old implementation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: Parallel Run:

&lt;ul&gt;
&lt;li&gt;In strangler and branch by abstraction, call both implementation and compare results.&lt;/li&gt;
&lt;li&gt;Can check also performance.&lt;/li&gt;
&lt;li&gt;N-version programming:

&lt;ul&gt;
&lt;li&gt;Implement functionality in several different ways, and do a parallel run, choosing the "correct" (quorum) one.&lt;/li&gt;
&lt;li&gt;For fault tolerance and to avoid bugs.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Verification techniques:

&lt;ul&gt;
&lt;li&gt;Use spy in microservices to record what will do, but without doing it.

&lt;ul&gt;
&lt;li&gt;When duplicated side-effects are not ok.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/github/scientist" rel="noopener noreferrer"&gt;Github scientist&lt;/a&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Not trivial, use just when there is a high risk.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: Decorating Collaborator:

&lt;ul&gt;
&lt;li&gt;When cannot or don't want to change monolith.&lt;/li&gt;
&lt;li&gt;Proxy works as a decorator that calls new microservice in addition to old monolith.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Change Data Capture (CDC):

&lt;ul&gt;
&lt;li&gt;React to changes happened in the data store.&lt;/li&gt;
&lt;li&gt;Typical implementations:

&lt;ol&gt;
&lt;li&gt;DB triggers:

&lt;ul&gt;
&lt;li&gt;Use very sparingly.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Transaction log poll.&lt;/li&gt;

&lt;li&gt;Batch delta copier:

&lt;ul&gt;
&lt;li&gt;Process that on a regular schedule scans the DB to find what data has changed since last run.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;Use when there is no other option.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 4 - Decomposing the database
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Shared DB:

&lt;ul&gt;
&lt;li&gt;It is ok with:

&lt;ul&gt;
&lt;li&gt;Read-only static reference data that is stable and has a clear owner.&lt;/li&gt;
&lt;li&gt;Pattern: Database-as-a-Service interface.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Database view:

&lt;ul&gt;
&lt;li&gt;Less coupling than shared DB.&lt;/li&gt;
&lt;li&gt;When you are relying on network analysis to determine who is using your database, you are in trouble.&lt;/li&gt;
&lt;li&gt;Useful only for read-only.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Database wrapping service:

&lt;ul&gt;
&lt;li&gt;Move database dependencies to service dependencies.&lt;/li&gt;
&lt;li&gt;When is too hard pulling the schema apart.&lt;/li&gt;
&lt;li&gt;More flexible than DB view.&lt;/li&gt;
&lt;li&gt;Can take writes.&lt;/li&gt;
&lt;li&gt;Stepping stone, buys you time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Database-as-a-Service interface:

&lt;ul&gt;
&lt;li&gt;Create a specific and dedicated DB to be accessed externally.&lt;/li&gt;
&lt;li&gt;Mapping engine options:

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://debezium.io/" rel="noopener noreferrer"&gt;CDC&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Batch process.&lt;/li&gt;
&lt;li&gt;Build from an event log.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Transferring Ownership:

&lt;ul&gt;
&lt;li&gt;Pattern: Aggregate exposing monolith:

&lt;ul&gt;
&lt;li&gt;Monolith expose a proper aggregate API.&lt;/li&gt;
&lt;li&gt;When a newly extracted microservice still needs data owned by the monolith.&lt;/li&gt;
&lt;li&gt;Maybe a future microservice.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Change data ownership:

&lt;ul&gt;
&lt;li&gt;When monolith still depends on newly extracted microservice data.&lt;/li&gt;
&lt;li&gt;Ideally monolith should call new service API:

&lt;ul&gt;
&lt;li&gt;Copying the data back to the monolith DB as an alternative.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Data synchronization:

&lt;ul&gt;
&lt;li&gt;Pattern: Synchronize data in application:

&lt;ul&gt;
&lt;li&gt;Steps:

&lt;ol&gt;
&lt;li&gt;Bulk synchronize data:

&lt;ul&gt;
&lt;li&gt;If monolith was kept online, implement CDC to copy data since snapshot created.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Synchronize on write, read from old schema.&lt;/li&gt;

&lt;li&gt;Synchronize on write, read from new schema.&lt;/li&gt;

&lt;li&gt;Decommission old schema.&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: Tracer write:

&lt;ul&gt;
&lt;li&gt;Same as synchronize data in app, but one table at a time (instead of the whole bundled context) using the new microservice API.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Split the DB first or the code?

&lt;ul&gt;
&lt;li&gt;DB first:

&lt;ul&gt;
&lt;li&gt;Easy, little short-term benefit.&lt;/li&gt;
&lt;li&gt;When concerned about performance or data consistency.&lt;/li&gt;
&lt;li&gt;Pattern: repository per BC:

&lt;ul&gt;
&lt;li&gt;First step to understand dependencies.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: database per BC:

&lt;ul&gt;
&lt;li&gt;Bet for future split.&lt;/li&gt;
&lt;li&gt;Recommend for greenfield.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Code first:

&lt;ul&gt;
&lt;li&gt;Most common.&lt;/li&gt;
&lt;li&gt;Short-term improvements.&lt;/li&gt;
&lt;li&gt;Pattern: Monolith as data access layer:

&lt;ul&gt;
&lt;li&gt;Same pattern as "aggregate exposing monolith".&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Multischema storage:

&lt;ul&gt;
&lt;li&gt;New microservice uses new schema for new functionality/data, old schema for existing data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;DB and code at the same time:

&lt;ul&gt;
&lt;li&gt;Avoid.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Schema separation examples:

&lt;ul&gt;
&lt;li&gt;Pattern: Split table:

&lt;ul&gt;
&lt;li&gt;When table is owned by 2 or more BC.&lt;/li&gt;
&lt;li&gt;Lose referential integrity.&lt;/li&gt;
&lt;li&gt;Will need to chose the owner of the data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Move foreign-key relationship to code:

&lt;ul&gt;
&lt;li&gt;Increase latency: from 1 join query to 1 select + n service calls.&lt;/li&gt;
&lt;li&gt;Data consistency, deletion options:

&lt;ol&gt;
&lt;li&gt;Check with all services before deleting:

&lt;ul&gt;
&lt;li&gt;More coupling, reverse dependency.&lt;/li&gt;
&lt;li&gt;Don't use.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Handle 404/410 gracefully in dependant service.&lt;/li&gt;

&lt;li&gt;Don't allow deletion:

&lt;ul&gt;
&lt;li&gt;Soft delete/tombstone record.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Static reference data:

&lt;ul&gt;
&lt;li&gt;Duplicate:

&lt;ul&gt;
&lt;li&gt;As it changes infrequently maybe ok.&lt;/li&gt;
&lt;li&gt;For large volume of data.&lt;/li&gt;
&lt;li&gt;Background process to update it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Dedicated schema:

&lt;ul&gt;
&lt;li&gt;No duplication, always up to date.&lt;/li&gt;
&lt;li&gt;Allows for cross-schema joins.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Static library:

&lt;ul&gt;
&lt;li&gt;For small datasets.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Data service:

&lt;ul&gt;
&lt;li&gt;When creating a new microservice is cheap.&lt;/li&gt;
&lt;li&gt;Maybe can emit change events.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Avoid distributed transactions.&lt;/li&gt;

&lt;li&gt;Sagas:

&lt;ul&gt;
&lt;li&gt;Model transactions as business processes.&lt;/li&gt;
&lt;li&gt;Specially for long lived transactions.&lt;/li&gt;
&lt;li&gt;Rollback with compensating transactions.&lt;/li&gt;
&lt;li&gt;Two implementations:

&lt;ol&gt;
&lt;li&gt;Orchestrated:

&lt;ul&gt;
&lt;li&gt;Central coordinator. Command and control.&lt;/li&gt;
&lt;li&gt;Pro: easier to understand.&lt;/li&gt;
&lt;li&gt;Cons: coupling.&lt;/li&gt;
&lt;li&gt;Warn: Anemic microservices: coordinator having too much logic that should be in microservices.&lt;/li&gt;
&lt;li&gt;Different services can play the coordinator role for different flows.&lt;/li&gt;
&lt;li&gt;BPM tools: issue is that they are non-dev tools that end up being used by devs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://camunda.com/" rel="noopener noreferrer"&gt;Camuda&lt;/a&gt; and &lt;a href="https://github.com/camunda-cloud/zeebe" rel="noopener noreferrer"&gt;Zeebe&lt;/a&gt; are targeted to microservices developers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Choreographed:

&lt;ul&gt;
&lt;li&gt;Distributed responsibility. Trust but verify.&lt;/li&gt;
&lt;li&gt;Usually event based.&lt;/li&gt;
&lt;li&gt;Pro: decoupled.&lt;/li&gt;
&lt;li&gt;Cons: harder to understand whole flow.&lt;/li&gt;
&lt;li&gt;Use correlation Id to build/know the state of the saga:

&lt;ul&gt;
&lt;li&gt;Service to read all events to show view.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 5 - Growing Pains
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;More detailed in "Building microservices" book.&lt;/li&gt;
&lt;li&gt;Based on anecdotal experience.&lt;/li&gt;
&lt;li&gt;The more coupling, the earlier the pains will manifest:

&lt;ul&gt;
&lt;li&gt;2-10 services:

&lt;ul&gt;
&lt;li&gt;Breaking changes.&lt;/li&gt;
&lt;li&gt;Reporting.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;10-50: 

&lt;ul&gt;
&lt;li&gt;Ownership at scale.&lt;/li&gt;
&lt;li&gt;Developer experience.&lt;/li&gt;
&lt;li&gt;Running too many things.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;50+:

&lt;ul&gt;
&lt;li&gt;Loads of teams.&lt;/li&gt;
&lt;li&gt;Global vs local optimization.&lt;/li&gt;
&lt;li&gt;Orphaned services.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;In all:

&lt;ul&gt;
&lt;li&gt;Robustness and resilience.&lt;/li&gt;
&lt;li&gt;Monitoring and troubleshooting.&lt;/li&gt;
&lt;li&gt;End-to-end testing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Ownership at scale:

&lt;ul&gt;
&lt;li&gt;Without strong code ownership (one and only one team can change service, other teams can do pull requests to propose changes) a microservices' architecture will grow into a distributed monolith.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Breaking changes:

&lt;ul&gt;
&lt;li&gt;Avoiding accidental breaking changes:

&lt;ol&gt;
&lt;li&gt;Explicit schema to avoid structural breakages.

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/nilslice/protolock" rel="noopener noreferrer"&gt;Protolock&lt;/a&gt; to prohibit incompatible changes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;To avoid semantic breakages: testing.

&lt;ul&gt;
&lt;li&gt;Make it hard to change a service contract:

&lt;ul&gt;
&lt;li&gt;Make it obvious, no magic, or generate schemas from code.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;Non-accidental:

&lt;ol&gt;
&lt;li&gt;Do not break, but &lt;a href="https://www.youtube.com/watch?v=YR5WdGrpoug" rel="noopener noreferrer"&gt;accrete&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Give consumers time to migrate:

&lt;ol&gt;
&lt;li&gt;Run two versions of the service.&lt;/li&gt;
&lt;li&gt;Support old and new endpoints in the service.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;Be more relaxed if changes are within a team.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Reporting:

&lt;ul&gt;
&lt;li&gt;Build a reporting specific schema.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Monitoring and Troubleshooting:

&lt;ul&gt;
&lt;li&gt;Log aggregation:

&lt;ul&gt;
&lt;li&gt;First thing to do when implementing microservices.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tracing:

&lt;ul&gt;
&lt;li&gt;API GW or service mesh to generate the correlation ID.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Test in production:

&lt;ul&gt;
&lt;li&gt;Synthetic transactions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Towards observability:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/library/view/distributed-systems-observability/9781492033431/" rel="noopener noreferrer"&gt;Distributed Systems Observability&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Local developer experience:

&lt;ul&gt;
&lt;li&gt;How many services to run locally?&lt;/li&gt;
&lt;li&gt;Solutions:

&lt;ul&gt;
&lt;li&gt;Stubs.&lt;/li&gt;
&lt;li&gt;Point to instance running elsewhere.&lt;/li&gt;
&lt;li&gt;One remote env per developer:

&lt;ul&gt;
&lt;li&gt;Slow to deploy to test changes.&lt;/li&gt;
&lt;li&gt;Cost.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Mix local/remote:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.telepresence.io" rel="noopener noreferrer"&gt;Telepresence&lt;/a&gt; for Kubernetes.&lt;/li&gt;
&lt;li&gt;Azure's cloud functions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Running too many things:

&lt;ul&gt;
&lt;li&gt;Deployment, configuration and management of instances becomes more difficult.&lt;/li&gt;
&lt;li&gt;Solution:

&lt;ul&gt;
&lt;li&gt;Kubernetes.&lt;/li&gt;
&lt;li&gt;Function-as-a-Service (preferred).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;End-to-end testing:

&lt;ul&gt;
&lt;li&gt;Even slower and even more brittle.&lt;/li&gt;
&lt;li&gt;Solutions:

&lt;ul&gt;
&lt;li&gt;No cross team tests.&lt;/li&gt;
&lt;li&gt;Consumer-driven contracts:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.pact.io" rel="noopener noreferrer"&gt;Pact&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Use automated release remediation and progressive delivery in addition to end-to-end tests.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Global vs local optimization:

&lt;ul&gt;
&lt;li&gt;Solving the same problem twice.&lt;/li&gt;
&lt;li&gt;Divergent tech stack.&lt;/li&gt;
&lt;li&gt;Solutions:

&lt;ul&gt;
&lt;li&gt;Cross-cutting group to raise awareness/make tech decisions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Robustness and resilience:

&lt;ul&gt;
&lt;li&gt;See &lt;a href="https://amzn.to/3eGmoLx" rel="noopener noreferrer"&gt;Release it!&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Orphaned Services:

&lt;ul&gt;
&lt;li&gt;In-house service registries that combines service discovery + code repository data.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>books</category>
      <category>architecture</category>
    </item>
    <item>
      <title>The self-inflicted denial-of-service (DDoS) attack</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Wed, 27 Apr 2022 11:43:35 +0000</pubDate>
      <link>https://forem.com/danlebrero/the-self-inflicted-denial-of-service-ddos-attack-pgm</link>
      <guid>https://forem.com/danlebrero/the-self-inflicted-denial-of-service-ddos-attack-pgm</guid>
      <description>&lt;p&gt;I was happily complaining reviewing some pull request, when the following piece of code make me shudder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var unsent-messages = new List();

function log(message) {
    unsent-message =+ message
}

every (5 secs) {
    send-all(unsent-messages)
    unsent-message = new List();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it made me smile. I had seen a similar piece of code cause a major outage on a billion dollar company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outage 1
&lt;/h2&gt;

&lt;p&gt;As all good outages, it all started with some network misconfiguration.&lt;/p&gt;

&lt;p&gt;In this case, the network issue made all the company's systems unreachable from the outside, causing a few minutes outage.&lt;/p&gt;

&lt;p&gt;Change was reverted, service was restored, blame was assigned, bureaucracy was added and we all went back to work.&lt;/p&gt;

&lt;p&gt;At least for some minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outage 2
&lt;/h2&gt;

&lt;p&gt;A side effect of fixing the first outage was that in few seconds, like a thundering herd, thousands of our client's browsers were trying to reconnect to back.&lt;/p&gt;

&lt;p&gt;All services hold their ground except for one: the browser statistics service.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Browser Statistics Service (stats service)
&lt;/h3&gt;

&lt;p&gt;The stats service was born to collect feature usage data for one team, for one particular subset of the web application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Fstats-service-architecture.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Fstats-service-architecture.png" alt="service architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The service log into disk the usage data sent by the browser, Splunk read the log files, and the developers build in Splunk their dashboards and alerts.&lt;/p&gt;

&lt;p&gt;It was all self-service and very low bureaucracy friction, which meant that all front-end teams ended up adopting it.&lt;/p&gt;

&lt;p&gt;Obviously, no stats is complete without knowing how times something fails (aka. exceptions) and in what way (aka. stacktrace).&lt;/p&gt;

&lt;p&gt;And here is where trouble started.&lt;/p&gt;

&lt;h3&gt;
  
  
  A big pile of errors
&lt;/h3&gt;

&lt;p&gt;During the first outage, as none of the backend services were reachable, the client's browsers have been collecting the stats of all failed attempts. &lt;/p&gt;

&lt;p&gt;When the first outage was fixed, for the stats service was like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Flike-a-thundering-herd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Flike-a-thundering-herd.gif" alt="thundering herd"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The service could not write fast enough to disk, so requests started to pile up in the stats service.&lt;/p&gt;

&lt;p&gt;The piled up requests increased the memory pressure, causing the stats service to GC like crazy, adding yet more latency.&lt;/p&gt;

&lt;p&gt;When the Apaches noticed that an stats service instance was not timely responding, they did the opposite of what you would like: they resent the requests to another instance, basically doubling the pressure.&lt;/p&gt;

&lt;p&gt;And, as all these request started to fail or timeout, the client's browser diligently recorded the failure and added it to the pile of errors to report.&lt;/p&gt;

&lt;h2&gt;
  
  
  DDoS attack
&lt;/h2&gt;

&lt;p&gt;To add salt to the injury, the front-end stats library had been designed to not lose data, hence a failed request to the stats service would not reset the stats.&lt;/p&gt;

&lt;p&gt;In fact, the failed stats requests would be recorded and added to the next stats service call, which made the stats message size bigger and bigger, adding more and more pressure to the already struggling stats service and everything on its path.&lt;/p&gt;

&lt;p&gt;The amount of traffic caused the Apache layer to start choking, making requests to other downstream services slower and slower.&lt;/p&gt;

&lt;p&gt;This raised the number of errors in the client's browsers, which increased the stats request's size even further, which caused the Apaches to choke even more, which added extra latency, causing more errors, bigger requests, more latency, more errors, ... &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Fsnowball-effect.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Fsnowball-effect.gif" alt="thundering herd"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;End result: thousands of browsers all over the globe sending every few seconds megabyte long POST requests to the stats service, telling the stats service that the stats service - and everything else - was failing. &lt;/p&gt;

&lt;p&gt;A complete outage thanks to a self-inflicted distributed denial-of-service attack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steady State pattern
&lt;/h2&gt;

&lt;p&gt;Multiple things went wrong (and multiple things we fixed afterwards). &lt;/p&gt;

&lt;p&gt;Focusing on the initial piece of code, applying the &lt;a href="https://www.amazon.com/Release-Design-Deploy-Production-Ready-Software/dp/1680502395" rel="noopener noreferrer"&gt;Steady State pattern&lt;/a&gt; could have avoided the issue. &lt;/p&gt;

&lt;p&gt;Steady State just points out the obvious: &lt;a href="https://danlebrero.com/2017/08/03/stability-patterns-a-case-study-devoxx-pl-2017-video/#content" rel="noopener noreferrer"&gt;nothing is infinite&lt;/a&gt;. Not memory, not CPU, not bandwidth, not disk, not time, not money.&lt;/p&gt;

&lt;p&gt;So you need to set some limits: the max size in the unsent messages array in this case. &lt;/p&gt;

&lt;p&gt;Adding those limits is scary, mostly because the &lt;a href="https://en.wikipedia.org/wiki/Fear_of_missing_out" rel="noopener noreferrer"&gt;fear of missing out&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;But without those limits, your system's stability is at risk, specially when things start to fail. &lt;/p&gt;

&lt;p&gt;And remember that ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Ffailure-is-inevitable.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fddos%2Ffailure-is-inevitable.png" alt="failure-inevitable"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>resilience</category>
      <category>ddos</category>
    </item>
    <item>
      <title>Book notes: Turn the Ship Around!</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Wed, 20 Apr 2022 12:57:43 +0000</pubDate>
      <link>https://forem.com/danlebrero/book-notes-turn-the-ship-around-4l0c</link>
      <guid>https://forem.com/danlebrero/book-notes-turn-the-ship-around-4l0c</guid>
      <description>&lt;p&gt;These are my notes on &lt;a href="https://amzn.to/3EJefjZ"&gt;Turn the Ship Around!&lt;/a&gt; by &lt;a href="https://twitter.com/ldavidmarquet"&gt;L. David Marquet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Classic. &lt;/p&gt;

&lt;h1&gt;
  
  
  Key Insights
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Divested control only works with a competent workforce that understands the org's purpose.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TU-I-NAO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/turn-the-ship-around/control-competence-clarity.png" alt="control-competence-clarity" width="640" height="375"&gt;
&lt;/li&gt;
&lt;li&gt;Disengaged, dissatisfied employees break the spirits of their colleagues.&lt;/li&gt;
&lt;li&gt;Thinking that we know something is a barrier to continued learning.&lt;/li&gt;
&lt;li&gt;It is contradictory to have an empowerment program whereby you are empowered by your boss.&lt;/li&gt;
&lt;li&gt;I was at my best when give specific goals and broad latitude in how to accomplish them.&lt;/li&gt;
&lt;li&gt;Are you optimizing the org for your tenure, or forever?&lt;/li&gt;
&lt;li&gt;It doesn't matter how smart a plan is if the team cannot execute it.&lt;/li&gt;
&lt;li&gt;When performance of a unit goes down after an official leaves, it is taken as a sign that he was a good leader, not that he was ineffective in training his people properly.&lt;/li&gt;
&lt;li&gt;Avoiding errors == no new initiatives, no innovation.&lt;/li&gt;
&lt;li&gt;Don't move information to authority, move authority to the information.&lt;/li&gt;
&lt;li&gt;Worries to delegate control usually fall either in lack of technical competence or lack of clarity on what the org is trying to accomplish. Both can be resolved.&lt;/li&gt;
&lt;li&gt;Short, early conversations make efficient work.&lt;/li&gt;
&lt;li&gt;Demand of perfect products the first time around results in significant waste and frustration.&lt;/li&gt;
&lt;li&gt;Trust == I believe you don't lie, but you can still be wrong.&lt;/li&gt;
&lt;li&gt;Use "I intend to ... " to turn passive followers into active leaders:

&lt;ul&gt;
&lt;li&gt;It has to include all the rationale of the decision which caused subordinates to think at the next higher level.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Adherence to the process frequently becomes the objective, as opposed to achieving the objective that the process was put in place to achieve.&lt;/li&gt;
&lt;li&gt;When I heard what my officers where thinking, it made it much easier for me to keep my mouth shout and let them execute their plans.&lt;/li&gt;
&lt;li&gt;Lack of certainty is strength and certainty is arrogance.&lt;/li&gt;
&lt;li&gt;Inspectors == disseminate ideas in the org, learn from others.&lt;/li&gt;
&lt;li&gt;Balancing the courage to hold people accountable for their actions with the compassion for their honest efforts.&lt;/li&gt;
&lt;li&gt;Control without competence is chaos.&lt;/li&gt;
&lt;li&gt;
How to design a training program.&lt;/li&gt;
&lt;li&gt;A briefing is a passive activity for everyone except the briefer.&lt;/li&gt;
&lt;li&gt;Provide your people with the objective and let them figure out the method.&lt;/li&gt;
&lt;li&gt;One hour session with supervisors:

&lt;ul&gt;
&lt;li&gt;Rule: only talk about long-term issues, and primarily people issues.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Steps to move to leader-leader.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Mechanisms
&lt;/h1&gt;

&lt;p&gt;Compiled list of mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Control mechanisms:

&lt;ul&gt;
&lt;li&gt;Find the genetic code for control and rewrite it.&lt;/li&gt;
&lt;li&gt;Act your way to new thinking.&lt;/li&gt;
&lt;li&gt;Short, early conversations make efficient work.&lt;/li&gt;
&lt;li&gt;Use "I intent to ..." to turn passive followers into active leaders.&lt;/li&gt;
&lt;li&gt;Resist urge to provide solutions.&lt;/li&gt;
&lt;li&gt;Eliminate top-down monitoring systems.&lt;/li&gt;
&lt;li&gt;Think out aloud (both superiors and subordinates):

&lt;ul&gt;
&lt;li&gt;Also a clarity practice.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Embrace the inspectors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Competence mechanisms:

&lt;ul&gt;
&lt;li&gt;Take deliberate action.&lt;/li&gt;
&lt;li&gt;We learn (everywhere, all the time).&lt;/li&gt;
&lt;li&gt;Don't brief, certify.&lt;/li&gt;
&lt;li&gt;Continually and constantly repeat the message.&lt;/li&gt;
&lt;li&gt;Specify goals, not methods.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Clarity mechanisms:

&lt;ul&gt;
&lt;li&gt;Achieve excellence, don't just avoid errors.&lt;/li&gt;
&lt;li&gt;Build trust and take care of your people.&lt;/li&gt;
&lt;li&gt;Use your legacy for inspiration.&lt;/li&gt;
&lt;li&gt;Use guiding principles for decision criteria.&lt;/li&gt;
&lt;li&gt;Use immediate recognition to reinforce desired behaviours.&lt;/li&gt;
&lt;li&gt;Begin with the end in mind.&lt;/li&gt;
&lt;li&gt;Encourage a questioning attitude over blind obedience.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;
Starting Over

&lt;ul&gt;
&lt;li&gt;Chapter 1 - Pain&lt;/li&gt;
&lt;li&gt;Chapter 2 - Business as Usual&lt;/li&gt;
&lt;li&gt;Chapter 4 - Frustration&lt;/li&gt;
&lt;li&gt;Chapter 5 - Call to Action&lt;/li&gt;
&lt;li&gt;Chapter 7 - I Relieve You!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Part 2 - Control

&lt;ul&gt;
&lt;li&gt;Chapter 8 - Change, in a word&lt;/li&gt;
&lt;li&gt;Chapter 9 - Welcome Aboard Santa Fe!&lt;/li&gt;
&lt;li&gt;Chapter 10 - Underway on Nuclear Power&lt;/li&gt;
&lt;li&gt;Chapter 11 - I Intent To ...&lt;/li&gt;
&lt;li&gt;Chapter 12 - Up Scope!&lt;/li&gt;
&lt;li&gt;Chapter 13 - Who's Responsible?&lt;/li&gt;
&lt;li&gt;Chapter 14 - A New Ship&lt;/li&gt;
&lt;li&gt;Chapter 15 - We Have a Problem&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Part 3 - Competence

&lt;ul&gt;
&lt;li&gt;Chapter 16 - Mistakes Just Happen!&lt;/li&gt;
&lt;li&gt;Chapter 17 - We learn&lt;/li&gt;
&lt;li&gt;Chapter 18 - Under Way for San Diego&lt;/li&gt;
&lt;li&gt;Chapter 19 - All Present and Accounted for&lt;/li&gt;
&lt;li&gt;Chapter 20 - Final Preparations&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Part 4 - Clarity

&lt;ul&gt;
&lt;li&gt;Chapter 21 - Under Way for Deployment&lt;/li&gt;
&lt;li&gt;Chapter 22 - A Remembrance of War&lt;/li&gt;
&lt;li&gt;Chapter 23 - Leadership at Every Level&lt;/li&gt;
&lt;li&gt;Chapter 24 - A Dangerous Passage&lt;/li&gt;
&lt;li&gt;Chapter 25 - Looking Ahead&lt;/li&gt;
&lt;li&gt;Chapter 26 - Combat Effectiveness&lt;/li&gt;
&lt;li&gt;Chapter 27 - Homecoming&lt;/li&gt;
&lt;li&gt;Chapter 28 - A New Method of Resupplying&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Chapter 29 - Ripples&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Introduction
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Disengaged, dissatisfied employees break the spirits of their colleagues.&lt;/li&gt;
&lt;li&gt;Leader-follower:

&lt;ul&gt;
&lt;li&gt;People who are treated as followers have the expectations of followers and act as followers.

&lt;ul&gt;
&lt;li&gt;Those who take orders run at half speed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Performance of the organization is closely linked to the ability of the leader.&lt;/li&gt;
&lt;li&gt;Leader leaving is a major event.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Leader-leader:

&lt;ul&gt;
&lt;li&gt;Evolutionary steps.&lt;/li&gt;
&lt;li&gt;Divested control only works with a competent workforce that understands the org's purpose:

&lt;ul&gt;
&lt;li&gt;Control, competence, clarity.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;As control is divested, both tech competence and organizational clarity need to be strengthened.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Starting Over
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Thinking that we know something is a barrier to continued learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 1 - Pain
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is contradictory to have an empowerment program whereby you are empowered by your boss.&lt;/li&gt;
&lt;li&gt;I was at my best when give specific goals and broad latitude in how to accomplish them.

&lt;ul&gt;
&lt;li&gt;Irritated when given a task list.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 2 - Business as Usual
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Are you optimizing the org for your tenure, or forever?&lt;/li&gt;
&lt;li&gt;It doesn't matter how smart a plan is if the team cannot execute it.&lt;/li&gt;
&lt;li&gt;When performance of a unit goes down after an official leaves, it is taken as a sign that he was a good leader, not that he was ineffective in training his people properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 4 - Frustration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Being curious (make sure you know) vs being questioning (make sure subordinate knows).&lt;/li&gt;
&lt;li&gt;Bad: Technical knowledge as the basis of leadership.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 5 - Call to Action
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Flashlight anecdote: leading by example.&lt;/li&gt;
&lt;li&gt;Little things like lack of punctuality are indicative of much bigger problems.&lt;/li&gt;
&lt;li&gt;Avoiding mistakes became the primary driver for all actions:

&lt;ul&gt;
&lt;li&gt;Focus exclusively on satisfying minimum requirements.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Leave request required 7 approvals == huge delay.

&lt;ul&gt;
&lt;li&gt;It was the system, not the people, that failed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 7 - I Relieve You!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Self-reinforcing downward spiral:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hn2DRvta--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/turn-the-ship-around/self-reinforcing-downward-spiral.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hn2DRvta--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/turn-the-ship-around/self-reinforcing-downward-spiral.png" alt="self-reinforcing-downward-spiral" width="640" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoiding errors == no new initiatives, no innovation.&lt;/li&gt;
&lt;li&gt;Shift from avoiding errors to achieve excellence.&lt;/li&gt;
&lt;li&gt;Connecting our day-to-day activities to something larger was a strong motivator for the crew.&lt;/li&gt;
&lt;li&gt;Clarity: &lt;a href="https://amzn.to/3qIL8ID"&gt;Start with Why&lt;/a&gt; by Simon Sinek.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part 2 - Control
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Don't move information to authority, move authority to the information.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 8 - Change, in a word
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Start at the mid-level managers:

&lt;ul&gt;
&lt;li&gt;Starting top-down contrary to a bottom-up leadership philosophy.&lt;/li&gt;
&lt;li&gt;Starting at the bottom: too inexperience people.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;When delegating decision-making authority, I was worried ... that the interests of the command would not be protected. That didn't happen.&lt;/li&gt;
&lt;li&gt;Find the genetic code for control and rewrite it:

&lt;ul&gt;
&lt;li&gt;Senior leadership exercise:

&lt;ol&gt;
&lt;li&gt;Identify in the org's policy documents where decision-making authority is specified.&lt;/li&gt;
&lt;li&gt;Identify decisions that are candidates for being pushed to the next lower level in the org.&lt;/li&gt;
&lt;li&gt;For easy decisions, draft change. For large decisions, maybe disaggregate.&lt;/li&gt;
&lt;li&gt;Ask each participant to complete the following sentence in a 5x8 card:

&lt;ul&gt;
&lt;li&gt;"When I think about delegating this decision, I worry that ..."&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Post cards on the wall, go on a long break, and let the group mill around them.&lt;/li&gt;
&lt;li&gt;Sort and rank worries and begin to attack them.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Worries usually fall either in lack of technical competence or lack of clarity on what the org is trying to accomplish. Both can be resolved.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 9 - Welcome Aboard Santa Fe!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The fear and cost of being different.&lt;/li&gt;
&lt;li&gt;How to embed a cultural change in your org:

&lt;ol&gt;
&lt;li&gt;Identify what cultural change is required.&lt;/li&gt;
&lt;li&gt;In a 5x8 card, people complete the sentence:

&lt;ul&gt;
&lt;li&gt;"I'd know we achieved [this cultural change] if I saw employees ..."&lt;/li&gt;
&lt;li&gt;Expectation is that the answers will be specific and measurable.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Allow 5 mins, tape card to wall, go to break, have everyone mill around reading cards.&lt;/li&gt;
&lt;li&gt;Depending on discussions and quality of answers, give everyone a second shot.&lt;/li&gt;
&lt;li&gt;Short and prioritize answers.&lt;/li&gt;
&lt;li&gt;Discuss how to code the behaviours into company's practices.&lt;/li&gt;
&lt;li&gt;Write new practices in appropriate company procedures.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 10 - Underway on Nuclear Power
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adding additional verification/review steps to a process == extra work without making anything better.&lt;/li&gt;
&lt;li&gt;Short, early conversations make efficient work.

&lt;ul&gt;
&lt;li&gt;Early feedback of unfinished work.&lt;/li&gt;
&lt;li&gt;Not to order but to provide clarity.&lt;/li&gt;
&lt;li&gt;Hierarchy is supposed to protect Commanding Officer time (== highly valuable).&lt;/li&gt;
&lt;li&gt;Demand of perfect products the first time around results in significant waste and frustration.&lt;/li&gt;
&lt;li&gt;Early feedback raised the question:

&lt;ul&gt;
&lt;li&gt;"Don't you trust me?"&lt;/li&gt;
&lt;li&gt;Trust == I believe you don't lie, but you can still be wrong.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 11 - I Intent To ...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use "I intend to ... " to turn passive followers into active leaders.

&lt;ul&gt;
&lt;li&gt;Disempowered phrases that passive followers use:

&lt;ul&gt;
&lt;li&gt;Request permission to ...&lt;/li&gt;
&lt;li&gt;I would like to ...&lt;/li&gt;
&lt;li&gt;What should I do about ...&lt;/li&gt;
&lt;li&gt;Do you think we should ...&lt;/li&gt;
&lt;li&gt;Could we ...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Empowered phrases that active doers use:

&lt;ul&gt;
&lt;li&gt;I intent to ...&lt;/li&gt;
&lt;li&gt;I plan on ...&lt;/li&gt;
&lt;li&gt;I will ...&lt;/li&gt;
&lt;li&gt;We will ...&lt;/li&gt;
&lt;li&gt;"I intend to" has to include all the rationale of the decision which caused subordinates to think at the next higher level:

&lt;ul&gt;
&lt;li&gt;Basically training them to be their boss.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Book recommendations:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/3qGChak"&gt;7 Habits of highly effective people&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/3JA7eWB"&gt;The 8th Habit: From Effectiveness to Greatness&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 12 - Up Scope!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: resist the urge to provide solutions:

&lt;ul&gt;
&lt;li&gt;If there are a lot of short notice decisions, you are in reactive mode:

&lt;ul&gt;
&lt;li&gt;No time to training the team.&lt;/li&gt;
&lt;li&gt;No time to think.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;To get the team thinking:

&lt;ul&gt;
&lt;li&gt;Urgent decisions: make it, then the team &lt;a href="https://www.linkedin.com/pulse/heres-how-red-teaming-may-lead-better-decisions-chris-cline/"&gt;"red-team"&lt;/a&gt; the decision.&lt;/li&gt;
&lt;li&gt;Soon decisions: ask for team input, make the decision.&lt;/li&gt;
&lt;li&gt;Decision can be delayed:

&lt;ul&gt;
&lt;li&gt;Force team to provide inputs.&lt;/li&gt;
&lt;li&gt;Don't force team to come to consensus.&lt;/li&gt;
&lt;li&gt;Cherish dissension: if everybody thinks like you, you don't need them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 13 - Who's Responsible?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: Eliminate top-down monitoring systems:

&lt;ul&gt;
&lt;li&gt;Avoid system whereby senior personnel are determining what junior personnel should be doing:

&lt;ul&gt;
&lt;li&gt;Gives ownership and responsibility.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;You want to keep data collection and measuring processes that simply report conditions without judgment.&lt;/li&gt;
&lt;li&gt;Adherence to the process frequently becomes the objective, as opposed to achieving the objective that the process was put in place to achieve.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 14 - A New Ship
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: Think out loud:

&lt;ul&gt;
&lt;li&gt;When I heard what my officers where thinking, it made it much easier for me to keep my mouth shout and let them execute their plans.&lt;/li&gt;
&lt;li&gt;As the captain, impart important context and experience to subordinates.&lt;/li&gt;
&lt;li&gt;We aren't comfortable talking about gut feelings or anything with probabilities.&lt;/li&gt;
&lt;li&gt;Lack of certainty is strength and certainty is arrogance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 15 - We Have a Problem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: Embrace the Inspectors:

&lt;ul&gt;
&lt;li&gt;No being defensive, but taking ownership.&lt;/li&gt;
&lt;li&gt;Inspectors == disseminate ideas in the org, learn from others.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part 3 - Competence
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 16 - Mistakes Just Happen!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Balancing the courage to hold people accountable for their actions with the compassion for their honest efforts.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://davidmarquet.wordpress.com/2015/01/03/7-steps-to-learning-from-our-mistakes/"&gt;7 Steps to Learning from Our Mistakes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Mechanism: Take deliberate action.

&lt;ul&gt;
&lt;li&gt;Usual ways to avoid mistakes:

&lt;ol&gt;
&lt;li&gt;More training: 

&lt;ul&gt;
&lt;li&gt;Implies lack of knowledge, which can be detected with a test. 

&lt;ul&gt;
&lt;li&gt;What question would detect it?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add more supervision: unlikely to help.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Mistakes due to people in autopilot.&lt;/li&gt;
&lt;li&gt;We want to engage the brain before action:

&lt;ol&gt;
&lt;li&gt;Prior to action, vocalize and gesture towards what you are about to do, even when alone.&lt;/li&gt;
&lt;li&gt;Pause.&lt;/li&gt;
&lt;li&gt;Execute action.&lt;/li&gt;
&lt;li&gt;Even when in emergency.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 17 - We learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Control without competence is chaos.&lt;/li&gt;
&lt;li&gt;
&lt;a id="training"&gt;&lt;/a&gt;Mechanism: We learn (everywhere, all the time):

&lt;ul&gt;
&lt;li&gt;Training program that employees will want to go to:

&lt;ul&gt;
&lt;li&gt;Purpose: increases technical competence, so that&lt;/li&gt;
&lt;li&gt;Increases delegation of decision making, so that&lt;/li&gt;
&lt;li&gt;Increases engagement, motivation and initiative.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;To design, in the next leadership meeting:

&lt;ol&gt;
&lt;li&gt;Hand out 4x6 cards.&lt;/li&gt;
&lt;li&gt;Complete: 

&lt;ul&gt;
&lt;li&gt;"Our company would be more effective if [level] management could make decision about [subject].".&lt;/li&gt;
&lt;li&gt;You fill [level] but the group fills the [subject].&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cards to the wall, break, mill.&lt;/li&gt;
&lt;li&gt;Select a couple of subjects.&lt;/li&gt;
&lt;li&gt;Ask: what, technically, do the people at this level of management need to know in order to make that decision?&lt;/li&gt;
&lt;li&gt;Cards to wall, break, mill.&lt;/li&gt;
&lt;li&gt;Collect list of topic for training.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 18 - Under Way for San Diego
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A briefing is a passive activity for everyone except the briefer:

&lt;ul&gt;
&lt;li&gt;It is not a decision point.&lt;/li&gt;
&lt;li&gt;No one listens to those briefings.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Mechanism: Don't Brief, Certify.

&lt;ul&gt;
&lt;li&gt;In a certification, the person in charge asks them questions:

&lt;ul&gt;
&lt;li&gt;It is a decision point: no certification means no go.&lt;/li&gt;
&lt;li&gt;Requires more management: both what to do and who will do it.&lt;/li&gt;
&lt;li&gt;Active: Shift the onus of preparation to participants. 

&lt;ul&gt;
&lt;li&gt;Everybody responsible to know their job.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 19 - All Present and Accounted for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: continually and consistently repeat the message:

&lt;ul&gt;
&lt;li&gt;Day after day, meeting after meeting, event after event.&lt;/li&gt;
&lt;li&gt;People think they understand, but if they haven't seen it before, it is unlikely that they do.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 20 - Final Preparations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: specify goals, not methods:

&lt;ul&gt;
&lt;li&gt;Provide your people with the objective and let them figure out the method.&lt;/li&gt;
&lt;li&gt;Also a mechanism for Clarity.&lt;/li&gt;
&lt;li&gt;Warn: compliance with procedure supplanting achieving the objective.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part 4 - Clarity
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 21 - Under Way for Deployment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: built trust and take care of your people:

&lt;ul&gt;
&lt;li&gt;Take care != protecting them from the consequences of their own actions.&lt;/li&gt;
&lt;li&gt;Take care == give them every tool and advantage to achieve their aims in life, beyond the job.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 22 - A Remembrance of War
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: use your legacy for inspiration:

&lt;ul&gt;
&lt;li&gt;Use past examples to bring clarity to org's purpose.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 23 - Leadership at Every Level
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;My job as the command is to tap into the existing energy of the command, discover the strengths, and remove barriers to further progress.&lt;/li&gt;
&lt;li&gt;Guiding principle: faced with a decision between two courses of action, provide criteria to chose.&lt;/li&gt;
&lt;li&gt;Mechanism: use guiding principles for decision criteria:

&lt;ul&gt;
&lt;li&gt;Real ones aligned to org's goals.&lt;/li&gt;
&lt;li&gt;Use them for awards or evaluations.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 24 - A Dangerous Passage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: use immediate recognition to reinforce desired behaviours:

&lt;ul&gt;
&lt;li&gt;Don't delay it for official/admin rubber-stamp.&lt;/li&gt;
&lt;li&gt;Awards should not pit a teammate against other, but the team against the external world.

&lt;ul&gt;
&lt;li&gt;Example: avoid "Top 10%".&lt;/li&gt;
&lt;li&gt;Would hinder collaboration otherwise.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gamification.co"&gt;Gabe Zichermann's blog&lt;/a&gt; on gamification.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 25 - Looking Ahead
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: begin with the end in mind:

&lt;ul&gt;
&lt;li&gt;One hour session with supervisors:

&lt;ul&gt;
&lt;li&gt;Rule: only talk about long-term issues, and primarily people issues.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Long term: write down end-of-tour awards/goals (1-3 years in future).&lt;/li&gt;
&lt;li&gt;Make goals specific and measurable:

&lt;ul&gt;
&lt;li&gt;"How would you know if xxx was improved?"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Not mentor-mentee sessions, but mentor-mentor:

&lt;ul&gt;
&lt;li&gt;Both pars learn as much.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 26 - Combat Effectiveness
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: encourage a questioning attitude over blind obedience.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 27 - Homecoming
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a id="steps"&gt;&lt;/a&gt;Steps to move to leader-leader:

&lt;ol&gt;
&lt;li&gt;Identify where excellence is created:

&lt;ul&gt;
&lt;li&gt;Generally interfaces with the customers and the physical world.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Figure out what decision the people responsible for the interfaces need to make to achieve excellence.&lt;/li&gt;
&lt;li&gt;Understand what is needed for those employees to make those decisions:

&lt;ul&gt;
&lt;li&gt;Technical knowledge.&lt;/li&gt;
&lt;li&gt;Understanding org's goals.&lt;/li&gt;
&lt;li&gt;Authority.&lt;/li&gt;
&lt;li&gt;Responsibility for the consequences.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 28 - A New Method of Resupplying
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanism: don't empower, emancipate:

&lt;ul&gt;
&lt;li&gt;Empowerment is necessary but not enough:

&lt;ul&gt;
&lt;li&gt;It is still a top-down structure as leader empowers followers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;You know you have an emancipated team when you no longer need to empower them:

&lt;ul&gt;
&lt;li&gt;You are not their source of power.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 29 - Ripples
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Additional benefits:

&lt;ol&gt;
&lt;li&gt;Excellence after leader leaving.&lt;/li&gt;
&lt;li&gt;Development of new leaders.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://intentbasedleadership.com"&gt;https://intentbasedleadership.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>books</category>
      <category>leadership</category>
    </item>
    <item>
      <title>My personal path to Senior developer ... and beyond!</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Tue, 12 Apr 2022 18:35:00 +0000</pubDate>
      <link>https://forem.com/danlebrero/my-personal-path-to-senior-developer-and-beyond-4fcj</link>
      <guid>https://forem.com/danlebrero/my-personal-path-to-senior-developer-and-beyond-4fcj</guid>
      <description>&lt;p&gt;I have always struggled to answer the question "How do I become a senior developer?". &lt;/p&gt;

&lt;p&gt;It is one of these things that happened so long ago, that I barely remember when or how it happened. Age takes its toll, and I was not clever enough to be blogging back then ( &lt;a href="https://www.youtube.com/watch?v=CCyb70TpOiM" rel="noopener noreferrer"&gt;nudge, nudge, wink, wink&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;But, as I was today moving some &lt;a href="https://danlebrero.com/tags/book_notes/" rel="noopener noreferrer"&gt;book notes&lt;/a&gt; to the blog, it dawned on me what my path was to become a senior developer. &lt;/p&gt;

&lt;p&gt;And it happens to be the same path that moved me to the higher echelons of the IT hierarchy.&lt;/p&gt;

&lt;h2&gt;
  
  
  It all starts with books
&lt;/h2&gt;

&lt;p&gt;For me, it all starts with reading a book (or books):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fsenior-dev%2Fsteps-to-become-a-senior-developer.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fsenior-dev%2Fsteps-to-become-a-senior-developer.jpg" alt="Steps to become a senior developer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Books give me enough (false) confidence to become a big mouth, to have too many opinions, and to make too many suggestions.&lt;/p&gt;

&lt;p&gt;These suggestions translate to a boss getting the (wrong) impression that I know what I am talking about, hence being appointed to solve a hairy problem. Or maybe the boss is trying to teach me a lesson.&lt;/p&gt;

&lt;p&gt;And once I am given the chance... OMG! The little gaps in your fake knowledge become huge chasms that you need to jump, circumvent, or fill up.&lt;/p&gt;

&lt;p&gt;It is all blood, sweat, and tears.&lt;/p&gt;

&lt;p&gt;But the toil nurtures the precious experience that cements your knowledge, your most valuable asset (unless your parents are rich, in which case, it is your parents).&lt;/p&gt;

&lt;h2&gt;
  
  
  Only books?
&lt;/h2&gt;

&lt;p&gt;No. I am sure that other people will have more efficient ways, but, distilled, the general formula is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Obtain some proto-knowledge. &lt;/li&gt;
&lt;li&gt;Find the courage to speak up, to have an opinion. Remember that there is a thin line between courage and stupidity.&lt;/li&gt;
&lt;li&gt;Be in an environment that will give you an opportunity. This requires both courage and forward-thinking.&lt;/li&gt;
&lt;li&gt;Struggle. Be ready to be wrong. Toil.&lt;/li&gt;
&lt;li&gt;Reward! Real world experience == actual knowledge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repeat enough times and your knowledge will become wisdom.&lt;/p&gt;

&lt;p&gt;And don't hurry, this will require a lot of time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cut the chase, what books do I have to read to become a senior software developer?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.google.com/search?q=must+read+books+for+senior+software+developers" rel="noopener noreferrer"&gt;Here&lt;/a&gt; are some lists. &lt;/p&gt;

&lt;p&gt;For the record, I disagree with all of them.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>Book notes: Sooner, safer, happier: Antipatterns and patterns for business agility.</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Tue, 29 Mar 2022 22:31:48 +0000</pubDate>
      <link>https://forem.com/danlebrero/book-notes-sooner-safer-happier-antipatterns-and-patterns-for-business-agility-18lb</link>
      <guid>https://forem.com/danlebrero/book-notes-sooner-safer-happier-antipatterns-and-patterns-for-business-agility-18lb</guid>
      <description>&lt;p&gt;These are my notes on &lt;a href="https://amzn.to/2ZoAaON" rel="noopener noreferrer"&gt;Sooner, safer, happier: patterns and anti-patterns for business agility&lt;/a&gt; by &lt;a href="https://twitter.com/jonsmart" rel="noopener noreferrer"&gt;Jonathan Smart&lt;/a&gt; with &lt;a href="https://twitter.com/zsoltberend" rel="noopener noreferrer"&gt;Zsolt Berend&lt;/a&gt;, &lt;a href="https://twitter.com/mylesogilvie" rel="noopener noreferrer"&gt;Myles Ogilvie&lt;/a&gt; and &lt;a href="https://twitter.com/sirohrer" rel="noopener noreferrer"&gt;Simon Rohrer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The book is like &lt;a href="https://amzn.to/2ZDwwRl" rel="noopener noreferrer"&gt;The DevOps Handbook&lt;/a&gt;, but less technical and more org-wide.&lt;/p&gt;

&lt;h1&gt;
  
  
  Key Insights
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Better Value Sooner Safer Happier (BVSSH):

&lt;ul&gt;
&lt;li&gt;Better == quality.&lt;/li&gt;
&lt;li&gt;Value is unique. OKRs.&lt;/li&gt;
&lt;li&gt;Sooner != faster:

&lt;ul&gt;
&lt;li&gt;Flow efficiency.&lt;/li&gt;
&lt;li&gt;Lead time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Safer: governance, risk, compliance.&lt;/li&gt;

&lt;li&gt;Happier: none of the previous "at any cost".&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;"It is not my problem. I did my bit. The hole is on the other side of the boat".&lt;/li&gt;

&lt;li&gt;SW binary is agile-created (complex) and the path to production is lean (complicated).

&lt;ul&gt;
&lt;li&gt;Milestones make no sense on emergent (complex) domains.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Not "the business" but "our business".&lt;/li&gt;

&lt;li&gt;Imposing Agile is not agile.&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://en.wikipedia.org/wiki/Edgar_Schein" rel="noopener noreferrer"&gt;Edgar Schein&lt;/a&gt;: learning only happens when survival anxiety is greater than learning anxiety (fear of being a noob again).&lt;/li&gt;

&lt;li&gt;"Why" for change must appeal all primary motivators (autonomy, mastery, purpose).

&lt;ul&gt;
&lt;li&gt;You cannot over-communicate the why.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Change is a social activity.

&lt;ul&gt;
&lt;li&gt;Invite over Inflict.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Orgs are &lt;a href="https://danlebrero.com/2021/07/21/thinking-in-systems-summary/#content" rel="noopener noreferrer"&gt;complex adaptive systems&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Any experiment that takes place in them are not experiments because you cannot undo them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;You are never done improving.&lt;/li&gt;

&lt;li&gt;“We don’t have time. We need to go big.” is a fallacy and self-fulfilling prophecy.&lt;/li&gt;

&lt;li&gt;Cognitive overload: willpower is a limited resource, and when it runs out you fall back on habits.&lt;/li&gt;

&lt;li&gt;As more teams adopt the new ways of working, the impediments will be more systemic and harder to resolve.&lt;/li&gt;

&lt;li&gt;Pattern: Descale Before you Scale.&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://en.wikipedia.org/wiki/Joseph_Campbell" rel="noopener noreferrer"&gt;Joseph Campbell&lt;/a&gt;: if the path ahead is clear, you are probably on someone else’s. 

&lt;ul&gt;
&lt;li&gt;Impediments are not in the path; impediments are the path.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Improvement over time is more important than the absolute value.&lt;/li&gt;

&lt;li&gt;Silence is unhealthy.&lt;/li&gt;

&lt;li&gt;Instead of reporting lines, supporting lines.&lt;/li&gt;

&lt;li&gt;People need to be recognized for the lowest cost and quickest time to failure.&lt;/li&gt;

&lt;li&gt;Water-scrum-fall:

&lt;ul&gt;
&lt;li&gt;Urgency paradox: ideas sit 12-18 months on big upfront prioritization, and when they hit the dev team they suddenly become urgent.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Value streams are not oriented around customer personas.&lt;/li&gt;

&lt;li&gt;Funding is a constraint on which to maximize value.&lt;/li&gt;

&lt;li&gt;Applications and puppies have something in common: they are for life, not just for Christmas.&lt;/li&gt;

&lt;li&gt;Install Jira and Jenkins and you're agile.&lt;/li&gt;

&lt;li&gt;Don't manage dependencies, break team.
&amp;gt; Ignorance is the single greatest impediment to throughput.
&lt;cite&gt;&lt;a href="https://twitter.com/tastapod" rel="noopener noreferrer"&gt;Dan North&lt;/a&gt; at &lt;a href="https://dannorth.net/2010/08/30/introducing-deliberate-discovery/" rel="noopener noreferrer"&gt;Introducing Deliberate Discovery&lt;/a&gt;&lt;/cite&gt;
&lt;/li&gt;

&lt;li&gt;Following the plan == not learning.
&amp;gt; Humans need to belong to groups, but the tribal instinct is also an instinct to exclude
&lt;cite&gt;&lt;a href="https://twitter.com/amychua" rel="noopener noreferrer"&gt;Amy Lynn Chua&lt;/a&gt; at &lt;a href="https://amzn.to/3kUriZl" rel="noopener noreferrer"&gt;Political Tribes&lt;/a&gt;&lt;/cite&gt;
&lt;/li&gt;

&lt;li&gt;When a measure becomes a target, it ceases to be a good measure.&lt;/li&gt;

&lt;li&gt;Tacit knowledge can only be shared by socialization (pairing, face-to-face) and a bias for action.&lt;/li&gt;

&lt;li&gt;Learning is more effective when exercises are in the learner context.&lt;/li&gt;

&lt;li&gt;There is no such thing as best practice. Your context is unique.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  List of Patterns and Anti-Patterns
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Anti-pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Focus on Outcomes&lt;/td&gt;
&lt;td&gt;Doing an Agile Transformation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start with Why; Empower the How&lt;/td&gt;
&lt;td&gt;Using Old Ways of Thinking to New Ways of Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Achieve Big Through Small&lt;/td&gt;
&lt;td&gt;The Bigger the Capital “T” Transformation, the Bigger the Change Curve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Descale Before you Scale&lt;/td&gt;
&lt;td&gt;Scaling Agile before Descaling Work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scale Agility, not Agile, Vertically then Sideways&lt;/td&gt;
&lt;td&gt;Grass Roots Hits a Grass Ceiling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not one size fits all&lt;/td&gt;
&lt;td&gt;One Size Fits All&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invite over Inflict&lt;/td&gt;
&lt;td&gt;Inflict over Invite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leaders Go First&lt;/td&gt;
&lt;td&gt;Do as I say, not as I do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Psychological Safety&lt;/td&gt;
&lt;td&gt;Psychological unsafe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emergent Mindset with Servant Leadership&lt;/td&gt;
&lt;td&gt;Deterministic Mindset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimize for Fast End-to-End Flow&lt;/td&gt;
&lt;td&gt;Local Optimization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outcome Hypothesis&lt;/td&gt;
&lt;td&gt;Milestone-driven Predicted solutions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intelligent Flow&lt;/td&gt;
&lt;td&gt;Headless Chicken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop Starting, Start Finishing&lt;/td&gt;
&lt;td&gt;Start Starting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety within Safety&lt;/td&gt;
&lt;td&gt;Lack of Safety within Safety&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organize Safety by Value Stream&lt;/td&gt;
&lt;td&gt;Role-Based Safety Silos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intelligent Control&lt;/td&gt;
&lt;td&gt;Fixed Mindset to Risk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go Slower to Go Faster&lt;/td&gt;
&lt;td&gt;Going Faster Leads to Going Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuous Technical Excellence&lt;/td&gt;
&lt;td&gt;Agile Hollow Shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architect and Organize for Flow&lt;/td&gt;
&lt;td&gt;Misalignment of Teams and Architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart People and Smart Teams with Robot Friends&lt;/td&gt;
&lt;td&gt;Tools Over People&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimize for Learning&lt;/td&gt;
&lt;td&gt;Information and Learning Silos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested Learning with Built-in Feedback Loops&lt;/td&gt;
&lt;td&gt;Output over Outcomes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Communicate, Communicate, Communicate&lt;/td&gt;
&lt;td&gt;The Bubble Effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Be Comfortable with Uncertainty&lt;/td&gt;
&lt;td&gt;Applying a Deterministic Approach to an Emergent Domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Measure for Learning&lt;/td&gt;
&lt;td&gt;Weaponized Metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A Sense Of Urgency&lt;/li&gt;
&lt;li&gt;How We Got Here&lt;/li&gt;
&lt;li&gt;Chapter 1 - Focus On Outcomes: Better Value Sooner Safer Happier&lt;/li&gt;
&lt;li&gt;Chapter 2 - Achieve Big Through Small&lt;/li&gt;
&lt;li&gt;Chapter 3 - Optimization over One Way; Invite over Inflict&lt;/li&gt;
&lt;li&gt;Chapter 4 - Leadership Will Make It or Break It&lt;/li&gt;
&lt;li&gt;Chapter 5 - Build the Right Thing; Intelligent Flow&lt;/li&gt;
&lt;li&gt;Chapter 6 - Building the Thing Right; Intelligent Control&lt;/li&gt;
&lt;li&gt;Chapter 7 - Continuous Attention to Technical Excellence&lt;/li&gt;
&lt;li&gt;Chapter 8 - Create a Learning Ecosystem&lt;/li&gt;
&lt;li&gt;Chapter 9 - The Best Time to Plant a Tree is Twenty Years Ago; the Second Best Time is Now&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;A Sense Of Urgency
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;There is no such thing as best practice. Your context is unique.&lt;/li&gt;
&lt;li&gt;Better Value Sooner Safer Happier (BVSSH):

&lt;ul&gt;
&lt;li&gt;Better == quality.&lt;/li&gt;
&lt;li&gt;Value is unique.&lt;/li&gt;
&lt;li&gt;Sooner != faster.&lt;/li&gt;
&lt;li&gt;Safer: governance, risk, compliance.&lt;/li&gt;
&lt;li&gt;Happier: none of the previous "at any cost".&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Practices = principles + context.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;How We Got Here
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Maximize outcomes with minimal output.&lt;/li&gt;
&lt;li&gt;Doing &lt;strong&gt;A&lt;/strong&gt;gile vs being &lt;strong&gt;a&lt;/strong&gt;gile.&lt;/li&gt;
&lt;li&gt;"It is not my problem. I did my bit. The hole is on the other side of the boat".&lt;/li&gt;
&lt;li&gt;SW binary is agile-created (complex) and the path to production is lean (complicated).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 1 - Focus On Outcomes: Better Value Sooner Safer Happier
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;They apply to the whole org:

&lt;ul&gt;
&lt;li&gt;Not "the business" but "our business".&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Value == OKRs.&lt;/li&gt;

&lt;li&gt;Sooner:

&lt;ul&gt;
&lt;li&gt;Flow efficiency:

&lt;ul&gt;
&lt;li&gt;work time / end to end lead time.&lt;/li&gt;
&lt;li&gt;Typically, 10% or lower.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Lead time:

&lt;ul&gt;
&lt;li&gt;Measure the 85% percentile and its change over time. &lt;/li&gt;
&lt;li&gt;Throughput:

&lt;ul&gt;
&lt;li&gt;Items per period.&lt;/li&gt;
&lt;li&gt;Should increase when reducing lead time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Values balance each other.&lt;/li&gt;

&lt;li&gt;Cheaper == anti-pattern:

&lt;ul&gt;
&lt;li&gt;Increases hidden costs via a reduction in flow efficiency.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Doing an Agile Transformation

&lt;ul&gt;
&lt;li&gt;Reasons to try an Agile Transformation:

&lt;ul&gt;
&lt;li&gt;“We are being disrupted. If we don’t change we won’t survive”.&lt;/li&gt;
&lt;li&gt;Issues:

&lt;ol&gt;
&lt;li&gt;Optimizes for the agile tool, not the outcomes.&lt;/li&gt;
&lt;li&gt;Cargo cult. “Doing agile”.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Using Old Ways of Thinking to New Ways of Working.

&lt;ol&gt;
&lt;li&gt;Imposing Agile is not agile:

&lt;ul&gt;
&lt;li&gt;Top-down, command-and-control.&lt;/li&gt;
&lt;li&gt;Big upfront planning.&lt;/li&gt;
&lt;li&gt;Deadlines.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Emotional reactions:

&lt;ul&gt;
&lt;li&gt;Fear and resistance.&lt;/li&gt;
&lt;li&gt;Loss aversion.&lt;/li&gt;
&lt;li&gt;Agentic state:

&lt;ul&gt;
&lt;li&gt;Blindly obey orders, passing the responsibility for the consequences of the person giving the orders.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Remove intrinsic motivators:

&lt;ul&gt;
&lt;li&gt;Autonomy: no choice on Transformation.&lt;/li&gt;
&lt;li&gt;Mastery: new thing, hence becoming a beginner.&lt;/li&gt;
&lt;li&gt;Purpose: If the reason for AT is reducing cost or increasing benefits.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Focus on Outcomes.&lt;/li&gt;

&lt;li&gt;Pattern: Start with Why; Empower the How:

&lt;ul&gt;
&lt;li&gt;Simon Sinek: people don’t buy what you do, they buy why you do it.&lt;/li&gt;
&lt;li&gt;Edgar Schein: learning only happens when survival anxiety is greater than learning anxiety (fear of being a noob again).&lt;/li&gt;
&lt;li&gt;“Why” for change must appeal all primary motivators.&lt;/li&gt;
&lt;li&gt;You cannot over-communicate the why.&lt;/li&gt;
&lt;li&gt;Orgs are &lt;a href="https://danlebrero.com/2021/07/21/thinking-in-systems-summary/#content" rel="noopener noreferrer"&gt;complex adaptive systems&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Any experiment that takes place in them are not experiments because you cannot undo them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Start with:

&lt;ol&gt;
&lt;li&gt;Identify early adopters by running a voluntary Community of Practice.&lt;/li&gt;
&lt;li&gt;Create a central Ways of Working Center of Enablement.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;You are never done improving.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 2 - Achieve Big Through Small
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Anti-pattern: The Bigger the Capital “T” Transformation, the Bigger the Change Curve.

&lt;ul&gt;
&lt;li&gt;Change curve: 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fsooner-safer-happier%2Fcurve-change.png" alt="change curve"&gt;
&lt;/li&gt;
&lt;li&gt;“We don’t have time. We need to go big.” is a fallacy and self-fulfilling prophecy.&lt;/li&gt;
&lt;li&gt;Cognitive overload: willpower is a limited resource, and when it runs out you fall back on habits.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Scaling Agile before Descaling Work.

&lt;ul&gt;
&lt;li&gt;Parkinson’s law.&lt;/li&gt;
&lt;li&gt;Also Parkinson: bureaucracies expands at a rate of 5-7% each year irrespective of the variation in the amount of work.

&lt;ul&gt;
&lt;li&gt;Policies, standards and controls expand with the number of control staff employed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Scale of the org itself can be an impediment for BVSSH.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Grass Roots Hits a Grass Ceiling.&lt;/li&gt;

&lt;li&gt;Pattern: Achieve Big Through Small:

&lt;ul&gt;
&lt;li&gt;People have a limited capacity to unlearn and relearn.&lt;/li&gt;
&lt;li&gt;The only way to determine the optimal course of action is by safe-to-learn doing.&lt;/li&gt;
&lt;li&gt;Rule of one:

&lt;ul&gt;
&lt;li&gt;1 experiment.&lt;/li&gt;
&lt;li&gt;1 customer or team.&lt;/li&gt;
&lt;li&gt;1 location.&lt;/li&gt;
&lt;li&gt;In production.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;As more teams adopt the new ways of working, the impediments will be more systemic and harder to resolve.

&lt;ul&gt;
&lt;li&gt; Don’t continue until these are alleviated.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Adoption as an S-curve: 
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fbooks%2Fsooner-safer-happier%2Fadoption-curve.png" alt="adoption curve"&gt;

&lt;ul&gt;
&lt;li&gt;One per business unit and key systemic enabler.&lt;/li&gt;
&lt;li&gt;One small WoW CoE per business unit, reporting to the business unit, not the central CoE.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Descale Before you Scale:

&lt;ul&gt;
&lt;li&gt;Descale work and system of work.&lt;/li&gt;
&lt;li&gt;An org is a network of interdependent services:

&lt;ul&gt;
&lt;li&gt;Descaling should include breaking dependencies.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: Scale Agility, not Agile, Vertically then Sideways.

&lt;ul&gt;
&lt;li&gt;New middle management role:

&lt;ul&gt;
&lt;li&gt;Ensure that the mission and desired outcomes are clear, then listen, coach and remove impediments.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/01/06/toyota-kata-in-software-development-continuous-improvement/" rel="noopener noreferrer"&gt;Coaching Kata&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 3 - Optimization over One Way; Invite over Inflict
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Anti-pattern: One Size Fits All

&lt;ul&gt;
&lt;li&gt;Joseph Campbell: if the path ahead is clear, you are probably on someone else’s.&lt;/li&gt;
&lt;li&gt;Your scaling and cultural context is unique.

&lt;ul&gt;
&lt;li&gt;And culture will vary between teams, business units, geography,...&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Inflict over Invite.&lt;/li&gt;

&lt;li&gt;Pattern: Not one size fits all:

&lt;ul&gt;
&lt;li&gt;Unique VOICE:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;V&lt;/strong&gt;alues and principles:

&lt;ul&gt;
&lt;li&gt;Behavioral guardrails that apply across context.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;O&lt;/strong&gt;utcomes and purpose:

&lt;ul&gt;
&lt;li&gt;Improvement over time is more important than the absolute value.&lt;/li&gt;
&lt;li&gt;Targets should be avoided as they invite cargo cult and gaming the system.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;I&lt;/strong&gt;ntent-based leadership:

&lt;ul&gt;
&lt;li&gt;High autonomy with high alignment.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;C&lt;/strong&gt;oaching and support:

&lt;ul&gt;
&lt;li&gt;Coach should be omnists: recognize and respect all bodies of knowledge without fundamentalism.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;E&lt;/strong&gt;xperimentation:

&lt;ul&gt;
&lt;li&gt;Complex system: probe, sense, respond.&lt;/li&gt;
&lt;li&gt;Edgar Schein: you cannot understand a system until you try and change it, and when you do try to change it, only then will the underlying mechanisms maintaining the status quo emerge.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;“No”, “Not yet” or “What do we stop in order to do this?”&lt;/li&gt;

&lt;li&gt;Impediments are not in the path; impediments are the path.&lt;/li&gt;

&lt;li&gt;Visualize (flow metrics), stabilize (limit WIP), optimize.&lt;/li&gt;

&lt;li&gt;Evolution or revolution (by invitation), depending on your context.

&lt;ul&gt;
&lt;li&gt;Only Kanban and Disciplined Agile support evolution.&lt;/li&gt;
&lt;li&gt;Revolution if org is facing an existential crisis, there is support for a bigger dip in the change curve, there is sufficient personal psychological safety, people are volunteering and there is prior experience.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Invite over Inflict:

&lt;ul&gt;
&lt;li&gt;Improving BVSSH must be communicated as high priority from the board, and that taking action will lead to recognition.&lt;/li&gt;
&lt;li&gt;Exemplary Community:

&lt;ul&gt;
&lt;li&gt;Voluntary.&lt;/li&gt;
&lt;li&gt;Agree to seek to become exemplary.&lt;/li&gt;
&lt;li&gt;Benefits:

&lt;ul&gt;
&lt;li&gt;Access to external speakers and experts.&lt;/li&gt;
&lt;li&gt;First to access new tools.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Keep the innovators on the bleeding edge.&lt;/li&gt;

&lt;li&gt;Members have x20 improvement on most measures.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 4 - Leadership Will Make It or Break It
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Leader: guiding on a journey, following is optional.&lt;/li&gt;
&lt;li&gt;Commander: control, obey is mandatory.&lt;/li&gt;
&lt;li&gt;Anti-pattern: Do as I say, not as I do:

&lt;ul&gt;
&lt;li&gt;Leaders go on the same journey:

&lt;ul&gt;
&lt;li&gt;Become a beginner, trying something new, failing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Psychological unsafe:

&lt;ul&gt;
&lt;li&gt;Boeing as a bad example.&lt;/li&gt;
&lt;li&gt;Cost and schedule should not be the primary focus.&lt;/li&gt;
&lt;li&gt;Leaders’ actions and ability to provide or withhold rewards communicate their preferences, which then become the preoccupation of the workforce.&lt;/li&gt;
&lt;li&gt;Silence is unhealthy.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Deterministic Mindset:

&lt;ul&gt;
&lt;li&gt;All non-trivial change and product development is emergent.

&lt;ul&gt;
&lt;li&gt;The notion that we can predict what is going to happen is […] wasteful, demoralizing and dangerous.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Can be caused by leadership being uncomfortable exhibiting vulnerability: not knowing.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Instead of reporting lines, supporting lines.&lt;/li&gt;

&lt;li&gt;Pattern: Leaders Go First:

&lt;ul&gt;
&lt;li&gt;Transformational Leadership (vs transactional), from James Burns’ &lt;a href="https://amzn.to/39OkCFR" rel="noopener noreferrer"&gt;Leadership&lt;/a&gt;:

&lt;ol&gt;
&lt;li&gt;Role model.&lt;/li&gt;
&lt;li&gt;Vision.&lt;/li&gt;
&lt;li&gt;Intellectual stimulation.&lt;/li&gt;
&lt;li&gt;Coach: care for individuals.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Psychological Safety:

&lt;ul&gt;
&lt;li&gt;People need to be recognized for the lowest cost and quickest time to failure.&lt;/li&gt;
&lt;li&gt;Steps to build psychological safety:

&lt;ol&gt;
&lt;li&gt;Set the stage:

&lt;ul&gt;
&lt;li&gt;Not personal incompetence but of the system of work.&lt;/li&gt;
&lt;li&gt;Failure is learning.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Invite participation.&lt;/li&gt;

&lt;li&gt;Respond productively.&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: Emergent Mindset with Servant Leadership.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 5 - Build the Right Thing; Intelligent Flow
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Anti pattern: Local Optimization:

&lt;ul&gt;
&lt;li&gt;Water-scrum-fall:

&lt;ul&gt;
&lt;li&gt;Urgency paradox: ideas sit 12-18 months on big upfront prioritization, and when they hit the dev team they suddenly become urgent.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Milestone-driven Predicted solutions:

&lt;ul&gt;
&lt;li&gt;Milestones with RAG status are culturally toxic:

&lt;ul&gt;
&lt;li&gt;Red is shame and reprisal.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Milestones make no sense on emergent domains.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Headless Chicken.

&lt;ul&gt;
&lt;li&gt;Feature factories disconnected from customer needs and company strategy.&lt;/li&gt;
&lt;li&gt;Teams incentivized by output.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Start Starting:

&lt;ul&gt;
&lt;li&gt;Reducing WIP increases the chances of identifying causality.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Optimize for Fast End-to-End Flow:

&lt;ol&gt;
&lt;li&gt;Identify value-streams:

&lt;ul&gt;
&lt;li&gt;Value streams are not oriented around customer personas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Map products to value streams. Identify:

&lt;ul&gt;
&lt;li&gt;Duplication.&lt;/li&gt;
&lt;li&gt;Monolith that straddles multiple value streams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create small long-lived teams:

&lt;ul&gt;
&lt;li&gt;T-shaped, multidisciplinary.&lt;/li&gt;
&lt;li&gt;Roles:

&lt;ol&gt;
&lt;li&gt;Value Outcome Lead (VOL):

&lt;ul&gt;
&lt;li&gt;The What (value).&lt;/li&gt;
&lt;li&gt;Outward focus.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Team Outcome Lead (TOL):

&lt;ul&gt;
&lt;li&gt;The How for the system of work and people.&lt;/li&gt;
&lt;li&gt;Inward focus.&lt;/li&gt;
&lt;li&gt;Alleviate impediments, build continuous improvement as a daily habit, coach.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Architecture Outcome Lead (AOL):

&lt;ul&gt;
&lt;li&gt;The How of the tech implementation within the org’s broader tech architecture and engineering principles and standards.&lt;/li&gt;
&lt;li&gt;Solutions architect == hands on.&lt;/li&gt;
&lt;li&gt;Enterprise architect provide support and governance across value streams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;These roles at every level.&lt;/li&gt;
&lt;li&gt;Top level:

&lt;ul&gt;
&lt;li&gt;CEO = VOL.&lt;/li&gt;
&lt;li&gt;CIO = TOL.&lt;/li&gt;
&lt;li&gt;CTO = AOL.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Funding the Flow of Value:

&lt;ul&gt;
&lt;li&gt;Fund by value streams, not by project.&lt;/li&gt;
&lt;li&gt;Funding is a constraint on which to maximize value.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;Pattern: Outcome Hypothesis:

&lt;ol&gt;
&lt;li&gt;Emergence: Toyota Kata.&lt;/li&gt;
&lt;li&gt;Nested outcomes: OKRs.

&lt;ul&gt;
&lt;li&gt;Outcome do not cascade, they align.&lt;/li&gt;
&lt;li&gt;Levels:

&lt;ul&gt;
&lt;li&gt;Strategic objective (multi year).&lt;/li&gt;
&lt;li&gt;Portfolio objective (&amp;lt;3 years).&lt;/li&gt;
&lt;li&gt;Portfolio epic (&amp;lt;12 months).&lt;/li&gt;
&lt;li&gt;Business outcome (&amp;lt;3 months).&lt;/li&gt;
&lt;li&gt;Experiment (&amp;lt;1 month).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Business Outcome:
&amp;gt; Due to &amp;lt;this insight&amp;gt;
&amp;gt; We believe that &amp;lt;this bet&amp;gt;
&amp;gt; Will result in &amp;lt;this outcome&amp;gt;
&amp;gt; We will know that we are on the right track when:
&amp;gt; Measure 1,2,3,...: quantified and measurable leading or lagging indicators.
&lt;/li&gt;
&lt;li&gt;Rolling roadmaps and fixed dates:

&lt;ul&gt;
&lt;li&gt;Planning is done continuously at the multiple nested cadences.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;From Project Management Office to Value Enablement Teams:

&lt;ul&gt;
&lt;li&gt;Coaches and supports measuring business outcomes.&lt;/li&gt;
&lt;li&gt;Assist with prioritization.&lt;/li&gt;
&lt;li&gt;Coaches the limiting of WIP.&lt;/li&gt;
&lt;li&gt;Ensures alignment of nested outcomes.&lt;/li&gt;
&lt;li&gt;Helps collecting lagging and leading data.&lt;/li&gt;
&lt;li&gt;Consolidates data from value streams.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;From “is it done yet?” to “what value we observed, what we have learned, and what steps shall we take next to get closer to the desired outcome?”&lt;/li&gt;

&lt;li&gt;Pattern: Intelligent Flow

&lt;ul&gt;
&lt;li&gt;Horizontal nested value streams with the vertical nested outcome hierarchy == high alignment.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Stop Starting, Start Finishing

&lt;ul&gt;
&lt;li&gt;Reduce WIP.&lt;/li&gt;
&lt;li&gt;Pull, don't push.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 6 - Building the Thing Right; Intelligent Control
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Anti-pattern: Lack of Safety within Safety:

&lt;ul&gt;
&lt;li&gt;Safety (governance, risk, compliance) people scared of raising concerns due to blame culture.&lt;/li&gt;
&lt;li&gt;Lack of psychological safety in the Safety teams.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Role-Based Safety Silos:

&lt;ul&gt;
&lt;li&gt;Each safety specialization (Infosec, Data Privacy, Fraud, ...) being its own silo. 

&lt;ul&gt;
&lt;li&gt;It causes:

&lt;ul&gt;
&lt;li&gt;Duplication.&lt;/li&gt;
&lt;li&gt;Information bubbles.&lt;/li&gt;
&lt;li&gt;Infight between silos and silos vs delivery teams.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Anti-pattern: Fixed Mindset to Risk:

&lt;ul&gt;
&lt;li&gt;Risk management (current/future threads) vs compliance (past issues).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Safety within Safety.&lt;/li&gt;

&lt;li&gt;Pattern: Organize Safety by Value Stream:

&lt;ul&gt;
&lt;li&gt;Cross-functional, long-lived safety teams aligned to value streams, with a Centre of Excellence for support, plus a risk catalog.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Intelligent Control:

&lt;ol&gt;
&lt;li&gt;Product teams engage with their safety teams on a continuous basis.&lt;/li&gt;
&lt;li&gt;Safety teams reassess on the quarterly business outcome the frequency of engagement, depending on those business outcomes.&lt;/li&gt;
&lt;li&gt;Risk stories validated through automated test, or by Value Outcome Lead, or by Safety team.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 7 - Continuous Attention to Technical Excellence
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Applications and puppies have something in common: they are for life, not just for Christmas.&lt;/li&gt;
&lt;li&gt;Constant Improvement (Kaizen) and occasional step changes (Kaikaku): Punctuated gradualism.&lt;/li&gt;
&lt;li&gt;Anti-pattern: Going Faster Leads to Going Slower:

&lt;ul&gt;
&lt;li&gt;Features, and only features.&lt;/li&gt;
&lt;li&gt;No time to follow good dev practices because:

&lt;ol&gt;
&lt;li&gt;Lack of partnership with "Business".&lt;/li&gt;
&lt;li&gt;No time to apply lessons learned.&lt;/li&gt;
&lt;li&gt;System Entropy.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Agile Hollow Shell:

&lt;ul&gt;
&lt;li&gt;Agile without technical excellence is Agile work management.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Misalignment of Teams and Architecture.

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/01/20/team-topologies-summary/#content" rel="noopener noreferrer"&gt;Team topologies&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Anti-pattern: Tools Over People:

&lt;ul&gt;
&lt;li&gt;Install Jira and Jenkins and you're agile.&lt;/li&gt;
&lt;li&gt;Should be: People -&amp;gt; Process -&amp;gt; Tooling.&lt;/li&gt;
&lt;li&gt;No technical career path for hands-on software developers.&lt;/li&gt;
&lt;li&gt;Not having testers: too much automation.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Go Slower to Go Faster:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/02/10/project-to-product-flow-framework-summary/#content" rel="noopener noreferrer"&gt;Visualize flow of features, defects, risks, debts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2020/02/05/the-unicorn-project-summary/#content" rel="noopener noreferrer"&gt;Prioritize improvement of daily work over daily work&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Coach for technical excellence/practices is much rarer than "Agile process coach".&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Continuous Technical Excellence.&lt;/li&gt;

&lt;li&gt;Pattern: Architect and Organize for Flow.

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/01/20/team-topologies-summary/#content" rel="noopener noreferrer"&gt;Cognitive Load&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Don't manage dependencies, break team.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pattern: Smart People and Smart Teams with Robot Friends:

&lt;ul&gt;
&lt;li&gt;Technical career, good example: &lt;a href="https://www.gov.uk/government/collections/digital-data-and-technology-profession-capability-framework" rel="noopener noreferrer"&gt;UK Government digital services career framework&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 8 - Create a Learning Ecosystem
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Anti-patterns: Information and Learning Silos:
&amp;gt; Up to 50% of info is lost on every hand-off.
&lt;cite&gt;Poppendieck at &lt;a href="https://danlebrero.com/2020/06/24/implementing-lean-software-development-book-summary/#content" rel="noopener noreferrer"&gt;Implementing Lean SW Dev&lt;/a&gt;.&lt;/cite&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Ignorance is the single greatest impediment to throughput.&lt;br&gt;
&lt;cite&gt;&lt;a href="https://twitter.com/tastapod" rel="noopener noreferrer"&gt;Dan North&lt;/a&gt; at &lt;a href="https://dannorth.net/2010/08/30/introducing-deliberate-discovery/" rel="noopener noreferrer"&gt;Introducing Deliberate Discovery&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Anti-pattern: Output over Outcomes:

&lt;ul&gt;
&lt;li&gt;Learning whether we have delivered something valuable or not comes from the customer.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Anti-pattern: The Bubble Effect:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Humans need to belong to groups, but the tribal instinct is also an instinct to exclude&lt;br&gt;
&lt;cite&gt;&lt;a href="https://twitter.com/amychua" rel="noopener noreferrer"&gt;Amy Lynn Chua&lt;/a&gt; at &lt;a href="https://amzn.to/3kUriZl" rel="noopener noreferrer"&gt;Political Tribes&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Silo mentality: not want to share with other tribes.&lt;/li&gt;
&lt;li&gt;Poor learning retention: when people leave, their learnings are lost.&lt;/li&gt;
&lt;li&gt;Duplication.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Anti-pattern: Applying a Deterministic Approach to an Emergent Domain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Following the plan == not learning. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Anti-pattern: Weaponized Metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a measure becomes a target, it ceases to be a good measure.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Pattern: Optimize for Learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/06/02/unlearn-summary/#content" rel="noopener noreferrer"&gt;Unlearn&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tacit knowledge can only be shared by socialization (pairing, face-to-face) and a bias for action.&lt;/li&gt;
&lt;li&gt;In Clear and Complicated domains: explicit knowledge.&lt;/li&gt;
&lt;li&gt;In Complex and Chaotic: tacit knowledge.&lt;/li&gt;
&lt;li&gt;Identify and break silos with &lt;a href="https://danlebrero.com/2021/03/10/value-stream-mapping-summary/#content" rel="noopener noreferrer"&gt;Value Stream Mapping&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Pattern: Nested Learning with Built-in Feedback Loops:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning is more effective when exercises are in the learner context.&lt;/li&gt;
&lt;li&gt;Levels:

&lt;ol&gt;
&lt;li&gt;Individual:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/sbowperson" rel="noopener noreferrer"&gt;Sharon Bowman&lt;/a&gt; four Cs, from &lt;a href="https://amzn.to/39NPYMV" rel="noopener noreferrer"&gt;Training from the Back of the Room&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;Connections: Learners connect to the topic exploring prior experiences and knowledge.&lt;/li&gt;
&lt;li&gt;Concepts and concrete practices: Self-learn.&lt;/li&gt;
&lt;li&gt;Conclusions: Learners do self-reflection on the learning experience and teach back to the class.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Team:

&lt;ul&gt;
&lt;li&gt;Stand-ups, weekly reviews, conferences, unconferences, retros, show and tell, pair and mob programming.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://danlebrero.com/2021/01/06/toyota-kata-in-software-development-continuous-improvement/#content" rel="noopener noreferrer"&gt;Toyota Improvement Kata&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dojos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Organization:

&lt;ul&gt;
&lt;li&gt;Internal meet-ups, conferences, unconferences, webinars, brown-bag sessions, show-and-tell.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Pattern: Communicate, Communicate, Communicate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal BVSSH Awards:

&lt;ul&gt;
&lt;li&gt;Team has to proved factual data and quotes from customers and colleagues.&lt;/li&gt;
&lt;li&gt;Teams will connect with winners for help and advise&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Communities of Practice:

&lt;ul&gt;
&lt;li&gt;Voluntary, open to all, Darwinian.&lt;/li&gt;
&lt;li&gt;Meet once every two weeks.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;ASREDS loop: Align, sense, respond, experiment, distill, share.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Pattern: Be Comfortable with Uncertainty.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Pattern: Measure for Learning.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 9 - The Best Time to Plant a Tree is Twenty Years Ago; the Second Best Time is Now
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;How to continue from your current starting point and org memory to get better at fast learning in order to optimize for outcomes across the org?:

&lt;ol&gt;
&lt;li&gt;Start with Why (why of change, not why agile).&lt;/li&gt;
&lt;li&gt;Focus on outcomes: BVSSH.&lt;/li&gt;
&lt;li&gt;Leaders go first.&lt;/li&gt;
&lt;li&gt;Create a Ways of Working Center of Enablement.&lt;/li&gt;
&lt;li&gt;Start small and create an s-curve of change.&lt;/li&gt;
&lt;li&gt;Invite over Inflict: Start with the natural champions.&lt;/li&gt;
&lt;li&gt;Involve everyone from top to bottom.&lt;/li&gt;
&lt;li&gt;Bias to action: communicate, communicate, communicate:

&lt;ul&gt;
&lt;li&gt;Change is a social activity.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Become a Relearning org:

&lt;ul&gt;
&lt;li&gt;You are never done.&lt;/li&gt;
&lt;li&gt;It takes years.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>books</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Implementing DORA key software delivery metrics</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Thu, 17 Mar 2022 07:27:23 +0000</pubDate>
      <link>https://forem.com/danlebrero/implementing-dora-key-software-delivery-metrics-2o1d</link>
      <guid>https://forem.com/danlebrero/implementing-dora-key-software-delivery-metrics-2o1d</guid>
      <description>&lt;p&gt;To ensure that your software &lt;a href="https://danlebrero.com/2021/01/06/toyota-kata-in-software-development-continuous-improvement/#content" rel="noopener noreferrer"&gt;process improvement process&lt;/a&gt; is having the desired results, you need to measure the before and after of any change.&lt;/p&gt;

&lt;p&gt;Following the research in &lt;a href="https://www.devops-research.com/research.html" rel="noopener noreferrer"&gt;DORA&lt;/a&gt;, summarized in the &lt;a href="https://danlebrero.com/2020/01/22/accelerate-high-performing-technology-orgs-summary/#content" rel="noopener noreferrer"&gt;Accelerate book&lt;/a&gt;, the key metrics to use are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For performance: delivery lead time and deployment frequency.&lt;/li&gt;
&lt;li&gt;For stability: time to restore service and change fail rate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are not familiar with them, you can find their definition &lt;a href="https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post is a deep dive on how we implemented them at &lt;a href="https://www.akvo.org" rel="noopener noreferrer"&gt;Akvo&lt;/a&gt; both for regular applications and &lt;a href="https://martinfowler.com/bliki/BlueGreenDeployment.html" rel="noopener noreferrer"&gt;blue/green ones&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Regular applications
&lt;/h1&gt;

&lt;p&gt;Let's start explaining what is our development process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Any commit to trunk/main is deployed to the Test environment.&lt;/li&gt;
&lt;li&gt;Sometimes, after some manual QA, the Test environment is &lt;em&gt;promoted&lt;/em&gt; to Production. 

&lt;ul&gt;
&lt;li&gt;Promotion == take whatever is running right now in Test and deploy it to Production.&lt;/li&gt;
&lt;li&gt;The promotion script looks at the git SHA in Test and tags it with &lt;code&gt;promote-$datetime&lt;/code&gt; which will trigger a CI build that will do the production deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On promotion, no new binaries/containers are created, hence no build or test is required, only the deployment is needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Deployment frequency
&lt;/h2&gt;

&lt;p&gt;For regular applications, calculating the deployment frequency is almost straightforward: look at the git tags with the pattern &lt;code&gt;promote-$datetime&lt;/code&gt;, or look at the CI builds for such tags.&lt;/p&gt;

&lt;p&gt;The caveat is that the CI deploy may fail, and if it fails, it may fail before or after the deployment step, so it starts to get tricky to decide if the deployment happened or not.&lt;/p&gt;

&lt;p&gt;Ideally you want to look at the system itself to find out what has been deployed, something like Google App Engine's &lt;a href="https://cloud.google.com/sdk/gcloud/reference/app/versions/list" rel="noopener noreferrer"&gt;&lt;code&gt;gcloud app versions list&lt;/code&gt;&lt;/a&gt; or Kubernetes' &lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#checking-rollout-history-of-a-deployment" rel="noopener noreferrer"&gt;&lt;code&gt;kubectl rollout history&lt;/code&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;At Akvo, we chose the simple git tag count, as the most likely case for the CI build to fail was that the application failed to start, which we will still want to count as a deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dlebrero/dora-metrics/blob/eb6527dd6d9179b448ead8fe8785673f9569f2d6/backend/src/akvo_devops_stats/promotions.clj#L20" rel="noopener noreferrer"&gt;Here&lt;/a&gt; is the code to get all the tags using GitHub's GraphQL api, &lt;a href="https://github.com/dlebrero/dora-metrics/blob/eb6527dd6d9179b448ead8fe8785673f9569f2d6/backend/src/akvo_devops_stats/util/travis.clj#L53-L52" rel="noopener noreferrer"&gt;here&lt;/a&gt; for getting all the &lt;a href="https://www.travis-ci.com" rel="noopener noreferrer"&gt;TravisCI&lt;/a&gt; builds and &lt;a href="https://github.com/dlebrero/dora-metrics/blob/eb6527dd6d9179b448ead8fe8785673f9569f2d6/backend/src/akvo_devops_stats/util/semaphoreci.clj#L47-L46" rel="noopener noreferrer"&gt;here&lt;/a&gt; all the &lt;a href="https://semaphoreci.com" rel="noopener noreferrer"&gt;Semaphore&lt;/a&gt;'s ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Delivery lead time
&lt;/h2&gt;

&lt;p&gt;We need to calculate &lt;a href="https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance" rel="noopener noreferrer"&gt;the amount of time it takes a commit to get into production&lt;/a&gt;, so we just need to know on which deployment a commit was deployed in, when a commit was committed, and when a deployment was deployed. &lt;/p&gt;

&lt;h4&gt;
  
  
  Commit deployment
&lt;/h4&gt;

&lt;p&gt;"Just" a matter at looking at the closest &lt;code&gt;promote-&lt;/code&gt; tag that it is in the future:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fdora-implementation%2Fcommit-deployments.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fdora-implementation%2Fcommit-deployments.png" alt="commit deployment logic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only thing to be careful with is that the commits must be sorted in topological order, not chronological order:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fdora-implementation%2Fcommit-history-topological-vs-cronological.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fdora-implementation%2Fcommit-history-topological-vs-cronological.jpg" alt="topological vs cronological"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Git command &lt;code&gt;git log --graph --pretty=oneline --abbrev-commit&lt;/code&gt; draws the commits in topological order.&lt;/p&gt;

&lt;h4&gt;
  
  
  Commit timestamp
&lt;/h4&gt;

&lt;p&gt;Easy peasy lemon squeezy: Git contains the commit's authored timestamp ... except:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When your team has the bad habit of &lt;a href="https://docs.github.com/en/github/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-pull-request-commits" rel="noopener noreferrer"&gt;squash merging&lt;/a&gt; their pull requests, then we just have the merge commit timestamp.&lt;/li&gt;
&lt;li&gt;We should ignore the merge commits, as those commits have no code review time, so it is not "fair" to count them as they will skew the results towards a better (lower) lead time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub keeps a link between a commit and the PR in the &lt;a href="https://docs.github.com/en/graphql/reference/objects#commit" rel="noopener noreferrer"&gt;Commit's&lt;/a&gt; associatedPullRequests field (for any kind of PR), and from the PR object we can find the original commits. &lt;/p&gt;

&lt;p&gt;We could replace the merge commit with all the commits done in the PR, plus we should also ignore any merge commits from regular PR, but instead we decided that for &lt;em&gt;all kinds&lt;/em&gt; of branches we will just take into account the authored date of the first commit and ignore all other commits.&lt;/p&gt;

&lt;p&gt;This means that if you have been working for 10 days in a branch committing once a day, then your median delivery lead time will be 10 days, instead of 5 days if we were counting all the commits. This is more in accordance with the practices of small batches and trunk-based development encouraged in the DORA report.&lt;/p&gt;

&lt;p&gt;Continuing the previous example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fdora-implementation%2Fcommit-branches.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdanlebrero.com%2Fimages%2Fblog%2Fdora-implementation%2Fcommit-branches.png" alt="just one commit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we keep the merge commit for the topological order, but we will use the first commit's authored date when calculating the delivery lead time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deployment timestamp
&lt;/h4&gt;

&lt;p&gt;The actual easy peasy lemon squeezy: we have the timestamp in the tag (careful to not use &lt;a href="https://stackoverflow.com/a/6270112" rel="noopener noreferrer"&gt;the commit timestamp the tag points to&lt;/a&gt;), in the name of the tag itself and in the CI build. &lt;/p&gt;

&lt;p&gt;We opted for the CI build finish time as one of our application's deployment pipeline took a significant amount of time to run, and the speed of the pipeline impacts the MTTR, so including the CI pipeline time is important.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Change fail rate
&lt;/h2&gt;

&lt;p&gt;First instinct to implement the change fail rate is to have a way, maybe a UI, for developers to mark a deployment as failed. &lt;/p&gt;

&lt;p&gt;But adding extra bureaucracy and another place to click around when trying to restore service, can only end up with people forgetting and managers complaining about developers not being "disciplined" enough to follow the process.&lt;/p&gt;

&lt;p&gt;Instead, we assumed that a failed deployment will be followed by a deployment to fix whatever the issue was, so the deployment script will ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does this deployment contain a hotfix for a previous deployment? [Y/n]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces the friction to record a failure, as the developer knows why the new deployment is happening and is already running the deployment script, plus is just a Yes/No question.&lt;/p&gt;

&lt;p&gt;The answer be stored as part of the &lt;code&gt;promote-&lt;/code&gt; annotated tag, which we will be able to read from Git. &lt;/p&gt;

&lt;h4&gt;
  
  
  What is a failure?
&lt;/h4&gt;

&lt;p&gt;A failure is any deployment that &lt;em&gt;result in degraded service (for example, lead to service impairment or service outage) and subsequently require remediation (for example, require a hotfix, rollback, fix forward, patch)&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;As this definition didn't seem clear enough for the team, we defined a failure as an issue that both:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Some user has noticed or suffered it.&lt;/li&gt;
&lt;li&gt;You think (or say) "Oh, shit" when you learn about it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/27EhcDHnlkw1O/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/27EhcDHnlkw1O/giphy.gif" alt="oh shit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Much more clear :).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Mean time to restore (MTTR) service
&lt;/h2&gt;

&lt;p&gt;In theory, we were recording any incident in &lt;a href="https://www.atlassian.com/software/statuspage" rel="noopener noreferrer"&gt;Atlassian's StatusPage&lt;/a&gt;, from we can easily extract the timing information needed. &lt;/p&gt;

&lt;p&gt;In practice, we opted for complaining about developers not being "disciplined" enough to follow the process of filling up StatusPage.&lt;/p&gt;

&lt;p&gt;A possible automated way to calculate the MTTR is to look at the deployment history and use the time from a fix deployment to the previous failed deployment. This will still miss some outages, but it will require no additional bureaucracy.&lt;/p&gt;

&lt;h1&gt;
  
  
  Blue/Green applications
&lt;/h1&gt;

&lt;p&gt;For applications with blue/green deployments, the release process requires one additional &lt;em&gt;flip&lt;/em&gt; step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flips in Test happen automatically after a successful automated smoke test run.&lt;/li&gt;
&lt;li&gt;Promotion happens from Live Test to Dark Production.&lt;/li&gt;
&lt;li&gt;Flips in Production are triggered manually after some QA the dark production cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deployment frequency
&lt;/h2&gt;

&lt;p&gt;For blue/green applications, you have to decide what a deployment is. From the &lt;a href="https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/" rel="noopener noreferrer"&gt;Accelerate's site&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By "deployment" we mean a software deployment to production or to an app store. A release (the changes that get deployed) will typically consist of multiple version control commits.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Side note: I personally prefer &lt;a href="https://beyond-agility.com/deployment-vs-release/" rel="noopener noreferrer"&gt;this deployment and release&lt;/a&gt; definitions.&lt;/p&gt;

&lt;p&gt;But should deploying to the production dark cluster count towards the deployment frequency?&lt;/p&gt;

&lt;p&gt;We argued that no: if a change is not receiving production traffic, it cannot (or it is very unlikely to) cause a failure, hence it would not count towards the change fail rate, hence it should not count towards the deployment frequency.&lt;/p&gt;

&lt;p&gt;So for blue/green applications, we want to look at the flips between dark/live.&lt;/p&gt;

&lt;p&gt;Similar to the promotion script, the flip script just tags a commit with &lt;code&gt;flip-$datetime&lt;/code&gt; which will trigger a CI build that will do the flip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delivery lead time
&lt;/h2&gt;

&lt;p&gt;Same as regular applications, except that you want to compare commit timestamps against the flips.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change fail rate
&lt;/h2&gt;

&lt;p&gt;As the information will be more fresh in the developer's mind at the time of promotion, we decided to keep the failure question in the promote script.&lt;/p&gt;

&lt;p&gt;Then, to know if a flip should be counted towards the failure rate, we will aggregate all the promotions for the flip, and mark the flip as failure if any of the promotions was marked as failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mean time to restore (MTTR) service
&lt;/h2&gt;

&lt;p&gt;Same as regular applications :(.&lt;/p&gt;




&lt;p&gt;There are still some scenarios to think about: feature flags, dark launches and canary releases.&lt;/p&gt;

&lt;p&gt;But for us, this was a good enough starting point.&lt;/p&gt;




&lt;p&gt;You can find all the (Clojure) code for the service that collected these metrics at &lt;a href="https://github.com/dlebrero/dora-metrics/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>clojure</category>
      <category>metrics</category>
    </item>
    <item>
      <title>Book notes: Grokking Simplicity</title>
      <dc:creator>Dan Lebrero</dc:creator>
      <pubDate>Wed, 09 Mar 2022 08:12:49 +0000</pubDate>
      <link>https://forem.com/danlebrero/book-notes-grokking-simplicity-57mp</link>
      <guid>https://forem.com/danlebrero/book-notes-grokking-simplicity-57mp</guid>
      <description>&lt;p&gt;These are my notes on &lt;a href="https://amzn.to/3DJJ0pQ"&gt;Grokking Simplicity&lt;/a&gt; by &lt;a href="(https://twitter.com/ericnormand)"&gt;Eric Normand&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Excellent introduction to functional programming, or at least how I understand it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Key Insights
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;World is divided in actions, calculations, and data.&lt;/li&gt;
&lt;li&gt;Actions: anything that depend on when they are called or how many times they are called.&lt;/li&gt;
&lt;li&gt;Data is useful mostly because of what it can't do: it cannot be run.

&lt;ul&gt;
&lt;li&gt;Reads to mutable data are actions.&lt;/li&gt;
&lt;li&gt;Reads to immutable data are calculations.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Groups actions by layers of meaning.&lt;/li&gt;
&lt;li&gt;Principle: design is about pulling things apart.&lt;/li&gt;
&lt;li&gt;Code within a function should have the same level of detail.

&lt;ul&gt;
&lt;li&gt;Being able to ignore the same details is one clue that the code is at similar level of abstraction.&lt;/li&gt;
&lt;li&gt;Don't move unclear code to another layer, make it straightforward.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Design discussions run the risk of getting too abstract. &lt;/li&gt;
&lt;li&gt;We often write a lot of code just in case something might change in the future.&lt;/li&gt;
&lt;li&gt;There is constant tension between design and the need for new features. Let comfort guide you when to stop.&lt;/li&gt;
&lt;li&gt;A function cannot call other functions in its same layer.&lt;/li&gt;
&lt;li&gt;Simplify collection processing:

&lt;ul&gt;
&lt;li&gt;Transform code into data so that you can name and inspect.&lt;/li&gt;
&lt;li&gt;Prefer small simple step to big complex ones.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Use abstraction barrier on deeply nested data to reduce cognitive load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ESgxfmna--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/grokking-simplicity/onion-layers.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ESgxfmna--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/grokking-simplicity/onion-layers.jpg" alt="onion layers architecture" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  TOC
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Chapter 1: Welcome to Grokking Simplicity&lt;/li&gt;
&lt;li&gt;Chapter 2: Functional Thinking in Action&lt;/li&gt;
&lt;li&gt;
Part 1: Actions, calculations, and data.

&lt;ul&gt;
&lt;li&gt;Chapter 3: Distinguishing actions, calculations, and data&lt;/li&gt;
&lt;li&gt;Chapter 5: Improving the design of actions&lt;/li&gt;
&lt;li&gt;Chapter 6: Staying immutable in a mutable language&lt;/li&gt;
&lt;li&gt;Chapter 8: Stratified design: Part 1&lt;/li&gt;
&lt;li&gt;Chapter 9: Stratified design: Part 2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
Part 2: First-class abstractions

&lt;ul&gt;
&lt;li&gt;Chapter 10: First-class functions: Part 1&lt;/li&gt;
&lt;li&gt;Chapter 13: Chaining functional tools&lt;/li&gt;
&lt;li&gt;Functional tools for nested data&lt;/li&gt;
&lt;li&gt;Isolating timelines&lt;/li&gt;
&lt;li&gt;Sharing resources between parallel execution&lt;/li&gt;
&lt;li&gt;Reactive and onion architecture&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 1: Welcome to Grokking Simplicity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Book explains the two main functional programming (FP) skills:

&lt;ol&gt;
&lt;li&gt;Distinguish actions, calculations, and data.

&lt;ul&gt;
&lt;li&gt;Actions: anything that depend on when they are called or how many times they are called.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Using first-class abstractions.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 2: Functional Thinking in Action
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stratified design:

&lt;ol&gt;
&lt;li&gt;Business layer: Least stable.&lt;/li&gt;
&lt;li&gt;Domain layer.&lt;/li&gt;
&lt;li&gt;Tech stack layer: Most stable.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part 1: Actions, calculations, and data.
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 3: Distinguishing actions, calculations, and data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data:

&lt;ul&gt;
&lt;li&gt;Facts about &lt;em&gt;events&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Is useful mostly because of what it can't do: it cannot be run.&lt;/li&gt;
&lt;li&gt;Must be interpreted to be useful.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 5: Improving the design of actions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Principle: minimize implicit inputs and outputs.

&lt;ul&gt;
&lt;li&gt;Code is more reusable. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Choose better level of abstraction: closer function/parameters names to business language (ubiquitous language from DDD).&lt;/li&gt;
&lt;li&gt;Groups actions by layers of meaning.&lt;/li&gt;
&lt;li&gt;Principle: design is about pulling things apart.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 6: Staying immutable in a mutable language
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reads to mutable data are actions.&lt;/li&gt;
&lt;li&gt;Reads to immutable data are calculations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 8: Stratified design: Part 1
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Software design: using one's aesthetic sense to guide programming choices to improve the ease of coding, testing, and maintaining software.&lt;/li&gt;
&lt;li&gt;Stratified design:

&lt;ul&gt;
&lt;li&gt;Pattern 1: straightforward implementation.

&lt;ul&gt;
&lt;li&gt;Code within a function should have the same level of detail. This is the &lt;a href="http://c2.com/ppr/wiki/WikiPagesAboutRefactoring/ComposedMethod.html"&gt;Composed Method&lt;/a&gt; in &lt;a href="https://www.amazon.com/Implementation-Patterns-Kent-Beck/dp/0321413091/"&gt;Implementation Patterns&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Being able to ignore the same details is one clue that the code is at similar level of abstraction.&lt;/li&gt;
&lt;li&gt;If a layer is using for its implementation several other layers, then it is not straightforward implementation.&lt;/li&gt;
&lt;li&gt;Don't move unclear code to another layer, make it straightforward.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Design discussions run the risk of getting too abstract.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 9: Stratified design: Part 2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stratified design:

&lt;ul&gt;
&lt;li&gt;Pattern 2: Abstraction barrier.

&lt;ul&gt;
&lt;li&gt;A layer that let us ignore the same thing when working above that layer.&lt;/li&gt;
&lt;li&gt;Most important benefit: they let you think more easily about the problem you are trying to solve.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Warn: we often write a lot of code just in case something might change in the future.

&lt;ul&gt;
&lt;li&gt;Pattern 3: Minimal interface.

&lt;ul&gt;
&lt;li&gt;It ask us to consider where code for new features belong.&lt;/li&gt;
&lt;li&gt;A function cannot call other functions in its same layer (really??).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Pattern 4: Comfortable layers.

&lt;ul&gt;
&lt;li&gt;No codebase is ideal.&lt;/li&gt;
&lt;li&gt;There is constant tension between design and the need for new features. Let comfort guide you when to stop.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;"Ilities":

&lt;ul&gt;
&lt;li&gt;Maintainability: code at the top layers is easier to test.&lt;/li&gt;
&lt;li&gt;Testability: code at the bottom layers is more important to test.

&lt;ul&gt;
&lt;li&gt;Because it changes less frequently and all other code depends on it.

&lt;ul&gt;
&lt;li&gt;Do I strongly disagree???&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reusability: code at the bottom layers is more reusable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Part 2: First-class abstractions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 10: First-class functions: Part 1
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code smell: implicit argument in function name:

&lt;ul&gt;
&lt;li&gt;Similar function implementation.&lt;/li&gt;
&lt;li&gt;Name of function indicates the difference in implementation.&lt;/li&gt;
&lt;li&gt;Refactoring: express implicit argument:

&lt;ul&gt;
&lt;li&gt;Argument becomes first-class and part of the API.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Treat data as data (data orientation):

&lt;ul&gt;
&lt;li&gt;Bespoke interfaces allow one interpretation of data while prohibiting others == less reusable.&lt;/li&gt;
&lt;li&gt;Entities at the bottom layers should be reusable/generic.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Refactoring: replace body with callback.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Chapter 13: Chaining functional tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Simplify collection processing:

&lt;ol&gt;
&lt;li&gt;Make data: 

&lt;ul&gt;
&lt;li&gt;Transform code into data so that you can name and inspect.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Operate on the whole array:

&lt;ul&gt;
&lt;li&gt;Try to process uniformly.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Many small steps:

&lt;ul&gt;
&lt;li&gt;Prefer small simple step to big complex ones.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Replace conditionals with &lt;code&gt;filter()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Functional tools for nested data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use abstraction barrier on deeply nested data to reduce cognitive load.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Isolating timelines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Timeline diagram:

&lt;ul&gt;
&lt;li&gt;Sequence of actions.&lt;/li&gt;
&lt;li&gt;Show sequential or parallel execution.&lt;/li&gt;
&lt;li&gt;From &lt;a href="https://livebook.manning.com/book/grokking-simplicity/chapter-2/58"&gt;Manning site&lt;/a&gt;:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xpw4k3VR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://drek4537l1klr.cloudfront.net/normand/Figures/f0025-02.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xpw4k3VR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://drek4537l1klr.cloudfront.net/normand/Figures/f0025-02.jpg" alt="timeline diagram example" width="880" height="693"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Sharing resources between parallel execution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Queue to guarantee order.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;&lt;/a&gt;Reactive and onion architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reactive architecture:

&lt;ul&gt;
&lt;li&gt;Instead of "Do X then do Y", it says "Do Y when X happens".&lt;/li&gt;
&lt;li&gt;Atom watchers: when atom value changes, do Y.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ReactiveManifesto.org"&gt;ReactiveManifesto.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Onion architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layers can only call/know about inner layers.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---ZMETgi7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/grokking-simplicity/onion-architecture.jpg" alt="onion architecture" width="800" height="488"&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ESgxfmna--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://danlebrero.com/images/blog/books/grokking-simplicity/onion-layers.jpg" alt="onion layers architecture" width="800" height="561"&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Do domain rules need actions?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No. You can always implement it as calculations.&lt;/li&gt;
&lt;li&gt;In truth, it depends on:

&lt;ol&gt;
&lt;li&gt;The terms used to place the rule in a layer.

&lt;ul&gt;
&lt;li&gt;Domain language in DDD sense.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Readability and awkwardness:

&lt;ul&gt;
&lt;li&gt;Some programming languages makes a non-functional implementation many times clearer.&lt;/li&gt;
&lt;li&gt;Take technical debt.&lt;/li&gt;
&lt;li&gt;System performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>books</category>
      <category>clojure</category>
      <category>architecture</category>
      <category>functional</category>
    </item>
  </channel>
</rss>
