Greed: "Grabbing Every Relationship You Can"
Just because you can map it, doesn’t mean you should. Greedy relationships bloat your model and your queries.
Essays on software engineering, system design, and technical leadership.
Just because you can map it, doesn’t mean you should. Greedy relationships bloat your model and your queries.
A series of facts that every developer should know about time, timezones and clocks.
Turning your entities into empty vessels with no behavior is the ORM equivalent of spiritual apathy
Scaling isn't about doubling headcount—it's about delivery speed, developer experience, and doing more with less.
Context matters more than dogma. Why arrays aren't always evil and how to know when rules don't apply.
The 'U' in CRUD is lying to you—updates don't tell the story, domain events do.
Stop wrapping ORMs and start thinking in collections. Build repositories that are specific, immutable abstractions over your domain.
Ditch the 'Interface' suffix—let abstractions have pure names and implementations be specific.
Interfaces are like electrical outlets - they remove complexity and make components easily swappable. Learn how to use interfaces to decouple your software components.
Fat interfaces lie about their capabilities—split them into focused contracts that use types, not boolean checks.
Forget the jargon wars. Good tests do two things: run fast and fail for the right reasons.
Great software isn't pragmatic OR maintainable—it's both. Learn to navigate the tension between shipping fast and building right.
Logic doesn't change minds—aesthetics do. Why the most compelling argument is the one that looks and feels right.
Small leaks in your abstractions can flood your entire codebase. Design interfaces that hide implementation details, or pay the price later.
No one is adequate for their role, and that's okay—break it until you make it, one experiment at a time.
Ship new features without touching a single line of existing code—composition beats modification every time.
Change is the enemy of software. Win the war by isolating what changes behind abstractions—the true meaning of Single Responsibility.
Stop polluting your code with 'Interface' suffixes, pattern names, and namespace taxonomies—less noise, more clarity.
Exactly-once delivery is impossible—learn why the Two Generals can't agree, and how idempotency saves the day.
Your services can be disposable, but your source code deserves love, care, and individual attention.
Singletons are convenient until you try to test them—but they have their place in bootstrapping code where coupling is expected.
HELM's templating creates more problems than it solves. Kustomize's composition approach is simpler, more flexible, and natively supported by kubectl.
Microservices can save you or sink you—estimate the cost before you build the tower.
Rules say that for unit testing we should not access the filesystem, but what if you don't have a filesystem abstraction you can stub?
Four rules I try to sacredly adhere to when streaming data for reporting purposes in PHP.