When a Product-Minded Programmer Starts Learning English
/ 10 min read
Contents
On September 1, 2026, I was testing EnglishAholic when I clicked Prepare Today's Lesson.
The first Episode, or learning unit, was already waiting with twelve words: make, give, take, carry, get, go, call, raise, follow, clear, see, and blow. The model then had to use all twelve in a scene that felt natural, stayed coherent, and had a clear chain of cause and effect. It could not leave out a single word.
The model produced two versions. Both failed validation. After the first failure, the page told me to refresh later. When I did, all that remained was a message: Scenario unavailable.
There was obviously a software problem. But as I traced it backward, I realized the real mistake had happened before the code ran. Why had these twelve words been treated as if they belonged in the same scene? Why did I think a different model or a better prompt could salvage a task that would be awkward even for a human writer?
So I tore apart EnglishAholic, the product I had already spent so long building.
Again.
This was not the first product English had pushed me to make. It was not the first one I had left half-finished, either.
English had never given me a finish line
Learning English has probably been a sore spot for me for most of my life.
It started in third grade, when I first encountered the twenty-six letters of the alphabet. For more than twenty years, English has come and gone from my life. I learn it, forget it, then learn it again. Sometimes I do not even know what it would mean to reach the end.
In my mental model, learning something should eventually produce a state called “learned.” English does not seem to have one. It is more like Chinese: something you keep learning for as long as you use it. The difference is that Chinese surrounds me. I speak it every day, and I constantly hear, read, and use it. English does not appear in my life on its own. Nobody around me speaks it, so I have to read alone, practice alone, and talk to myself.
Can you really learn a language without anyone to speak it with? For me, at least, it’s difficult.
During the COVID lockdowns, stuck at home with little else to do, I started learning English again. I enrolled in a course on British and American English pronunciation, with some grammar mixed in. Near the end of the course, ChatGPT was released.1
The tools I had used before offered something closer to scripted question-and-answer exchanges or autocomplete. ChatGPT felt different. I could say something and get a response that followed what I meant. I could ask a follow-up question, explain myself, or try again in another way. As an English learner, I saw one immediate benefit: at last, I had found someone—or at least something—willing to keep speaking English with me.
Around the same time, I learned the word workaholic. Our teacher casually explained -aholic as a suffix for being obsessed with something, even addicted to it.2 That was all the encouragement my product brain needed. I was a programmer who had spent years building products, and I could not stop learning English. Did that make me an EnglishAholic?
I registered englishaholic.com.
Looking back, the domain arrived before the product. It may even have arrived before the problem I wanted to solve.
My idea at the time was simple. The course asked us to say aloud what we had learned and explain it. That seemed useful. Speaking the language meant it did more than circle silently inside my head. ChatGPT added another possibility. Before, I would say something and the exercise would end there. It was mostly a performance for myself. Now something could answer. Could I use an AI API to turn English practice into an actual conversation?
That was how EnglishAholic began. I imagined bringing together other people who were equally hooked on English. With AI and with one another, perhaps we could turn English from something we were forever studying into a language we actually used.
What, exactly, the product would be was less clear.
At the time, I was still building full-stack PHP projects with Laravel, so I put together a simple website. I no longer remember exactly what it did. It was probably related to grammar practice, and I may have planned to use AI to correct users’ grammar. Other work kept getting in the way. I stopped halfway through, and the EnglishAholic domain went quiet with it.
English returned to my workday
In 2025, English returned to my workday.
The way I wrote code had already been changing. First I typed every character myself. Then autocomplete kept getting better. For a while, I joked that I had become a “Tab engineer”: type the beginning, press Tab, and accept the next chunk. That year, Claude Code and GitHub Copilot’s agent mode in VS Code pushed the change further. AI tools could now take on a whole coding task.3 4
I often used English when working with them. Partly, that was because so much technical documentation, so many error messages, and so many existing examples were already written in English. But I also remembered something one of my English teachers used to say: English is a farmer’s language. They meant that English is plainspoken. Not necessarily brief, but willing to lay out what happened without much ceremony.
I have carried that metaphor with me ever since. When I began working with AI tools, I used it to persuade myself that English was a good way to explain a problem one layer at a time.
The more English I wrote, the more English I had to read. A new problem appeared quickly. A few unfamiliar words could stall an entire sentence. Sometimes I knew every word, yet still could not tell what the phrase meant in that particular context. This happened often in technical writing. The first definition in a dictionary was rarely enough. What mattered was what the phrase meant in this codebase, this framework, or this discussion.
For once, I had found a problem specific enough to build around.
I started making a browser extension. While reading in English, I could select a word or sentence and translate it immediately. In a technical article, the extension could also use the surrounding text to explain what the selection meant in that context.
The extension was mostly working. Then something familiar happened.
Once it could translate a word, I wanted to save the words I had looked up. Once I could save them, of course I wanted to review them. Review required a schedule. And because every person’s saved words were different, perhaps the exercises should adapt to their work, their level, and the situations in which they use English.
Every question sounded reasonable. Every new feature could explain why the previous one was not enough. The product kept growing, while the release kept slipping further away.
I used to think product work became slow because too many questions remained unanswered. Eventually I noticed that the opposite could also be true: the more things I held in my head, the slower the work became. Other things were happening in my life at the time, too, and I could not settle into the project. Once again, I put it aside.
A vocabulary problem pulled everything together
Time passed. This year, I started memorizing vocabulary again.
The vocabulary app I used gave each word an example sentence, but the examples for word A and word B had nothing to do with one another. After finishing a unit, I had not only a dozen new words to remember but also a dozen unrelated miniature situations. There is nothing inherently wrong with learning that way. For me, it made remembering painful, and it did not make the words much easier to use.
I wondered whether all the words in a unit could live inside one short story. They could appear in the same conversation, the same task, or the same event. By the time I finished the words, I would also have moved through one complete situation. It would be a little like the English textbooks I used as a child: first came a passage, then we learned the words inside it. Each word did not have to live alone in its own example sentence.
So I picked EnglishAholic back up.
At first, I only wanted a website that would help me learn vocabulary. Then I connected the extension. The extension could collect words, and the website could save them. Saved words could be reviewed. Reviews could use generated scenes. Those scenes could be personalized around a learner’s work or everyday life. All of these things involved English, and some of them could share data, so it felt natural to put them in the same product.
Twelve words pulled the product apart
Then those twelve words landed in the same Episode.
At first, I thought I only needed to fix the grouping algorithm. But before deciding which words belonged together, I had to answer another question: did they come from a curated vocabulary list, or had one particular user just highlighted them on a webpage? The first kind could be organized into stable learning units in advance. The second kind could not be known beforehand. And then there were more questions. Who should control the review schedule? Which material could be shared by many learners? Which conversations belonged only to the current user? None of these problems could be solved by rewriting one prompt.
That was when the distinction finally became clear. The extension solves a problem that occurs while someone is reading: What does the word I just selected mean in the article in front of me? Working through a vocabulary list over time, grouping suitable words into a passage, tracking progress, and scheduling review are part of a different learning process.
The design I have in mind now works like this. People who choose the same vocabulary list can share its words and Episode structure, while using different versions of each scene based on their lives, jobs, or studies. Once a lesson begins, the conversation can continue according to each learner’s responses. The extension can still send a word to the website. It does not need to carry an entire curriculum and review system on its back.
Both products still depend on a content system that manages the vocabulary, handles words that appear in more than one list, and decides which Episodes they belong to. That connection does not make the system another feature inside either product.
I had been making the same mistake with English
Related things do not automatically belong in the same product.
This may be the mistake I make most often when building products. As soon as I see that two things can connect, I want to fit them into the same system. As soon as I imagine something the product may need later, I want the first version to leave room for it. The system becomes more complete while the people it is supposed to help still have nothing they can use.
Looking back, I may have approached English the same way. I kept searching for one complete method that would let me master pronunciation, grammar, reading, vocabulary, and conversation all at once, as if a sufficiently well-designed system could make English produce a final state called “finished.”
I am going to rebuild EnglishAholic again, and I plan to document how it grows from zero. But I still owe myself an answer to one question: after the rebuild, what is the first thing I can actually put in a user’s hands? If the answer is still “everything,” I probably have not torn it down far enough.
I still do not know when learning English ends.
For now, I will start by actually using it.
Footnotes
-
OpenAI, Introducing ChatGPT, November 30, 2022. ↩
-
Merriam-Webster,
-aholic: a suffix indicating a compulsive need for, or excessive liking of, something. ↩ -
Anthropic, Claude 3.7 Sonnet and Claude Code, February 24, 2025. ↩
-
Visual Studio Code, Introducing GitHub Copilot agent mode, February 24, 2025. ↩