Mastering the cloud by building "boring", stable software solutions

Rainer Stropek | @rstropek

Smart

Innovative

Creative

Visionary

Ground-Breaking

Clever

Ingenious

Resourceful

Types of Complexity

Inherent complexity

  • Arises from the problem domain
    • Part of the requirements for a system
  • Cannot be eliminated easily
    • Only by reconsidering requirements

Artificially added complexity

  • Added by DevSecOps teams
    • Intentionally or unintentionally
  • Different reasons 
    • Design decisions
    • Implementation choices
    • Anticipation of future requirements
    • Habits
    • Adopting "best practices"

Simple does not
mean naive!

Simple is boring...

...but boring can be smart

What Does "Simple" Mean?

Keep it simple

  • Avoid artificially added complexity
    • ⚠️ Anticipating vague, future requirements
    • Prioritize features driving inherent complexity correctly
  • Question every component of your software architecture
    • If you cannot answer the "why?" question, YAGNI!
    • Do you really test and use what you built?
  • Don't let aiming for "perfection" get in your way
    • Iterative development rules!
  • Avoid fragmentation
    • Loosely coupling has its advantages, but also its downsides
    • Ask "why" again and be critical about vague answers

What Does "Simple" Mean?

Avoid toil

  • Regular, manual work are an alarm signal
    • Eliminate or automate
    • Have a focus on maintenance efforts
  • Use managed services
    • Serverless or SaaS if possible
    • PaaS when finer control is required
    • ⚠️ Avoid IaaS and custom container images
  • Automate to eliminate toil
    • ⚠️ Avoid over-automation
    • Focus on real, not potential toil
  • Use alerts and automated anomaly detection

What Does "Simple" Mean?

Using what many others are using

  • Standing on the shoulders of giants
    • Battle-tested services/libraries
    • Available documentation and learning resources
    • AIs know a lot about the technology
  • Adjust architecture to what's available (PaaS)
    • Use niche solutions only if really necessary
    • Consider cost-driven design
  • Beware of abandoned services/frameworks/libraries
    • Prefer widely used, established services/frameworks/libraries
  • ⚠️ Question "best practices" that add a lot of complexity
    • Do they offer enough added value to justify complexity?

Challenges

Challenges

Lock-in Effect

  • Simple, integrated solutions are often cloud vendor-specific
    • Simplicity vs. lock-in
  • Avoid investing in portable code if portability isn't a requirement
    • Change code when moving becomes necessary
    • Consider using abstractions in code to isolate dependencies
    • Make additional costs for building portable solutions visible
  • ⚠️ Missing innovative solutions by always following the same path?
    • Strategies for bursting ones "bubble" are required (more later)

Challenges

Security requirements raise the complexity 

  • Reducing complexity can enhance security
    • Free resources can be invested in security
    • Fewer components lead to smaller attack surface
    • Simple architectures are easier to understand and maintain
  • Complex systems become insecure under time pressure
    • Developers struggle and take shortcuts
  • Externally imposed security requirements
    • Use built-in security mechanisms as much as possible
    • ⚠️ Established practices might not translate well

Challenges

Personal preferences, beliefs, and habits 

  • People want to follow their preferences and beliefs
    • You want people to take responsibility
  • Simplification sometimes requires fundamental changes
    • Value of simplification vs. costs of changing status quo
  • Gain flexibility to try things with a Microservice approach 
    • ⚠️ Loosely coupled components raise complexity
    • Don't let technology landscape diverge too much
  • Lead by example

Establish the right team culture

Team Culture

Value simple, stable solutions

  • Make the importance of simplicity a shared value
    • Showcase not just innovative, complex solutions
    • Celebrate simple solutions with high developer productivity
  • Don't punish accidental over-simplification
    • It is ok to re-introduce complexity after having removed it
  • Don't punish complexity reduction
    • It is ok to admit mistakes
  • Value stability
    • Leading-edge vs. "bleading" edge
    • ⚠️ But: Avoid letting components get outdated

Team Culture

Focus on the customer

  • Customers want features, not self-purposed, fancy tech
    • Focus is added value from the customer's viewpoint
  • Implement regular feedback and retrospectives
    • Involve customers
  • Make hidden maintenance costs visible
    • How much time do we spend adding value vs. keeping system up?
  • ⚠️ But: Demand clear and concrete requirements
    • Unclear requirements lead to over-engineering
    • Flexibility and config options have to be a requirement

Don't mistake being busy for being productive 

Team Culture

Repeat what's working

  • If something works, stick to it
    • ⚠️ Don't let conformity prevent innovation
  • Make working solutions sharable and repeatable
    • Be very specific about responsibilities and maintenance
    • ⚠️ Prefer copying code over immature services/libraries
  • Make small steps to improve patterns, practices, and principles
    • Continuous improvement
    • Continuous updates

Team Culture

Break out of the bubble

  • Collaborate with others
    • Inside/outside of the organization
  • Listen to newcomers
    • ⚠️ Value existing knowledge and experience of colleagues 
  • Regular prototypes/studies of new tech/approaches
    • Company-specific "technology radar"

Team Culture

Allow new approaches

  • Distinguish between prototypes/feasibility studies and production code
    • ⚠️ Never put prototypes into production
  • Time/effort-boxed approach
    • E.g. Hackathons
    • E.g. Isolated, low-risk experiments
    • Benchmark early against existing patterns, practices, and principles
    • ⚠️ Avoid the sunk cost fallacy
  • Stay appreciative regarding legacy code
    • Legacy code is code that earns money
    • Have a path forward for legacy code to avoid obsolescence

Be smart by
being boring 😉

Master the cloud by building boring, stable solutions

By Rainer Stropek

Master the cloud by building boring, stable solutions

  • 358