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

Sunday, October 21, 2007
  How to use a blunt instrument to sharpen your saw

In sales, there is a very high, observable, and measurable correlation between attending sales training seminars and sales volume. One explanation for this is that the kind of people who take time off of selling to sharpen their own saw are the kind of people to be top salespeople.

The other possibility is that there is something abut the seminars themselves that make salespeople better. I have asked salespeople about it, and generally I get a variation on the exact same answer: If I can learn just one thing that improves my sales skills, the seminar will pay for itself.

Think about that. They go to an all day seminar, where they will probably hear twenty, thirty, or forty tips. They will probably sit through tip after tip thinking “Yawn, I knew that, tell me something new.” Or they hear something and think: “That is the worst suggestion I’ve ever heard.” But then, suddenly, they hear something new, and they profit from it.

In sales, you are used to making call after call, facing rejection after rejection, but you keep dialing because… the next one could be a winner. So the kind of person who can keep on dialing after rejection ought to be the kind of person who can sit through a seminar waiting to pounce on one new thing that can improve their income.

Is this how we learn about programming? No!

What we do is this: we read a blog post, reading thing after thing we agree with, and if just one thing in there doesn’t fit our personal world view, we demand a correction. If the thesis of the post clashes with our prejudices, we accuse the author of being an idiot. Honestly, we would suck as salespeople. We would quit the first time someone disagreed with us.

It’s a win for me if I get selfish and try to ignore the stuff I already know and the stuff I dislike and hunt for the one thing that makes me better.

What I suggest we do is mimic these salespeople. When we read a post, or a book, or look at a new language, let’s assume that some or even most of it will not be new. Let’s assume that we’ll positively detest some of it. But let’s also look at it in terms of our own profit: we win if we can find just one thing in there that makes us better programmers.

That’s all we need from a blog post, you know. It’s a huge win if there’s one thing in a post. Heck, it’s a huge win if we read one hundred posts and learn one new valuable thing.

This is what I’ve learned from sales: It’s a win for me if I get selfish and try to ignore the stuff I already know and the stuff I dislike and hunt for the one thing that makes me better.

When someone says something outrageous, like: Fuck compilers and their false sense of security, it is not important whether I happen to think that programming languages with strong, expressive type systems are valuable (hint: I do). What is important is to look at this statement and ask yourself: Is there just one thing in there, one kernel of wisdom that I can extract and use to be a better programmer?

I think there is a lot of useful stuff to be extracted from that one outrageous statement. So much so that it is not important to me whether, on the whole, compilers are a bad idea. And likewise, it is not important to me whether debuggers are always a bad idea.

No more important than asking a salesperson if, on the whole, she thought the seminar presenter was any good. She’ll be too busy using the one thing she learned to give any thought to the question.

Raymond Smullyan does much more than write about Infinity, Combinatory Logic, Recursion Theory, and Gödel’s Incompleteness Theorems. And he does much more than teach these concepts delightfully by turning them into stories and puzzles to solve. He also teaches philosophy by way of insightful essays and anecdotes.

I’m going to paraphrase one of his down-home insights. This particular little story has helped me through many dark periods in my life. Raymond was talking about Taoism, and he explained that his two pet dogs embrace the Tao. I think he described them as “Sages.”

Raymond explained that like many dogs, they preferred rich chunks of meat and gravy to dried kibble. And like many people, Raymond had tried making the kibble more palatable by mixing in some meat with the dry dog food and pouring gravy over the whole thing.

The dogs, of course, would carefully pick the meat out and lick up all the gravy, leaving nothing but the dried kibble behind. But did they resent this? Did they howl and whine about the kibble ruining the meat? Of course not! They would wag their tails and frisk about, joyous in finding all that good meat and tasty gravy in their bowls. It was like the kibble existed in some alternate dimension that the dogs could not perceive.

Aaah… Dogs truly are Sages.
Programmers are Sages

(Part I of “What I’ve Learned from Sales,” Don’t Feed the Trolls, looked at why resistance to a new idea is expressed as a never-ending series of objections. Part II, Wanna Bet?, described how to handle one very common form of objection.)

Update: A couple of thoughts after sleeping on this post.

Comments on “How to use a blunt instrument to sharpen your saw:
One subtle point in this is that exposing yourself to views that my don't agree with forces helps you to sharpen your own beliefs, whether by formulating a precise argument for your position and against the other, or, more likely, by modifying your own belief in the face of objective dissonance to better reflect reality. I think this is one of the most important points in exposing yourself to new languages, and then reflecting on them in the "What language X taught me about Y" essays.
Unfortunately the people who would most benefit from reading this post, are probably too stubborn to pay attention to this post.
Woof! All meat and gravy! Yum. Thanks, Reg.htt
Good way to look at life, Reg.

However, I think there's a distinction between going: Hey, that's interesting. I'll keep that in mind. But, other than that tiniest of nuggets, the thesis of this guy's argument is a puddle of piss. I got some time, and I will now waste it by engaging in an Internet Argument(TM). Possibly this isn't a very good use of time. I imagine if half the seminar started rambling for a number of hours every time a useless tip comes up, no one would ever get anything done.

If someone decides to ridicule and torch a post that clearly deserves it (such as the 'debuggers considered harmful' malarkey) doesn't mean that the one doing the torching didn't keep an open mind. It's just unlikely.

The web is also somewhat different. You can walk out, so to speak, and go the seminar next door. There's always more to read than you have time. If someone seems to be wasting your time so far, you are probably better off reading something else even if a nugget might be just around the corner.
You should have used an e-mail.

Other than that, good point, although honestly, I forgot (until recently, obviously) that anybody except saw-sharpeners existed.
Also, If anyone has anything to say about this that involves any kind of actual thought, they're doing me a tremendous disservice by withholding it. I post on my blog partly for the feedback. But the feedback I have on this is basically useless. I got an army of people too angry to express themselves clearly - they almost sound like they have rabies, or Tourette's - and a tiny squad of passionate Smalltalkers, whose perspective is so insular I really can't do very much with it.

I'm either in the position of having totally fucked up, or having discovered a totally kickass advantage. The British defeated the Spanish in the 1600s because they could use Gallilean ballistics and the Spanish, as Catholics, could not, because Gallileo was banned by the Church. This changed world history. The Aristotlean ballistics of the Spanish required that the Spanish get close to the British ships. The British had better guns with better range, and the Spanish never got close enough to hit them. Heresy is a powerful thing. It can be a powerful advantage. But it's only an advantage when it's actually true.

And I honestly don't know. Maybe I've discovered a true heresy; maybe I've just made a mistake. Most people who have commented on this whole thing have been way too busy taking it personally and attacking me personally to give me any useful information with which I can even figure out whether it's a true heresy or not. It's a huge waste of time. I can understand why they don't value my time enough to hold back from something like that. What I don't understand is why they don't value their own time either. There must be some hidden benefit in acting like you have Tourette's syndrome that I haven't figured out yet.

But that mystery can wait until I figure out this one: is it a true heresy or not? I think it is. People I respect immensely have agreed with it, although most of them haven't done so online. People I don't respect at all have disagreed. So far so good. But then I get people I do respect, who disagree. THAT is where you find the valuable information - from people you respect, who disagree with you. If you have any kind of useful perspective on this which you can supply without insulting anyone, I would immensely appreciate it.
Giles, for the record, *my* comments wrt. to Reg's post are entirely about REG's post. For my part, I wasn't aware of, and hadn't even read your post, until I saw these comments of yours. I've read your post now, and commented on it there. I hope you find my thoughts of some use.
Whoops. Serves me right for playing with time and space, and speaking in the past tense about something I had not yet done. I *wanted* to comment on the post at your site, but you've closed comments. So I'll abuse Reg's site and do it here -- once. And then never again.

I think the problem with your "heresy" is the sweeping nature of it. There is no silver bullet, Giles. TDD is not one. Tests, in general, are not one. Debuggers are not one either. The corollary of that might be: all tools have their use. Over-reliance on any one tool is dangerous, whether that tool be tests or a debugger or any other frigging thing. Debuggers can be useful. Tests are often (but not always) useful. It's misuse that's the problem.

I find your use of the word "heresy" interesting (in the same way, and for the same reason, as the overly passionate responses to your post might be), given its religious connotations. Religions (as Reg subtly points out with his repeated references to the Tao) can be pragmatic or absolutist, but rarely, if ever, are both.

My argument to you could be summed up as: "You've taken an absolutist position here. And absolutist == bad." Seriously. Even GOTO has its uses, dude. Debuggers are just a tool. If you want to rant about people who use that tool badly, I'll be right behind ya (and in fact, I think you actually did that - there's some meat and gravy in your post). But you threw the baby out with the bathwater, methinks.
Thank you reg for another thought provoking post. This and the mirad of "debuggers" links inspired me to finish a post I had been working up on a similar topic.

That “Taoist” story you relate is not from the Tao Te Ching, and I’m pretty sure it isn’t of the Taoist canon at all. Although I’ve heard the story before, your blog postings seems to be the most highly ranked pages for phrases from the passage. Is this page your original source for the story? Zen is not the same as Taoism, you know.
The other day I read something about how to learn a new programming language. The one thing I took away was the exhortation to zero in on those parts of the new language that seem strange or just wrong, and figure out why they make sense. Seems like a corollary to your point here.

Oh, that was you, what a surprise!
Upon first reading Giles' post my reaction was similar to Reg's -- I don't agree with this, but it's from a smart guy so it's worth thinking about.

A day later I'm starting to think Giles is on to something. (I think it was the dangling pointer reference that got me thinking.) My first real encounter with a debugger was gdb, a ball of C I didn't understand and a SEGV down every code path. When I started using Java I was dismayed at the functionality of jdb, so started paying attention to unit testing. At some point I don't remember reaching for jdb because I had tests to fall back on instead. I also don't remember having the type of application flameout requiring hours of debugging.

Last night I was looking at a few of these tests and I realized they're not tests at all but expressions of intent, meaning they're written they way I imagine a component should work, plus sanity checks to test boundary conditions. (Or are they showing how not to use the module instead?)

This morning I looked at my Ruby tests and see the same pattern, only with fewer puts and prints in the code being tested. I use irb to try stuff out, and sometimes I have to paste a test case into it to see what happens. I'm starting to wonder if they should be called 'tests' at all.

Still, I can't help but think it would be great if Ruby had a good debugger, but then I think I might not use it after all. But it would still be nice to have, just in case. OTOH, I'll be really upset if someone takes irb away!

A final observation: I use the same approach with Javascript, and find I rarely use the debugger.
"If we could learn only from people who knew more than us, there would be no people who knew more than us." -- me

From the Daily Whale on 25 February 2001.

The other day I read something about how to learn a new programming language. The one thing I took away was the exhortation to zero in on those parts of the new language that seem strange or just wrong, and figure out why they make sense. Seems like a corollary to your point here.

Oh, that was you, what a surprise!

I refer you to the blog's motto:

Never was so much owed by so many words to so few ideas.

Yes, this is just the same damn idea in a different form :-)
To Giles Bowkett:

I'm going to lean on reg's forum for a moment, as you don't seem to allow any sort of lip on your own blog. You block a large batch of comments on your own blog for not playing nice, and then you call those same people a number of insults, from making useless arguments all the way to being struck with a grave affliction such as Tourette's or Rabies. Hypocrisy is an ugly thing.

Fortunately, this makes it much easier to answer your next question: It's you. You fucked up. You did not discover some sort of new modern facsimile to ballistics. You misunderstood something, managed to stumble and fumble your way onto an argument which makes no sense, but, similar to modern art, if you stare long enough, anything can lead to interesting trains of thought.

This process is certainly valuable. That's probably what Reg was getting at. The fact that thinking about how software works without a debugger can certainly be a convenient exercise does not mean that debuggers are useless, and it certainly does mean a programming environment is missing something big and important if there is no good debugger. It most definitely does not excuse you the due diligence of really learning how to use one.

This may sound harsh, but, having proper debug tooling has taken a bit of a dive of late, in between TDD obsession and a whole host of language reinventions which tend to fall just a spot short on tooling support. Debugging is also generally not something you actually need to fix any bugs; 'print' debugging is just as capable, it's just orders of magnitude slower. I'd loathe for any programmer to misunderstand and get turned off of debuggers just because the poor things are misunderstood.
A friendly word from your host:

I normally do not allow criticism of third parties on my weblog, regardless of their own moderation policies.

My policy is that I provide more than enough idiocy in my own writings for everyone, so therefore bashing my own words (and even me if you're so inclined) is acceptable but going after each other is off-topic.

However, I'm not invoking my right to delete any comments yet.

But I do want to politely but firmly remind everyone that there is the potential for me to change my mind and enforce my policy that criticizing me/my words is ok but criticizing other people/their words is off-topic.

I know this is capricious, especially because I am not providing some dependable guidelines as to why this is ok for now, but might not be ok in the future.

My only guidance is to remind everyone that even if someone does not choose to allow comments on the web pages they host with their own money for their own purposes, you are always free to put your words on your own web pages that you host and maintain.
Nice post!

This reminded me of something I heard or read about Hendrix long ago which I could not possibly attribute. Apparently he used to go see all sorts of people play and when someone questioned why he would watch a such bad guitar players he said that he could always learn at least something from any player.
@roderick - Ruby got a much improved debugger recently in ruby-debug, and it's a weird phenomenon how the news has travelled, or more to the point hasn't travelled, because a *lot* of people don't even know about it. the only person I ever met who used it at all was a former C programmer.

(he was sharp as a razor, no doubt about that - nearly sharp enough to split atoms just by looking at them - but I've met other former C programmers who don't use ruby-debug that much.)

@alex - I totally agree with that, even the implication that I could in fact be a total idiot and you could still learn something from me. personally I **prefer** when people think I'm an idiot but want to learn from me anyway than when people are taking me way too seriously and refusing to think about what I say.

@reiner - look, man, I'm sorry I upset you, but it's my blog, not yours. if you want to post something and guarantee it persists, creating a new blog takes about 30 seconds. you could make a whole blog called "Giles Bowkett Considered Harmful" and I wouldn't be able to do a thing about it. I acknowledged the hypocrisy several times, I don't dispute it, but I'm not having that kind of discussion on my blog, and I'm sorry, but it's just going to have to be that way.

(reg, sorry for having this kind of discussion on **your** blog.)

reiner, regarding your actual arguments, if you take away the ad hominem stuff, the only thing that remains (as far as I can see) is that I don't know much about debuggers. this is true, but without any more detail than that there's not much more I can really say.

I've definitely seen the breakpointing functionality of debuggers to be useful, but I personally suspect that even if/when I learn more, the distinction between debuggers and TDD might still seem to me essentially as it seems now. I could be wrong, however, but if you think so, it wouldn't hurt if you could make my process of discovery a little less like pulling teeth. personal abuse doesn't make learning easier.
Personal abuse? When did I ever stoop to personal abuse?

Ad Hominem is any argumentation which follows the basic train of: "Dude making the point is clearly a moron. Therefore anything he says must neccessarily be wrong". The fallacy of that reasoning is fairly obvious. It's also very specific. The other way around (Dude makes a point which is clearly malarkey. Therefore, dude is an idiot) is *NOT* An 'Ad Hominem' attack at all, unless used as a base to dispute further claims from said alleged 'idiot' solely on the basis of the suggested idiocy.

I will personally and publically apologize to anyone whom I have done the disservice of using in an Ad Hominem fallacy.

However, in your case, I'm fairly sure I got it the other way around. No, not even that. I never personally insulted you even with proof of faulty reasoning on your part. I recently called you a hypocrite, but with due proof, and not on your blog. Of course, due to your trigger happy delete finger there's no longer a public record as to what I replied on your blog, but I'm 99% sure that the only actual 'abuse' in there is that I likened YOUR ARGUMENT to the excretions of a male cow. While most certainly rude, and in that way, a mistake of mine to write, rudeness does not an Ad Hominem make.

I find that, when solliciting free advice, you really can't be too picky about the form that it takes. There's a corrollary to Reg's point to made here, I think.

I don't know your sensitivity, Giles Bowkett. I do know Reg's and I know he gets miffed at, but doesn't get blinded by, stabby comments. I also know a number of people who actually don't pay much attention unless an argument is dressed up in some hyperbole. You need only look at the traffic spent on seemingly needlessly hyperbolic posts such as the one where some ruby fanatic torched java to the core in a top 10 list.

My comments were meant for you, personally. I for one relish the thought of someone forcefully telling me in no uncertain terms that I'm totally wrong, as long as they back it up.

You also thoroughly mischaracterized my deleted comment. It was quite long and highlighted a number of use cases where TDD is vastly inferior to a good debugger. It seems you do get a bit blinded by forceful putdowns of your arguments; I will take more care to leave the abuse until after the argumentation for it. That is the proper way and I apologize for mixing that up.

Just so everyone else is up to speed, the only thing that happend is that I started a retort to Giles' rant on debuggers with "Bullshit". I then proceeded to back that up. That is all.

I imagine Reg's readers tire of us. Perhaps we can continue exploring the particulars of debuggers and/or the laws of fallacious reasoning by email? Mine is my first name @ my last name.com.
@reiner - there's no way on earth, dude. you're too rude to talk to in public, so I'm going to send you personal e-mail? what are you thinking? who would do that?
I found your surprisingly good post, and really really like it.
First thought it's about sale process, which is also interesting to me, but it turns into completely different dimension, which is also good.
Keep up the good post. I like to read more about what salespeople's thinking or techniques. BTW, I'm a software dev.
I spend too much time in my job trying to get peers to engage in civil discourse and to listen to each other. If more of them understood your post, I might make better use of my time.

<< Home
Reg Braithwaite

Recent Writing
Homoiconic Technical Writing / raganwald.posterous.com

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

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

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?

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

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

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

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

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

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 /