ResourceListener: many endpoints, many requests

While building the new MediaMeter Dashboard tool, the team at the MIT Center for Civic Media faced an interesting design challenge: keeping track of multiple requests to each of multiple API endpoints and rendering views when the right data is ready. For more context, we designed the Dashboard as a front end for the Media Cloud API from Harvard's Berkman Center. We wanted users to be able to enter several searches and compare the results in many different ways (e.g. result count over time, word frequency, text snippets). What's more, we wanted the tool to be extensible, so it was easy to add new visualizations or accommodate new API endpoints. So we're creating a request for every search/endpoint combination, and each visualization could potentially depend on any combination of them. To make all these requests manageable, I augmented backbone.js's built-in events with a ResourceListener class.

ResourceListener is based on the EventAggregator pattern. A single object aggregates all events related to API requests. All of the different visualizations can then listen to that object for resource-related events, rather than listening to specific models and collections directly. To use the ResourceListener, you need to add a "resourceType" attribute when defining models or collections. Then, after creating the models, simply pass them to the ResourceListener's listen() method. Every time a request is made, the ResourceListener will fire a "request" event and pass the model or collection as a parameter. When the request completes, the ResourceListener will fire a "sync" event, again passing the model as an object. If your only interested in responses from a particular endpoint, you can instead listen to "sync:type" events, where "type" is the "resourceType" attribute of the model or collection. The ResourceListener also fires "resource:complete:type" events when all resources of a particular type are complete, and a "resource:allComplete" when all resources of all types have finished. By passing the ResourceListener object to your views, you can then listen for exactly the events you need, and render as soon as they're complete, without waiting for other requests.

Abuse Is Not a Choice, Empathy Is

When we label someone an "abuser," we let them off too easily and invite future abuse into our communities.

Willow Brugh recently wrote a thoughtful post about how communities respond to abusive behavior. She writes, "If we simply kick out anyone who messes up, we end up with empty communities, and that’s not a new future." She calls for alternatives. The post sparked a lively twitter debate, with many arguing that abusers are aware of what they're doing and that placing the onus of "reforming" them on a community is overly burdensome. But, the rare sociopath aside, the very idea of an "abuser" is an anti-bogeyman that prevents us from dealing with the realities of abusive behavior in our communities, and importantly, in ourselves.

At this point, I should note that I'm no stranger to abuse. As a hackerspace director for many years, I was often in the position of responding when someone posed a threat to the safety and comfort of other members, and proudly, often the first person those members turned to for help. I've seen friends and family affected by abuse from strangers, relatives, police, lovers, and spouses. And, I've experienced abuse myself. I know the sting of betrayal, and the long-lingering doubt that comes from being mistreated by someone you trusted. I also know how difficult it is to recognize when your actions are hurting someone you care about, and how much work, dedication, and time it takes to change the thinking and habits behind those behaviors.

Discussions of abuse often insist it's a conscious choice. When asked about dealing with mean people, the terrific advice columnist Captain Awkward wrote:

I vote that you believe hard in the Mean Guy and view the rest of his personality through that lens. Because Sexy Guy is mean. And Sad Guy is mean. And I get it, because when you hate yourself and feel terrible, it makes it more likely that terrible things will escape your mouth. But at the end of the day, being depressed does not excuse being mean. Mean is a choice.

Yes, abuse is inexcusable, but the belief that it's a choice is both incorrect and harmful.

Consider the way a typical two-year-old treats others. They hit, lie, steal, threaten, scream, and any number of other behaviors that, if committed by an adult, would be undeniably abusive. But those children are not evil, they have not made a calculated decision to harm others. Their behavior stems from the inability to look past their own needs and consider the needs of others: in short, an underdeveloped sense of empathy. When I've worked to resolve conflicts in the hackerspace community, the abusive behavior I've seen has always stemmed from the exact same thing. If the offenders had been able to look past their own needs and emotions, they would have had to be either stupid or evil to act as they did (apologies to the Daily Show) but they couldn't.

Crucially, if someone believes abusive behavior is the result of a conscious choice, and they never made such a choice, they conclude that there is nothing wrong with their behavior. They then believe the problem must lie entirely with someone else. In other words, abuse is not a conscious choice, it is a lack of the conscious choice to empathize. Similarly, the false binary of "abuser" and "non-abuser" allows victims of abuse to assume that they could never become abusers themselves, when in fact, victims of abuse are the ones most likely become abusive (see Breaking the Cycle of Abuse: How to Move Beyond Your Past to Create an Abuse-Free Future). This is absolutely not an excuse for abusive behavior, but it suggests a completely different approach to understanding and responding to it. Have you ever looked critically at your own behavior towards others and considered that it might be abusive? If not, there's a good chance that, at times, it has been.

So how should we respond to abusive behavior within a community? I think Willow is right that we need something better than vilification and ostracization. When we say "we're kicking that person out because they're bad" we lose a crucial opportunity for the community to have a dialog about which behaviors are appropriate, and why. Also, no one sees themselves as "bad," so in such a system, they have no incentive to reflect on their own actions. In a wonderful video about how to tell someone they sound racist, Jay Smooth favors the "what you did" conversation over the "who you are" conversation, saying:

That conversation takes us away from the facts of what they did, into speculation about their motives and intention. And those are things you can only guess at, you can't ever prove, and that makes it way to easy for them to derail your whole argument.

What's more, when we label someone an "abuser" we fail to see them as people, modeling the very lack of empathy that causes abuse in the first place, furthering a vicious cycle. Should the recipient of abuse be forced to empathize with their abuser? No, of course not. But the response of the community, if it is to remain healthy, must be based in empathy. In practice, this means first and foremost, supporting and protecting the safety of anyone who was abused, and if at all possible, providing clear expectations to the perpetrator, along with an opportunity to meet them, and the consequences for not doing so. Some people will choose to continue harmful behaviors, and in doing so, choose to remove themselves from the community, but those who remain learn not to place blame, but rather to empathize and take responsibility for their own actions. People aren't problems. Problems are problems and people are people.