Writing

Archive

← Recent writing
  1. 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.

  2. A framework for cataloguing technical debt

    A simple framework for scoring technical debt so you know what to do now versus later

  3. 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.

  4. On MCPs vs CLIs

    MCPs are useful, but often overused in my opinion. This is how I think of each one.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. How to generate demo videos with playwright

    You can use playwright to generate demo videos for your features or applications.

  10. Recommended reviewers to build your council

    When building out a council of agents for review, recommendations can be very helpful.

  11. 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.

  12. 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

  13. 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.

  14. 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?

  15. 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.

  16. 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.

  17. 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.

  18. 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.

  19. Consul leader election issues

    Fixing a consul cluster stuck in a raft quorum loop using peers.json to remove a bogus peer.

  20. 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.

  21. SREcon 2023 trip report

    Conference notes from SREcon 2023: favorite talks on Kafka scaling, ultra-low-latency trading, and Network Error Logging.

  22. 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.

  23. 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

  24. Git Pre-Receive Hooks: Deploy Automatically When You Push

    An example of what deploying on push looks like for self-hosted git repos

  25. re: Zettelkasten concerns

    A response to someone's concerns with using emacs for Zettlekasten.

  26. An attempt at defining an ideal pipeline

    Designing what I think an ideal pipeline would look like.

  27. My thoughts on crypto: 2022

    A few of my current thoughts on crypto so I can look back on my position.

  28. the function '..' is not known to be defined

    Notes for my future self: How to solve this error

  29. Governance versus Stewardship

    Large enterprises talk a lot about governance, but stewardship may be a better model.

  30. Federated GraphQL Ops with Apollo Studio

    There are a few operational concerns when moving to GraphQL. Here are the ones I know.

  31. Learning from Production Incidents

    A framework for postmortems: blameless, timely, understandable to outsiders, reviewed, and with accountable action items.

  32. First and Second order metrics

    Distinguishing between first-order metrics (customer outcomes) and second-order metrics (leading indicators) at Walmart.

  33. 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.

  34. Biogas Digestion system.

    Converting kitchen scraps into methane gas via anaerobic digestion, with open questions about implementation.

  35. 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.

  36. Whiteboard photo snapper

    Building a Raspberry Pi setup to automatically photograph our kitchen whiteboard and upload it to a website.

  37. 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.

  38. 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.

  39. 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.

  40. Stub Stewart Bike Ride

    A 48-mile intro bike camping trip from Portland to Stub Stewart State Park via the Banks-Vernonia trail.

  41. 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.

  42. Serene Lake

    A 14-mile lollipop backpacking loop in Oregon featuring mossy forests, huckleberries, and a glacial lake.

  43. 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.

  44. Literate API Testing with Dredd

    Using Apiary and Dredd to validate that your API documentation actually matches your implementation.

  45. Altruism in the job hunt

    Why I chose MIT over startups, and how to find meaningful tech work in non-profits, government, and education.

  46. MicroConf 2015 Recap

    Highlights from MicroConf 2015, including talks by Patrick McKenzie and Steli Efti on building self-backed startups.

  47. 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.

  48. 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.

  49. Thinking like a programmer: Inputs & outputs

    Understanding explicit vs implicit inputs and outputs, pure functions, idempotence, and why these concepts make code more testable.

  50. Setuptools Entrypoints Explained

    How to use setuptools entry_points to create a plugin system for your Python package, with examples from imhotep.

  51. 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.

  52. Inheritence versus Composition

    Code review discussion on why composition beats mixins for clarity, testability, and encapsulation.

  53. 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.

  54. 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.

  55. 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.

  56. 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.

  57. Obseletion through Programming

    Does automation put people out of jobs? Why efficiency gains tend to grow businesses rather than shrink workforces.

  58. 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.

  59. 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.

  60. 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.

  61. Javascript Refactoring without an IDE

    Using falafel and AST manipulation to programmatically refactor JavaScript code, with an example converting underscore conventions.

  62. Thinking of Databases as an Excel file

    Teaching database concepts through the familiar metaphor of Excel files, sheets, and columns.

  63. 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.

  64. 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.

  65. 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.

  66. A list of scary topics.

    Programming and math topics that feel intimidating: compilers, assembly, security, 3D graphics, and everything past arithmetic.

  67. 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.

  68. Why Pisces?

    Introducing Pisces, a Python web framework designed for testability by using dependency injection instead of Django's tightly-coupled patterns.

  69. setup.py, distutils and testing.

    How to add a custom test command to setup.py using distutils when setuptools isn't available.

  70. PyATOM for static site syndication

    Using PyAtom to generate Atom feeds for a static blog with readable Python code.

  71. PyATOM for static site syndication

    Using PyAtom to generate Atom feeds for a static blog with readable Python code.

  72. Finding Unused files with Require.js imports

    A bash script to find JavaScript files that aren't imported anywhere in your RequireJS project.

  73. Securing your email

    Guide to encrypting email with GPG using Mail.app and GPGTools, covering encryption, signing, and trust concepts.

  74. Meaning is not zero-sum

    Priorities as shifting ratios over time, not a simple work-life tradeoff. Everything in moderation, including moderation.

  75. Ignore Django, write testable code

    Using namedtuples and value types to write faster, more testable Django code by pushing ORM usage to the edges.

  76. Converting from MySQL to Postgres

    Migrating GitStreams from MySQL to Postgres using py-mysql2pgsql, cutting storage from 8GB to 3GB.

  77. Project Structure for Advanced Beginners

    Treating programming projects like MMORPG quest groups: let beginners specialize to lower the barrier to meaningful contribution.

  78. Why I changed my name

    Choosing Abrahms after marriage, inspired by the story of Abraham leaving the familiar to seek something better.

  79. 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.

  80. Cellphone Plans for Geeks

    Getting unlimited data and texts for $30/month using T-Mobile prepaid and Google Voice number porting.

  81. Personal Philosophy

    My personal values: environmental stewardship, frugality, doing things the hard way, minimizing suffering, and pursuing knowledge.

  82. Literate programming with org-babel

    Using org-babel's tangling feature to write prose-first documentation that exports to executable dotfiles and config.

  83. EasyMock for mere mortals

    Practical tips for using EasyMock in Java without the brittle verify() dance, plus how to capture method inputs for assertions.

  84. 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.

  85. 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.

  86. 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.

  87. Virtualenv Wrapper Helper

    A shell hack that automatically activates the correct virtualenv when you cd into a project directory.

  88. Vim: My new IDE

    My setup for using Vim as a full IDE: NERDtree, NERD_commenter, color schemes, LodgeIt, snippets, Taglist, and VCS integration.

  89. Vim Screencast: Selections

    A screencast covering visual mode, visual block mode, and text object selection in Vim.

  90. Vim Screencast: Macros

    A quick screencast demonstrating how to record and use macros in Vim for repetitive editing tasks.

  91. Vim Screencast: An Introduction

    A 7-minute screencast covering modal editing basics, movement, editing modes, cut/copy/paste, and saving files in Vim.

  92. Vim Screencast: % Operator

    The % operator in Vim: jumping between matching braces and using it in Ex mode to reference the current file.

  93. Versioning Production Settings

    Using git submodules with restricted access to version production settings containing secrets while keeping the main repo public.

  94. 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.

  95. Using Database views with Django

    Gotchas when using database views with Django and South: handling test setup, avoiding deletion errors, and invalidating foreign keys.

  96. Top 5 Bookmarklets

    My favorite bookmarklets: jQuery injection, URL shortening, Amazon wishlist, Instapaper read-later, and Django admin tools.

  97. Speedy Google Code Checkouts

    A bash function to quickly checkout any Google Code project with a single command.

  98. psycopg2 Internal Error

    Quick fix for psycopg2's 'current transaction is aborted' error: ensure your database uses template_postgis.

  99. 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.

  100. NameError: global name 'log' is not defined

    How to fix a broken setuptools installation that throws a 'log is not defined' NameError.

  101. Most Used Programs: An Index

    A snapshot of my daily software toolkit: Firefox, irssi, Emacs, Adium, Gmail, and various Mac utilities.

  102. Macports and PYTHONPATH

    The two /opt paths you need to add to PYTHONPATH when using MacPorts-installed Python packages like pycrypto.

  103. 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.

  104. 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.

  105. 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.

  106. Fixing your models subdirectory

    How to fix Django fixture loading when your models are in a subdirectory instead of a single models.py file.

  107. 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.

  108. Emacs: Introduction & Installation

    A brief Emacs history and guide to choosing, installing, and adding packages with package.el or manual installation.

  109. Emacs: Being Productive

    Essential Emacs navigation and editing commands to get you productive: movement, killing, yanking, and the kill ring.

  110. Emacs and Transmit: Remote edit Fix

    Fix for using Emacs as Transmit's external editor by enabling backup-by-copying.

  111. Domain Sniffing Middleware

    Django middleware that sets the language based on domain, enabling i18n for .com vs .fr sites from a single codebase.

  112. Django, PyISAPIe and IIS

    Fixes for deploying Django on IIS with PyISAPIe: signals changes, path_info, and multi-part form issues.

  113. django-voting: A brief tutorial

    A quick tutorial on implementing Reddit-style voting in Django using the django-voting reusable app with AJAX.

  114. Django Portfolio Application

    A pointer to Wilson Miner's excellent guide for building a reusable Django portfolio application.

  115. Developing a Personal Brand

    Why personal branding matters for anyone with an online professional presence, and how consistency across platforms builds recognition.

  116. Customizing Django Forms Multiwidgets

    A reference to a talk I gave at django-nyc on customizing Django form multiwidgets, with example code on GitHub.

  117. Bash: Your forgotten friend (part 3)

    Bash functions for extracting archives, grepping processes, showing git/svn branch in prompt, and more.

  118. Bash: Your forgotten friend (part 2)

    Useful bash aliases for ls, grep, git, and common tasks like serving files from the current directory.

  119. Bash: Your forgotten friend (part 1)

    Customizing your bash prompt and adding color to ls output for a more informative and readable terminal.

  120. 6 things I learned about setuptools

    Lessons learned while packaging pyvcs and django-vcs: find_packages, multiple authors, versioning requirements, and including templates.

  121. My motivations for choosing emacs

    Why I switched from vim to Emacs, early configuration struggles with CEDET and CarbonEmacs, and getting started.

  122. GTD Excel File

    Download link for a Getting Things Done Excel spreadsheet template.