When building a new thing, a good first step is to build a thing that does nothing. That way, you at least know you are starting from a good place. If I’m building a component that performs an action, I’ll probably do it in these steps:
Step zero is to write a standalone program to perform the action. This ensures that the action is even possible.
Once I have working code to perform the action, I write a component that doesn’t perform an action. That at least makes sure I know how to build a component.
Next, I register the component for the action, but have the Invoke method merely print the message “Yay!” to the debugger without doing anything else. This makes sure I know how to get the component to run at the proper time.
Next, I fill in the Invoke method with enough code to identify what action to perform and which object to perform it on, print that information to the debugger, and return without actually performing the action. This makes sure I can identify which action is supposed to be done.
Finally, I fill in the rest of the Invoke method to perform the action on the desired object. For this, I can copy/paste the already-debugged code from step zero.
Too often, I see relatively inexperienced developers dive in and start writing a big complex thing: Then they can’t even get it to compile because it’s so big and complex. They ask for help, saying, “I’m having trouble with this one line of code,” but as you study what they have written, you realize that this one line of code is hardly the problem. The program hasn’t even gotten to the point where it can comprehend the possibility of executing that line of code. I mutter to myself, “How did you let it get this bad?”
Start with something that does nothing. Make sure you can do nothing successfully. Only then should you start making changes so it starts doing something. That way, you know that any problems you have are related to your attempts to do something.
At no point in this extremely wonky essay does he discuss homelessness, nor its mirror image, housing security. I think he's probably right that 30-year fixed-rate mortgages are a bad policy, but in order to develop a better idea we *must* think about the policy goals we actually want *outside of* the real estate market.
Every argument that the US is in danger of losing out to China, that the US needs more weapons to deter China, that the US can’t afford to help arm Ukraine, and many others, should be required to begin with these two graphs.
Data for the first graph is from the International Monetary Fund, for the second from the International Institute for Strategic Studies. The graphs appear in this article.
Years ago, when I was an undergraduate student at McGill, I took a software engineering class, and as part of that class, I heard the infamous story of the Therac-25 computer-controlled radiotherapy machine. Long story short: a software bug caused the machine to occasionally give radiation doses that were sometimes hundreds of times greater than normal, which could result in grave injury or death. This story gets told in class to make an important point: don’t be a cowboy, if you’re a software engineer and you’re working on safety-critical systems, you absolutely must do due diligence and implement proper validation and testing, otherwise you could be putting human lives at risk. Unfortunately, I think the real point kind of gets lost on many people. You might hear that story and think that the lesson is that you should never ever work on safety-critical systems where such due diligence is required, and that you’re really lucky to be pocketing hundreds of thousands of dollars a year working on web apps, where the outcome of your work, and all the bugs that may still remain dormant somewhere in your code, will never harm anyone. Some people work on safety-critical code, and these people bear the weight of tremendous responsibility, but not you, you’re using blockchain technology to build AirBnB for dogs, which couldn’t possibly harm anyone even if it tried. I’d like to share three stories with you. I’ve saved the best story for last.
Back in 2016, I completed my PhD, and took my first “real” job, working at Apple in California. I was joining a team that was working on the GPU compiler for the iPhone and other iDevices. While getting set up in California prior to starting the job, it occurred to me that showing up to work with an Android phone, while being part of a team that was working on the iPhone, might not look so great, and so I decided to make a stop at the Apple store and bought the best iPhone that was available at the time, an iPhone 6S Plus with 128GB of storage. Overall, I was very pleased with the phone: it was lightweight, snappy and beautiful, with great battery life, and the fingerprint sensor meant I didn’t have to constantly type my pin code like on my previous Android phone, a clear upgrade.
Fast forward a few months and I had to catch an early morning flight for a work-related conference. I set an early alarm on my phone and went to sleep. The next day, I woke up and instantly felt like something was wrong, because I could see that it was really sunny outside. I went to check the time on my iPhone. I flipped the phone over and was instantly filled with an awful sinking sense of dread: it was already past my flight’s takeoff time! The screen on my phone showed that the alarm I had set was in the process of ringing, but for some reason, the phone wasn’t vibrating or making any sound. It was “ringing” completely silently, but the animation associated with a ringing alarm was active.
I did manage to get another flight, but I needed my manager’s approval, and so I had to call him and explain the situation, feeling ashamed the whole time (I swear it’s not my fault, I swear I’m not just lazy this bug is real, I swear). Thankfully, he was a very understanding man, and I did make it to the conference, but I missed most of the first day and opening activities. It wasn’t the first or the last time that I experienced this bug, it happened sporadically, seemingly randomly, over the span of several months. I couldn’t help but feel angry. Someone’s incompetence had caused me to experience anxiety and shame, but it had also caused several people to waste time, and the company to waste money on a missed flight. Why hadn’t this bug been fixed after several months? How many other people were impacted? I had a cushy tech job where if I show up to work late, people ask if I’m doing alright, but some people have jobs where being late can cause them to be fired on the spot, and some of these people might have a family to support, and be living paycheque to paycheque. A malfunctioning alarm clock probably isn’t going to directly cause a person’s death, but it definitely has the potential to cause real-world harm.
The point of this blog post isn’t to throw Apple under the bus, and so I’ll share another story (or maybe more of a rant) about poor software design in Android OS and how it’s impacted my life. About 3 years after working at Apple, when the replacement battery in my iPhone 6S Plus started to wear out, I decided to try Android again, and so I got myself a Google Pixel 3A XL. This phone also had a nice fingerprint scanner, but the best differentiating feature was of course the headphone jack. Unfortunately, Android suffers from poor user interface design in a few areas, and one of the most annoying flaws in its user interface is simply that the stock Android OS doesn’t have flexible enough options when it comes to controlling when the phone rings, which is one of the most important aspects of a phone.
Being a millenial, I don’t particularly like phone calls. I would much prefer to be able to make appointments and file support tickets using an online system. However, my deep dislike for phone calls probably stems from a more personal issue, which is that my mother is an unmedicated schizophrenic. She doesn’t respect my boundaries. She has done things such as randomly call me in the middle of the night because her irrational paranoia causes her to be worried that shadowy evil figures are coming after me. Thankfully, Android now has “bedtime mode” feature, which allows me to make it so that phone calls won’t cause my phone to ring between 10PM and 8:30AM. If my mom happens to die in a hospital in the middle of the night, I’ll just have to find out and be sad the next day. My sleep is sacred, and bedtime mode allows me to enforce some basic boundaries using software.
Bedtime mode is quite useful, but I still have the other problem that my mom could decide to randomly call me in the daytime as well, and unfortunately I rarely want to take her phone calls. However, I also don’t want her to end up homeless or in jail (which has happened before, but that’s a story for another time), and so I don’t want to block her and completely lose the ability to receive her calls. This results in me having to almost always have my phone set to “do not disturb”, so that I don’t have to be disturbed at random times by unwanted phone calls. I wish that Android had an option to set a specific person to never cause the phone to ring, and it seems like that should be an easy feature to implement that would have a real positive impact on the quality of lives of many people, but I digress.
The real problem is that, although I hate phone calls, our society is still structured in such a way that sometimes, I have to receive “important” phone calls. For instance, my doctor recently placed a referral for me to see a specialist. I’ve been told that the hospital is going to call me some time in the next few weeks. I don’t want to miss that phone call, and so I have to disable “do not disturb”. However, because the stock Android OS has only one slider for “Ring & notification volume”, disabling do not disturb means that my phone will constantly “ding” and produce annoying sounds every time I get a text message or any app produces a notification, which is very disruptive. The fact is, while I occasionally do want my phone to ring so I can receive important phone calls, I basically never want app notifications to produce sound. I’ve been told that I should go and individually disable notifications for every single app on my phone, but you tell me, why in the fuck can’t there simply be two separate fucking sliders for “Ring volume” and “Notification volume”? In my opinion, the fact that there isn’t simply highlights continued gross incompetence and disregard for user experience. Surely, this design flaw has caused millions of people to experience unnecessary anxiety, and should have been fixed years ago.
This is turning out to be a long-ish blog post, but as I said, I’ve kept the best story for last. I’m in the process of buying a new place, and I’ll be moving in two weeks from now. As part of this, I’ve decided to do some renovations, and so I needed to get some construction materials, including sheets of drywall. This is a bit awkward, because I’m a woman living in the city. I don’t have a car or a driver’s license. Sheets of drywall are also quite heavy, and too big to fit in the building’s elevator, meaning they have to be carried in the stairs up to the third floor. Yikes.
In Montreal, where I live, there are 3 main companies selling renovation supplies: Home Depot, Rona and Reno-Depot. Home Depot is the only one that had all the things I needed to order, so I went to their website and added all the items to my cart. It took me about 45 minutes to select everything and fill the order form, but when I got to the point where I could place the order, the website gave me a message saying “An unknown error has occurred”. That’s it, no more details than that, no description of the cause of the error, just, sorry lol, nope, you can’t place this order, and you don’t get an explanation. I was really frustrated that I had wasted almost an hour trying to place that order. A friend of mine suggested that maybe she could try placing the order and it would work. I printed the page with the contents of my cart to a PDF document and sent them over. It worked for her, she was able to place the order, and so I sent her an electronic payment to cover the costs.
Since my new place is on the third floor, we had some time pressure to get things done, and heavy items would have to be carried up the stairs, we paid extra specifically to have the items delivered inside the condo unit and within a fixed time period between noon and 3PM. The total cost for delivery was 90 Canadian dollars, which seems fairly outrageous, but sometimes, you just have no choice. I was expecting my delivery before 3PM, and the Home Depot website had said that I would get a text 30 minutes before delivery. At 2:59PM, I received two text messages at the same time. The first said “Your order has just been picked up”. The second said “Your order has just been delivered, click here to rate your delivery experience”. Again, I was filled with a sense of dread. Had they tried to reach me and failed? Had they just dumped the construction materials outside? I rushed downstairs. There was no sign of a delivery truck or any of the materials. I figured there must be another software bug, despite what the second text message said, the delivery clearly hadn’t happened yet.
Sure enough, at 3:27PM, 27 minutes after the end of my delivery window, I received a phone call from a delivery driver. He was downstairs, and he was about to dump the construction materials on the sidewalk. NO! I explained that I had paid extra to have the materials delivered inside the unit. I could show him the email that proved that I had paid specifically for this service. He argued back, according to his system, he was supposed to dump the materials at the curb. Furthermore, they had only sent one guy. There was no way he alone could carry 8 foot long, 56-pound sheets of drywall up to the third floor. I raised my voice, he raised his. After a few minutes, he said he would call his manager. He called back. The delivery company would send a second truck with another guy to help him carry the materials upstairs. I felt angry, but also glad that I had stood my ground in that argument.
The first guy waited, sitting on the side of the curb in the heat, looking angry, doing nothing, for about 30 minutes until the second guy showed up to help. When the second delivery guy showed up, he asked to see the email. I showed him proof that I had paid to have things delivered upstairs. He also stated that their system said they only had to drop things in front of the building, but that he believed me. The delivery company was a subcontractor, and this was a software bug they had encountered before. This bug had caused multiple other customers to be extremely upset. So upset, in fact, that one customer, he said, had literally taken him hostage once, and another one had assaulted him. Gross, almost criminal incompetence on the part of one or more developers somewhere had again caused many people to waste time and to experience stress, anger, and even violence. The most infuriating part of this though, of course, is that bugs like this are known to exist, but they often go unfixed for months, sometimes even years. The people responsible have to know that their incompetence, and their inaction is causing continued real-world harm.
The point of this blog post is that, although most of us don’t work on software that would directly be considered safety-critical, we live in a world that’s becoming increasingly automated and computerized, and sometimes, bugs in seemingly mundane pieces of code, even web apps, can cause real-world suffering and harm, particularly when they go unfixed for weeks, months or even years. Part of the problem may be that many industry players lack respect for software engineering as a craft. Programmers are seen as replaceable cogs and as “code monkeys”, and not always given enough time to do due diligence. Some industry players also love the idea that you can take a random person, put them through a 3-month bootcamp, and get a useful, replaceable code monkey at the other end of that process. I want to tell you that no matter how you got to where you are today, if you do your job seriously, and you care about user experience, you could be making a real difference in the quality of life of many people. Skilled software engineers don’t wear masks or capes, but they can still have cool aliases, and they truly have the power to make the world better or worse.
Erik D. Demaine and Martin L. Demaine.
Every author as first author.
We propose a new standard for writing author names on papers and in bibliographies,
which places every author as a first author—superimposed.
This approach enables authors to write papers as true equals,
without any advantage given to whoever's name happens to come first alphabetically (for example).
We develop the technology for implementing this standard in LaTeX, BibTeX, and HTML;
show several examples;
and discuss further advantages.
In the early 80s, my mom worked a couple shifts a month at a little small-town food co-op that smelled like nutritional mummy. She brought home things like carob chips and first-generation Soysage, which remains one of the grossest things I have ever eaten. This was also a real boom time for unsalted Legume Surprise and macrobiotically balanced grain mush that tasted like macrame owl.
This food sold reasonably well to a fringe class of Americans, including many who were rightfully worried about pesticides, animal cruelty, and the health effects of a meat-and-potatoes diet, and also a bunch who were just a real specific kind of nerd. And there was a strong current in the community of scorn for people who were lured into eating junk food when they could be eschewing seasonings until they could properly enjoy the glories of gelled millet or whatever.
I’ve been thinking about this a lot over the past few months on Mastodon and especially this week, as I hung out observing the pupal stage of Bluesky.
Things got interesting in the Bluesky closed beta this week when a ton of people got let in while the app was still in an unstable state—no block function, semi-working mute function, problems with enormous threads. Posters ran around threatening noted centrist Matt Yglesias with hammer emojis, etc.
Lots of people joined the Bluesky beta and posted about why it worked better for them than Mastodon did. A big chunk of Mastodon responded with a social immune response intended to both warn people away from Bluesky for a very long list of reasons, including its association with Dorsey, its incompleteness and everything that clearly meant about the intentions of the developers, and that it would split the decentralized network vote. Many, many posts that amounted to, “Bluesky obviously won’t ban Nazis, let me repeat an enlightening story about a Nazi bar I’ve heard 400 times.”
Incidentally, when a straightforwardly “I’m a Nazi” Nazi showed up in the beta, people used the report function, and the Bluesky team labeled the account and banned it from the Bluesky app and restricted promotion of the account of the person who invited him. This changed exactly none of the tenor of the Nazi conversation on Mastodon, but it happened.
I have a suspicion that a lot of the defensive maneuvering on Mastodon is happening because Mastodon fans know that the network absolutely cannot compete on user friendliness and basic social functionality, so they’re leaning hard into the things it does get right—and then, in some cases, trying to shame people into not even thinking about trying a competing network.
But about that ease of use problem. Let’s rewind for a second.
bouncing off Mastodon
Editing on May 1 2023 to add:Eugen Rochko published a new blog posttoday that discusses immediate changes to the mobile sign-up flow, which should help with both the initial barrier and, maybe more importantly, the initial safety problem of people ending up on bad instances because they didn’t know any better.
In what I think is a really positive sign, Rochko also wrote:
We’re always listening to the community and we’re excited to bring you some of the most requested features, such as quote posts, improved content and profile search, and groups. We’re also continuously working on improving content and profile discovery, onboarding, and of course our extensive set of moderation tools, as well as removing friction from decentralized features. Keep a lookout for these updates soon.
I think this is all great! I’m adding this new context here because I think it kind of leapfrogs some of what I wrote below (which, again, is great), and I’m leaving the rest of this post intact as a discussion of how things had been going until now. But I’m optimistic about these statements. (end edit)
During the big waves of Twitter-to-Mastodon migrations, tons of people joined little local servers with no defederation policy and were instantly overwhelmed with gore and identity-based hate. A lot of those people, understandably, did not stick around, and plenty of them went back to their other social spaces and warned others that Mastodon wasn’t safe. For people who lucked out and landed on a well-moderated instance, finding fun people to follow was hard and actually following each of them often involved three separate steps, depending on which link you happened to click.
It’s a lot of hassle for a gamble on a network that might not end up being what you need.
Over on Bluesky, by contrast, once you’re in the beta, it’s super easy to sign up, find people, follow them, and participate in conversations. I’m seeing a lot of the people I’ve missed the most since I stopped using Twitter in like 2018, which is a delight, but I’m also not really posting because it’s a chaos machine and it’s still way too early for me to know if I really want to contribute there.
The thing is, networks can recover from even big initial fuckups. Mastodon developers could have made a project of interviewing people who wanted to leave Twitter and then building their needs as a roadmap. Writers and designers could make a great brief visual + textual guide to a few fun, tightly moderated instances to join, with pros and cons and a comparison of moderation and defederation policies, and slap that on the front page of Join Mastodon. Or the team could have taken any of dozens of other suggestions for streamlining. None of that happened.
You can recover from bad product design choices by changing things, but you do have to change things. Neither did the Mastodon core developers take swift action to—well, do much of anything.
unfriendly design feeds insular culture
I—a nerd—actually really like Mastodon most of the time, but I would like it so much more and feel like it was doing a lot more good in the world if it were more welcoming and easier to use. When I raise these points on Mastodon, I get a steady stream of replies telling me that everything I’m whining about is actually great, that valuing a “pleasant UI” over the abstraction of federation is shallow and disqualifying, and that people who find Mastodon difficult don’t belong anyway, so I should “go join Spoutible” or whatever.
I hate it that I can’t in good conscience encourage Black friends to get on Mastodon, because I know they’re going to be continuously chided by white people if they mention race or criticize anything at all about Mastodon itself. I hate that “a difficult sign-up process keeps out lazy people with bad culture” is a thing in so many Mastodon conversations. (Fun fact, if you hold this idea up to your ear, you can hear them say “sheeple.”)
I have absolutely zero fortune-telling to offer re: Bluesky. The AT protocol approach is enough of a tweak on existing models that I think it’s pretty much impossible to tell how it’s all going to play out when the technical abstractions meet actual users at scale—most of all, because it remains to be seen whether or how much the team will accept feedback on things that aren’t working (and for whom). In what seems to me like a moderately good sign, late on Saturday, Bluesky CEO Jay Graber posted:
At the very beginning of bluesky I said the tech would be straightforward to build, but moderation, and designing decentralized moderation, would be hard. It is. I talked with a bunch of people about it at our meetup today, but need to get the chance to sit down and write—so, logging off, see you tomorrow, and I hope we can get more of your proposed approaches implemented soon.
Maybe they’ll figure it out, maybe they won’t, but I would love to see even half the kicked-anthill energy being spent hating a closed beta app directed toward making Mastodon better for more people.
the strongest path forward for Mastodon advocates
I haven’t mentioned the simplest and IMO best critique of Bluesky and most other big platforms, which is that they emerged out of venture-capital galaxy brain, which has the moral sense of an AI chatbot. After the past decade or so on Twitter, “I won’t touch anything Jack Dorsey has touched” is a reasonable reaction. “I will only put my social labor into platforms that can never benefit billionaires” is fair.
But the missing step, to me, is when people with principled objections to other platforms are unwilling or unable to make the alternatives of their choosing more welcoming to more people. And there are absolutely people trying to do the work, but they’re dependent on the choke-point of what Mastodon-the-company decides is valuable. (Almost like something…centralized?)
One of the big things I’ve come to believe in my couple of decades working on internet stuff is that great product design is always holistic: Always working in relation to a whole system of interconnected parts, never concerned only with atomic decisions. And this perspective just straight-up cannot emerge from a piecemeal, GitHub-issues approach to fixing problems. This is the main reason it’s vanishingly rare to see good product design in open source.
Great product design is also grounded in user research and a commitment to ongoing evaluation and iteration. For something like a decentralized social network, it also requires letting people from many distinct communities help steer the ship—and building ways to work toward consensus in some areas and accept both conflict and compromise in others. And great design at mass scale requires the core team to value mass adoption and push back—hard and loudly—against the idea that inconvenience is good because it filters out undesirables.
This doesn’t mean that I think Mastodon should necessarily implement full-text search or the whole set of interlocking patterns that constitute Twitter-style quote posts. But particularly given the third-party pressure on both search and quote posts, I think it’s way past time to do full-scale user research and design work on ways to integrate some kinds of search and quotation in some places and in ways that preserve privacy, safety, and autonomy. And to handle the whole nested doll of problems related to sign-up, discovery, and following, for starters.
while I’m opinionating
I feel enormous empathy for tiny teams doing high-pressure work. I think Rochko and his team have pulled off great work over the past six years, and I think the tendency to assume the worst motivations for every action maintainers take is a great example of the way that treating open-source projects like merchants and behaving like enraged customers is gross and destructive. But I also think the best way out of the overloaded-maintainer nightmare is to:
communicate transparently—and mostly not in unfindable replies to random people,
to make alliances with people who have capacities you lack, like user research and distributed deliberation, and
to devolve power whenever you can.
I recognize that that last piece is incredibly difficult to do when you feel like your singular human judgment is at the core of something huge, because judgment doesn’t necessarily scale. But my big hope for Mastodon is that the core maintainers find a way to do it in the very near future—or that other organizations step up to fund and shepherd forks of the project.
If we want more people to enjoy what we believe are the benefits of something like Mastodon, it’s on us to make it delicious and convenient and multi-textured and fun instead of trying to shame people into eating their soysage and unsalted soup.
I hope all of that is actually possible for Mastodon, because a lot of great people very much want it to become a more welcoming place. But the longer Mastodon stays in Linux-on-the-desktop mode, the more likely those people are to take their energy somewhere where it’s valued.