02 Oct 2018

The three most enjoyable activities in the world are playing Skyrim; a second thing that my wife says I’m not allowed to blog about; and talking knowledgeably about something you are good at.

3 months ago, I began offering open office hours to anyone who wanted to talk about programming. I’ve since spent 20 hours with 20 excellent people, and have found the experience both enjoyable and extremely challenging.

I had expected that most people would be looking for help taming unruly web apps or understanding exactly how Ruby on Rails migrations work. But whilst a few people did have specific questions about specific technologies, most really just wanted to talk about life. I’ve been able to practice being a completely unqualified technical psychotherapist, and I haven’t even had to pay anyone. I decided to start offering office hours because I thought they would be fun. I’m going to keep offering them because I’ve learned a lot from them; because I believe that overall they’ve been useful; and because I think I can get better at them.

——

Who I’ve spoken to

If I’m going to spend my time talking to strangers then I want this time to be as useful as possible. I’d like to talk with people who are most likely to benefit from a chat, which I think means people without many pre-existing connections in the technology industry. Someone who already has an aunt and a few friends-of-friends who work at Mozilla should probably just talk to them, especially if they’re all more experienced and socially competent than me. But if someone else doesn’t have that kind of ready-made network then maybe I can be of some small help.

I wrote in my original blog post that I’m particularly interested in talking to people from groups that are underrepresented in the technology industry. This was partly virtue signaling; partly a micro-attempt to increase the quantity of justice in the world; and partly because my understanding is that people from these groups are less likely to know other people in the industry, and may therefore have more to gain from a conversation.

I’m still very happy to talk to anyone. If someone has studied Computer Science at Stanford and now wants to start working in Silicon Valley, then I’m sure we’ll still both enjoy a Skype or a coffee. But honestly they’ve already made it over the wall and past the gatekeepers, and the rest is only so much optimization. Inconveniently I am sure that these are the people for whom I have the most practical advice.

I half-expected my inbox to immediately overflow with emails from the promising but marginalized. This did not happen. I suspect that in order to truly increase the diversity of the people that respond to an offer like this, you have to spend real time and effort on active outreach. I know that this is not a new insight, but I’m a first-principles, re-discovery kind of guy, and am also not very good at taking direction. I haven’t done any outreach yet, but if things keep going well then I hope that I will.

The people who have replied have overall been more experienced than I expected. In my original blog post I described the kind of person who I thought would benefit from my office hours as an “advanced beginner”. To me, an “advanced beginner” is someone who knows the basics of programming syntax, can loop through an array and find all the strings that are palindromes, and is now trying to forge a path through the post-introductory valley of despair to the land of larger, more complex programs.

However, the phrase “advanced beginner” has also resonated with a lot of people whose LinkedIn profiles already contain the words “Software Engineer” or “Computer Science graduate”. These people are typically pleased with their professional progress so far, but want to continue exploring new continents of knowledge and career advancement. However it’s not clear how much the plane ticket costs or what currency you’re supposed to pay in, let alone where the flights take off from. And even if you ever get there the border looks fiercely guarded, at least from a distance. This feeling is very familiar to me, even today. Perhaps we’d all be well advised to keep an advanced-beginner’s mind.

I’ve heard from a lot of college students and recent graduates. This is not surprising. They are coming up to a trillion-pronged fork in the road, and many of the prongs seem to suck. Some of these people are having trouble finding their first job. Some have found their first job, but don’t believe that it is going anywhere. And plenty have found their first job, are doing well, but just want to confirm that they are on the right track. “I think that things are good apart from I’m a bit confused about metaprogramming and I have that persistent dread and sadness that everyone experiences all the time.

“Everyone does experience that, right?”

Trying to be helpful

First, do no harm.

I’ve been struck by just how difficult it is to give constructive advice to someone you’ve only just met. Ruby on Rails works the same for everyone (unless you’re on Windows); everything else, not so much. My first couple of sessions were full of irrelevant advice. These examples are made-up but representative:

“You should just send off more job applications.” I’ve literally sent three hundred already. “Just get your co-workers to pair program with you.” They all dislike their jobs and want to leave the office as early as possible. “You don’t need a Masters degree to get a good job.” In my country you do. “I get up early and spend several hours before work writing and learning new things, you should do that.” I have a ninety minute commute and need to look after my parents. Getting up any earlier would, without exaggeration, kill me.

Much worse than irrelevant advice that is ignored is bad advice that is followed. If I’m wrong about a book recommendation or an interesting area of study, then this will cost the unfortunate recipient about twenty dollars or two hours. This is likely an acceptable risk. If I’m wrong about something bigger then the price is much higher. “Yes you have to move to San Francisco in order to get a good job.” “No you shouldn’t study machine learning, it’s not worth it.” I don’t feel qualified to pass comment on anything that sounds like an industry trend, and I’ve been very cautious about doing so.

I’ve also been trying to refrain from giving third-hand advice that I have no actual evidence or case studies for. I’ve so far managed to avoid the following exchange, but it’s sometimes been a close-run thing:

__: "How can I improve my resume so that I can land my first/a better job?" RH: "I recommend working on open source and side-projects, networking, and writing blog posts. That should do the trick." __: "I've tried them but they didn't work/I wasn't sure where to start. How did they help you get your first job?" RH: "Oh actually I just used my connections and ability to take 6 months off without getting paid. Have you tried that?"

I’ll still mention projects, networking and writing, since they’ve presumably become cliches for a reason, but I’ll only serve them alongside prominent caveats.

Second-hand advice that came from a friend or colleague is fair game, however. I’ve never been through the Recurse Centre, a programming centre in NYC, but I know many people who say that it changed their life. I therefore have no compunction about telling people that they should go there if they can. My understanding is that applications are always open.

With what I hope is a solid baseline of not doing any harm, I’ve started to think more about how (whether?) my office hours can actually help people. This has been a process of half-rediscovering known concepts that are readily available in any basic training course on people skills and empathy. Once again - first principles guy, not good at taking direction.

It’s unlikely that I have much insight into why someone’s job search isn’t going so well. I haven’t seen their CV or their interview technique, and come to think of it I don’t really have any special knowledge about CVs or interviewing anyway. However, I can listen and validate and try to ask good questions and be interested in the answers.

I’ve been trying to make sure that I understand the particularities of the person I’m talking with. What motivates them, what do they care about, what don’t they care about. Where have they come from, where would they like to go? I’ve also been trying to understand their questions as precisely as possible. What exactly are they worried about, what have they tried already? I’ve been working on getting better at asking slightly awkward questions in an unawkward manner. What are you worried about? So why haven’t you done that yet? How does that make you feel? I think that it’s also useful for me to summarize my first-hand personal experiences, ideally towards the end of the session. Office hours aren’t about me (oh there’s another way you can do harm), but I think that a time-boxed summary of smart and foolish things I’ve done has to be a useful data point.

And there’s always “what do you think you should do?” This might be the only question I really need. People often have weirdly good advice for themselves.

How I have felt

I’m self-confident enough to offer hour-long advice sessions to strangers, but nowhere near self-confident enough to not feel anxious about it. I’m constantly a little worried that someone will show up, expecting to be blown away by an outright genius, and be visibly surprised and dismissive when they realize that I’m only a mid-table mastermind. Of course, this hasn’t happened yet, and I’ve almost managed to internalize the fact that if it ever does happen then it’s not really my fault. I reassure myself by remembering that I’ve always at least Successfully Met Expectations in my performance reviews. If I’m not an expert on a topic then I try to cheerily admit it. I find that the more cheery I can be the less embarrassed I feel.

Good advice that I have given

Don’t take shortcuts unless you know why you are taking them

If you’re anxious about asking your co-workers for regular “mentorship”, instead suggest spending an hour a week “chatting about work” and sneak in some mentorship by the back door

Chop up your projects into milestones

Apply to the Recurse Centre

I haven’t read many books on programming recently, but some books I have liked in the past are: Metaprogramming in Ruby, Collective Intelligence and Learn C the Hard Way

I’ve heard that Andrew Ng’s course on machine learning is really good. I haven’t done it though

I liked Martin Odersky’s introduction to functional programming course

I’ve written some programming projects for advanced beginners, and I think they’re quite good. You might find them useful

An anecdote I’ve told a lot

The first languages I experimented with were Python and PHP, followed by Javascript and Ruby. For no good reason I decided that such interpreted scripting languages were all training-wheel tools for dummies. I developed an unhealthy fear of compiled languages and words like runtimes, byte code, binaries and garbage collection, because these were hardcore concepts for people with bachelors degrees in CS. In the last few years I’ve spent more time writing Scala and Go. I’ve had to learn some new things about runtimes, byte code, binaries and garbage collection, but it turns out that they are just things, and have been all along, just like all the other things I’ve learned in my life.

The future

In a few months I’ll have to decide whether I’m going to keep doing office hours. Can I sustain this schedule? Am I actually helping anyone? Is 1 hour long enough to achieve anything useful? Should I just find an existing organization that is teaching people programming and spend my time working with them? And, even though the answer to that last question is very probably yes, is that something that I will actually do? Every hour that I spend talking with strangers about programming is an hour that I’m not spending solving the world’s most pressing problems. Throw it on the pile with all the rest I suppose.

In the meantime I’m going to start making live-ish coding videos in which I work through projects from scratch. It will be like the viewer and I are pair-programming together, except only I get to do any talking. In my office hour sessions I’ve found that many people don’t have mentors or people to pair-program with, and so don’t have any way to pick up good habits by osmosis. They might know that you should keep your functions small and self-contained, but aren’t always exactly sure what that means in practice. I’m hopeful that videos mimicking the in-the-trenches experience of working with someone else on a substantial project could be very useful to a lot of people.

If you’re now thinking “you know, I bet I could start doing office hours too”, then I’d strongly encourage you to do so. It might feel like the height of arrogance, but my therapist insists that it’s actually profound generosity. I tend to think it’s a bit of both. Either way, the really beautiful and comforting part is that if no one signs up then no one will ever know. I’m going to write another post in the next few weeks with some more suggestions on how to get started.

Finally, if you’d like to spend up to an hour talking about life, the universe, and programming, then I’d love to hear from you.