Writing
Archive
- Concept to Cash: Initiative retrospectives and visualization
Modeling an initiative as a distributed trace ā epics, stories and pull requests as nested spans ā to see where the calendar time actually went, plus a ridgeline plot for tracking WIP.
- A framework for cataloguing technical debt
A simple framework for scoring technical debt so you know what to do now versus later
- Scaling at the mediumest company: half-measures save the day
At medium-sized companies, the low-hanging fruit is just sitting there. How basic profiling and boring fixes got an ecommerce search service to 3x peak traffic before Black Friday.
- On MCPs vs CLIs
MCPs are useful, but often overused in my opinion. This is how I think of each one.
- CI Theater: we deleted our flaky tests and nothing broke
One in four deploys failed ā not because the code was wrong, but because the pipeline couldn't be trusted. Here's how we fixed it.
- Claws Don't Need to Be Complicated: A Personal AI Agent in Go
How I built a persistent personal AI agent in 2000 lines of Go that uses my Claude subscription instead of API keys, runs sandboxed via nono and talks to me on Telegram; Learnings about what seems to matter.
- How to diff a book against your mind
Using a personal knowledge base, we can use embeddings to diff a book against your current knowledge to find novelty.
- Announcing FRM, a CLI based CRM... 15 years in the making
A dusty design doc from 15 years ago finally happened thanks to agentic coding's low implementation costs.
- How to generate demo videos with playwright
You can use playwright to generate demo videos for your features or applications.
- Recommended reviewers to build your council
When building out a council of agents for review, recommendations can be very helpful.
- AI Doesn't Work Without Good Inputs (And Neither Do Humans)
AI generated code fails when we give it ambiguous requirements. Humans do too. This is how I'm thinking about addressing this problem.
- agent-chat: a way to monitor multi-agent orchestration
Announcing agent-chat, a tool which presents a slack-like interface into agent-to-agent communication
- multiclaude, a different take on llm orchestration
Dan Lorenc's attempt at an orchestrator takes a more focused approach than Gastown. These are my initial impressions.
- A Tuesday in 2027: What orchestrated LLMs might look like
When we look forward to what life as a 'fully-optimized agent orchestrator' could look like.. what might we see?
- Yegge's Developer-Agent Evolution Model
An 8-stage model describing how developers evolve from skeptical AI-assisted coding to orchestrating fleets of autonomous agents.
- Gas Town: Running Dozens of Claude Code Instances at Once
Steve Yegge released Gas Town and it's a mad scientists lair.. but I see the promise.
- LLM Session Sharer: Easily share a claude code session without clutter
Sharing claude code sessions is a pain, but it's the only way to learn how someone really uses it. Hopefully this tool helps.
- Using your (Backstage) service catalog for compliance
How we use Backstage's catalog-info.yaml labels to automatically enforce SOX and PCI requirements via GitHub org rulesets.
- Consul leader election issues
Fixing a consul cluster stuck in a raft quorum loop using peers.json to remove a bogus peer.
- A risk-based approach to open source strategy
The open source strategy at many companies is rooted in security and compliance. I think that a data-driven, risk-management approach may offer an interesting framework for driving a broader open source strategy.
- SREcon 2023 trip report
Conference notes from SREcon 2023: favorite talks on Kafka scaling, ultra-low-latency trading, and Network Error Logging.
- Understanding Etsy's search service migration
I read an Etsy engineering article that was over my head. After a bit of research, this is my new understanding.
- Feature Flags, Dynamic Config and Experimentation (oh my!)
A brief explaination of the differences, as I see them, of feature flags, dynamic config and experimentation
- Git Pre-Receive Hooks: Deploy Automatically When You Push
An example of what deploying on push looks like for self-hosted git repos
- re: Zettelkasten concerns
A response to someone's concerns with using emacs for Zettlekasten.
- An attempt at defining an ideal pipeline
Designing what I think an ideal pipeline would look like.
- My thoughts on crypto: 2022
A few of my current thoughts on crypto so I can look back on my position.
- the function '..' is not known to be defined
Notes for my future self: How to solve this error
- Governance versus Stewardship
Large enterprises talk a lot about governance, but stewardship may be a better model.
- Federated GraphQL Ops with Apollo Studio
There are a few operational concerns when moving to GraphQL. Here are the ones I know.
- Learning from Production Incidents
A framework for postmortems: blameless, timely, understandable to outsiders, reviewed, and with accountable action items.
- First and Second order metrics
Distinguishing between first-order metrics (customer outcomes) and second-order metrics (leading indicators) at Walmart.
- Is web scraping ethical?
Examining the ethics of web scraping: its legitimate uses, when it crosses ethical lines, and why it will likely increase over time.
- Biogas Digestion system.
Converting kitchen scraps into methane gas via anaerobic digestion, with open questions about implementation.
- How to make a font on Ubuntu with PPAs
Step-by-step guide to packaging a font (Microsoft's Cascadia Code) as a Debian package and uploading it to an Ubuntu PPA.
- Whiteboard photo snapper
Building a Raspberry Pi setup to automatically photograph our kitchen whiteboard and upload it to a website.
- Will binary always be the lowest level way to program?
Exploring the relationship between binary, machine code, and assembly, and how quantum computing's qubits may change the lowest level.
- What is an algorithm?
Demystifying the term 'algorithm': it's simply how you go about doing something, whether in data structures or user registration flows.
- Understanding the formal definition of Big-O
Parsing the formal mathematical definition of Big-O notation and why dropping constants makes sense, with visual examples.
- Stub Stewart Bike Ride
A 48-mile intro bike camping trip from Portland to Stub Stewart State Park via the Banks-Vernonia trail.
- Software engineering vs other engineering
Why software development lacks the formal QA standards found in nuclear or mechanical engineering, and what to do about it.
- Serene Lake
A 14-mile lollipop backpacking loop in Oregon featuring mossy forests, huckleberries, and a glacial lake.
- What Is Google Guice? Java Dependency Injection Explained
A comprehensive introduction to Google's Guice dependency injection framework for Java, covering modules, bindings, scopes, and testing.
- Literate API Testing with Dredd
Using Apiary and Dredd to validate that your API documentation actually matches your implementation.
- Altruism in the job hunt
Why I chose MIT over startups, and how to find meaningful tech work in non-profits, government, and education.
- MicroConf 2015 Recap
Highlights from MicroConf 2015, including talks by Patrick McKenzie and Steli Efti on building self-backed startups.
- Real-time code coverage analysis
Setting up live-updating code coverage reports using Istanbul, npm-watch, and browser-sync so you see coverage change as you write tests.
- Why a community might want a Python Software Foundation
The benefits of having a software foundation for a programming language community, inspired by discussions in the Node.js ecosystem.
- Thinking like a programmer: Inputs & outputs
Understanding explicit vs implicit inputs and outputs, pure functions, idempotence, and why these concepts make code more testable.
- Setuptools Entrypoints Explained
How to use setuptools entry_points to create a plugin system for your Python package, with examples from imhotep.
- Meaning of Community
Reflections on what makes someone a member of a programming community, prompted by writing JavaScript daily but not feeling like a JS developer.
- Inheritence versus Composition
Code review discussion on why composition beats mixins for clarity, testability, and encapsulation.
- Imhotep helps you enforce your styleguide during code review
Introducing Imhotep, a tool that automates coding standard enforcement by commenting on GitHub pull requests with linter violations.
- PyCon 2014 was awesome
Highlights from PyCon 2014: my Big-O notation talk, Hynek's SSL presentation post-Heartbleed, and Gary Bernhardt on JavaScript's future.
- Pull request templates make code review easier
How using a standardized pull request template helps reviewers understand changes and speeds up the code review process.
- NodeConf 2014: A story of aspiration and community
Reflections on mentoring at NodeConf 2014 and how the Node community's fearlessness in tackling hard problems inspired me.
- Obseletion through Programming
Does automation put people out of jobs? Why efficiency gains tend to grow businesses rather than shrink workforces.
- Node Knockout: A chance to play & experiment
Building a cssauron AST selector visualization tool during Node Knockout, including solving the multi-range string insertion problem.
- Selenium's Page Object Pattern: The Key to Maintainable Tests
Using the page object pattern to write cleaner, more maintainable Selenium tests by representing pages as objects with well-named APIs.
- Book Review: Backbone.js Testing by Ryan Roemer
A review of Ryan Roemer's book on testing Backbone.js apps with Chai, Mocha, and Sinon.JS. Focused and practical.
- Javascript Refactoring without an IDE
Using falafel and AST manipulation to programmatically refactor JavaScript code, with an example converting underscore conventions.
- Thinking of Databases as an Excel file
Teaching database concepts through the familiar metaphor of Excel files, sheets, and columns.
- The State of GitHub's Code Review
A critique of GitHub's code review features and a 5-item wish list for improvements including side-by-side diffs and better context.
- Pricing books as a function of risk
A pricing strategy for ebooks where early buyers pay less in exchange for taking on more risk, with price increasing as the book nears completion.
- Big-O is easy to calculate, if you know how
A step-by-step guide to calculating Big-O by counting operations and simplifying to the dominant term.
- A list of scary topics.
Programming and math topics that feel intimidating: compilers, assembly, security, 3D graphics, and everything past arithmetic.
- Big-O notation explained by a self-taught programmer
An accessible introduction to Big-O notation for self-taught programmers, covering O(1), O(n), and O(n²) with Python examples and graphs.
- Why Pisces?
Introducing Pisces, a Python web framework designed for testability by using dependency injection instead of Django's tightly-coupled patterns.
- setup.py, distutils and testing.
How to add a custom test command to setup.py using distutils when setuptools isn't available.
- PyATOM for static site syndication
Using PyAtom to generate Atom feeds for a static blog with readable Python code.
- PyATOM for static site syndication
Using PyAtom to generate Atom feeds for a static blog with readable Python code.
- Finding Unused files with Require.js imports
A bash script to find JavaScript files that aren't imported anywhere in your RequireJS project.
- Securing your email
Guide to encrypting email with GPG using Mail.app and GPGTools, covering encryption, signing, and trust concepts.
- Meaning is not zero-sum
Priorities as shifting ratios over time, not a simple work-life tradeoff. Everything in moderation, including moderation.
- Ignore Django, write testable code
Using namedtuples and value types to write faster, more testable Django code by pushing ORM usage to the edges.
- Converting from MySQL to Postgres
Migrating GitStreams from MySQL to Postgres using py-mysql2pgsql, cutting storage from 8GB to 3GB.
- Project Structure for Advanced Beginners
Treating programming projects like MMORPG quest groups: let beginners specialize to lower the barrier to meaningful contribution.
- Why I changed my name
Choosing Abrahms after marriage, inspired by the story of Abraham leaving the familiar to seek something better.
- Gittip: New, Interesting, Important
An exploration of Gittip, an anonymous recurring donation service for open source developers, and what it could mean for the future of sustainable software.
- Cellphone Plans for Geeks
Getting unlimited data and texts for $30/month using T-Mobile prepaid and Google Voice number porting.
- Personal Philosophy
My personal values: environmental stewardship, frugality, doing things the hard way, minimizing suffering, and pursuing knowledge.
- Literate programming with org-babel
Using org-babel's tangling feature to write prose-first documentation that exports to executable dotfiles and config.
- EasyMock for mere mortals
Practical tips for using EasyMock in Java without the brittle verify() dance, plus how to capture method inputs for assertions.
- Vim & Python: Making yourself at home
A comprehensive guide to configuring Vim for Python development, including plugins for file browsing, code navigation, snippets, and linting.
- Django at 30,000ft: A Manager's View
A high-level introduction to Django for managers: its benefits for fast development, excellent documentation, and built-in admin interface.
- Writing a static site generator using org-mode.
How to use Emacs org-mode's export functionality to build a static site generator with tramp-based remote publishing.
- Virtualenv Wrapper Helper
A shell hack that automatically activates the correct virtualenv when you cd into a project directory.
- Vim: My new IDE
My setup for using Vim as a full IDE: NERDtree, NERD_commenter, color schemes, LodgeIt, snippets, Taglist, and VCS integration.
- Vim Screencast: Selections
A screencast covering visual mode, visual block mode, and text object selection in Vim.
- Vim Screencast: Macros
A quick screencast demonstrating how to record and use macros in Vim for repetitive editing tasks.
- Vim Screencast: An Introduction
A 7-minute screencast covering modal editing basics, movement, editing modes, cut/copy/paste, and saving files in Vim.
- Vim Screencast: % Operator
The % operator in Vim: jumping between matching braces and using it in Ex mode to reference the current file.
- Versioning Production Settings
Using git submodules with restricted access to version production settings containing secrets while keeping the main repo public.
- Using test generators to save time
How to use Python test generators in nose and unittest2 to avoid repetitive test code when testing many similar cases.
- Using Database views with Django
Gotchas when using database views with Django and South: handling test setup, avoiding deletion errors, and invalidating foreign keys.
- Top 5 Bookmarklets
My favorite bookmarklets: jQuery injection, URL shortening, Amazon wishlist, Instapaper read-later, and Django admin tools.
- Speedy Google Code Checkouts
A bash function to quickly checkout any Google Code project with a single command.
- psycopg2 Internal Error
Quick fix for psycopg2's 'current transaction is aborted' error: ensure your database uses template_postgis.
- Piping to stdout when using BuildBot
Quick tip: pass BuildBot commands as a string instead of a list when you need shell features like output redirection.
- NameError: global name 'log' is not defined
How to fix a broken setuptools installation that throws a 'log is not defined' NameError.
- Most Used Programs: An Index
A snapshot of my daily software toolkit: Firefox, irssi, Emacs, Adium, Gmail, and various Mac utilities.
- Macports and PYTHONPATH
The two /opt paths you need to add to PYTHONPATH when using MacPorts-installed Python packages like pycrypto.
- Javascript unit tests with JS Test Driver
A guide to setting up JS Test Driver for JavaScript unit testing, including headless browser execution and CI integration.
- Importance of Documentation
How poor documentation in wxPython and dabo made me appreciate Django's excellent docs and why good documentation matters for open source.
- Google account suspended: A post mortem
What I learned after my Google account was suspended for 2 days: backup your email and have contingency plans for cloud dependence.
- Fixing your models subdirectory
How to fix Django fixture loading when your models are in a subdirectory instead of a single models.py file.
- Emacs: The Mindset, A contextual shift
Key insights for vim users switching to Emacs: the Meta vs Ctrl distinction, modes, and how Emacs shortcuts work in bash.
- Emacs: Introduction & Installation
A brief Emacs history and guide to choosing, installing, and adding packages with package.el or manual installation.
- Emacs: Being Productive
Essential Emacs navigation and editing commands to get you productive: movement, killing, yanking, and the kill ring.
- Emacs and Transmit: Remote edit Fix
Fix for using Emacs as Transmit's external editor by enabling backup-by-copying.
- Domain Sniffing Middleware
Django middleware that sets the language based on domain, enabling i18n for .com vs .fr sites from a single codebase.
- Django, PyISAPIe and IIS
Fixes for deploying Django on IIS with PyISAPIe: signals changes, path_info, and multi-part form issues.
- django-voting: A brief tutorial
A quick tutorial on implementing Reddit-style voting in Django using the django-voting reusable app with AJAX.
- Django Portfolio Application
A pointer to Wilson Miner's excellent guide for building a reusable Django portfolio application.
- Developing a Personal Brand
Why personal branding matters for anyone with an online professional presence, and how consistency across platforms builds recognition.
- Customizing Django Forms Multiwidgets
A reference to a talk I gave at django-nyc on customizing Django form multiwidgets, with example code on GitHub.
- Bash: Your forgotten friend (part 3)
Bash functions for extracting archives, grepping processes, showing git/svn branch in prompt, and more.
- Bash: Your forgotten friend (part 2)
Useful bash aliases for ls, grep, git, and common tasks like serving files from the current directory.
- Bash: Your forgotten friend (part 1)
Customizing your bash prompt and adding color to ls output for a more informative and readable terminal.
- 6 things I learned about setuptools
Lessons learned while packaging pyvcs and django-vcs: find_packages, multiple authors, versioning requirements, and including templates.
- My motivations for choosing emacs
Why I switched from vim to Emacs, early configuration struggles with CEDET and CarbonEmacs, and getting started.
- GTD Excel File
Download link for a Getting Things Done Excel spreadsheet template.