Author: Christie Koehler

software engineer, geek, yoga practitioner, bike commuter, zen buddhist, queer, vegan, legion of tech board member, osbridge planner, engineer@ShopIgniter

Wrapping up 2016 and planning for 2017

December is always a hard month for me. My sleep schedule is strongly affected by sunlight which is no fun during the dark Pacific Northwest winters. Being tired makes everything else harder. Now that we’ve passed the autumnal equinox and the days are once again getting longer, I feel hope and energy building once again.

What am I doing with that energy and hope?

I’m wrapping up a major open source governance and sustainability research and writing project. This is a client project I’ve been working on since the Spring and I’m very excited to have it nearing completion. I think it’s good, necessary work and I will be finding a way to share it widely in the months to come.

I’m also finalizing the details of my next major professional project. I’m super excited about it. I think it’s a great fit, both for me and for the organization I’ll be working with. I’m looking forward to starting that sometime next month. Full details coming soon!

My priority during the last quarter of 2016 has largely been one of self-care. Putting my oxygen mask on before helping anyone else put on theirs. I spent a good deal of it sick and then recovering from a sinus infection. I slept a lot, as I always do during this time of year. I went heads down to concentrate and wrap up client projects. I completed my second and final (for now) 3-year term on the Stumptown Syndicate board of directors and have handed off my duties to the new board. I secured my next big professional project, and thus an income for our family for the next while.

Now I’m planning what to focus on during the year ahead and how to make progress towards the efforts I mentioned the day after the election in my post Radicalized.

The most important of these efforts, the one which I think encapsulates all the rest is to help build self-reliant, self-sustaining communities.

One of the main ways I feel I can contribute to this is to continue building, practicing, and sharing basic life skills: gardening, carpentry, plumbing, and electrical. If someone in my community is having trouble getting services for their home, either because they are refused or because they can’t afford it, I want to be able to help. If you are in need of help in one of these areas, let me know and we’ll work together to figure it out. If you’re particularly skilled in one of these trades and are local and want to teach me some of what you know, please also get in touch.

Regarding direct community organizing, I’m figuring out what my role should be. I continue to feel worn out from the last several years of organizing Open Source Bridge and other Stumptown Syndicate related activities. And from organizing within the Mozilla community. I continue to struggle to reconcile how vile the tech industry is with how rooted I am in it. It’s not such an easy thing to simply leave the industry which has defined your entire career and adult life.

I’m working through this in a couple of ways.

First, I’m being very deliberate about the tech work that I do engage in and what I expect the result to be. I am no longer looking for a job or an employer to complete me or to serve as a second home for an indefinite period of time. I work on things where my expertise is needed, where I can make a worthwhile contribution in a constrained period of time.

Second, I’m making deliberate efforts to build community unrelated to tech. After some searching, we’ve found a spiritual community (an Episcopalian one) that seems to be a good fit and I’m looking forward to sticking around and seeing where that leads. I have a lot of reservations and conflicting feelings about Christianity, none of which I’ll go into now, but I’ll say this: something in me is rejuvenated each week when we partake in worship. And I need that kind of regular uplift right now.

Third, I’m reading and thinking a lot. I’m reading about labor organizing, systemic racism, social change, etc. I’m using that knowledge to locate myself and ourselves in history. To contextualize where we are at, how we got here, the different ways can respond, and where that might lead us. In addition to wisdom, I’m also looking for glimpses of hope and beauty here and there. I don’t know if I will ultimately do more organizing within tech, or if I will focus on contributing to community outside of tech, or both.

Meanwhile, I’ll continue to share what I’m learning, here on the blog, on the Recompiler podcast, and in one-on-one conversations.

I do have a few concrete projects on the schedule for 2017:

  • I’ll continue to produce the Recompiler podcast. My main goals for this year are to continue improving it with consistent weekly publishing, timely content, as well as audio and narrative quality, and to grow its audience.
  • Write and publish a second edition of the Community Event Planning book. We’ve learned a lot since we wrote the first edition. I’d like to include that material as well as more case studies and first-person accounts from many different event organizers.
  • Revise and publish the open source governance research I’ve been working on for a client. Open source projects and their foundations have gained significant prominence over the last 10-20 years, but most people have no idea how they work. Whether you’re an individual contributor, or you’re directly involved in the running of a project, I think this is important knowledge to have.

Finally, I’ve included the following on my project board, in the “art & beauty” category: take photographs, make a quilt, grow flowers.

What about you? What are you working on in 2017?

More thoughts about the neveragain.tech pledge and what you can be doing instead

The neveragain.tech pledge continues to gain traction (if you can call it that) and I continue to analyze why I find it so troubling. For my initial thoughts, see this blog post.

A code of ethics or a call to collective action?

It’s not clear what the pledge is supposed to be. Is it a code of ethics and and conduct for our profession, or is it a call to collective action? I think it’s trying to be both, and it’s doing both very poorly.

Our profession already has a code of ethics.

In terms of trying to be a code of ethics: our profession already has this and has for some time. In fact is has a few to choose from. There’s the ACM Code of Ethics and Professional Conduct, the joint ACM/IEEE-CS Software Engineering Code of Ethics and Professional Practice, and the IEEE Code of Ethics. One of these are referenced by the pledge, but only way on down in the resources section and without context.

Whenever you eschew an existing standard, you ought to give a compelling reason why. Otherwise you give the impression of ignorance (not knowing about it in the first place) or egotism (doing something new so you can put your name on, h/t @JohnMetta).

I suspect a lot of us have never heard of any of the existing codes of ethics for our profession, or if we have it hasn’t been in any serious context of actually applying the code in our day to day work. If this is because so many of us are self-taught, or because these codes aren’t taught in computer science curricula, or some combinations there of, I don’t know. I am interested in finding out and in helping to educate my colleagues and put these codes into wider practice with commensurate accountability mechanisms.

If these existing codes are flawed and need revising, let’s work on that together. You can comment on the ACM’s revised draft now through 15 January, 2017. If you care about this stuff, go do that now. Don’t put it off.

In terms of serving as a code of ethics for our profession, the neveragain.tech pledge is significantly lacking. It is simultaneously uncomprehensive and overly prescriptive.

A poorly thought call to action.

In many ways, the pledge looks much more like call to collective action, especially given the part that commits signers to resigning their employment if they are forced to comply with behavior defined as misuse of data. This is a kind of direct action.

But in this it fails too, for any metric more significant than shallow performance. Where is the accountability, the support, the education, the building of trust required for effective collective action? Where is there any clue that the organizers of the pledge actually understand how to lead a collective action?

There are some glaring statements and omissions that make it clear to me they do not. First, the pledge requires people to quit their jobs rather than comply. Now, resigning might be the right thing for an individual to do based on their own sense of dignity or respect or emotional well-being. And, it might feel like a righteous and just action. But it isn’t necessarily the most effective action to take. For it to be effective many people would have to quit at once. And perhaps not even then. In their guide on Effective Strikes and Economic Actions, the IWW says “Workers can be far more effective when they take direct action while still on the job.”

It’s clear the organizers are overwhelmed and delighted by the volume of response to the pledge. However, it’s not clear to me they’ve given any real thought to the number of people required to partake in a collective action in order to make it effective and whether or not those numbers are achievable starting with this kind of online pledge.

How many does it take to be effective?

There’s no definitive participation rate at which strike-like actions are guaranteed to be effective. While we have a rich history of labor organizing upon which to draw, every direct action is different. What we do know is that whatever the circumstances, enough of the labor force needs to participate such that the target organization feels or fears significant, negative, long-term financial consequences.

Let’s say, for sake of this thought exercise, that the number is 20%. (Here is where I would love to hear from managers or executives about which percentage would cause you concern and make you change course.) According to the Bureau of Labor Statistics, approximately 4 million people are employed as tech workers. This doesn’t include those who are self-employed, and it might also be excluding those who have other job classifications but happen to write software. Again, this is a thought exercise, not a scientific paper. The idea here is to get a rough idea of scope.

20% participation x 4 million tech workers = 800,000 signers to pledge

As I’m writing this, 1943 people have signed the pledge already.

1943 / 800,000 = 0.24% towards goal

What would it take to reach the goal of 800k? Let’s say another 8k folks hear about the pledge through word of mouth, are sold right away, and show up to sign the pledge. That would bring the total to 10k.

10k / 800k = 1.25% towards goal

Now what would it take to get those additional 790k signers? Each existing signer would need to convince 79 of their colleagues to sign.

Applying the 20% goal to individual companies looks something like this to reach 20%:

  • Google (Alphabet): 13.9k
  • IBM: 75.5k
  • Facebook: 3.14k
  • Oracle: 27.3k

I’m using these companies global workforce numbers, because that’s what is most readily available, but you get the idea.

I bring up these numbers not to shit on the efforts of the neveragain.tech pledge organizers. I bring them up because I continually see our community fail to coherently, meaningfully discuss and analyze our tactics for driving change. It’s not enough just to have enthusiasm. You also need to know what you’re doing and have a good plan!

(The above numbers assume that everyone who signs the pledge will also follow through on their commitment to take direct action in their workplace. Assuming 100% is highly optimistic.)

There is more at stake than a Muslim registry. And there has been for a long time.

I say this not to minimize the threat to Muslim Americans or Muslim refuges living in America. That threat is very great.

It is also great to women, Latinos, Blacks, queer folks, those who are trans and gender non-conforming, those who are neuroatypical, those living with differently-abled bodies, those who struggle with houselessness, and those who are poor. The scale and nature of likely harm to individuals with differing intersections of these identities will vary, of course. I list them here not to equate them, but to demonstrate the scope of probable harm to our fellow citizens (of America and of the world).

Moreover, these folks have already been subject to varying kinds of harm and oppression and for quite some time. This did not start with the election of Trump. Tech has always had an obligation to stand up for these folks and by and large it has done a very bad job. Just look at how many of your co-workers are not white, straight, cis, male, and abled-bodied.

Every conversation about diversity and inclusion you stood by and watched or played “devil’s advocate” in was a missed opportunity to stand up for injustice. Every time you did not take us seriously about Gamergate. Every time you let your “difficult” colleague (who was likely a women, or Black, or queer, etc.) stand alone and be ostracized for raising an issue about how something your company was doing would have negative effects.

Tech colleagues, you’ve had a lot of opportunities that you’ve just completely squandered. I personally, have very little confidence, you will suddenly start to do markedly better.

And my confidence is not raised when the mechanism by which you are promising to do better repeats the very same mistakes we as a community have been making all along.

Continuing the status quo.

In my earlier blog post, I mentioned that I can’t join a movement when I don’t know who its leaders are. It turns out that the organizers of the pledge aren’t anonymous. They are revealing themselves to the media and on Twitter and probably elsewhere. But this isn’t the same as transparency or accessibility.

The pledge itself gives no background on how it was created or by whom. One should not have to dig for this information. It should be available via the pledge itself or no more than a link away.

Obfuscating leadership and process doesn’t promote individual responsibility nor does it make an effort more inclusive. All it does is obscure the context and motivation conferred by the project and make leadership less accountable to participants.

In tech, we have a long history of imposing our solutions on those who are marginalized, without their input or consent. We compound this error by ignoring or dismissing feedback when given.

Because the organizers have chosen to obscure who they are and by what process they created this pledge, I can only assume this same pattern is true. This is all the more true when at least one of the organizers is has a history of being hostile towards others’ religious practices and of ignoring the feedback from the people of color in communities they steward.

What I do see is a lot of (white) people on Twitter defending the pledge and Black folks saying it’s performative, shallow, and not helpful and not being listened to. Go see for yourself.

Not every effort deserves merit.

In my earlier blog post, I countered the idea that the pledge is the least folks can do. I want to expand on that by saying it might actually be quite counterproductive to support this thing.

It can hurt and does hurt to give attention to ill-conceived efforts. Attention is a finite resource. Giving our attention to poorly conceived or implemented efforts means there is less to give to ones that are better designed and better serving of their communities. Positive attention often brings benefits of all kinds: social and financial capital, credibility, etc. Folks with greater privilege, like white folks, receive more than their fair share of these benefits for work of lesser quality. And once they do, their projects and methods are remembered as good examples. And thus the cycle of mediocrity reinforces itself.

This is dangerous and counter-productive. It inhibits our ability to learn and grow. It reinforces the status quo and is antithetical to building solidarity.

Right action is way more complicated than you think.

Something else implied by this pledge is that there will be definitive moments where you know you are being asked to do something wrong and you will have a clear choice to comply or to walkaway.

In my experience, the actual situations we end up facing are nothing like this. They are complex and confusing and how best to act is quite often not clear. It takes continual, stumbling practice and a trusted network of advisors to gain enough experience to skillfully embody the ethical action we commit to.

And, for the most part, steps towards wrong action are gradual and indirect. I’ll illustrate this with a story.

Once upon a time, at my old job, I was on a call with the marketing team. We were discussing a project aimed at raising awareness about the importance of the open web. I noticed that the team, who was solely responsible for sourcing content for this project, was all men. I asked about the plan for including some women on the team. The response was deafening silence and the energy completely drained from the “room.” After some moments, someone responded with some kind of non-answer so empty I don’t recall now. The call continued and then concluded.

Sometime later, this same project published a pro-gamergate piece. All hell broke loose. Leadership had to deal with the ensuing PR mess. The project lead left the organization. We lost yet more credibility with our community.

Now, I’m not saying that having a woman on the team would have prevented the selection and publishing of a pro-gamergate piece. But I think it would have lessened its likelihood.

More importantly, the team’s and leadership’s failure to respond to the diversity issue I raised is directly related to the giant misstep it look later in publishing that gamergate article. No one was asked on that call to find and publish a pro-gamergate piece. They weren’t even asked to stay silent about the topic I raised; they simply did so because that was the prevailing culture. And in doing so, they took a small step towards creating the conditions for that later bad action to occur.

The lesson here? Start developing your senses now. Be on the look out for repercussions five, ten, twenty steps down the line. Speak up for all the little things because they lead to big things. Listen to your “difficult” colleagues when they raise issues even if you don’t quite understand where they are coming from. Use your privilege to assert publicly that what your colleague is saying is important and needs to be addressed. Start spending your social capital. Don’t wait for a rainy day, it is already upon us.

Some things you can do.

There are things you can do that require a lot more work than signing a pledge, but will be much more meaningful and impactful. Starting with the most specific and moving to the most general:

Read everything you can about labor organizing. If you’re curious about strike actions in particular, start here. Haymarket Books has a good collection of books about the labor movement and is having a 50% sale. While you’re ordering books from Haymarket, you might as well also get some on black politics and feminism. Read everything you can on IWW’s website. Then join if you are eligible. Figure out how to apply what you are learning in your workplace and in your community. A general strike is being planned for inauguration day. Learn about it and figure out if it makes sense for you to participate and how.

Commit publicly to abiding by one of the established codes of ethics for our industry. If you can’t decide, use ACM’s. Write a blog post saying that you’re committing to it and why. Tweet about it referencing neveragain.tech so folks following along know there is another option. Ask your colleagues to commit publicly as well. Encourage them if they hesitate. Start brining up the code of ethics in your daily work. You can do this by asking questions in your team meetings such as, “How does feature X abide or not abide with the code of ethics we’ve agreed to uphold?” Do this for processes that are already in place as well as new ones you are asked to create. Do this until it feels natural and then keep doing it. Hold your colleagues accountable, in whatever mechanism makes most sense, if you see them doing something contrary to the code. Likewise, support them if they seem to be struggling to uphold the code or being pressured to ignore it. Share your experiences doing all of these things, via which ever channels make most sense.

Find ways to materially and emotionally support the existing efforts of those who are most marginalized and at greatest risk. Support these efforts publicly, when it makes sense. Ask others to support these efforts. Listen deeply and learn from the folks leading these efforts without burdening them or colonizing their spaces.

Look for ways to build and support community where you live and to help meet the needs of those living closest to you. Pay attention to your neighborhood. Be a meaningful, respectful part of it.

Find ways to do the hard work of changing yourself. Prepare to give up things you have long taken for granted.

Thoughts about movement building and the neveragain.tech pledge

I’m glad to see burgeoning efforts in the tech community to organize in response to Trump’s looming presidency. One current effort is the neveragain.tech pledge, which opposes the creation of a Muslim registry and vows to refuse participation in such work.

I absolutely oppose the creation or use of any kind of registry to oppress those deemed to be undesirable. But I haven’t signed the neveragaint.tech pledge and I probably won’t. I have concerns about the pledge in particular, and about efforts like it in general.

I am not criticizing you if you signed it, feel empowered by it, or otherwise derive value from attaching your name to it. There are many ways to act in the world according to one’s values and I don’t prescribe one right way of doing things.

Here I want to share my thoughts on the pledge, and movement building in genera, especially for those who might be concerned by the absence of my name on the list of signatories.

I need to know who my leaders are.

I am always cautious of joining movements (or communities), especially ones that appear to develop rapidly. It’s important for me to understand what the shared values, agreements, and goals of the movement are. It’s important that I know who the leaders are, how they govern now, and how they have governed in the past. All of this information helps me understand what committing actually means in practice and helps ensure that I am living up to the commitments I make.

The neveragain.tech pledge lacks nearly all of this context. I don’t know who started the pledge or what their history organizing is. I don’t know if they have a demonstrated pattern of acting ethically and in good faith. All I have to go on is the list of signers, which continues to grow. Many names I recognize. Some of the signers I know personally and trust a great deal. Others I know to be problematic actors. The latter adds to my weariness about signing on.

I appreciate the need for anonymity in many contexts. And yet, having anonymous leadership never works for me.

Update (16 December 2016): Organizers of the pledge are identifying themselves to media and on social media. Still, you have to go track down this information. It’s not on the pledge itself.

I  need to understand strategy, context, and history.

I also want to understand the long-term vision of a particular movement and the strategy of a particular action, including how it serves the short- and long-term goals of the moment. I want to know it is well thought-out and is likely to use resources wisely, including the material, emotional, physical, and spiritual resources of the people involved.

I do not want to participate in vanity exercises or ones that end up being learning experiences that merely retread well-documented ground.

Of course, we must learn by doing. That’s fine. But I don’t want to start at square one when it’s not completely necessary. I want us, the tech community, to understand that there is a long history of organizing for social justice and a deep body of knowledge and experience derived from that history. I want us to acknowledge and build from this wealth of experience, using it as our starting point.

What resistance strategies have been effective?

Being a student of history, I want to understand the role of similar pledges in resistance movements and in organizing for social justice. Off the top of my head, I can think of examples of a lot of other kinds of actions that proved to be effective. I can’t think of a single pledge-type activity that was. (Please, let me know if you have examples.)

I’m still learning about what’s been effective. What I’ve learned so far is that localized, direct action is critical. Coalition building over geographic distance is important for knowledge and resource sharing, as well as fundraising and consciousness building. But it’s localized, direct action and community building that is the fundamental building block of movements.

What building solidarity feels like to me.

Building solidarity and community, especially in terms of trusted relationships and networks of mutual support are equally critical to building effective resistance and social movements. Organizing is tough, dangerous work. When it’s effective, it has real consequences. Living up to the neveragain.tech pledge means putting your salary and your health benefits on the line. I think many of us in tech are not prepared to do that.

In order to achieve and sustain mass participation, we must be willing and able to take care of each other, especially those who are most vulnerable and who will bear the greatest losses. We need to work on adjusting our mindsets so we are willing to give up some of our own security to help out others. We need to become adept at pooling and sharing resources so that we can provide each other with food, shelter, sundries, rent and mortgage money, household repair, medical services, etc.

So does the neveragain pledge help build solidarity in this way? It doesn’t for me. Generally I find that solidarity-building efforts that are primarily online and distributed feel too diffuse and empty. I need more direct, person-to-person interactions. Solidarity is fundamentally about trust. I need to have opportunities for shared vulnerability in order to build trust. I can do a lot of that via online communication, but need interactions to be consistent and frequent. And even then I need a certain percentage of these relationships to be based near to where I actually live.

I can see how signing the pledge might be the first time some people have ever made a public statement opposing the status quo. I can see how if that’s the case, doing so would feel like they are putting something on the line for what they believe. And with this in mind, I could see how those folks feel like they are building mutual trust with the other signers.  It’s just not where I’m at personally and I’m eager to start at a much different place.

We need to support a multitude of approaches.

The neveragain pledge is highly aspirational and prescriptive but it lacks accompanying support mechanisms and context. It sounds nice and just. Signing seems like the obviously right thing to do. But how do you actually embody the pledge in your day-to-day life? It is my experience that the moral calculus of the situations we actually end up facing are far from simple and a clear best choice is hardly ever available.

I once thought there was always clear, undeniable value in the lone employee, or small group of employees, standing up and walking out after all other avenues of addressing injustice had been exhausted. But having experienced this personally, and witnessing it play out several times, I now think differently. Power does not care about the lone employee or even the few. Power might care about a mass exodus or work stoppage if it impacts their bottom line. On the other hand, the individual employee(s) almost always have a lot to lose.

If you’ve done something like this as a lone employee or in small group, I’m not saying you should not have. Sometimes you have to speak truth to power even if its seems likely nothing will change. I support you in doing so. Likewise, I want to find better ways to support folks who resist injustice, both in terms of limiting harm (to individuals and their families) and maximizing effectiveness (of the overall movement or specific action).

And I also support you if you aren’t in a position where you can just stop working for a problematic company. This stuff is complicated. It’s not my business to tell you to quit and/or make public statements, or take any particular action for that matter, especially if I don’t know about all the others things you’re dealing with in your life. And even if I did, it still wouldn’t be my place to judge since I’m not the one that has to live your life!

Aiming higher than “the least we can do.”

I’ve seen a few people saying that signing the pledge is “the least they/you/I can do.” And that’s precisely the problem with pledges like this. Just as electricity takes the path of least resistance, humans will quite often do the least they have to and then move on to the next thing. I worry that this pledge will have that effect for many. Instead, we need to be focusing on the most that we can possibly do at any given time.

Our energy and attention are finite. We need to use them both wisely. Maybe the neveragain pledge is a great first start, one that will mobilize a great number of people to significant action. Or maybe it’s just another demonstration from the tech community that will get a lot of attention for very little impact.

What can you confidently infer about who signs these pledges?

There’s a strange side-effect I’ve noticed with these kind of pledges that I’m rather uncomfortable with. Those who sign it are awarded a king of “good” point and those who don’t fail to get the point. Or, worse, are assumed to be in favor of the things the pledge promises to work against. I’ve already seen one person in my personal network say something like “sign this or don’t talk to me.”

I think this is why there is always a group of people who rush to be the first to sign these things. Is it because they have truly committed to embodying the pledge, or because they want to be visible as having signed it?

Seeing a name on this list, by itself, does nothing for me. What touches me is direct interaction with you. It’s witnessing substantive conduct on your part. It’s hearing first hand from others whom I trust about your actions and deeds. It’s collecting these touch points over a period of time and contexts sufficient enough for me to get a sense of your overall pattern of behavior.

Signing a pledge does not constitute substantive conduct. It’s everything you’ve done before and after signing the pledge that matters.

The machine is already here; Our focus needs to be subversion, sabotage, and protection.

Another thing this pledge supposes is that there aren’t already sufficient, significant mechanisms for identifying and surveilling those deemed undesirable. I believe there is. And I believe there are plenty of organizations and individuals willing, no matter how many of their colleagues quit in protest, to maintain and improve these mechanisms.

And so I am much more interested in collectively developing, practicing, and deploying counter-measures. How can we technologists disrupt and sabotage what is already here? What protective mechanisms can we provide? What existing in-person support networks and movements can we participate in? How can we support coalition building across our vast country?

 

Radicalized

I cried last night as the final projections were coming in and it became clear Trump had been elected the next President of the United States. I cried again, no, I sobbed, this morning before I even managed to get out of bed.

The thoughts flooded my mind and it was just too much. ACA is going to be repealed and I’m going to have to go back to work for a big employer. Can they find a way to legally invalidate my marriage? I don’t think so, but I’ll need to research. Is it safe for me to work for an employer not based in California, Oregon or a similar state where I can’t be fired for being queer? Another thing I need to look up. Is Roe v Wade going to be overturned? How soon could that happen? Which states are going to be too risky for me to travel to now? Religious freedom bills are almost certainly to become ubiquitous. How will this affect my ability to get essential services? How oh how are we going to get through the global fallout of a Trump presidency? Being a gender non-conforming queer woman is bad enough. Trans folks, PoC, immigrants, Muslims, are going to face so much more shit. How can I support and fight with them?

Eventually I calmed down and got out of bed. Sherri made me tea before she had to leave to teach and then I started processing with the rest of you all on Twitter. And now I sit down to write this post.

In selecting Trump, nearly half of my fellow voting Americans demonstrated their investment in upholding and restoring White, cis-male, heterosexual supremacy and hegemony. They demonstrated it was more important to them to send a big fuck you to the establishment than to opt for stability with a qualified but flawed politician. They demonstrated their discontentment with being knocked down a few rungs of the economic and social ladder. They demonstrated their commitment to ensuring they have someone below them on that ladder, no matter the collective cost.

I have compassion for why some people voted for Trump. There’s no doubt groups of whites are hurting, particularly in smaller cities and rural communities. But they are by no means the only ones who are. And if exit polls are even close to accurate (which they may not be), we know well-off whites voted for Trump in greater numbers than did poor whites.

Trump didn’t win this election because of his plan to improve life for all Americans. His policy positions, when they are coherent, are a mess. He won because of his vision to restore a way of life for a very specific group of Americans, at great expense to the rest of us. Scapegoating is a powerful tool, and Trump and the new Republican party used it well during this election.

This is why focusing on the “economic anxiety ” of whites, as I’ve seen portions of the media and my peer group do today, is a costly distraction. If white folks generally felt peachy keene about their social and economic status in this post-colonial, increasingly globalized world, would they have seen through Trump’s abhorrent isms and voted for Clinton? We’ll never know. But it doesn’t matter. White folks, as an aggregate, are never going to feel peachy keene about their social and economic status again. The world is changing. Whites are losing relative status, and right they should because they have disproportionately benefitted from the subjugation and oppression of others for far too long. Your disenfranchisement is not a free pass to have taken the morally indefensible action of voting for Trump.

Does it hurt to give something up even if you were never entitled to it in the first place? Of course it does. The hurt doesn’t justify your entitlement. And it matters what you do with that hurt. Unfortunately, humans have a strong tendency towards tribalism, hierarchy, and scapegoating. When we hurt, we want someone to blame, and we look to those we consider others. Immigrants have taken our jobs. Muslims are to blame for our lost sense of security. Queers getting married are responsible for our changing family dynamics. None of this is true, but the world is changing faster than most whites can comfortably adapt and they need to blame somebody. Whites are so convinced everybody else is to blame, they are willing to burn everything down rather than work together and improve things for all.

And there are powerful factions who have a vested interest in this being the case. Some people are going to get even more rich as a result of Trump being president. The evangelicals and men’s rights activists are going to rejoice in the restoration of patriarchal power we only recently started dismantling via equal rights legislation and other legal protections for women and queer folk.

I don’t have the energy now to go into how the Democratic establishment and liberal elite have also failed us, but they have. Nearly every single one of our institutions is complicit in getting us to where we are today.

So, what are we going to do about it?

We’re going to organize and build community, prioritizing on our local ones. We’re going to organize labor so we can engage in effective collective bargaining and other actions.

We’re going to organize to support each other in all the ways needed during the turbulent times to come. We’re going to make space to grieve, play, rest, and heal. As my friend @ameliabreau says: “caring is a radical act.”

We’re going to build coalitions across geography and demographics. We’re going to figure out how to get as many people as possible involved in dismantling the white patriarchy.

We’re going to have critical conversations amongst ourselves. We’ll employ compassion and empathy, but we’ll hold each other accountable. We’re going to recognize that the majority of white women voted for Trump and that there are likely “feminist” women among us who act as collaborators with the patriarchy whether they intend to or not. We’re going to hold our activist leaders accountable when they engage in bad behavior or act in bad faith. No more throwing WoC under the bus. No more.

We’re going to focus on building self-reliant, self-sustaining communities. We’re going to teach each other essential life skills and trades so we can survive and thrive in a world that is hostile to us. We’re not going to wait for an outside funding source or for the State or Federal government to rescue us.

I am still hurt, and I am still scared. But now I am energized. I am radicalized.

I hope you are too and that you’ll join me.

Remote vs in-office work is a false dichotomy

Johnathan Nightingale, who I know from when we were both at Mozilla, recently wrote about Why More Companies Don’t Do Remote Work (and probably shouldn’t).

How we talk about “Remote vs. In-Office” work

I agree with much of Johnathan’s analysis. I don’t think those who favor in-office work are monsters. I don’t think companies shy away from remote work because they hate freedom. Nor do I think such companies should be shamed for their decisions. Mostly what struck me about Jonathan’s post, and many like it, is that we still think of remote vs in-office work as either/or.

At best, we talk about it as if it were a continuum. On one side, there’s flexibility, greater access to talent and the added benefits that come with building the infrastructure and communication practices required to make remote work possible. On the other side, there’s the efficacy that comes with being co-located, the ability to share central, office-based resources, the convenience of your co-workers being visible and in close physical proximity during business hours. Hybrid companies, as Jonathan refers to them, fall somewhere in between the two ends, slightly favoring one mode of work or the other.

What if they aren’t mutually exclusive?

What if, instead, we recognized that what we’re really talking about is modes of work that people naturally alternative between, depending on how they’re feeling, what’s going on in their life, the type of work they are trying to get done, and many other external factors? What if we design work places and processes that took this into account?

Why I hardly ever went to Mozilla’s Portland office

To explore what I mean, it’s helpful to look at some real-life examples. When I first started at Mozilla in September 2011, it was as a remote employee. Later Mozilla opened a Portland office, but I still did most of my work from my home office. When I did go in, which was about 2-3 days a month, it was mostly to be seen and to catch up with co-workers.

Why didn’t I go into the office more? Couple of reasons:

  • The office environment was exceptionally distracting. All of Mozilla’s offices have an open-plan layout, which I find it nearly impossible to concentrate in. The Portland office also has a very limited number of conference rooms and they were nearly always booked. I couldn’t count on being able to use one for a quiet workspace (or even a meeting for that matter).
  • None of my direct team members were based out of the Portland office. While I always enjoyed talking with fellow Mozillians on other teams, going into the office didn’t give me the direct benefit of sitting side-by-side with whom I was directly collaborating.
  • It cost time and money. I’m one of those people who loathes commuting, even when transit options are timely and plentiful (which they aren’t from my home). A daily commute of 30 minutes each way is 5 hours a week I could better spend on any numbers of things. Meditating, doing yoga, walking our dogs, reading, writing, gardening, etc.

That said, I very much miss having access to the Portland Mozilla office. It’s incredibly useful to have a go-to, well-appointed space for collaboration. Offices are great for that.

I also think it’s great to have a go-to, well-appointed space for deep work. Unfortunately offices, particularly those with open plans, are terrible for that.

The drawbacks of remote work apply to in-office work

Regarding some of the supposed benefits of in-office work and the drawbacks of remote work, we are likely mistaking correlation for causation. The three drawbacks that Johnathan specifically mentions all apply to in-office work too. They are just sometimes more apparent with remote workers:

  1. Remote Work Exacerbates Performance Problems. Remote work is going to put strain on some worker-organization relationships and for others it will lessen that strain. Likewise, in-office work masks certain kinds of performance problems. Simply showing up each day and appearing to get shit done, doesn’t actually mean you are.
  2. Remote Work Often Creates Two Tiers of Employee. While I agree that remote workers are more easily left out of the loop, all organizations have tiers of workers, regardless of where they work. Unless the core groups of organizations work exceptionally hard at it, there will always be some employees more in the loop and with greater access to opportunity than others. This disparity isn’t eliminated when you’re all co-located and it’s a trap to think otherwise (because you’re then less likely to continue doing the work of including everyone).
  3. Marginal Drag Matters. Having remote workers may cause marginal drag in one direction, but what about the marginal drag created by requiring everyone to come into a central office in order to consider that real, focused work is being done? To assume there is none seems to ignore how people actually live their lives and do their work.

 

What would it look like to support both kinds of work?

What would it look like to recognize and fully support both remote and in-office work, allowing everyone the freedom to select which mode is appropriate at a given time?

I believe it would include:

  • Having well-appointed, accessible offices with flexible seating and plenty of meeting and private workrooms alike. I would like workplace to be much more like university libraries. The office should have great shared infrastructure, including all the tools and reference material you need to get work done. You should be able to go to it when it’s the best place for you to work, and when you need to collaborate in person, but not be required to be there any kind of set hours. Likewise, if you want to work only at the office, you can.
  • Great collaboration infrastructure that enables remote and in-person ways of working alike, at the same time.
  • Good, multi-modal communication and documentation is valued, supported, encouraged, and practiced at all levels across the organization.
  • Managers are trained and supported in leading inclusive and diverse teams, including how to deal with issues related to flexible schedules and work environments.
  • Team members’ expectations of one another are clearly communicated and there is a clear and supported process for resolving conflict when it arises. There is agreement about when and where people will be available, and people follow through on those agreements. The team meets regularly in person and remotely according to its needs.
  • Ample opportunities to socialize, both on-line and in-person, and in structured and spontaneous ways.

Such a setup would allow people and organizations to benefit from both kinds of working situations. So, rather than judging and vilifying the different ways of working, we can realize that each has benefits and drawbacks depending on the situation. And we can work to maximize the benefits and minimize the drawbacks of each .

You still have to make decisions

All of the above requires that an organization’s leadership recognize that there is no such thing as a one-size-fits-all approach. It requires they lead more and control less. It also requires a certain level of investment in technology infrastructure, though much less now that things like Skype and Google Hangout are ubiquitous. So, by far, the first requirement is the much harder one to meet.

And organizations still have to decide from how far away they are willing to hire. This should in part be a function of how much in-person collaboration is needed for the role, where the rest of the team is located, the annual cost that employee’s travel, and their willingness to travel.

Actually, now that I think about it, I would love for every job description to specify how much in-person collaboration is required. A job where I’m expected to spent half my time in meetings is very different from one where I’m expected to spend half my time pairing one-on-one, and different still from one where most of my work will be solitary.

And, even if you’re comfortable with remote work, hiring employees who live in different states, let alone countries, creates additional overhead.

 

Python’s os.fork, subprocess, and the case of the missing output

One of my current projects is helping to improve contributor documentation and tools for Zulip, an open source group chat platform. We recommend that first-time contributors use the Vagrant method of setting up the Zulip development environment.

One current downside of this method, in the context of Zulip, is that many of the helper tools are written to be used with a Zulip development environment setup directly on a host system running Ubuntu. An example of this is the pre-commit hook, which looked like this when I first started working on Zulip:

./tools/lint-all $(git diff --cached --name-only --diff-filter=ACM) || true

This code is intended to be run in the zulip directory, with a Python venv activated and all dependencies installed and configured. So, if I run it in my Mac terminal, I see the following:

ImportError: No module named typing
You need to run the Zulip linters inside a Zulip dev environment.
If you are using Vagrant, you can `vagrant ssh` to enter the Vagrant guest.

That’s a helpful enough message and if I ssh into my zulip dev environment, I can run the linters:

christie@Olamina [~/Work/zulip] $ vagrant ssh vagrant ssh
...
(zulip-venv)vagrant@vagrant-ubuntu-trusty-64:/srv/zulip$ ./tools/lint-all

Which is good, but doesn’t align with how I actually work. Recall that this command is part of a git pre-commit hook. It’s intended to be run by git when I run git commit, which I do on my Mac terminal, not within the Zulip dev environment. I like to use git on my Mac terminal because that’s where I have git configured and where I have all my fancy oh-my-zshell terminal integrations. I could set this up inside the Zulip dev environment, but because that’s designed to be encapsulated and generalized for anyone contributing to Zulip, I’d have to do it every time I re-created or re-provisioned the environment. Not ideal.

Knowing that you can pass commands through vagrant ssh just like you can through regular ssh, I figured it would be easy to update the pre-commit script to work for both types of dev setup. I tried this:

vagrant ssh -c '/srv/zulip/tools/lint-all $(cd /srv/zulip && git diff --cached --name-only --diff-filter=ACM) || true'

The only change I made was to add a cd to the zulip directory before running git diff. This is necessary because ssh’ing doesn’t start you in the /srv/zulip directory.

It seemed to work. I saw some output from the linter:

Fix trailing whitespace at README.prod.md line 4:
This documents the process for installing Zulip in a production environment.

Until this point I’d been testing the hook by invoking the script directly by running .git/hooks/pre-commit in Mac my terminal. Now it was time to try with an actual git commit. The command took a long while to complete, so it seemed as if the linter was running, but I didn’t see any output. WTF?

I vagrant ssh’d into the dev environment and tried a git commit there (after setting the bare minimum config values that git requires). The linter ran and generated output. I was back at square one.

Let’s recap the situation:

I saw linter output when I:

  • Ran the .git/hooks/pre-commit script directly via Mac terminal
  • Ran the vagrant ssh -c command directly via Mac terminal
  • Ran .git/hooks/pre-commit, ./tools/lint-all, or git commit inside vagrant virtual machine

I do not see linter output when I:

  • Ran git commit via Mac terminal outside of the virtual machine.

Because the hook intentionally returns true, and therefore allows git to continue with your commit, no matter the output of the linter, having output is essential. It’s the only way you know you have code style issues to address.

First I investigated the bash/ssh aspect of the situation. I spend a couple of hours reviewing Bash documentation, including a side tangent about psuedoterminals that was both frustrating and fascinating. This led no where. In fact, all I ended up figuring out was that the Bash conditions under which the linters were evoked were essentially identical. (I did this by putting a shoptat the beginning of .git/hooks/pre-commit and comparing the output from running it on my Mac terminal and inside the Zulip dev environment side-by-side.)

At this point it was well into dinner time and I called it a night.

By the time I returned to my keyboard the next morning, fellow Zulip contributor Steve Howell had been working on the issue and eliminated vagrant as the issue by reproducing the missing output using plain old ssh. This and my work from the previous evening shifted my focus to the ./tools/lint-all python code itself. I dove in, determined the understand each and every line.

This took a while. lint-all is almost 500 lines. It looks like one of those things that started simple, but has grown more complex over time as its parent project grew more complex. It has very few inline comments.

Here’s what I figured out:

  • lint-all runs several linter scripts in parallel using Python’s os.fork(), subprocess.call(), and subprocess.Popen().
  • The linter scripts are a combination of other stand alone commands (e.g. jslint, puppet parser, etc.) and inline Python code. Each linter wrapper is its own function and is cataloged by the lint_functions dictionary. The run_parallel() function loops through lint_functions, creating a new child process for each with os.fork() and then executing it. It also checks the status of each of the child processes and returns failed == True if any of them exit with a failed status.
  • Most of the linter wrappers use subprocess.call() to invoke their respective command line scripts. The exception is the function that runs the pyflakes linter. Pyflakes writes some messages to stdout and others to stderr. So, in order to capture both kinds of messages and then loop through them to determine what to output, subprocess.Popen is used with arguments stdout = subprocess.PIPE and stderr = subprocess.PIPE

(If all of that is really confusing, feel free to take a look at this highly simplified version I wrote to accompany this post.)

While I was learning how lint-all worked, I asked other Zulip contributors as I went along. At one point, Steve Howell asked what the redirected output looked like and I ran this within the virtual environment:

 ./tools/lint-all > out.log 2>&1 

And it created a file without any output. Wait, what? > out.log 2>&1 should have redirected both stdout and stderr to the file out.log.

So, when I ran the linter, I saw output on screen. But when trying to redirect that output to a file, I got nothing. Within the virtual environment.

At this point I knew the problem had something to do with these child processes and pipes, but I was getting tired. So I did what any good programmer does when they’re stuck, which is start asking questions on Twitter:

To which Adam Lowry replies with this hint:

And so I added sys.stderr.flush() and sys.stdout.flush() prior to the call to os._exit() and that fixed it! I could now see complete output when I ran the linter under all conditions.

For whatever reason, output that was in the stdout and stderr buffers was getting lost when child processes were terminated. The python docs for os._exit() does give a hit about this:

os._exit(n)
Exit the process with status n, without calling cleanup handlers, flushing stdio buffers, etc.

Lesson learned? If in doubt, .flush() your output. Also, Zulip’s ./tools/lint-all could use some re-factoring. I haven’t tackled it yet, but I’d try getting rid of that os.fork() and using subprocess methods functions entirely, or another concurrency method.

Again, if you’d like to try or see a simplified example of the problem for yourself, take a look here.

And here’s the final git pre-commit hook:

#!/bin/bash

# This hook runs the Zulip code linter ./tools/lint-all and returns true
# regardless of linter results so that your commit may continue.

# Messages from the linter will be printed out to the screen.
#
# If you are running this one machine hosting a Vagrant guest that
# contains your provisioned Zulip development environment, the linter
# will automatically be run through `vagrant ssh`.

if [ -z "$VIRTUAL_ENV" ] && `which vagrant > /dev/null` && [ -e .vagrant ]; then
    vcmd='/srv/zulip/tools/lint-all $(cd /srv/zulip && git diff --cached --name-only --diff-filter=ACM) || true'
    echo "Running lint-all using vagrant..."
    vagrant ssh -c "$vcmd"
else
    ./tools/lint-all $(git diff --cached --name-only --diff-filter=ACM) || true
fi
exit 0

Update 27 August, 2016 17:10 PDT: Brendan asked me about the use of os._exit() so I took another look at the docs. That led me to wonder about using sys.exit() instead, which led me to this post. Using sys.exit (code) appears to obviate the need for the .flush() statements.