I’m 16 months into my language learning startup, Readlang. So far I’ve been working completely alone, learning a lot about web development, design and marketing as I go. I’d like to say that I’m learning about running a business too, but calling it a business still sounds like a stretch, since it’s still only making pocket change.
This is going to be brutally honest, I’m not afraid to share numbers. For starters, here’s the performance of the site over it’s entire lifetime so far, from Nov 2012 to mid March 2014:
|Signups:||4,667 (19% of visitors)|
|Paying Subscribers:||126 (3.1% of signups, excluding the first 600 users who have free lifetime membership)|
And this is how I arrived here, month by month…
November 2012 the idea
I’d been living in Madrid for 9 months, yet my Spanish was progressing slowly. I wanted to read a novel on my iPad and couldn’t find a method I liked. I wanted these features:
- Quick translation to English
- Record all translated words
- Create flashcards or learning games with my translated words
At the same time, I was looking for an idea that had the potential to turn into a small software business, and so the idea for Readlang was born.
I googled for similar projects and didn’t find anything exactly matching my needs (although I’ve since found many in this general area). The closest was a site called LingQ but the interface was too cluttered for my tastes, especially to read long form content like a novel, and the free plan is very crippled allowing a total of just 20 words, so you need to pay $10 / month to use it. If LingQ were making a business from this, I figured I had a chance by making a freemium app with a useable free plan, and geared towards reading long form content in a distraction free environment.
I created a static HTML page prototype in a few hours. A single page of text, where clicking on any word would trigger a Google Translate API call and replace the original word with an in-line translation. I’d never seen a reading tool do inline translation like this, it was simple, fast, and worked surprisingly well. Even where the translations weren’t perfect they were good enough to understand the meaning of the text almost all the time, and it felt less distracting and faster to read with than a typical popup dictionary.
I was encouraged enough to continue.
- Click to translate
- Just me
December 2012 the tech stack
My first decision was to choose a technology stack. This was my first project with a backend so my choice was wide open, and I decided upon:
- Node.js - because it can handle a lot of concurrent users on modest hardware, and allows sharing code modules between the client and server.
- MongoDB - because the API was very easy to use, I’d heard it was fast and able to scale if needed, and I wanted to try it out. I did question it’s reliability, but this post on the Trello Tech Stack was enough to convince me, if it was good enough for Fog Creek, surely it was good enough for me.
In a couple of weeks I had a simple version working which let me ditch my paperback copy of Intervencion and start reading it on Readlang. Everything was very ugly and buggy but it worked, and I was using it religiously every night.
- Uploading of texts
- Pagination: Tricky to implement in a web-app, but more suited to long form content like novels
- User authentication
- Simple flashcards
Users 3 (+2)
- My girlfriend
- An ex-colleague from Mendeley
January 2013 friends and family
Continued laying the foundations with more core features and bug fixing. It’s very exciting to iterate on such a young product you’re using yourself. Every night I would find bugs or come up with improvements that I would implement the following day. The only problem – reading before sleep was no longer so relaxing!
I created accounts for a few friends and family to try out. Almost nobody did, and I can’t blame them given that:
- it was still rough and buggy
- most of them weren’t even looking for such a tool
- Importer bookmarklet - imports plain text versions of websites a la Instapaper
- Edit flashcards - for correcting bad translations
- Spaced repetition algorithm - uses an algorithm to schedule learning
Users 15 (+12)
- Friends and family - didn’t use it much
February 2013 public beta
With no marketing effort, predictably few users turned up. This was intentional, I was still hashing out the core feature set, and adding more bugs than I was fixing.
To close the month, I created my first screencast video, which took hours of stops and starts to try to get right.
Users 29 (+14)
- Invited a few more friends and colleagues
March 2013 first round of publicity
I put on my designer hat and spruced up the look of the site, and landed on the white Georgia font on a green background (Readlang) that’s still used today.
The old video was already out of date so I made a new one less than two weeks later, which would stay on the homepage for the next 6 months.
The first public call for feedback was this How To Learn Any Language post. I got 38 new visitors in March from this post, which is small but very well targeted. The forum is frequented by some hard core language geeks and polyglots, who discuss techniques like the Gold List Method, the 10,000 Sentences Method, and Massive Cloze Deletion. The response to Readlang was encouraging and they gave me a lot of great feedback, in fact all of the features listed this month were in response to their suggestions.
It was from this forum I learned about the existence of LWT (Learning With Texts), an open source clone of LingQ with very similar goals to Readlang. It’s creator hangs out there too and gave me some nice feedback and this ominous warning:
It gave me pause for thought, but buoyed by the rest of the feedback I carried on regardless.
The second call for feedback was this post on the /r/LanguageLearning subreddit. It sent a more healthy 183 visitors my way. Again the feedback was encouraging.
I was very excited to see an unsolicited blog post about Readlang here on Page F30. I added some social sharing buttons to the footer to try to capitalise on the new influx of users. Things were going well.
- Multi-word phrase translation
- Additional dictionary definitions in sidebar
- Export of words to Anki (popular open source flashcard tool, with offline mobile apps)
- Chrome extension - Web Importer
Users 168 (+139)
- Lots of feedback from Reddit and How To Learn Any Language
- Blog post on pagef30.com
April 2013 the YouTube distraction
This month marked a minor turning point – the site was finally working well for my needs. There was plenty of room for improvement but I wasn’t lacking any essential features. So when priorising tasks my mantra started shifting from “what do I want?” to “what do users want?” and most of all, “what will attract more users?”
I may have made a mistake at this point. I should have put effort on polishing and marketing the current feature set. Instead, seduced by feature-itis, I decided the site needed audio support to compete with LingQ and LWT.
I spent a couple of weeks on an embedded audio player which the user could synchronize with the text. I planned to store uploaded audio files on Amazon S3 but after taking a look at the YouTube API I realised that would be simpler to implement and would allow access to a huge library of free audio and video content.
The feature has since proved popular, with users syncing and sharing many videos, most commonly music videos. But I feel it’s made the site less focussed on it’s primary use case of reading long form content so I’m not convinced it was a the best idea, and that I should have abandoned it, or stuck to pure audio which would better suit listening to podcasts or audiobooks.
- Change the scheduling algorithm to provide all flashcards at a fixed time of day
AudioYouTube video synchronisation
- Bug fixing - the code for updating word counts for your scheduled words was fiddly, but I got it working smoothly (and then 4 months later I would rip it out completely since I didn’t like the feature!)
Users 256 (+88)
- I tried to be helpful on some Reddit threads and picked up a few more users along the way
May 2013 metrics
I had basic Google Analytics set up but didn’t have a good handle on what users were doing with the site. I rectified this by storing all my API calls in the database and creating with a custom page showing the daily and weekly usage of various features. I realised many signed up users hadn’t even translated a single word, so I added a modal dialog the first time they see the reader page and tell them to “Click on any word to translate it”.
I put $20 into Google Adwords campaign and spent half of it over a few days. It was useless - I paid about $0.40 per click and got an 89% bounce rate from these visitors, when my average bounce rate at the time was 45%. Granted, there were many optimisations I could make, but even so, AdWords looked unlikely to ever make sense.
A big problem for new users was the lack of content ready to read on the site. They needed to either upload or import a text first. I tried to solve this by allowing users to share texts in a public library. Sharing didn’t take off at first because:
- Not enough users for each language - at this point I might have had enough total users to start one community. But by this point I supported 24 languages, and I certainly didn’t have enough users to start 24 separate communities.
- There was no commenting, voting or anything to encourage sharing.
Despite this, the sharing feature it allowed me to seed content for newcomers to read, without need for importing.
(To date, over 900 texts have been shared, and to avoid copyright issues I’ve had to remove Harry Potter 20 times in various languages!)
- Walkthrough dialogs
- Sharing feature
- Hacked together a chapters feature, which has only ever been used for the El Principito example text (general support for chapters is commonly requested, I should to get back to that)
- Audio pronunciation using Microsoft Translate API
- Suggested links for each language, e.g. BBC, El Pais, Wikipedia
- User activity metrics
June 2013 growing Google Translate expenses
I was happy to discover that a guy called Tom Tabaxzynski had created this YouTube screencast of Readlang. It was disturbing to see the way he translated a whole sentence as if that was the normal way to use Readlang. I would normally translate single words and occasionally phrases of up to 4 words or so. I dug into my usage logs and found that some users were routinely translating very long phrases. This had me spooked since:
- Google charge for translations per character.
- You had to build up a phrase one word at a time. e.g. to translate “not my cup of tea”, it would send all of the following to Google:
"not", "not my", "not my cup", "not my cup of", "not my cup of tea"
My Google Translate expenses had quadrupled from $4 to $16 in one month, which wasn’t a lot but the trend was alarming. For this reason, I finally got around to implementing drag/swipe to translate, which was better for my bank account and a nicer experience for users. I also limited the length of phrases to 6 words each (and later upped it to 8 words after some user feedback).
It was time to think about charging users. Since translations would be the largest per-user expense if the site grew, I based pricing around these. I chose to limit phrase translations to only 5 per day for free users, and offer unlimited phrases (up to 6 words each) for paying users. I chose an initial price of $10 per year, which was low, but I figured it should easily cover the Google translate costs and would test the waters to see if people would pay, after all the product was still in beta (and still is!). As appreciation for using the early beta, existing users were not charged, but soon I started asking for payment from new users…
- Add testimonials to landing page
- Readability metrics - a very simple home-grown algorithm for estimated difficulty of texts, I’ve been meaning to open source this to encourage the community to improve it.
- Drag to translate - required implementations for both the mouse dragging and touch swiping APIs
- PayPal for subscription plans
Users 561 (+172)
- An ed-tech blogger shared it on scoop.it which sparked off a flurry of social media sharing
July 2013 revenue begins
On July 1st I switched on payments. New users were presented with the basic looking dialog to the right after translating 5 phrases in a single day.
Amazingly, only 2 days later, I woke up to see an email from PayPal - I had my first paying customer! Actually, not just one, there were 2 on the same morning, while I was sleeping! It’s crazy but that $20 gave me a great boost, a feeling that this might actually work.
- Prioritise phrases based on the frequency of the words within
- Allow a word to have multiple different contexts
- While in the flashcards, allow clicking to translate words in the example context
- Star word to prioritise learning them
- Chrome web store app - just a glorified bookmark, but it’s free exposure
Users 1087 (+426)
- Paying subscribers: 10
- Large increase in signups
- Many new visitors via this Russian Lifehacker article
August 2013 time for a break
A disturbing story appeared on the front page of Hacker News at this time: Shutting Down a Dream. It’s the story of the web site Word Champ that includes a web reading interface, translation, and spaced repetition flashcards (sound familiar?) that was earning so little money it needed to be shut down. Language learning websites seem to be a tough niche to crack, was it possible to make a business with Readlang? This knocked my enthusiasm down a notch, but I was still optimistic. I commented thanking the author for the story and linked to Readlang.
Something that bothered me about the flashcard scheduling was the feeling of guilt that would take hold when you have a backlog waiting for you. It plagues Anki and other SRS (spaced repetition system) software too. I gave it some thought and decided to remove the guilt-inducing backlog count, and allow you to practise your flashcards in smaller batches as suited you. Read more here. I’m still very happy with this modification.
It was encouraging to be getting most of my traffic from word of mouth and referrals, but I felt I was missing out on search engine traffic, which was very low. In fact, most of the traffic from Google was from people specifically searching for “Readlang”. I wanted people who were searching for things like “read Spanish”, “learn French”, “learn Italian from stories”. I auto-generated landing pages for each of the supported languages, which were all identical except for the title and a short list of links to public texts if they existed. These pages never attracted many visitors, and I removed them months later just in case Google may penalise me for duplicating content.
I took my hard earned riches ($140 in revenue!) and went on holiday. I kitted myself out with an iPad, a bluetooth keyboard, and a copy of Prompt so that I could ssh to my server if needed, and headed to Croatia.
- Simplify spaced repetition scheduling
- Landing page for each language
Users 1261 (+174)
- Paying subscribers: 19 (+9)
- User growth decreases back to normal
- Some visitors arrived from a comment I left on the Shutting Down a Dream blog post
I’d been thinking – it doesn’t make sense to have so many different language learning websites and apps, all of which are unaware of your general learning progress. Surely it would be better if there was an open platform that all learning tools would use.
I took a small step in that direction. I implemented OAuth to allow anyone to create an app or game that could read and edit user’s Readlang words. I created a pretty crappy game based on this and put the source code on github. I emailed a few people but didn’t publicise it. I’ll probably return to this in one of the following cases:
- Readlang gets enough users to make it enticing platform to developers
- I decide to break off the spaced repetition part of Readlang into a stand alone open source project, which could make it useful to build on even without a huge user base
Almost immediately after creating the promo video, I added a feature that made it out of date – the Web Reader. The impetus for this was the feedback I saw in the comments to Shutting Down a Dream, a common theme was that users really wanted to find a replacement for it’s Web Reader feature. To implement this I improved the translator bookmarklet created way back in February. The old translator bookmarklet worked by doing some RegExp string substitution on the entire page HTML to fill it up with span tags. The new approach was to traverse the DOM and perform more selective replacement of each text node with span nodes, and worked more reliably than the old one.
This month I sent my first feature update newsletter to the site’s first 500 users and got a respectable 8% click through rate.
- Open API - allows access to users words
- Promo video - out of date already
- Credit card payment option with Stripe
- Increase free plan to 20 phrases per day after a few complaints from users who ran through the 5 very quickly
- Replace the old bookmarklet and Chrome Extension with the Web Reader – allows translating words without leaving the page. Old importer still available via the Import button in the toolbar
Users 1586 (+325)
- Paying subscribers: 27 (+8)
- I posted my new video to Reddit and got very nice feedback
October 2013 traffic
I got very excited on 4th October to see 20 people using the site concurrently! The pattern suggested a school was using it in their classes throughout the day. I’ve since noticed other schools using it. This was pleasantly surprising since it was designed purely as a self study tool.
I followed up last months successful Mail Chimp newsletter with this failed one, which I’m almost embarrased to link to. The copy at the top provides no value to users and is written completely from my point of view. The interesting parts are buried at the bottom. This performed predictably worse, with a 4% click through and 1.8% unsubscribe rate, yikes! I haven’t sent another one email via MailChimp, not because I don’t like it, but because it’s too expensive now that I’ve outgrown the free plan.
Being a single page app, Readlang was almost completely invisible to Google and other search engines. The only part they could see was the landing page. This seemed like a waste since I could potentially be generating a long tail of search engine traffic based on the growing library of public content on the site. To this end, I tried to serve static versions of many pages in <noscript> tags, pregenerated using Zombie.js. This has been in production off and on for a while but is a hacky solution and I’ve yet to solve this nicely.
The most exciting thing that happened this month was an influx of new visitors from this blog post on esl.about.com. Typical traffic at the time was about 50 new, and 70 returning visits per day. The largest spike of traffic from that blog post came on the 16th October (curiously, 6 days after it was posted) when I got a whopping 935 new visitors, of whom 158 signed up for accounts!
I had a couple of requests for an alternative payment option to PayPal. Stripe had just launched in the UK and I’d heard good things, so I added it. Integration was fairly simple, and the modal checkout dialog they provide is very nice, in theory allowing you to pay without leaving the page. In practise I needed to redirect to a https page in order to show the dialog, but still, it was nice. Of the payments this month, 15 (65%) came via Stripe. Since then, 42% have chosen to pay with Stripe, the rest with PayPal.
(You may wonder why I don’t just make the whole site https. It’s because I need to support http iFrames. There’s a few things I could write about the hassles of using both http and https, but that can wait for another blog post, this one’s long enough!)
- Stripe for payments
- Use zombieJS to render HTML on the server
Users 2459 (+873)
- Paying subscribers: 50 (+23)
- 1465 new visitors from Kenneth Beare’s post on About.com
- 465 new visitors from the Duolingo forums and the Duolingo subreddit - Readlang continues to be recommended in the Duolingo forum discussions every now and then
November 2013 happy birthday!
I wanted to inject some life into the public library, so I added Reddit style voting and spruced up the UI with thumbnail images. Ideally, I would have liked to add commenting too. I considered using Disqus as a stop-gap solution, but in the end decided to wait and one day implement a more integrated solution. I also added the Reddit style voting to the Web Reader bookmarklet/extension, so that users could recommend any web page without importing it to Readlang first.
I was worried about potential copyright issues with people sharing imported versions of articles. It’s the same issue I imagine read-it-later services like Instapaper, Readability and Pocket worry about. My solution was that any shared text that came via the importer would be shared as a link to the original article. Any user who follows the link would then need to open the Web Reader manually to translate, which they may not have installed yet. This sucks in terms of UX, ideally the Web Reader toolbar would be loaded automatically, but this isn’t technically possible (at least not for the bookmarklet, it probably is for the Chrome Extension) and the best solution I came up with was to present a dialog saying “You are leaving Readlang, please install the Web Reader bookmarklet or extension to read this article…”.
Up until then, I’d been working from the lounge of my flat in Madrid which wasn’t ideal. I wasn’t getting much exercise or interaction with people. In the evenings my girlfriend would want to relax, whereas I wanted to go out for a walk since I’d been stuck indoors all day! That’s why I jumped at the chance to get set up at the Madrid International Lab, a free co-working space for international entrepreneurs. I have a much healthier routine now that I come to work here every day. It’s great and I almost don’t want to recommend it in case it becomes too crowded!
I was planning to raise the price, but since it was approaching Readlang’s one year anniversary, to celebrate I created a special offer – for a few days I halved the price from $9.99 / year to $4.99 / year, and announced it via email to all users who had reached the free limit and not yet upgraded. It succeed – I received 16 new payments over 3 days. It wasn’t much money, but for people to pay anything shows they value the service.
- Reddit voting - get people sharing more, provide useful library of content.
- Share links instead of imported texts on public library
- Customisable Dictionaries - allow users to change the iframe dictionary themselves
- Typing mode - allow typing answers to flashcards
- Fix awkward bug where http and https version of site don’t share the same localStorage. Solution involved embedding an invisible https iframe on the http site, urgh!
- Set up amazon SES emailing. Used for opt-in daily reminder emails, and automatic welcome emails
- Start tracking events with Google Analytics
Users 2845 (+386)
- Paying subscribers: 84 (+18 at $9.99 / year, +16 at $4.99 / year)
- Main referral sources were Duolingo, About.com and Reddit
December 2013 payments dry up
December got off to a slow start in terms of payments. No one was buying at the new $19.99 price point. I begun to regret the special offer, since it meant I couldn’t answer any of the following questions:
- Did people take up the offer because of the lower price?
- Did people take up the offer because of the urgency?
- Are people not buying at $19.99 price because it’s too high?
- Are people not buying at $19.99 because I’ve now exhausted the pool of potential customers?
By the 11th there were still no payments, and I changed the pricing to be tri-monthly at $4.99. The orders finally started trickling in again, but whether this is due to the new pricing, or just the build up of new users after the offer, is unclear. In retrospect, I should have held out longer at the $19.99 / year price before changing my mind.
By the start of 2014, December had brought only 7 payments at $4.99, one of which from my mum! Things were starting to look bleak. After working over a year with no pay, and the prospect of earning anything like a salary still distant, I was questioning how much longer I should continue. There was still huge potential to grow, but there was also lots of competition, more that I realised when I started. Over the year I seemed to find a new competitor every couple of weeks and had to maintain a spreadsheet to keep track of them all!
I was entertaining thoughts of open-sourcing the whole thing like Samuel Clay did for Newsblur, in the hope that it may spur some interest and publicity, and that if I ever did move on, at least other developers would be able to continue it. I abandonded this idea since I reasoned that open source works best for libraries and infrastruture used by other coders, and not for monolithic consumer products, which are more likely to languish, unloved, on github. I still think it would nice to break off parts of Readlang to release as open source, but it’s tough to find the time to do the refactoring and documention needed when you’re in the trenches trying to get a struggling startup off the ground.
A glimmer of hope surfaced in an email from a College professor in New York asking for a teacher console to help him use Readlang with his classes. I’d received similar requests previously but always resisted since I foresaw a danger of getting lost down the rabbit hole, complicating the product by implementing lots of features of no interest to my current core user base of motivated independent learners, people like me! This time though, I was warming to the idea since he indicated that this would be something he would pay perhaps $89 / year for as an instructor, with the students paying about $10 / year. They aren’t huge numbers but if the appeal was wide enough this would be worth pursuing. Perhaps this was how to turn Readlang into a viable business. I reasoned I could create an MVP of some class management features in a couple of weeks, invite a bunch of teachers into a closed trial, and see what happened.
So despite my doubts, I geared up to continue in earnest in the new year, and welcome the teachers.
- Daily report - yet more metrics that I can ignore
- Pricing at $19.99 not working - perhaps it’s because I’ve exhasted the pool with the offer, but change to $4.99 tri-monthly.
- Adapt for Japanese and Chinese - users need to mark the characters making up each word manually because these languages don’t use spaces.
Users 3270 (+425)
- Paying subscribers: 91 (+7 at $4.99 / 3 months)
- No single large sources this month
- Baseline traffic from diverse sources continues to grow
January 2014 redesign
Every now and then, I like to do some informal user testing, meaning I sit down with someone who has never used Readlang before and watch them try to use the site. As a developer this is one of the most painful things imaginable. I had one of these encounters with a fellow entrepreneur at the lab, Teun of NuezWeb, who was impressed with the site but was brutally honest about it’s shortcomings from a UX perspective. He couldn’t tell what it did from the landing page, he didn’t know what to do once he was within the site, he didn’t realise you needed to install the Chrome Extension to see the links in the public library. That night he sent me a present – a quickly mocked up .pdf of a new landing page design emphasising the Chrome Extension for new users. It was just what I needed to motivate me to improve the first experience for new users.
The main changes were:
- Shutterstock image for a more attractive landing page.
- Focus the landing page on the Chrome Extension instead of trying to explain everything.
- Big “Get Chrome Extension” button installs the extension without leaving the landing page, and after install informs them how to use it.
- Clearer “leaving dialog”, allowing users to install the extension without leaving the page when clicking an outbound link from the public library.
And looking at my analytics I see that this changed… not much. The bounce rate remained similar, as did the visit duration of new users. Onboarding still has room to improve.
One thing that did make a difference was incorporating the new Shutterstock image in my Chrome webstore promo image:
After this, hits to the webstore page immediately jumped from ~130 / week to ~480 / week, and installs via the webstore increased from about 60 per week to 220 per week. (Note to self: most of these app installs don’t result in signups, why not?)
The big new feature this month was a pilot programme allowing teachers to create classes. After getting the boring admin panels out of the way, I was excited to work on a stats page for a text that showed the teacher the most commonly translated words and phrases. The New York Professor liked it, and asked if WordReference definitions could be displayed when he clicked on a word so that he could present it in front of his class. This use case had never occurred to me and to support it I created a whole new Presentation Page allowing him to step one by one through the top 20 words in each text. This was well received so I geared up to invite more teachers to the trial in February.
- Teacher class management features
- Add a secondary MongoDB to create replica set - use secondary for backup and non real-time tasks
- Setup daily database backups to a netbook at home (off-site backup to complement the backup plan I already had with Linode)
- More Google Analytics events - to monitor effect of changes
- More custom analytics of my own
- Landing page redesign
- Nicer Chrome webstore images - success!
- Nicer modal dialog design
- Clearer leaving dialog
Users 3640 (+370)
- Paying subscribers: 102 (+11 at $4.99 / 3 months)
- Nothing out of the ordinary, solid baseline performance
February 2014 teachers
I polished up the teacher stuff, and set off in search of teachers.
I noticed that Nik Peachey, who originally shared Readlang on scoop.it back in June, was giving a talk here at the British Council in Madrid. It was on digital tools for English teachers, a perfect opportunity to get out and meet some potential customers! I quickly designed and printed a bunch of tri-fold brochures and went along, timidly handing them out after the talk, and chatting with a few teachers about their methods, and about the new features I was now adding to Readlang especially for them.
I announced the features publicly, and emailed the 15 or so teachers who had contacted me over the past year to let them know.
While waiting for a response from the teachers I took a break from the main Readlang code base, to hack together a simple game using the open API.
The response from the teachers was underwhelming. In total, 9 teachers requested access to the trial, but my analytics show that aside from the New York Professor, only one has actually used it with a real class. It would obviously take more effort to get teachers to buy into this, and it was effort I couldn’t afford. If teachers weren’t eager to use these additional features for free, it certainly didn’t seem like it would be an easy route to more revenue. So I decided to re-double my efforts on the original goal of making Readlang an awesome tool for individuals.
- Bug fixing teacher panel
- New API game - sentences, just for a break
- Weekly progress graph - flashcard use increased after adding this
- Add onboarding hints - open sidebar dictionary, start flashcards
Users 4161 (+521)
- Paying subscribers: 115 (+13 at $4.99 / 3 months)
- Nice Reddit comment
Phew! I didn’t expect this to be so long, I hope you didn’t skip anything!
While writing this, it really hit home how much work I’ve put in and how little I’ve got back financially. I earned $1045, before processing fees for 16 months of full time work. On the other hand, I’ve built up a small but enthusiastic user base, have a cool product, which has a shot at becoming a sustainable business and helping many more people around the world to read and learn. So I’m not giving up just yet! On the contrary I’m on the lookout for someone else who might like to join me on this adventure and make Readlang even more awesome. If that might be you, get in touch. If you think you know someone suitable, please let them know.
If this post was interesting and you’d like to read more, or if you have any advice for me, or if you’d like to get in touch for whatever reason, please email me at: firstname.lastname@example.org.
Chrome for iOS has been my main browser since I bought my iPad over a year ago. I love the way it syncs my bookmarks and history with my desktop Chrome browser and its familiar UI. But one thing that occasionally annoys me is its speed. From the start Chrome was marketed as the fast browser but so often on iOS it feels like I’m browsing in bullet time.
I blamed it partly on having the first iPad with a retina display (3rd gen) which is a little underpowered to push around all those pixels. But mainly, I just figured that all mobiles and tablets were slow, right? Well, not quite…
An early Xmas present to myself, the Nexus 5
Yep, I received my Nexus 5 just the other day, and man I’m impressed, everything is so fast. Maybe I was jaded by my old Android 2.35 phone, but I never expected the Nexus 5 to be so snappy and pleasant to browse the internet with. I’m almost preferring it to the iPad even given the massive difference in screen size. Could it actually be quicker than the iPad?
The Nexus 5 took 693ms to complete, and the iPad took a whopping 6283ms. The iPad 3 is an order of magnitude slower than the Nexus 5!
Could the iPad 3 hardware, released only 20 months before the Nexus 5, really be that much slower?
Let’s try iOS Safari
After browsing some heavyweight sites for a few minutes Safari definitely feels a good bit faster than Chrome, and the benchmarks confirm it. Sunspider 0.9.1 gave iOS Safari a result of 1303.4ms, half the speed of the Nexus 5 but almost 5 times the speed of iOS Chrome!
Sunspider 0.9.1 Results
(lower is better)
|Android Chrome (Nexus 5, Android 4.4):||693.2ms +/- 0.7%|
|iOS Safari (iPad 3, iOS 7):||1303.4ms +/- 0.4%|
|iOS Chrome* (iPad 3, iOS 7):||6258.5ms +/- 0.4%|
* Strangely, while running the benchmark on iOS Chrome the little spinner in the iOS 7 status bar which normally indicates network activity would flicker on and off, which didn’t happen when running on iOS Safari. Probably not a clue to the bad perfomance though because this never happened when running Octane 2.0 which gave just as abysmal a result.
Octane 2.0 results
(higher is better)
|Android Chrome (Nexus 5, Android 4.4):||4042, 3876|
|iOS Safari (iPad 3, iOS 7):||1346, 1484|
|iOS Chrome (iPad 3, iOS 7):||260, 260|
This test, probably more taxing than Sunspider 0.9.1, shows the same trend but this time the differences are actually magnified. The Nexus 5 was almost 3 times faster than iOS Safari, and this time iOS Safari was over 5 times faster than iOS Chrome. (Boy did Chrome feel slow on this one, each run took 13 minutes!)
I’m living in Madrid at the moment. It’s a great place to work on Readlang. It keeps me in language learning mode, and it’s way cheaper to live than my old home of London, which is handy when trying to bootstrap a business. The one problem is the heat, my friends back in the UK are complaining about the 30 degree heat wave there at the moment, well that’s nothing compared to the 42 degrees (that’s “fourty-two” in case you suspected a typo) it reaches here in Madrid.
Oh, and we don’t have air conditioning.
Our strategy last summer was this:
It’s surprisingly effective, but this year we’ve decided to upgrade. We bought one of these:
This is a climatizador (Spanish) or evaporative air cooler (English) and works by blowing hot air across water, which transfers heat from the air to the water, thus vaporising the water and lowering the air temperature. Sounds good, but does it really work? The reviews on amazon seem to be very mixed:
Some say it’s useless, and some say it works but only in dry climates. All agree it’s nowhere as powerful as an air conditioner. A shopworker in an electronics shop here had no confidence in them, and told us that it was basically an overpriced fan. We bought one anyway and I decided to test it.
The test setup
Unlike an air conditioner, an evaporative cooler requires the doors and windows to be wide open, to keep a supply of dry air and to stop the humidy getting to swamp-like levels (in the US these kind of coolers are called “swamp coolers”).
For the first test I measured the temperature of the air directly leaving the cooler. This will give the best case, not representitive of what you’ll feel in the room itself, but at least we can tell if it’s doing something.
Here we go, I cycled back and forth a couple of times to make the data more convincing:
- Ambient - normal room temperature
- Cooler: Fan & Water - I turn on the cooler for a couple of minutes. Then switch to bring in some outside air I decide to turn on the…
- Basic Fan - The temperature raises slightly to 32.8 as hot air is pulled in from outside.
- Cooler: Fan & Water - This time I wait until the temperature stabilises, over 4 degrees lower at 28.2
- Basic Fan - The temperature climbs back 4 degrees to about 32.2
- No Fan or Cooler - No real change.
- Cooler: Fan & Water - Again, the temperature falls about 4 degrees.
- Cooler: Fan & No Water - The water pump is off, so once the water dries up, it acts like a normal fan and the temperature raises 4 degrees.
- Cooler Off: With the fan off, there’s no change.
- Cooler: Fan & Ice Water - With ice added to the water, the cooler is not significantly more effective. It drops a fraction lower than before, but notice that the high temperature is a fraction lower too. So I’d say there’s not much difference here.
- Basic Fan: A slight temperature bump from outside air, which is perhaps a tiny bit cooler than before, but probably within the error range when reading the thermometer I used - see the pictures!
- Fan Off: Experiment over.
So, it’s repeatedly dropping the temperature a full 4 degrees. Sounds pretty good, but remember this is air directly exiting the cooler.
I did another test 3 meters away, at a realistic sitting distance from the cooler. I didn’t take as many measurements this time, but after blasting away for 10 minutes the temperature 3 meters away dropped by 2 degrees. Not a huge amount, but remember that a regular fan doesn’t lower the temperature at all. (Note: I tried this on a different day which was hot but overcast and felt a little more humid - it only made a 1 degree drop at 3 meters away, it is important to use this on dry days.)
Although it cools, it probably increases the humidity, which could cancel out some of the benefit. I didn’t measure this.
It does cool, the air exiting the device is 4 degrees cooler, and 2 degrees cooler 3 meters away. Subjectively, I can definitely feel the difference compared to a fan, and am fairly happy with the purchase, especially given my lowish expectations.
Busuu noticed that I have a gmail address and presented a “Go to your email” link taking me straight to gmail. It’s a nice touch.
Pity about the dodgy CSS in the spam folder message though.
Wow, woke up this morning to see this at my readlang.com Google Analytics:
Wait a minute… just noticed the date :-)
These libraries share an ‘almost perfect’ quality of being compact, well designed, and I wouldn’t start a large project without them.
jQuery The DOM manipulation library.
Underscore.js Just a clean set of functions for manipulating Arrays, Objects and some other general things that feel like an extension of the language. The kind of stuff you need do all the time. It’s amazing how much more compact and readable your code gets once you get used to using functions like _.pluck(), _.filter(), _.defaults(), _.extend(), _.pick(), I could go on…
Async.js Like underscore it’s very simple, but this one is focussed on cleaning up asynchronous program flow.
Backbone.js Compact library for models, views, syncing to a REST API, and routing. Stuff that almost any web page needs and done with a very lightweight implementation.
RequireJS Probably not as neat as the other four, but dependency management that works in the browser and nodejs, supports different directory structures, code which wasn’t written as an AMD module, and all sorts of other configurations is bound to get a little messy. (e.g currently the recommended way to use it with jQuery is to use the combined require-jquery.js file, hmmm) Anyway, once set up this handles everything elegantly making large projects managable, and the r.js optimiser makes deployment super simple.
It’s been close to a year now since I made the switch from desktop to web development, and there’s no turning back! Here’s some thoughts.
Why the switch?
It’s pretty clear that the vast majority of new application development is moving towards the web. The advantages are:
- Frictionless - No installation or updating required, just open the URL
- No Releases - All users are guaranteed to be using the latest version, since it’s running from your server
- Works Everywhere - The same code can run on Windows, Mac, Linux, Android, iOS, unreleased future OS, etc.
How’s it to work with?
Awesome. The modern browser is the most productive environment I’ve ever had to try out my ideas and it’s unlikely I’ll move back to desktop development.
- Prototyping - I can knock up a simple HTML page and put it live for anyone to use within minutes!
- Community - the online community of web developers is exploding and it’s really easy to find up-to-date help.
- Libraries - there are a ton of open source libraries which are making it easier to create larger and more complex projects.
I started a new position a few months ago. Its going OK but the boss is kind of an asshole.
He likes it when I get a new feature working quickly, but then expects that kind of progress all the time. Sure, he understands technical debt but still gets pissed off when he can’t see any visible progress he can play with. I try to explain that taking things slowly now will pay off in the long run but he’s not confident in whether the thing will even have a life in the long term. Last month, after a couple of weeks trying messing about with different ways to polish our photography website prototype he decided to drop everything and start work on a completely unrelated new site, just because he’s learning Spanish and thinks it might help him! How can I keep sane under these conditions!?
Independent software creator (working for myself)
I quit full time employment at Mendeley in Feb 2012 to move to Spain, learn web development, and work full time on my own projects. I’d actually quit the same job in the same company 2 years before, that time to make a film and travel the world. So it probably didn’t come as a complete shock to my colleagues.
The plan was set back temporarily when my manager asked if I’d be interested in working on the CSL Editor project as a freelancer.
Reasons it sucked:
- I was itching to start work on my projects
Reasons it was awesome:
- It was open source
- Plenty of users desperately wanted this feature, so it was very likely to actually get used
- It was a prototype, meaning that producing a working website with actual users was considered a bonus, not a requirement
- It would be good practise in web based technologies
- The extra income would give me a longer runway when it came time to start my own projects
- Many people were sceptical that a user friendly CSL Editor was feasible to make, it would be fun to prove them wrong!
Needless to say I accepted. I learnt web development as I went but only billed for time I felt productive, which meant occassionally working long hours. In the end we made a working editor I’m very proud of, it’s made editing CSL good enough for a far larger audience than before. It was definitely the right choice.