What I learned building an AI language learning app
Part 2/4: Lessons learned
Welcome back! As a quick refresh, Yaya is an AI language learning app. The first version never quite took off. In this post, I'll share some of the lessons I learned the hard way. These are the juicy bits.
Note: If you missed part 1, I recommend starting there. In it, I introduce Yaya v1.0, the version covered in this post, and also share a bit about the newly launched v2.0. Or you can check out the quick video overview of v1.0.
I learned a lot building Yaya. I got a lot right and a lot wrong. I've written all this down to get some clarity for myself. But I'm sharing it too in the hopes that it will help others, whether you're working on a software startup, just a project or are just curious.
This one's long so here's a ToC (go ahead and skip around):
目次
- Building a language learning app
- Building an AI app
- Building a startup
- Personal reflections
Meet your users where they are
One thing we struggled with was getting the average person to understand Yaya. They came in with a lot of prior expectations, and we didn't meet them there.
Some expectations of language learners and what that meant for us:
- Beginner-friendly: Most people interested in learning a language are beginners. They expect tools to be beginner-friendly. We really struggled to make the "newbie" reading level on Yaya easy enough though. We couldn't get ChatGPT's API (then 3.5) to consistently simplify its grammar and vocabulary, especially with long documents. Also different languages have different learning curves. Getting this right turned out to be harder than we expected.
- Gamification: These days everyone (whether you've used it or not) knows of Duolingo. Their users love the gamified quizzes and clear progression. We didn't spend enough time specifically differentiating ourselves vs. them. And we didn't do a good job showing users that they were learning and progressing.
- Casual: Most learners are casual, looking to spend just 15-minutes a day studying. They often find products on app stores. As a web application, we couldn't reach this audience without building a mobile app as well. Web applications are faster/easier to build/update, but you have to get more creative with user acquisition. Building and maintaining both a web application and mobile app is a lot of work for a small team and requires different knowledge/competency.
- Communication-focused: Most language learners want to speak and communicate in a foreign language, not read literature, news, philosophy, etc. To reach more users, we'd have to convince them pick up a new hobby, which is much harder than just convincing them to try a new product.
- Chat: Chat is the dominant interface metaphor in AI right now. Some people were confused by how Yaya used AI (and even thought that we wrote the stories ourselves). People also wanted to customize the content after the initial generation, which we didn't allow at the time. This level of customization has now made it into David's v2.0.
- Accuracy: Learners have an expectation that their learning content will be correct. It varied a lot by language, but the AI-generated content included occasional grammatical mistakes and awkward phrasing. Beginners (who we struggled to reach) wouldn't know, but more experienced learners (who we were targeting) would be turned off.
- Spaced-repetition: Experienced learners typically use flashcards with spaced-repetition to supplement other tools (check out the Fluent Forever book for great Anki tips). We thought SRS vocabulary in the context of a story would be more fun/effective. We didn't communicate that well enough to know if it resonated.
- Peer reviewed: Many serious learners "hang out" with other learners in online communities (e.g. subreddits, forums, etc.). These users are often early adopters and willing to try new products, but the communities are typically averse to self-promotion.
- Video: Many people (especially the younger generations ("ok boomer...")) prefer video to text, largely hanging out on TikTok and YouTube. We could market on those platforms, but it's tough to get users to visit an external link (and many platforms discourage this behavior).
- Immersion: Some very serious learners want complete immersion in their target language. It was possible to use Yaya without translations but that wasn't our emphasis. Some want to learn specific dialects. We didn't support that. Very serious learners are also likely to graduate off of learning tools within 6 months to a couple years, which could limit customer lifetime value (LTV) unless we reengaged them to come back and learn another new language.
As we learned more, our niche (reading practice for intermediate language learners) kept growing smaller and smaller. And for Yaya v1.0, we didn't find product-market fit.
I also think that before overbuilding, we could have spent more of our time getting feedback from the market (of course while being careful not to give people faster horses). Instead I was spending a lot of my time personally coding unused features and creatively procrastinating. There are only so many hours in the day and it's easy to fall into these traps, so it's good to specialize. I think that's why the best teams include a mix of product builders (engineers, designers, PMs, etc.) and business growers (sales, marketing, ops, etc.).
Get out there and talk to tons of folks. Know your audience well!
This search for an "ideal customer profile" (ICP) and the iterative tweaking of positioning (how you describe the product) and outreach (how you find customers) is a huge part of any early stage startup's life-or-death search for product-market fit. And it's one of the things I focus on professionally. It's a creative challenge.
Give your users what they want
I want to draw on Clay Christensen's famous business advice here. When people decide to use a product, in a sense, they're "hiring" it because they have a "job to be done." He tells a story of a fast-food restaurant that noticed people were buying milkshakes in the morning. After some research they found that people were "hiring" the milkshake as a snack on their long commutes. So they made the milkshake thicker to last longer. People loved it.
So what was Yaya's "job-to-be-done"?
On a certain level, it was obvious: "to learn a foreign language." But there are a lot of options out there to learn a language, from apps like Duolingo to private tutors on sites like Preply or italki to immersive programs like the Middlebury Language Schools. And the big players claim to do it all. So we'd have to be different.
Note: People are not just trying to learn a language. They also want something that's going to help them build a habit and stay motivated while learning. Check out this great blogpost from the former CPO at Duolingo on jobs-to-be-done.
As a small team (just two people, one of whom had never coded anything substantial before), we knew we had to focus. And as longtime language learners ourselves, we knew that do-it-all solutions typically sound better than they actually are. The reality is that most language learners who reach proficiency or fluency actually use a lot of different tools and combine them in creative ways. So for Yaya v1.0 we decided to build a single tool that would fit into learners' toolbelts (like some of these other great tools).
Comprehensible input (content in your target language that's just barely above your current level) is the fastest way to learn a language, and "compelling input" (content that's so good you forget you're consuming it in another language) is the best way to stay motivated. Hat tip to Arun Prasad for the previous link.
There's a lot of comprehensible and compelling content out there from books to TV, movies, music, and games, but we decided to take a stab at making reading great foreign language content easier. We figured we could do better (or at least more engaging) than the many graded readers out there. And we decided to offer it in any language, so we could reach as many people as possible.
Even though Yaya v1.0 didn't take off, I still think this was a solid focus for the first version of the product.
In summary: give your users thick milkshakes 🥛🍦
Be better than your substitutes
While there are a lot of direct competitors in the language learning space, we were also competing with general-purpose AI tools like ChatGPT or Claude. We had to be better than these well-funded substitutes to get people to use Yaya. If you're building on top of someone else's API, make sure you're adding a lot of value.
You can use general-purpose AI tools to generate reading content in a lot of languages (and now audio too), but we figured we had a few key advantages: 1. fine-tuned levels for language learners; 2. built-in spaced repetition; and 3. clickable definitions and grammar explanations. We saved our users a ton of time and gave them a consistent experience, so they wouldn't waste study time on wrangling with the AI.
And of course we were also competing with old fashioned bilingual books (e.g. Penguin's parallel text series). We felt that the experience was much better on Yaya, but these books were already well known, widely available, and had access to high quality works under copyright.
It's worth thinking through your positioning not just for the obvious competitors but also for the less obvious alternatives. This even includes other pastimes or hobbies (like just watching YouTube).
AI "art" is not quite there yet
What even is art? Who knows? People have opinions. We've all got wide-ranging tastes. But as they say, you know it when you see it.
And unfortunately AI art is just not quite there yet. It's technically good but... kinda boring. I mean take a look at the cheesy images I generated for this blogpost. I'm sure we'll get there someday and this technology truly does feel magical, but for now I think you still need a human artist, writer, creative, etc. in the loop if you really want to hook your audience.
With Yaya, we spent a lot of time fine-tuning our prompts to try to get the AI-generated content, particularly the short stories, good enough. At the peak level of complexity, we used ChatGPT to generate story outlines with a variety of premises, lengths, genres, story structures, narrative points of view, sources of conflict, authorial styles, etc. These lists of possibilities were also generated in ChatGPT (ahead of time). And then we passed in the character names and previous chapter summaries (for better continuity) and asked ChatGPT to write each chapter.
The stories were ok... They were good for learning, but you didn't lose yourself in them. The plots were a bit formulaic, repetitive, and internally inconsistent. And we had Chekhov's guns all over the place that never got fired. This was particularly true when the AI tried to work in a vocab word due for SRS review that didn't fit the story (e.g. the word "sewer" in a story about a princess).
Ultimately we realized that we never actually finished reading Yaya's multi-chapter stories, so we ditched the outline generation, used a simpler prompt, and switched to infinitely generating new content as the user scrolled (until they got bored and wanted something fresh). This improved the user experience, generated stories faster, and simplified the code.
For a talented writer's take on all this, check out Jennifer Egan's latest novel, Candy House. In it she parodies (to great effect) generated stories (and so much else) built with standardized "stockblocks".
May the technological tinkerers keep pushing us forward with amazingly efficient machines, and may the artists keep tearing it all down and reminding us of what it means to be human. I think the world will be better for it.
Get something in front of real users ASAP
We spent weeks and months building features and tweaking the product before getting it in front of real users. Then when we finally started asking people to try Yaya, we watched as the initial excitement morphed into confusion or polite disinterest. Of course, we listened to all the feedback and kept iterating and going back for more feedback. And while we did get a small number of repeat users, we struggled to get the audience we really wanted with Yaya v1.0.
This is a bit downstream of getting clear on what you want (see below in personal reflections). If you want to build a venture-backable business, you need to get something in front of real users as soon as you have a minimum viable product (MVP) (or even just a landing page + waitlist) and you need to build something people want. If you're building a niche product for yourself and others like you, you can take your time and lean heavily on your own preferences. And if you're doing something in the middle, like a bootstrapped business for supplemental income, find the right balance. It's always helpful though to get outside feedback early.
While the conventional wisdom is to ship fast fast fast, I still feel ok about our timeline. This was my first true zero-to-one startup. David and I were both juggling other work (more for him than me), life events (I got married!), learning (me) and teaching (David), and just having fun. Plus we were using Yaya for our own language learning the whole time.
Move fast and kill your darlings
But actually though, the most important thing when building a new software product is to move fast. This is especially true if you're smaller than your competition. I've learned this time and again in my startup career. So think about what's critically important for your users, build that and only that, ship it, and get feedback. If it doesn't work, kill it. If it does, improve it and/or move on.
Note: Of course this doesn't apply when lives or safety are on the line. Then you should absolutely measure twice (or more) before you cut. More generally, if a decision is reversible, move fast, if not, move slow.
You won't always build the right thing. And you can't always know if people will want something until you've built it. That's why it's important to move fast. If you get it right, amazing! But if you fail fast, you can pick yourself right back up again and make changes. On the other hand, if you fail slow, you've lost a lot of time and it's much tougher emotionally to move on.
One "fail" for us was building a complex feature to match foreign language text to existing translations (e.g. short stories by famous authors with professional human translations). I had a high tolerance for this difficult-to-use feature because it was "my" thing and I was using it daily to study. But it became obvious quickly that we would never get many people using it. We had to kill our darling.
Admittedly David got there a little faster than I did, and I argued to find a way to keep this feature in new versions of the product. But it just didn't make sense. After recognizing this, we made a decision to delete the old code and move on within a week. I think this is one of the things we actually did well.
Corollary for further along the startup road: give away your legos.
Be clear on what you want
I spent a lot of time wanting Yaya to be a high-growth venture-backable business that I could work on full-time while living comfortably in San Francisco. I also really wanted to do (a meaningful portion of) the coding myself in order to learn. And I wanted to build a niche language-learning product that I would love to use myself.
Sometimes these goals were at odds with each other. And Yaya went through a few incarnations (pivots if you will) while my wants evolved.
If I'd been a little clearer with myself and with David about what it was I wanted, I would have made some different decisions, perhaps skipping the legal incorporation and not worrying too much about the name or business model potential. Or perhaps I would have spent more time talking to users instead of coding things in 10x more time than it would take David.
But hindsight is 20/20, as they say, and I can't imagine walking any straight-line path to get to where I am today.
Ruthlessly prioritize your time
This is the "about page" that I rewrote about a thousand times. The only people that cared were my parents (and in-laws). If it's not obvious from this blog, I like to write. So if you're like me, fight that impulse. If you build something people love, you'll get a chance to tell your story. Focus first on building a rock solid onboarding journey and making those first users keep coming back.
And here are some of the other things I spent too much time on:
- generating and regenerating images on midjourney (especially useless when it's for a 404 page nobody will see)
- changing the company name a few times (although to be fair the first name was the near unpronounceable "yomuya")
- buying domain names for the different company names
- trying to do all the visual design myself (we eventually found a solid designer on fiverr )
- tweaking and retweaking the visual and logo designs afterwards
- etc.
- etc.
In short: Focus on what's life or death for your startup (or project). In the very beginning, that's typically building product and talking to users.
Know your limits (patience please)
If you spend any time in Silicon Valley circles, you'll hear a lot about "hypergrowth" and moving fast (see above even :P). You'll see people achieve astronomical financial success in a short amount of time (and sometimes lose it just as fast). While moving fast is great practical advice for building a certain type of business (but definitely not all types), some things just take time.
Learning is one of these things. This is not the Matrix. The human brain and body take time to acquire new skills. And even with these wonderful new AI tools, we're still limited by our biology. In tech, you'll often hear the phrase: "humans grow linearly, companies grow exponentially."
At some level, I internalized the learn-to-code-in-X-time rhetoric and the techie-exceptionalism, and I figured that within a few months I'd be able to code a fully-featured and compelling product entirely on my own. I was wrong. It takes a lot of time and hard work to learn to build complex software applications.
After all people dedicate their careers to this thing. Why not learn programming in 10 years instead? Why not get to the bottom of things instead of trying to stay on top of everything?
But I wasn't completely wrong though. In collaboration with a partner, I was able to build something meaningful. And I did get better and better every day every day that I sat down and wrote code and debugged.
Note to beginners: Don't let all that discourage you from getting started. You'll be able to code simple but useful applications much sooner. If you stick to it, the payoff is great and the journey is fun, whether you end up coding professionally or not. Plus there's more help available than ever. Considering using Replit and freeCodeCamp. They've got great learning resources and great communities. Disclaimer: I used to work at Replit.
Have fun
This should be obvious but it may not be.
Building anything great is hard. It'll require a lot of time and a lot of effort. And it'll be tough as nails at times. So find what fills you with energy on the up days and also on the down days. Having fun is the only way you'll stick to it.
As for me, one of my biggest learnings from Yaya was that I don't want to spend all my time coding. I enjoy programming computers and I'm so grateful to David for teaching me, but I have more fun and get more energy when I'm focused on the business side of things. And I have the most fun when I'm doing this in service of a mission I believe in. There's a reason after all why I've gravitated to business roles in my career. Someone wise once told me, "trust the self that got you to where you are today."
Ofc having fun is just as applicable for language learning as it is for startups!
Thanks for reading! But why stop now when you can check out the whole series?
- Part 1: An introduction to Yaya v1.0, plus some reflections
- Part 2 (this post): A deeper dive on the lessons learned while building Yaya
- Part 3: The backstory: how I got to Yaya, what I did, and our early iterations
- Part 4: The tools we used to build Yaya and some final thoughts