Launching Code Cards on Hacker News

A few weeks ago I
launched Code Cards. Code Cards
helps you remember programming knowledge you don’t use on a day to day basis
using spaced repetition. In this post I want to talk about how the launch went
and a few of the ups and downs so far.

What problem does Code Cards attempt to solve?

When I’m coding in a language or environment I’m not using on a daily basis,
there are often features or idioms that I’m aware of exists but don’t have at my
fingertips. I constantly have to look them up, or I end up solving things in a
less proper way because I can’t be bothered to look it up in the moment.

I’ve noticed a lot of the great programmers I work with just seem to have a lot
of this knowledge already at their fingertips, which I think is really neat and
helps you maintain a state of flow while coding.

I’ve been using spaced repetition systems for a long time, and figured it would
be great to apply the same principles to programming.

What is spaced repetition?

Spaced repetition is a way of taking advantage of how human memory works.
Instead of reviewing an idiom every day or every week, you might repeat it after
a day, then a week, then a month, etc. This means you can keep hundreds of
idioms fresh in your mind in just 20 minutes a day. I have written more about
spaced repetition here.

Why not use Anki?

I have used Anki for a long time, and I’m a huge fan. Anki has a lot of features
and plugins and all kinds of bells and whistles, but at its core it is very
oriented around seeing a question, thinking about it, and then comparing with
the answer. Whenever I tried to do use Anki for code, it felt unnatural. When I
practice programming, I want to actually use my fingers and edit code, since
this is the natural mode for programming. Programming is fundamentally
know-how, not know-what.

With Code Cards I can start from scratch, focusing solely on making sure it
works well with code, having a good editor with syntax highlighting, relevant
content, etc.

Does it make sense for learning programming?

I think it is important to make a distinction between learning and
retaining knowledge. It only makes sense to retain or “memorize” knowledge once
you actually understand it.

If you are anything like me you are probably doing lots of different types of
programming. Some things are at your fingertips, other things you don’t care
about, and then there are a lot of things in the middle. Things you have to
google for the umpteenth time. Maybe it is some SQL syntax, or a git command, or
some standard library call in a language you don’t use everyday.

I think the question to ask yourself is: If you spend 4 hours coding every day,
would spending just 5% of that time reinforcing the things you learn make you a
better and more effective programmer? My hypothesis is that it probably would.

Three week limit

I had set myself a limit of working on it for three weeks before launching it,
but I kept postponing it. Initially it was because I wasn’t happy enough with it
myself, but at week 4 development slowed down and there was no clear end in
sight.

That’s when I realised I had an irrational fear of launching. I was in a safe
zone working on the project, and not measuring it against the outside work. I
had to just launch it. Better done than
perfect. Pieter Levels has a nice way of explaining this
phenomena, which I’ve illustrated below:

#1 on Hacker News

So at day 40 I finally launched it. I got lucky and it shot to #1 on Hacker
News, staying on the front page for over 12 hours. Thanks to this received about
10k users, a bunch of great feedback and some
press.

Horrible onboarding

Just one small problem. Most people weren’t actively using the product! One
would always expect some drop-off in terms of engagement (such as 10% trying it
out, 1% signing up, etc), but I saw huge drop-off numbers.

I hadn’t paid enough attention to the onboarding process. If you are a new user
at https://codecards.me and the
call to action is to add a programming flashcard, what do you do? You
might add a test card, but chances are you don’t have anything specific you want
to remember right that moment. The barriers to entry were too high. I had
optimized for my own usage, but hadn’t spent enough time seeing the product
through a fresh user’s point of view.

Few signups but many logins

The way I had set it up was to only show a signup notification (with a test
Stripe form) for engaged users. By “engaged user” I mean someone who performed
three actions, such as reviewing or adding a new card. I could count the number
of users who saw the signup notification on my fingers. Ironically, close to 100
people tried to login, which was only supported for paid users (non-existent at
the time) and a few beta testers I had whitelisted.

This is another instance of something that you only viscerally learn when you
get the hard feedback of numbers. If I had postponed the launch further I
might’ve had a vague understanding of the importance of onboarding, but it
wouldn’t have hit me as hard as it did. Lesson learned.

Customers on a plane

Luckily, I got around 100-200 (50+ email list, ~100 attempted to signin) emails
of people who seemed interested in Code Cards. After a bunch of people saying
the same thing, I realized having pre-made collections would vastly lower the
barrier of entry.

I hacked together a small collection of 10 cards that tests your knowledge on
the basic of Clojure destructuring. I added paid accounts and emailed the people
who were interested, and I got my first paid customer on February 1. I was
waiting to board my plane from Singapore to Taipei, and I charged them while
tethering to my phone using curl and Stripe’s API.

Next steps

The last few weeks I have added another collection for basic regular
expressions, added support for creating your own sharable collections, editable
cards, notifications when your cards are due, and a bunch of other tweaks and
bug fixes.

I have around 10 customers, so it’s not a huge success but it is a
start. I’ve seen reasonable usage of the custom collections, so I think it is
the way to go, but there are a lot of details to get right for it to be
sustainable and growable.

A few people are using it quite a lot, so that is motivating, especially in
terms of implementing things they really need. Since it is still just an
experiment I’m to keep working on and shipping other things. The next
mini-startup will be announced soon.

(Want to make sure you have basic regular expression knowledge at your
fingertips? No signup required. Go to Code Cards collections
and check it out.)

Thanks to Tokyo Pantaloni and Pieter Levels for feedback on this post. Thanks
to Andrey Azimov, David Branner, Martin Klepsch, John Omar, Pieter Levels, and
many others for early feedback on Code Cards.