Structured thinking and logical reasoning are essential skills for a software developer/engineer. My question is are you born with these qualities or can they be learnt? How can you get better at logical reasoning? Learning from experience is slightly different as you are adding a pattern which can be applied if you see a similar problem again. However experience doesn't produce a novel solution to a problem which wasn't seen before. If these qualities are be worked on what are the best ways to do the same?
Thought this link and the articles it links to might be of some interest in this discussion:
Separating Programming Sheep from Non-Programming Goats
As with most psychological debates on nature vs. nurture, the general consensus is that both contribute in inextricable ways.
Taken from the Wikipedia page -
Psychologist Donald Hebb is said to have once answered a journalist's question of "which, nature or nurture, contributes more to personality?" by asking in response, "which contributes more to the area of a rectangle, its length or its width?"
That being said, in regard to becoming a better logical thinker when applied to programming, I have yet to see any evidence to suggest that learning more about programming has resulted in individuals becoming worse at logical thinking (although perhaps in some ways, worse at applying KISS principles!)
Take as a contrived example, a sudoku player.
With more practice at solving sudoku puzzles, they become better at thinking about how best to approach a particular sudoku problem and hence become *better** at solving them.
*(for a given definition of better- in this case perhaps faster or able to solve puzzles with increasingly few given numbers at the start of the puzzle)
Were they a natural sudoku puzzle solver? Maybe they were naturally better than the average person, maybe not. Their innate ability at sudoku does not prevent them from becoming better through practice but it may however, ultimately limit the level of mastery that they can attain.
I think the question begins with a false dilemma:
My question is are you born with these qualities or can they be learnt?
I've frequently encountered the idea that very young children seem able to learn certain skills (e.g. language skills is often cited) more easily than older children or adults.
My experience is that there are many more factors than "born with" and "learned". I suggest (at least) the following:
- Innate aptitudes.
- Early childhood reinforcement and learning.
- Habitual thought patterns.
- Content of previous educational exposure.
- Quality of previous educational exposure.
While teaching "Math appreciation" (the Math for non-Math majors course) in college, I often had students who self-described as "no good at Mathematics". In many cases, deliberately approaching the topic at hand from a different angle, or with a different set of examples, produced an "Aha!" moment for those students. I don't offer that as evidence of my own prowess as a teacher, but rather as a criticism of those students' prior instruction!
Many of these students, who didn't benefit from their first exposure/approach to a subject, either were written of as hopeless or were given nothing more than repetitions of the failed explanation, either of which is usually a signal that the "teacher" really doesn't have a good grasp of the subject. Such a student gets into the habit of thinking "I can't do this" and ends up fulfilling that prediction.
Learning from experience is slightly different as you are adding a pattern which can be applied if you see a similar problem again. However experience doesn't produce a novel solution to a problem which wasn't seen before.
I must disagree! That last statement is only true if "experience" is limited to the tactical details of "for a problem that looks exactly like this, do exactly this sequence of steps". But experience can also generalize to meta-rules such as:
- After three failed attempts, force yourself to back up and restate the problem in different terms.
- Start listing all the knowns and ask yourself what's missing from the list.
- Look around the room to find the most unlikely object in view, and ask yourself what that object has to do with this problem. ... etc.
Experience can teach you though habits, such as deliberately making random analogies, that can lead to novel solutions.
If these qualities are be worked on what are the best ways to do the same?
Books such as How to Solve It, A Whack on the Side of the Head, and Conceptual Blockbusting can help, but nothing beats practice.
- Find a mentor. Identify someone whose skills (and patience!) you value, and ask that person to sit with you and solve a problem "out loud", verbalizing how she or he approaches it.
- Better yet, find several mentors. You won't "wear out your welcome" as quickly, and the diversity in approaches will be helpful.
- Form a support group. Get together regularly with a small number of friends/collegues and tackle small problems. Talk with each other about where you get stuck, or about how you approached the problems differently. If person A succeeds and person B gets stuck, discuss what was different about their approaches. Make sure it's not about the persons or personalities, but about which paths worked and which didn't. See this source on "code kata" and Jeff's broader article for examples.
There are both physiological and psychological limits on logical thinking. So much of our brain is hardwired in our early childhood, even by the hormones in the mothers bloodstream while we are in the womb.
Given that there are some limits on our logical thinking as adults, logical thinking is like bodybuilding. we can't chose what was given to us from birth, but we can train what we have. You could have the genetic of Ronnie Coleman, but if you never go to the gym you will never be big and lean.
Take what you have and train it to the max.
- Program, write small programs that challenge your skills.
- work puzzles, research have pointed to the fact that puzzles make us better thinkers
- open yourself to new experiences, the brain, like the body, sometimes needs to be shocked to get it working at a higher level.
The works of Tony Buzan definitely deserve a mention here. He's a real champion of the idea that all parts of our brain (ie all different types of intelligences) can be exercised and enhanced to great degrees by any mentally healthy person. His material is certainly not specific to programming, but much of it is highly relevant (and the argument goes that exercising any part of your brain has a synergistic effect with all others anyway).
It does get a bit off-putting when he plugs his Mind Maps in every single book (they're worth learning about the first time, though), but if you can look past that he's collected a lot of fascinating insights over the years that will help you throw off any preconceptions (a lot of it along the lines of Joel Neely's comments in this thread).