Software Falsehoods: you can build it cheap, fast, and good - pick two

08 Mar 2025 10 minutes to read

Software Falsehoods: you can build it cheap, fast, and good - pick two

“You can build it cheap, fast, and good - pick two” is how the saying goes, referring to the inherent trade-offs in software development priorities. It makes intuitive sense but utterly fails in real-world applications. Two simple reasons why this correlation does not hold:

  1. Price is not realistically correlated to quality of outcomes and
  2. Price isn’t correlated to faster delivery times either.

Price is its own independent quality determined entirely by the buyer’s and seller’s perception of value.

As the Dan Luu article I linked to mentions - it’s fairly difficult even for experts within a given domain to accurately assess the market value of their own services (or someone else’s), hence why price discovery has to be tested continuously1.

But let’s take a closer look under the covers at the price vs. quality and price vs. speed relationships.

Read More

.NET OSS Projects: Better to Re-license or Die?

18 Jan 2025 9 minutes to read

.NET OSS Projects: Better to Re-license or Die?

This week FluentAssertions, a popular open source library designed to make it easier to write assertions during unit testing, changed its license from Apache 2.0 to some commercial terms under the name of a new business entity, Xceed.

The net impact of this is that FluentAssertions now costs $129.95 per seat for commercial use for version 8.0 and later.

Naturally the .NET community was in uproar over this on /r/dotnet and in a few other places, like this comment from the “.NET Eventing Framework” thread which inspired “.NET Developers Begging for Ecosystem Destruction

.NET users complaining about independent OSS to Microsoft

In this post we’re going to unpack two things:

  1. Impact of the FluentAssertions change and
  2. Broader questions about what .NET users would prefer: “re-license or die?

Read More

Lessons Learned Over 10 Years of Bootstrapping Petabridge

08 Jan 2025 1 minute to read

Lessons Learned Over 10 Years of Bootstrapping Petabridge

As of Monday this week, my company Petabridge turns 10 years old. I’ve been my own boss for longer, but my tenure at Petabridge is nearly 5x my tenure at every other company I’ve founded and at every place I’ve worked.

When you set out on a new venture, rarely do you expect things to go this well or last this long - so I decided to take some time to cobble together 10 lessons that have kept me sane throughout my entire odyssey with Petabridge.

Read More

Leaning into Weakness

27 Dec 2024 10 minutes to read

Leaning into Weakness

My management style has evolved a lot over the years, but one constant I’ve kept from the beginning is to coach the best possible performance out of my players. That seems like an vacuous management platitude, but it’s not: doing this requires tremendous patience, brutal-yet-sympathetic candor, and an ability plus...

Read More

Frameworkism: Senior Software Developers' Pit of Doom

04 Dec 2024 21 minutes to read

Frameworkism: Senior Software Developers' Pit of Doom

If you follow me on Twitter / X, you have likely seen several increasingly exasperated tweets from me about a legacy software project from hell. This project deserves its own series of blog posts and YouTube videos, but in service to a higher calling in the field of software I’ll reveal it now: these coding horrors all originate from our rewrite of Sdkbin.

More accurately: we decided the best path forward was to rescue Sdkbin 1.0 and not rewrite it after all, but we’re still conducting the software equivalent of tearing a building down to its foundation and starting over again.

For all of its faults, Sdkbin does generate a significant amount of revenue for us each year. We’ve kept it on life support for four years because its original author left it in utterly incomprehensible shape. In this post I’m going to talk about the plague that’s killed four years of opportunities and left this project swaddled in technical debt before it even served its first customer: frameworkism.

Read More

Has Ruby-on-Rails-Style 'Gem Glue-Gunning' Come to .NET?

25 Oct 2024 7 minutes to read

Has Ruby-on-Rails-Style 'Gem Glue-Gunning' Come to .NET?

In this post we’re going to travel back in time to 2010 - a happier, simpler time for early-stage startup software developers. When Heroku was free and front-end developers hadn’t had a chance to ruin the JavaScript ecosystem yet. We will eventually make our way back to 2024 .NET-land.

Ruby Land: 2010-2014

Back in the MarkedUp and early Petabridge days, I worked out of Coloft in Santa Monica, CA - a pioneer in the co-working space in Los Angeles. We had lots of startups and software developers of every shade working out of the space - it was even Uber’s original LA office location until they outgrew it.

But one group of developers who left a lasting impression on me was a Ruby on Rails consulting shop that specialized in delivering SaaS and mobile back-ends for Apple’s fledgling App Store (back in 2010.)

What these guys had down was a one-size-fits-all universal template for delivering client applications:

Read More

Hate Your Own Work and Ship It Anyway

08 Aug 2024 6 minutes to read

Hate Your Own Work and Ship It Anyway

When talking to members of our team about their projects and taking on more responsibility for their outcomes I will regularly recommend the following:

“You should hate your own work product and still ship it anyway.”

This advice is as applicable for shipping software as it is for sending sales emails, graphic design, sweeping floors, or writing this very blog post. But why give it in the first place?

Read More

Noticing Skill Issues is Not Gatekeeping

30 May 2024 6 minutes to read

Noticing Skill Issues is Not Gatekeeping

I recently waded into the waters of an intentionally obtuse piece of engagement bait on .NET Twitter, mostly because I thought it was funny:

Read More

.NET Developers Begging for Ecosystem Destruction

18 Mar 2024 19 minutes to read

.NET Developers Begging for Ecosystem Destruction

An ASP.NET GitHub thread entitled “Epic: Eventing Framework in .NET 9” ignited an inferno of criticism for the usual reasons: Microsoft big-footing its own .NET OSS ecosystem, etc, etc…

A few years ago I would have cared about that, but this is simply in Microsoft’s nature - as I’ve written about here before. No amount of public venting of nerd rage or OSS community spirit is going to reach the top of the ivory tower over there. Only changes to Azure spend can make that happen.

If you want to play in the .NET ecosystem as an OSS project, a tool maker, etc - this is the price of admission. If Microsoft entering your space is enough to make you quit or enough to kill your business then you were never creative, determined, or passionate enough to succeed in the first place.

Microsoft claims they’re working on this framework mostly just to improve Azure WebJobs and therefore this isn’t really a threat to MassTransit, Wolverine, MediatR, et al but I don’t believe that. Why make it an epic within ASP.NET, by far the most popular framework in the ecosystem, if you don’t intend to have third parties actually use it?

That aside, it’s not the reaction of the OSS producers or Microsoft on that thread I found interesting - it was the reaction of .NET OSS consumers that caught me by surprise.

Many .NET developers were vocally cheering on the destruction of these popular third party frameworks, as though having multiple, well-maintained tools was an inconvenience that needed solving.

Who are the .NET developers demanding that .NET destroy its own ecosystem and return to .NET to the uncompetitive, intellectual ghetto of yesteryear?

Read More

How to Distribute Roslyn Analyzers via NuGet

11 Jan 2024 9 minutes to read

How to Distribute Roslyn Analyzers via NuGet

Towards the end of 2023 I had some rare downtime and decided to use it to develop a new skill I’ve wanted to learn: leveraging .NET’s impressive Roslyn Compiler Platform to help Akka.NET users be more productive at compile-time.

Roslyn Platform Logo

That interest propelled me to release Akka.Analyzers, a new set of Roslyn Analyzers + Code Fix Providers that we’ve incorporated directly into the core Akka NuGet package as a transitive dependency going forward, so all Akka.NET users and all packages built on top of Akka.NET will benefit directly from our efforts there in perpetuity.

In this blog post I want to discuss one tricky and important obstacle that was not explained very well in any of the literature I found online: how to actually format the Roslyn-enabled NuGet package correctly. This is non-obvious.

Read More