tim: A person with multicolored hair holding a sign that says "Binaries Are For Computers" with rainbow-colored letters (binaries)
I'm organizing an Ally Skills Workshop at ICFP this August, which Valerie Aurora of the Ada Initiative will be teaching. If you are attending ICFP or a co-located event such as the Haskell Symposium, CUFP, or Erlang Workshop (not an exhaustive list), you are welcome and encouraged to apply to attend!

The workshop is geared towards men in the functional programming community who want to learn how to be better allies to women and non-binary people in the community. However, it is open to people of all genders.

For all the details, see the information page, which links to a Google Forms page that you can use to apply.
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
Long overdue, here are my notes on the talks at CUFP 2014 (September 6, 2014). This is the last in a series of conference write-up posts from me that cover CUFP, the Haskell Symposium, Erlang Workshop, and the three days of ICFP itself. CUFP is the workshop for Commercial Users of Functional Programming, and I was honored to have served on the program committee for it this year.

Joe Armstrong's invited talk, "Making Money with FP", was quite entertaining... for the most part anyway. His comment that you can't sell a language, and must sell a project written in it, harked back for me to working at Laszlo Systems in 2005.

He made the point, about adoption of FP, that "nobody ever got sacked for using Microsoft products (or Java, or C++" -- also this gem, "You get paid based on the number of people you manage, so people hate the idea that ten Haskell programmers can do what 100 C++ programmers can do." (I'm not confident that that generalization always holds, but it does seem to be true in my experience.)

One aside that marred an otherwise great talk was an unnecessary use of "guys" on a slide, when Armstrong said (while speaking to the same slide) "technical guys enjoy an argument". One or the other and I might have let it slide, but not all "technical guys" enjoy an argument, plus technical women who enjoy arguments are punished for that while technical women who don't enjoy arguments tend to get steamrolled.

Then, Armstrong went on to talk about different business models for making money from FP. Most of this advice seemed broadly applicable, but it was still good to hear it coming from one of the people who is most qualified to talk about "how to make money with FP". He implied, I think, that the best two routes for a person trying to get into business with FP were either a consultancy (where you are an independent businessperson who sells consulting hours or services to other companies) or a development/R&D company where the goal is to "develop a product and sell it to a bigger company that can sell it." He explained how a good way to gain a reputation is to participate in the standardization of a language or framework: either choose a new standard or invent one of your own, and then make the best and first implementation. Then, you sell or give away software to build your reputation (which is why you can't sell a language, I guess!) and finally, sell the company :D
Read more... )
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
Previous notes: ICFP, days 1, 2, 3.

These notes are about Friday, September 5. Thursday, I missed the whole day of conferencing and only went to the industrial reception in the evening. I hadn't planned to go to many talks on Thursday anyway, but I ended up spending Wednesday night (all of it) in the ER at Östra Sjukhuset, since I didn't know how else to get a relatively minor thing requiring antibiotics treated at night. (Since I didn't get seen till 5 AM, I should have just waited till the next morning!) So that meant sleeping till about 3 on Thursday.

On Friday, I'd been planning to mostly go to the Erlang Workshop and drop in on a Haskell Symposium talk or two, but I ended up doing the opposite, oops. Somehow, I always end up going to the "Future of Haskell" discussion, even in years when I'm not doing Haskell. I already talked about the discussion a little bit in my Ada Initiative fundraiser post; what Wouter said about being encouraging to newcomers was part of it. During the discussion part, somebody stood up and said "well, as far as I'm concerned, everything's fine because the Haskell community has been friendly to me and I've had a good experience." I'm probably being a bit unfair to him, but certainly the implication was that his good experience was a sign there was no problem, even if he didn't say so explicitly. I stood up and pointed out that the people we need to listen to are the ones who aren't in the room -- presumably, everyone who was attending the Haskell Symposium was there because they had a good experience with the community. I don't think I exactly said so, but further compounding things is that some of the specific people who have been particularly hostile to novices were in the room. If you have no idea what I'm talking about at this point, Gershom's "Letter to a Young Haskell Enthusiast" should be a good start. I'm motivated here by having friends who wanted to learn Haskell but gave up because people were hostile to them, and I hate that the response to that is for people to say their experiences were good -- that doesn't give me anything to tell my friends.

I also touched on this in my fundraiser post, but the fact that on day 2 of the Haskell Symposium, there were maybe 100 people in the room and (as far as I could tell) none of them were women, by itself, indicates that there's a problem. Arguments that women just aren't interested in Haskell, or aren't good at it, or prefer to do real-world things where they get to help people (unlike teaching and research, I guess?) have so little merit that they're not worth discussing. I know that the lack of women in the room was for a reason, which is that largely, women aren't finding the Haskell community -- or the functional programming community, or communities around programming language theory and practice more broadly -- welcoming. The fact that there are a few exceptions means that a few women who have an exceptional level of interest, talent, and (for some, anyway) privileges along axes other than gender have been able to make it. They should be listened to for the same reason that someone who runs marathons while wearing a 100-pound backpack knows more about running marathons than someone who runs marathons unladen. But it's not enough for a few exceptional women to be allowed in -- to paraphrase Bella Abzug, equality doesn't mean access only for the exceptional women, but for mediocre women to do as well as mediocre men.

Wouter made a comment about "encouraging women", and while we should, I wish people would spend less time saying "encourage women", and more time saying "don't be a jerk". Of course, neither imperative means much without further detail. As Gershom's letter reflects (indirectly), when I say that the community is unwelcoming to women, it's often not about overt sexism (though there is some of that), but rather, a very popular aggressive, adversarial, confrontational teaching style that many people apply to a broad range of interactions besides those that are understood as teaching situations. And it's not that women don't like to be or don't want to be aggressive -- it's that they know from lived experience that being aggressive and adversarial with men has consequences, and not good ones. This is the double bind: there is a very narrow range of allowable behavior for women in any grossly male-dominated subculture, and a very wide range for men. So besides just "encouraging women", men also need to approach intellectual conversations in ways that aren't about showing dominance... even when they're only talking to each other.

Here's the video of the entire discussion, which I think includes all the audience comments.

After lunch, I went to some of the Erlang Workshop talks. The first one was Amir Ghaffari on "Investigating the Scalability of Distributed Erlang". The talk didn't spend much time introducing Distributed Erlang itself, but rather, focused on running DE-Bench (the benchmark suite for it) on different number of nodes to see how well Distributed Erlang scales. DE-Bench lets you run tests synchronously or asynchronously, on one or all nodes. Ghaffari found that throughput drops off dramatically if you start using global operations (which, intuitively, isn't surprising). He also found that latency for global commands grows linearly in the number of nodes -- I wasn't so sure why that was true. He found that Riak didn't scale past 70 nodes at all -- at that point, an overloaded server process became the bottleneck. He concluded that everything about Distributed Erlang scales well except for RPC; not being familiar with Distributed Erlang, I'm not sure how much of a problem that is.

In the next talk in the same session, Chris Meiklejohn spoke on dataflow-deterministic distributed dataflow programming for Erlang. The talk was about using Erlang to build a reference implementation for CRDTs, as well as building a new language (that is, a subset of Erlang) for CRDTs. It was cool that Meiklejohn was implementing some ideas from Lindsey's work, both because I know Lindsey and because it was something I'd heard about before, so I had at least a moment where I got to feel smart ;)

Meiklejohn and colleagues' system, DerFlow, is state-based; CRDTs require something to grow monotonically, and in this case, it's state. Meiklejohn pointed out that for distributed systems, this is great, because unreliable networks mean that packets could get dropped, but never cause already-transmitted data to be forgotten. Proving correctness means proving properties over the lattice of choices; a choice is a particular sequence of messages received by a program. Their memory model is a single-assignment store: any given memory location goes from null (no binding), to variable (which means it's "partially bound"), to value (bound). If one node asks for something unbound, it will wait until it becomes bound -- so, deadlock can happen. I'm handwaving a bit in my explanation here, but fortunately, you can go look at the code yourself on Github!

Finally, I went to one last Haskell Symposium talk that I wouldn't have gone to if Ed Kmett hadn't recommended it, and indeed, it was worth going to: Atze van der Ploeg's "Reflection Without Remorse". The talk was cool, but at this point my brain was pretty fried and I bet the paper will be even cooler. van der Ploeg motivated the problem by talking about how a chain of list append operations gets evaluated depending on associativity -- depending on where you parenthesize, one way is a lot more expensive than the other. I think this is the same problem as the infamous foldr/foldl problem. The solution (that makes the cost of evaluation the same regardless of associativity) is to rewrite expressions in CPS form -- this looks to me a lot like the build operation from shortcut deforestation. If I'm not totally lost, I think during this talk, I finally understood why build is called build for the first time (and I did my undergrad and master's theses on shortcut deforestation) -- the build form represents building up a list as a continuation. Then you run into a problem with having to convert between list repreesntations and function representations and vice versa -- I think I actually ran into something similar in my master's thesis work that I didn't quite know how to handle, so if I'm in a mood for revisiting some ancient history, maybe I'll try to figure out if there's really a connection there or not.

So far, apparently, Okasaki already solved the problem -- just for lists -- in Purely Functional Data Structures. But you can actually generalize the problem to all monads, not just lists! That's where it gets really cool. The continuation monad transformer for monads (which I don't understand) is apparently another instance of the same problem. My mind started melting a little at this point, but the upshot is that you can do monadic reflection, where you have interchangeable continuation-based and concrete forms of a data structure and can alternate between building and reflection.

That's all for Friday -- stay tuned for my final ICFP-ish post, in which I'll summarize the CUFP talks.
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
These notes are about Wednesday, September 3.

The first talk I went to was Carlo Angiuli's talk on homotopical patch theory. I understood very little about the actual new work in the talk, but I'm very glad to finally have at least a vague sense of what homotopy type theory is about (though I no longer remember how much of that came from the talk, and how much came from talking to Carlo and to Ed Kmett the day before :) I was about to write down my hand-wavy summary of what I think it's about, but I realized it's too hand-wavy to even write down. But, I want to read more about it, and if you're curious, so can you!

The next talk I went to was Niki Vazou's talk on refinement types for Haskell. Refinement types are cool, but sadly, I lost the thread (totally my fault in this case) somewhere after Vazou said something about using refinement types to prove termination for themselves. At that point, I wrote down an outraged little comment on my notepad that ended with a note to myself to read the paper. The other thing about this talk that I noted, which I hate to mention -- but really, what I hate is that it's even noteworthy at all -- is that during the Q&A period, a woman asked a question at a talk given by a different woman. This was the 10th ICFP I've attended, and I'm pretty sure this was the first time I've seen that happen at ICFP.

Then I missed most of Conor McBride's talk "How To Keep Your Neighbors in order" indirectly due to listening to Ed tell his (edited, I'm sure) life story. If you get the chance, you should ask Ed his life story; he may be the closest person to a character in a Hunter S. Thompson book who you're likely to meet at a computer science conference.

Next (for me) was Simon Marlow's talk "There is no Fork: an Abstraction for Efficient, Concurrent, and Concise Data Access", which was probably the best talk title of ICFP 2014. Simon talked about his work on Haxl, motivated by wanting an implicitly concurrent language for fetching data incrementally and lazily. This reminded me a bit of what I overheard when I was working on Rust about Servo's incremental layout, but I don't remember it well enough to know if that's a red herring or not. I'll be interested to read the paper and see if there's any comparison with Erlang, as well.

Jeremy Gibbons began his talk "Folding Domain-Specific Languages: Deep and Shallow Embeddings by saying that his co-author Nicolas Wu couldn't be there because "he has taken delivery of a new baby". Which was funny, but possibly took someone else out of the picture a bit ;) The talk was helpful to me since I spent four years at Portland State hearing people talking about deep and shallow embeddings without knowing what that meant, and now I do. Deep embeddings are syntax-driven and shallow embeddings are semantics-driven (unless it's the opposite); in a shallow embedding, operations are functions in the host language and in a deep embedding, operations are types in the host language (ditto). It's a similar dichotomy to the expression problem. I wrote in my notes "Somehow you can turn context-sensitive interpretations into compositional ones (read the paper)". At that point, I was literally too tired to stand up, so I'm just pleased with myself for having remembered this much!
tim: A person with multicolored hair holding a sign that says "Binaries Are For Computers" with rainbow-colored letters (binaries)
These notes are about Tuesday, September 2.

I caught the end of Robby Findler's invited talk on behavioral software contracts. That was enough to catch a point that I found thought-provoking: that contracts aren't a subset of types, because contracts can express protocol-based properties (similarly to how session types do), which fundamentally involve assignment. I'm still mulling it over, and I should probably just watch the whole talk, but it might be the answer to a question that has plagued me for years, which is: "are contracts just type signatures that you put in a comment?" (Not meaning to participate in a holy war here -- I assume the problem is my lack of understanding.)

If that's true, it reminds me of typestate in Rust, which I implemented for my intern project and which was later removed from the language. Or, maybe, Rust's typestate wasn't as powerful as contracts are, and that's why people didn't find it useful in practice. I do remember always being really confused about the interaction between typestate and assignment -- we went back and forth between thinking that typestate predicates should only be able to refer to immutable variables, and thinking that we'd take the YOLO approach and leave it as a proof obligation for the user that mutation can't cause unsoundness. So maybe if I had understood contracts at the time, the whole thing would have gone better. In any case, I'd like to read more so that I can articulate the difference between typestate and contracts.

I caught slightly more of David Van Horn's talk on soft contract verification, though I missed part of that talk too. The principle here is to allow assigning blame when an assertion fails at runtime: then, you can write your code so as to have strong enough contracts so that your code is to blame as infrequently as possible when something goes wrong (if I understood correctly, anyway). ("Blame" is a technical term introduced by Dimoulas, Findler, Flanagan, and Felleisen, at least if I have the correct initial reference.) As in soft typing, "soft" here means that the contract checker never rejects a program -- it just introduces runtime checks when it can't convince itself of a particular safety property at compile time. This also recalls Rust typestate for me, which had a very similar approach of falling back to runtime verification (actually, in Rust, all typestate assertions were verified at runtime; we thought that would be a simpler approach, and if the feature had persisted, we might have implemented some sort of analysis pass to eliminate some of the dynamic checks). In my copious free time, I'd love to revisit Rust typestate and compare and contrast it with the work presented in these two talks, as well as gradual typing and effect systems, maybe even as a paper or experience report. (Which, of course, would involve me learning about all of those things.) I want to say that Rust typestate did have an analogous notion to blame: it was all about forcing each function to declare its precondition, so that if that precondition was violated at runtime, we knew it was the caller's fault, not the callee's. But I'd like to read the paper to see how much of a role inference plays.

As a much more trivial aside, I really liked that Van Horn used ⚖ as an operator, at least in the slides (as in, C ⚖ M). There should be more Unicode operators in papers! It's 2014; we don't need to limit ourselves to what was built into a 1990s-era version of LaTeX anymore.

In any case, the parts of Van Horn's and Findler's talks I heard made me think "this is the right way to do what we were trying to do with typestate". I want to be sure I believe that, though. I say this because their approach to handling mutation is to statically check any contracts that don't involve assignment -- other contracts revert to runtime checks, but the checks always happen, either statically or dynamically. My memory is hazy, but in the context of Rust, I think we talked about introducing additional precondition checks at each use of a variable involved in a typestate predicate, but quickly decided that would be inefficient. In any case, those two talks made me want to revisit that work, for the first time in a while!

I missed most of Norman Ramsey's talk "On Teaching How to Design Programs as well, but the paper seems worth reading too. Two things I did catch: Norman saying "Purity has all sorts of wonderful effects" (I think in terms of helping students discipline their thinking and avoid just banging on the keyboard until something works, though I don't recall the context), and him making the point that the HTDP approach makes it easier to grade assignments based on how systematic the student's design is, rather than a laundry list of point deductions.

Next, I went to Richard Eisenberg's talk "Safe Zero-Cost Coercions for Haskell". I have painful memories of this line of work dating back to 2007 and 2008, when I was reviving the GHC External Core front-end and had to figure out how to adapt External Core to represent the new System FC type system features, which (to me at the time) seemed to make the Core type system twice as complicated for unclear benefit. (External Core was removed from GHC some years later, alas.) I'm willing to say at least provisionally, though, that the work Eisenberg presented cleans up the coercion story quite a bit. I also appreciated the motivation he gave for introducing coercions into the type system at all, which I hadn't heard formulated quite like this before: you can typecheck System F just using algebraic reasoning, but when you want to introduce coercions (which you do because of GADTs and newtypes), contravariance ruins everything. I think a way to summarize the problem is that you get overlapping instances, only with type families rather than just type classes.

To solve the problem, Eisenberg and colleagues introduce two different equality relations: nominal ~, and structural ~~. This allows the type system to incorporate coercions based both on nominal type equality, and structural type equality, without having to pick just one. Then, each type parameter gets a "role", which can be either "structural" or "nominal". This allows coercion kinds (my nemesis from the External Core days) to just go away -- although to me, it seems like rather than actually taking coercions out of the kind system, this approach just introduces a second kind system that's orthogonal to the traditional one (albeit a very simple kind system). I guess it's possible that separating out concerns into two different kind systems makes the implementation and/or reasoning simpler; also, as far as I can tell, roles are more restricted than kinds in that there's no role polymorphism. (I'm not sure if there's kind polymorphism, either, although there certainly was in GHC at least at some point.) Actually, there are three roles: "nominal" (meaning "this parameter name matters and is not interchangeable with structurally equal types"), "representational" (for a type that is interchangeable with any others that are structurally equal to it), and "phantom" (type parameters that are unused on the right-hand side of a definition). I wrote in my notes "I wonder if this sheds any light on Rust traits", but right now I'm not going to elaborate on that query!

The implications of the work are that generalized newtype deriving now has a safe implementation; the type system makes it possible to only allow unwrapping when the newtype constructor is in scope. (This, too, reminds me of a Rust bug that persisted for a while having to do with "newtype dereferencing".) The results were that the new role system uncovered three legitimate bugs in libraries on Hackage, so that's pretty cool. Also, Phil Wadler asked a question at the end that began with something like, "...here's how Miranda did it..." (Not something one hears a lot!)

Finally, I stayed for François Pottier's talk "Hindley-Milner Elaboration in Applicative Style", which I understood more than I expected to! He began by saying something that I noticed long ago, but originally chalked up to my own stupidity: Algorithm W in its original presentation, was "imperative, and messy". We want a simpler, more declarative formulation of type inference. Pottier claims that conjunctions and equations are simpler than compositions and substitutions -- I agree, but I'm not sure if that's based on something objective or if that's just what works well for my brain. He defines a constraint language that looks like λ-calculus with existential types, which allows constraint solving to be specified based on rewriting. On paper, it's a declarative specification, but the implementation of it is still imperative (for performance reasons). It sounds like it might be fun to prove that the imperative implementation implements the declarative specification, though perhaps he is already doing that!

Stay tuned for my notes on day 3, when I get around to editing them.
tim: A person with multicolored hair holding a sign that says "Binaries Are For Computers" with rainbow-colored letters (binaries)
During this year's ICFP, I took probably more notes than I've taken at any other conference I've gone to. Now some of my notes were silly ideas or random to-do items that would have distracted me if I didn't write them down, but a lot of them were actually about the talks I was listening to, surprisingly enough!

In the interest of posterity, as well as justifying to my employer why it was a good idea for them to pay $3000 for me to go to an academic conference when I'm not a researcher, I'm going to try to summarize those notes here. What follows is my attempt to turn my notes on the first day (September 1) into something half coherent. I'll do a separate post for each day. I will try to link to the video from each talk.

The first talk of the day that I caught was Daniel Schoepe talking about SELinq. Yes, this is LINQ as in LINQ. He (and his coauthors Daniel Hedin and Andrei Sabelfeld) wanted to build on top of what LINQ already does -- making database queries typed -- to annotate types with "public" or "private". This means, probably, exactly what you'd think it would mean in an everyday sort of database application: for example, they applied their work to an example from the PostgreSQL tutorial site and showed that they could implement a rule that in a database of people, demographic info, and addresses, each person's exact address is private -- so queries can get aggregate data about what regions people live in, but a query that tries to look up an individual's street address would be ill-typed. That's really cool!

Schoepe et al.'s work is based on FlowCaml, which is an information flow analysis for OCaml. Crucially, the work relies on embedding the database query language in the underlying programming language, so you can piggyback on the host language's type system. That's cute! It also relies on baking operations like list append into the language, which is a little sad. (In my never-published -- and never-finished -- dissertation proposal, I wanted to explore using a combination of proofs and types to modularize the primitive operations of a language. I wonder if an approach like that would be useful here.)

They proved a soundness theorem that guarantees non-interference, and implemented a source-to-source compiler that generates F# code. Their type inference is conservative, which doesn't violate any intuitions: that is, it's always safe to treat public data as private. In future work, they want to apply it to front-end JS web apps, and in the question and answer session, Schoepe said it shouldn't be hard to generalize the work to arbitrary lattices (not just the one with "public" and "private").

After lunch, Paul Stansifer talked about binding-safe programming. The take-away line from Paul's talk was "Roses are olfactorily equivalent under α-conversion." (This might make more sense if you keep in mind that the name of the system he implemented is "Romeo".) Everybody knows that naming is one of the hardest problems in computer science; Paul presented a type system for naming. This pleases me, since I think nothing makes sense unless it's formulated as a type system. In his system, types track binding information: specifically, in a way that allows names to be shadowed safely. The type keeps track of which "direction" shadowing should go in. The running example was expanding let* (because this is in a Lisp-ish context) into lambdas.

The next talk I took notes on was by Lars Bergstrom, on higher-order inlining. (Paul and Lars are both former colleagues of mine from Mozilla, by the way, which is why I'm referring to them by their first names.) Lars presented an analysis that determines where it's safe to inline higher-order functions. This was interesting to me since I'd always thought of inlining higher-order functions as a very naughty thing to do; the first research papers I ever read, in undergrad, were about inlining, and I did my undergrad and master's thesis work on deforestation (which depends intimately on it), so this is a belief I've held for a long time! Lars showed that it's wrong, so that was cool. The central contribution of his work is an analysis that doesn't have to compare the entire lexical environment for equality. I would have to read the paper to explain why, but Lars said that his work provides principles that replace the bag of heuristics that was the previous state of the art, and for now, I believe him.

It's safe to inline a higher-order function if you know that its environment doesn't change dynamically: that is, that inlining won't change the meaning of the function's free variables. Lars' analysis answers the question "does any control flow path pass through a sub-graph of the control flow graph that constitutes a re-binding?" An interesting thing that Lars didn't say (but perhaps it's not as deep as I think it is) is that this touches on how closures and value capture are sort of a hidden side effect even in a pure, strict functional program. His conclusion was "You can use closures in benchmarks now!"

In the Q&A, I asked whether it was imaginable to prove that the analysis improves performance, or at least doesn't make it worse -- in other words, that the higher-order inlining optimization has a predictable effect on performance. This question has haunted me ever since I worked on type-based deforestation. Lars thought this would be very ambitious because inlining is often an enabler of other optimizations, rather than improving performance on its own; though it does inherently eliminate stack frame allocation and deallocation. He said that he and colleagues want to do a correctness (i.e. semantic preservation) proof, but haven't yet.

My last set of notes for the day was on Jennifer Hackett's talk "Worker/Wrapper Makes It Faster". As Lars said in answer to my question, Jennifer's work answers the question I asked, sort of: it's about proving that optimization really does improve performance. She has a proof strategy based on defining a "precongruence": a relation that's preserved by substitution; this is because the "natural" approach to proving performance improvement, induction based on execution steps, doesn't work for lazy languages. If a relation is a precongruence, intuitively, a local improvement always translates into a global one. I would have to read the paper before I said any more, but I thought this talk was cool because it contributes the first performance guarantee for an optimization for a lazy language.

Stay tuned for my notes on day 2, once I get around to editing them!
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)

Make Functional Programming Better by Supporting the Ada Initiative and Petitioning the ACM

Edited to add: we reached our initial $4096 goal in just 5 hours! Can you help us raise it to $8192 and double what we hoped to raise? Edited again to add: We've now exceeded our goal of $8192, six hours before the end of the challenge! Can you help us bring it up to $10,000?

Donation button
Donate to the Ada Initiative

Clément Delafargue, Adam Foltzer, Eric Merritt, Chung-chieh (Ken) Shan, and I are orchestrating a community challenge to both raise money for the Ada Initiative, and make computer science conferences (specifically, the many technical conferences that the ACM (Association for Computing Machinery) organizes) better. We are challenging anybody who identifies as a member of the functional programming community to do two things:

  1. Donate to the Ada Initiative, a nonprofit organization that is working hard to make it broadly possible for women and people in a variety of other marginalized groups to work in technology.
  2. Call on the ACM to consistently publicize their own anti-harassment policy for all its conferences. That is, I'm asking that those -- at least those of you who use Twitter -- tweet a statement like the following one (use your own words, just include the #lambda4ada hashtag and try to include the donation link):

    I donated to @adainitiative b/c I want @TheOfficialACM events to announce their anti-harassment policy. https://supportada.org?campaign=lambda #lambda4ada

Our goal is to raise $4096 $8192 $10,000 for the Ada Initiative by 5:00 PM Pacific time on Friday, September 19. If you use the URL https://supportada.org?campaign=lambda, your donation will count towards the functional programming community challenge and help us reach the $4096 $8192$10,000 goal. I have personally matched the first $1024 of funds raised -- that is to say, I already donate $80 per month to TAI, so over a year, my contributions will add up to $960. On Tuesday, Sept. 16, I donated an additional $64 to round the amount up to $1024. I've spent the past couple years struggling to pay off student loans and medical bills despite being generously compensated for my work -- nevertheless, I support TAI every month because I see it as an investment in my continued ability to work. I hope that my example inspires those who have a bit more financial freedom than I do to donate accordingly.

If you are reading this and you have benefited from your involvement, past or present, with any part of the functional programming community, we need your support. It is up to you how much to give, but we ask that you consider how much you have gained -- materially, intellectually, socially, perhaps even spiritually -- from what you have learned from functional programming and from the people who love it. Particularly if you are currently making your livelihood in a way that would be impossible without the work of many people who have and are making functional programming languages great, consider giving an amount that is commensurate with the gift you have received from the community. If you need a suggested amount and are employed full-time in industry who is using functional programming or doing work that wouldn't be possible if not for the foundations laid by the FP community, $128 seems pretty reasonable to me -- and at that rate, we would just need a total of 32 people to donate in order to reach the goal. I think there are far more people than that who do FP for a living!

If anybody assumed that Clément, Adam, Eric, or Ken endorsed anything in the remainder of this blog post, that assumption would likely be wrong. In what follows, I am speaking only as myself and for myself. I am an employee of Heroku, a Salesforce company, but neither Heroku nor Salesforce endorses any of the following content either. Likewise, I don't necessarily agree with everything that Ken, Eric, Adam, or Clément might say in support of this challenge; we are all individuals who may disagree with each other about many things, but agree on our common goals of supporting the Ada Initiative and raising awareness about the ACM anti-harassment policy.

If you've already gone ahead and made a donation as well as tweeting your support under #lambda4ada, great! You can stop reading here. If you're not sure yet, though, please read further.

Why ICFP Is Fun... For Some

  • Young man, there's no need to feel down
  • I said young man, put that old journal down
  • And come publish at... I - C - F - P
  • It's fun to publish at... I - C - F - P
  •  
  • When your lambda is tight, and your theorems allright
  • You can come, on, down, and publish at... I - C - F - P
  • You know I'm talking 'bout... I - C - F - P
  •  
  • There's a place you can go, and lots of friends that you know, at the I, C, F, P.

          -- Nathan Whitehead, paying homage to The Village People

ICFP, functional programmers' annual "family reunion" (to borrow a phrase from one of the organizer's of this year's ICFP, which took place two weeks ago) feels to me like more than just an academic conference. The lone academic publication that I can claim (second) authorship for appeared in ICFP, but it's more than just the opportunity to hear about new results or share my own that keeps me coming back. Maybe that has something to do with the affiliated annual programming contest, or the copious number of co-located workshops revolving around different language communities, or maybe it's just about folks who know how to keep the "fun" in functional programming. It's a serious academic conference that occasionally features cosplay and [PDF link] once had an accepted paper that was written in the form of a theatrical play.

Putting The Fun Back in Functional Programming and How the Ada Initiative Is Helping Us Do It )

tim: A warning sign with "Danger" in white, superimposed over a red oval on a black rectangle, above text  "MEN EXPLAINING" (mansplaining)
In 2004, I attended ICFP in Snowbird, Utah. At the time, Paul Graham was on the schedule to give an invited talk entitled "Don't make the wrong mistakes: programming as debugging".

That might have been an interesting talk. The talk Graham actually gave was "storytime with Grandpa about the dot-com bubble" (which was all of three years ago, at the time.) I don't remember much about the talk, which was quite inane. I do remember the quotes I wrote down on LiveJournal at the time, which I approved of (shamefully... but it was ten years ago):

"It's no coincidence that I'm dressed like this... it's to make an important point. The coincidence is that I'm always dressed like this." -- PG
"Nerds dress informally as a prophylactic against stupidity." -- PG
"If you go to Google and search for 'nerd', I'm what you get." -- PG
"If your code miscalculates the path of a space probe, you can't dodge your way out of it by saying that your code is patriotic." -- PG


There is a liberally rewritten transcript of his talk on his web site. It still has nothing to do with the abstract he submitted to ICFP for his talk. (Full text for all you non-ACM-members out there. I'm pretty sure it's short enough to qualify as fair use.)

Anyway, what's not in the liberally rewritten transcript was the bit where, in the Q&A session afterward, someone asked him his opinion of outsourcing. And Graham said -- I'm paraphrasing -- that he thought outsourcing would be a self-limiting trend, because, "You can send things to India all you want, but eventually you realize you have to hire real programmers."

This is notable because while racism is thoroughly shot through Silicon Valley, it's rarely stated that overtly, that unashamedly, and by someone with some degree of social capital.

In any case, I guess Graham was namesearching on a Friday night, since out of nowhere, he replied to a tweet of mine that was about something else, giving me the occasion to post the tweet that is the pinnacle of my career.

Achievement unlocked: being told by Paul Graham that I should be ashamed of myself.
tim: "System Status: Degraded" (degraded)
It's usually a good thing when people talk about ways to increase women's participation in programming communities. I used to be active in the Haskell community, so normally, that the subject came up during the annual "Future of Haskell" discussion at this year's Haskell Symposium would be something for me to cheer about.

Sometimes, men talk about the gender disparity in tech communities as if there's some big mystery. I have to conclude that these guys haven't talked to women who currently work in computer science academia and the tech industry, or who did and then left. As someone who was perceived as a girl or woman doing computer science for 12 years, my solution to the lack of women in tech is:

Stop telling women that they aren't welcome and don't belong.



During the "Future of Haskell" discussion, Doaitse Swierstra (a professor of computer science at the University of Utrecht), suggested that a good way to increase the number of Haskell programmers would be to recruit one woman for every man in the room and that this would be a good thing because it would "make the meetings more attractive".

In other words: he followed a call for more participation by women with exactly the kind of comment that tells women that a space is unsafe for them.

Suggesting that more women would be welcomed at a conference because they would make it "more attractive" is saying that women are valued for how they look, not for what they do. If you've ever heard the words "objectification" or "hypersexualization" and not known what they meant, well, look no further than this comment for an example. And because many women see spaces where they are targets for the male gaze as spaces where they will be targets for more than just men's gazes, it's a comment that carries the underlying message that the computer science conference under discussion is not, in fact, a place where a self-protecting woman ought to be. It's not that Prof. Swierstra said any of this outright, of course. He didn't have to. English-speaking academicians are part of that subset of the world in which everyone comes pre-installed with the cultural programming that means a few words about the "attractiveness" that more women participants would bring to the Haskell Symposium evoke a whole world of stereotypes -- ones that limit women's choices, careers, and lives.

Swierstra's remarks were also potentially alienating to any non-heterosexual men who were present, as they reflected an assumption that he was speaking to an audience of people who found women, and only women, "attractive". Finally, there is a tacit understanding when one talks about "attractive" women that one is talking about women who have cissexual bodies, are thin, aren't disabled, and are in a particular, narrow age range. So apparently, if you're a woman and not all of those descriptors apply to you, maybe you shouldn't think about learning Haskell, as your presence wouldn't make the Haskell Symposium more attractive (to heterosexual men).

So while Prof. Swierstra may have meant no harm -- may indeed have meant to do good by encouraging efforts to increase women's participation in the Haskell community -- what matters is not his intent, but the effect of his words. (Everyone who's ever written code knows that the compiler doesn't care about your intent; extend that to your interactions with other people, and you might find yourself behaving more fairly.) Any women who were in the room for the meeting (and when I have attended it in the past, there have always been at least a few) got the message that if they weren't there to be pretty, why were they there? And any women who watched the video of the discussion (relevant part begins around 32 minutes in) got the message that the Haskell community is a community that tolerates sexism.

When I watched the video, what I heard after Prof. Swierstra's comment about attractiveness was laughter. No one called him out; the discussion moved on. I might be wrong here, but the laughter didn't sound like the nervous laughter of people who have recognized that they've just heard something terrible, but don't know quite what to do about it, either (though I'm sure that was the reaction of some attendees). It sounded like the laughter of people who were amused by something funny.

It would have taken just one person to stand up at that moment and say, "That was sexist and it's not acceptable here." (That person would probably have to be a senior faculty member or researcher, someone of equal rank to Prof. Swierstra; challenging a male, senior researcher is not something a female grad student (or even maybe a male grad student) should be expected to do.) But nobody did. And that's what really disappoints me. Structural sexism persists not because of the few people who do and say blatantly bad things, but because of the majority who tolerate them. People say things like the things Prof. Swierstra said because they are socially rewarded for it: they can get a few laughs. Also, they can display their membership in a high-status group (heterosexual men). Take the reward away, and the comments and actions that exclude go away too.

I expected more from the people who attend the Haskell Symposium. I expected more because for years, I attended ICFP and the Haskell Symposium, and even in the days when I didn't identify as male and didn't usually challenge others' perception of me as a woman, I felt like I was in a community where I belonged when I was there. For the most part, I didn't feel like my perceived gender was called attention to, and I felt like I would be judged based on what I could contribute to a conversation rather than on whether a man would find my appearance pleasing. If my first Haskell Symposium as a twenty-year-old had been in 2012 instead of 2000, I wouldn't have come away with the same impression. And I don't know if I would have gone back.

I'm no longer in the community of people who attend ICFP, and I no longer work on Haskell projects. My academic career ended a year ago when I was told that I couldn't be a grad student if I didn't want to interact with another student I'd witnessed joking about raping a fellow student. I have a job that doesn't involve Haskell, and lack the privilege of having spare time and energy left to do programming projects when I'm done with paying work. There have been days when I've had regrets. Today is not one of them. If I'd continued doing functional programming research, I could have been an agent for change; sexism no longer affects me directly now that folks have to have it spelled out for them that I'm not a cis man. Still, I don't feel like a community that makes somebody feel like it's acceptable to say that women would add "attractiveness" to a professional meeting is a community that I belong in.

If you are a man in this community, please don't feel like you have no power. You actually have a lot of power: you can let people who make these comments know that sexism isn't okay. The Geek Feminism Wiki's "Resources for allies" page is one resource that can help; the wiki also has a page of good sexism comebacks. Some comebacks that might have helped in this situation are: "I don't think that sounds as funny as you want it to sound"; "Who let you think it would be okay to say something like that?"; "Excuse me? / "I'm sorry, I don't quite understand what you're trying to say. Could you state it more plainly?"; "It sounds like you are implying <sexist thing>. I'm sure you don't really think that. <change subject>"; "That was sexist"; and (if used by the moderator) "We're done" and "That was sexist, and that is not acceptable here." Of course, there are others. The most important thing you can do to be an ally is to listen to women, and people who are perceived as women, in your community. Don't lecture people about how to respond to difficulties you haven't faced; simply learn from their own self-reporting of their experiences. Of course, don't demand that others educate you without establishing trust, either.

Countering sexism requires courage and (in Samuel Delany's words) moral stamina. It is work that largely needs to be done by men, since men who tacitly believe that women aren't quite human are hardly going to listen to women's opinions on the subject. For men to do this work, of course, they have to believe that women belong in their communities, that women are more than just attractive bodies, and that their communities will benefit from the inclusion of women -- benefit in ways that are not about aesthetics. Whether from within or without, I hope that the Haskell community will include more men who have this courage and who believe these principles -- whether or not the presence of those men makes the community more attractive.


Addendum: If you're coming here from Reddit, please take the time to read four background pieces that are part of my earlier series of essays "A Problem With Equality": "Power and privilege", "Systems and individuals", "What oppression is", and "Emotional invalidation". Most criticisms of the piece you're reading have already been answered in one of these essays.
tim: Mike Slackernerny thinking "Scientific progress never smelled better" (science)
The International Conference on Functional Programming (ICFP 2010) program
committee is delighted to inform you that your paper #64 has been accepted
to appear in the conference.

Title: A Certified Framework for Compiling and Executing
Garbage-Collected Languages
Authors: Andrew McCreight (Portland State University)
Tim Chevalier (Portland State University)
Andrew Tolmach (Portland State University)


Uh, so, yeah. We're going to Baltimore!!!!111 And for those who didn't know, this is my first academic publication, ten years after attending my first ICFP and nine years after entering grad school for the first time.

Profile

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
Tim Chevalier

November 2021

S M T W T F S
 123456
78 910111213
14151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags