Monday, November 16, 2009

A few lessons from the first week of ThinkCode.TV

A week ago my co-founders and I launched ThinkCode.TV's Italian catalog. While we are currently producing and selling Italian programming screencasts and video courses, we'll eventually offer others in multiple languages (starting with English in the first quarter of next year).

The launch was a major success and each day continues to exceed our expectations. While we are unable to claim to have acquired any deep insight about how to run a startup, we feel it's important to share our discoveries, however biased and circumstantial they may be. We are thankful to those who did so before us, as we have learned a lot from reading, both online and in books, about other startups' experiences and mistakes.

After working on it in our spare time for months, we finally decided to incorporate ThinkCode Labs, Inc. (the incorporation was done through a solid law firm in Toronto and cost us less than $2000) and launch the Italian site.

Learn to ship imperfection

There were about a thousand little things that popped up and got in the way, strongly suggesting that we should wait and delay our launch date. We truly had to give up perfectionism and learn to "ship imperfection" or we might have put off our launch forever. As it turns out, every small issue we thought might be problematic, did not end up impacting our customers, and the feedback we've received so far has been overwhelmingly positive.

We were put to the test on the night before our launch. It turned out that our e-commerce provider (who is otherwise excellent) could only apply our corrections to their Italian translation for our cart in two to three weeks. Not only that, but Italian customer who tried to apply a coupon we'd issued would see a message along the lines of "You just saved #(quantity} dollars". Note those pesky unbalanced parenthesis! This typo was a bit more serious than a funky Italian translation. It could have cost us some serious money.

So we had to decide if it was worth waiting another two to three weeks for the "perfect" launch, or to go ahead and embrace imperfection. We chose the latter and are glad we did.

Create a minimum viable product

If it were up to me, I would have loved to create a very fancy site full of fundamental features and start with a catalog that was rich in videos both in Italian and in English. But we had to give up on this idea pretty quickly or it would have taken us over a year to launch (remember, we work hard in our spare time, but we are employed full time elsewhere, except for Marco who is CEO of his own publicly traded company in Italy).

In the end what allowed us to go live was the notion that a minimum viable product was all we had to achieve.

So we started in Italian, and with only five videos:
  1. The first two lessons of the course on Test-Driven Development;
  2. The first two lessons of the course on Python;
  3. An individual screencast covering MacRuby and HotCocoa.
Admittedly an honest and humble start, especially in a smaller market like Italy, but it was a viable start nevertheless.

Be ready to change and adapt very quickly

This is nothing new for those who have experience with Agile programming or the concept of Lean Startup, or Evolution for that matter. Being reactive and ready to change proved invaluable for us.

When we started we didn't have Flash previews, but rather Quicktime Movie samples. We simply didn't have time to set them up, and we opted to offer previews in one of the formats we had (our files are downloadable in HD 720p, as .mov, .avi and Theora Ogg).

We received several support emails asking for Flash previews. It would seem people were passionately in favour of this. We literally rolled out Flash previews in two hours that night. The conversion rate increased sharply. A relatively small change, implemented quickly, ended up pleasing our customers and helping our bottom line out.

Do what's right, even when it makes things more difficult

A more drastic example of this scenario related to pre-orders. Before launching we discussed at length whether or not we should have pre-orders of whole courses, while they are still being developed. We liked the idea of this sort of "beta" a lot, because it could have helped our cash-flow and provide customers with a convenient method to pay once and receive the lessons as soon as they become available.

The real downside was that this is not a feature that is supported by our payment processor and e-commerce software, so it would have involved manually fulfill the orders, other means for delivering the digital goods (e.g., Amazon S3/CloudFront), securely storing a mailing list of people who pre-ordered for each course, complicated accounting if the course was produced by an external author, and so on. It would have required a lot of extra work at a time when we had plenty already.

We opted to start by simply selling the lessons that we had available (at €4.99 each). Guess what the most requested feature was? Pre-orders. Our company may be new, but Giuliano, Marco and I are relatively well-known and trusted by our Italian audience, some of whom had strongly advocated for us to introduce pre-orders. (I believe that pre-ordering from a brand new company involves a certain level of trust.)

We quickly adapted and decided to do the right thing, even if it complicated our job, and launched this feature in record time. We made a decision on Thursday night, and ended up launching it a few hours later that same night (Friday morning in Italy).

We offered a substantial discount (about 30% off) compared to purchasing the lessons individually (you can still buy them individually though). What were we supposed to do though with those customers who had already purchased one or two lessons? We offered them a coupon that essentially gave them a full refund on the lesson(s) they had already paid for. So instead of paying €4.99 for 11 lessons of the course on TDD, we gave them a €10 discount on the pre-order price of €39 (we gave the same coupon to those who bought Python lessons, despite the pre-order price of just €29).

I went to sleep that night thinking that we had rushed a lot of manual work for what would probably be relatively little return, but the satisfaction of a few early adopters was good enough for me.

In the morning when I checked my email I found more than a dozen pre-orders. By the end of that day, we had earned more money than the rest of the week combined. We were blown away and this really motivated us to push harder when it comes to creating the rest of the courses for those customers, as well as looking forward to the contributions from our external authors (that have already been working with us for some time now).



We believe that listening to our customers, without letting them guide the company for us, is a very balanced approach that pays off in the long run. Had we not listened and acted quickly on it, despite the challenges involved, we could have missed this great revenue opportunity and disappointed many customers in the process.

Don't assume, let the market be the judge

The surprising results above taught us how misleading assumptions can be. Letting the market judge ideas and theories is really the best approach, when feasible.

We assumed people would buy the Python course much more than the Test-Driven Development one, or that they'd sell equally well, after all we are incredibly established in the Italian Python community. It turns out, the TDD course entirely outperformed the Python one (which is doing pretty well anyway).



We assumed that our customers would buy a single lesson of a course, see if they liked it, and then eventually purchase the other one (this was before we introduced pre-orders, of course). Wrong again, almost every customer bought both lessons of one of the two courses (and some customers simply bought every video available in the store).

We assumed that sponsoring an Agile conference would significantly boost sales for the TDD course. Unfortunately it didn't. The TDD course is selling like hot cakes, but not from that source. Things may change when the conference actually takes place (for now our ad is just on their website for people to see when people register), but we are not going to assume this. ;-) Regardless of the outcome, we are happy to support attempts to improve the craft of programming in Italy.

We assumed that having a decent budget, high max. CPC, focused keywords, and optimized ads for Google Adwords, would lead to a more or less constant stream of conversions. So far, that's been far from the case and several of the specific keywords we target have incurred an insufficient volume of searches originating from Italy.

The lesson for us here was, when in doubt don't be lazy, try it in the market (and split test).

Measure everything

One of the nicest things about charging for a product is that most of your metrics can be expressed in dollars. Your whole approach to measuring your web performance changes. Most sites measure their success in absolute visitors, pageviews, registered users, and so on. If these numbers are large enough, even with a tiny conversion rate (from visitor to customer), you'll get enough business. But it's not really what we are focusing on.

As a business, we think it's important to measure success in dollars and customer satisfaction, so the single most important factor for us is obtaining conversions and making first time customers so happy that they become returning ones.

A smaller, more interested group of visitors, will always lead to more sales than a larger, vaguely interested one. In fact, most of our business so far has come from the few hundred people who joined our newsletter or followed us on Twitter in the months leading up to our launch. When I covered the announcement of our launch on a popular Italian programming site I started, that's followed by more than five thousand people, we received very few sales in comparison.

Focus on what you do best

Whenever possible we opted to delegate our non-core business to those who do it best. We use Dropbox for sharing files with our authors, Amazon S3 for archiving, backing up and for part of our digital deliveries, MailChimp for handling newsletters, Radiant CMS for our brochure site, FastSpring for our e-commerce and payment processing, and so on. Each of these five services/products is spectacular in its own right and has made our lives a little bit easier.

tl;dr Ship your product/site as fast as you can, and then adjust continuously based on valuable metrics and your customer's feedback.

For those of you who haven't already, please subscribe to this feed and join our English newsletter. Also, if you are a native English speaker (or virtually so), an excellent programmer and communicator, and would love to become one of our authors for the English catalog, feel free to get in touch with us (authors@thinkcode.tv). We offer very generous royalties and would love to hear from you.

Sunday, August 23, 2009

Taking things one step at a time

After much discussion and consideration, in which we evaluated the advantages and disadvantages of each option, we have decided to launch the Italian site before launching the English catalog. We expect to publish the first English screencasts a few months after the initial Italian ones have been released.

This wasn't an easy decision, but as we're getting very close to the Italian launch date, we considered the idea of launching the English site at the same time to be a bit too overwhelming. The amount of work required to handle them separately is already quite staggering on its own.

We are making solid progress on the English front, and have a few initial collaborations going on with several international authors, however we'll need some more time before being able to introduce our screencasts to the English speaking market. We are taking things one step at a time, without rushing too much. We're looking at this from the perspective that we're not willing to trade long term goals for short term success.

We hope to be able to incorporate all the lessons, and the solutions to challenges we will have likely encountered with the Italian site, when it comes time for the English one to shine.

The Italian public will be glad to learn that the wait is almost over, and that we've opened a blog in Italian dedicated to ThinkCode.TV, which will be parallel to, but not a direct translation, of this one.

Monday, July 6, 2009

Working on the first lesson of my TDD video course

Hi there, allow me to introduce myself, I'm - and I have the pleasure of being - one of the ThinkCode.TV co-founders (together with Antonio and Marco). My area of expertise relates to Agile Software Development in general and Extreme Programming in particular; I consider myself to be a software development "generalist". These days I spend most of my time on code bases written in a mix of Java (mostly), Ruby and JavaScript.

I'm working on one of the screencast series that will be available for our official launch date: A Guide to Test-Driven Development (TDD). For those of you who are not very familiar with the concept, TDD is a powerful engineering practice that's at the core of Extreme Programming. As its name implies, it is a software development discipline in which development is guided by tests, one at the time. Right now I'm in the process of editing and mixing together various content for the first lesson, which will initially be available in Italian and shortly thereafter be released in English. The bulk of it is recording a programming session in Eclipse, which then gets mixed with explanatory “panels” in the form of slides.

Lesson 1 is about TDD's so-called microcycle. This is the cycle of programming activities that comprise the basis of TDD. The emphasis is on rhythm and speed; my intent is to show how a progression of "easy to define" tests can guide the development of an algorithm that could otherwise quickly lead to the usual mess of ifs and loops. To avoid running into this situation, I'll show you how the resulting code can be both clean and concise.

It's worth noting that in this lesson we will only scratch the surface of different TDD aspects. Viewers of this screencast will have to be patient and wait for subsequent lessons in order to tackle other aspects like evolutionary design, dependency injection, mock objects, etc.

I'm really looking forward to releasing this course to the public as soon as we have everything ready for the launch. Stay tuned!

Wednesday, July 1, 2009

Don't make them think

Usability is the art and science of assessing and improving the ease of use of user interfaces. In other words, its primary goal is to detect and eliminate elements that confuse a given user base. It's a field where paying attention to detail is fundamental, and assumptions can be a very dangerous thing. The title of an excellent book on the subject, Don't Make Me Think, clearly summarizes the main idea behind usability.

Our first usability mistake relates to our newsletters. ThinkCode.TV is going to have two catalogs of programming videos, one in English and another in Italian. As such it makes sense to have different newsletters that cater to the two different audiences. It's also safe to assume that the number of Italian hackers who understand English is much higher than the number of non-Italians who speak Italian. Thusly we intend to announce products from the Italian and English catalog within the Italian newsletter, whereas on the other hand, we'll only announce English courses and individual screencasts in the English one. Italian programmers can join the Italian newsletter and non-Italians can join the English one. Makes sense, right?

Initially we'd had a verbose explanation about this on the sign-up forms, but we didn't really like the wall of text it created, so we got rid of it. After all, we'd put "English" and "Italiano" links at the top of the page, and assumed that the majority of Italians would just click on their beloved flag and sign up for our Italian newsletter. That assumption proved to be entirely mistaken.

Yesterday alone we had ten Italian people join our English newsletter, instead of the Italian one. We are talking about hackers here. People who are typically fluent enough to fill out a basic form in English, which meant that most of them didn't bother to click on "Italiano", as they assumed (we're guessing) that both languages would lead them to the same newsletter. No one can blame them. It was a genuine usability mistake on our part.

To partially fix this issue we switched "English" into "English Newsletter" and "Italiano" into "Newletter Italiana". Initial stats from today show a huge improvement (only one person decided to join both). All thanks to a small detail that took five seconds to change. Within our first email campaign we'll mention that Italian speakers should switch to, or at least join, the Italian newsletter as well.

If we wanted to take things one step further we could choose what form to show based on the IP or the language of the user's browser. Even more drastically, we could consider merging the two newsletters together and sending out emails that contain an Italian translation at the bottom. But we'd like to be able to communicate with the two groups independently and we feel that English customers may not want to be exposed to the Italian side of things (after all ThinkCode.TV is a Canadian startup).

The moral of this story is that paying attention to detail and usability, can make a huge difference. And with this little tale, we wish you a very happy Canada day!

Monday, June 29, 2009

Hello, World!

Hi there, welcome to ThinkCode.TV’s newly created blog. We will be using this space to share updates regarding what we’re working on, as well as a means of communicating directly with, and receiving feedback from, you. In the mix, we’ll thrown in posts that can be of interest to other startups or programmers in general. Make sure you grab our feed so as not to miss anything.

ThinkCode.TV is a very ambitious project, that was started by three professional programmers with a deep rooted passion for the open source world, programming and teaching. We strongly believe that producing top-notch programming screencasts and courses authored by experts is going to be a sustainable business, a useful service for the development community, and the ideal delivery method for teaching the craft of programming in this day and age.

We also believe that these points can be achieved by maintaining the utmost respect towards our authors and customers. As a result of this belief, our authors will always receive a more than fair share for their work. Likewise, we believe in the honesty of our audience, and would never disrespect our customers by imposing software limits on how they watch the videos they’ve paid for. Hence, we’ll offer our customers affordable, DRM-free content in several handy formats, including the open and royalty-free format Ogg/Theora. The ThinkCode.TV alien wouldn’t have it in any other way. ;-)

Furthermore, for each course (a series of screencasts) we’ll give away the first episode in its entirety through the BitTorrent protocol for free. This way a potential buyer will be able to better gauge the value of a given course, before committing to purchasing the whole thing. We expect to release further material here and there for free, even though the bulk of our content will most likely be for sale.

We are fully aware that a startup’s fate is often written by the many small scale decisions made on a day-to-day basis, and when it came to deciding whether we should start a blog before our site went live, Marco, Piergiuliano and I, unanimously agreed that opening up a means of communication as soon as possible was the way to go. It’s our “open” spirit. In fact, through this blog we’ll be able to publicly track our progress and even involve you in our decision making process.

Stay tuned and please join the conversation. We look forward to hearing from you!