Browse our archives by topic…
Blog
Browse our blogs activity over the years…
Introducing Corvus.Text.Json V5: Mutable Documents
JsonDocumentBuilder and JsonWorkspace provide pooled, version-tracked mutable documents - the core V5 design trade-off that replaces V4's immutable-functional model with in-place mutation.
Introducing Corvus.Text.Json V5: Pooled-Memory Parsing
ParsedJsonDocument<T> uses ArrayPool-backed memory for just 136 bytes of GC pressure per document - 91% less than JsonNode - while providing a familiar System.Text.Json-compatible API.
Introducing Corvus.Text.Json V5: Schema Validation - 10× Faster
Corvus.Text.Json V5 validates JSON against all major schema drafts over 10× faster than other .NET validators - with a simple EvaluateSchema() API and optional detailed diagnostics.
Introducing Corvus.Text.Json V5: Source-Generated Types
Annotate a partial struct with [JsonSchemaTypeGenerator] and get strongly-typed properties, validation, serialization, and mutable builders - all generated at build time with full IntelliSense.
Introducing Corvus.Text.Json V5: Why V5 Exists
Corvus.Text.Json V5 is a new engine for high-performance JSON in .NET - pooled-memory parsing, mutable documents, source-generated types, and three query languages. Here's why we built it.
Optimising DAX: VertiPaq Encoding Techniques
VertiPaq fits millions of rows in memory by compressing columns. Learn how value, hash and run-length encoding work, and what they mean for model performance.
Optimising DAX: How VertiPaq Stores Your Data
VertiPaq stores Power BI data column-by-column rather than row-by-row. That makes aggregations fast and cross-column queries the trickiest part of DAX.
Optimising DAX: A Series Introduction
Optimising DAX in Power BI: VertiPaq storage, compression, model design, how queries run through the storage, formula engines, and performance patterns.
Microsoft Fabric variable libraries: best practices guide
Variable libraries in Microsoft Fabric manage environment-specific configuration. Learn where you can use them and how to set safer defaults for Dev/Test/Prod.
The GenAI Reality Check: New Instrument, Same Orchestra
AI is like introducing a powerful new instrument to an orchestra. It creates possibilities that didn't exist before. But it still requires musicians who can read music, a conductor with a vision, rehearsal time, and the discipline to play together. An orchestra that lacks these fundamentals won't be saved by a new instrument — they'll just make new kinds of noise.
Ingesting SharePoint Data into Microsoft Fabric: Your Options
SharePoint isn't going away. This post compares five ways to ingest SharePoint data into Microsoft Fabric, with guidance on cost, complexity, and incremental loading.
AI Strategy: Think Top-Down, Experiment Bottom-Up
Top-down AI strategy and bottom-up experimentation both fail alone: leading organisations combine them to drive real business results.
SQLBits 2026: A Conference Recap
SQLBits is one of the largest data platform conferences in Europe. Here's a recap of my experience at SQLBits 2026, held at the ICC Wales.
Multi-layer Caching with the Decorator Pattern
Databricks SQL cold starts kill web API performance. Fix it with two-layer caching: Azure Blob Storage & IMemoryCache, using the Decorator pattern.
Fabric Performance Benchmarking - Spark versus Python Notebooks
Benchmarking Pandas, PySpark, Polars, and DuckDB on Microsoft Fabric: in-process Python engines run 4-5x cheaper and faster than Spark for common workloads.
Medallion Architecture in Excel
Apply the Medallion Architecture to Excel: use the three-tab rule to separate raw data, logic, and output for cleaner, maintainable spreadsheets.
LINQ Max and nullable value types
LINQ's projecting Max operator has a trap for the unwary when used with value types. Understand what goes wrong, and how to avoid it.
Returning to work after a career break, with help from remote work
After years away, I returned to work in the UK. Here's how remote flexibility protected my mental health and made that transition possible!
AI-assisted coding is four decisions, not one
A simple mental model for making sense of the AI-assisted coding landscape: four layers, four decisions.
Integration Testing Azure Functions Part 5: Reqnroll in Build Pipeline
Integration testing Azure Functions with Reqnroll and C#. Part 5 covers running your Corvus.Testing specs in Azure DevOps and GitHub Actions pipelines.
Integration Testing Azure Functions Part 4: Reqnroll Configuration
Integration testing Azure Functions with Reqnroll and C#. Part 4 shows how to supply or override configuration values for the functions apps under test.
Integration Testing Azure Functions Part 3: Reqnroll hooks
Integration testing Azure Functions with Reqnroll and C#. Part 3 uses scenario and feature hooks to start functions apps and keep your BDD specs readable.
Integration Testing Azure Functions Part 2: Reqnroll step bindings
Integration testing Azure Functions with Reqnroll and C#. Part 2 uses Corvus.Testing step bindings to start and stop functions apps in your scenarios.
Integration Testing Azure Functions with Reqnroll Part 1: Introduction
Integration testing Azure Functions with Reqnroll and C#. Part 1 sets out the testing challenge and introduces the open-source Corvus.Testing library.
From Prompt Engineering to AI Programming: Enterprise GenAI Solutions
Shift from prompt engineering to AI programming by applying rigorous software engineering principles to your LLM integrations.