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

Friday, April 25, 2008
  Why we are the biggest obstacles to our own growth


When you’re old and everyone around you is doing or buying something you don’t understand, you think they’re assholes; when you’re young, you do it/buy one, too.
—John Gruber, talking about Apple’s strength

This statement is intriguing. I recall Michael Lewis making a similar point in his book The New New Thing: A Silicon Valley Story. Michael pointed out that change was being driven by the young because they didn’t have any sense of self to hang on to.

This is crucial. If you think of yourself as a—for example—Lisp Programmer, learning Factor and trying it on a project is not just an intellectual exercise, it’s a shedding of a little of who you think you are. If you have built software—successfully—using large teams with meticulous planning, working with a small team in a less structured setting is again more than an experiment, it’s walking away from part of what you are.

When you are young, you don’t have that sense of self to protect. You’re driven by a need to find out who you are, to turn the pages of your biography and see how the story turns out. If people around you are doing something you don’t understand, you assume the problem is your inexperience and you go to work trying to understand it.

But when you are old, when you know who you are, everything is different. When people around you are doing something you don’t understand, you have no trouble at all explaining why they are assholes mistaken. Let me give you an real-life example.

[] is Ruby for “Swiss Army Knife”

One of the examples I give for using andand is with regular expression matching. I had a bunch of code that looked like this:

begin
md = 'The song "777-9311" is by The Time'.match(/"(\d{3}-?\d{4})"/)
md[1] if md
end

And being the type of person who dislikes the proliferation of mutable variables, I rewrote my code to look like this:

'The song "777-9311" is by The Time'.match(/"(\d{3}-?\d{4})"/).andand[1]

This week, I received a very tactful email from Cornelius Mika pointing out that Ruby has this use case covered:

'The song "777-9311" is by The Time'[/"(\d{3}-?\d{4})"/,1]

My first reaction was rather unprintable. I have read the documentation for the String class many times, but for some reason this never stuck. My brain refused to parse the fact that [] means all of the following:

'The song "777-9311" is by The Time'[7]
=> 103
'The song "777-9311" is by The Time'[4..7]
=> "song"
'The song "777-9311" is by The Time'[4,4]
=> "song"
'The song "777-9311" is by The Time'['The Time']
=> "The Time"
'The song "777-9311" is by The Time'['The Tyme']
=> nil
'The song "777-9311" is by The Time'[/"(\d{3}-?\d{4})"/]
=> "\"777-9311\""
'The song "777-9311" is by The Time'[/"(\d{7})"/]
=> nil
'The song "777-9311" is by The Time'[/"(\d{3}-?\d{4})"/,1]
=> "777-9311"
'The song "777-9311" is by The Time'[/"(\d{7})"/,1]
=> nil

Quite obviously, my brain is hanging onto a bunch of stuff about regularity, and discoverability, and languages consisting of a small number of features that interact in powerful ways. I don’t understand why [] means index sometimes but search some others. Why does 'string'[5] return a character, 'string'[2,3] return a substring (but not the same substring as 'string'[2..3]) and 'string'[regexp,1] look kinda sorta like but 'string'[regexp][1] but with maybe Monad semantics thrown in? I am confused, and that is before thinking about the fact that [] also means “call” for lambdas!

As you can see I was mightily resisting the idea that sometimes, a useful tool consists of a collection of things you need, put within easy reach. I know that I need the semantics that both my andand example and 'string'[regexp,1] provide, and I simply need to embrace the Ruby way of doing it for a while.

Recognizing that we need to let go of ourselves in order to learn and grow is difficult. Part of my job is to bring my experience to the table, to guide and grow the team using the things I have learned. But I also have to accept that there are things I still must learn. And because I am a fully formed person, to make room for a new idea I must be willing to let go of an old one, I must be willing to chuck a piece of myself overboard.

How do I know when to hold fast and when to try something new? I don’t. Sometimes when a bunch of people are doing something, and my gut tells me they’re mistaken, I override my gut and try it, I go along with what everybody else is doing.

If you want a new idea, you have to silence your inner critic. Your sense of right and wrong, of smart and stupid works by comparing new ideas to what you already know. Your sense of what would be a good fit for you works by comparing new things to who you already are. To learn and grow, you must let go of you, you must be young again, you must accept that you don’t understand and seek to understand rather than explaining why it doesn’t make any sense.



post scriptum: An interesting distinction.
 

Comments on “Why we are the biggest obstacles to our own growth:
Reg:

You want to let go of old ideas? Why not start with the idea that you have to let go of old ideas! I cite this as proof that letting go of old ideas is an old idea for you.

--Your friend, Reg
 
I had a similar moment yesterday, when I found out that in Ruby you can use the modulo operator for formatted string interpolation:

"Hello %s" % 'Reg'

I went from hating the overloaded use of %, to thinking it wasn't so bad since it matches up aesthetically with the printf arguments inside the string.
 
And the python light comes on in 3...2...

(.74 kidding)
 
"To learn and grow, you must let go of you, you must be young again, you must accept that you don’t understand and seek to understand rather than explaining why it doesn’t make any sense."

Oh come on Reg, that's a weak-ass statement and I'm sure you know it.

There's a reason we grow out of being impressionable whippersnappers: Being young you are vulnerable to bad ideas. It makes you prone to become invested into something you don't yet understand, because you assume you'll get it eventually. This is a horrible way to go about doing anything useful.

The problem is that you don't develop critical judgement until you build up a sufficiently large data set to judge ideas against.

On the other hand, everyone, young and old, will rationalize stupid decisions. The only difference is that some are going to have to rationalize a stupid idea they actually followed through, and others have to rationalize not recognizing a good idea. Both have their pros and cons, but that's not important.

It's far more important to judge ideas critically from the get-go, and the more experience you have, the more data you have at your disposal to deal with that decision.

It's not about "letting go" and "keeping an open mind". That's just misguided good will. It gets you creationism in public schools and parents who don't want to vaccinate their kids.

Critical judgement on the other hand (supported by good data, the more the merrier) can help you recognize both bad ideas from others, as well as stubbornness within you.
 
The problem is that resistance often occurs before critical thinking ever takes place.

To gain the data required for critical thinking requires exploration. In turn, the mere action of exploring an idea is opening yourself to the possibility you may be wrong-- thus the resistance.
 
"It's far more important to judge ideas critically from the get-go."

To you. Not to me. Your experience tells you it is important to critically reject ideas before you have had enough experience with them to find out if they are truly useful.

My critical thought when I saw Ruby was that it was junk. I am in favour of vaccination, but strangely I am not in favour of requiring all milk sold in Ontario to be Pasteurized.
 
"Your experience tells you it is important to critically reject ideas before you have had enough experience with them to find out if they are truly useful."

I apologize if I wasn't clear about this, but I did not in any way mean to to suggest that "critical judgement" necessarily entails erring on the side of rejecting an idea rather then giving it a try first.

In fact, that's exactly the the kind of thing I was trying to argue against: It is bad to draw lines in the sand and say either (a) "one ought to be skeptical of new ideas" or (b) "one ought to be open to new ideas". It's not a matter of POV (a) vs POV (b) - that's just a bad way of framing the problem.

Instead, I would argue that "one ought" evaluate new ideas without using any such rule-of-thumb shortcuts at all. Consider the idea's background, consider the opposing viewpoints, consider the idea's sources and biases and consider possible costs vs. possible benefits forgone and then consider how your own situation would affect all these consideration.

That's what I mean by critical judgement.

Of course, all other things remaining equal, you can come up with better answers to the above questions (as well as come up with better questions), when you have more data to work with rather then less.
 
In my first job as a programmer, I was employed at a place with a team size of about two dozen programmers. At that job, my tendency to prefer written communication was of great value.

In mid to large size teams, written documentation and clear and detailed emails are very important since face-to-face communication is limited and many individuals can gain lasting benefit from permanently recorded information.

However, at my new job, I am one member of a team of four individuals. I have realized that not only do they use limited written communication, but that when I attempt to use written communication, it is usually ignored until I verbally remind my teammates to address it.

My initial reaction to being in this situation was frustration and irritation. I have come to grudgingly accept that yes, it is more efficient to use verbal communication in a small team situation. It has also been a good way to practice social skills :)

One aspect of written communication that I can't let go of, however, is that it folds very nicely into my work flow. Loading the "social interaction" program into my core memory tends to derail my thoughts and make me lose any state I might have built up about programming tasks I might have been working on.g
 
First, what's the difference between "critical judgment" and plain old "judgment"?

Second, one of the best ideas to come out of XP, in my opinion, is The Simplest Thing That Could Possibly Work. In other words, you don't have to judge the ultimate success of an idea. If it's possible, and it's simple, then it's worth giving it a try. If it works, then you've got a big win. If it doesn't, you've added concrete experience to your judging skills.

///ark
 
"When you’re old and everyone around you is doing or buying something you don’t understand, you think they’re assholes; when you’re young, you do it/buy one, too."

1) Overly simplistic (and highly stereotyped) on Gruber's part, and therefore unreliable.

2) You link Gruber as the lead in your story, he links you back. Uh... what point was he making about 'mindless following', again?
 
Mister Snitch:

If you are coming here expecting that each and every thing I write or quote goes into phenomenal depth, I advise you to lower your expectations drastically.

You say his quote is unreliable. What does that mean? That you agree? Disagree? I find your first paragraph doesn't add any information to the post.

It doesn't seem to disagree with the quote so much as question whether I should include it, kind of like correcting my spelling.

While I welcome that kind of thing in an email, I find that in an open forum it quickly leads conversation way off topic into meta-blogging territory: what's an appropriate topic, what kind of statement is appropriate, and so forth.

Next:

Your conclusion about mindless following does not follow from the evidence you provide in any way, shape, or form.

I quoted him, he read my post, and linked to me. There are many possibilities, two of which are:

1. It's a tit-for-tat exchange of links based on a conspiracy to drive traffic to each other's weblogs.

2. He noticed traffic coming to his blog, read the post, and liked it.

How does your comment distinguish possibility one from possibility two? You haven't done so, merely asserted something in a rather low, sneering tone.

On the whole, I do not find your comment provides value to my weblog. I rarely censor comments, but I am going to state right now that further comments of this sort will be removed without appeal.

Please remember that the audience for your comments is not me personally but the other readers. Before firing off a comment, ask yourself if you are adding value for them.

Meta-blogging and snarkiness are off-topic. They are welcome in an email, which is where comments directed at me personally belong.
 
Disclaimer: I don't know Ruby.

That said, I didn't think anything non-intuitive.

string.subset(pos) = string [pos]
string.subset(beginning, length) = string [beginning, length]
string.subset(range) = string [range]
string.subset(member) = string [member] (where member can be either a literal or a pattern)
string.subset(pattern, index) = string [pattern, index]

For me, it works. It works best if [] is a method instead of a syntatic construct, but, then, C's lack of string as a basic type has left us with a serious bias against decent syntatic support for string. See MUMPS for an alternate view.
 




<< 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 /