Latest posts first
All articles
How I escaped decision hell by using a 1972 cognitive theory
Explains Elimination by Aspects (Tversky, 1972) as a practical way to make engineering decisions quickly by filtering options with must-have criteria.
Read articleMonads in C# (Part 2): Result
Build a small Result type in C# and use `Map`/`Bind`/`Match` to compose short-circuiting workflows with explicit failure values.
Read articleList is a monad (part 1)
An approachable introduction to monads via List: Map vs flatMap, sequencing, and the monad laws, aimed at OOP developers.
Read articleEmbracing Functional Programming Principles in OOP with Static Factory Methods
How to bring FP-style 'make invalid states unrepresentable' into OOP using static factory methods and validated value objects in C#.
Read articleWhat -Ops are there?
A data-driven survey of '-Ops' terms mined from 360GB of journal article keywords, with a curated table and links.
Read articleGZIP exceptions, but only on hot or rainy days
A debugging story about a mysterious C# gzip decompression exception and what actually caused it, with investigation steps and lessons learned.
Read articleHow to change GitHub cache action compression level
How to change GitHub Actions cache compression by setting ZSTD_CLEVEL, including an experiment showing real size differences.
Read articleQuickly estimating unused filesystem blocks
How to estimate deleted-but-not-overwritten data by scanning unused filesystem blocks, with an XFS example and recovery-tool walkthrough.
Read articleUsing 'agrep' to search for typos
Use agrep (approximate grep) and edit-distance searching to find typos and near-matches in a codebase when spellcheck isn't enough.
Read articleEnd to end tests
How to get Angular end-to-end tests running in GitHub Actions, including setup gotchas and tips for dealing with slowness and flakiness.
Read articleAutomatically expanding code review scope with suggested non changed files
A technique for expanding code reviews beyond the diff by suggesting related files that usually change together, using commit-history correlation.
Read articleShell scripts, syntax checking, linting, line breaks, CI/CD, and more
A practical checklist for writing robust shell scripts: line endings, syntax checks, linting, and CI gotchas across different environments.
Read articleUTF-8 default ignorables you should not ignore
Invisible 'default ignorable' Unicode characters can break parsing and string equality. This post explains the issue and includes C# regexes to detect them.
Read articleWhy your team thinks pipelines are scary (and how to fix it)
Why CI/CD pipelines feel scary to teams and how to reduce that fear by improving feedback loops, tooling, and script quality.
Read articleUsing systems thinking for benign pipeline failures
A systems-thinking view of benign CI pipeline failures as misaligned assumptions between developer intent and the CI environment, with a taxonomy of common causes.
Read articleIncident response flows, SLAs, and pipelines
Connects incident response and SLAs to CI/CD pipelines and proposes an 'absolutely-required' check tier for safer emergency merges during outages.
Read articleAvoiding npm install whack-a-mole
How to avoid 'npm install whack-a-mole' when pulling changes by detecting lockfile changes and running npm install/npm ci only when required.
Read articleTheoretical application of human like properties to decrease flaky tests
A thought experiment on reducing flaky polling tests by making automation more adaptive using historical timing distributions and percentiles.
Read articleHow to mitigate long-term CI/CD pipeline issues
How to keep pipelines from rotting over time: monitor resource limits, avoid brittle scripts, and treat CI as production-grade infrastructure.
Read articleEnergy efficient CI/CD
Ideas for reducing CI/CD energy and resource waste: batching jobs, consolidating stages, and scheduling work to minimize idle spin-up.
Read articleCaveats when measuring pipeline optimizations
Why CI pipeline speedups are hard to measure, how queueing effects make small improvements compound, and how to measure more accurately.
Read articleApproaches towards securing secret information and validing inputs, a last mile approach
Patterns for handling secrets and untrusted input by making unsafe usage hard: last-mile validation, type wrappers, and boundary hygiene.
Read articleAgile health checks and sprint deadline reporting
A framework for analyzing sprint outcomes (early/on-time/late) and using health checks to understand process changes before they become problems.
Read articleHow to use 'jq' robustly in the shell
Tips for using jq safely in shell scripts: raw output, error handling, and avoiding brittle post-processing that breaks JSON.
Read articleUsing curl reliably
Explains subtle curl flag interactions and failure modes (redirects, output redirection) to make downloads safer and tests more trustworthy.
Read articleMethods to reduce flaky tests
Defines flaky tests, common causes, and practical strategies to reduce nondeterminism and improve CI reliability.
Read articleSorting files larger than your available disk space
How to sort datasets larger than available disk by compressing GNU sort temporary files with --compress-program (e.g., pigz).
Read articleAn interesting feature in curl on powershell
A quick note on curl's -UseBasicParsing in PowerShell for inspecting HTTP responses, with example output and caveats.
Read articleHow to download entire GHArchive
Commands to bulk-download GHArchive (about 1TB compressed) and notes on reconstructing repo snapshots from create/delete events.
Read articleHow to quickly download thousands of config or program files to test parsers, compilers, and fuzzers
How to collect large sets of real-world config or program files (via GitHub search) to test parsers, compilers, and fuzzers.
Read articleActually install macOS in Virtual Box on Windows
A step-by-step guide to installing macOS in VirtualBox on Windows (no Mac required), including tooling setup and common pitfalls.
Read article