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)
As of September 19th, functional programmers and friends had surpassed not just our initial goal of $4096, but also our first stretch goal of $8192 and second stretch goal of $10,000!

And amazingly, since then, we've raised another $2407 without really trying -- at this writing, we're up to $12,407, most recently thanks to a donation from Simon Peyton Jones. I think Simon deserves a lot of the credit for building the supportive community that I discussed in my initial post about why the Ada Initiative matters to functional programming, so I'm grateful for his support for this challenge.

Donation button

Donate to the Ada Initiative

The Ada Initiative announced their overall fundraising goal: $150,000, which they're currently about $32,000 away from, with 8 days to go:


Donate now



Besides raising money, the other goal of the functional programming challenge was to lobby the ACM to be more uniform about communicating its anti-harassment policy to conference attendees. 31 people (last time I checked) specifically tweeted at [twitter.com profile] TheOfficialACM, although only [twitter.com profile] chrisamaphone had the ingenuity to directly tie it in to what was their most recent tweet at the time:







No reply so far. However, I'm aware that there are other ways besides Twitter to contact the ACM, and I'm in touch with several people who are active in SIGPLAN to discuss next steps.

Note that there have been 686 individual donors so far. Of those, at least 59 donated as part of the functional programming community challenge (including 58 individuals and one company, AlephCloud Systems). That means 8.6% of TAI's total donors for the fall fundraiser donated through the functional programming challenge! (And actually more than that, since the count of 59 only includes people who gave permission for their names to be used on TAI's web site.)

So far, we've donated $12,407 out of a total of $118,469 -- which means 10.5% of TAI's total donations came from the functional programming community! As much as I'd like to think functional programmers make up ten percent of all programmers (and actually, people who donated to TAI also include librarians, hackerspace supporters, people interested in the intersection of science, technology, and culture, and science fiction/fantasy fans, among other people who may or may not be programmers), I know we're a smaller percentage than that. But we're overrepresented among TAI supporters, which is great.

It's not too late to skew the numbers even further, and if you donate $128 or more, you still get an awesome "Not Afraid to Say the F-Word" sticker pack! And if we do reach $16,384 in the next 8 days, our promise to perform "There's No Type Class Like Show Type Class" and put the recording online still stands.

I would also like to thank everybody else who has donated to #lambda4ada so far. This should be a complete list of people who either gave permission for their names to be used, or tweeted (in the latter case, I'm only using Twitter handles). If you donated and are not on the list, but want to be, let me know. If your name is on the list and I've spelled it wrong (or included alongside your Twitter handle), also let me know.

Adam C. Foltzer (lambda4ada co-organizer)
Chung-chieh Shan (lambda4ada co-organizer)
Clément Delafargue (lambda4ada co-organizer)

Aaron Levin / Weird Canada
Aaron Miller
Alejandro Cabrera
AlephCloud Systems
André Arko
Andy Adams-Moran
Ben Blum
[twitter.com profile] bentnib
Bethany Lister
Brent Yorgey
Carlo Angiuli
Chris Martens
Cidney Hamilton
Colin Barrett
Colin Gourlay
Corey "cmr" Richardson
Dan
Dan Licata
Dan Peebles
Daniel Bergey
Daniel Patterson
Daniel Ross
David Smith
David Van Horn
[twitter.com profile] dorchard
Dylan Thurston
Edward Kmett
Ellen Spertus
Eni Mustafaraj
Eric Rasmussen
Eric Sipple
fanf42
Florent Becker
Glenn Willen
Holly M
J. Ian Johnson
Jack Moffitt
James Gary
John Garvin
Jon Sterling
[twitter.com profile] joshbohde
Joshua Dunfield
Justin Bailey
Ken Keiter
Kevin Scaldeferri
[twitter.com profile] kowey
Kristy
Lars Hupel
Levent Erkok
[twitter.com profile] lindsey
Lucas Bradstreet
Lyn Turbak
M Wallace
[twitter.com profile] MaggieLitton
Manuel Chakravarty
Michael Greenberg
Neel Krishnaswami
Pat Hickey
Peter Fogg
Philip Wadler
Prabhakar Ragde
Ryan Wright
[twitter.com profile] shelfuu
[twitter.com profile] simrob
[twitter.com profile] tomburns
wilkie
Will Salz
Wouter Swierstra

Many of the people above tweeted under #lambda4ada to announce that they donated and to lobby the ACM. The following people also tweeted under #lambda4ada in order to pressure the ACM:

[twitter.com profile] atombeast
Conor McBride [twitter.com profile] pigworker

Thank you all -- including those of you who preferred not to be named -- for all you've done so far, including donating, communicating with the ACM, and telling your friends in the functional programming community about the challenge! It makes me so happy.
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!

WE DID IT!

Sep. 19th, 2014 05:03 pm
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
See that number? It has five digits in it.

Donation button

Donate to the Ada Initiative

Comprehensive retrospective and thanks post coming soon once I'm done having all the feels. For now, I just want to thank the last batch of donors from this afternoon (the ones who tweeted and/or gave permission for their names to be used):

[twitter.com profile] alleynoir
Dan Licata
Darin Morrison (edited to add, with permission)
David Smith
Eric Rasmussen
Glenn Willen
Holly M
Lucas Bradstreet
wilkie

As always, if I left out anyone, let me know.

And if you weren't paying attention all week? Now it can be told: if you donate now, the money still goes to exactly the same place :)

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
We've achieved our $8192 goal!!!! But wait, there's more: we're increasing our goal for a second time and are trying to raise $10,000 by 5 PM Pacific time today. (If we raise $16,384, there will be filk singing.)

Donation button

Donate to the Ada Initiative

Thanks to those who donated between 6:00 PM September 18 and 12:15 PM September 19 and gave permission for their names to be used and/or tweeted about it on #lambda4ada:

Aaron Miller
André Arko
Andy Adams-Moran
Dan Licata
[twitter.com profile] dorchard
Eni Mustafaraj
Eric Sipple
Glenn Willen
Justin Bailey
Ken Keiter
Kevin Scaldeferri
Kristy
[twitter.com profile] lindsey
Lyn Turbak
M Wallace
Michael Greenberg
Peter Fogg
Rob Simmons
Ryan Wright
[twitter.com profile] simrob

If your name is not on the list, you've donated, and you'd like it to be, send me an email (catamorphism at gmail).


A thought for today:

On Reddit, user green_mage asked:
"Why ask us to pay for something you don't want to talk about?"

This was in reference to what I said in my initial post:

"I would rather not talk about diversity, inclusion, feminism, gender, race, and sexuality with my colleagues. The difference between me and -- say, the young male graduate student who attended Wouter's Haskell Symposium talk and later tweeted something to the effect that Europe didn't have a good record when it came to distinguishing people based on race and gender -- isn't how interested we are in lambdas, type theory, theorem proving, compilers, or whatever happens to make our synapses light up. We both are. The difference is that I cannot do my job while ignoring the constant drone of small -- and occasionally big -- indignities and violations that make my friends who are also my colleagues sad and, sometimes, drive them out of the field altogether."

I don't want to fix bugs in code. I would much prefer it if my code worked the first time I wrote it, so I could focus on implementing new features. Wouldn't everybody?

I fix bugs anyway. Not just because I get paid to do that -- I'd still do it even if I became independently wealthy and decided to devote the rest of my days to open-source volunteering. The reason I fix bugs is that -- as anyone who's ever used a computer knows, not just programmers -- bugs in software detract from the pleasure and delight that using good software can bring. All the new features in the world don't do much good for someone using my code if it crashes when they try to save a file.

I try to fix bugs in culture for the same reason. That we exclude people who look different from ourselves from our professional cultures -- usually without meaning to -- is a bug in human behavior. We are taught to hold onto our power; that part of the value in who we are and what we do is excluding other people from it. (This is why most women were driven out of computing in the 1960s, when it began to be a professional and profitable occupation.) Exclusion and marginalization, deliberate or accidental, distract attention from the things that unite those of us who like to program in functional languages: beauty, elegance, the Curry-Howard isomorphism.

I don't want to fix bugs. But I do it because it's part of being a programmer. I don't want to do advocacy. But I do it because if I don't, I don't feel like I'm doing my job, either.

I hope this answers green_mage's question.

Donation button

Donate to the Ada Initiative

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
We're on day 3 of 4 in the functional programming community challenge -- we're less than $1000 from our $8192 revised goal! We have exceeded our second goal, $8192, and have increased the goal to $10,000!

Donation button

Donate to the Ada Initiative

Thanks to the people who donated between 3:00 PM September 17 and 6:00 PM September 18 who gave permission for their names to be used and/or tweeted saying that they donated; if your name is not on the list and you donated, then you either didn't give permission, didn't use the ?campaign=lambda URL suffix, or something somewhere got messed up; if so, email me (catamorphism at gmail) and we'll fix it.

AlephCloud Systems -- our first corporate donor! (We'd love more.)
Corey "cmr" Richardson
Eric Kow [twitter.com profile] kowey
Jack Moffitt
Philip Wadler

As well as those who donated earlier, but whose names got left off the first list somehow:

Aaron Tomb [twitter.com profile] atombeast
algebraic affects [twitter.com profile] joshbohde
Bob Atkey [twitter.com profile] bentnib
Maggie Litton [twitter.com profile] MaggieLitton

And finally, thanks to [twitter.com profile] haskellnow, [twitter.com profile] haskellorg, and [twitter.com profile] lambdaladies for help publicizing!

Giving money is a good start, and I hope that at least some people will be moved to collaborate with the Ada Initiative in other ways. In any case, it shouldn't end there. Here are 12 other things that functional programmers who want to support and include women can do:


  1. Know what intersectionality is
    This is tricky to talk about, because TAI and the loosely affiliated Geek Feminism Blog and Geek Feminism Wiki are all run mostly by white people (like me). We all know there's a problem here; we talk about how there's no excuse for companies and open-source communities to be 100% male, yet we're almost 100% white.

    With that said, to be an ally, being open to feminist perspectives isn't enough. Intersectionality, a term coined by Black feminist scholar Patricia Hill Collins, refers to the ways in which membership in multiple oppressed groups is not compositional. That is, a Black woman's experiences (for example) are not merely the result of composing a prototypical white woman's experiences with a prototypical Black man's experiences; rather, multiple marginalizations compose in a more complicated way. When it comes to understanding a concept like intersectionality, functional programmers have an advantage: like intersectional feminists, we are often criticized for using too many long and unfamiliar words. So we should know as well as anyone that sometimes, technical language is necessary for clarity. (Insert pun about intersection types here.)
  2. Attend an Ally Skills workshop

    The Ada Initiative runs workshops that teach men how to better support women in their workplaces and other communities. I participated in the Ally Skills track during this year's AdaCamp in Portland, and I appreciated that it was designed primarily around small-group discussions of hypothetical but realistic scenarios. For a reasonable fee, TAI will hold one at your workplace, and one thing that donations finance is holding them at nonprofit organizations for a reduced cost. You just have to ask.
  3. Listen to women

    When a woman talks about her experiences, and you have never had the experience of being perceived as a woman, try something: assume she is reporting on her own experiences accurately. Almost all the time, your assumption will be correct. But more than that, it's an important skill to be able to temporarily suspend your programmerly desire to find edge cases and point out errors, and just listen. Listening doesn't always mean shutting the heck up, although sometimes that's what's needed too. Rather, active listening means acknowledging that you understand what's being said: you can do this non-verbally (for in-person discussions) or by rephrasing what the person said in different words to indicate your comprehension and validate what she is saying. In light of point 1 about intersectionality, the more intersecting oppressions somebody has, the more important it is to listen to and let them know that you hear them.

    This doesn't mean you have to believe everything all women say all the time. Rather, it means that there are already enough men in the world automatically casting doubt on everything a woman says, and you don't need to be one more. Indicating that you hear what somebody is saying doesn't mean agreeing. It means that for the moment, you prioritize understanding their message ahead of showing off how much you know or how good you are at debates. You can decide offline whether to agree.
  4. Believe women

    But I just said you didn't have to agree! Well, yes, you don't have to, but in a world that bombards more or less all women with gaslighting, believing a woman is a radical act. In particular, if a woman is talking about her experience of harassment or another adverse experience that typically involves men mistreating women when no other men are present, assume she's telling the truth (and if anything, understating how bad it was). You will almost never be wrong if you believe her, and it's better to have a vanishingly low chance of being wrong than to contribute to the systematic psychological torture of women who are honest about their lives.
  5. Help women get heard

    Say you're in a meeting and a woman says something; it's ignored, and 15 minutes later, a man rephrases the same idea and gets praised for it. At that moment, you can speak out by saying, "How does that compare to the idea that [woman's name] proposed?" This is a non-confrontational way to re-center the woman as originator of an idea. In general, if you're in a conversation and other people are steamrolling a woman or women, say something -- you don't have to say "you sexist pigs, why don't you listen to her?" unless you want to, but there are many different ways to indicate that, if nothing else, you heard her.
  6. Hire women

    If you work at a software company and have any influence over hiring, hire women. The same goes if you work at a university, even if the hiring process is a bit more byzantine. In computer science or in software, anybody who is not a cis man is more qualified than an imaginary person who is identical except being a cis man. Isn't that "reverse sexism"? No, for the same reason that it's harder to do a pull-up with 50 pounds of weights strapped to your ankles than without. Give women (as well as people of color, disabled people, trans people, queer people...) credit for the enormous amount of work they've had to do just to be seen as equally competent to a given man who is actually less competent. In functional programming, nobody would do this work just for fame and wealth, because there is very little of that to be had; someone purely interested in a high-paying job or other extrinsic motivators would never choose our field if they also had to deal with others' bias along with the risk of not getting rewarded at all. The people who do persevere do it because they love the work they do, probably more than you do.
  7. Practice your empathy

    If you have lived your entire life in the Western Hemisphere being seen as a white, cis, abled man, you probably have some work to do here. It's not your fault: it's likely that you've rarely been rewarded for taking the perspective of someone unlike yourself, and indeed have been coddled for solipsistic thinking rather than being encouraged to think of others' feelings. Fortunately, empathy is a skill that can be learned. Kronda Adair's talk Expanding Your Empathy (from Open Source Bridge 2013) is one place to start.
  8. Encourage double-blind reviewing

    This one applies to those of you who review for and/or help organize academic conferences. It is documented beyond a shadow of a doubt that innate bias affects decisions about people's work: when evaluators know that a particular article is by somebody with a name they interpret as female, they grade it more harshly than if all of its authors had male-coded names. Most people don't want to exercise bias against women, but they do anyway, subconsciously. Concealing author names during reviewing goes part of the way towards addressing this problem. It's not perfect, but someone claiming that it doesn't reduce bias is making an evidence-free claim.

    Non-academics can try applying this one by having their recruiting team (if they have one) redact names from resumes during the first round of candidate evaluation.
  9. Show fallibility and humility

    This one has to be exercised carefully, but if you are someone with a relatively high amount of power (for example, if you're a white cis man who has a tenure-track or tenured academic position, or are a manager in an industry position), it's helpful to others around you if you say "I don't know" when you don't know, admit mistakes when you are wrong, and acknowledge when you're finding something difficult. Sometimes people underestimate just how much influence they have. If you're white, cis, and male, whether you like it or not, the people around you will tend to believe the things you say. With that increased power comes increased responsibility: to scrupulously distinguish what you believe to be facts from what you know are your opinions.
  10. Volunteer to mentor women

    For example, the GNOME Outreach Program for Women matches promising women getting started in open source with mentors from various projects. This is one of the most direct, personal ways you can help. If you don't work on an open-source project, find out what your company can do in the way of outreach at local schools, or if you're a faculty member, figure out what your department can do to support women in undergrad and graduate CS programs instead of just tallying up your admission numbers and cheerfully declaring diversity a done deal while all the women get constructively dismissed.

    If you do this, though, be prepared to learn as much from your mentee as vice versa.
  11. Try to be kinder than you have to

    I don't mean that you need to be kind to people who are abusing or oppressing you; you don't. What I mean is that you have the affordance of being patient when somebody asks the same beginner question for the nth time on a forum you're on, or when somebody makes a wrong assumption based on their knowledge of a different programming language. It's easy to lose patience with people who don't know as much as you do; I've done it a lot myself. But it takes very little to make somebody give up on a community that is new to them, and I've personally seen that happening with functional programming. When somebody else genuinely seems to be acting in good faith, even if they're confused or seem to be slow on the uptake, just remind yourself that you have a privilege that they lack (knowledge) and give them the benefit of the doubt.
  12. Remember that functional programming is a part of programming, and programming is part of the world.

    You might react to some of these suggestions with, "what does that have to do with functional programming? That happens everywhere." Indeed. Most of these bullet points are not specific to our field. But global problems must be addressed locally, in the community that you're in. The good news is that everything you do to make functional programming a safer field for women, and genderqueer and non-binary, people to be in will also make programming as a whole that much safer, as well as the world as a whole.

Donation button

Donate to the Ada Initiative
Don't forget to tweet to #lambda4ada when you donate! Suggested tweet, though you're encouraged to use your own words:

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

tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
In my initial challenge post, I left the connection between functional programming and the Ada Initiative's mission a bit unclear. I suspected that most people who would already be inclined to listen would already understand what TAI has to do with helping bring more people into functional programming and use their talents fruitfully there.

But on the Haskell subreddit, where a Redditor by the name of LeCoqUser (in reference to the Coq proof assistant, of course) linked to my initial post, one person wrote: "I cannot fathom what this has to do with Haskell or functional programming..." I'm going to give this person the benefit of the doubt and assume they really meant, "What does this have to do with Haskell or functional programming?", and were simply applying a principle that many people like me -- who were socialized by Usenet -- learned: "If you want to know the answer to something, never just ask a question; make a false statement that's designed to get people to answer your real question by correcting you."

And it worked! Here's what I wrote on Reddit. My comment was specific to Haskell because it was on the Haskell subreddit (it's also the community I know the best), but I think what follows applies to all other functional programming language communities too.

Just to clarify why it's on-topic, I'd like to say a little bit more about what the Ada Initiative (TAI) does and how it helps the Haskell community:

  • As has been noted, TAI helps conferences and meetups develop codes of conduct. The ACM anti-harassment policy, which applies to ICFP and other conferences and workshops related to Haskell, is based on TAI's model code of conduct.
  • TAI leads anti-impostor-syndrome workshops for women who want to enter technology. As I tried to explain in my blog post, impostor syndrome is a structural barrier to getting involved in functional programming for many people who otherwise would be interested. Impostor syndrome disproportionally affects women. By helping fight impostor syndrome, one woman at a time, TAI is creating more potential members of the Haskell community.
  • TAI runs AdaCamp, which has a potentially life-changing effect as self-reported by many of the women who have participated -- in terms of building the confidence necessary to participate in tech as a career software developer and/or open-source volunteer. Again, this means more potential Haskell programmers -- there's no sense in losing half the potential audience before they even start.
  • TAI runs Ally Skills workshops, which help men who want to make their tech communities safer for women -- including, I like to think, most of the men reading this -- put their intent into action.

Hopefully that clarifies things, and I hope folks from Reddit will help us reach our new goal of $8192 $10,000! Money talks, and the fact that we've already raised $4320 [edit: $5557] [edit: $8678] from functional programmers in less than a day [edit: two days] [edit: three days] says to me that most of us recognize that TAI's work is both crucial, and not being done by any comparable organization.

Donation button

Donate to the Ada Initiative

Don't forget to tweet to #lambda4ada when you donate! Suggested tweet, though you're encouraged to use your own words:

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

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

Donation button

Donate to the Ada Initiative

Don't forget to tweet to #lambda4ada when you donate! Suggested tweet, though you're encouraged to use your own words:

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



So far, the following people from the functional programming community have donated to the challenge, as well as a number of anonymous donors. If your name appears here, it's because you checked the box that says it's okay for TAI to share your name, for which I thank you as well -- knowing who has donated so far makes it easier for other people to decide whether to donate. If you want to be as cool as these folks, then donate and (optionally) tweet about it!

In addition, I made an additional matching donation of $64 (on top of my usual $80/month), and my fellow challenge organizers Adam Foltzer, Clément Delafargue, and Chung-chieh Shan have donated as well. If your name doesn't appear here, you want it to, and you donated between September 1 and 3:00 PM Pacific Time on September 17, email me at catamorphism at gmail and I'll add it. (If you donated after that, don't worry, I'll be doing more thanks posts!)

In alphabetical order by first name:

Aaron Levin / Weird Canada
Alejandro Cabrera
Ben Blum
Bethany Lister
Carlo Angiuli
Chris Martens
Colin Barrett
Colin Gourlay
Dan
Dan Peebles
Daniel Ross
David Van Horn
Dylan Thurston
Edward Kmett
Florent Becker
J. Ian Johnson
Jon Sterling
Joshua Dunfield
Lars Hupel
Manuel Chakravarty
Pat Hickey
Prabhakar Ragde
Wouter Swierstra

Thanks as well to everybody else who has tweeted under #lambda4ada so far! Keep it up.

To all of you on this list, as well as to the donors who preferred not to be named: thank you! And if you haven't yet donated, you still have until Friday, September 19 at 5 PM for your donation to count towards the challenge. We have more than satisfied our initial $4096 goal, and are trying to raise $8192 by Friday. [Edit: We have raised $8678 and are now aiming for $10,000 before the end of business, Pacific time, on Friday!] What's more, if we raise $16,384, then the four of us will record a version of "There's No Type Class Like Show Type Class" and share it with the world. We appreciate your past and incoming donations, tweets, and blog posts!
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
I'm happy to report that the community challenge has raised $4394 for the Ada Initiative as of this writing, passing the $4096 mark just five hours after the first blog post. Thanks to Adam, Clément, Ken, and everyone who has donated so far!

Since leaving our friends who were just getting ready for bed when the original blog post went live wouldn't be nice, we're increasing the goal to $8192. If we raised more than $4096 on the first day, can we raise a little less than that with three days to go? I think so!

[Edited to add: With 6 hours left, we've raised $8678 and are aiming for $10,000!]

Donation button

Donate to the Ada Initiative
But that's not all! We're adding a stretch goal: if we raise $16,384, then Adam, Clément, Ken, and I will record Ken's classic filk "There's No Type Class Like Show Type Class" and post the recording on YouTube (or another video sharing site of our choice), illustrated by some informative graphics explaining topics like "polymorphic recursion" that the song mentions. We are putting our mouths where your money is. Tell your friends! Tell your colleagues! Tell everyone who doesn't wish you any specific harm!

Remember: donate, then tweet:


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


I'd love to link to more blog posts from folks writing about why the Ada Initiative's work is needed, and why our conferences need strong and clearly advertised anti-harassment policies. Just drop me a line (full contact details in my original post).

Still no response (as of this writing) from [twitter.com profile] TheOfficialACM after 15 mentions -- maybe 15 more will do the trick?
tim: Tim with short hair, smiling, wearing a black jacket over a white T-shirt (Default)
The following is a guest post from Adam Foltzer ([twitter.com profile] acfoltzer).

Our Challenge

Donation button
Donate to the Ada Initiative

This fall, I'm joining with Tim Chevalier, Clément Delafargue, Eric Merritt, and Chung-chieh (Ken) Shan to challenge the functional programming community to help make computer science conferences more welcoming to more people. We have two goals:

  1. Support the work of the Ada Initiative by donating $4096 $8192 by 5pm Pacific time on Friday, September 19th. Use and share the URL https://adainitiative.org/donate/?campaign=lambda so that we functional programmers may be counted!

    (Edited to add: We reached our initial $4096 goal at 1:15 PM Pacific time on Tuesday the 16th, so we are now aiming to raise $8192 by Friday!)
  2. Call on the ACM to definitively support and publicize their anti-harassment policy for their conferences. If you're on Twitter, tweet @TheOfficialACM with the hashtag #lambda4ada with something like:

I donated to @adainitiative because I want @TheOfficialACM to stand behind their anti-harassment policy https://adainitiative.org/donate/?campaign=lambda #lambda4ada

Being part of the functional programming community has been an incredibly valuable and rewarding part of my life. Much as Tim says in his post, conferences like ICFP offer a wonderful recurring dose of friendship, support, and belonging.

However, conferences like this are not necessarily as welcoming to folks who aren't white, cis, hetero, well-off men like me. This isn't usually due to any overtly toxic behaviors as in other communities (hi, fellow atheist gamers!), but due to a combination of incidental condescension, microaggressions, and other subtle ways that often well-meaning people can exclude those who aren't already part of the in-crowd. We can push back against these exclusions by supporting the work of the Ada Initiative and making sure ACM stands behind their anti-harassment policy.

In the last year I have become a member of the Haskell.org committee, donating my time to help improve our community, but I am under no illusions that the balance is equal. Because of functional programming, I have a career so cool I could not have imagined it, I have friendships of great depth and strength, and I have the privilege of constant learning as we discover and invent together every day. Laying down this challenge is part of what I can do to repay this debt, and I hope you will do the same.

The Ada Initiative does important work supporting women in a broad range of technology fields through the development of codes of conduct, anti-harassment policies, advocacy, and education. Their model anti-harassment policy is the basis for the ACM's, and their work informs much of what we are working on in the Haskell.org committee to improve the inclusiveness of Haskell specifically.

The Ada Initiative does valuable work worth supporting. Every month I donate $32, and for this challenge will be donating an additional $128. Join me in reaching for that $4096$8192 goal (powers of two, y'all!): https://adainitiative.org/donate/?campaign=lambda

The ACM has done well to adopt an anti-harassment policy, but to have impact it must be consistently supported and publicized along with their conferences. Join me in calling on them to do so:

I donated to @adainitiative because I want @TheOfficialACM to stand behind their anti-harassment policy https://adainitiative.org/donate/?campaign=lambda #lambda4ada

And finally, as a functional programmer, you probably know at least 5 other people who have benefited from being part of such a weird and delightful community. Pass this challenge along to them and give them the chance to help us reach our goals. Let's make it happen!

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: "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.

Profile

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

October 2014

S M T W T F S
    1234
56 7891011
1213 1415161718
19202122232425
262728293031 

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags