My onboarding experience at Khan Academy

I’m in my third week at Khan Academy and thought I’d write a little about my experience with the onboarding process here. I’m a remote employee and my first two weeks have been here at home, 2,000+ miles away from most of my coworkers. This means that I don’t have the benefit of in-office osmosis of thought or lunchtime talk with the others. My quick summary is that onboarding at Khan Academy works very well indeed.

The starting point is a welcome email that arrives before your first day. This email provided me with a bunch of background even before I started. Part of that includes this Trello board:

This is the first time I’ve seen Trello used as a documentation format, but it works nicely in this instance. You work your way across the Trello board to:

  • get your paperwork in order
  • get everything you need to work productively
  • learn about company culture

The company culture information was especially good because it gave me a lens through which to look at everything I was seeing. Everything from Khan Academy’s mission (free, world-class education for anyone, anywhere) to our development core principles (“shipping beats perfection” and others) to the very deep way in which career development is approached is covered on the culture pages. This both sets expectations for me and helps me have a mindset to keep this wonderful culture going.

From there, I spent a good deal of time reading Google docs and our documentation site. Khan Academy’s documentation is great, covering from the highest level strategies down to details on our day-to-day development processes. One part of KA’s culture is that “everyone can fix everything”, so there was little about the documentation that was stale or out of date.

Alan Pierce ran a “dev crash course” that was recorded and that helped, but I do think a bit more documentation at the 10,000 foot level (what are the pieces and how do they fit together?) would help. I have some ideas in mind for that and hope to have something together soon.

Not getting lost and keeping in touch

I’ve been working with a couple of mentors (James Irwin and John Resig) since I started. Their help has been invaluable because any documentation will have some holes. I’ve also found it easy to get in touch with the right people by using git blame as I’m working on a piece of code. Going through code reviews and talking with the other developers has been very helpful in learning how things work, why they work as they do and some areas we might want to improve going forward.

We make heavy use of HipChat at Khan Academy. This is one thing that definitely makes me feel like a part of the team and less distant from everyone in California. Radical email transparency helps with shared context as well. I’ve been delighted at the quite reasonable pace of email so far, and I think that’s largely due to the split between HipChat and email. That’s something that many organizations seem to be finding as they adopt Slack, which is quite similar to HipChat.

We have meetings via Fuze or Google Hangouts. Video conferencing just gets better over time.

Developer Setup

As a developer with a new machine, you start by grabbing the khan-dotfiles project and running make in there. khan-dotfiles is nice because it gives you everything you need and if the requirements change, you just update the project and re-run make.

Re-running the khan-dotfiles setup is likely much more common than starting up a fresh machine, so it’s not entirely suprising that I ran into a problem setting up my brand new machine. One of the first bits of code I submitted was a fix for khan-dotfiles.

We use Phabricator and the workflow is quite different from the GitHub flow that I’m used to from day-to-day work on Brackets. Again, though, good docs save the day.

Or, I should say, good docs, tools and chats with coworkers save the day!

Support

Khan Academy recently started a support rotation. Every three weeks, a different set of developers will take on support duties, responding to problems that people have filed. Having a set of developers designated (for a time) to work on support is good because it enables everyone else to focus on their project work rather than context switching between bugs and progress work. It also gives everyone a chance to see what people are encountering on the site and an opportunity to step out of their comfort areas in the code and into some other parts.

Newbies like me start out on support, which has worked out well because I have gotten to dig in to a few different areas of the code so far. The fixes I’ve made so far have not required me to change much code, but I have been reading quite a bit of code and learning different parts of the process and tooling along the way.

Elements of good remote developer onboarding

Though I still have a lot to learn (there’s a lot of code there!), Khan Academy’s onboarding process has worked well in getting me up and running. My summary of the key elements:

  • An overall welcoming attitude (seriously, everyone has been great!)
  • An assigned mentor that can handle all of the random questions that come up
  • Documentation of culture, tools, processes
  • Communications channels that work across time and space (HipChat/Slack, email with archives, video conferences with recordings)

It turns out that many of the elements that make an environment remote worker-friendly also make onboarding easier. In fact, this list of items would seem to be very similar to the techniques used in some large and successful open source projects. That’s probably not a coincidence.

The Tale of the Merry Squid: Teaching Programming with Minecraft

The Merry Squid

This past January and February, I taught a class that introduces children to programming through Minecraft. I called the class “The Merry Squid”, and this is my story of how it went. For the benefit of those who don’t want to read the whole thing, I’ll note up front that the class is available online.

Programming in Minecraft

There are so many things that I think are great about Minecraft. Since it’s written in Java, people could use a bit of perseverance (okay, a lot) to figure out how to hook in to Minecraft’s normal operation and change it. If you’ve played Minecraft, you’ve probably already heard about “mods” that do this.

One Minecraft mod is called ScriptCraft. ScriptCraft is a mod that lets you write mods, in JavaScript. Even better, it lets you run bits of JavaScript code from within Minecraft itself.

Minecraft is set up for multiplayer games, so there’s both the client part that runs the graphics and the server part which keeps track of the state of everything in the world. ScriptCraft is a server mod, so that means you can only change things that affect the state of the world and not the graphics that appear on screen. There’s an awful lot you can do within those boundaries, though!

Possibly the best thing about Minecraft for teaching programming is that many kids love it. There’s a strong built-in motivation for them to try things out and see what they can create.

From Logo to Minecraft

Logo was possibly the first “teaching” language that was geared toward kids. Using simple commands, children could draw pictures by moving a “turtle” around on the screen or even an actual physical robot on a piece of paper.

ScriptCraft includes a JavaScript object called “the Drone” that feels a bit like the turtle from Logo. Using functions on the Drone, you can “draw” with Minecraft blocks. Want to make a 10x10x10 cube? Normally, that would mean placing 1,000 blocks, one at a time. Using the /js command provided by ScriptCraft turns that into just a quick bit of typing.

That instant feedback of typing a command and immediately seeing the result in your Minecraft world is fantastic. This seemed like the perfect entry point for getting children to do some JavaScript.

Setup Pain

As easy as it was to start coding with ScriptCraft, getting ScriptCraft itself running was not easy for many.

Most of the parents of the children in my class are not “computer people”. I created step-by-step instructions to set up Minecraft with the required mods on both Windows and Mac, but setup was still not easy. An automated installer would have been nice, but I didn’t have time to build one.

To make matters more challenging, the class met in a building that has barely functional Internet access. USB flash drives are not quite a thing of the past yet.

Also, some of the computers launched programs very slowly. I didn’t have time to track those problems down either, because I had a class full of kids, so my focus was on making sure that everything could run, even if launching was slow.

It’s worth noting that Minecraft is a fairly resource intensive program. That’s probably why Minecraft Pocket Edition was a ground up rewrite in C++: desktop Minecraft takes a pretty beefy computer to run acceptably.

Other local people who teach Minecraft classes bring their own equipment and teach with Minecraft: Pi Edition. This certainly gets rid of the setup pain, but the Pi Edition is nowhere near as interesting as the things you can do with ScriptCraft.

LearnToMod launched just as my class was starting. It sounds like they run the server for you which certainly makes life easier for the participants.

Graduating to code in files

There’s a limit to how much you can do from Minecraft’s little command line. It’s like writing programs in tweets. To do anything really cool, you need to edit JavaScript code in files.

The experience of modding Minecraft with JavaScript is still pretty great. You don’t quite have the immediacy of entering code in the command line, but you can dynamically reload your code without having to restart Minecraft. The iteration loops are still quick.

I got everyone set up with Brackets because I knew the editor well and I knew that the out-of-the-box JavaScript listing would come in handy.

Everyone was successful in running the new scripts that I provided each week. Sometimes they made their own customizations to the scripts, and some of the children clearly were writing some code of their own with varying degrees of success.

My “flipped classroom” experience

I taught this class as a “flipped” class: I’d post a video each week which provided the new material to learn and then planned for us to do more together during class time. My thinking with this was that by doing the experimentation at home after watching the videos, the kids could spend as much time as they wanted playing around with it.

When class times came around, I found that sometimes I needed to do a fair bit of tech support and that the environment hadn’t quite encouraged the kids to work together on things. There was a bit of “hey! look what I did!” that happened, but not quite as much as I’d have liked.

My Egg Hunt mini game from the last session was ridiculously complicated, but I think it did serve well to show off what was possible and was a fun activity that we all did together on the last day in class.

The flipped classroom approach is great because I could put the class online once it was done. At least one parent and child have taken a look and found it helpful:

Fun was had by all!

These children were already fans of Minecraft, but were entirely new to writing code. I tried to balance doing fun things with Minecraft that they couldn’t have done before with learning some JavaScript, putting the greater emphasis on fun-with-Minecraft than learning-JavaScript.

Despite the challenges that I’ve mentioned here, I had a good time creating and running the class and the impression that I got from the kids was that they enjoyed taking the class.

What did I learn?

I learned as much as the children did through this experience.

  • The ScriptCraft drone with the in-game REPL is brilliant. Kids love it and can make good use of it.
  • LearnToMod sounds awesome. Their approach (run the servers on behalf of the learners) makes a whole lot of sense. Alas, with the poor Internet access we had, doing the class in conjunction with LearnToMod would not have been an option.
  • The creator of ScriptCraft has since published a book (A Beginner’s Guide to Writing Minecraft Plugins in JavaScript). Teaching a class based on pre-existing material like that could have made my life easier.
  • I shouldn’t sign up to do a class when I’m already oversubscribed. At the time that I started exploring the class, I thought there would be no trouble… but I had so much going on when the class started that it was a struggle to sneak in my work for the class. The timing was just not quite ideal.
  • Even though the flipped classroom approach wasn’t as smooth as I hoped, I would definitely do that again. Especially when it comes to homeschooled kids, it makes sense for the kids to spend as much time exploring as they want. I would want to make sure that the in-class activity time could be smoother than the way it went for this class.

Minecraft is used for teaching a wide variety of things, and ScriptCraft offers a lot for people who want to learn programming in Minecraft, once you get past the setup.

The Changelog talks about TypeScript

Our guests this week are Anders Hejlsberg and Jonathan Turner. Anders is the language architect and Jonathan is the Program Manager for TypeScript, a typed superset of JavaScript that compiles to plain JavaScript from Microsoft.

I think Microsoft’s approach with TypeScript has been great. Check out this podcast episode for a detailed view into the project: #152: TypeScript with Anders Hejlsberg and Jonathan Turner from Microsoft – The Changelog

Measuring and patching phase for React components

On the latest episode of JavaScript Jabber, Amit Kaufman and Avi Marcus talk about how your web app performance is killed if you interleave your reading and writing from the DOM. For their now React-based app, they needed to measure certain elements for their layout work. Their solution sounds clever: components specify what information they’re going to need and they batch up all of the DOM reads and do them all at once and then they do all of the adjustments that come as a result of those reads all in one separate pass. This minimizes the amount of churn and recalculation that the browser needs to deal with.

Joining Khan Academy

We’re about 20 years into the age of the Internet, and I feel like it’s just getting warmed up. The Internet and modern computing have changed so many things, but the potential still seems limitless. Any area related to sharing of information is undergoing massive change, and education is certainly about sharing information.

I’ve been intrigued by Khan Academy ever since I first heard about it.  Sal Khan’s “here, let me walk you through that” videos made for a solid base upon which Khan Academy has grown and tried new ideas. The site offers a bunch of tools for flipping the classroom so that Internet-based learning doesn’t need to be limited to humans interacting with computers alone. They use machine learning techniques to figure out which problems you should be presented with next. They offer SAT prep. They have run experiments like LearnStorm in conjunction with traditional school systems.

And, they do it all for free. KA is a non-profit and their “mission is to provide a free, world?class education for anyone, anywhere.” Their code is open source and they’ve been one of the biggest contributors to React. Education can make a huge difference in people’s lives and this is an organization that is constantly working on ways to make that difference for as many people as they can.

Bill Gates called it the “future of education” at the end of Sal’s TED talk. And even Mr. Money Mustache says that “Sal Khan is pretty much The Man when it comes to great do-it-yourself education.”, though I daresay the Bill Gates endorsement likely carries a bit more weight.

We’ve already entered a period of unprecedented educational choice and opportunity, and by joining Khan Academy I’ll have a chance to do my bit to help children and adults who want to learn.

I’ve enjoyed my conversations with the KA people I’ve met so far, and I’m looking forward to getting started! What will I be doing at KA? I’m joining the tech staff and I’m looking forward to seeing how I can best help out once I’m there. I’m back to blogging at Blue Sky On Mars (more on that in another post), so expect to read more about my experiences at KA in this space.

Thanks to my friends at Adobe

My last day at Adobe was April 3rd. I am very fortunate to have worked at one of the best places to work during a phenomenally successful time as the company moved from packaged desktop software to a combination of software and services built as a whole.

I had the chance to work on interesting projects. Most of my time at Adobe was working on Brackets, one of the top 20 starred projects on GitHub. I got to work with smart and dedicated people on a project that people love, how great is that? The project underwent many changes while I was there, and the growth was unbelievable.

Most recently, I was the tech lead for a new, as-yet-unreleased project. One thing that I think Adobe does really well is that it gives people many opportunities for career development. I have been a manager at other companies before, but I am enjoying being hands-on at this point. Even so, Adobe provided a path for me to be promoted (thanks to my managers for supporting me in that!). I had many opportunities for success, despite being a remote worker.

There are pluses and minuses to working at a big company. The scale of what Adobe does can be breathtaking. I attended two MAXes (the creativity conference that highlights Adobe’s creative software) and two Tech Summits (an internal conference that brings together technologists from all over the company). These events are huge and well-run, and I enjoyed being on the program committee for the most recent Tech Summit.

Adobe’s scale enables it to create products that do things that no others do, and the pace of innovation is quite something to watch. I mentioned that there are downsides to big companies, and feeling like you don’t know what’s going on in other parts of the organization is one of those downsides. That’s a genuinely hard problem and people do work hard toward spreading information as well as possible.

By this point, you might be thinking “if Adobe’s so great, why did you leave?” I did not go hunting for a new job, but I came across an opportunity that I just couldn’t pass up. That’s a topic for another blog post. I have no reservations about recommending Adobe as an awesome place to work and to all of the people that made my time at Adobe special: thank you!

Custom messages for Jasmine expectations

jasmine-custom-message gives you a “custom failure message on any jasmine assertion”:

describe('the story', function() {
  it('should finish ok', function() {
    since('all cats are grey in the dark').
    expect('tiger').toEqual('kitty'); // => 'all cats are grey in the dark'
  });
});

Overall, I like Jasmine as a testing library, but this particular limitation has really bothered me.

Data Visualization with JavaScript

Data Visualization with JavaScript is a nice looking online book by Stephen A. Thomas:

If you’re developing web sites or web applications today, there’s a good chance you have data to communicate, and that data may be begging for a good visualization. But how do you know what kind of visualization is appropriate? And, even more importantly, how do you actually create one? Answers to those very questions are the core of this book. In the chapters that follow, we explore dozens of different visualizations and visualization techniques and tool kits. Each example discusses the appropriateness of the visualization (and suggests possible alternatives) and provides step-by-step instructions for including the visualization in your own web pages.

Faster Yosemite Upgrades for Developers

Faster Mac OS X 10.10 Yosemite Upgrades for Developers

Your Yosemite upgrade may take many hours if you’ve got anything non-Apple in your /usr folder (Homebrew, Texlive, or Mactex for example).

I don't think the solves the problem I had with the Yosemite install, but this article has good suggestions for anyone using Homebrew, etc. Note that this also applied to Mavericks so this might be useful advice again in a year.