Worse is better: C# versus F#

Mark Seemann ยท rss ยท 2026-09-08 source โ†— Reader ๐Ÿ–ฅ๏ธ

Clean Architecture (Ports & Adapters / Hexagonal Architecture)Modularity & CouplingSoftware Design FundamentalsWorse Is Better
F# is superior to C# along most axes of comparison โ€” decisively so in F#'s built-in, compiler-enforced prevention of circular dependencies, which C# is unlikely ever to match โ€” even though F# is, ironically, the least popular of Microsoft's three officially supported .NET languages.

practical ยท Argumentative opinion essay (contrarian technical advocacy), the second installment of the author's 'Worse is better' series โ€” The END is practical โ€” to change which .NET language the reader reaches for by default (choose F#). The BODY is a sequence of evaluative-theoretical judgments about relative language merit, organized as: tractability of the comparison, non-merit explanations for the popularity gap, a feature-superset argument, a single standout architectural feature, honest concessions of C#'s current advantages, and an explicit refusal to lean on the separate FP-vs-OOP argument. Unlike the predecessor JSON-vs-XML article, the author's own stated practice ('I would choose F# by default') matches his thesis rather than diverging from it.

Structure

PartRole
Series frame + thesisOpens with the bolded hedge 'C# is a great programming language, but F# is better,' locates the piece in the 'Worse is better' series (linking back to the JSON-vs-XML installment and the VHS/Betamax analogy), and states the plan to argue F# is superior along most axes.
Popularity ranking + why this comparison is tractableEstablishes the .NET popularity ranking (C# > VB.NET > F#) and argues the comparison is unusually clean because ecosystem variables (hosting, build tools, data providers) are held constant across C# and F#, unlike cross-ecosystem language comparisons such as Java vs. Haskell.
Explaining the popularity gap without conceding meritOffers non-merit explanations for C#'s greater popularity โ€” being the more established, mature alternative (echoing the JSON-vs-XML pattern) and the claim that imperative programming is easier to learn than declarative โ€” while explicitly flagging uncertainty about the cognitive-vs-pedagogical cause.
Feature parity and beyond (the Venn-diagram argument)Explains F#'s design-forced feature parity with C# (required for .NET interoperability), then argues F# exceeds parity with a larger F#-only feature set than C#'s C#-only set, illustrated by an admittedly unmeasurable, not-to-scale Venn diagram.
A programming language for software architectsSingles out F#'s default disallowance of circular dependencies as F#'s standout feature, ties it to the general, coarse-grained, human-enforced discipline of module decomposition, and argues this makes F# priceless to architects.
What C# does betterConcedes real, current C# advantages โ€” programmer availability, GUI framework support (Razor), IDE tooling, and testing-tool ecosystem (cyclomatic complexity, coverage, mutation testing) โ€” while suggesting some are transient or overstated.
Bracketing off OOP vs FPExplicitly declines to invoke the separate, stronger claim that functional programming is superior to object-oriented programming, keeping the F#-vs-C# case independent of that undefended debate.
ConclusionRestates that the languages share most features, but F# retains capabilities โ€” led by language-level dependency management โ€” that won't transfer to C# even as C# catches up elsewhere, and teases a future 'Worse is better' article on async/await vs. monadic composition syntax.

Key terms

Propositions

Arguments

F# is superior to C# along most axes of comparison. strength: medium
Explicit premises:
Implicit premises:
Inferences:
F#'s disallowance of circular dependencies gives it built-in software-architecture support that is priceless to an architect. strength: high
Explicit premises:
Implicit premises:
Inferences:
Despite several real, current C# advantages, F# should still be the default choice for greenfield .NET development. strength: low
Explicit premises:
Implicit premises:
Inferences:

Narratives

Questions addressed

Gaps

Related documents