A business case

TLDR: The long and random argument I make to myself about why I’m going to start putting energy and resources into promoting something that could be stamped finished.


Time to make a decision

I’ve been thinking about my EFL worksheet generator. The thing is this: it does what I want, now. Almost exactly how I want it to.

I could declare it finished. That’s a crazy idea to me.

And yet, is it amazing if I’m the only one who knows it’s amazing? What’s more, ever since I decided to move the thing to the internet, as opposed to making the desktop interface better, I’m paying hosting costs. Not a ton of money, but much more than I would pay for a website like ESL Library.

Should I move it back offline?

I’m asking myself these questions because I’ve realized that this will never be a completely finished project. I’m taking a Udemy full-stack bootcamp, because there are ways the interface could be more amazing.

But, as I started looking into how to promote a web page, and even paying money to experiment with AdWords, I realized I wasn’t sure that was what I wanted to do. Am I the kind of person who gets excited about making and then promoting something? It doesn’t feel like who I am: I’ve never really felt comfortable saying “look at me!”

At the same time, it’s clear that “if you build it, they will come” is not a great strategy to follow.

So, I have to pick a future for the project.

The case against monetization

There are three big arguments against pursuing monetization. First, is the fact that I’m not really opposed to monetizing the website, it’s the fact that I’m opposed to investing a lot of energy promoting it. It’s just that I don’t think I can have one without the other. (Well, I could try and promote it without monetizing it, but then I’d be increasing my workload for… I’m not sure what for. Ego?)

The second argument against the whole thing is that I’m not sure it fits into my sense of who I am. I like the idea of being a “maker.” It’s a cool title and one I feel like I can give myself. There’s something existentially satisfying about having an idea and turning it into a reality.

Marketing, on the other hand, doesn’t feel like who I am. Or, I’ve never looked up to people who are great at promotion. The title “promoter,” to my ears, doesn’t sound quite the same as the title “maker.”

The last argument is time. I want to learn Latin. I want to work on other projects. Some of them are already pretty fleshed out as ideas. And, the worksheet generator is threatening to turn into a project that will take over my existence. Some of the things I considered doing as part of promoting it include:

  • Continuing to prioritize making free EFL materials.
  • Starting a blog focused on EFL teachers in Germany, to promote the site.
  • Making online tools to automatically generate materials from a text. (Copy-and-paste text from a company’s website to get a gapfill exercise prepared.)
  • Making a YouTube channel

The thing is, any of those could become a time-suck. Trying to do a combination of those and perhaps also paying for promotion… Well, it would require me to make a lot more money off the site to make it worthwhile.

The argument for monetization

On the other hand, as things stand now, the site doesn’t ‘feel’ finished, because nobody uses it. If someone told me he was proud of the site he’d made, but he was the only one who used it, I don’t know if I’d be as impressed with that person as I am with myself right now.

What’s more, a lot of the things I want to make are web-based. If they all incur costs, is there a point if I don’t know how to attract users? Why work hard to make the next site, if it’s just going to be a tool that I use on my own?

And, further, I could use the money. Not in the Elon Musk the-rest-of-my-career-is-a-working-retirement kind of way, but in the more modest what-will-I-do-if-I’m-ever-too-sick-to-work-for-more-than-a-week kind of way. A passive income would go a long way towards stability.

That brings me to the last argument for monetization (and the stress of promotion): I don’t want to be a career coder. I love making stuff, but I don’t think I could bear the frustration of coding just for the joy of coding well. The fun, to me, is in turning a dream of my own into a reality. I’m getting better at all this (though, by no means good), but I wouldn’t want to wind up in a spot where I have to go look for a job as a novice coder in my 40s, in Germany.

That means that, if I’m going to keep doing this, I’m going to be responsible for building entire projects, from start to finish. And, well, by that standard, the website isn’t finished. If I want to make an app to use in the classroom, or the fantasy pilgrimage website, all of these things will only work if I can both make, and sell them.

The business case

Here’s the last bit of reasoning: What would it mean for the website to be worth my while? By which I mean money. How much money means “this is why I do all this extra work?”

Obviously, there isn’t a maximum, but €500/month would mean I could quit one of my jobs and reduce the number of hours I have to work. That’s 50 people willing to pay €10/month for the service. Or, 71 people willing to pay a discounted price (if there’s a €10/month, €90/year kind of option).

Needless to say, I think those are great prices for what the site does (and for the amount of work I do making it work).

I haven’t been able to find out how many people teach English to adults in Germany, but I’m confident that there are at least 50 in Dresden. So, if I focus on the German market… the business case is compelling.

It’s compelling if I can learn how to communicate about what I do, and why it’s great.

Advertisements

Picture Matching!

 

picture_matching
A picture matching activity!

I didn’t plan to add images to the worksheet generator, yet. I just wanted to wrap up the interface and include images on the list of things that would be included in a 2.0 update. After all, there are other things that are really pulling at my attention now.

But then…
I found out that I’ll be teaching a beginning English group soon, and I knew that something I wish I had available would be picture-based activities. After all, things like definitions and gapfill exercises require a certain level of English knowledge before they’re helpful. And, though I’m ready to push my students, that seemed unnecessary.

As it stood, the only thing the worksheet generator would have done for a beginning group is create translation matching exercises, and manage classroom vocab lists. (But even the vocab lists would include definitions that would be impossible for the students to read.

Pictures were the way to go, and they’d been planned, anyway…

It was a bit hurried
Fortunately for me, I’d been poking around in the code, slowly getting the interface and behavior to where I wanted it to be. That meant that I’d already had the days-long process of asking myself “how did I manage that?” and “why is this here?” behind me.

Adding images went surprisingly quickly, though I did run into trouble with PNG files that had a transparency set. (They printed as solid black in PDFs, no help at all.) The internet had a solution, of course, and I quickly changed the way images were uploaded to automatically account for that.

Later, I realized that I could have made the images behave more like other resources (each teacher could add his/her own, there could be regional ones) and I’d still like to do that, but I’m still moving forward. There have to be some features to implement the next time I visit this project.

So, I moved from adding pictures and making a memory into creating the exercises.

Formatting the picture matching exercises was a bit harder. They had to look good (to me) and be compact enough that they could be the first page of a multi-page worksheet without breaking across two pages in an awkward way. (Don’t you hate that?) And, of course, they couldn’t be too small or you wouldn’t be able to see what the images were.

Worksheet progression needed fixing
The way the whole thing is supposed to work, nothing comes onto the second page of a worksheet without having been on the first page of the previous worksheet. The whole idea is to ‘automate’ reviewing the vocabulary for the students, right?

But, some words just can’t be part of a picture-matching activity. What’s a good image for ‘name’ or ‘industrial?’ So, picture-matching activities have to exist outside the whole system of progression, which was doable (and skipping code is certainly easier than creating new code) but it required a certain degree of concentration.

It’s not finished, yet
I’m not using this code in ‘production,’ yet because of one simple thing: after adding a bunch of images to the system, my existing groups would suddenly have a lot of picture matching activities with vocabulary stretching back to September of last year. One review activity seems reasonable, but after that the activities have to feature relatively recent vocabulary.

The solution for that is to make a tool that will mark vocabulary as ‘finished’ with the picture matching activities. The idea is that I’d be able to go into a group’s settings, and say “mark all the vocabulary from before January of this year as finished” and the system wouldn’t use them in new worksheets.

It should be straightforward, but I haven’t found the time to do it, yet. I want to, before I put a last few finishing touches on the interface and then start soliciting beta users (again).

Wish me luck.

 

Alter your perspective

This is another post in my ongoing series on the individual chapters in “The Obstacle is the Way.” I don’t know how useful or interesting it will be out of context.


This is the first chapter in The Obstacle is the Way that didn’t really blow me away. The fundamental lesson seems like it can be summed up very briefly: how you look at things changes the way you react to them. And, either I haven’t properly internalized how profound that is, or it’s not Earth-shaking news following up on the previous chapters.

I get this. I was frustrated yesterday because I tried twice to make a sort of explainer video for the worksheet project. Both times, the webcame video didn’t record. (And I even put on a nice shirt for the occasion.)

I already said I was frustrated. I didn’t have time for a third run-through before work.

But, on the other hand, I had two great rehearsals. In the first, there were a few minor things that frustrated me. (I wanted it seamless, and there were a few vocabulary that didn’t have definitions in the system when I made it, to there were about two minutes of me entering vocab.) And the second one was smoother and much shorter.

When I get around to recording the same thing today, I expect it to be tighter, shorter. And that’s valuable.

I probably would not have, on my own, run through the whole video twice in preparation, but the whole webcam-not-recording thing upped the quality of the finished product.

That’s changing the perspective, according to the book. The obstacle itself cannot be changed. The idea seems to be that changing your perspective doesn’t necessarily change the amount of work you have to do, it changes your perception of the work, and that can be enough.

I’ll finish this with the two paragraphs that finish the chapter:

How we interpret the events in our lives, our perspective, is the framework for our forthcoming response–whether there will even be one or whether we’ll just lie there and take it.

Where thehead goes, the body follows. Perception precedes action. Right action follows the right perspective.

It’s easier to expand than to fix…

I feel like everything I learn about coding is already a well-known software truism. But, I wanted to report in on my progress with the EFL worksheet software by saying that it’s moved back to the top of the priorities list and I’m working on it, but slowly.

There was a bug where the gap fill sentences created for capitalized vocabulary (‘Baltic Sea’ and ‘Vienna’ are examples) didn’t work correctly.

I immediately realized that the code put the entire sentence into lowercase (with Python’s .lower() method) before looking for the word. No problem, I thought, I’ll just find where the word is searched for and have it search for the lowercase text of the word. Problem solved.

I genuinely thought that was something I could do quickly, by way of getting back into the coding game…

More than an hour later, I found the spot where I forgot the extra .lower() call and everything was fixed. But I needed a full hour to figure out where in my code that happened.

A full hour.

I’m discouraged that I had such a hard time finding my way through my own code.

Preparing for Clowns, or what I learned from a Twitter-fight

The CodeNewbie chat last night was about dealing with bullies, and, since that dovetailed so well with what I’m working on right now, I thought I’d try to be a bit more active in blogging about what I’m doing.

You see, I think my app is 90% finished, but I’m taking a break from features to get ready for the public. Which, really, means, to get ready for the jerks. You see, the worksheet generation app isn’t a social app. The user’s interaction with it is basically all centered on the user and their own groups and classroom resources for their groups.

But, contributions are shared. That is to say, if you need a translation for the word ‘web app’ for one of your groups and there isn’t one in the system, the system just asks you for one. But then, the next guy profits by the translation you added. And you’re profiting from the resources added by others.

The Twitter Fight

But then, I got in a bit of a fight on Twitter. I’ll post sometime on the idea of ‘defending the ancestors,’ and why I don’t like the term ‘the ancestors’ being used as a dog-whistle for racism (racist dogs!) but that was what it was about. And it wasn’t nice.

While I’m a middle-child and can handle Internet strangers being mean to me, I realized that the guy I was fighting with had the advantage: his Twitter handle was only for his trolling. My Twitter handle connected to all my life, and he could see that, use it in a fight. And, because I tend to fear the worst, he could start being a jerk in other parts of my life.

I realized that, when I start posting about the worksheet generation app by name, with links, anybody who felt like they didn’t like me (and there have been a lot of those people in my life) could create a free account, and just throw a wrench in the works by adding terrible resources.

Imagine if a legitimate user — maybe even one paying for the service — wanted that aforementioned translation of ‘web app’ and got something like ‘where we see the naked photos of your mom.’ Even worse, what if that person — like I often do — didn’t proofread that worksheet before handing it out to students. (At some point, worksheets will be emailed with a mouse-click.) What a nightmare.

Worse than paranoia

I talked myself back down from “Twitter people will be mean.” After all, the solution could easily be ‘just charge everyone.’ Who’d pay me money for the privilege of trolling me?

Then I realized I shouldn’t worry about Twitter trolls making accounts and being jerks. I should worry about people just like me thinking that they’re being funny. Or, even worse, thinking that the resource they’re making is appropriate for their students. After all, we teach adults, whose to say that we can’t include “your mom” jokes?

My real  nightmare is someone either testing out the system, playing around, and putting random crap in… Just to see if it really appears in a worksheet.

Of course there’s a solution

I can deal with it. Of course I can. There’s not a problem without a solution.

My interim solution is, for now, giving users the opportunity to explicitly say “this is part of an inside joke with this group.” You can easily add resources that will only be used for a single group. Easy.

The other thing is pretty simple: all resources are immediately available to the person who creates it. Everything else has to be approved, first. As users are added, it will be possible to say “the resources added by user_x will be automatically available,” but, until then, it means that I’ve invested a lot of time already (all morning today was spent creating the interface and the backend that will enable this level of moderation) into the project of investing a lot of extra time in this project.

And that kinda stinks. It makes me like people, as a group, just a little bit less.

The Discipline of Perception

After reading the Obstacle is the Way, by Ryan Holiday, I recently resolved to re-read it more slowly, writing about what I read in order to reflect. This is part of that, and may only be of interest to me.


 

The first story in the Obstacle is the Way is of John D. Rockefeller, and the education he gave himself — basically — by remaining level-headed in times of panic. The lesson seems to be that there cna be a financial panic happening around you, but if you choose to see it as an education, that’s what it is.

My favorite line from the chapter is actually from Warren Buffet, who is credited with summing up Rockefeller’s mentality this way: “be fearful when others are greedy and be greedy when others are fearful.”

The actual lesson of the chapter seems best summed up here:

Outward appearances are deceptive. What’s within them, beneath them is what matters.

We can learn to perceive things differently, to cut through the illusions that others believe or fear. We can stop seeing the “problems” in front of us as problems. We can focus on what things really are.

This comes at a good time. In fact, I’m several weeks late in writing this. I’ve been working as hard as I can on the dynamic-efl worksheet app and consistently feel as though I’m almost there.

I’m so very almost there that I’m getting lazy. There is a (growing) list of minor things that I want to fix, once I get it so far that I can start asking others to take it for a test drive. But, it’s getting harder and harder to reach that point, because I didn’t do something I should have: I hard-coded everything to use the new domain name.

That means that it’s almost impossible to run in development mode on my notebook, and everything has to be tested out on the website. No big deal, really, except that everything is slowed down by committing every minor change to GIT, pushing it to Git Hub, and then pulling it to the Linode server and restarting the uwsgi service. Gah, it’s frustrating. (And that frustration is part of why the list of things I’m going to fix ‘later’ is growing.)

The reason I thought to read this now was that it was just this afternoon that I realized “I could be using this as an opportunity to practice overcoming problems, rather than feeling sorry for myself.” And that’s what this could be. Should be.

There are all kinds of lessons that I should focus on learning:

  • using django’s url tags to avoid hard-coding anything at all
  • setting up a project so that it can be easily changed over to ‘production settings’ with only a few changes in the settings
  • serving static files with django (turns out just copying a template from startbootstrap.com is not enough to make a landing page)

And that is what I’m going to try to do. There isn’t really a rush, as long as I can use it to make my own worksheets.

The trick is not seeing what it looks like, it’s seeing what it is.

Fear and Frustration

I was going to only title this post “Fear,” and write about how hard it has been to finish up my worksheet generator project, because I knew I was close to having something finished that I could show to my friends and colleagues and get them to beta test it.

I had a timeline — I’d have the website up by the end of the week, show it to a close friend and fellow teacher next week — and be using it by the weekend, while soliciting other beta users. By Christmas, I wanted to be running Google ads.

Fear

The basic premise of this post was planned in a few parts:

  • Pointing out that I often talked about just wanting to have something finished
  • Talking about how it feels to tell people, as an unqualified EFL teacher, that you’re working on a coding project
  • A brief summary of the challenges of converting a project that had been working in Tkinter into a Django application
  • And, last but not least, the surprising feeling of having to force myself to do the things that needed to be done to get the project ‘ready for deployment.’

It was strange to not want to work on the project. But I’d set myself a deadline and my classes will be starting back up. I want to use the website version.

With a bit of time and reflection, I realized that I was afraid of the next steps. Soon, I’d be exposing myself to the possibility of learning that other people don’t think my app is amazing. How strange.

Knowing that, it was easier to push through it. Which brings us to part two of today’s post.

Frustration

I don’t know why I think of Django development as ‘simple,’ what with the heartache and frustration I’ve experienced. Partly, I suppose, it’s because each of the problems I’ve had has been solvable though Stackoverflow and patience. And, probably, because they mostly amounted to me making a silly mistake.

And then I tried to deploy my app.

It was working fine, using the development server on my notebook and, even though it would be a long time before I ran out of tweaks to add, it was time.

So, I did the following:

  1. Paid for an account at Github
  2. Bought the domain I wanted on hover.com
  3. Paid for an account at Linode
  4. Spent hours in telnet and with various tutorials
  5. Paid for an account at djangoeurope.com
  6. Went back to experimenting with Linode, because there are more tutorials specifically for them
  7. Opened some red wine
  8. Seriously considered no longer coding
  9. Googled ‘django deployment’ just once more
  10. Realized I probably ought to be blogging rather than doing this

The power of words

Now that I’m on my second glass of wine and have been thinking about it for a while, I realize that I’m confronted with two problems:

  1. I don’t know anything about servers, of what I have to do to get them working
  2. I don’t know what I don’t know about servers, in order to google it.

That’s the thing about coding, half the battle is just knowing what the coding community calls the thing you’re trying to do. Once you know that, you can use some patience and elbow grease to get it going.

But now? Now I’m stuck. And I’m frustrated.