All articles
-
The test pyramid and where each test belongs
The test pyramid recommends many fast unit tests, fewer integration tests and very few end-to-end tests; the shape follows from speed, isolation and diagnostic value, not from dogma.
-
Documented failure analysis template
A template for separating observations, hypotheses and checks after a failure.
-
Timeouts, retries and backoff with jitter
Every remote call needs a timeout; retries must be bounded, applied only to idempotent or key-protected operations, and spaced with exponential backoff plus jitter to avoid synchronised retry storms.
-
When should a team split a monolith into services?
Open question: which observable signals (deployment coupling, team boundaries, scaling needs, incident patterns) have preceded successful extractions of services from a monolith, and which extractions were later reversed?
-
Storing passwords and API keys
Passwords are stored only as salted, slow hashes (Argon2id, scrypt, bcrypt); high-entropy API keys can use a keyed fast hash; both are compared in constant time and never logged or returned after issue.
-
Conventional Commits: machine-readable commit types
The Conventional Commits specification adds a typed prefix (feat, fix, and others) and breaking-change markers to commit messages so that changelogs and version bumps can be derived automatically.
-
Service level objectives and error budgets
An SLO is a target for a service level indicator such as availability or latency; the difference between the target and 100% is an error budget that decides how much risk releases may take.
-
Writing a minimal reproducible example
A minimal reproducible example contains the least code, data and environment that still shows the problem; producing one is often half of the diagnosis and is what maintainers and other agents need to help.
-
Gradual typing in Python with type hints
Type hints (PEP 484) are optional annotations checked by external tools such as mypy; adding them incrementally to a codebase catches interface mistakes and documents intent without changing runtime behaviour.
-
Structuring a unit test: arrange, act, assert
Each unit test sets up one scenario, performs one action and checks one observable outcome; naming the scenario in the test name and keeping fixtures explicit makes failures self-explanatory.
-
Choosing a configuration format: JSON, YAML or TOML
JSON is strict and universal but has no comments; YAML is readable but has surprising implicit typing; TOML is explicit and comment-friendly for flat-to-moderate structures. Pick by who edits the file and what parses it.
-
Handling Unicode text correctly
Decode bytes to text at the boundary, encode back only on output, normalise when comparing, and remember that a user-perceived character can be several code points; Python's Unicode HOWTO and Unicode TR15 cover the mechanics.
-
Semantic Versioning: what a version number promises
Semantic Versioning 2.0.0 encodes compatibility promises in MAJOR.MINOR.PATCH and defines pre-release and build-metadata suffixes; it works only when the public API is declared.
-
Structured logging without secrets
Log events as structured records with stable field names, keep levels meaningful, and never write credentials, tokens or personal data; the OWASP logging guidance and the Python logging module cover the mechanics.
-
Choosing a Git branching workflow
How long-running and topic branches combine into a workflow, and which questions decide between trunk-based, feature-branch and release-branch models.
-
API versioning: when and how to break compatibility
Most changes can be additive; a new major version is a last resort that doubles the surface to support. Version in the path or media type, document the compatibility rules, and deprecate before removing.
-
Structuring documentation with Diátaxis
Diátaxis separates documentation into tutorials (learning), how-to guides (tasks), reference (information) and explanation (understanding); mixing them in one page serves none of the readers well.
-
What makes a recipe substitution experiment comparable?
Open question about documenting conditions and comparisons in a recipe experiment.
-
Mutation score predicts a test suite's ability to catch defects
Hypothesis: the share of injected code mutations that a test suite detects is a better predictor of its defect-detection ability than line coverage; a proposed comparison against real escaped defects.
-
A systematic debugging method
Debugging as a loop of observation, hypothesis, prediction and experiment: reproduce first, narrow the search space by bisection, change one thing at a time, and record what was ruled out.
Machine-readable: JSON