The meaning of success

I once had a quite extensive discussion with a colleague about several topics related to the software industry, and slowly but methodically we reached a fundamental disagreement on what “success” means. Needless to say, without agreeing on what “success” means it’s really hard to reach a conclusion on anything else. I now believe that many problems in society — not only in the software industry — can be derived from our mismatches in our understanding of the word “success”. It is like trying to decide if abortion is moral without agreeing on what “moral” means — and we actually don’t have such an agreement — and in fact, some definitions of morality might rely on the definition of “success”.

For example: which is more successful? Android? iPhone? or Maemo? If you think a successful software platform is the one that sells more (as many gadgets geeks probably do), you would answer Android, if on the other hand you think success is defined by what is more profitable (as many business people would do), you would answer iPhone. But I contend that success is not relative only relative to a certain context; there’s also an objective success that gives a clear answer to this question, and I hope to reach it at the end of this post.

This not a meta-philosophical exercise, I believe “success” in the objective sense can be clearly defined and understood, but in order to do that, I would need to show some examples and counter-examples in different disciplines. If you don’t believe in the theory of evolution of species by natural selection, you should probably stop reading.

Definition

The Merriam-Webster dictionary defines success as (among other definitions):

  • a : to turn out well
  • b : to attain a desired object or end <students who succeed in college>

From this we can say there’s two types of success; one is within a specific context (e.g. college), and the other one is in general. In this blog post I will talk about generic success, with no specific goal, or rather with the generic ultimate goal. Since it’s highly debatable (and difficult) how to define this “ultimate goal”, I will concentrate on the opposite; to try to define the ultimate failure in a way that no rational person would deny it.

Humans vs. Bacteria

My first example is: what organisms are more successful? Humans, or bacteria? There are many angles in which we could compare these two organisms, but few would reach a definite answer. The knee-jerk reaction of most people would be to say: “well, clearly humans are more evolved than bacteria, therefore we win”. I’m not an expert in the theory of evolution, but I believe the word “evolved” is misused here. Both bacteria and humans are the results of billions of years of evolution, in fact, one could say that some species of bacteria are more evolved because Homo Sapiens is a relatively new species and only appeared a few hundred thousands years ago, while many species of bacteria have been evolving for millions of years. “Kids these days with their fancy animal bodies… I have been killing animals since before you got out of the water… Punk” — A species of bacteria might say to younger generations if such a thing would be possible. At best humans are as evolved as bacteria. “Primitive” is probably the right word; bacteria is more primitive because it closely resembles its ancestors. But being primitive isn’t necessarily bad.

In order to reach a more definitive answer I will switch the comparison to dinosaurs vs. bacteria, and come back to the original question later. Dinosaurs are less primitive than bacteria, yet dinosaurs died, and bacteria survived. How something dead can be considered successful? Strictly speaking not all dinosaurs are dead, some evolved into birds, but that’s besides the point; let’s suppose for the sake of argument that they are all dead (which is in fact how many people consider them). A devil’s advocate might suggest that this comparison is unfair, because in different circumstances dinosaurs might have not died, and in fact they might be thriving today. Maybe luck is an important part of success, maybe not, but it’s pointless to discuss about what might have been; what is clear is that they are dead now, and that’s a clear failure. Excuses don’t turn a failure into a success.

Let me be clear about my contention; anything that ceases to exist is a failure, how could it not? In order to have even the smallest hope of winning the race, whatever the race may be, even if it doesn’t have a clear goal, or has many winners; you have to be on the race. It could not be clearer: what disappears can’t succeed.

Now, being more evolved, or less primitive, is not as a trump card as it might appear; nature is a ruthless arena, and there are no favorites. The vast majority of species that have ever lived are gone now, and it doesn’t matter how “unfair” it might seem, to nature only the living sons matter, everyone else was a failure.

If we accept that dinosaurs failed, then one can try to use the same metric for humans, but there’s a problem (for our exercise); humans are still alive. How do you compare two species that are not extinct? Strictly speaking all species alive today are still in the race. So how easy is it for humans to go extinct? This is a difficult question to answer, but lets suppose an extreme event turns the average temperature of the Earth 100°C colder; that would quite likely kill all humans (and probably a lot of plants and animals), but most certainly a lot of bacterial species would survive. It has been estimated that there’s 5×1030 bacteria on Earth, countless species, and possibly surpassing the biomass of all plants and animals. In fact, human beings could not survive without bacteria, since it’s essential to the human microbiome, and if you sum the bacteria genes in a human body, it probably outranks the human genes by a factor of 100-to-1. So, humans, like dinosaurs, could disappear rather easily, but bacteria would still be around for a long long time. From this point of view, bacteria are clearly more successful than humans.

Is there any scenario in which humans would survive, and bacteria would not? (therefore making humans more successful) I can think of some, but they would be far into the future, and most definitely we are not yet there. We are realizing the importance of our microbiome only now, and in the process of running the Human Microbiome Project, so we don’t even know what role our bacteria plays, therefore we don’t know how we could replace them with something else (like nanorobots). If bacteria disappeared today, so would we. It would follow then that bacteria are more successful, and there’s no getting around that.

Fundamentals and Morality

Could we define something more fundamental about success? I believe so: a worse failure than dying, is not being able to live in the first place, like a fetus that is automatically aborted because of a bad mutation, or even worse; an impossibility. Suppose “2 + 2 = 5″; this of course is impossible, so it follows that it’s a total failure. The opposite would be “2 + 2 = 4″; this is as true as anything can be, therefore it’s a total success.

There’s a realm of mathematics that is closer to what we consider morality: game theory. But don’t be fooled by its name; game theory is as serious as any other realm of mathematics, and the findings as conclusive as probability. An example of game theory is the prisoner’s dilemma — here’s a classic version of it:

Two men are arrested, but the police do not possess enough information for a conviction. Following the separation of the two men, the police offer both a similar deal—if one testifies against his partner (defects/betrays), and the other remains silent (cooperates/assists), the betrayer goes free and the one that remains silent receives the full one-year sentence. If both remain silent, both are sentenced to only one month in jail for a minor charge. If each ‘rats out’ the other, each receives a three-month sentence. Each prisoner must choose either to betray or remain silent; the decision of each is kept quiet. What should they do? If it is supposed here that each player is only concerned with lessening his time in jail, the game becomes a non-zero sum game where the two players may either assist or betray the other. In the game, the sole worry of the prisoners seems to be increasing his own reward. The interesting symmetry of this problem is that the logical decision leads each to betray the other, even though their individual ‘prize’ would be greater if they cooperated.

There are different versions of this scenario; with different rules and more complex agents game theory arrives to different conclusions as to what rational agents should do to maximize their outcomes, but these strategies are quite factual and universal; we are not talking about human beings; they are independent of culture, or historicism; the rules are as true here as they are in the other side of the universe. So if game theory determines that a certain strategy fails in certain situation, that’s it; it’s as hard of a failure as “2 + 2 = 5″.

With this notion we might be able to dive into more realistic and controversial examples — like slavery. Nowadays we consider slavery immoral, but that wasn’t the case in the past. One might say that slavery was a failure (because it doesn’t exist (at least as a desirable concept)), but that is only the case in human society, perhaps there’s another civilization in an alien planet that still has slavery, and they are still debating, so one might be tempted to say that slavery’s failure is still contended (perhaps even more so if you live in Texas). But we got rid of slavery because of a reason; it’s not good for everybody. It might be good for the slave owners, and good for some slaves, but not good for everybody. It is hard to imagine how another civilization could arrive to a different conclusion. Therefore it is quite safe to say that in all likelihood slavery is a failure, because of its tendency to disappear. Perhaps at some point game theory would advance to the point where we can be sure about this, and the only reason it took so long to get rid of slavery is that we are not rational beings, and it takes time for our societies to reach this level of rationality.

Objective morality and the moral landscape

Similarly to the objective success I’m proposing, Sam Harris proposes a new version of objective morality in his book The Moral Landscape. I must admit I haven’t read the book, but I have watched his online lectures about the topic. Sam Harris asserts that the notion that science shouldn’t deal with morality is a myth, and that advances in neuroscience (his field of expertise) can, and should, enlighten us as to what should be considered moral. Thus, morality is not relative, but objective. The different “peaks” in the landscape of morality are points in which society aims to be, in order to be a good one, and historically the methods to find these “peaks” has been rather rudimentary, but a new field of moral science could be the ultimate tool.

Regardless of the method we use to find these “peaks”, the important notion (for this post), is that there’s an abyss; the lowest moral point. The worst possible misery for all beings is surely bad:

The worst-possible-misery-for-everyone is ‘bad.’ If the word ‘bad’ is going to be mean anything surely it applies to the worst-possible-misery-for-everyone. Now if you think the worst-possible-misery-for-everyone isn’t bad, or might have a silver lining, or there might be something worse… I don’t know what you’re talking about. What is more, I’m reasonably sure you don’t know what you’re talking about either.

I want to hijack this concept of the worst-possible-misery-for-everyone that is the basis of (scientific) objective morality, and use it as a comparison to my contention that ceasing-to-exist is the basis for objective success.

Today our society is confronted with moral dilemmas such as gay marriage and legal abortion, many of these are hijacked by religious bigotry and irrationality, and it’s hard to move forward because many still define morality through religious dogmas, and even people who don’t, and are extremely rational, still cling to the idea that morality comes from “God” (whatever that might mean). Even many scientists claim that morality cannot be found through science, and others that morality is relative. But yet others disagree and have tried to define morality in universal terms, like Sam Harris. The jury is still out on this topic, so I cannot say that morality should definitely be defined in terms of what is successful to our worldwide society, merely that it is a possibility — A rather strong one, in my opinion.

Life

It’s a little more tricky to define what constitutes a successful life, because all life ends. The solution must be one on the terms of transcendence: offspring, books, memes, etc. However people living a more hedonistic life might disagree; but lets be clear, a life can be unsuccessful in the grand scheme of things, but still be good, and the other way around. It might be tempting to define success in different terms: “if my goal is to enjoy life, and I do; I’m succeeding”, and while that is true, that’s being successful in relative terms, not general terms.

Some people might have trouble with this notion, so I would give an example: Grigori Perelman vs. Britney Spears. Most people probably don’t know Grigori, but he solved one of the most difficult problems in mathematics, and was awarded one million USD for it. Clearly this would have helped him to become famous, but he rejected interviews and rejected the money. Does this means he rejected success? Well, lets try to view this from the vantage point of 500 years into the future; both Britney Spears and Grigori Perelman would be dead by that time, so the only things that remain would be their transcendence. Most likely nobody would remember Britney Spears, nor listen to any of her music, while it’s quite likely that people would still be using Grigori Perelman’s mathematics, as he would be one of the giants upon which future scientists would stand. In this sense Grigori is more successful, and any other sense of success would be relative to something else, not objective.

Test

Hopefully my definition of success should be clear by now in order to apply it to the initial example.

iPhone

iPhone is clearly successful in being profitable, but many products have been profitable in the past and have gone with the wind. The real question is: What are the chances that the iPhone will not disappear? It is hard to defend the position that the iPhone will remain for a long period of time because it’s a single product, from a single company, and specially considering that many technology experts can’t find an explanation for its success other than the Apple Cult. While it was clearly superior from an aesthetic point of view while it was introduced, there’s many competitors that are on par today. Maybe it would not disappear in 10 years, but maybe it would. It’s totally unclear.

Android

Compared to the iPhone, Android has the advantage that many companies work on it, directly and indirectly, and it doesn’t live on a single product. So if a single company goes down, that would not kill Android, even if that company is Google. So, as a platform, it’s much more resilient than iOS. Because of this reason alone, Android is clearly more successful than the iPhone — according to the aforementioned definition.

Maemo

Maemo is dead (mostly), so that would automatically mean that it’s a failure. However, Maemo is not a single organism; it consists of many subsystems that are part of the typical Linux ecosystem: Linux kernel, X.org, Qt, WebKit, GStreamer, Telepathy, etc. These subsystems remain very much alive, in fact, they existed before Maemo, and will continue to exist, and grow. Some of these subsystems are used in other platforms, such as WebOS (also dead (mostly)), Tizen, MeeGo (also dead (kinda)), and Mer.

A common saying is that open source projects never die. Although this is not strictly true, the important thing is that they are extremely difficult to kill (just ask Microsoft). Perhaps the best analogy in the animal kingdom would be to compare Maemo to a sponge. You can divide a sponge into as many parts as you want, put it into a blender, even make sure the pieces pass through a filter with very minute holes. It doesn’t matter; the sponge would reorganize itself again. It’s hard to imagine a more resilient animal.

If this is the case, one would expect Maemo (or its pieces) to continue as Tizen, or Mer (on Jolla phones), or perhaps other platform yet to be born, even though today it seems dead. If this happens, then Maemo would be even more successful than Android. Time will tell.

Predictions

Like any a scientific theory, the really interesting bit of this idea would be it’s predictive power, so I will make a list of things in their order of success, and if I’m correct the less successful ones would tend to disappear first (or their legacy):

  • Mer > Android > iOS > WP
  • Linux > Windows
  • Bill Gates > Steve Jobs > Carlos Slim (Richest man in the world)
  • Gay marriage > Inequality
  • Rationality > Religious dogma
  • Collaboration > Institutions

To me, this definition of “success” is as true as “2 + 2 = 4″ (in fact, it’s kind of based on such fundamental truths), unfortunately, it seems most people don’t share this point of view, as we still have debates over topics which are in my opinion a waste of time. What do you think? Are there examples where this definition of success doesn’t fit?

Unique Mexican music; Son Jarocho, folklore and more

There’s a lot of interesting and unique music in Mexico, both modern and traditional, but there’s one kind that I find particularly unique and beautiful that I think it’s extremely underrated in Mexico, let alone in the world; Son Jarocho.

This first video is from Cafe Tacuba, IMO the best band from Mexico, although I’m not sure what kind of style it is, it’s certainly awesome :) (I couldn’t find a better video quality)

The rest of the videos are of what I consider Son Jarocho in the right setting; small room, 3 guys; jarana jarocha (small guitar), requinto jarocho (even smaller guitar), and more importantly; arpa jarocha (a special harp). It’s a mixture of different styles from different continents, and the lyrics are often funny and sometimes improvised to make fun of something, or somebody. BTW, jarocho means from Veracruz, one of the 31 states of Mexico.

La Bamba is the most famous one, but I couldn’t find one video worthy of highlighting, so I just put the best one I could find. And before you ask, yes, the high pitch and loud voices in the chorus are intended, also, wait for the solos ;)

This is what you most likely would expericence; a group wandering around restaurants, improvising and making jokes.

This one seems professionally recorded. Just for measure.

For more more about Mexican music and culture, check this previous post.

Why United States of America is a stupid name

I’m not an European, I’m an American, more precisely; from Mexico, unfortunately U.S.A. has snatched the name for itself, which is very annoying to me, specially after living for some time on this side of the Atlantic Ocean. I guess because some extra need to relate myself with Peruvians, Brazilians, Ecuadorians, Canadians, etc. Which I never met before in Mexico. There’s really not much to do about it, but nonetheless there’s plenty of interesting facts and conversation tidbits to explore.

Continue reading

Avoid Reply-To munging; mail as mail was meant to be

Reply-To munging (the act of overriding the ‘To’ header in mails) is a common practice on many mailing lists, but does it provide any value?

I participated in a long and tedious discussion on fedora-devel, not only regarding Reply-To munging, but also allowing non-subscribers to post. At the end I realized why mailing lists do such a thing: inertia, misconceptions, and laziness.

After shutting down all the arguments provided, it turns out there’s only one benefit of Reply-To munging; I’ll try to explain why it’s not so important, all the problems it causes, and some of the invalid arguments.

Personal level indicators

Before getting started I want to show a cool feature of Gmail that is only possible with proper replies (unmunged).

Personal level indicators

With these it’s very easy to see which mails has been addressed to me personally while browsing a mailing list. For this to work, of course mails needs to be addressed to me (like it normally is), instead of the mailing list. And of course Gmail is not the only client that supports this; mutt can highlight mail with the ~p filter.

There are similar advantages, like the fact that I can search for “to:me”.

In favor

Virtually all mail clients provide at least two options when replying mail:

  1. Reply to sender
  2. Reply to all

Sometimes people mistakenly click “reply to sender”, but when Reply-To munging is used; the sender is the mailing list, so when people make this mistake (it still is a mistake), the mail still reaches the mailing list.

Everybody is aware of “reply to all”

It might come to a surprise to many hard-core mailing list users, but the common (non-geek) population of e-mail users is perfectly aware of the “reply to all” button; otherwise they wouldn’t be able to have group conversations.

People have back-and-forth conversations to more than one person through e-mail; therefore people know when to use “reply to all”. So the argument should not be on ignorance of the option, but mistakingly using the wrong one.

Gmail, Outlook, Hotmail, Thunderbird, Yahoo! Mail; they all have the option, because people use it.

It still is a mistake

Many people think that if the mailing list has Reply-To munging, then you can stop using “reply to all”; that’s not true.

The annoying “Please keep me in Cc as I’m not in the mailing list” warnings would not be needed if people clicked “reply to all” (even when the To header is munged); the munging applies to the To header, but not the Cc headers.

So for example, I Cc myself on munged mailing lists; if people use their mail clients properly, then I’d be addressed properly and have all the advantages of that, like personal mail notifications. But no, most people are lazy and click “reply to sender”.

Munging only perpetrates this bad behavior.

We don’t need no babysitters

Would you like the mailing list to bounce messages back saying “it looks like you forgot to add the attachment file”? This mistake, just like clicking the wrong reply option, is something the user should avoid doing.

Against

The previous argument “in favor” is very week at best, but there’s still some value in it. Is it really worth it when measuring the arguments against?

Personal level indicators don’t work

I already explained this feature is very useful, and if it wasn’t clear at this point: munging makes it impossible.

A few people do use “reply to all” even on munged mailing list, but they are the minority, the fact of the matter is that you can’t rely on this: when you see a message without a marker it might still be addressed to you, so you can’t dismiss it as quickly as you would on a non-munged mailing list.

Impossible to do “to:me” searches and filters

Quite often when searching mails you want one of the criteria to be “addressed to me”, however, if the To field was munged, then you just can’t do that, you would have to reply on full-text searches, or other sub-optimal method.

Some clients support tags (like notmuch), so it’s possible to say: hey, put all mail addressed to me on the inbox. Munging prevents that.

IETF is clear

I found this one from here.

In April of 2001, the IETF issued af new document, RFC 2822, which obsoletes RFC 822. In this new RFC, the author addresses the Reply-To header field in a few places, but the most relevant to this discussion is the following in section 3.6.2 “Originator fields”:

When the “Reply-To:” field is present, it indicates the mailbox(es) to which the author of the message suggests that replies be sent.

Your list software is not “the author of the message”, so it must not set or in any way meddle with the Reply-To header field. That field exists for the author and the author alone. If your list munges it, you are violating the standard.

Invalid arguments

I think I’ve mentioned all the important arguments, but some people keep bringing these, which are obviously invalid.

Double mails

Some people argue that if Reply-To munging prevents the same mail to be delivered twice to the sender (one directly, and one through the mailing list). This is of course nonsense because the mailing list allows you to decide whether you want the software to send you the copy, or not (since the software can see you are on the list of recipients).

Not to mention that you can add the Reply-To header if that’s the behavior you want; there’s no need to punish the rest of us.

Useful?

There’s a popular rebuttal to the famous ‘Reply-To’ Munging Considered Harmful by Chip Rosenthal; Reply-To Munging Considered Useful.

RFC 822 and “Text Message Teleconferencing”

Obsoleted by RFC 2822.

The Principle of Minimal Bandwidth

There’s no “double mail” problem, so there’s no extra bandwith.

Reply-To Munging Adds Something

Very few people want to send mails only to the list, and they can do the same than the people that want to reduce the Cc list: manually edit the fields. Not to mention that some clients have the “reply to list” option.

There’s no double mail, there’s no snowball.

It Doesn’t Break Reasonable Mailers

Nonsense; the functionality being broken is not replying only to the author, but replying to the full To list (and Cc list).

Again nonsense; new options can be achieved for a minority of users. The decision of what the mailing list does should rely on the behavior of mailing list as a whole, for which only the only thing that matters is the majority of mailers right now.

Freedom of Choice

Wrong. The option to reply to all the recipients is taken away. The ability to determine to whom the mail is actually addressed is also gone.

And in fact this argument is shooting itself in the foot; if the mailing list doesn’t munge, then the user can choose whether to munge or not, but if the mailing list munges; the user has no option.

Some Mailers are Broken

Not true. All applications have “reply to sender” and “reply to all”.

Principle of Least Total Work

This assumes the principle of “Minimal Bandwidth” is true, which is not, and people would want to follow it, which they don’t. So 90% of the time (according to that argument) you want to reply to all the recipients (including the mailing list), and 10% of the time you want to reply only to the author. Both cases can be achieved with the usual options “reply to sender”, and “reply to all”.

So this argument is again shooting itself in the foot; the 10% of time where you want to reply only to the author is actually more work when munging.

People are Responsible for Their Own Mistakes

That counter-argument is correct, but I’m not arguing that Reply-To causes people to wrongly send personal e-mails to the list.

And in the End…

Funny, right after arguing that people are responsible of their own mistakes, an argument that the mailing list should prevent mistakes of continuing a thread off-the-record. It’s policy that should keep mails on the list.

It’s What People Want

This is a value judgement, not an argument. People change opinions, mailing lists changes members, and people often don’t know what the really want.

For more invalid arguments, check my summary on fedora-user mailing list.

Conclusion

So, from my perspective it’s pretty clear that Reply-To is something for mail authors to set, not mailing lists. It prevents essential features from working, and provides virtually no value.

The arguments are crystal clear, and putting old misconceptions aside, only stubborn morons wouldn’t be able to realize that Reply-To munging is actually bad. Right?

C programming hints and code-style (part 1)

Over the years I’ve had to deal with many different coding styles (can something without style be called style?). Here is a list of no-brainer tips that every C programmer should be aware of.

Hints

Update:

Have a copy of the C99 spec handy

Don’t scratch your head when you are not sure if a function is part of the standard, and what is the expected behavior, open the spec an check by yourself: here.

free() can receive NULL

There’s no need to do:

if (pointer)
free(pointer);

This works fine:
free(pointer);

Therefore if you write a struc_free function it makes sense to allow NULL as an argument.

There’s no need to cast a void *

tmp = (EXTEREMELY_UGLY_TYPE *) malloc(10);

malloc() returns a void * there’s no need to cast those:

tmp = malloc(10);

sizeof can receive a variable

size = sizeof(EXTEREMELY_UGLY_TYPE);

No need to burden yourself with that:

size = sizeof(tmp);

If tmp is a pointer you can do sizeof(*tmp) and so on.

Avoid big macros

Have you seen horrendous code like this?

#define ERROR(e, code, text) \
G_STMT_START { \
  if ((text)) \
    GST_WARNING_OBJECT ((e), "error: %s", (text)); \
  gst_element_message (GST_ELEMENT((e)), GST_MESSAGE_ERROR, \
    GST_STREAM_ERROR, (code)); \
} G_STMT_END

It’s much cleaner to use an inline function:

static inline void send_error(GstElement *e, int code, const char *text)
{
  if (text)
    GST_WARNING_OBJECT(e, "error: %s", text);
  gst_element_message(e, GST_MESSAGE_ERROR, GST_STREAM_ERROR, code);
}

Yes, you can put inline functions in header files.

C99 is your friend

C99 has nice types such as bool (true and false), uint32_t and similar int types. Also these beauties:

static struct device = {
 .base = 0x480bd400,
 .irq = 24,
 .pdata = {
  .name = "isp",
  .nr_tlb_entries = 8,
  .clk_name = "cam_ick",
 },
};

I don’t even want to imagine how horrible the code would look for C89.

Those are the ones I can think about, any suggestions? On the next part I’ll about code-style ;)

NFS in Fedora 7 (and iptables)

Before I forget how to do it:

Use “lsof -i” to find out the ports you need to open. Look for rpcbind and rpc.mount.

rpcbind 2110 rpc 8u IPv6 7514 TCP *:sunrpc (LISTEN)
rpc.mount 2479 root 7u IPv4 8622 TCP *:59287 (LISTEN)

Now add them to iptables:

iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport sunrpc -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 59287 -j ACCEPT

I guess you can edit “/etc/sysconfig/nfs” and set MOUNTD_PORT to some value so you don’t have to check it.

That’s all I had to do, but for more information check here.