389 karma · joined August 4, 2020
I pulled those notes into a browsable site with 56 laws, grouped into categories, with short explanations and separate pages for each one.
The goal was simple: put these ideas in one place, so when you want a quick refresher on Conway’s Law, Brooks’s Law, Gall’s Law, Hyrum’s Law, or Goodhart’s Law, you can find it fast.
I’m more interested in criticism than praise. Which laws are missing, which ones feel overstated, and which ones get misused most often in real work?
The book isn’t about programming, per se. It’s about the good engineering practices that Google has used over the years and decades to keep a healthy codebase.
In particular, it is about what happens after you write the code: how you evolve it, share it, test it, and eventually delete it.
This fundamental difference often boils down to a single trait: High Agency.
Early in my career, I assumed improving my skills was all about writing more code or learning the latest framework, like everyone else. But the most significant improvements in my growth came from hours spent flipping pages in some of the best books out there.
There’s something tactile and deliberate about reading, scribbling notes in the margins, dog-earing pages, that forces me to slow down and reflect.
Here, I want to share five books that influenced my journey from engineer to CTO the most. Each of these books contributed beyond just technical knowledge; they challenged my assumptions, introduced new mental models, and ultimately changed how I work and lead teams.
Google recently faced this challenge at scale – a substantial percentage of its engineers reported being blocked by “unnecessary complexity and technical debt” in internal surveys. In a paper titled “Defining, Measuring, and Managing Technical Debt,” Google Engineers Ciera Jaspan and Collin Green systematically understood this concept that slows down even the most talented engineering teams.
They tried to answer the following questions: How do you measure something so intangible? And once you identify it, how do you manage it without halting new development?
This research matters because technical debt is often blamed for productivity issues, but rarely defined or measured with precision. Google's work offers concrete strategies that any engineering organization can adopt.
Behind this massive operation lies one of the world's most sophisticated distributed systems architectures.
This article explores the technical decisions and architectural patterns that make streaming on Netflix effortless. It also discusses what software engineers and architects can learn from this extraordinary-scale system.
A modular monolith enables teams to build and deploy a single application while keeping the code clean, maintainable, and modular. It allows for quick development cycles while ensuring long-term system evolution, making it an ideal starting point for many projects, especially for startups.
Every time you send someone a “quick” Slack message, it costs that person 23 minutes of productive work, and that's just the beginning of the problem.
I’ve worked with development teams for over a decade, and we consistently underestimate the disruptive nature of interruptions. This article explores why context-switching is so costly and how to manage it effectively.
In this issue, we explore the art of API design through a curated selection of resources, including insightful books, articles, and real-world examples from industry leaders like Stripe and Slack. We'll learn about the proper use of HTTP methods, RESTful URI structures, effective error handling, caching strategies, and the importance of thorough API documentation.
Additionally, we'll present common API anti-patterns that often lead to bigger problems later.
In this issue, we explore the art of API design through a curated selection of resources, including insightful books, articles, and real-world examples from industry leaders like Stripe and Slack. We'll learn about the proper use of HTTP methods, RESTful URI structures, effective error handling, caching strategies, and the importance of thorough API documentation.
Additionally, we'll present common API anti-patterns that often lead to bigger problems later.
In this article, we will learn about the fundamentals of CI/CD pipelines—what they are, how they work, and why they're necessary in modern software development. We'll explore the different stages of a CI/CD pipeline, provide real-world examples using tools like GitHub Actions, and discuss strategies for optimizing your pipeline's performance.
Additionally, we'll discuss selecting the right CI/CD platform for your organization, considering factors like cloud-based versus self-hosted options, integration capabilities, and user-friendliness.
In the article, we'll talk about the typical problems you might face, like outdated technology, missing documentation, and big piles of technical debt. More importantly, we'll share some practical steps to help you understand and navigate these old systems.
We'll also look at advice from experts like Michael Feathers and explore how modern tools, including AI assistants like GitHub Copilot, can make life easier.
This post will guide you through the most popular Git branching strategies, from the simplicity of Feature Branching to the structured approach of GitFlow and the continuous integration focus of Trunk-Based Development. We'll also deep dive into advanced concepts like Stacked Diffs and the distinctions between Git Merge and Rebase.
Whether working on a small project with continuous deployments or a large-scale system with scheduled releases, understanding these strategies can help you optimize your development process and avoid potential problems.
Yet, with this constant change, I've discovered that certain fundamental principles remained. These lessons have stood the test of time and become even more relevant in our increasingly complex world of software engineering.
In this post, I'll share ten critical lessons I've learned over my 20-year career. These principles have helped me navigate many projects, lead teams, and continuously grow professionally.
The lessons are:
1. Don't do premature optimization
2. Think twice before writing code
3. Learn good practices
4. Make things simple and even simpler than that
5. Name things properly
6. Always test your code
7. Keep your time wisely. It is the most expensive thing you have.
8. Communicate, communicate, communicate
9. Don't just learn, do
10. Have a culture of documentation
Another important aspect that causes projects to be late is the complexity of software engineering. We'll also discuss different complexities and examine practical strategies for dealing with them.
This article focuses on critical mental models that enhance problem-solving abilities and decision-making processes. We'll also deep-dive into common cognitive biases that can derail even the most experienced professionals. By understanding these concepts, you will become a super thinker and make better decisions.
According to the workplace satisfaction survey results, as many as 80% of professional programmers are unhappy. One in three respondents actively hates their job, while almost half survive in survival mode. That leaves only 20% who claim to be somewhat happy. Although developers have good salaries, plenty of free time, and often the ability to work remotely, many still need to be satisfied.
Moreover, you will discover the most practical prioritization methods for individuals, leaders, and teams, equipping you with the tools to manage your tasks effectively and achieve your goals.
The concept was named after Lindy's Deli in New York City, where Nassim Nicholas Taleb popularized it in his book "The Black Swan." According to Taleb, the Lindy effect applies to many things, including technologies, ideas, and cultures, and evaluates their potential longevity.
Database partitioning is the process of splitting a large table or database into smaller, more manageable chunks called partitions. This allows us to query only parts of the data, making it faster to load.
So, instead of stabilizing the situation, the business keeps adding more features, and the technical debt grows. Because of this, we usually say that technical debt is not a technical problem. For that reason, every software development team must try their best to prevent the technical debt from accumulating so it doesn't result in the worst-case scenario, which is a project halt.