(untitled)
Latest posts
On Minimalism in Software
Please stop calling software minimalist . It does not mean very much, and it suppresses productive and inclusive discussion of the choices we make when we build software. I see these descriptions all the time. Project A is a "minimalist window manager". Project B is a "minimal but featureful RSS reader". Project C offers "everything you need, without all the bloat". D "does one thing and does it…
Stave
Stave is a free and open source application for roller derby events. Stave provides a signup form builder, cross-league calendaring, a smart crew designer, and email templates. Roller derby leagues can recruit officials and other volunteers for events from a single game to a multi-day tournament, while officials can calendar their open applications, track acceptances, and store profile…
The Worst Thing I Ever Built
More than twenty years ago, I cut a corner to save the princely sum of about $200. I am still supporting the technical debt from that decision today . This is the story of the worst system I've ever built. My father was already wearing many different hats for our local community association when they had need of a new bookkeeper. He wasn't a bookkeeper, but we were confident we could set…
monitor-affinity
Route bars and widgets to monitors based on criteria like "largest" or "rightmost". For users of polybar and similar tools on X.
NSO Paperwork and Statsbooks
This talk covers how non-skating official (NSO) paperwork "works": how the different sheets interact, how they are entered into a statsbook, where mistakes have high impact, and the basics of statsbook data entry. You'll be equipped to understand the "why" of NSO paperwork and ready to make judgements about how to fix problems live.
Scoreboard Operations
This talk walks through how to operate the Roller Derby Scoreboard (often called CRG) as a non-skating official. We set up the scoreboard software. Then we walk through setting up games, running a game, troubleshooting, and downloading paperwork. We talk about the SBO role and how not to be afraid of CRG.
Intro to Tournaments and Sanctioned Play
This talk guides non-skating officials (NSOs) on how to move from officiating scrimmages and home mixers to the higher levels of sanctioned play and tournaments. We cover what makes a sanctioned game sanctioned; what behaviors are important for NSOs; how to get into a tournament; and how to succeed once you're there. This session expands slightly on a previous session offered in early 2024.
Non-Skating Official Guides
I've launched a new project: a suite of manuals for tournament-level non-skating officiating. Check out Non-Skating Official Guides (manuals for PBM and Jam Timer written so far!) My goal is to create resources that bridge the gap between scrimmage-trained officials and officials who succeed in high-level play. I start from and defer to all WFTDA, MRDA, and JRDA resources, pulling together…
Tournaments and Sanctioned Play for Non-Skating Officials
On Creating Automation Products
The most important skill I learned from Jason Lantz was seeing products hiding inside business problems that are usually addressed with tools . That approach drove the success of the team that created CumulusCI , MetaDeploy , Metecho , and a number of other automation-focused products for teams building on Salesforce. It's also a subtle distinction, between products and tools . I've been…
The Overengineered Resume with Zola, JSON Resume, Weasyprint, and Nix
Maintaining a resume is not the most interesting use of time. Naturally, when I needed to bring my own up to date, I decided to spend a great deal more time on it and overengineer the process. I wanted a bunch of things that didn't necessarily fit together that well: A split between content and presentation, so that I could maintain my resume data separately from how it's rendered and…
Supercharge Developer Productivity with Delivery Cloud
Understanding Build Orgs, Part 3: Manipulating the Build Org
This discussion is derived from my experience building packages, writing packaging clients via the public API, and inspecting the public source code of the SFDX CLI. No internal or proprietary information about the Salesforce packaging system is included. This third part of the series, which began with Understanding Build Orgs: Environmental Dependencies , What does unpackagedMetadata do for a…
PayTransparency.work
I'm very excited to launch PayTransparency.work , a new site dedicated to sharing pay transparency rules across the United States. More and more states and local jurisdictions are mandating that employers disclose salary ranges to job-seekers and employees. I've written about pay transparency in Colorado in the past, and I'm very excited about creating a platform to present…
Understanding Build Orgs, Part 2: How a Build Org is Built
This discussion is derived from my experience building packages, writing packaging clients via the public API, and inspecting the public source code of the SFDX CLI. No internal or proprietary information about the Salesforce packaging system is included. In Part 1 and in a previous discussion of build orgs and runtime dependencies , we looked at how the platform provides a number of different…
Understanding Build Orgs, Part 1: Build Orgs and Environmental Dependencies
This series discusses second-generation managed and unlocked packages. It does not apply to org-dependent unlocked packages or to managed packages built with the Skip Validation option. Portions of this discussion also apply to first-generation managed packages, but different techniques apply in that context. Creating a second-generation package version seems almost magical: there's no…
The Sneaky Way to Install a JWT Connected App
If you build backend services that integrate to Salesforce, you may have encountered this unusual scenario while setting up the JWT Flow. You've built a service, Service A. You've created a Connected App in an org you control (Connected App Org). Meanwhile, you have one or more production orgs you plan to integrate with Service A (Orgs B-F). You're using the JWT Flow, because…
Salesforce DevOps: Top Tech Trends
I had a great time discussing DevOps (and broader landscapes) with the inimitable Jason Lantz, Mitch Spano, and Rob Cowell. It was particularly neat to see insights from different lenses - internal Salesforce, large enterprise, and ISVs - honing in on shared principles. Check out the video hosted by Gearset.
Supercharge Developer Productivity with Cumulus Suite
The Magic of APIs for Admins
The Charlotte, NC Nonprofit Users Group was kind enough to have me for a talk about APIs for admins: what is an API, why is it an important concept, and how can we use it to solve business problems? I started my career as a nonprofit admin who was incredibly excited about using the Salesforce API to build things, so this topic was near and dear to my heart.
Why Does `git rebase` Merge Conflict?
I've got a really ugly branch ( daves-feature ) going. I started my branch from main , but later realized it was better suited to be based on parent . My commit history looks like this: ac1f97e (HEAD -> daves-feature) Hush, Pyright 1a48f15 Cleanup c18fe09 Working parallelization with passing tests b99aef1 Merge 8c048ba (parent) Add multi-status field 30084f1 WIP c7c4f26 Try a different…
Wage Transparency in Colorado and Beyond
Important disclaimer : I am not an attorney. This is not legal advice. My home state of Colorado's Equal Pay for Equal Work Act went into effect in January of 2021. This law has a number of important provisions, including a prohibition on wage discrimination across multiple protected classes. One of the most broadly visible provisions, though, is the requirement of salary transparency .…
The Risks of Copying and Pasting Apex
It's a tricky position to be placed in: you're an admin, a declarative developer, or a junior developer, and your leadership comes to you with an ask that you know requires Apex that you haven't been trained to write. What do you do? You're a problem-solver and you want to deliver value to the business, so you hit the Salesforce content sphere on your search engine of choice…
What Does `unpackagedMetadata` Do for a Second-Generation Package?
Second-generation packaging offers the opportunity to specify unpackaged metadata for package version creation tests . It's always been a little unclear to me what this actually meant, and I took a very good question on Salesforce Stack Exchange as a chance to find out. Put simply, the unpackagedMetadata directory specified for a second-generation package is deployed into the build scratch…
The Dangers of Anonymous Apex and the Developer Console
The Developer Console and Anonymous Apex seem like appealing ways to learn, to do ad-hoc exploration of the system, to perform quick fixes, and to prototype ideas in Apex. Unfortunately, the low barrier to entry with these tools masks some very subtle complications that can turn into traps, especially for learners and early-career Salesforce developers for whom that low barrier to entry may carry…
The Bridge Package Pattern
Managing your package architecture for a Salesforce platform product is a major challenge not because it's difficult as such, but because in many cases your decisions must be made very early in the lifecycle of the product and are very difficult or even impossible to change. This challenge is especially prominent when designing extension packages, which build upon existing managed packages.…
Design Safe, Fast, Parallel Salesforce Integrations with Rust and Baris
Create Your Low-Code, Free, Open Source CI Solution
Salesforce Developer Podcast: CumulusCI with David Reed
I chatted with the fantastic Josh Birk about CumulusCI, broadening the value proposition of DevOps, and my journey in the Salesforce landscape on the Salesforce Developer Podcast .
Find Bugs Earlier with Second-Generation Packaging
Extend NPSP with 2GP Unlocked Packages
Bibliothekai: "What's the best translation of...?"
I've launched a new app, Bibliothekai , to help answer this question. I've been wanting to build this for many years, stemming from my time as a desk librarian hearing the question "What's the best translation of X?" all the time, and my delight in collecting unusual translations of Homer. Bibliothekai is my contribution towards an answer. Bibliothekai currently tracks over 900…
How Salesforce.org Uses DevOps
Building the NPSP Trailhead Installer with MetaDeploy
Automate the App Lifecycle with CumulusCI
Baris: Safe, Parallel Salesforce Integrations in Rust
Do What You Can With What You Have
Automate the App Lifecycle with CumulusCI
Automate the App Lifecycle with CumulusCI
Effective Lifecycle Management with Portable Automation and CumulusCI
Automate the App Lifecycle with CumulusCI
Automate the App Lifecycle with CumulusCI
Handle the Right Errors: Building Resilient and Reliable Apex
Working with JSON in Apex: A Primer
This post is adapted from a community wiki I created for Salesforce Stack Exchange . Apex provides multiple routes to achieving JSON serialization and deserialization of data structures. This post summarizes use cases and capabilities of untyped deserialization, typed (de)serialization, manual implementations using JSONGenerator and JSONParser , and tools available to help support these uses. The…
Automate the App Lifecycle with CumulusCI
Recently, I've been delighted to visit the Salesforce Developer Groups in Denver, Colorado, where I live, and in Kitchener, Ontario, to talk about Salesforce.org's Portable Automation toolchain for continuous integration and automation throughout the application lifecycle. Thanks to Sudipta Deb, leader of the Kitchener group, I'm able to share video from "Automate the App Lifecycle…
Automate the App Lifecycle with CumulusCI
Build Applications with CumulusCI
On Writing Good Exception Handlers
This post is adapted from an answer I wrote on Salesforce Stack Exchange . This post follows a previous discussion about what makes a bad exception handler. I'd like to talk a little bit about what good exception handling patterns look like and where in an application one ought to use them. What it means to handle an exception is to take an exception al situation - something bad and out of…
On Not Writing Bad Exception Handlers
Unlike some languages (such as Python) where exceptions have a greater role in flow control, in Apex, exceptions generally are exceptional : they connote some relatively uncommon bad state in the application that prevents the normal path of execution from continuing without some special handling. An exception is a message from the application to you, and one that you ignore at your, and your…