raganwald
(This is a snapshot of my old weblog. New posts and selected republished essays can be found at raganwald.com.)

Sunday, March 25, 2007
  Ad Hominem


When two or more people are arguing an objective point and one of the participants makes an Ad Hominem observation, the discussion has effectively ended. Participants may ignore the person making the observation or even retire from the discussion entirely without any requirement to refute the Ad Hominem observation. Retirement from the discussion shall not be interpreted as having no further thoughts to express on the original subject.

Ad Hominem observations are easy to spot. The most obvious is when a participant uses phrases like Lisp Weenie, Apple Fanboy, or Windows Apologist. Even when those phrases are not directly applied to a participant, their very use takes a discussion away from an objective comparison on merit.



The idea of trying to “win” an argument is ridiculous: such things are Pyhrric victories at best. However, How to Win an Argument: Surefire Strategies for Getting Your Point Across does teach you how to recognize and counter many of the fallacious and downright diversionary tactics we all encounter in online debates. With this book you can at least reach an honourable détante where all parties leave with a deeper understanding of each other’s point of view.

For example, some people have said that I am a “Ruby Fanboy.”1 Even if I was a rabid, one-sided enthusiast, does that mean that when my statements are right they should be discounted for passion? Or that I am somehow incapable of ever making a correct statement about programming languages?

If an idea is wrong, it is wrong, and the idea itself can be demolished through simple inspection and argument without speculating on the motives of the author.

Ad Hominem observations need not be about a participant. There is an eternal (and rather tedious) debate about whether programmers should be permitted to actually program, or whether they should be restrained and forced to cut and paste boilerplate code (see Design Patterns). You will hear an argument that a particular programming technique—perhaps meta-programming, perhaps reflection—is “too complicated for maintenance programmers.”

This is a thinly veiled Ad Hominem attack on some nameless, faceless programmers who are somehow qualified to maintain code but not to write it, and who are not present in the discussion to assert or deny their competence.2

What to do when confronted with an Ad Hominem observation

The very best thing to do is walk away. That takes real courage, but it is the very highest and purest response. The second best thing to do is to point out the fallacy, perhaps by linking to Wikipedia’s reference or to this post.3

The very worst mistake to make is the one I recently made: disputing the wrong statements people make about you. This brings no satisfaction to yourself, changes nothing in the mind of the ignorant, and the running flame war is a noisy distraction for those who are reading the discussion for its content.

Although it can be hard to walk away, it is the right thing to do. I will respect you for it.

Exception:

This is a personal weblog. Therefore, observations on this weblog about me are always on-topic. Ad Hominem observations about other persons, such as those leaving comments or those I choose to quote, are still off-topic and effectively end discussion.

Update: Why I allow Ad Hominem observations about me in comments, and why I encourage critics with substantially divergent views to write their own weblog and use a comment to lead readers to their writings.

I’m comfortable with people driving by and tossing a bag of feces on my lawn (crappy metaphor, that).

After all, I have the power of deletion and I can write an entire essay to defend myself. So I really can’t get too uppity if somone wants to say, “Reg, you are a drivelling windbag” in a comment.

When they drive by my weblog, I have my entire house on display. Someone observing the exchange sees me in my element.

If they read all of my words and look at the comment and then think, “that about nails it, Reg is the definitive font of idiocy,” then I have no one to blame but myself.

That’s the main reason I don’t consider Ad Hominems (or Genetic Fallacies or whatever we choose to call personal attacks with bags of sewage) off topic on the weblog.

It is also why I encourage some critics to write their own weblog. It is not because I don’t want the criticism: I encourage them to link to their writing. It is because others can judge their words in the context of their overall position and viewpoint. This is much more valuable to other readers, who can follow a link from my words to all of their words.

Now personal attacks in places other than a weblog are an entirely different matter. If I am on programming.reddit.com and I accuse someone of “Clinging to their WinAPI blanket,” this is like an exchange of slaps in a saloon.

Other persons do not have the benefit of judging my rudeness in context. Who is this person I am disparaging? Do they have a long and consistent record of exemplary thinking? Am I out to lunch?

Perhaps I am not only off topic, but also deeply wrong. How is a third party to know without laboriously googling each of us?

For this reason, although personal attacks are always rude, I think they really devalue a discussion in a “public” forum like Usenet, reddit, or on a third party’s weblog.

Update: Kathy Sierra’s Plight

As she puts it, Death threats against bloggers are NOT “protected speech”.

A few years ago, I would have guessed that personal attacks probably follow a normal distribution, and a very rare few would be vicious to the point of being criminal, just as a very few would be so mild as to pass unnoticed, with the vast majority being obnoxious but unremarkable.

However, with time comes experience. And I agree with Giles Bowkett’s perspective that this behaviour is stalking. Not just taunting, or bullying, but evidence of unsettling and dangerous behaviour.

There is one line that some commentary crosses when it creates an atmosphere for dread and becomes criminal. We can argue over the Port and Cigars where the line between law-abiding and law-breaking is and what is reasonable doubt.

But there is another line where it is evidence of being more than just a personal attack on the recipient but also part of a relationship the attacker is trying to create—by force—with the victim.

I’m not an expert in these matters. Feminists I know consider wolf-whistling at a pretty girl and shouting at her to ”shake that bootie!” to be over the line. I do feel that Kathy’s stalker(s) crossed that line.

Note the plural. The other thing that matters in these cases is herd behaviour. There are wolves that follow the leader. This is why it is a crime to incite others to commit crimes. never mind that garbage about ”if I told you to jump off a bridge, would you do it?”

In fact, a major component of psychopathic behaviour is manipulating others to do your own ends. “I had no idea they would do such a thing!” is a cliché excuse from people who tried very hard to get someone else to do such a thing. They deny it was them, they deny they intended anything dangerous, they act hurt that anyone could believe they were being mean...

We have all seen the bully in the school yard leading the intimidation, this is the same thing but we are adults and now we live with the fear of kidnapping, of rape, and of murder. And now the deterrence is more than a scolding, there may be legal consequences for these bullies.

Back to Ad Homeinem and other personal attacks. Every one we use is a drop in an Ocean of hurt feelings. Every insult on line is a tiny smidgen of incivility that gives permission to the next person.

I’m not trying to throw guilt around and say that calling one of my posts wankery is equivalent to a group of men stalking a woman on line. But I am asking everyone to consider the tone of the Internet as a whole and to try to move it towards the light and away from the dark.



  1. Would someone who has read my own criticisms of the Ruby Language and its implementation write such a thing?

  2. This does not mean that overly complex code is a good idea: “It is twice as difficult to debug a program as to write it. Therefore, if you put all of your creativity and effort into writing the program, you are not smart enough to debug it.”

  3. Here’s an interesting reply suggesting that sometimes the best thing to do is to point out the fallacy and continue the discussion. And this just in: a thoughtful essay on using debates to actually learn rather than to “win.”
 

Comments on “Ad Hominem:
It's been a while since I did informal logical, but I think "Ruby Fanboy" would be categorized as a genetic fallacy rather than ad hominem (which would be more like "Reginald doesn't know jack about dynamic languages").

Just to be clear, I intend to imply neither with respect to you or this post :-) I enjoy your blog.
 
A problem with rabid supporters of a language is often that finding the correct statements is hard because you have to wade through the overenthusiastic stuff.

That said, I don't remember ever thinking that about your blog.

Often it's the bad things that a 'fanboy' says, or the good things that a detractor says, that are the gems.

I work in a University, so every so often on my blog someone accuses me of being an academic, and that this somehow disqualifies me from discussion. Paul Graham says that when someone accuses you of being unqualified, you're probably onto a god thing.

Perhaps I'm unqualified to paraphrase him.
 
Speaking of logical fallacies, the following excerpt reeks a bit of a strawman argument:

"There is an eternal (and rather tedious) debate about whether programmers should be permitted to actually program, or whether they should be restrained and forced to cut and paste boilerplate code (see Design Patterns)."

I don't think I have ever met someone who argued that "programmers should be forbidden to program e forced to cut and paste boilerplate code". I cannot imagine a member of the patterns community making this argument...

PS: Yes, I'm aware that I totally missed the point of the article and focused on a minor side detail. The article was actually pretty good, as is most of the content published here.
 
Ruby is just amazing. And don't take my word for it. Actually, take my word for it. Because I haven't presented a single way in which it will make your life better. Or addressed any improvement you get, after you discount the learning curve, the natural tripping and falling, the problem recruiting qualified people, etc. Or discussed the long-term proposition of living with that technology, like maintaining dynamic code and meta-programming bitrot.

We're all full of opinions. And biases, and agendas. And when we argue abstractions, sometimes the only thing you can say is "shrug. your bias is not mine".

This is most true when you get Reddit visitors flocking to your post, void of context, not willing to listen, but interested in proving their abstractions are better than yours.

And no, I did not just do an ad hominem on Reddit readers (of which I'm one). I did one worse. I used it metaphorically to describe drive-by technical discussions (of which I'm just as guilty as anyone else).

It takes some time to learn what comments are not worth responding to.
 
drive-by technical discussions

This is a really interesting thread to follow, and i have posted an update above.
 
Hello Reginald.

Your update to this post made me feel like I should link to some arguments I presented in favor of the Design Patterns movement, in the context of the Dominus/Johnson controversy.

Now I feel even more off-topic, sorry. I don't have much to say on the topic of logical fallacies in technical discussions, only that I agree with what you said (of course), and I have, in the past, attempted to expose the problem when I encountered it.
 
The rules of logic help to lead a certain kind of discussion - to uncover objective truth. While in contrast, the discussions in the blogosphere often have the purpose of expressing and shaping opinions, and building a reputation. Throwing dirt, even though logically (and morally?) wrong, can be very effective at discrediting others and letting your own truth shine.

I am not an expert at rhetorics, but I've got a feeling that "dirt sticks" - just walking away from a discussion may appear as silent agreement, at least to those observers that have never heard the term "Ad Hominem" or don't believe in the rules of logic.
 
I've got a feeling that "dirt sticks"

Watching US politics, I understand how you feel: as far as we can tell from up here in Canada, it is all about getting Fox News to say the other fellow eats kittens.

Sadly, Canada is trying desperately to catch up.

However, I actually don't think dirt sticks in an online discussion on something like programming.reddit.com. Unlike an election, it is pure entertainment for most people.

So it's something like a tabloid accusing Paris Hilton of donating her money to worthy causes: there's a momentary fuss, but then the reader turns the page to find that Hillary and Obama were married secretly and that Jazz/Funk trumpeter Roy Hargrove is their love child who will be president in 2012.

I give the (now proportionally few) people who read programming.reddit.com for actual information a lot of credit for brains. With them, too much denial will probably provoke a suspicious "why did she even respond to that?"
 
Rafael:

Wow, you are really worked up about patterns!

Well, I am not going to say anything one way or the other about "The Patterns Community." They are not here to defend themselves, so it breaks my own rule, and in actuality I have learned so very, very much from people like James Coplien about kludging and hacking around the limitations of languages like C++ using patterns (note the dig--it was meant as humour).

Seriously speaking, the topic of how much design patterns encode wisdom of writing good programs in some language-independent manner and how much they encode wisdom of how to manage the accidental complexity imposed by language limitations has been well-debated elsewhere.

And the debate that I was alluding to, namely whether programmers can actually solve problems by writing good programs or whether they should write code to the alleged lowest common denominator programmer has also been discussed elsewhere, especially here on this weblog.

The best bet is to move the discussion to these other places, as you have done with your link.

Thanks!
 
Having been a maintenance programmer attached to a user support team, I object to the claim that "too complicated for maintenance programmers" is always an insult.

Professional maintenance programmers, as opposed to junior programmers who happen to be maintaining something, have a much more difficult job than programmers working on greenfield applications. They not only have to understand the problem domain as well as the original programmer, they also have to understand what the original programmer was thinking.

What makes it even harder is that maintenance programmers often don't own any code. In my own experience, I had to deal with code that spaned three teams of 4 to 8 developers each.

This is why I think discussion about a programming technique should seriously consider the impact on maintenance programmers. Not because they are somehow underqualified, but because they have to deal with what everyone else leaves behind no matter how bad it may be.
 
Jonathan:

I maintain and extend a seven year old code base for a living, so believe me when I say I think we are in on the same side.

And I agree that it is not necessarily an insult or meant in a patronizing way.

To eliminate any misunderstanding, would put it like this:

There is a difference between saying that some code is too complicated for programmers to maintain and saying that some code is too complicated for maintenance programmers.

The second expression could be interpreted as being synonymous with the first, but the first expression leaves no doubt that you are disparaging the code and not the programmer.
 




<< Home
Reg Braithwaite


Recent Writing
Homoiconic Technical Writing / raganwald.posterous.com

Books
What I‘ve Learned From Failure / Kestrels, Quirky Birds, and Hopeless Egocentricity

Share
rewrite_rails / andand / unfold.rb / string_to_proc.rb / dsl_and_let.rb / comprehension.rb / lazy_lists.rb

Beauty
IS-STRICTLY-EQUIVALENT-TO-A / Spaghetti-Western Coding / Golf is a good program spoiled / Programming conventions as signals / Not all functions should be object methods

The Not So Big Software Design / Writing programs for people to read / Why Why Functional Programming Matters Matters / But Y would I want to do a thing like this?

Work
The single most important thing you must do to improve your programming career / The Naïve Approach to Hiring People / No Disrespect / Take control of your interview / Three tips for getting a job through a recruiter / My favourite interview question

Management
Exception Handling in Software Development / What if powerful languages and idioms only work for small teams? / Bricks / Which theory fits the evidence? / Still failing, still learning / What I’ve learned from failure

Notation
The unary ampersand in Ruby / (1..100).inject(&:+) / The challenge of teaching yourself a programming language / The significance of the meta-circular interpreter / Block-Structured Javascript / Haskell, Ruby and Infinity / Closures and Higher-Order Functions

Opinion
Why Apple is more expensive than Amazon / Why we are the biggest obstacles to our own growth / Is software the documentation of business process mistakes? / We have lost control of the apparatus / What I’ve Learned From Sales I, II, III

Whimsey
The Narcissism of Small Code Differences / Billy Martin’s Technique for Managing his Manager / Three stories about The Tao / Programming Language Stories / Why You Need a Degree to Work For BigCo

History
06/04 / 07/04 / 08/04 / 09/04 / 10/04 / 11/04 / 12/04 / 01/05 / 02/05 / 03/05 / 04/05 / 06/05 / 07/05 / 08/05 / 09/05 / 10/05 / 11/05 / 01/06 / 02/06 / 03/06 / 04/06 / 05/06 / 06/06 / 07/06 / 08/06 / 09/06 / 10/06 / 11/06 / 12/06 / 01/07 / 02/07 / 03/07 / 04/07 / 05/07 / 06/07 / 07/07 / 08/07 / 09/07 / 10/07 / 11/07 / 12/07 / 01/08 / 02/08 / 03/08 / 04/08 / 05/08 / 06/08 / 07/08 /