"Research languages seem to focus on only one question. Rust focuses on ownership types. I'm not sure if they're useful or not. They 'deform the code' and I don't know whether it's worth it."
It amuses me to see people looking at Rust and concluding that it focuses on ownership types, because when I started working on Rust, less than two years ago, it didn't have ownership types at all. When I started on the Rust team as an intern, I thought that Rust was centrally about investigating the usefulness of typestate. (In Rust, typestate was a system of assertions that were visible to the typechecker but relied on dynamic checks for soundness. We removed it long ago.)
But later, the team decided to get rid of typestate, and add ownership types. I think the decision to add ownership types happened during the three months in between the end of my internship and the start of my full-time employment at Mozilla, and I didn't pay a lot of attention while I was on leave. But, my understanding is that the decision got made not because anybody said "I really want to do research on ownership types", but because all of the other options had been exhausted. Way, way back in the day, Rust had neither automatic GC nor ownership types. It only had automatic reference counting (that the compiler manages for you), which necessitated a cycle collector that never quite got finished. But ref-counting everything just added too much overheard. Everyone figured that GCing everything would also add too much overheard. So that left what's known in the programing languages literature as "regions", though we've come to call them "lifetimes" instead.
Also, calling Rust a research language is funny to me because -- as its name reflects -- we've tried hard to avoid incorporating new technology into it. We haven't always succeeded at failing to be novel, but we have a rule of thumb of not including any ideas in the language that are new as of the past ten years of programming language research. The field of programming language is full of old technology that hasn't been put to use in solving problems that it's exactly suited for. The goals with Rust were to avoid reinventing wheels, and see what the past had to teach us. I can't blame anyone for thinking Rust is a research language, though, since it is being developed by Mozilla Research.
But anyway, back to ownership types. Sometimes, people new to Rust say that having three different sorts of pointers is complicated, and do we really need to have that? There was a recent thread on the rust-dev mailing list about whether Rust's syntax is "intimidating" for newcomers, and a large part of that discussion was about the syntax for ownership types. Part of the source of the original confusion had to do with explicit type declarations that weren't really necessary, that were only present to work around a bug in the compiler (that got fixed later). It's hard to say much more without an example, so here is one.
Radical transparency: Nexus card interview
Feb. 1st, 2013 11:07 amI applied online back in August, and eventually (they don't send notifications so I had to do this by manually polling the web site online) was invited to appear in person to interview for the card. The only locations where you can do this are near the border, so for me, the closest location was Seattle. The soonest appointment was February 1, 2013; later I tried to see if I can change it as a different date might have been more convenient, but I was offered June as the next available appointment, so I decided to keep it February.
Lesson number 1: if you're applying for a card in Seattle, Sea-Tac is *not* the place to go! I read it quickly, thought "oh, the Seattle airport", booked a hotel near Sea-Tac for the night before, and... the night before, realized my appointment was actually at Boeing Field/King County International Airport (which is also, by the way, a 20-minute walk from the nearest public transit stop). This isn't an issue if (unlike me) you have reading comprehension skills, but don't go to SEA, go to Boeing Field.
I arrived 15 minutes early or so for my appointment, but basically as soon as I sat down in the waiting area, the DHS agent showed up and offered to take my passport and driver's license so she could pull up my file. After a few minutes she came back and brought me inside for the interview. She was very quick and efficient. I had worried about getting asked weird questions relating to the fact that I had two previous legal names, both of which connote a gender that I'm not, but she just asked me to verify that I'd used those names before and I said yes; no comments or weird looks or anything. So that was professional of her, and should hopefully reassure any of you who are trans if you were thinking about applying.
She asked me if I'd ever been arrested, ever been turned away from the border, ever had a DUI, or ever had to go before a judge. I said no to all of them, but more about that later. She explained very briefly how the Nexus and PreCheck programs worked and then took a digital scan of my fingerprints (all ten fingers! Serious business. No toes, though.)
I was told to bring a print-out of my "conditional approval" letter inviting me to apply, so I did, and was never asked for it. It turns out that I also didn't need my car registration, which I brought; being a US citizen, I also didn't need any proof that I live at the address that I claim. (My driver's license and passport were apparently sufficient.) I had been told I would need the car registration if I wanted to cross the border in my car, but the agent said that was outdated info, and I would now be able to cross the border in any car so long as every occupant of the car had a Nexus card.
Then she escorted me outside to wait for the Canadian border agent, who came out to greet me within a few minutes. The Canadian agent was much less friendly. He asked me where I work and for a business card (which I knew to bring, so I had one ready) -- so, if you have business cards, bring them! He asked me why I wanted a Nexus card in sort of a skeptical way -- I explained I was going to Vancouver for job training for about two and a half months, and he ended up asking me a lot of questions about that. So he said "but why do you want a card if you're just going once" and I said I might go to Seattle a few times for weekends to visit friends, which is true, and also that I wanted to use PreCheck lines within the US. He said "but you don't fly!" so I guess they know that? I didn't want to get into the whole "I'm trans and I don't like being groped" thing so I said that I'd been driving and taking the train more because of security lines, and if I was able to get through security quicker, I would fly more (which certainly wasn't a lie, just incomplete).
Then he asked me the same questions about arrests, courts, etc. that the US agent did, but when I said I hadn't been to court, he said, "are you sure?" I said, "Well, I had to go to court a month ago to sue my landlord," and he said, "is that all?" "Well I had a few traffic tickets around 2005, but they were dismissed." "Is that all?" "Well, I also had a misdemeanor around that same time where I had to appear before the judge, but the charges got dropped." "And what was it?" "Hitting a car in a parking lot and leaving the scene. The case got dismissed." "Anything else?" "Yeah, I changed my name, so I had to go to court for that." I said that was really all and he was more or less satisfied at that point. (I don't know what he was seeing in the records.) I'm pretty sure I wasn't forgetting anything! Anyway, the lesson learned here is to say everything in response to this question. I thought at first I didn't need to mention stuff that was dismissed, but I guess it doesn't hurt to say so.
He asked me if I had a letter explaining what the purpose of my training visit was, and I said yes, but only on my laptop (I hadn't thought to print it out since the copy that got shared with me was still a draft) and I tried to pull it up on the screen, but wasn't able to because it was in Google Docs and I didn't have a wifi connection. So, another lesson learned: I should have printed out the letter. I tried to avoid giving too many details about my work visit since the administrative people at my work are still dotting the t's and crossing the i's at this point -- basically just saying that I had been informed by the legal team at work that I wasn't going to need a work visa given the length and nature of the visit -- but he did ask a fair amount of questions about it.
Then he told me that based on the interview, I was eligible, and should be receiving the card in the mail within 5-8 days. The unfortunate part, which I didn't know, is that the US DHS offices don't have the machine to scan your irises; you have to go to Canada to do that. So I'll have to make *another* trip to Vancouver (or, I guess, just do it when I get there for work) to get my irises scanned, which I need to do if I want to use the card at airports (I won't need it if I'm crossing the border overland, but I'm not sure yet if I'm going to drive or fly there for my work visit).
I was not asked whether I'd ever used recreational drugs; based on googling other people's experiences, and also on the security clearance application that I once filled out (which never got processed since I quit the job that required it), I thought that might be a question that would come up. But it didn't -- the only legal things that got asked about were DUIs, arrests, court appearances, and being refused entry to a country.
I also think it was a good decision on my part that I decided to wear my "Stop AIDS Project / Department of Homoland Security" T-shirt yesterday and not today. (I wasn't sure what to wear, but ended up going with an incompetently-ironed (by me) button-down shirt and black khakis, no tie. That seemed to be okay.)
I guess it might seem funny that I was willing to put up with all sorts of indirect privacy invasion in order to buy myself a chance of getting out of the direct privacy invasion of having a government contractor feel up my crotchal area. I feel like it makes sense, though (as a compromise in the horrible society we live in) because I'm privileged enough to have very little to hide (from an illegal-activity point of view); on the other hand, having a cis stranger discover unexpectedly that I have a transsexual body puts me at risk. It's not the same kind of risk that a woman with a transsexual body would undergo in that situation, but it's a risk nonetheless, and one that I claim agency in doing what I can to avoid.
(And also, because I haven't mentioned this: yeah, I'm going to be in Vancouver for about 10 weeks, starting this March 11! I'll be working at the Mozilla Vancouver office and learning about linkers, profiling, build systems, debuggers, and other awesome topics from the one and only Graydon.)
TMI: Pull requests
Jan. 23rd, 2013 07:53 pmIt's hard to know what to write today, since it seems like I spent most of the day merging pull requests. Or trying to. Merging a pull request: if it looks OK from reading it on github, and it merges cleanly, I just click merge. If I'm worried, I pull it as a new branch and run the testsuite on my machine. Several times today, a test failed, which means someone didn't run the full testsuite (understandable since it can take an hour...) or else there was a conflict between their code and another recent change. I decided today I really wanted to clear out pull requests, so I would fix things myself instead of asking the submitter to fix the problem and submit a new pull request. I am particularly proud of merging this library fix, for which I had to read the comments several times just to figure out what was needed. (I blame sleep deprivation, not the commenters.)
Also, I worked a little bit on this bug relating to our syntactic sugar for for loops. The syntactic sugar is very nice, but in this case it leads to a confusing error message that takes some thought as to how to get straight (due to the baroqueness of our for construct).
People tell computers to do things by writing words. To make it easier, they come up with different "word sets" for the computer. There are word-sets that are built into computers, which we say are "low". And there are word-sets that people use to tell the computer what to do, which we say are "high". I work on one of the high word-sets.
One of the things that happens when people tell computers what to do is that people can get confused. Then, the computer does the wrong thing. When that happens, cars might not want to stop, or an up-goer could burst into fire. To make people less confused, a high word-set can have "types". A typed word-set doesn't let you put one sort of thing where a different sort of thing is supposed to go. We say a typed word-set is "safe" if someone showed that if your words use types the right way, then your words will do the thing they stand for and the computer won't get stuck trying to do it.
When people tell computers what to do, they usually want the computer to do it quickly. Some of the high word-sets are safe, but not so good for making computers go fast, because the words in them are very different from the low word-set that the computer uses. Other word-sets are very close to the low word-set, but they make it easier to get confused when you're writing words. The word-set I work on makes it easy to tell the computer to do things quickly, and also easy to be less confused while using it.
Finally, a computer you buy now is usually made of lots of little computers. It's hard to think about what all of the little computers should do at the same time, because you only have one brain to think with. One way to think about telling all the little computers to do is to stop them from sharing memory with each other. Instead, you can make them talk to each other by sending notes to each other. The word-set I work on lets you use this "note-passing" way of getting all the computers to do work at the same time.
How do we turn the words we write into things a computer can actually do? The answer is that we write more words to tell the computer how to turn words from our high word-set into words from the computer's low word-sets. Those words we write help the computer turn a few big words into a lot of small words. I work on one of those "computer-help things" for our high word-set. I fix parts of it where people got confused before, and sometimes I help change it to handle new and different words.
I'll just make one observation here: "computer" is in the corpus, but "language" isn't.
TMI: Progress (and preservation)
Jan. 18th, 2013 09:15 pmI've been working on these two minor bugs for way too long. I guess #3979 isn't all *that* minor, though. It was an aspect of the interaction between default methods and supertraits that was left incomplete -- fixing it required some thought. I wasn't sure at first what was already implemented. It turned out supertraits weren't transitive, plus there was no way to figure out in the compiler what the impl is of a given trait for a given type. It was really easy to make the coherence checking pass spit out a table mapping trait IDs to tables mapping types to impls -- the rest wasn't too bad (except for a hairy bit of code in ty that computes the transitive supertraits for a given list of trait bounds).
I didn't spend as much time on #3860, which involved borrowck and trans having divergent notions of which nodes in the AST introduced new scopes. My first solution was to change trans to introduce a new scope for each statement, because that seemed easier. Unfortunately, this meant creating lots of extra basic blocks and it was a performance loss. So it looked like it would make more sense to change borrowck, which is a static analysis so that's not going to directly mess up performance. My fix is kind of awkward (and best understood by looking at the code), but it works.
I still have more time to make up by working over the weekend, so there's no rest for the weary.
Nonprofit suggestions
Jan. 16th, 2013 06:18 pmSince so many people are hounded to death by the US "justice" system and are sent to jail for no good reason -- nerds just don't tend to care since most of them are poor and are people of color -- my friend and I were both thinking that donating to groups working to change that would be appropriate. I was thinking of the TGI Justice Project first and foremost, since they focus on trans women of color in the prison system. Off the top of my head, I also thought of supporting groups working on legalizing drugs and on legalizing sex work and advocacy for sex workers. I'm less knowledgeable about what groups are most effective (and most representative of the people who need representation most) in those areas. Do you have suggestions, Internets? Post them here!
So now I'm pulling out all my bad-copy fixes so I can just finish the fix for #3979, commit it, and then get to the bad copies. You'd think I'd have learned in third grade to only work on one thing at a time, but I didn't go to third grade.
I also finished my fix for #3860, and tested it, but have to do some cleanup before I submit a pull request. #3860 was a bug having to do with borrowck and trans (codegen) being inconsistent with each other, so fixing either one could address the problem. trans looked easier to change, so I changed it, but my change resulted in inserting lots more LLVM basic blocks, which turned out to be a performance regression. Changing borrowck really makes more sense since it's just refactoring a static analysis pass and shouldn't have any runtime effect, but I was afraid to touch the borrowck code before. I put aside my fear and implemented a mildly ugly hack (keeping a separate table for trans to use that gives borrowed pointers less-precise lifetimes, meaning trans doesn't have to assume a given statement has a scope attached to it), which worked. The part I have to clean up is making borrowck compute the table of which node IDs refer to statements -- rather than having region inference do it and pass it to borrowck -- which is totally straightforward.
TMI: Bad copies
Jan. 11th, 2013 09:02 pmTo give some more context, Rust has three different kinds of pointers: ~, pronounced "owned", @, pronounced "managed", and &, pronounced borrowed. So ~int is an owned pointer to a machine int; @int is a managed pointer to a machine int; and &int is a borrowed pointer to a machine int. @ pointers are garbage-collected and can be freely copied, while ~ pointers are guaranteed by the type system to always have a single "owner", meaning they can be freed at the end of the scope associated with the owner. Owned pointers can be "borrowed" as long as the span of time of the borrow can be statically guaranteed to be a sub-interval of the owner's lifetime.
Pushing so much of the memory model into the type system lets you program in Rust in a way that lets you relax and know that the typechecker will likely catch mistakes involving undesired copying. By declaring data as type ~T for any type T, you're saying you don't want it to be copied (unless you really mean to). But when you don't care whether your pointers get copied or not, you can use @T and copy to your heart's content.
Strings and vectors also come in three flavors, just like the ones for pointers.
I think this is all totally neato, but it was added to Rust fairly late in the language's history. So in the Rust compiler, there's lots of awkward code that copies stuff around for no good reason, except the historical reasons that for a while, there was only a ~str type (and in truth, @str still isn't well-supported); and also, references (borrowed pointers) weren't first-class in the past. Now that these restrictions have been lifted, it should be straightforward to update the code to pass non-copyable types by reference and to use @-vectors and @-strings for references that we don't mind copying. Still, it's easy to make one change and find that if you propagate changes naïvely, you're changing one of the most basic data types in the compiler (I found this out when inadvertently, a consequence of a change I made was changing idents to @strs. I backed that out pretty quick).
I finally got to a set of changes that still has a few copies, but less than where I started. Hopefully I've learned something from this adventure and will be able to progress more quickly later on.
TMI: git-bisect wins
Jan. 10th, 2013 10:03 pmOtherwise: bug triage. It's a thing.
TMI: Fun with default methods
Jan. 7th, 2013 07:58 pmBoth issues involve default methods, which are a new feature that's not quite baked yet (so much so that for 0.5, we turned it off by default). #3563 had a couple of test cases attached; in the simplest one, calling a non-existent method on self inside a default method would cause an internal compiler error during typechecking. This turns out to be because the typechecker assumes that anything with the type self is the value self (a special name that refers to the self object inside either an implementation of a trait, or a default method in a trait). The simplest fix for this I could see was to treat self as if it has dynamic scope, just for typechecking purposes. That is, instead of throwing away the self ID from the enclosing scope when typechecking a nested closure, keep the same one, so closures inside default methods can refer to self. This seems a little bit dirty (as if it might enable out-of-scope uses of self), but I *think* it's okay because in the Rust compiler, name resolution is a separate pass from typechecking, and happens first. So if you tried to do something fishy with self, resolve would catch it before typechecking ever happened.
Issue 3979 showed that you couldn't call a supertrait method inside a default method. After quite a bit of fumbling, I fixed the test case shown in the issue report, but while working on it I noted to myself that I should check at least two more cases (supertraits with type parameters, and the case where you define the traits in a separate crate from the impls of them). Once I wrote those two test cases and ran them, it turned out neither of them works. So I can't submit this one quite yet (in good conscience).
TMI: A not-very-informative update
Jan. 4th, 2013 10:11 pmOtherwise, I tried to work on some bugs involving default methods, which more or less result from default methods just not being finished. They are no more finished as of today than they were yesterday, but maybe Monday.
TMI: Prioritization
Jan. 2nd, 2013 12:47 pmBack in November (or something), I decided that the best way to address pattern reform would be to make `let` and `match` share the same codegen path. I thought this would be easy, but it wasn't. Over a month later, I was still working on it. I gave up in frustration when we were getting close to the 0.5 release and I decided to work on blockers instead. So that meant I didn't finish pattern reform.
I sort of finished labeled break and continue, but there's still a bug open on labeled break not working from inside a `for` loop. I don't consider this a huge failure on my part. We implemented labeled break and continue for a very specific reason, which doesn't seem to require labeled break from inside a `for` anyway. From a "no arbitrary restrictions" language-design point of view, it would be good if it worked, but I don't see it as urgent. (The reason why it's hard is that Rust effectively implements `for` loops by desugaring into a call to a higher-order function. So a `break` out of a `for` loop actually jumps to a different stack frame -- hence, involves a `return` -- as opposed to a `break` out of a `while` or `loop` (infinite loop), which is really just a `goto`. The back-end has special cases to handle the unlabeled-`break` case, but I didn't understand the code well enough to extend it to labeled `break`s.) (Also, don't take the word "desugaring" there too literally, since the Rust compiler -- surprisingly for me as an ex-GHC-hacker -- preserves the AST in almost the same shape all the way down to codegen, keeping many higher-level constructs intact.)
Going back to pattern reform, one of the things that was hard about the refactoring I was doing was the need to account for where "cleanups" get introduced. At least right now, Rust uses a combination of automatic reference counting, and "owned" and "borrowed" pointers that don't require reference counting, to manage memory. There is a GC, but it's a last resort. So the codegen has a lot of very fiddly code that inserts "cleanups" that free up memory when the refcount of a shared pointer goes to zero or when an owned pointer's lifetime ends. If you get this code wrong, you get memory leaks, dangling pointers, or both, as I discovered many times. The codegen pass contains any number of undocumented invariants about where the cleanups have to go and when it's safe to cancel them or leave them out. Every time I thought I understood how it worked, I would discover one more case where I didn't understand. There's been some talk of getting rid of reference counting, but in the meantime I'm kind of disappointed in myself that I wasn't more aggressive about pursuing answers (either by reading code or trying to ask questions of the people who wrote it).
I've been wanting to spend some of my time extensively documenting trans (and the rest of the Rust compiler), but that's hard to do without understanding the code in the first place! Lack of documentation shuts out new contributors, especially new contributors who don't feel socially comfortable just jumping into IRC and asking questions. If *I* often feel uncomfortable asking questions about code, as someone who's been working on the Rust project for almost two years and knows everyone else on the core team, what would it be like for an outsider, especially one who isn't a middle-class white English-speaking guy like most of us on the core team?
So that's a summary of my last few months. For the new year, at least as of yet, my calendar seems to be wide open!
One Year at Mozilla
Jan. 2nd, 2013 12:35 pmThis year was full of more heartbreak, fury, grief, and difficulty than I would have ever expected to experience in conjunction with a job. On the other hand, working with the Rust team has been as much of a pleasure and a joy as I can imagine any compiler engineering job being. There's a change that I'm hoping to make happen early this year that I'm hoping will help me contribute more fully, but in the meantime, I'm just taking a moment to remind myself that I made it. Especially after how I got pushed out of grad school, it's been a relief to work with people who support me. Thanks to Dave, Graydon, Patrick, Brian, Niko, Alon, Donovan, Andrew, Jesse, Lukas, Christie, and everyone I'm forgetting about for the laughs/lunch companionship/collaboration/help/advice/IRC conversations/etc. Also thanks to the summer interns -- Lindsey, Paul, Eric, Brian, Sully, Ben, Margaret, Stephen, Elliott, and (again) everyone else I'm forgetting -- for bringing needed enlivenment to the office :-D
Impostor Syndrome: Part 4 of 4
Jan. 1st, 2013 11:25 amConclusions
At this point, I know someone will ask: "what could computer science departments do differently?" Well, more involved advising and mentoring would be a great start! That is, it isn't enough for an advisor to just say "come by if there's anything you need", because if you have impostor syndrome, you may not know what you need and you certainly won't want to admit that you need help. What if departments expected advisors to be ready to support all grad students, not just the ones who look exactly like themselves? This isn't to say that every faculty member can or should try to be an expert on every identity, but knowing what they do and don't know would be a start. Any outright acknowledgment of impostor syndrome would be a great start too. At Berkeley, there was nobody who stood up and said that most of the time when people look like they know what they're doing, they don't. I'm not sure I would have believed it even if they'd said it. Oh, sure, other people might be fumbling, but not as fumbling as me. We did have a required class on teaching techniques at Berkeley, since all grad students were required to TA for at least one semester -- in my head, I called the class "Geek Support Group", but it was actually really helpful because it was one time during the day when we got to put aside the pretense that we were all rational beings made of pure logic. So maybe a required class on how to be a grad student would have been helpful (required because I suspect the very people who needed it the most would have brushed it off if it was optional.)Encouraging socialization in a way that includes everyone would also be helpful. Of course, most departments already have social events. In my department at Berkeley, when I was there, the CS grad students' group organized a weekly reception. However, faculty members rarely attended; the professor who I saw there most frequently seemed to stay just long enough to snag some free food. I was part of the CS grad students' group at Portland State, and over time, students stopped attending our events, even when we offered free food; it's not clear why. In contrast, in my ex-partner's department at Berkeley -- mathematics -- the department had a tea/coffee hour every afternoon, which a department assistant organized (the job wasn't pushed onto students) and was very well-attended by both students and faculty. Just having social events is not a be-all and end-all, since some students won't feel comfortable in large groups and some people always get left out, but it's a start. Of course, offering free food can help, and provides an excuse to go for someone who is reluctant to socialize.
( Read more... )
Impostor Syndrome: Part 3 of 4
Dec. 31st, 2012 02:41 pmSelf-Deportation
When a department admits students from "minority groups" but doesn't do anything to address impostor syndrome, how different is that from categorically rejecting everyone who isn't a het cis able-bodied white man from an middle- to upper-class background? This way, the administration gets to boost their diversity numbers and gets plausible deniability when those students (as it were) "self-deport". "We tried to admit women and students of color, but they just didn't like it here! They must just not be interested in science." As if interests are developed in social isolation and don't depend on a network of social support telling you -- implicitly, usually -- that you belong. It's not as if everyone who's in a minority group experiences impostor syndrome, but the experience of someone who gets treated like they belong and someone who doesn't is so different that I don't think it's too strong to say "you might as well just reject everyone". I also don't mean to say that diversity decisions always get made in bad faith, but I've had some personal experiences that make it difficult for me to believe that there is any genuine institutional commitment to diversity at the universities I've attended.In my experience, it seems that being told you're welcome and that you belong is sort of like water if you're a fish: when you have it, you don't notice it. It's only when these things are absent that you do notice. I blamed myself for their absence, because that's what I've always been taught to do. I attributed my failure at Berkeley to my own incompetence, and it didn't occur to me until years later to think about how my environment contributed to my failure to thrive there. I got ignored. The other grad students in my group and cohort socialized with each other; I just got left out. Since I was being perceived as female at the time, I think this had something to do with the fact that I was perceived as not a peer (because I wasn't male) and not sexually available (since I was married) -- therefore, to most of my fellow students, I was useless.
( Read more... )
Impostor Syndrome: Part 2 of 4
Dec. 30th, 2012 12:48 pmBerkeley 2001-2003
"it's cool to discover someoneit's hard to support them
everyone is playing life
like it's some stupid sport"
-- Ani DiFranco
As for most new Ph.D students in the US, my first year at Berkeley consisted mostly of coursework, and that was what I was used to, so for the most part it went smoothly. At the end of the year, it should have been a warning sign when nobody wanted to be my advisor. One professor I talked to -- the one I'd mentioned in my statement of purpose as who I wanted to work with, and who encouraged me to come to Berkeley when I visited during prospective student day -- said "no" outright, saying he wasn't interested in what I wanted to study (functional programming languages). Another one didn't say no, but had a reputation of being someone who didn't answer email; I was hoping for someone who actually seemed interested in having a student. I ruled out two more professors who seemed close to retirement, and one more because she did scientific computing and that pushed my "I went to a liberal arts school and don't know anything" buttons too much. I ended up with an advisor who told me he was willing to advise me, but given what I was interested in doing, he wasn't going to be very involved and he would basically just be there to sign paperwork. At the time, I thought that was fine. Remember, I didn't like talking to people. I thought I would just work on my own, and that would be easy. Easier than getting up the courage to talk to somebody, anyway.
Later on, I saw it as a personal mistake to have chosen this advisor rather than looking harder for a more involved advisor, or even changing research areas. But part of why I made that decision was structural. I was socially shut out, as I'll discuss, which meant that I wasn't getting any tacit knowledge that would have helped me understand that I did need an advisor who was involved. I know this is a structural factor and not a personal issue because Barbara Lovitts talks about it in her book Leaving the Ivory Tower. That is, she discovered that a major component of grad students' success or failure is the extent to which they can use informal social networks to attain the tacit knowledge that's essential to completing almost any graduate program; faculty and staff rarely communicate this knowledge to students in any systematic way. Official lists of graduation requirements stick to course requirements and the specifications for what constitutes a dissertation -- they don't talk about the unofficial things, like having an advisor you can work with (and who has time for you) and which advisors are likely to be compatible with which kinds of people. Thus, people who find themselves misfits and outsiders in the (figurative) lunchroom in any particular department tend to get pushed out, even if they're just as able as the insiders to complete the academic requirements.
So here's where my impostor syndrome really began. ( Read more... )
Impostor Syndrome: Part 1 of 4
Dec. 29th, 2012 06:10 pm"Compare the best of their days
With the worst of your days
You won't win..."
-- Morrissey
I can't remember exactly when I first encountered the term "impostor syndrome", but I know I was less than ten years old at the time, and I know where I read about it: a book called The Gifted Kid's Survival Guide. I don't think it made much of a mark on me. And knowing what it was early on didn't stop me from developing it later.
This essay is about my experiences with impostor syndrome. One of the reasons why I want to talk about these experiences is that I had them while most people in the world were seeing me as female, though I'm not female. Sometimes people tell me that my experiences are un-representative (of, I guess, anyone except me), but I think they're wrong. My experiences represent those of one person who spent 26 years moving through the world while generally being perceived to be female, albeit (often) gender-non-conforming. I say this not to lay claim to any sort of female socialization, which I didn't have; or to deny that I have male privilege (and probably had some even before I knew I was male); but because if I can say something that helps people understand what cis and trans women, as well as many trans men and genderqueer people, face in trying to find a place for themselves in male-dominated spaces (which is to say, in the world), I want that message to be understood. At the same time, I'm speaking from my position as a white trans man who doesn't have visible disabilities, was raised lower-class, and has a graduate degree and works as a software engineer. I've had it harder than some people and easier than many others, if it even makes sense to compare.
Ideally, I would like to change how historically male-dominated institutions -- specifically in this essay, computer science graduate programs -- try to integrate and welcome women as full participants. While one little blog post can't change the world, it might show a few people that the situation isn't as simple as it may look, and that has ripple effects. So I'm simply going to recount my personal history as a non-traditional learner, then undergraduate, then graduate student at Berkeley, and wherever possible try to draw connections between my experiences and larger social structures. If you remember nothing else from this essay, I hope you remember that when grad programs admit more women as students, it's not enough: to do so without extra attention to structural inequalities sets these students up for failure and actually reinforces sexism. I'll elaborate on that point in the rest of this essay.
( Read more... )
TMI: Back in the saddle
Dec. 26th, 2012 08:00 pmInheritance doesn't work right in default methods, as the bug title says, and I actually fixed the typechecker bug that was reported here. Woe is me, though, I ran into a place where trans was incomplete in re: generating code for inherited self-method calls. I'm still trying to understand the code well enough (which isn't very documented) to finish the incomplete parts. An old story. I'm about to get kicked out of a coffee shop, so no more details beyond that :-D