Deconstructing the Four Freedoms of Free Software, one at a time.
endif; ?>“Free Software” (with a capital “F”), and the GPL are core components of the Linux – and broader Open Source – world. In order for software to qualify as being “Free,” it must adhere to a list of four criteria – “The 4 Freedoms.”
Unfortunately, those four “Freedoms” suffer from some serious logic problems that any good compiler would throw an error on. Or, in some cases, result in a kernel panic.
In this four part series, we are going to pick apart these four “Freedoms,” one-by-one, and attempt to apply real engineering logic to each. To get things kicked off properly, here they are… in their entirety:
Freedom 0: The freedom to run the program for any purpose.
Freedom 1: The freedom to study how the program works, and change it to make it do what you wish.
Freedom 2: The freedom to redistribute copies so you can help your neighbor.
Freedom 3: The freedom to improve the program, and release your improvements (and modified versions in general) to the public, so that the whole community benefits.
With that out of the way, let’s start with that first one. Because this is a list, and the first one comes first.
“Freedom 0: The freedom to run the program for any purpose.”
My inner nerd appreciates that the list of four “Freedoms” starts with zero. Unfortunately, the rest simply will not comply, and makes my brain bleed.
This is, in essence, saying that the first component of “Freedom” is “The freedom to run the program for any purpose.” Or, put another way, “Freedom” is an array. And we are setting its first value (zero) to something.
Or, put into code… “Freedom[0] = X;” which would work just fine. Set the first value of the “Freedom” array to whatever “X” is. Sure. No problem.
Unfortunately, in this case, “Freedom” is part of “X” itself. So “X” is really “Freedom” plus some other information (in this case “to run the program for any purpose”). Here is how that would look in code.
Freedom[0] = Freedom + kOtherStuff;
This means we have now set the first item in the array to be equal to the entirety of the array itself… plus some other information. Which will break. Badly. In “non-programmer” speak this would be like saying “The cushion on this couch consists of the entirety of the couch itself… plus an ostrich.”
“But, Bryan!” I hear you say, “The ‘Freedom’ on the left of the equation has a different meaning than the ‘freedom’ on the right of the equation because the one on the right has a lowercase ‘f’ instead of an uppercase ‘F’.”
I’m going to put aside the fact that this idea fills me (or at least the part of me that thinks language is “a good idea”) with blinding rage. The notion that we can take a word, change a letter to be upper case, and then declare it to have a new meaning (but a meaning that evokes a strategic emotional response with the goal of making it difficult for people to argue against a concept)… let’s just say that I don’t like it. I dislike this almost as much as rewriting history to make Han shoot second.
But, in the interest of making this make any sense at all, let’s assume for a minute that “Freedom” does not equal “freedom” (aka “Freedom != freedom”). This makes the code much cleaner. “Freedom[0] = X;”. Phew. Better.
Unfortunately…this doesn’t work either. But I’ll save that for part 2 (which is really part 1).




