Teaching Programming

Note: This is a post I drafted in 2017 and am publishing now in 2020.

My Background

I’m working as a tech educator now – my official title is “Lead Instructor”. I even have a super fancy business card:

business-card

This is after “years of industry experience” and “many hours of classroom instruction”, specifically volunteer work through TEALS-K12 teaching computer science in Brooklyn, work-study teaching Python to 7-12th graders during college, and teaching a self-designed actionscript/flash curriculum to peers during high school.

I think a lot about education. I think a lot about quotes like @LiaSae’s because I agree with it. I believe the current problems with the American school system are problems of economics, not education. The problem is that it’s the “Silicon Valley Jerks” like myself that have the wherewithal (read: money/privilege) to try crazy things like coding schools, but we don’t have the teaching background. Someone needs to combine the two.

Teaching Certificates and Regulation

The boot camp I work for is accredited by the state (CODHE). The application process is rigorous and it takes hundreds of hours to put together the documents. This ensures that CODHE has reviewed our curriculum and approved it. But, this means that if we come up with a “better” curriculum that we’d like to try, there’s no room to pivot. We would have to go through the approval process again, which nobody wants to do. Pros and cons.

(Edit from 2020: we actually could pivot. As far as I can tell there was very little oversight and so calling “audibles” to switch out materials or teach something different was totally fine, as long as we believed it would benefit the students. The state just wanted to make sure we were actually thinking through this stuff? The company is now defunct so I feel like I can admit this).

I don’t have a teaching certificate. As far as I can tell, the need for programming teachers is so huge right now that they’ve basically dropped that requirement. You also don’t need a teaching degree at a private institution like the one that I’m teaching at now. I understand that this is a huge gap in my experience and I’ll certainly be getting one right after completing an undergrad teaching preparation course, 800 hours of teaching experience, and… yeah… not going to happen anytime soon. I can’t even find if there’s an accredited program for getting a computer science teaching certificate (maybe at Regis? What a convoluted PDF).

As far as I can tell, no teachers at bootcamps have teaching certificates (let me know if you do!). Does this mean we’re all those silicon valley jerks? Yes, and that sucks for the students and it sucks for the companies that try to hire out of boot camps like mine. Lots of people argue that boot camps should be regulated by the government and I agree with them and I think @LiaSae would too. But then, I would be out of a job and 99.99% of bootcamps would shut down.

(Edit from 2020: it seems like this was a good idea. I should have taken a harder stance on this, since it does seem like a lot of fly-by-night bootcamps popped up and quickly shuttered. The one I worked for, I believe they were doing a lot of the right things, but the market quickly saturated for junior developers and we started not being able to get people hired. After I quit – taking a job with a 30% salary bump – the bootcamp I had worked for was able to attract enough students and shuttered.)

It’s hard enough convincing programmers to take a pay cut and work at a boot camp. It’s even harder to do that to programmers who have the prerequisite charisma to teach, since that probably means they have the prerequisite charisma to climb a corporate ladder. All of my favorite teachers have done the job because they love inspiring students and because they love teaching.

I taught programming at the School for Human Rights in Brooklyn, NY, through the TEALS-K12 program. The TEALS program takes tech professionals and places them in morning classes – usually four volunteers to a class – and has them teach programming before they go in to work. They teach not only the students, but also the teacher, with the hope that the teacher will be able to teach the class on their own after 3-4 years of instruction.

None of these volunteer teachers are regulated or licensed, though they are trained. The year I participated, they also expected us to come up with the assignments and lessons for the class. It went… poorly. (Based on our feedback, they’ve hired curriculum developers and really flushed out the materials. Based on their new materials and their progress, I highly recommend volunteering through them if you’re interested in tech education but you can’t quit your job just yet.)  I was lucky that I’d done amateur curriculum design before, and one of my co-teachers had been a licensed chemistry teacher for years. That said, if they tried to hire only programming professionals who had teacher licensure, they’d have just a handful of schools in their program instead of 161.

I think this is a great example of Silicon Valley Jerks who know nothing about education really trying to make a difference. Is it the best teaching experience for the students? No. I certainly floundered a lot when I was learning to teach. But it’s certainly better than no technology education at all due to a lack of resources.

(Note from 2020: The more I learn  about how schools are funded by property tax to specifically benefit rich folks’ schools, the more I strongly believe we need more fundamental reform than just sending Silicon Valley Jerks like myself to go teach at underfunded locations. But it’s a good bandaid in the meantime. You need to treat the symptoms while you treat the cause.)

I’m not sure where I stand on the issue of teacher licensure in computer science and I would love to incite a discussion on the issue. Pros mostly involve better oversight, better instruction technique, and more consistent curricula. Cons involve not being able to move fast and pivot, even more undersupply of teachers, and less learn-to-code startups. Imagine if Salman Khan had to get a teaching license first.

(Note from 2020: I’m back to teaching, but this time I’m actually titled as an “Adjunct Lecturer” at Howard University through a program at Google, where I work now. It’s the same thing: send us Silicon Valley Jerks into programs to help build out the pipelines. We need to do this and ALSO address the underlying economic and prejudice problems that lead to this, by rethinking how we do things like students loans and school funding. I originally had some more topics to cover here, but I think what’s above is good on its own.)

From the Upper Peninsula of Michigan,

Erty

Awkwardness, Wavelengths, and Amplifiers

I’m an introvert, and although I can pass as an extrovert in certain situations (like being in front of a crowd, or when hanging out with people I know well), I still have a problem with small talk. I’ve run into this problem a couple of times over the last few days, where a conversation I’m having with someone suddenly dries up. I often make it worse by sighing or shifting my gaze downward. There’s just nothing to say for a moment and we (this happens in one-on-one and small groups, mostly) just sit for a while and steep in the silence.

Often we get the conversation going again (I usually try to ask about hobbies, goals, work, etc) but it’s a painful reminder that I’m not great at keeping a conversation going.

But there are some people who I seem to be able to talk for a long time with, at length about topics, and some external force has to intervene to end the conversation. I, of course, try to make friends with these people and hang out with them often, but occasionally it happens with a stranger. What mysterious force is it that suddenly makes me able to hold a deep and intelligent conversation with someone, without having to resort to “small talk”? I was thinking about this on the subway home after a party tonight and framed it in an interesting way, that I thought might make a good essay.

Note, I don’t want to claim I’ve “discovered” anything or that this is “the way”, I just want to explore this idea and would love feedback on it.

People have certain interests, and various intensities of these interests. I might call these “wavelengths” – a frequency (topic) and an amplitude (depth of knowledge / interest) that people carry a multitude of. I, for example, could talk to you at length about webcomic publishing, or perhaps the 1987 roguelike computer game Nethack, or how everything about the Scott Pilgrim movie was perfect except for Michael Cera. All of these things I have factoids, opinions, and perhaps most importantly and interest in discussing.

If you ask me to talk about gasoline cars, or maybe the Kardashians, or football, I have a thought or two but you’ll quickly discover that I’m not “on that wavelength.” The conversation can’t last long because I don’t have much to contribute. I’ll say, “hmm, interesting” and listen to you and be happy to learn some things, but I won’t have anything real to contribute. And so unless you’re very passionate about the topic, the conversation will soon end and I’ll make an excuse about having to refill my drink and wander off to find a new conversation. Which is fine, I bet you don’t want to be in this staring-at-the-floor-contest any longer either.

There are also some real dampeners, which one should seek to avoid. Some people don’t like to talk about some things for real reasons, and it’s not kind to force them onto those topics.

And so striking up a conversation is a frequency-searching exercise. What do we have in common enough to talk about. Work, sure. The weather, sure. Complaining about the MTA, sure. But those things aren’t (usually) the kind of things that get people really excited. And sometimes they’re dampeners, when someone is having a bad time at work and you ask them how work is going. But it’s difficult, since the things people really like to get into the weeds about are often obscure, and there’s a strange pressure against just opening conversations with, “hey are you into Nethack?” unless there’s some reason, like I saw you playing Nethack. I think it’s a failure thing; if I get all excited, “oh, are you a Nethack fan?” and the response I get is, “what’s that?” then I know I’m in for giving an explanation, which isn’t the same as a conversation.

Which of course is one of the reasons that the internet is so neat. I can just click some buttons on my $2000 facebook machine and get instantly connected to a large group of Nethack fans. Sometimes these online conversations spill over into real life. But often the Venn diagram of people I hang out with IRL and the people who are in these online groups is two circles. The fact that we can find these “lifestyle enclaves” (see Habits of the Heart by Bellah et al) of people on the same wavelength can also be dangerous echo chambers.

But the best, the best thing is when you run into someone who is an amplifier on your wavelength. My partner is like this for a lot of things, where we both get excited about something and end up being able to talk about it for a long time. And I have a friend who is like this for technical things – once we start coming up with tech and business ideas it’s very difficult to stop.

But to do this, your wavelengths have to be similar, and just like music there have to be other notes – other wavelengths that you can bounce off of to add interest to the conversation without it falling flat. And these amplifiers are rare. You know them when you find them and you hold on to them. They’re people who hear your ideas and “yes and” them, sending the wavelength back to you, but louder. You’re safe to explore here. You can even dig around for new wavelengths together, since you can always return to your common ground if nothing turns up.

There are some people who seem to be able to frequency-hop easily. It’s practice, I know, but I’m not that good at it. And as an awkward nerd-human I’m terrible about hiding when I’m uninterested in a wavelength, I quickly lose interest. My partner is great at this – she has the ability to work with people across a much wider variety of interests and be (or at least seem) interested in what they’re saying, and carry on a conversation. This is a skill I’m still working on, but it is a skill that can be practiced.

Name Change

When Greta and I got married, we joked that we were going to merge our last names (Dohl and Seidel, respectively) into a portmanteau, “Seidohl”. With our wedding date approaching and no better ideas, we happily went forward with that idea and made it our legal last name. This isn’t a guide (there’s a good one here) but really just a story.

For posterity, and also to hopefully instruct anyone interested in doing the same, I’ve decided to write down the processes we’ve gone through. Please let me know in the comments if you’ve had similar or different experiences!

Family

To begin: my parents, The Seidels, took my mom’s maiden name when they were married. As far as I can gather, they did it mainly because of my dad’s strained relationship with my Grandfather. (Only one child – an adopted second cousin – still bears the Pizarro name that was handed down by my Grandfather). Still, they apparently faced some hardship in changing my dad’s name officially, so I was expecting a tough time of making up an entirely new name.

Telling my family was not hard. Most of them agreed that it seemed a perfectly reasonable thing to do and actively encouraged us. My maternal grandfather (rest in peace) seemed surprised, although he was in good humor about receiving the news that I would be likely the last Seidel on his side of the family. He mentioned one great aunt who would be “spinning in her grave” about the news. (Connect her to a turbine?). I never met her and, to date, have not been visited by her angry ghost. So I think I’m good there.

YMMV, of course, with your own family.

Marriage License

In the county where we were married, we could only change our names to a) one of our existing last names or b) hyphenate our last names. (I can no longer find a reference to this, but Michigan’s marriage laws being as backwards as they are I wouldn’t be surprised). So for our actual marriage, we just c) kept our own last names.

New York

We moved to NYC right after getting married, and changed our names through the NY state court system. This was relatively straightforward. We filled out some notarized paperwork and got a court date. Note that finding a Notary Public can be difficult, even in Manhattan! We needed our original Birth Certificates as well.

We dressed up nice and appeared in front of a judge. The main questions we were asked related to figuring out if we were doing this to get out of a debt, crime, or other obligation. I remember that the guy in front of us was changing his name for religious reasons and the judge approved that as well.

The details of this next part are a bit fuzzy, since this was so long ago. The judge approved our name change and sent us to get certified copies. There was a (IIRC) $65 charge to change the names, and then each notarized copy cost about $10. We ended up needing five (?) certified copies, one for our records, one for a couple of services like the Social Security office, debts (student loans companies), and more to publish in the newspaper. You must publish your name change in a public newspaper.

You can publish in the New York Times, if you want to shell out a boatload of money. I published in, I think, the Irish Echo, which cost about $35. You don’t need to be Irish to publish there! It’s one of the cheapest papers to publish in so I expect they do a brisk business on this.

Finally, we got certified copies of our completed name change documents for our records (another $6 per copy, I think?). We used that to do things like refresh our passports.

Problems

The only institution that really gave me any grief was my bank. They seemed perfectly happy to accept that my wife’s last name had changed through marriage without any documentation (this seems like a major security flaw???), but as soon as I told them that we’d changed it in front of a judge, suddenly they needed me to send documents for both of us. I did, and they changed the names promptly.

Trying to change my frequent filer miles name on Southwest also caused problems. Their online name change form simply didn’t work, and none of the phone support people could do anything but tell me to go fill out the form. I think I eventually got around it but it required some developer console hacking??

Changing emails, usernames and websites was also tricky. I still have my old last name in some usernames. I was very fortunate that I’d chosen ertysdl as my email username, since sdl stands for both Seidel and Seidohl! I promise I didn’t plan that. Some sites seem to use your username as a unique identifier, and why would that ever change?

Conclusion

Changing my last name wasn’t a difficult task, although it was made harder by state law in Michigan which didn’t allow us to change our name at the time of our wedding, which would have saved us a lot of time and expense. Only a few entities gave me trouble about updating my name, but otherwise it seems like a pretty common thing to do and most of the clerks didn’t blink an eye – in fact, it seems like several people change their name every day in NYC, so the process is pretty streamlined.

Postscript: Thinking thoughts

I didn’t grow up with any strong connection to the Seidel name. It’s generally a German surname, and I’ve always wondered if the anti-German sentiment of the 1940s led to my earlier family suppressing that aspect of my heritage. I have a much closer affinity for Sweden, since I was partially raised by my dad’s mom who was born to Swedish immigrants. That said, I don’t really consider myself Swedish or have any connection to the country and its people other than that.

There aren’t many other Ertys in the world! I used to come up on the first page of google results with just my first name, but that seems to not be the case any more. Unfortunately, unique names come with downsides as well. There’s some weird art out there with my name attached to it (I didn’t make it!). However, with a unique first and last name, I end up being very Googlable. That’s something I decided was good?

To me, changing my name like this is an expression of the individualism and emptiness of the modern “white american” culture. I don’t have a connection to any large family or lineage through my names. I’ve changed both my first name (from Erik to Erty) and my last name (from Seidel to Seidohl), and I rarely use my middle name (and have considered changing it at times as well). A name is an outward expression of self. It’s like a tattoo. I don’t not like my original names, I’ve just found new ways of expressing myself. I think this is a form of rebellion against previous generations that put so much caché into names – let’s discard that and refer to ourselves how we want, not just on the internet. I’ve been lucky to not have familial pressure back on these decisions, so they’ve been almost no work at all.

Cabal Package Installation Woes

tl;dr: Nuke ~/.ghc and then run cabal install --lib (every lib you need)

Edit: Since writing this post, there’s been some movement on the cabal bug, and it seems like there’s soon going to be a fix!

I’m trying to write a simple webserver based on Warp, but I ran into an issue with a hidden package. Here’s my imports in Server.hs:

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai (Application, Response, rawPathInfo, responseFile, responseLBS)
import Network.HTTP.Types (status200, status404)
import Network.Wai.Handler.Warp (run)

And here’s the relevant part of my .cabal file:

executable server
  main-is: Server.hs
  build-depends:
    base >=4.12 && <4.13
    , wai
    , warp
  default-language:    Haskell2010

Note that http-types is missing, but we’ll come back to that at the end.

I’ll start by saying that I don’t fully understand the difference between cabal and stack, and at the beginning I decided to just use cabal and not worry about stack.

I ran cabal install wai warp and got the following error:

Resolving dependencies...
cabal: Cannot build the executables in the package wai because it does not
contain any executables. Check the .cabal file for the package and make sure
that it properly declares the components that you expect.
Cannot build the executables in the package warp because it does not contain
any executables. Check the .cabal file for the package and make sure that it
properly declares the components that you expect.

It turns out the solution to this is to append --lib and run cabal install --lib wai warp. (I wish it would say that in the warning though.)

I ran cabal install wai warp --lib and tried running Server.hs by pressing command+b in Sublime Text 3, but I ran into this error:

Could not load module ‘Network.HTTP.Types’
    It is a member of the hidden package ‘http-types-0.12.3’.
    You can run ‘:set -package http-types’ to expose it.
    (Note: this unloads all the modules in the current scope.)
    Use -v to see a list of the files searched for.

I think what’s happening here is that http-types is installed, but not explicitly. Haskell wants me to definitely say that I want it, so I try running cabal install --lib http-types.

This, however, runs into a very frustrating error. Apparently the process library is required at two different versions in two different packages – despite already being happily installed as an indirect dependency:

cabal: Could not resolve dependencies:
[__0] trying: base-4.12.0.0/installed-4.1... (user goal)
[__1] trying: ghc-8.6.5/installed-8.6... (user goal)
[__2] next goal: process (user goal)
[__2] rejecting: process-1.6.8.2, process-1.6.8.1, process-1.6.8.0 (constraint
from user target requires ==1.6.7.0)
[__2] rejecting: process-1.6.7.0 (conflict: ghc =>
process==1.6.5.0/installed-1.6...)
[__2] rejecting: process-1.6.6.0, process-1.6.5.1,
process-1.6.5.0/installed-1.6..., process-1.6.5.0, process-1.6.4.0,
process-1.6.3.0, process-1.6.2.0, process-1.6.1.0, process-1.6.0.0,
process-1.5.0.0, process-1.4.3.0, process-1.4.2.0, process-1.4.1.0,
process-1.4.0.0, process-1.3.0.0, process-1.2.3.0, process-1.2.2.0,
process-1.2.1.0, process-1.2.0.0, process-1.1.0.2, process-1.1.0.1,
process-1.1.0.0, process-1.0.1.5, process-1.0.1.4, process-1.0.1.3,
process-1.0.1.2, process-1.0.1.1, process-1.0.0.0 (constraint from user target
requires ==1.6.7.0)
[__2] fail (backjumping, conflict set: ghc, process)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: process, base, ghc

The solution to this is very frustrating, because even rolling back my git repo to the last known good commit didn’t fix it – it’s a global system problem (ironic, for Haskell, which is so demanding of “pureness” in the language). I deleted ~/.ghc and ran the install again:

rm -rf ~/.ghc && cabal install --lib wai warp http-types

And it worked! My server runs 🙂

The problem is now, I want to build some tests, so I run cabal install --lib hspec and I run into the same “could not resolve dependencies” as above!

Hm, let’s see if just a rm -rf ~/.ghc && cabal install will fix it, if I declare hspec in build-depends in my .cabal file? I get the following error:

cabal: Path '/Users/erty/.cabal/bin/server' already exists. Use
--overwrite-policy=always to overwrite.

So let’s try the suggestion and run --overwrite-policy=always. Infuriatingly, this build succeeds but when I try to actually run Server.hs (by pressing cmd+b in Sublime Text, perhaps that’s missing a flag or something? I wonder if cabal install builds a binary but fails to install the libraries) it fails to find any of my modules:

Could not find module ‘Network.Wai’
Could not find module ‘Network.HTTP.Types’
Could not find module ‘Network.Wai.Handler.Warp’

Let’s try rm -rf ~/.ghc && cabal install --lib, since adding --lib worked before. First, I also added http-types to my build-depends in the .cabal file. Nope:

Resolving dependencies...
cabal: Cannot build the libraries in the package crossword-hs because it does
not contain any libraries. Check the .cabal file for the package and make sure
that it properly declares the components that you expect.

But! We were able to get it working by listing all of the dependencies explicitly during the install phase. So let’s try that and run rm -rf ~/.ghc && cabal install --lib wai warp http-types hspec:

Works! The problem is that I have to remove ~/.ghc manually list out all of my deps every time I want to install something, but at least I can move forward for now.

I also added http-types to my cabal file, but it didn’t seem to really matter for running in sublime text, as long as I’d installed it via cabal install --lib.

I would love to hear from any more experienced haskellers out there if I’m not understanding something about cabal. Specifically, coming from node, I feel like cabal install (or even with --lib should “just work” and install all of the deps I’ve listed in the .cabal file.

Hopefully this writeup saves someone else time 🙂

Expanding the !!Con Aesthetic

TL;DR: There’s a cool new project to put on plays about computing. In addition to traditional talks, we’re inviting people to submit more artistic 10-minute plays or other “non-talks” to !!Con as well as The Art of Python.

Sumana Harihareswara and I had lunch sometime late last year and talked for a while about her newest brainchild, The Art of Python. To steal her own description, The Art of Python is a miniature arts festival at PyCon North America 2019, focusing on narrative, performance, and visual art. The Art of Python was recently accepted into the PyCon Hatchery Program, an incubator for PyCon-related ideas. It will be a series of short plays, 5-20 minutes each, held on the evening of Friday, May 3.

Sumana has worked with the !!Con team before and wrote one of my favorite articles about the conference, Toward a !!Con Aesthetic, which I re-read every year to re-center myself on what !!Con can (and in my opinion, should) be. One of its sections is titled Spectacle and play, and explores how some of the talks cross from being a “talk” into being a comedy or sketch show. We as audiences remember these moments where the magician shows us that something more than meets the eye can be done – and in our case, presents a new kind of magic to an audience of magicians.

That’s why we’re inviting people to open up the idea of what constitutes a “talk” at !!Con this year. We would love to see drama, comedy, and magic. If you are interested, we invite you to submit a play to both !!Con and The Art of Python, theme and length (10 minutes for !!Con) allowing. Note that The Art of Python’s CFP specifically says that the play does not actually have to be about Python, just the emotional experiences of programming.

Our CFP will open Feb 6 Feb 8, and The Art of Python’s CFP is already open. Bring us your explorations and reenactments. Show us how your computing is spectacle and emotional. Explore with comedy and tragedy the feelings that surround this field that has only been around for one generation, two or three if we’re really generous.

Some caveats: !!Con is still going to be looking for “the joyous, exciting, and surprising moments in computing”, and we’re not going to have a separate track or approval process for non-talks. But, based on the amazing work that we’ve seen in years past, and ideas we’ve been pitched, I don’t doubt that you the reader have something worth submitting to !!Con and The Art of Python.

Of course, I encourage you to submit your proposals for 5-20 minute plays to The Art of Python regardless of whether you go on to submit them to !!Con! You should also check out the Hatchery program for next year, if you have an idea for a conference track that you’d like to try out in the context (and with the backing of) PyCon.

We talk at !!Con a lot about the intersections of humans and computers, since indeed the things that computers do are ultimately created and consumed by humans (well, or their pets). The lecture format is often ill-suited to explore this emotional side of computing, and especially poor at exploring the relationships between people who make the magic lightning rocks go fast.

I will admit that watching a play about programming sounded awkward at first, but then I reminded myself that 1) the spectacles that Sumana mentioned from previous !!Cons have only been amazing, and 2) when I go to plays about far more uncomfortably introspective topics, I generally end up learning something about myself and/or the world. It’s sometimes not even something that can be put into words – but that’s exactly the point. Some things are very hard to describe by speaking at a room with a slideshow behind you. Perhaps one of these non-talks will inspire, delight, and amaze in a way that’s uniquely deep.

We are still exuberant about accepting traditional-format talks and are looking forward to seeing all of the cool, fun, scary things that you have done with computers. Polish up your demos, dust off and re-submit your !!Con talks that didn’t make it in previous years, think about the fun bug that you defeated, and come tell us about it. If you want some more information before we post the CFP: Lindsey Kuper, organizer emeritus now leading the charge on the west coast, has a great article about the kinds of talks we’re not looking for. I’ve written previously about how we select the talks.

I’m optimistic about this widening of our focus. Similar to our inclusion efforts, there’s a difference between not-not-permitting and inviting. If people had submitted drama/magic/spectacle to previous !!Con we would have judged it seriously, but to openly request it alongside the traditional talks breaks down the assumption that a 10-minute !!Con slot is only for a “talk”, which, to be honest, is just because that’s what other conferences do. I like to think of us as more avant-garde than that.

Radish Cache

After coming across a (now deleted) answer on StackOverflow, I took some time to find instances of “redis” (a popular caching program) misspelled as “radish”. I think autocorrect is likely the culprit.

I’m posting these here because I think that this is a wonderfully innocent error and not to shame the people involved. Imagining someone refreshing their cache of small red vegetables brings joy to my heart and I hope it does to yours as well.

The Original

This came up in an edit queue, but I didn’t have the heart to edit it. I now suggest this as the solution to most of our technical problems at work, much to my coworkers annoyance.

From Harvard

This one is in an article published by Harvard, so you know it’s legit.

LinkedIn

This person has radish cache on their LinkedIn profile, so you know they’re an expert. (Last item)

Please go to my LinkedIn and recommend me for radish cache. I’d like to add you to my persimmon network.

Speeding up Magneto

Vegetables are part of a healthy diet. Varnish, not so much.

IRL

Unfortunately, the only IRL radish cache has been removed and no longer exists.

Conclusion

Remember, if you have a problem, flush your radish cache!

The !!Con Talk Anonymization and Selection Process

Another conference organizer recently asked the !!Con team what our anonymization process was, and we realized that we didn’t have a good source for them. While we tout our anonymization as a major component of our quest to eliminate implicit bias during the talk selection process, we haven’t written what our anonymization and talk selection process actually looks like in a while.

Julia Evans wrote a great post about our anonymization outcome after the first !!Con in 2014, and Lindsey Kuper has an update from a year later that goes into a lot more detail. We’ve changed some processes since (we no longer use github issues to track the proposals, for example).

One thing I want to point out is that if you’re submitting a talk proposal to !!Con, you shouldn’t worry about how your proposal will be anonymized! Just submit your talk like you want it to be listed, and we’ll take care of the anonymization process.

Here’s the blurb about anonymization from this year’s Call for Talk Proposals! page:

Proposals will be anonymized to avoid bias. Although we ask for your name, email address, and so on in the proposal submission form, only one or two organizers who serve as anonymizers will actually see this information, and they won’t review your proposal. The rest of the organizing team will review your proposal without knowing who you are.

I also think we have a pretty cool way of doing the talk selection, so I’ll cover that as well in this post.

Here’s the secret sauce:

  1. Each year, before we open the Call for Proposals, we decide who is going to be on the anonymization team, and who is going to be on the talk selection team. Generally the anonymization team is one or two organizers plus potentially one or two outside helpers who we recruit. The talk selection team is the remaining four or five organizers. This year, Alex Clemmer and I are the anonymizers, and the rest of the organizing team is the talk selection team.
  2. The anonymization team is the only team with access to the google form (and resulting google spreadsheet) that we use to collect talk submissions. Then we open the Call for Proposals!
  3. It’s tradition that the anonymizer who is supposed to close the google form falls asleep before midnight and forgets to close the form until the next morning. This year it was me and I didn’t close the form until 9am. Whoops!
  4. The “chief anonymizer” saves a copy of the original spreadsheet and begins going through it to anonymize it. Each talk is given an ID (a random unique integer, so that we don’t give away when the talk was submitted), so that we can track and re-aggregate our data at the end of the review process.

Let’s talk about the anonymization process. Here’s an example talk proposal (by me right now for demonstration, this probably wouldn’t be accepted):

I work at FiniteAutomata Corp, so my talk is about how knowing how finite automata work gives you regex superpowers! People will look at me and say, “wow he is so cool with his regex” and I’m like “heck yes I am good because I know how finite automata work let me teach you”. Here’s a link to me giving a longer version of this talk at FiniteAutomataCon 2011: http://example.com

The anonymizer takes this proposal and does a couple of things:

  1. Remove/Obscure any names of people or companies. We generally leave in product names unless the talk submitter is the main author of that product, in which case we will remove the product name as well. For example, “FiniteAutomata Corp” in the example above would become “[Large Tech Firm]”, in square brackets (or similar).
  2. Remove/Obscure any pronouns or other identifiers. For example, my proposal above says “he” and “his”, which gives away my gender. We would replace these pronouns with “[they]” or “[author]”.
  3. We also try our best to watch / read any associated material and give a quick synopsis of it. For example, the link in the proposal above would become “[Video of the author giving a 30-minute version of this talk at a well-known conference. The talk is well received by the audience.]”

During anonymization, we try not to remove aspects of the speaker’s identity that are essential to the message of the talk. For example, the abstract for Sina Bahram’s 2016 talk about screen readers begins, “I use a computer very differently than most people, because I’m blind.” It wouldn’t have made sense for the anonymizer to remove this fact, because it is Sina’s personal experience that makes the talk proposal especially compelling. We try to use our best judgement here (and probably get it wrong sometimes!)

Once we’ve created the anonymized version of all the talks, we create a copy of the anonymized spreadsheet for each of our reviewers. If I were on the reviewing team, I would get a spreadsheet called “!!Con 2018 – Talk Proposals [Erty]”. This is my personal copy of the anonymized spreadsheet.

The next step is for each reviewer to give each talk a grade. !!Con co-organizer Lindsey Kuper introduced this grading scheme, based on the Identify the Champion process (Specifically Make Champions Explicit):

A – I really like this talk and will advocate for it to get into the conference
B – I like this talk, but not enough to advocate for it
C – I don’t like this talk, but not enough to advocate against it
D – I don’t like this talk and will advocate against it being included in the conference
X – I think I know who submitted this talk, and abstain from giving it a grade

The chief anonymizer then creates a spreadsheet that aggregates these grades into a single place (did you know that you can include cells from one spreadsheet in another using google spreadsheets? It’s pretty nifty!). We look at the best grade and the worst grade for each talk.

Some examples:

A talk that got grades A B B C would have a final grade of AC (A is the best and C is the worst)
A talk that got grades X A A X would have a final grade of AA
A talk that got grades X D C A would have a final grade of AD

If a talk got 0 or 1 grades due to abstain votes, we would handle that as a special case. I’m pretty sure that hasn’t happened in the 5 years we’ve been running !!Con.

We all get on a conference call at this point and start going through the talks! This is really fun! AA talks generally get in immediately. AB talks are usually also admitted as well, if we still have room. AC talks we usually discuss, but they’re generally not admitted, and AD talks are really interesting, since it means someone will advocate for it and someone else will advocate against it! Generally, someone misunderstood the proposal, or two people have differing ideas about what kind of talks should get into !!Con. It’s usually a no, but these talks will sometimes get in (especially if they got AAAD).

More generally, this means that only talks that get at least one A are considered. Your talk needs to convince one of our reviewers to become a champion for it. As Lindsey noted in her blog post Scaling !!Con, last year (2017) we had 86 talks with an A out of 215 total, which we then had to narrow down to just 30!

Remember that all of this is still being done with anonymized talks. The anonymizer(s) will usually sit in on this call and answer any questions about the proposals that the reviewers have (usually around things like the descriptions of videos that were with the proposal). But never speaking up to sway a decision in one way or another. This is difficult! Last year I spoke up because I was really excited about a talk proposal (that ended up not getting in, anyway) but I definitely shouldn’t have done that, since I knew who the speaker was and therefore had implicit bias.

Once we’ve decided which talks we’ll approve for the slots we have available, we take our next favorites (generally about five of them, but it varies) and hold those as backups in case our acceptances aren’t accepted (it happens!).

The anonymizer then goes through and makes sure that we didn’t select the same speaker twice (some people have submitted as many as six talks in a single year!) If we did, we bring some more people off the backup list, then replace them to keep our backup list full. Usually if someone submitted two talks that were accepted, we let them choose which one they’d rather give. Although, if there’s a clear favorite, we might suggest that they choose that one 🙂

At this point we do the dramatic reveal and show the review team who got in! Then we email these people. This is really fun 🙂

One important thing to note: If you didn’t get accepted, then your name is never revealed, not even to our review team. The anonymizer emails out our famous rejection letter after we’ve figured out our lineup. This is not so fun 🙁

That’s it! I hope this is useful information, especially if you’re starting a conference yourself.

a e s t h e t i c 💫 g e n e r a t o r

Update: the a e s t h e t i c g e n e r a t o r is now online.

 

Ryan McVerry, Per-Andre Stromhaug, and I got together this weekend to do a mini-hackathon. We’d been inspired by a Chicago-based artist on Tumblr named Galactic Castle. Specifically, this image:

Our goal, was to write python to generate images that looked like Galactic Castle’s. We used the Pillow python library for the most part, messing around with 256×256 arrays of integers, limited to 10 or so colors.

We experimented with a few different rendering techniques, eventually settling on a layered technique. I’ll start with some examples of the finished product, and then a quick walk through some of the fun images we generated along the way. You can run it yourself at https://aesthetic-landscape.herokuapp.com/.

Here are a few shots from the process along the way.

This is one of the first renders we saved. You can see most of the elements coming together, and the dithering in the sky is already in place.

Experimenting with color palettes:

I messed up the color palette:

Getting reflections working. At this point I was doing two things that I eventually stopped doing: reflecting the actual colors (instead, we just use a single color to represent any reflection) and at this point we weren’t doing any sort of layering, so the reflections were crude and unaware of what they were reflecting. In the latest version we use a different algorithm for things above the horizon (mountains, moon) and things in the water (rocks/land).

Better reflections, added a moon.

Re-worked the rocks code. We were originally using polygons that were then filled by PIL. The new code instead generates an enormous int buffer and we manually fill in from the edge. The rocks at the base of the land spits are just handled by keeping track of a number that grows and shrinks, and switching colors when we reach that threshold.

We were originally working at 512×512 (scaling up x4 for the final image), but eventually realized that Galactic Castle works at about 150×150, so we scaled down. The resulting pixelation is much more pleasing. Added trees and improved the mountain cross-hatching.

I hope you enjoy this! You can see it for yourself at https://aesthetic-landscape.herokuapp.com/

We Built an Arcade Cabinet in a Weekend!

We built an arcade cabinet! In 72 hours!

The team:

Project Lead
ERTY SEIDOHL
Software Engineers
RYAN MCVERRY
MAX FELDKAMP
Hardware Engineer
BEN GOODING
Music and Sound
EVAN CONWAY
Cabinet Construction
ERIC VAN DER HEIDE
MATT GOLON
Cabinet Art
HALEY WHITE-BALLOWE

Finished image first 🙂

We had the idea to build an arcade cabinet several months ago, and by the time Ludum Dare 38 rolled around, we had the time and space to make it happen! We met a few times beforehand to test out ideas and hardware, and parts started arriving in early April:

We decided to use the LÖVE framework on Raspberry Pi 2-Bs, via the PiLove raspbian image.

Ideas started flying on Friday at 7pm Mountain, though, when we all got together to create the game. Sadly, our game idea about slipper and flipper the penguins didn’t make it to the final round.

We quickly began to mock out the cabinet design, and started building the game!

Our first prototypes were… okay 🙂

But things began to come together…

The cabinet really began to come together! We thrifted the TV for about $30. The speakers were old computer speakers we had lying around, and the coin door we purchased on Amazon for about $40.

More construction pics:

Haley (our artist) couldn’t join us until day 3, but she did an amazing job!

The yellow paint was a little… weird. Ah well :\

Finally, we had the whole thing rigged up! Time to plug everything in and turn it on!

A few touchups on the title…

And, about 15 minutes before the deadline, we had a functioning, working arcade game!

Here’s a quick video of the gameplay:

 

 
YAY!

We ran into a major issue right at the end, where (to get technical for a moment), our audio would cut out from time to time and just stop working. It seemed like an issue with pulseaudio. The way we solved it was to kill pulseaudio on startup. And for some reason that worked? So, I have no idea what’s playing the sound, but whatever it is crashes less.
 

We also had a wonderful “blur” effect that pulsed in time with the music, but it turned out to be too intensive for the raspberry pi, so we had to turn it off in the end. We tried doing it with shaders (way too intensive) and we tried doing it with just drawing translucent, larger versions of everything (just a little too intensive) and finally turned it off. Ludum Dare definitely requires you to just cut things if they’re not going to work, no matter how much time you put into them!

I’m going to attempt to get a copy of the game working so you can play it online by Friday, but no promises!