ploeh blog
- 2026-09-08: Worse is better: C# versus F#
- 2026-08-13: Why use ORMs if LLMs write code?
- 2026-07-23: Does code quality still matter?
- 2026-07-06: Worse is better: JSON versus XML
- 2026-06-29: Worse is better
- 2026-05-04: Motivated reasoning
- 2026-04-20: In defence of bureaucracy
- 2026-04-13: Secret agentic AI
- 2026-04-06: The hailo effect
- 2026-03-30: Programming languages for AI
- 2026-03-23: Will you go to prison for an AI?
- 2026-03-09: Which of these languages are best for AI?
- 2026-03-03: In defence of correctness
- 2026-02-23: TDD as induction
- 2026-02-16: Critiquing tests
- 2026-02-09: Simplifying assertions with lenses
- 2026-02-02: Code that fits in a context window
- 2026-01-26: AI-generated tests as ceremony
- 2026-01-19: Filtering as domain logic
- 2026-01-12: Two regimes of Git
- 2026-01-05: Coupling from a big-O perspective
- 2025-12-29: Git integration is ten years away
- 2025-12-22: Test-specific Eq
- 2025-12-15: Tautological assertions are not always caused by aliasing
- 2025-12-08: Pattern guards for a protocol
- 2025-12-01: Treat test code like production code
- 2025-11-24: Result is the most boring sum type
- 2025-11-17: Empirical software prototyping
- 2025-11-10: 100% coverage is not that trivial
- 2025-11-03: Empirical Characterization Testing
- 2025-10-27: Empirical test-after development
- 2025-10-20: Epistemology of software
- 2025-10-15: Result isomorphism
- 2025-10-06: Shift left on x
- 2025-09-29: Composing pure Haskell assertions
- 2025-09-22: It's striking so quickly the industry forgets that lines of code isn't a measure of productivity
- 2025-09-15: Greyscale-box test-driven development
- 2025-09-08: IO is special
- 2025-09-01: Song recommendations with C# free monads
- 2025-08-25: Song recommendations with F# free monads
- 2025-08-18: Song recommendations with Haskell free monads
- 2025-08-11: Song recommendations with free monads
- 2025-08-04: Testing races with a synchronizing Decorator
- 2025-07-28: Song recommendations with F# agents
- 2025-07-21: Song recommendations with C# Reactive Extensions
- 2025-07-14: Song recommendations with pipes and filters
- 2025-07-07: A parser and interpreter for a very small language
- 2025-06-30: Song recommendations from Haskell combinators
- 2025-06-23: Song recommendations from F# combinators
- 2025-06-16: Song recommendations from C# combinators
- 2025-06-09: Song recommendations from combinators
- 2025-06-02: Testing races with a slow Decorator
- 2025-05-26: Song recommendations as a Haskell Impureim Sandwich
- 2025-05-19: Song recommendations as an F# Impureim Sandwich
- 2025-05-12: Song recommendations proof-of-concept memory measurements
- 2025-05-05: Song recommendations as a C# Impureim Sandwich
- 2025-04-28: Song recommendations as an Impureim Sandwich
- 2025-04-21: Porting song recommendations to Haskell
- 2025-04-14: Porting song recommendations to F#
- 2025-04-10: Characterising song recommendations
- 2025-04-07: Alternative ways to design with functional programming
- 2025-04-01: Ports and fat adapters
- 2025-03-17: Phased breaking changes
- 2025-03-10: Appeal to aithority
- 2025-03-03: Reactive monad
- 2025-02-24: Easier encapsulation with static types
- 2025-02-17: In defence of multiple WiP
- 2025-02-10: Geographic hulls
- 2025-02-03: Modelling data relationships with C# types
- 2025-01-27: Dependency inversion without inversion of control
- 2025-01-20: Modelling data relationships with F# types
- 2025-01-13: Recawr Sandwich
- 2025-01-06: Encapsulating rod-cutting
- 2024-12-30: Pytest is fast
- 2024-12-23: Implementing rod-cutting
- 2024-12-16: A restaurant sandwich
- 2024-12-09: Implementation and usage mindsets
- 2024-12-02: Short-circuiting an asynchronous traversal
- 2024-11-25: Nested monads
- 2024-11-18: Collecting and handling result values
- 2024-11-11: Traversals
- 2024-11-04: Pendulum swing: no Haskell type annotation by default
- 2024-10-28: Functor compositions
- 2024-10-21: Legacy Security Manager in Haskell
- 2024-10-14: Functor sums
- 2024-10-07: The Const functor
- 2024-10-03: Das verflixte Hunde-Spiel
- 2024-09-23: FSZipper in C#
- 2024-09-16: Functor products
- 2024-09-09: A Binary Tree Zipper in C#
- 2024-09-02: Keeping cross-cutting concerns out of application code
- 2024-08-26: A List Zipper in C#
- 2024-08-19: Zippers
- 2024-08-12: Using only a Domain Model to persist restaurant table configurations
- 2024-08-05: Using a Shared Data Model to persist restaurant table configurations
- 2024-07-29: Using Ports and Adapters to persist restaurant table configurations
- 2024-07-25: Three data architectures for the server
- 2024-07-15: The end of trust?
- 2024-07-08: Should interfaces be asynchronous?
- 2024-07-01: An immutable priority collection
- 2024-06-24: A mutable priority collection
- 2024-06-17: A failed attempt at priority collection with inheritance
- 2024-06-12: Simpler encapsulation with immutability
- 2024-06-03: You'll regret using natural keys
- 2024-05-27: Continuous delivery without a CI server
- 2024-05-20: Fundamentals
- 2024-05-13: Gratification
- 2024-05-06: Conservative codomain conjecture
- 2024-04-29: Service compatibility is determined based on policy
- 2024-04-22: Fitting a polynomial to a set of points
- 2024-04-15: Services share schema and contract, not class
- 2024-04-08: Extracting curve coordinates from a bitmap
- 2024-04-01: Trying to fit the hype cycle
- 2024-03-25: Services are autonomous
- 2024-03-18: Extracting data from a small CSV file with Python
- 2024-03-11: Boundaries are explicit
- 2024-03-04: The four tenets of SOA revisited
- 2024-02-26: Testing exceptions
- 2024-02-19: Extracting data from a small CSV file with Haskell
- 2024-02-12: Range as a functor
- 2024-02-05: Statically and dynamically typed scripts
- 2024-01-29: Error categories and category errors
- 2024-01-22: A Range kata implementation in C#
- 2024-01-15: A Range kata implementation in F#
- 2024-01-08: A Range kata implementation in Haskell
- 2024-01-01: Variations of the Range kata
- 2023-12-25: Serializing restaurant tables in C#
- 2023-12-18: Serializing restaurant tables in F#
- 2023-12-11: Serializing restaurant tables in Haskell
- 2023-12-04: Serialization with and without Reflection
- 2023-11-27: Synchronizing concurrent teams
- 2023-11-20: Trimming a Fake Object
- 2023-11-14: CC golf
- 2023-11-13: Fakes are Test Doubles with contracts
- 2023-10-30: A C# port of validation with partial round trip
- 2023-10-23: Domain Model first
- 2023-10-16: At the boundaries, static types are illusory
- 2023-10-09: What's a sandwich?
- 2023-10-02: Dependency Whac-A-Mole
- 2023-09-25: The case of the mysterious comparison
- 2023-09-18: Do ORMs reduce the need for mapping?
- 2023-09-11: A first stab at the Brainfuck kata
- 2023-09-04: Decomposing CTFiYH's sample code base
- 2023-08-28: A first crack at the Args kata
- 2023-08-21: Compile-time type-checked truth tables
- 2023-08-14: Replacing Mock and Stub with a Fake
- 2023-08-07: NonEmpty catamorphism
- 2023-07-31: Test-driving the pyramid's top
- 2023-07-24: Is software getting worse?
- 2023-07-17: Works on most machines
- 2023-07-10: AI for doc comments
- 2023-07-03: Validating or verifying emails
- 2023-06-26: Validation and business rules
- 2023-06-19: When is an implementation detail an implementation detail?
- 2023-06-12: Collatz sequences by function composition
- 2023-06-05: The Git repository that vanished
- 2023-05-29: Favour flat code file folders
- 2023-05-23: Visual Studio Code snippet to make URLs relative
- 2023-05-15: Folders versus namespaces
- 2023-05-08: Is cyclomatic complexity really related to branch coverage?
- 2023-05-01: Refactoring pure function composition without breaking existing tests
- 2023-04-24: Are pull requests bad because they originate from open-source development?
- 2023-04-17: A restaurant example of refactoring from example-based to property-based testing
- 2023-04-10: Anagrams kata as a one-liner
- 2023-04-03: An abstract example of refactoring from interaction-based to property-based testing
- 2023-03-27: More functional pits of success
- 2023-03-20: On trust in software development
- 2023-03-13: Confidence from Facade Tests
- 2023-03-06: Warnings-as-errors friction
- 2023-02-27: Test Data Generator monad
- 2023-02-20: A thought on workplace flexibility and asynchrony
- 2023-02-13: Epistemology of interaction testing
- 2023-02-06: Contravariant functors as invariant functors
- 2023-01-30: Built-in alternatives to applicative assertions
- 2023-01-23: Agilean
- 2023-01-16: In the long run
- 2023-01-09: The IO monad
- 2023-01-02: Adding NuGet packages when offline
- 2022-12-26: Functors as invariant functors
- 2022-12-19: Error-accumulating composable assertions in C#
- 2022-12-12: When do tests fail?
- 2022-12-05: GitHub Copilot preliminary experience report
- 2022-11-28: An initial proof of concept of applicative assertions in C#
- 2022-11-21: Decouple to delete
- 2022-11-14: The Reader monad
- 2022-11-07: Applicative assertions
- 2022-10-31: A regular grid emerges
- 2022-10-24: Encapsulation in Functional Programming
- 2022-10-17: Stubs and mocks break encapsulation
- 2022-10-10: Refactoring a saga from the State pattern to the State monad
- 2022-10-03: Some thoughts on the economics of programming
- 2022-09-26: Refactoring the TCP State pattern example to pure functions
- 2022-09-19: When to refactor
- 2022-09-12: Coalescing DTOs
- 2022-09-05: The State pattern and the State monad
- 2022-08-29: Natural transformations as invariant functors
- 2022-08-22: Can types replace validation?
- 2022-08-15: ASP.NET validation revisited
- 2022-08-08: Endomorphism as an invariant functor
- 2022-08-01: Invariant functors
- 2022-07-25: An applicative reservation validation example in C#
- 2022-07-18: Natural transformations
- 2022-07-11: Functor relationships
- 2022-07-04: Get and Put State
- 2022-06-27: Test Double clocks
- 2022-06-20: The State monad
- 2022-06-13: Some thoughts on naming tests
- 2022-06-06: Asynchronous monads
- 2022-05-30: The Lazy monad
- 2022-05-23: Waiting to never happen
- 2022-05-16: The Identity monad
- 2022-05-09: An Either monad
- 2022-05-02: At the boundaries, applications aren't functional
- 2022-04-25: The Maybe monad
- 2022-04-19: The List monad
- 2022-04-11: Monad laws
- 2022-04-04: Kleisli composition
- 2022-03-28: Monads
- 2022-03-21: Contravariant Dependency Injection
- 2022-03-14: Type-safe DI Containers are redundant
- 2022-03-07: A type-safe DI Container as a tuple
- 2022-02-28: Can one flatten a statically typed list?
- 2022-02-21: A type-safe DI Container as a functor
- 2022-02-14: A conditional sandwich example
- 2022-02-07: Nested type-safe DI Containers
- 2022-01-31: A type-safe DI Container C# example
- 2022-01-24: Type-level DI Container prototype
- 2022-01-17: Enumerate Wordle combinations with an applicative functor
- 2022-01-10: Type-safe DI composition
- 2022-01-03: To ID or not to ID
- 2021-12-27: Label persistent test data with deletion dates
- 2021-12-20: Changing your organisation
- 2021-12-13: Backwards compatibility as a profunctor
- 2021-12-06: The Liskov Substitution Principle as a profunctor
- 2021-11-29: Postel's law as a profunctor
- 2021-11-22: Functions as pipes
- 2021-11-15: Types as sets
- 2021-11-08: Reader as a profunctor
- 2021-11-01: Profunctors
- 2021-10-25: Functor variance compared to C#'s notion of variance
- 2021-10-18: Readability verification
- 2021-10-11: Serendipity-driven development
- 2021-10-04: Reader as a contravariant functor
- 2021-09-27: The Equivalence contravariant functor
- 2021-09-20: Keep IDs internal with REST
- 2021-09-13: Unit testing private helper methods
- 2021-09-09: The Specification contravariant functor
- 2021-09-06: The Command Handler contravariant functor
- 2021-09-02: Contravariant functors
- 2021-08-30: The Reader functor
- 2021-08-09: Am I stuck in a local maximum?
- 2021-08-03: The Tennis kata revisited
- 2021-07-28: Referential transparency fits in your head
- 2021-07-19: The State functor
- 2021-07-12: A reading of Extensibility for the Masses
- 2021-07-05: Fractal hex flowers
- 2021-06-28: Property-based testing is not the same as partition testing
- 2021-06-21: Agile pull requests
- 2021-06-14: New book: Code That Fits in Your Head
- 2021-06-07: Abstruse nomenclature
- 2021-05-31: From State tennis to endomorphism
- 2021-05-24: Tennis kata using the State pattern
- 2021-05-17: Against consistency
- 2021-05-10: Simplifying code with Decorated Commands
- 2021-05-03: Structural equality for better tests
- 2021-04-26: Leaky abstraction by omission
- 2021-04-19: Consider including identity in URLs
- 2021-04-12: Threading context through a catamorphism
- 2021-04-05: Mazes on Voronoi tessellations
- 2021-03-29: Table-driven tennis scoring
- 2021-03-22: The dispassionate developer
- 2021-03-15: Pendulum swing: pure by default
- 2021-03-08: Pendulum swing: sealed by default
- 2021-03-01: Pendulum swing: internal by default
- 2021-02-22: Pendulum swings
- 2021-02-15: When properties are easier than examples
- 2021-02-09: Accountability and free speech
- 2021-02-01: ASP.NET POCO Controllers: an experience report
- 2021-01-25: Self-hosted integration tests in ASP.NET
- 2021-01-18: Parametrised test primitive obsession code smell
- 2021-01-11: Waiting to happen
- 2021-01-04: Dynamic test oracles for rho problems
- 2020-12-28: An F# demo of validation with partial data round trip
- 2020-12-21: A Haskell proof of concept of validation with partial data round trip
- 2020-12-14: Validation, a solved problem?
- 2020-12-07: Branching tests
- 2020-11-30: Name by role
- 2020-11-23: Good names are skin-deep
- 2020-11-16: Redirect legacy URLs
- 2020-11-09: Checking signed URLs with ASP.NET
- 2020-11-02: Signing URLs with ASP.NET
- 2020-10-26: Fit URLs
- 2020-10-19: Monomorphic functors
- 2020-10-12: Subjectivity
- 2020-10-05: Fortunately, I don't squash my commits
- 2020-09-28: EnsureSuccessStatusCode as an assertion
- 2020-09-21: An XPath query for long methods
- 2020-09-14: We need young programmers; we need old programmers
- 2020-09-07: Add null check without brackets in Visual Studio
- 2020-08-31: Properties for all
- 2020-08-24: Adding REST links as a cross-cutting concern
- 2020-08-17: Unit testing is fine
- 2020-08-10: An ASP.NET Core URL Builder
- 2020-08-03: Using the nameof C# keyword with ASP.NET 3 IUrlHelper
- 2020-07-27: Task asynchronous programming as an IO surrogate
- 2020-07-20: Closing database connections during test teardown
- 2020-07-13: Implementation of the C# IO container
- 2020-07-06: Referential transparency of IO
- 2020-06-29: Syntactic sugar for IO
- 2020-06-22: The IO functor
- 2020-06-15: IO container in a parallel C# universe
- 2020-06-08: The IO Container
- 2020-06-01: Retiring old service versions
- 2020-05-25: Where's the science?
- 2020-05-18: Modelling versus shaping reality
- 2020-05-11: AFK
- 2020-05-04: Significant whitespace is DRY
- 2020-04-27: An F# implementation of the Maître d' kata
- 2020-04-20: Unit bias against collections
- 2020-04-13: Curb code rot with thresholds
- 2020-04-06: Repeatable execution in C#
- 2020-03-30: Repeatable execution in Haskell
- 2020-03-23: Repeatable execution
- 2020-03-16: Conway's Law: latency versus throughput
- 2020-03-09: Polymorphic Builder
- 2020-03-02: Impureim sandwich
- 2020-02-24: Discerning and maintaining purity
- 2020-02-17: Builder as a monoid
- 2020-02-10: Builder isomorphisms
- 2020-02-03: Non-exceptional averages
- 2020-01-27: The Maître d' kata
- 2020-01-20: Algebraic data types aren't numbers on steroids
- 2020-01-13: On doing katas
- 2020-01-06: The case of the unbalanced brackets
- 2019-12-30: Semigroup resonance FizzBuzz
- 2019-12-23: The case of the mysterious curly bracket
- 2019-12-16: Zone of Ceremony
- 2019-12-09: Put cyclomatic complexity to good use
- 2019-12-02: Refactoring registration flow to functional architecture
- 2019-11-25: TimeSpan configuration values in .NET Core
- 2019-11-18: Small methods are easy to troubleshoot
- 2019-11-11: Diamond rock
- 2019-11-04: The 80/24 rule
- 2019-10-28: A basic Haskell solution to the robot journeys coding exercise
- 2019-10-21: A red-green-refactor checklist
- 2019-10-14: Tautological assertion
- 2019-10-07: Devil's advocate
- 2019-09-30: 10x developers
- 2019-09-23: Unit testing wai applications
- 2019-09-16: Picture archivist in F#
- 2019-09-09: Picture archivist in Haskell
- 2019-09-02: Naming newtypes for QuickCheck Arbitraries
- 2019-08-26: Functional file system
- 2019-08-19: A rose tree functor
- 2019-08-12: Rose tree bifunctor
- 2019-08-05: Rose tree catamorphism
- 2019-07-29: Church-encoded rose tree
- 2019-07-22: Chain of Responsibility as catamorphisms
- 2019-07-15: Tester-Doer isomorphisms
- 2019-07-08: Payment types catamorphism
- 2019-07-01: Yes silver bullet
- 2019-06-24: Full binary tree catamorphism
- 2019-06-17: Composition Root location
- 2019-06-10: Tree catamorphism
- 2019-06-03: Either catamorphism
- 2019-05-27: List catamorphism
- 2019-05-20: Maybe catamorphism
- 2019-05-13: Peano catamorphism
- 2019-05-06: Boolean catamorphism
- 2019-04-29: Catamorphisms
- 2019-04-22: Applicative monoids
- 2019-04-15: Lazy monoids
- 2019-04-08: A pure Test Spy
- 2019-04-01: An example of state-based testing in C#
- 2019-03-25: An example of state based-testing in F#
- 2019-03-18: The programmer as decision maker
- 2019-03-11: An example of state-based testing in Haskell
- 2019-03-04: Code quality isn't software quality
- 2019-02-25: An example of interaction-based testing in C#
- 2019-02-18: From interaction-based to state-based testing
- 2019-02-11: Asynchronous Injection
- 2019-02-04: How to get the value out of the monad
- 2019-01-28: Better abstractions revisited
- 2019-01-21: Some thoughts on anti-patterns
- 2019-01-14: An Either functor
- 2019-01-07: Either bifunctor
- 2018-12-31: Tuple bifunctor
- 2018-12-24: Bifunctors
- 2018-12-17: The Lazy applicative functor
- 2018-12-10: Danish CPR numbers in F#
- 2018-12-03: Set is not a functor
- 2018-11-26: The Test Data Generator applicative functor
- 2018-11-19: Functional architecture: a definition
- 2018-11-12: What to test and not to test
- 2018-11-05: Applicative validation
- 2018-10-29: The Maybe applicative functor
- 2018-10-22: Applicative combinations of functions
- 2018-10-15: An applicative password list
- 2018-10-08: Full deck
- 2018-10-01: Applicative functors
- 2018-09-24: Asynchronous functors
- 2018-09-17: Typing is not a programming bottleneck
- 2018-09-10: The Lazy functor
- 2018-09-03: The Identity functor
- 2018-08-27: On Constructor Over-injection
- 2018-08-20: Reactive functor
- 2018-08-13: A Visitor functor
- 2018-08-06: A Tree functor
- 2018-07-30: Flattening arrow code using a stack of monads
- 2018-07-24: Dependency Injection revisited
- 2018-07-16: Angular addition monoid
- 2018-07-09: Typing and testing problem 23
- 2018-07-02: Terse operators make business code more readable
- 2018-06-25: Visitor as a sum type
- 2018-06-18: Church-encoded payment types
- 2018-06-11: Church-encoded Either
- 2018-06-04: Church-encoded Maybe
- 2018-05-28: Church-encoded natural numbers
- 2018-05-24: Church-encoded Boolean values
- 2018-05-22: Church encoding
- 2018-05-17: Composite as a monoid - a business rules example
- 2018-05-14: Project Arbitraries with view patterns
- 2018-05-07: Inlined HUnit test lists
- 2018-04-30: Parametrised unit tests in Haskell
- 2018-04-23: Null Object as identity
- 2018-04-16: Endomorphic Composite as a monoid
- 2018-04-09: Coalescing Composite as a monoid
- 2018-04-03: Maybe monoids
- 2018-03-26: The Maybe functor
- 2018-03-22: Functors
- 2018-03-19: Functors, applicatives, and friends
- 2018-03-12: Composite as a monoid
- 2018-03-05: Some design patterns as universal abstractions
- 2018-02-26: Inheritance-composition isomorphism
- 2018-02-19: Abstract class isomorphism
- 2018-02-12: Object isomorphisms
- 2018-02-05: Uncurry isomorphisms
- 2018-01-29: Argument list isomorphisms
- 2018-01-22: Function isomorphisms
- 2018-01-15: Unit isomorphisms
- 2018-01-08: Software design isomorphisms
- 2018-01-02: Colour-mixing magma
- 2017-12-28: Rock Paper Scissors magma
- 2017-12-27: Magmas
- 2017-12-18: Quasigroups
- 2017-12-11: Semigroups accumulate
- 2017-12-04: Bounding box semigroup
- 2017-11-27: Semigroups
- 2017-11-20: Monoids accumulate
- 2017-11-13: Endomorphism monoid
- 2017-11-06: Function monoids
- 2017-10-30: Tuple monoids
- 2017-10-23: Convex hull monoid
- 2017-10-16: Money monoid
- 2017-10-10: Strings, lists, and sequences as a monoid
- 2017-10-06: Monoids
- 2017-10-05: Monoids, semigroups, and friends
- 2017-10-04: From design patterns to category theory
- 2017-09-25: Interception vis-à-vis Pure DI
- 2017-09-18: The Test Data Generator functor
- 2017-09-11: Test data without Builders
- 2017-09-04: Builder as Identity
- 2017-08-28: The Builder functor
- 2017-08-21: Generalised Test Data Builder
- 2017-08-15: Test Data Builders in C#
- 2017-08-14: From Test Data Builders to the identity functor
- 2017-08-07: F# free monad recipe
- 2017-07-31: Combining free monads in F#
- 2017-07-24: Combining free monads in Haskell
- 2017-07-17: A pure command-line wizard
- 2017-07-11: Hello, pure command-line interaction
- 2017-07-10: Pure interactions
- 2017-07-04: Pure times in F#
- 2017-06-28: Pure times in Haskell
- 2017-06-27: Pure times
- 2017-06-06: Fractal trees with PureScript
- 2017-05-30: Using Polly with F# async workflows
- 2017-04-24: Simple holidays
- 2017-03-30: A reusable ApiController Adapter
- 2017-02-02: Dependency rejection
- 2017-01-30: Partial application is dependency injection
- 2017-01-27: Dependency injection is passing an argument
- 2017-01-27: From dependency injection to dependency rejection
- 2017-01-03: Decoupling application errors from domain models
- 2016-12-16: From REST to algebraic data
- 2016-12-07: Domain modelling with REST
- 2016-11-28: Easy domain modelling with types
- 2016-10-25: When variable names are in the way
- 2016-09-26: Decoupling decisions from effects
- 2016-08-09: Untyped F# HTTP route defaults for ASP.NET Web API
- 2016-07-04: Conditional composition of functions
- 2016-06-28: Roman numerals via property-based TDD
- 2016-06-15: SUT Double
- 2016-05-17: TIE fighter FsCheck properties
- 2016-05-06: CQS and server-generated Entity IDs
- 2016-04-11: Async as surrogate IO
- 2016-03-21: Composition with an Either computation expression
- 2016-03-18: Functional architecture is Ports and Adapters
- 2016-03-01: Ad-hoc Arbitraries - now with pipes
- 2016-02-19: Types + Properties = Software: other properties
- 2016-02-18: Types + Properties = Software: finite state machine
- 2016-02-17: Types + Properties = Software: initial state
- 2016-02-16: Types + Properties = Software: composition
- 2016-02-15: Types + Properties = Software: properties for the Forties
- 2016-02-12: Types + Properties = Software: properties for the advantage state
- 2016-02-11: Types + Properties = Software: state transition properties
- 2016-02-10: Types + Properties = Software: designing with types
- 2016-02-10: Types + Properties = Software
- 2016-02-06: Are shuffled plays random?
- 2016-01-18: Make pre-conditions explicit in Property-Based Tests
- 2015-12-22: Tail Recurse
- 2015-12-21: Integration Testing composed functions
- 2015-12-04: The Rules of Attraction: Location
- 2015-12-03: The Rules of Attraction: Language
- 2015-12-01: Recurse
- 2015-11-30: To log or not to log
- 2015-11-16: Code coverage is a useless target measure
- 2015-11-13: Null has no type, but Maybe has
- 2015-10-26: Service Locator violates encapsulation
- 2015-10-19: Visual Value Verification
- 2015-10-08: Command Query Separation when Queries should have side-effects
- 2015-09-23: Applications and their side effects
- 2015-09-22: Unit testing internals
- 2015-09-21: Public types hidden in plain sight
- 2015-09-18: Temporary Field code smell
- 2015-09-08: Ad hoc Arbitraries with FsCheck.Xunit
- 2015-08-17: When x, y, and z are great variable names
- 2015-08-12: Type Driven Development: composition
- 2015-08-11: Type Driven Development: implementing shouldIdle
- 2015-08-10: Type Driven Development
- 2015-08-03: Idiomatic or idiosyncratic?
- 2015-07-17: Type Driven Development with F# Pluralsight course
- 2015-06-22: REST implies Content Negotiation
- 2015-05-08: stringf
- 2015-05-07: Functional design is intrinsically testable
- 2015-05-06: Test-Driven Development with F# Pluralsight course
- 2015-04-17: Introduction to Property based Testing with F# Pluralsight course
- 2015-04-15: C# will eventually get all F# features, right?
- 2015-04-13: Less is more: language features
- 2015-04-02: Unit Testing with F# Pluralsight course
- 2015-03-19: POSTing JSON to an F# Web API
- 2015-02-23: Property Based Testing without a Property Based Testing framework
- 2015-02-23: A simpler Arbitrary for the Diamond kata
- 2015-01-21: Library Bundle Facade
- 2015-01-19: From Primitive Obsession to Domain Modelling
- 2015-01-15: 10 tips for better Pull Requests
- 2015-01-10: Diamond kata with FsCheck
- 2015-01-06: Composition Root Reuse
- 2014-12-24: Placement of Abstract Factories
- 2014-12-23: Exception messages are for programmers
- 2014-12-17: Good times with F#
- 2014-12-16: Name this operation
- 2014-11-18: The IsNullOrWhiteSpace trap
- 2014-10-09: Unit Testing methods with the same implementation
- 2014-10-07: AtomEventStore
- 2014-09-25: Faking a continuously Polling Consumer with scheduled tasks
- 2014-08-25: Decommissioning Decoraptors
- 2014-08-24: Decoraptor
- 2014-08-11: CQS versus server generated IDs
- 2014-08-07: Why DRY?
- 2014-08-06: Encapsulation and SOLID Pluralsight course
- 2014-07-23: Drain
- 2014-07-22: Hire me
- 2014-06-13: Passive Attributes
- 2014-06-12: Web API Raygun error handler
- 2014-06-10: Pure DI
- 2014-06-03: Compile-Time Lifetime Matching
- 2014-06-02: Captive Dependency
- 2014-05-26: Feedback on ASP.NET vNext Dependency Injection
- 2014-05-19: DI-Friendly Framework
- 2014-05-19: DI-Friendly Library
- 2014-05-19: Conforming Container
- 2014-05-16: Configuring Azure Web Jobs
- 2014-05-15: Service Locator violates SOLID
- 2014-05-01: AutoFixture conventions with Albedo
- 2014-04-30: Single Writer Web Jobs on Azure
- 2014-03-21: Composed assertions with Unquote
- 2014-03-14: Exude
- 2014-03-11: Arbitrary Version instances with FsCheck
- 2014-03-10: SOLID: the next step is Functional
- 2014-02-03: Using NuGet with autonomous repositories
- 2014-01-30: How to use FSharp.Core 4.3.0 when all you have is 4.3.1
- 2014-01-29: NuGet Package Restore considered harmful
- 2014-01-22: A Functional architecture with F#
- 2014-01-20: REST efficiency
- 2014-01-17: Hyprlinkr 1.0.0
- 2013-12-11: ZeroToNine
- 2013-12-10: Semantic Versioning with Continuous Deployment
- 2013-12-03: Layers, Onions, Ports, Adapters: it's all the same
- 2013-11-19: Not going to NDC London after all
- 2013-11-15: Albedo
- 2013-10-23: Mocks for Commands, Stubs for Queries
- 2013-10-21: Replace overloading with Discriminated Unions
- 2013-10-15: Easy ASP.NET Web API DTOs with F# CLIMutable records
- 2013-10-07: Verifying every single commit in a Git branch
- 2013-10-02: DI in .NET receives a Jolt Productivity Award
- 2013-09-13: Karma from bash on Windows
- 2013-09-11: DI and events: Composition
- 2013-09-11: DI and events: Reactive Extensions
- 2013-09-08: DI and events: Third-party Connect
- 2013-09-06: DI and events: Constructor Subscription
- 2013-09-06: Dependency Injection and events
- 2013-08-26: Running a pure F# Web API on Azure Web Sites
- 2013-08-23: How to create a pure F# ASP.NET Web API project
- 2013-08-21: Checking math homework with F#
- 2013-07-20: LINQ versus the LSP
- 2013-07-08: Defensive coding
- 2013-06-27: NDC 2013 session recordings
- 2013-06-24: A heuristic for formatting code according to the AAA pattern
- 2013-06-17: Where to put unit tests
- 2013-05-03: REST lesson learned: Consider a self link on all resources
- 2013-05-02: REST lesson learned: Consider a home link on all resources
- 2013-05-01: REST lesson learned: Avoid hackable URLs
- 2013-05-01: Herding Code podcast
- 2013-04-30: REST lesson learned: Avoid 204 responses
- 2013-04-29: REST lesson learned: Avoid user-supplied data in URI segments
- 2013-04-29: REST lessons learned
- 2013-04-23: How to change the Generate Property Stub refactoring code snippet in Visual Studio 2012
- 2013-04-15: Advanced Unit Testing Pluralsight course
- 2013-04-11: FizzBuzz kata in Clojure
- 2013-04-09: Ploeh blog syndication feed addresses
- 2013-04-08: How to automatically populate properties with AutoMoq
- 2013-04-05: How to configure AutoMoq to set up all properties
- 2013-04-04: Structural Inspection
- 2013-04-02: Why trust tests?
- 2013-03-11: Listen to trivial tests
- 2013-03-11: Auto-mocking Container
- 2013-03-08: Test trivial code
- 2013-03-04: Code readability hypotheses
- 2013-03-04: Outside-In TDD versus DDD
- 2013-03-03: Moving the blog to Jekyll
- 2013-03-01: AutoFixture 3
- 2013-02-18: String Calculator kata with Autofixture exercise 8
- 2013-02-15: String Calculator kata with Autofixture exercise 7
- 2013-02-14: String Calculator kata with Autofixture exercise 6
- 2013-02-13: String Calculator kata with Autofixture exercise 5
- 2013-02-12: String Calculator kata with Autofixture exercise 4
- 2013-02-11: String Calculator kata with Autofixture exercise 3
- 2013-02-07: String Calculator kata with Autofixture exercise 2
- 2013-02-06: String Calculator kata with AutoFixture exercise 1
- 2013-02-06: String Calculator kata with AutoFixture
- 2013-02-04: Beware of Productivity Tools
- 2013-01-16: Outside-In Test-Driven Development Pluralsight course
- 2013-01-11: Partial Type Name Role Hint
- 2013-01-10: Role Interface Role Hint
- 2013-01-09: Metadata Role Hint
- 2013-01-09: NSubstitute Auto-mocking with AutoFixture
- 2013-01-08: Argument Name Role Hint
- 2013-01-07: Type Name Role Hints
- 2013-01-07: Role Hints
- 2012-12-18: Zookeepers must become Rangers
- 2012-12-18: Rangers and Zookeepers
- 2012-11-27: Encapsulation of properties
- 2012-11-07: AppSettings convention for Castle Windsor
- 2012-11-06: When to use a DI Container
- 2012-10-03: Dependency Injection in ASP.NET Web API with Castle Windsor
- 2012-09-28: Dependency Injection and Lifetime Management with ASP.NET Web API
- 2012-08-31: Concrete Dependencies
- 2012-07-31: The order of AutoFixture Customizations matter
- 2012-07-25: FizzBuzz kata in F#: stage 2
- 2012-07-20: FizzBuzz kata in F#: stage 1
- 2012-07-18: Hyprlinkr
- 2012-07-02: Primitive Dependencies
- 2012-06-27: Facade Test
- 2012-06-22: Test-specific Equality versus Domain Equality
- 2012-06-22: Resemblance and Likeness
- 2012-06-21: The Resemblance idiom
- 2012-06-04: Bank OCR kata in F#: user stories 3 and 4
- 2012-06-01: Bank OCR kata in F#: user story 2
- 2012-05-29: Bank OCR kata in F#: user story 1
- 2012-05-25: Design patterns across paradigms
- 2012-05-24: TDD test suites should run in 10 seconds or less
- 2012-04-24: Vendor Media Types With the ASP.NET Web API
- 2012-04-19: Wiring HttpControllerContext With Castle Windsor
- 2012-04-17: Injecting HttpControllerContext With the ASP.NET Web API
- 2012-04-17: Hyperlinking With the ASP.NET Web API
- 2012-03-26: IQueryable is Tight Coupling
- 2012-03-20: Robust DI With the ASP.NET Web API
- 2012-03-19: Migrating from WCF Web API to ASP.NET Web API
- 2012-03-15: Implementing an Abstract Factory
- 2012-02-09: Is Layering Worth the Mapping?
- 2012-02-02: Loose Coupling and the Big Picture
- 2012-01-03: SOLID is Append-only
- 2011-12-21: Testing Container Configurations
- 2011-12-19: Factory Overload
- 2011-12-07: Polymorphic Consistency
- 2011-11-10: TDD improves reusability
- 2011-11-08: Independency
- 2011-10-25: SOLID concrete
- 2011-10-11: Checking for exactly one item in a sequence using C# and F#
- 2011-09-23: Weakly-typed versus Strongly-typed Message Channels
- 2011-09-19: Message Dispatching without Service Location
- 2011-09-06: AutoFixture goes Continuous Delivery with Semantic Versioning
- 2011-08-25: Service Locator: roles vs. mechanics
- 2011-08-01: Joining AppHarbor
- 2011-07-28: Composition Root
- 2011-06-07: SOLID Code isn't
- 2011-05-31: At the Boundaries, Applications are Not Object-Oriented
- 2011-05-30: Design Smell: Default Constructor
- 2011-05-27: Design Smell: Redundant Required Attribute
- 2011-05-26: Code Smell: Automatic Property
- 2011-05-25: Design Smell: Primitive Obsession
- 2011-05-24: Design Smell: Temporal Coupling
- 2011-05-24: Poka-yoke Design: From Smell to Fragrance
- 2011-05-16: Tennis Kata with immutable types and a cyclomatic complexity of 1
- 2011-05-09: Generic unit testing with xUnit.net
- 2011-05-02: AutoFixture 2.1
- 2011-05-02: Windows Azure migration smell: SQL Server over-utilization
- 2011-04-29: Feedback mechanisms and tradeoffs
- 2011-04-27: Provider is not a pattern
- 2011-04-19: AutoFixture 2.1 beta 1
- 2011-04-19: Constructor strategies for AutoFixture
- 2011-04-18: Enumerables are dynamic - also in AutoFixture
- 2011-04-05: MSDN Magazine article about CQRS on Windows Azure
- 2011-03-22: Commands are Composable
- 2011-03-18: Encapsulating AutoFixture Customizations
- 2011-03-14: Resolving closed types with MEF
- 2011-03-04: Compose object graphs with confidence
- 2011-03-03: Injection Constructors should be simple
- 2011-02-28: Interfaces are access modifiers
- 2011-02-08: Creating general populated lists with AutoFixture
- 2011-02-07: Creating specific populated lists with AutoFixture
- 2011-02-04: The BCL already has a Maybe monad
- 2011-01-24: Scalable doesn't mean fast
- 2011-01-01: My Christmas challenge has a winner
- 2010-12-24: Challenge: Resolve closed types with MEF
- 2010-12-22: The TDD Apostate
- 2010-12-18: On Role Interfaces, the Reused Abstractions Principle and Service Locators
- 2010-12-03: Towards better abstractions
- 2010-12-02: Interfaces are not abstractions
- 2010-11-22: Integrating AutoFixture with ObjectHydrator
- 2010-11-13: Rhino Mocks-based auto-mocking with AutoFixture
- 2010-11-01: Refactoring from Abstract Factory to Decorator
- 2010-11-01: Refactoring from Service Locator to Abstract Factory
- 2010-11-01: Pattern Recognition: Abstract Factory or Service Locator?
- 2010-10-19: Convention-based Customizations with AutoFixture
- 2010-10-14: Windows Azure Migration Sanity Check
- 2010-10-10: AutoFixture 2.0 Released
- 2010-10-08: AutoData Theories with AutoFixture
- 2010-09-29: The Register Resolve Release pattern
- 2010-09-20: Instrumentation with Decorators and Interceptors
- 2010-09-13: My future is Azure
- 2010-08-30: Don't call the container; it'll call you
- 2010-08-25: Changing the behavior of AutoFixture auto-mocking with Moq
- 2010-08-19: AutoFixture as an auto-mocking container
- 2010-08-09: AutoFixture 2.0 beta 1
- 2010-07-20: StructureMap PerRequest vs. Unique lifetimes
- 2010-07-12: Domain Objects and IDataErrorInfo
- 2010-06-29: Introducing AutoFixture Likeness
- 2010-05-23: Upcoming talks spring 2010
- 2010-05-18: Sneak view at Castle's WCF Facility
- 2010-05-17: ServiceHostFactory lifetime
- 2010-04-27: Fun with literal extensions and Ambient Context
- 2010-04-26: Changing Windsor lifestyles after the fact
- 2010-04-26: Why I'm migrating from MSTest to xUnit.net
- 2010-04-10: AutoFixture 1.1
- 2010-04-07: Dependency Injection is Loose Coupling
- 2010-04-06: Mapping types with AutoFixture
- 2010-04-02: AutoFixture 1.1 RC1
- 2010-03-27: Freezing mocks
- 2010-03-26: More about frozen pizza
- 2010-03-17: AutoFixture Freeze
- 2010-02-08: CNUG TDD talk
- 2010-02-03: Service Locator is an Anti-Pattern
- 2010-02-02: Refactoring to Aggregate Services
- 2010-01-27: AutoFixture 1.0
- 2010-01-27: What's so dangerous about a DI attribute?
- 2010-01-26: IWindsorInstaller
- 2010-01-25: Dependency Injection Inversion in .NET
- 2010-01-20: AutoFixture 1.0 RC2
- 2010-01-20: Enabling DI for Lazy Components
- 2010-01-20: Rebuttal: Constructor over-injection anti-pattern
- 2010-01-13: AutoFixture 1.0 RC1
- 2010-01-04: Anonymous Get
- 2009-12-20: MEF TechTalk with me
- 2009-12-14: Wiring ASP.NET MVC Error Handling with Castle Windsor
- 2009-12-07: LoggingExceptionFilter
- 2009-12-05: Building and assigning arrays with AutoFixture
- 2009-12-01: Global Error Handling in ASP.NET MVC
- 2009-11-26: Anonymous Do
- 2009-11-17: Dependency Injection Podcast with me
- 2009-11-17: Using Castle Windsor's PerWebRequest lifestyle with ASP.NET MVC on IIS7
- 2009-11-07: Creating length-constrained strings with AutoFixture
- 2009-10-31: AutoFixture beta 1
- 2009-10-26: Anonymous With
- 2009-10-24: WCF Podcast with me
- 2009-10-05: Writing a book
- 2009-09-29: SOLID or COLDS?
- 2009-09-22: Customizing A Type's Builder With AutoFixture
- 2009-09-21: AutoFixture .8.6 Released
- 2009-09-07: Self-updating AJAX links with ASP.NET MVC
- 2009-09-02: AutoFixture .8.5 Released
- 2009-08-25: Do Redux
- 2009-08-17: Omitting Only Certain Properties With AutoFixture
- 2009-08-06: A Fluent Interface For Testing INotifyPropertyChanged
- 2009-07-23: Disabling AutoProperties In AutoFixture
- 2009-07-16: DataTemplating In ASP.NET MVC
- 2009-07-11: AutoFixture .8.4 And Roadmap
- 2009-07-01: AutoFixture As Test Data Builder
- 2009-06-22: Custom Tokens Over Non-HTTP Transports
- 2009-06-20: AutoFixture .8.3 Released
- 2009-06-18: AutoFixture .8.2 Released
- 2009-06-09: Calling Methods While Building Anonymous Variables With AutoFixture
- 2009-06-05: Tweet
- 2009-06-05: Testability Is Really The Open/Closed Principle
- 2009-06-04: AutoFixture Cheat Sheet
- 2009-06-01: Setting Property Values While Building Anonymous Variables With AutoFixture
- 2009-05-28: Delegates Are Anonymous Interfaces
- 2009-05-26: The AutoFixture Builder
- 2009-05-21: SyncOrchestrator.Synchronize() Throws COMException When Unit Testing
- 2009-05-17: AutoFixture .8.1 Released
- 2009-05-15: AutoFixture As Fixture Object
- 2009-05-11: Anonymous Sequences With AutoFixture
- 2009-05-05: Managing Loosely Coupled Projects
- 2009-05-01: Dealing With Constrained Input
- 2009-04-28: Speaking at 7N IT Conference 2009
- 2009-04-27: Replacing AutoFixture's Default Algorithms
- 2009-04-23: Dealing With Types Without Public Constructors
- 2009-04-19: Creating Booleans With AutoFixture
- 2009-04-03: Creating Numbers With AutoFixture
- 2009-04-02: Creating Strings With AutoFixture
- 2009-03-24: How AutoFixture Creates Objects
- 2009-03-23: Joining Safewhere
- 2009-03-22: Announcing: AutoFixture
- 2009-03-16: Fixture Object
- 2009-03-11: Explicit Expectations
- 2009-03-10: Specification-Driven Development
- 2009-03-05: Constrained Non-Determinism
- 2009-03-03: Derived Values Ensure Executable Specification
- 2009-02-22: Updating Detached Entities With LINQ To Entities
- 2009-02-13: SUT Factory
- 2009-01-28: Zero-Friction TDD
- 2009-01-28: Living In Interesting Times
End of feed.