Welcome to tech! It’s not always an easy field to be in, but there are always fun challenges and I’ve enjoyed doing the work involved at nearly every step in my career. Since you’re new here and I’ve been around for over 20 years, I want to share some of the skills and habits I wish I knew when I started.

Read More

There has been much talk about voter and election fraud as the president seeks to delegitimize elections. He talks a lot about manual methods like stealing ballots or impersonating other voters. The truth is that election fraud like this is incredibly rare. The point of his words seems to have two purposes, both common conservative arguments:

  • Disenfranchise voters by increasing “security” with photo ids and limiting where and how voting can take place
  • Decrease confidence in elections by sowing doubt about election integrity, thus making it easier to call results into question and limiting turnout due to mistrust

The purpose of this post is to explore how election fraud by stealing ballots could be perpetuated, thus showing why it’s so rare. I will also talk about more effective methods of election fraud, many of which are already happening.

Who Am I to Talk About This?

I am an election judge in Maryland. My job is to oversee a precinct. In 2018, I was responsible for about 1000 votes cast. We are judged on our accuracy to detailed procedures for Election Day and our adherence to the chains of custody that ensure ballot integrity.

The reason I choose to serve as a chief judge is that I believe in free and fair elections as a fundamental right. We cannot have a free and fair society without ways to safely express ourselves, including first amendment rights and voting.


  • Voter Fraud: When someone attempts to vote in another’s name. This is a singular act

  • Election Fraud: Broadly trying to affect an election, whether by mass voter fraud, misinformation, or any other method

  • Mail-In Voting: Absentee voting

  • Ballot Harvesting: Stealing ballots by any means

  • Large Scale: I define this as an election that’s bigger than a volunteer organization’s election. Anything that is bigger than a couple hundred people voting is large scale for this post.

Hacking an Election

The main argument against large scale mail in (or absentee) voting is that we don’t know who is filling out these ballots. There are other concerns that aren’t part of the fear-mongering I’ve seen recently: will my ballot come in time, will they send the right ballot, but these aren’t germane to the discussion. Let’s stick to the idea that ballots are insecure when mailed to voters.

Let’s say that I’m going to try to alter an election by “harvesting,” or stealing ballots. Walking through what’s required should help you see how hard it would be to commit election fraud in this way.

Getting Ballots

First, I need to get some ballots to fill out. Ballots are stored securely, and since “mail-in” voting is the same as voting absentee, there are procedures for distributing ballots by mail. Now, we expect that mail-in voting will be bigger than ever in 2020 due to covid-19, so these procedures may change, but they will be based on effective and secure procedures that are already in place.

So, how do I get ballots?

Before Ballots Leave the Board of Elections

In this scenario, you are either a Board of Elections worker or you know someone who is. You know how ballots are handled and how to get your hands on them. Stealing ballots in this way is a crime, and you’ll likely need inside help. However, this is the way to steal the most ballots and you can do it before they’ve been assigned to a voter. But you’ll need to be able to return them to be counted, without the normal envelope, with signatures and affadavits, a voter returns their ballot in.

At the Post Office

In this scenario, the ballots have been stuffed into envelopes and addressed to the voters. You’ll need to either be a Post Office worker, be working with one, or have access to the mail somehow. The number of crimes committed here goes up, though, as you’re now messing with the mail and stealing ballots. Now you’re dealing with ballots that have been assigned, but you’ll have an easier time returning them.

At the mailboxes

Here, you’re going from mailbox to mailbox looking for ballots. Going through a neighborhood is going to be time-consuming and you’re not sure how many ballots you can accumulate. You’ll also attract attention, as opening someone else’s mailbox isn’t a common thing and many of us have installed locked mailboxes. If you’re in an apartment complex, you may be able to get to the mail before the ballots are loaded into the boxes. The problem here is getting the volume of ballots in order to affect the outcome. Also, if you hit an apartment complex, it will become obvious to investigators doing analysis of irregular ballots very quickly.

How Many Ballots Do I Need to Affect the Outcome?

It depends! How close is the election supposed to be? How many total voters are there? What’s the common turnout for this type of election in this area?

If the election is close, you’ll need less than if it’s not. The more voters there are, the more ballots you’ll need to affect change. The turnout average can diminish the number of votes needed. You’re still left with a good deal of uncertainty, though. If, in the end, you need to swing 700 votes, and you get 600 ballots, well, too bad. And you won’t know till the counts are in.

Here are some numbers. Let’s say that you’re interested in swinging a seat in the House. The number of registered voters in that district is 200,000, with about 50% showing up in every presidental election. Current polling in the race has the incumbent leading 51%-49% and your job is to swing the race for the challenger. How many ballots do you need?

We expect about 100,000 voters, ~51,000 should vote for the incumbent, ~49,000 yours. Thus, the minimum ballots you’d need in this scenario is 1,001 ballots. Except, how many of those 1,001 were going to vote for your candidate anyway? Each of those increases the number of ballots you need. So, keeping with the numbers you’ll need an extra 490, then 245, 122, 61, etc. Adding those up gets to to about 2,000 ballots needed.

Now, there’s much variability here. What if turnout is greater? What is the lead shifts? Is the polling reliable? So 2,000 is a huge guess even with all the information you can gather.

How are you going to get 2,000 ballots? Every mailbox? Get 4 packs of unstuffed ballots from the BOE? This is a lot of work, regardless of how you get the ballots.

Filling out and Mailing in your Stolen Ballots

Let’s pretend you got all the ballots you think you need, no small feat. All 2,000 in our scenario above. Now you have to fill them all out, sign them, and return them. And they can’t all be the same person signing, so what now?

Will you:

  • Practice your forgery skills…2,000 times?
  • Recruit some friends? Will you pay them for their trouble? How many do you need?

The outcomes here look pretty bad.

  1. Someone will notice how very similar those signatures look. They will start to investigate.
  2. One of your friends will talk. There’s a reason large conspiracies are hard to carry out. Humans have a hard time keeping their mouths shut. That’s how the scheme in NC in 2018 was found out.

Returning your ballots

Now you’ve gotten your ballots filled out and it might actually pass muster. How will you return 2,000 ballots? You could drop them all in one mailbox. That would look weird to the post office. How about mailing a few here and there? That could work, but now it’s time-consuming really time consuming: find mailboxes, drop a few every day. With 2,000 ballots, that’s a lot to spread around. This isn’t the worst part of the whole endeavor, but there is still risk here.

Will This Work?

This is a time-consuming and fraught way to steal an election. It’s not that it’s not possible, but there are so many risks and so many ways for it to go wrong. And for all these efforts, it’s possible you won’t harvest enough ballots to make an impact.

In short, there are better ways to affect an election.


  1. Sowing Doubt in Elections: You can make people less confident that elections are free and fair. That includes the kind of fear-mongering I’m addressing in this post, trying to make it seem like there is fraud everywhere.
  2. Interrupting the Flow of Mail: We’re seeing this right now. If the mail system breaks down, then we’re all doubting the ability for the election to go through fairly.
  3. Misinformation: You’ve seen this before as well. You’ll get a call saying the election has been moved or that your vote isn’t needed. Any way to confuse voters falls in this category.
  4. Intimidation and Disenfranchisement: Anything that makes people think twice about voting. Think, a poll tax, consolidated precincts, id requirements, purging voter rolls, having to pay fines in order to recover your right to vote, or long lines or having your identity questioned.

These alternatives are far more likely to sow doubt and influence elections. The other bonus here is that the plausible deniability of any of these tactics means it’s hard to prove they are depressing turnout. All of them have the cumulative effect, however, of sowing doubt in the veracity of elections, long term.


Election fraud by “harvesting” ballots is not a likely event. It’s very rare. However, those who seek to make believe it’s common stand to gain from your fear of this. Don’t let them scare you. Always ask yourself when someone is trying to scare you: what do they have to gain from making me uncertain and fearful?

This post combines three things I love: teaching dogs cool tricks, helping people grow, and figuring out how to do it best. I want to show you how easily I work with both dogs and humans, where the skills overlap and how they differ, so you too can teach fun tricks and help your fellow humans get better.

Why assess understanding?

Assessing understanding is the key to improvement. If you know what you don’t know you can hone in on fixing that gap. Here’s the tricky part, though: understanding is fluid; without practice, our skills and knowledge atrophy. Thus, assessing understanding is a continuous process.

Read More

2020 has brought many life-changing events and here we sit with another one. George Floyd dying at the hands of police has sent us into a civil rights moment that I’ve never seen in my lifetime. I have hope that attitudes are changing among white people that may lead to the dismantling of structural racism. #BlackLivesMatter is mainstream and white people are speaking out in numbers I haven’t seen, but there’s still work to be done.

The intent of my post is to talk about the role I’ve found for myself and give ideas for other white people to continue the work we must do to eliminate systematic racism.

Read More

In the my last post, I reposted an article from 2018 about modifying a simple script to make it more testable. It’s been two years since I wrote that, and the way I evaluate testing needs for code has changed. Let’s look at that script again.


The script I wrote emptied AWS S3 buckets of any objects to get them ready to be deleted. AWS won’t delete an S3 bucket if it has any objects (files or subdirectories) in it. Here were the requirements of my script:

  1. We stored buckets in each AWS region, but they all have a similar name: logs-${region}. We need to delete objects in these buckets.
  2. Sometimes there wouldn’t be a bucket for a region, but we need to check them all. If a bucket doesn’t exist or is empty, skip it and continue.
  3. Optimize for speed over quality. This is a one off script.

So, to test it, I’m not sure I need to test it to death. I need to make sure that it:

  • empties every bucket that matches the naming pattern
  • skips (and logs) any buckets that aren’t there
  • doesn’t die on any errors

Changes I’d Make

I want to make sure both the script and test(s) aren’t brittle. AWS updates its regions often enough that I don’t want to bury the region list too deeply. I also don’t want to hardcode the bucket we’re trying to empty.

On the testing side, this will also help me write tests that won’t break unless the requirements for the script change. So here are my changes:

  1. Make the bucket name an argument
  2. Make the region list an argument
  3. Mock AWS S3 to create tests around the three basic requirements:
  • make sure buckets are empty after running the script
  • make sure it skips and logs any buckets that don’t exist
  • make sure a bucket that doesn’t match the pattern is not emptied.

The Script

#!/usr/bin/env python3
import subprocess

def empty_buckets():

    regions = [

    bucket_template = 'fugue-e2e-s3-%s-logging'

    for r in regions:
        bucket_name =  bucket_template % (r)
        print('Verifying logging bucket in %s exists and contains objects.' % (r))
        call = "aws --region {} s3api head-bucket --bucket {}".format(r, bucket_name)

            subprocess.check_output([call, ""], shell=True)

            print('Bucket exists. Emptying.')
            output = subprocess.check_output(["aws --region {} s3 rm s3://{} --recursive".format(r, bucket_name), ""], shell=True)
        except Exception as e:
            print('Error: logging bucket in %s %s' % (r, e))

If you’ve been looking around for information on unit testing and want to know a bit more, or possibly see an example of how to put it into practice, you’re in the right place.

By the end of this blog post, you should be able to:

  • Look over parts of your code where you’d like to add unit tests.
  • Understand how to break your code into smaller functions.
  • Determine what to test.
  • Start creating your tests.

We’ll also cover rudimentary mocking, which is the practice of writing pretend calls to test your code against predictable values.

Read More

As I write this, I’m entering my sixth week home with my family: a 2 and 4 year old, my husband, and my grandmother. My husband and I both are working and my grandmother lives for my children, so we’re in a good place. We all like each other and are making the best of this.

It’s been up and down, joy and stress, caring and frustration. Mostly it’s been stable and steady. This got me thinking about how I’m feeling fine enough when others in similar situations are struggling.*

Read More

I don’t care who or what you’re working with, if they’re sentient, they all want to:

  • be right
  • feel smart
  • be praised
  • feel accepted or loved or cared for (or all three)

When they don’t know what to do or get it wrong, they want to:

  • be taught how to be right
  • know they’re still accepted
  • understand how to make amends if they messed something up


Read More

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now