Code Comprehension in the Age of AI
To keep AI-generated code understandable, make only changes you can explain and maintain a short map of the system's architecture.
~/victorpierre.dev ❯ ls blog/
Notes on software engineering, systems design, tools, and the occasional reflection on working and living with technology.
Archive
To keep AI-generated code understandable, make only changes you can explain and maintain a short map of the system's architecture.
AI can help one person ship more, but it cannot replace the ideas, feedback, and learning that come from building with a team.
Field order creates padding in Go structs; the right tools can find the waste and show how much memory reordering would save.
I organize notes in Obsidian with links, Dataview, lightweight structure, and a simple daily workflow.
The transactional outbox stores business data and pending events in one transaction, then publishes the events asynchronously.
Europe and other democracies need sovereign digital infrastructure that can withstand geopolitical disruption while remaining interoperable.
In 2025, I returned to photography and Unity, worked with event-driven systems at scale, and learned to tune out more noise.
OpenTelemetry, Jaeger, and context propagation reveal where requests travel and stall across distributed Go services.
Git-spice makes stacked branches easier to create, update, and keep in sync as pull requests change.
In 2024, I changed jobs, travelled through Canada and Europe, and learned to embrace uncertainty while planning for what comes next.
This guide uses Nix flakes and nix-darwin to configure macOS declaratively and reproduce the setup on another machine.
This process keeps feature design focused on users by moving from problems and journeys to solutions, feedback, and iteration.
Stoic ideas about perception, control, and adversity can help manage stress during layoffs and rapid change in the tech industry.
Careful planning, small releases, and deliberate decisions often get software shipped sooner than rushing does.
Five practical rules help keep Go interfaces small and composable without coupling callers to concrete implementations.
Go interfaces and the decorator pattern can add caching, logging, and metrics without changing a data layer's core logic.
This guide explains major, minor, and patch versions, release candidates, and automated releases with GitHub Actions.
Go initializes every type with a zero value; understanding those defaults helps prevent nil errors and produce more useful APIs.
ActivityPub and the Fediverse let independent social platforms communicate without putting a single company in control.
I structure Go microservices around the standard library, with clear places for APIs, deployment files, documentation, and scripts.
Venom makes it possible to write end-to-end and integration tests in YAML using variables, executors, and project-level configuration.
Protocol Buffers 3 uses messages, field types, and tag numbers to define schemas that can evolve without breaking existing clients.
I use chezmoi, delta, lazydocker, lazygit, and bat to manage dotfiles, read files and diffs, and navigate Git and Docker from the terminal.