Taming Complex Systems: Lessons from Uber to Google

2025-05-15
Taming Complex Systems: Lessons from Uber to Google

This article details the author's experiences in software engineering at an Uber competitor and Google, differentiating between complex problems and complex systems. Complex problems follow structured, repeatable solutions, while complex systems demand adaptability and innovative approaches. The article delves into five characteristics of complex systems: emergent behavior, delayed consequences, the trap of local optimization, hysteresis, and nonlinearity. Strategies for effective operation in complex environments are shared, including prioritizing reversible decisions, defining the right metrics, embracing innovation, leveraging best practices (feature flags, canary releases, progressive rollouts, shadow testing), and emphasizing observability, simulation testing, and machine learning. Finally, the author stresses the importance of team collaboration in complex systems.

Read more
Development

From Blog Post to Bestseller: One Programmer's Go Language Book Journey

2025-04-10
From Blog Post to Bestseller: One Programmer's Go Language Book Journey

This post details the author's journey in writing his book, "100 Go Mistakes and How to Avoid Them." Starting with a simple Go PoC in Switzerland, the author recounts the challenges faced, including job changes, publisher interactions, navigating editor and reviewer feedback, and the eventual publication and release. The story highlights the author's personal growth, the value of reader feedback, and improvements in writing skills. The book's success, including translations, is discussed, as well as reflections on the meaning and rewards of writing, and a detached perspective on money and fame.

Read more
Development

Understanding Functors, Applicatives, and Monads in Haskell

2025-03-30
Understanding Functors, Applicatives, and Monads in Haskell

This article provides a clear and accessible explanation of functors, applicatives, and monads in Haskell functional programming, using analogies to make complex concepts easier to grasp. The author uses the metaphor of boxes to illustrate how these types handle function application in different scenarios, providing code examples to demonstrate their usage and differences. The article concludes with a reflection on the importance of learning and sharing knowledge, stemming from an interaction with the Haskell community.

Read more
Development Monads