# Jon Skeet

Published articles for Jon Skeet.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Scratch a simple data model, find a complex one

DevFeed: [Scratch a simple data model, find a complex one](<https://devfeed.tech/articles/scratch-a-simple-data-model-find-a-complex-one-30708.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2026/08/14/scratch-a-simple-data-model-find-a-complex-one/>)

Author: jonskeet

Published: 2026-08-14T10:09:48Z

Content type: opinion

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>)

Tags: [complex](<https://devfeed.tech/tags/complex.md>), [data](<https://devfeed.tech/tags/data.md>), [general](<https://devfeed.tech/tags/general.md>), [model](<https://devfeed.tech/tags/model.md>), [real-world](<https://devfeed.tech/tags/real-world.md>)

### AI overview

The article examines how a data model that initially appears simple becomes more complex when it must represent the Bible across English translations, differing book sets, alternate book titles, chapters, and verses.

### Source excerpt

I seem to have a knack for discovering corner cases - or in many situations being a corner case. One category of this is where I find myself using a data model which appears simple to start with - and then the real world interferes. I've always found this sort of thing interesting, and recently ... Continue reading Scratch a simple data model, find a complex one ->

## Forking an open source project

DevFeed: [Forking an open source project](<https://devfeed.tech/articles/forking-an-open-source-project-30707.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2026/07/11/forking-an-open-source-project/>)

Author: jonskeet

Published: 2026-07-11T12:54:14Z

Content type: opinion

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [MIDI](<https://devfeed.tech/topics/midi.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [Windows 11](<https://devfeed.tech/topics/windows-11.md>), [NuGet](<https://devfeed.tech/topics/nuget.md>), [repo](<https://devfeed.tech/topics/repo.md>), [.NET](<https://devfeed.tech/topics/net.md>)

Tags: [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [nuget](<https://devfeed.tech/tags/nuget.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [release](<https://devfeed.tech/tags/release.md>), [repo](<https://devfeed.tech/tags/repo.md>), [windows-11](<https://devfeed.tech/tags/windows-11.md>)

### AI overview

The author explains why managed-midi stopped working properly on fully updated Windows 11 installations and discusses plans to potentially publish and maintain a fork after fixes were accepted by the original author.

### Source excerpt

Introduction and motivation Some of the projects I work on - notably V-Drum Explorer and At Your Service - use MIDI to interact with hardware devices. I use a couple of packages for this depending on the nature of the interaction, but the one I use most often is managed-midi, which currently has its "source ... Continue reading Forking an open source project ->

## Election 2029: Load Testing

DevFeed: [Election 2029: Load Testing](<https://devfeed.tech/articles/election-2029-load-testing-30706.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2026/01/18/election-2029-load-testing/>)

Author: jonskeet

Published: 2026-01-18T18:11:55Z

Content type: article

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>), [HTTP](<https://devfeed.tech/topics/http.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [election-2029](<https://devfeed.tech/tags/election-2029.md>), [http](<https://devfeed.tech/tags/http.md>), [load-testing](<https://devfeed.tech/tags/load-testing.md>), [performance](<https://devfeed.tech/tags/performance.md>), [testing](<https://devfeed.tech/tags/testing.md>), [time](<https://devfeed.tech/tags/time.md>), [tooling](<https://devfeed.tech/tags/tooling.md>)

### AI overview

This article examines three approaches to load testing an election website, describing its traffic and cost requirements, the trade-offs of the approaches tried, and the author's medium-term solution.

### Source excerpt

I've now been through three approaches to load testing for the site, and I think I've settled on a solution for the medium term at least. This post explains what I'm trying to achieve, along with the pros and cons of what I've tried. Requirements For this particular site, I have four requirements: If the ... Continue reading Election 2029: Load Testing ->

## Election 2029: Models and Reality

DevFeed: [Election 2029: Models and Reality](<https://devfeed.tech/articles/election-2029-models-and-reality-30705.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2026/01/17/election-2029-models-and-reality/>)

Author: jonskeet

Published: 2026-01-17T15:35:25Z

Content type: opinion

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [data](<https://devfeed.tech/topics/data.md>), [Code](<https://devfeed.tech/topics/code.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>), [Website](<https://devfeed.tech/topics/website.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [2026](<https://devfeed.tech/tags/2026.md>), [api](<https://devfeed.tech/tags/api.md>), [code](<https://devfeed.tech/tags/code.md>), [data](<https://devfeed.tech/tags/data.md>), [election-2029](<https://devfeed.tech/tags/election-2029.md>), [processes](<https://devfeed.tech/tags/processes.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [uk](<https://devfeed.tech/tags/uk.md>), [web](<https://devfeed.tech/tags/web.md>)

### AI overview

The article explains how a UK election website's data model failed to represent one person changing political party twice in a single day. It describes the three code areas that required changes: external data processing, data-context preparation, and website state processing.

### Source excerpt

On January 15th 2026, Robert Jenrick broke my election site. Okay, that's slightly hyperbolic. The site continued to operate, and it would be fairer to say that the actions of Kemi Badenoch and Robert Jenrick exposed a flaw in the data modelling in my site. For those readers who don't follow UK politics, two events ... Continue reading Election 2029: Models and Reality ->

## Changing Immutable Collections

DevFeed: [Changing Immutable Collections](<https://devfeed.tech/articles/changing-immutable-collections-30704.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2025/12/31/changing-immutable-collections/>)

Author: jonskeet

Published: 2025-12-31T10:32:45Z

Content type: article

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [C#](<https://devfeed.tech/topics/csharp.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [array](<https://devfeed.tech/tags/array.md>), [arrays](<https://devfeed.tech/tags/arrays.md>), [blog](<https://devfeed.tech/tags/blog.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [collection](<https://devfeed.tech/tags/collection.md>), [election-2029](<https://devfeed.tech/tags/election-2029.md>), [immutability](<https://devfeed.tech/tags/immutability.md>), [linq](<https://devfeed.tech/tags/linq.md>), [migration](<https://devfeed.tech/tags/migration.md>), [properties](<https://devfeed.tech/tags/properties.md>)

### AI overview

The article explains a migration from ImmutableList<T> and ImmutableDictionary<TKey, TValue> to immutable collection types better suited to code that creates collections and then leaves them unchanged. It describes the migration steps and related helper-method and property-type changes.

### Source excerpt

As I've written before, I'm leaning heavily into immutability in the election site code. Until September 2025 (it's taken a long time to get round to writing this blog post) that meant a combination of records, ImmutableList<T> and ImmutableDictionary<TKey, TValue>. In an ECMA C# standards meeting, however, Joseph Musser passed on some really valuable feedback ... Continue reading Changing Immutable Collections ->

## Records and the 'with' operator, redux

DevFeed: [Records and the 'with' operator, redux](<https://devfeed.tech/articles/records-and-the-with-operator-redux-30703.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2025/07/29/records-and-the-with-operator-redux/>)

Author: jonskeet

Published: 2025-07-29T20:00:38Z

Content type: opinion

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [C#](<https://devfeed.tech/topics/csharp.md>), [Programming language](<https://devfeed.tech/topics/programming-language.md>), [Code review](<https://devfeed.tech/topics/code-review.md>)

Tags: [blog-post](<https://devfeed.tech/tags/blog-post.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [code-review](<https://devfeed.tech/tags/code-review.md>), [election-2029](<https://devfeed.tech/tags/election-2029.md>)

### AI overview

A follow-up examination of an unexpected aspect of C# record types and the `with` operator. The article argues that the behavior is correct according to the documentation, but easy to misunderstand because readers may interpret `with` as changing properties on an object rather than creating a new record with different construction parameters.

### Source excerpt

In my previous blog post I described some behaviour of C# record types which was unexpected to me, though entirely correct according to the documentation. This is a follow-up post to that one, so if you haven't read that one yet, please do so - I won't go over all the same ground. Is this ... Continue reading Records and the 'with' operator, redux ->

## Unexpected inconsistency in records

DevFeed: [Unexpected inconsistency in records](<https://devfeed.tech/articles/unexpected-inconsistency-in-records-30702.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2025/07/19/unexpected-inconsistency-in-records/>)

Author: jonskeet

Published: 2025-07-19T13:04:48Z

Content type: tutorial

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [C#](<https://devfeed.tech/topics/csharp.md>), [Code](<https://devfeed.tech/topics/code.md>), [bug](<https://devfeed.tech/topics/bug.md>)

Tags: [bug](<https://devfeed.tech/tags/bug.md>), [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [code](<https://devfeed.tech/tags/code.md>), [constructor](<https://devfeed.tech/tags/constructor.md>), [mutation](<https://devfeed.tech/tags/mutation.md>), [properties](<https://devfeed.tech/tags/properties.md>)

### AI overview

The article explains an inconsistency in C# records when nondestructive mutation is combined with derived data initialized from constructor parameters. The with-style operation uses a generated copy constructor, copying existing fields rather than recalculating derived values, which can leave the copied record internally inconsistent.

### Source excerpt

Unexpected inconsistency in records The other day, I was trying to figure out a bug in my code, and it turned out to be a misunderstanding on my part as to how C# records work. It's entirely possible that I'm the only one who expected them to work in the way that I did, but ... Continue reading Unexpected inconsistency in records ->

## Election 2029: Postcodes

DevFeed: [Election 2029: Postcodes](<https://devfeed.tech/articles/election-2029-postcodes-30701.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2025/04/13/election-2029-postcodes/>)

Author: jonskeet

Published: 2025-04-13T07:41:11Z

Content type: article

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [Parsing](<https://devfeed.tech/topics/parsing.md>)

Tags: [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [election-2029](<https://devfeed.tech/tags/election-2029.md>), [parsing](<https://devfeed.tech/tags/parsing.md>), [uk](<https://devfeed.tech/tags/uk.md>)

### AI overview

The article introduces the structure and formats of modern UK postcodes, explaining how they can identify a precise address and map to a single parliamentary constituency. It also discusses using postcodes to filter constituencies on an election site and considerations when parsing complete postcode text.

### Source excerpt

Postcodes After a pretty practical previous post about records and collections, this post is less likely to give anyone ideas about how they might tackle a problem in their own project, and doesn't have any feature requests for Microsoft either. It's an area I've found really fun though. An introduction to postcodes in the UK ... Continue reading Election 2029: Postcodes ->

## Records and Collections

DevFeed: [Records and Collections](<https://devfeed.tech/articles/records-and-collections-30700.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2025/03/27/records-and-collections/>)

Author: jonskeet

Published: 2025-03-27T14:20:54Z

Content type: tutorial

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [C#](<https://devfeed.tech/topics/csharp.md>), [Code](<https://devfeed.tech/topics/code.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [data](<https://devfeed.tech/topics/data.md>)

Tags: [c-sharp](<https://devfeed.tech/tags/c-sharp.md>), [code](<https://devfeed.tech/tags/code.md>), [election-2029](<https://devfeed.tech/tags/election-2029.md>), [implementation](<https://devfeed.tech/tags/implementation.md>)

### AI overview

This post discusses practical issues encountered when using C# records and collections in an election site's immutable data models. It explains record generation and non-destructive updates, then focuses on record equality and the difficulty of applying custom element comparers to collection properties.

### Source excerpt

Records and Collections This post is to some extent a grab-bag of points of friction I've encountered when using records and collections within the election site. Records recap This may end up being the most generally useful blog post in this series. Although records have been in C# since version 10, I haven't used them ... Continue reading Records and Collections ->

## Election 2029: Storage

DevFeed: [Election 2029: Storage](<https://devfeed.tech/articles/election-2029-storage-30699.md>)

Original publisher: [Read original article](<https://codeblog.jonskeet.uk/2025/03/27/election-2029-storage/>)

Author: jonskeet

Published: 2025-03-27T11:46:31Z

Content type: tutorial

Language: en

Sources: [Jon Skeet](<https://devfeed.tech/sources/jon-skeet.md>)

Topics: [Firestore](<https://devfeed.tech/topics/firestore.md>), [Databases](<https://devfeed.tech/topics/databases.md>), [JSON](<https://devfeed.tech/topics/json.md>), [Code](<https://devfeed.tech/topics/code.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [database](<https://devfeed.tech/tags/database.md>), [development](<https://devfeed.tech/tags/development.md>), [election-2029](<https://devfeed.tech/tags/election-2029.md>), [firestore](<https://devfeed.tech/tags/firestore.md>), [json](<https://devfeed.tech/tags/json.md>), [serialization](<https://devfeed.tech/tags/serialization.md>)

### AI overview

The article describes storage for the Election 2029 project, using separate Firestore databases for test, staging, and production alongside JSON files for local development. It introduces an abstraction interface and discusses patterns for serializing data models to JSON or XML, with particular attention to the Firestore implementation.

### Source excerpt

Storage Since my last post about the data models, I've simplified things very slightly - basically the improvements that I thought about while writing the post have now been implemented. I won't go into the details of the changes, as they're not really important, but that's just to explain why some examples might look like ... Continue reading Election 2029: Storage ->