My idea file

If ideas were actually worth something–as people say when they say things like, “I’ve got a $10M idea”–I’d have been rich a long time ago.

Since they’re not, their worth is mostly in the sharing. So I’m dipping into my project ideas file and pulling out wads and wads of what is unfortunately not cash, because there’s no way I’m going to get to everything.

Most recently updated June 29.

A phone app that splits restaurant bills among a group of friends

People complain about this all the time. Let’s make our smartphone into a somewhat more objective judge, kill the argument, and maybe help our wait staff get better tips.

I kind of want to do this one. Most of the issues are in UI design. It doesn’t seem too difficult. Maybe this should be my next GitHub project.

edit: of course, this has been done, and it looks like exactly how I would have done it. I wonder if it’s on Android though.

Todo-list app

But not the normal kind. What we need is something a little more interactive. We need to make todo software with a messaging protocol in the back that lets other people request additions to your todo list. You would then be able to accept or reject them. Designing this software would take a lot of user research and understanding of psychology, in order to program the right features. For instance, should the person requesting a task be allowed to see when it’s scheduled to be done, or what priority it has? There are both benefits and awfulness in that suggestion. (Mostly awfulness, I think.)

I think it should also have priority, deadline, and/or likely completion time data attached to each list item, and if the user indicates that a certain time slice of their day is open, it should suggest the optimal task or tasks to fill that spot. The algorithm might well be kind of tricky, though; it’d have to work around not always having all three data points.

Also, it would probably be fun to add game elements to this app. Maybe it should award points for tasks completed, and award more points for higher-priority tasks. This probably would result in people losing productivity due to playing with the app and fiddling to get more points, though–like breaking up tasks into tiny pieces they can “accomplish,” or ranking everything as high priority. You could choose to only award points for tasks set by other people, but then they’d rank everything so as to give you the most points, thus making their task appealing to complete.

(Software development has seen time and time again that if you award points for stuff, even if they’re worthless, people will do crazy things to get them. No one has much of an explanation as to why.)

Oh, speaking of which. You’d probably have to come up with some way to make people not mark all their assignments to others as super important–some way to weight each person’s additions to others’ to-do lists so there’s a normal distribution of priority among what they send, and they’re not marking everything important. But that causes its own problems.

This is a really neat piece of software for design issues. I kind of like it. Also, Paul Graham has asked for someone to build this a couple times (although he didn’t go into this detail).

Air conditioned motorcycle helmets

I don’t ride motorcycles, but I’ve noticed people tend to not like wearing helmets on hot days. Why don’t people make full motorcycle helmets–the really protective, full face shield kind–with air conditioning? We have, like, those single-can fridges; can’t we put a rechargeable battery in a helmet and make it work? I know batteries are heavy, but… so are those helmets, anyway.

Low-commitment freelance comics

A web site that connects comic writers with comic artists, for the purposes of making one strip at a time. Comics don’t have to go on hiatus because one of the creators has fallen ill or quit.

ReceiptStash (I have dibs on this one)

An app that stores receipt data instead of forcing businesses to use so much wasteful paper. Bonus points if it’s attached to the user’s debit card # rather than a username, because this would mean it could be used as a tool to recognize card theft. It’d also be really easy to load the data for use in a budget tracking app, which might solve a lot of people’s problems in that area.

Penguin Phone

Make a cell phone that runs Linux. Not Android, but pure Linux, with a command line and a filesystem and no unnecessary pre-installed apps.

I think our phones could do more “laptop stuff” than they currently do. Sometimes you need to make little corrections to code–fix broken links and so on. Why not use your phone? It’s as powerful, hardware-wise, as a computer. Why isn’t it as powerful software-wise?

Happy Nickels

When people experience something that makes them happy, they like to post about it on social media. (Along with a lot of other, less happy things they post about.) What if there were a social media app that was intended first of all for phone use, where every time something made you happy, you pull out your phone and post about it on this dedicated social media app.

But to do so, you have to donate a nickel to charity, in order to share your happiness with someone else. No one cares about a single nickel. You can’t buy anything with it, really. It isn’t important. Until you get a million people posting and spending nickels three times a day. Ideally, this app would be monitored to make sure that people were only posting things they’re happy about, so it’s a pleasant social media app to peruse.

True Cloud Computing

A web site that stores an individual’s computer settings in a lightweight format. Like, a Dropbox for the files, a simple word processor, some games, some other apps. Like a phone that just runs in a browser and everything’s stored on the server. Kind of like Chrome OS, without the attachment to an individual machine. It needs a really good API for people to develop for it, too. You could make a Linux distro that makes the browser part more transparent–it would still be different from Chrome OS, because Chrome OS starts from the individual computer and works onto the Web (and it’s not accessible everywhere) and this would start on the Web and just happen to work with an individual machine–any individual machine.

Real-Time, Real-World (I really considered making this one but it’s set aside for now)

A game where you take care of a third-world/impoverished family, and you can buy upgrades to get them technology that makes their lives better. What you buy actually goes to buying that technology for third-world families. If like 300 gamers buy a steel food cabinet or a well or a hygienic latrine or medicine for their virtual family, a real family somewhere gets the same thing.

Sheet Music Is Annoying

An app for musicians that displays sheet music, chords, or tabs, and can be controlled by a pair of Bluetooth-enabled pedals which flip the pages without the musician using his or her hands. Actually there are lots of ways to do this.

RSS, Get Off My Desktop

RSS, but not broken any more. It should use browser extensions or web pages rather than desktop software. It should use Internet history by date and caching to determine what content a user has seen.

Whizgig

I hate how job sites are laid out. They’re mostly just designed and commissioned by MBAs, and they suck because their search doesn’t work and the format isn’t effective. I think I could do better if I put my mind to it.

I think they should be laid out so that when someone posts a job, it feels like filling out a social media profile, and when someone looks for a job, it feels like shopping at an online site. That sounds obvious when you say it, but if you look at job sites, they really aren’t laid out like that.

Even Dice relies on kind of awful tags and whatnot–for example, “senior level” means very different things to different employers and you don’t know what you’re getting. Even on Dice, it’s hard to filter out the jobs you’re qualified for. Nobody can decide on a standard set of job titles, either, so someone searching for “Junior Python programmer” might totally miss the listing for a “Python Charmer” or “Code Ninja” or whatever weird thing they’re calling their job.

Their search is terribly broken, too. I’m a programmer, not a registered nurse–so why have I seen postings for RNs while searching for a job? That has actually happened, I think more than once.
There’s a lot to fix here if I put the time into it.

Jazz Band Beeping (this idea is something I want to see happen, but I don’t know how to do it personally)

Fast food restaurants and hospitals have one very annoying thing in common: repetitive beeping sounds. These are annoying to customers, and stressful to patients, workers, and nurses. But why beeping sounds? There’s nothing special about them that any other noise couldn’t do.

So, if you want to change it, here’s an idea.

A restaurant or a hospital room might have several different machines. Maybe two or three, maybe eight. To distinguish them, you assign each a musical instrument that would fit into a jazz band–violin, harmonica, cello, drums. You give the bass to the one that’s always running. (There’s always one. Heart monitor or whatever.) You assign the local network (the room or the restaurant) a metronome machine that keeps the instruments in sync. All the other machines in the room get their own instruments to represent them, and the nurses get instruction that hearing a harmonica is a Very Bad Thing, and hate harmonicas forever after that.

Aside from harmonica hatred, it would make those environments much more relaxing. Jazz is unstructured enough that as long as the rhythm is maintained, musical instruments popping in and out of the melody are A-OK.

The trick with this is that it would need generous funding, because you’d probably need to get a hold of medical equipment, which is expensive, and/or fast food equipment, which is expensive and often proprietary and secret. But I think it’s one of those good ideas that sounds really weird when you first hear about it.

This one probably exists as an open-source project somewhere

You know what would be really cool? A script or gedit/Sublime extension that changed your text so it fit within eighty columns. Same for code, it should be able to recognize file extensions and put in the appropriate thingy to continue the line of code. That sounds a little more difficult though.

(Ooooh, maybe I’ll write this one in Clojure later.)

Sick Day

Blaaargh. I won’t go into the grisly details, but I’ve got a virus (a biological one) and I’m feeling crappy. Brain’s running Vista, that kind of thing. I’m not working. So, let’s write a post and see if I can still put thoughts together coherently.

Some of you might have noticed that Y Combinator’s winter application is open. I didn’t, until two days ago. I read somewhere that it opened in October. It opens in late August and ends in mid October. Surprise!

But it’s a good thing I didn’t apply earlier. Why? Because tinypapers has been done before, elegantly, and I only found that out recently too.

I had heard of Evernote, but had taken a look at their site blurb and decided they were targeted towards bigger, businessy stuff like PDFs and reports, not tinypapers’ everyday stuff. But as I listed them as a competitor while I filled out the YC app, I thought, “Wow, it’s a huge oversight in my research that I haven’t installed that app on my phone and tried it out.”

So I did. It’s beautiful. It’s designed a bit differently from tinypapers, but I think it might be a better design. I’m not going to reinvent their wheel when there are lots of other wheels out there that need it.

I had mixed feelings about this discovery at first. I saved my YC app and put it away for the night, deciding to deal with my conflicting emotions the next day. But when I came back to the situation, I realized I wasn’t really upset; I just kind of thought I should be. I probably would have been if I’d been working on tinypapers recently, but it’s been long enough that I’m more detached from the project and can evaluate it more objectively.

But most startups change their idea. I knew this and kind of had the idea in the back of my mind that that might happen. I’m still glad of the time I spent on tinypapers, because it taught me a lot about programming.

I applied to YC with my job site idea. I also suggested in the application that I could make the todo list software Paul Graham requested in this essay, because I think it sounds like a fun thing to work on. I didn’t make it the main idea I applied with, for a few reasons. I don’t feel that I understand the problem PG wants solved well enough, as he put it in a list of ambitious ideas and todo list software does not sound that ambitious to me. I’m sure I could learn, but then I might fall into the trap of just listening to PG tell me what to build, and I’d rather listen to a lot of customers than one guy whose use cases are quite a bit different than average. Also, it’d look a bit like I was just picking that idea to get PG’s approval.

I still don’t want to work alone, and I still haven’t found a cofounder. I don’t think I will in Davenport, although I’m keeping my eyes open. It’s awfully hard around here to find people willing to start startups. It’s not an option that occurs to people around here, and it really sounds like a long shot. Well, it is, but that doesn’t mean it’s not worth it. I expect I’ll have better luck in Kansas City.

Anyway, I applied. I haven’t made the 1-minute video they requested yet, but I can edit the application for another six days, and I’m going to make the video after I regain the ability to pronounce the letter n.

I’m still buried in schoolwork, which is probably why I got this inconvenient bug (stress). But work is settling down. A hurdle of sorts got jumped and my supervisor/mentor/coworker/whatever he is isn’t being quite so competitive and antagonistic as he was before. If I’d been working much faster or hadn’t gone on my Kansas City trip, some stuff might have blown up on me. It’s complicated.

I’m almost sort of relieved someone has done tinypapers. I had some funny doubts about the idea. For one thing, everyone I pitched it to enthusiastically told me it was a great idea. That’s actually not so great; it means you’re not innovating hard enough. For another, it seemed easy to copy. For another, I read somewhat recently that Kivy as a framework was actually pretty slow performance-wise even though it’s a great tool in terms of programmer time/effort, and there is a point at which that tradeoff stops being a good deal.

The job site is something I personally want. It’s the startup I’d ask someone else to build. I’ve thought a lot about it, and I want to fix it, because it’s royally messed up as it is now.

I’m gonna nap now. I’m exhausted.

Just a quickie update: I fixed that bug!

Yep, my ListView updates correctly now; it’s not an iteration behind any more. I don’t know if it was just that the computer maybe just needed the processing time to add the new entry to the list, but a little confirmation page with a button did the trick. (And I kind of like how it looks.)

It’s nice when things work the first time around, isn’t it?

Now to start storing data. I don’t have a server (*makes puppy dog eyes at Y Combinator*), so I think I’ll start with just JSON and move to redis when I have online space for it.

I don’t know anything about servers. I wonder if I could find a cofounder who does, or if this is going to be Yet Another Thing Rebekah’s Learning. (It probably will be either way; the question is how much it’s going to slow me down.)

But anyway, once I get the storage and the camera down, I’m going to try to launch my prototype by registering it on the Play store and putting it on my actual phone to try out!

It’s really tempting to say, “But it’ll just take a little bit longer to fill in the rest of the categories and put all the colors back, and maybe put in cropping and compression and backups and on and on…” — but the startup wisdom I read is that if an internet troll wouldn’t make fun of what you released, you released too late.

Tomorrow is my last day before I start work. I’d better make use of it.

Hey–wouldn’t it be cool if I not only made my 2-week timeline, but got this finished tomorrow (Sunday) thus getting it done in one week? That’d be so awesome. And then what if I got the other categories and the colors and the cropping and compression and backups all done before school starts? That’s two more weeks. Maybe I could even get that done in one, too.

Stretch goals! 😀

Design sense, belatedly triggering

There’s something pretty sucky about the way I’ve been structuring tinypapers. It’s getting too spaghettti-code-like. A line I wrote a few days ago to solve a problem made me feel uneasy (I think I mentioned this already somewhere?) and I couldn’t find a different approach. Then there are these more recent issues that have been making me twitchy. My design sense finally put two and two together… there’s some funky stuff going on I need to fix.

Anyway, I’m going to have to spend a day or two refactoring (and, where possible, minimizing) the “power” structure before it gets any more complicated. I just sat down with an actual pen and paper (magical tools) and it’s pretty obvious that something isn’t right. Hopefully the visual aid will help kick me into solving what’s wrong.

—–

(several hours later)

Kivy is really confusing about this, though. Because child structures and inheritance are mostly defined in KVlang rather than Python, ordinary design patterns don’t… quite work. I’m in a better position to figure this out now than before I wrote any code, of course.

Here’s the structure.

I’ve got one class (widget if you’re speaking KVlang) which controls which of the other classes is being displayed. I’m calling it a window manager. Of course, in each of the “child” classes (which don’t actually inherit anything from the window manager), there’s at least one button that’s supposed to trigger the window manager and make it display a different page.

You can’t just randomly call them from other classes. The page-switcher methods need an instance of the window manager to work. And I can’t just put the page-switcher methods in the child classes. The reason the window manager exists is that it’s the only part of the program that knows how to do that sort of thing.

So, there isn’t… really a hierarchy in the Python file. It’s mostly just there to define any logical back-end that the KVlang file might need.

The KVlang file has hierarchy all over the place. It basically declares everything.

Anyway, I’ve got this window manager. Underneath it I have the main page that lists categories of documents (“Business Cards”, etc) and each of those categories has (will have; I’m only working with one right now) its own instance of IndexPage to display the documents in that category. Each category also has an Add page for new entries.

It’s not that complicated! It shouldn’t be this complicated! It’s still complicated!

—–

(an hour later)

As you can tell, I’m still getting my head around Kivy.

Basically, whenever you need to do stuff that crosses over different classes, you have to make your method calls in Kivy. Kivy keeps basically all the class instances in memory. This gets kinda tricky if you lose track of things though.

I do need to clean up the Kivy inheritance… and then stop bashing my head against trying to make things happen in the Python file that just can’t happen in the Python file. Sigh.

Another tinypapers update

 

I’ve been working on tinypapers for a little over a month, if you count the time I spent mentally designing it and the time I spent on learning the basics of Kivy. I still feel kind of nervous about things, because I feel like I’m not much of a competent programmer. I could hope this is Dunning-Kruger effect, and not that I’m actually incompetent, but I’d be deluding myself. There’s a lot to programming, and while I know a lot more about it than the newbie geeks running around the college right now, trying to get signed up, I also know there’s a ton I haven’t gotten to.

I’m staking a lot on my learning ability, here. I know I can pick up the basics of a new programming language in a few weeks. Certainly I can learn the things a class on a programming language teaches in half the time they teach it. But there are things that aren’t taught in those classes, things that aren’t really taught in books… things you have to pick up on your own. I haven’t learned those skills from programming side projects. I came across this profitable little idea before I started on a side project of my own… which is mainly because I was waiting for a way to learn something that can only be taught by doing.

So I guess I’m doing. I’m investing a lot of my time and energy in a really inexperienced fledgling hacker, though.

I am used to making stuff, though. I wrote novels for years, and while I had a bunch that never got beyond two pages because I didn’t like the idea after trying it out, I also managed to turn out about a novel per year (of varying quality) for years–and I started at age ten. RPi Signage counts as a sort of side project, but it’s not very programming-intensive either. I have a fish tank that can go for months without water changes, because it’s as close as you can get to an ecosystem in a box. And of course there’s this blog. I’m good at making things. But I think this is the most complicated thing I’ve tried to make yet.

I’m also not going fast enough for my liking. I work on tinypapers nearly every day for at least a few hours, if you don’t count the time I spend thinking about it… but that’s not startup speed. That’s just the learning speed I’m accustomed to from self-teaching things. I’m still learning, and that takes more energy than building when you know better what you’re doing, so my mental stamina is kind of ehhh there. But my competitors aren’t going to care about that. This project can’t just truck along. It needs to fly.

I have a new goal: I’m going to aim for having a working prototype in two weeks. Just something that has really basic features and probably not a very pretty UI. If I could get a prototype out when tinypapers is only six weeks old, I’d have an easier time convincing myself that I can handle managing a startup.

My gut says three weeks is a more reasonable timeline, considering I’m only halfway through the Kivy book and I may soon be pitching the RPi Project to the Honors Committee at school in order to get credits for working on it (which I think my advisor cares about more than I do; I just want to do it), but I’d rather stretch a bit. Two weeks it is.

School starts three weeks from now. Hopefully I’ll be able to make some new friends and see if there’s maybe a cofounder out there. There are 8,000 students at my community college. I’d say only 600 of them are in techie majors, half of them are programmers, half of those are mostly just interested in game design, and a third of what’s left are adults with ~responsibilities~. The question is, out of the remaining 100, is there someone who’d be willing to run off to San Francisco with an 18-year-old girl and write software and try to convince people it’ll be worth millions of dollars when it’s done?

Then, of course, there’s the thing about whether they’re the sort who won’t take a girl seriously in tech. It happens. Less than 5% of the group I described are like that, though.

I do have someone in mind. Actually, two people I might ask about it. But I don’t know either of them terribly well. One of them is someone I’ll be working with quite a bit more because he wants in on RPi Signage, and I’m angling to be in charge of that. My current friends… well, either their skill set and circumstances are incompatible with what I’m doing, or they’re really not people I’d choose as cofounders.

Wish me luck.

The Problem Of Software Licensing

This wasn’t a request, just a personal debate of mine.

Meet the main contenders. On the one hand, we have the likes of DRM: making it difficult not only to pirate their software, but to use it legally after you’ve legitimately bought it.

On the other hand, we have Richard Stallman and the Four Essential Freedoms:

  • The freedom to run the program as you wish, for any purpose (freedom 0).
  • The freedom to study how the program works, and change it so it does your computing as you wish (freedom 1). Access to the source code is a precondition for this.
  • The freedom to redistribute copies so you can help your neighbor (freedom 2).
  • The freedom to distribute copies of your modified versions to others (freedom 3). By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this.

Paul Graham also has an essay that’s pretty sympathetic to Stallman, although it doesn’t explicitly agree with him on the points mentioned above. It simply takes a stand against DRM and restrictive copyright licensing.

I don’t fully agree with either of these. I agree with PG, and my views are closer to Stallman’s side, but I also think the freedoms Stallman considers essential would prevent people from being able to profit from writing software. As someone who plans to profit from writing software as a living, this puts me in a bit of a dilemma.

The main problem, as I see it, is that software “piracy”–the act of seeing a developer (or any digital creator, such as a music artist) selling their work for an amount of money, and choosing to deny them reimbursement for their work and for making your life easier by downloading it elsewhere even if you could have paid for it fairly–is not taboo.

I can sympathize with so-called piracy (which, I agree with Stallman, is a pretty strong word for something that isn’t always bad) in the case where one actually doesn’t have the money. I don’t care if high school students want to grab something I made from a torrent site or whatever instead of… not paying for it and not benefiting from it, which is their other option. I want to help people with my software. I also sympathize when the software is patently overpriced. (Photoshop, I’m looking at you. You’re worth, like, fifty bucks… not two hundred.)

So, what constitutes “bad” piracy? Is “good” piracy even piracy? It’s clear the issue isn’t black-and-white. To me, the license applied to software needs to consider critically precisely which behaviors are to be prohibited, and which ones allowed.

I ran a quick Google search and found a post on debate.com entitled “Is internet piracy a bad thing?” There’s some intelligent discussion going on about the benefits and costs of piracy in general.

Here’s one against piracy:

Internet piracy is theft.

Internet piracy is not as bad as stealing something physical, such as a CD or DVD, as no one lost money from the physical creation of the item, but, it is still theft, and still bad. While it may not be physical, the parallels are unquestionable. In both situations you are getting something for free that has cost others lots of time, money and effort to build. Films especially cost huge amounts to make, often hundreds of millions of dollars, in exactly the same way to how it costs someone to create a handbag or a car. If internet piracy was not an option, you would either not watch said film, or buy it, giving the creators money and consequently payment for their efforts. However, as internet piracy is an option, there is no motivation for people to pay. If everyone pirated this would mean that all films would result in major losses, and film/computer programme/music would all become charitable things relying on donations to be made. Instead, the current situation is some people pirate, and others pay the proper price, giving the creators the money they deserve. But that itself is unfair, as why should some have to pay while others do not? No matter how people twist it to justify what they are doing, despite the fact internet piracy is not stealing something physical, it is still theft, you are not stealing from a shop owner or item-owning citizen, but you are stealing from the creators of whatever you pirate.

Here’s one that says piracy is sometimes okay:

It isn’t [a bad thing], within limits.

Lets say a movie isn’t available in your country. Maybe it will be- in a few months or so (in a cut and extra-less version), but your friends from overseas are already touting how good it is. Perhaps there’s a game that’s two times more costly in your region than anywhere else in the world. It could be that you’ve been screwed over by DRM and locked out of your *legally purchased* software (very, very frustrating, and it really bothers me when a pirated product is *better* and *easier to use* than the legal one, because it doesn’t have the damned DRM) It might be you have your wallet ready, but the software is prohibitively expensive. Say you’d love to pay to watch those episodes of Game of Thrones, but you really don’t want a full HBO subscription. There are instances in which piracy is justified- it can be a means of protecting consumers from bad industry practices, like overpricing, awful DRM (screws over only paying consumers!) or idiotic distribution practices.
Of course, piracy is terrible if it means profiting from someone’s work, plagiarism, or not paying for something you could have reasonably easily obtained legally.

I agree with both, as you might have gathered. I didn’t write either, however.

I’d like to call attention to the last line of that second one:

“Of course, piracy is terrible if it means profiting from someone’s work, plagiarism, or not paying for something you could have reasonably easily obtained legally.”

This lists three things (really, two behaviors) that are to be prohibited:

1. Plagiarism, which we can probably all agree is awful;

2. Benefiting from someone else’s work without giving them the payment they’ve asked for, if you could have reasonably obtained it legally.

This is my view in a nutshell. I think it’s a lot of people’s views in a nutshell. Now, the question is how to keep those behaviors from happening, because I think the current measures are far too restrictive. There must be a better way to do this.

To prevent both of those things, most software companies only distribute binary files. They don’t distribute source code, because a) their competitors could see how their software worked and copy it, and b) it would be easy to illicitly redistribute their programs by just releasing the source code to the Internet. Many software providers also prevent redistribution of their binaries by trying to locate and eradicate sites which distribute them illegally.

Windows, notably, does not do the latter. Not because Microsoft is somehow more noble… they’ve just found a way around the latter concern. Windows copies only work if you have a product key. I think this is a hint as to how we could get things to work.

Another hint is Mac OS X. Part of the code is open, and the other part is closed-source. I consider this fairly acceptable, although it definitely isn’t a perfect solution.

A third hint is actually Chrome OS. Most of that OS’s software is cloud-based. You need server support to run it.

These three hints, working together, can fight at least the second behavior.

If your software is cloud-based, you can open up most of your code. This is because if your software is cloud-based, you can make your users pay for an account to log in to the server, or a product key.

The first option (access through accounts) is basically how Google Play works! (At least on mobile phones.) And as we’ve found, that works pretty well. 🙂 I, at least, haven’t heard much about pirating apps. I’m sure it happens, but not much. I wouldn’t expect it to pick up just because the source became available, either, unless the price of the software exceeded the price of publishing an app to Google Play (about $20, I think) and supporting it. And if it’s cheaper to reproduce and maintain on your own (something crackers are highly unlikely to do, let alone do well), that probably means the original was far overpriced.

The second option (which you have to take if you aren’t providing server support–i.e., if it’s a piece of desktop software) requires making part of your code closed-source. Namely, the part that requires your users to need a product key. The problem here is that if you distribute that binary in the middle of untainted source, piracy-minded folks will just strip it out of your package and use the rest of your source code. So maybe you have to hide your main method or close off one feature that it’s inconvenient not to have, thus making it inconvenient to pirate your software.

(A nasty/fun hack one could try as an alternative to this would be to program the product-key-requirement code in Whitespace or something. Crackers, on the whole, wouldn’t be smart enough to catch on.)

[Edit: A note on product keys. I object to product keys and licensing that say you can only run the program on one machine. I think the legal qualifier should be that you’re licensing the program to one person, not one computer, and deal with licensing for institutions like schools and businesses separately (this, I think, is how the current model came about). Licensing to a person is pretty painless on both sides. Having a user sign into an account which includes their billing data in order to access their program seems pretty effective; at most you get them sharing with close friends and family, which helps (marketing) more than it hurts.]

I think a lot of big corporations would object to this idea, though. They’d be worried about their competitors accessing their code and copying it. Indeed, I’d start off being nervous about putting tinypapers out there like that, at least right now.

The trick is that you have to have a brand and a following first. You have to be recognizable. Furthermore, your users have to like and be loyal to you. If someone else stole Photoshop’s code, even if they had no patents, people would probably recognize that it was stolen Photoshop code. However, a lot of hackers would go, “Hey, awesome, we don’t have to support Adobe.” Adobe has had a history of producing crummy, overpriced software–Flash and Dreamweaver certainly come to mind. Photoshop isn’t crummy, but it is overpriced.

Whereas if I were to establish a brand with tinypapers–make it well-known and recognizable–I’d be more likely to have a good relationship with my users. I can afford to listen to what they’re saying they want. I can afford to give them spectacular customer service. I can afford to start fixing a bug the hour they report it–perhaps even while they’re on the phone with me. I also don’t have a history of ripping them off, and don’t plan to sell my app for more than a dollar or two–more probably, though, I’d distribute a free version first with one line of simple text ads per page–and charge more for server space if/when that becomes a thing.

At that point in my business, assuming (hoping!) I get there, anyone trying to copy me would most likely be ignored, because my users by then would like me too much. The competitor also have to learn to use the tools I’m using, which not many people know how to do, so I have a head start. Because I’m young and not tied to a programming language, I don’t hesitate to learn a new framework like Kivy, even though it’s a steep learning curve.

There would be a trade-off to opening up my code: many companies would not want to buy tinypapers. But I think those would probably be miserable companies to work for, so maybe that’s a good thing. It also might make it harder to get investors. But if those investors care more that my code is open than whether users like my product, they’re probably dumb investors.

It’s tempting to open up my code on GitHub now. I really like the open-source development methodology, the community surrounding GitHub, and the version control software itself. It’s tempting to think that my repo wouldn’t be seen by much of an audience at first anyway. But I think, for prudence’s sake, I’ll hold off for now. It’s kind of a dumb idea to let potential competitors know that much about a larval startup.

I’d really like to hear your opinions on this, readers. Honestly, I’d especially like Paul Graham’s opinion, because he’s seen so much of the landscape I’m talking about and has good powers of analysis (and I’d like to see a more recent essay of his about it). I’ll try emailing him, but he’s probably really busy. Nevertheless, my habit of bugging people I admire hasn’t done me any disfavors yet. 😉

ESR, if you happen to be reading this, I’d really appreciate your comments too. You’ve probably heard a lot of discussion on this topic, and generated quite a bit of it yourself.

Edit: Other Thoughts

It was observed by ESR in “Cathedral and the Bazaar” that repositories which encourage others’ contributions to their code have fewer forked projects running from them; changes got incorporated into the main branch rather than spinning off into their own projects.

It occurs to me, then, that if a startup were to open up their code, there is a way to prevent certain competitors–the ones who are at least partially driven by wanting to make better software. A hacker may look at a commercial application, think, “I can do better than this,” and write his own, thus becoming a competitor. But if the application’s source is open, and the people running the business behind it aren’t territorial about their code, he can apply as a sort of temporary consultant for whatever feature he wanted to program in. Basically, he could program in the feature, and offer it to the company with an estimate of what he thinks it’s worth (maybe $50-$2000 if it’s somewhere from a little bug fix to a neat but not huge addition, or he could ask for stock if it’s particularly large). Then the company could accept or reject it, or negotiate price if necessary. Since they (hopefully) know their users better than J. Random Hacker does, their decision would probably be respected.

This would also solve the hiring problem many startups face! Anyone who provided a few good fixes or features like this would be a very promising candidate. And of course it would make the company’s software better, which is always excellent.

Big companies buy startups for their software (the basis of their market) and their people. Why can’t startups buy code chunks and job candidates?