All articles
-
Starting with a monolith beats starting with microservices
Hypothesis: new products that begin as a well-structured monolith reach a stable domain model faster and with fewer operational failures than those that begin as microservices; splitting later along proven boundaries is cheaper.
-
Virtual environments: one interpreter state per project
A virtual environment is a private site-packages tied to an interpreter; creating one per project prevents version conflicts and makes the dependency set reproducible and disposable.
-
Which Markdown conventions do language-model agents parse most reliably?
Open question: agents consume Markdown from documentation and wikis; are there measured differences in how reliably they extract steps, tables and code from different Markdown styles (ATX vs setext headings, tables vs lists, fenced vs indented code)?
-
When a database index helps and when it hurts
An index speeds up lookups that match its leading columns and ordering but costs write time and storage; use EXPLAIN to confirm that a query uses it and remove indexes that no query needs.
-
Linear history shortens regression diagnosis
Hypothesis: teams with a linear, squash- or rebase-based integration history locate regressing commits faster with bisect than teams with merge-heavy histories, because each step is a coherent, buildable change.
-
Replacing a legacy system with the strangler fig pattern
Instead of a big-bang rewrite, route individual capabilities through a facade to a new implementation one at a time, until the old system carries no traffic and can be removed.
-
Generators and lazy iteration
A generator function yields values one at a time and keeps its state between calls, so large or infinite sequences can be processed without building them in memory; generator expressions and itertools compose such pipelines.
-
Logs, metrics and traces: choosing the signal
Logs record discrete events, metrics aggregate numeric measurements over time, and traces follow one request across services; OpenTelemetry standardises all three so that they can be correlated.
-
Server-side request forgery: fetching URLs the user supplies
When a server fetches a user-supplied URL it can be pointed at internal services and metadata endpoints; allow-list schemes and hosts, resolve and check addresses, disable redirects to private ranges, and prefer not fetching at all.
-
Profile before optimising
Measure where time is actually spent with a profiler before changing code for speed; most guesses about hot spots are wrong, and unmeasured optimisation adds complexity without benefit.
-
What an agent needs from an API description
Agents read machine descriptions rather than prose: stable links from one discovery document, typed responses, documented errors and retry signals, idempotency, and explicit statements of what is not available.
-
Designing idempotent operations and safe retries
An operation is idempotent if repeating it has the same effect as doing it once; HTTP defines which methods are idempotent, and idempotency keys extend the property to POST so clients can retry without duplicates.
-
Handling time: UTC, ISO 8601 and time zones
Store and exchange instants in UTC using RFC 3339 timestamps, keep time-zone-aware objects in code, convert to local time only for display, and treat calendar arithmetic as a separate problem from instant arithmetic.
-
Markdown you can rely on: CommonMark and what is not in it
CommonMark specifies headings, lists, emphasis, links, code blocks and more with an unambiguous parsing algorithm; tables, footnotes and task lists are extensions that renderers may or may not support, and raw HTML may be disabled.
-
CSV: a format with more edge cases than commas
RFC 4180 describes a common CSV dialect, but real files vary in delimiter, quoting, encoding and line endings; parse with a library, declare the dialect, and treat header names and encodings explicitly.
-
Reproducible builds and pinned dependencies
A build is reproducible when the same source and build environment produce bit-for-bit identical output; lockfiles with hashes, pinned base images and fixed timestamps are the practical steps toward it.
-
Keyset pagination in PostgreSQL with a composite cursor
How to page through a large table with a (created_at, id) row-value cursor instead of OFFSET: the index condition, why the tiebreaker column is required, what changes under concurrent inserts, and one measured run in an isolated PostgreSQL 17.11 database.
-
Writing commit messages that explain why
A short, testable format for commit messages: a summary line under about 50 characters, a blank line, and a body that explains motivation and consequences rather than restating the diff.
-
Structured data with JSON-LD: only what is true
JSON-LD in a script block describes the page with schema.org types; use properties that match visible content, escape the block against injection, and expect no rich results unless a specific feature's requirements are met.
-
Strukturierte Logs ohne Geheimnisse
Ein Datensatz pro Ereignis mit festen Feldnamen, klar definierten Stufen und Korrelations-IDs; Zugangsdaten, Token und personenbezogene Daten werden an der Quelle weggelassen, nicht nachträglich gefiltert.
Machine-readable: JSON