Programmers think differently than non-programmers
jacquesmattheij.com
jacquesmattheij.com
1. You push your cart through the supermarket
a. In a pre-defined manner
b. Randomly
2. When watching football on TV, you focus on
a. the quarterback
b. the defensive linemen
3. You drive to work
a. the same route every day
b. with a different route every once in a while
4. Which card game do you prefer?
a. bridge
b. poker
5. To plan for tomorrow's weather
a. You check the TV or internet.
b. You go outside, looking for signals.
6. Who do you prefer?
a. Andrew Carnegie
b. Marie Curie
7. You prefer
a. your keyboard
b. your mouse
8. Which subject do you prefer?
a. history
b. literature
9. Which would you rather do?
a. take a walk in the woods
b. a crossword puzzle
10. Which is more important to you?
a. time
b. space
Answer: If you tried to figure out (game) the test as you took it, you have a programmer's aptitude. If not, you don't, and probably don't even understand this answer.Maybe I should get the "golden patsy" award for knowing how to game the system but not doing it.
Answer to the Answer: I wouldn't say I tried to "game" the test while taking it, but twenty years of coding in one form or another says you called me wrong. Then again, maybe I didn't bother trying to game it because I figured it was BS from the start?
1) 80% of all programmers are Java people hacking away in auto-completing IDEs, constrained by rigid corporate guidelines. I doubt that their thinking has a fundamentally unique dimension when compared to other lower-tier knowledge workers.
2) Plenty of professions (engineers, lawyers, academics in various fields, law enforcement agents, and so on) require analytic skills, symbolic thought etc.
Sure, programmers at the top of their game have abilities that separate them from regular people. But that's a trivial truth that applies to 99% of all fields of human endeavor.
Contrast this with a lawyer writing a contract - you can't write unit tests, there is no source code debugger and most contracts never get "executed" in the fullest sense of being interpreted in court so you don't really know what they mean in practical terms. This would drive me crazy.
In programming, the first test is the computer. If my program doesn't compile or pass unit tests, I can't even get it to the client or customer.
It's certainly not limited to programming either of course. I would likely consider a career electrician who moonlights as a coiler (of telsa coils) to be a hacker. If I had to put the meaning of it into words, I would say a hacker is anyone who has a passion for the art of something, as opposed to someone who merely participates.
Not sure if you realize it, but this ties in perfectly with apl's original point about self-aggrandizement. What better way of congratulating yourself for being a different, superior kind of person than using a term which (by your definition) puts you into an exclusive club without even requiring you to be smarter?
It's not about smarts or superiority, it's just a way of classifying motivation.
I also state that I believe they more often than not are more skilled (which I recognize and appropriately tag as my own opinion, not a fundamental part of the concept)
Whether or not this has anything to do with a truly "different" way of thinking, that's up for argument.
I'm not saying that software engineers aren't reshaping the world, but let's not use this as a springboard to downplay the (very important) contributions of other members of society.
Is that so?
Abraham Lincoln ring a bell? Didn't do too bad for a lawyer.
Law enforcement has a HUGE impact on society try to imagine the world without it for about an hour or so.
Really, the delusion that we have a huge impact on society is to the detriment of seeing how much other professions, both individually and collectively have on our society and that we are only able to function in our respective niche because others do their work.
Even garbage disposal is essential and has huge impact on society and it's one of the most menial jobs.
For example (and at the risk of revealing my poor music tastes :P), the phrase "volvo driving soccer mom" doesn't imply that all volvo drivers are soccer moms, nor that driving a volvo will make you a soccer mom.
I'd say there are people better-disposed to learning to be a programmer[1] but practice also plays a big part. The end-result is that for a given individual, actually occurring situation, it is a reasonable generalization to say that the programmer and non- do think differently about it at this moment in time.
[1] That is to say, a special type of problem-solver. The individual skills or dispositions aren't unique to programmers but the combination thereof probably is.
HN survey: http://news.ycombinator.com/item?id=943722 And there have been better, more "scientific" studies about this that does find that there is a correlation between career and personality. I agree that the story telling is a bit us vs. them, but it doesn't mean there isn't a difference.
Correlation is not causation either though (not that you said it is).
1. Jung (whose typology the MBTI was based upon) was very clear that his methods went into the areas that research couldn't go (often referred to as "depth" psychology). Thus, research based on the MBTI and other tests based on Jung's typology is a bit difficult to agree with. Bear in mind that I'm saying this as someone who finds Jungian typology very useful.
2. The point of Jungian typology can be summed up with the old cliche "You're a beautiful and unique snowflake, just like everyone else." Thus, although you do more than likely see certain types attracted to programming, those types are far from being exclusively programmers as there are many fields that attract them (including other engineering and scientific fields). Conversely, these types aren't the only programmers out there. I've met plenty of good programmers who were of types that weren't traditionally associated with programming.
[1] http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
[2] http://www.codinghorror.com/blog/2006/07/separating-programming-sheep-from-non-programming-goats.html
[edit: formatting]I pretty much guarantee you that I can do it, I have not found someone that I could not teach how to write code.
Desire is the key here, ability is very much overrated, but hey, it makes 'us' feel special right?
What about lawyers, do they get to feel special? Engineers? Mathematicians? Bookkeepers?
Really, it's just a matter of degree, and just like everybody (except for the rare case of tone deafness) can learn to sing to their ability everybody can program to their ability limited by how much time they put in and how motivated they are.
Nobody here was 'born a programmer' we became programmers by applying ourselves to a series of problems of increasing complexity, if you compare you 'the programmer' with 'you the 4 year old' then for sure there are differences there but they are very much about learning and not about innate ability.
Don't you think you're setting the bar a bit low?
However, the point still stands: unfortunately this is an industry where being able to adequately perform the tasks is not a job requirement, therefore holding down a job is not a good measure of skill.
The most interesting little group of people are three friends that I know, one started out doing electronics, I taught him how to code, he taught one of his friends and they together taught a third guy (who was a pizza courier at the time!) and together they now run a very profitable software company.
And they're all pretty good at what they do, and they would never hire someone that was not able to hold their own.
I've worked at a bank long ago, and definitely the number of people working there that were 'adequate' but not 'great' was larger than elsewhere but there were a couple of guys there that would definitely give you a run for your money.
Typically they'd gravitate to 'systems programming' and the others would be 'application programmers'.
In an symphony orchestra I guess there would have to be a first violinist and 'others', and in carpentry there are cabinet makers and 'general' carpenters. Not everybody will end up being equally good at their job.
In the middle management tiers, and in the "non-mission critical, support divisions" the company goal and money making are easy to lose sight of. There is a lot of politicking for personal gain, and the employees have a tendency to not care about the company and maximize ways they can personally benefit. This is the land of the programmer who can't code. He exists as a warrior in the landscape of barely competent people with nominal jobs, carving out little empires for themselves and doing things that actively hurt the overall bottom line.
I think maybe jacquesm, you have been a good, motivated programmer surrounded by other good, motivated programmers for long enough that you have forgotten the world isn't entrepreneurial, that most people do the bare minimum at "work, cuz thats why it's called work". This isn't a criticism so much as a reminder of the rest of reality :)
This person changed majors to another engineering discipline and is doing great in that field. It still requires the same engineering-esque reasoning skills.
By no means am I the perfect teacher nor does one anecdote make a data set. However, because of that experience, I am very much inclined to believe that there are very smart people that just do not have the inclinations needed to become a programmer.
Were they interested in the work? Was their ambition to get in to programming (was that the major they wanted to go for)? And if so what was their motivation to do so? I've found that fascination with technology helps a great deal here, if you are not typically intrigued by how stuff works and like to puzzle then programming will probably not be the kind of challenge that you take to.
I remember when I first learned (or tried to learn) to program. For weeks I was just looking at the book without any progress whatsoever, finally it clicked and when it did it was like 'oh, that's how it works'... After that it came easy (most of the time, at least). But if I had quite in those first few weeks I would have literally gotten nothing out of it but a bunch of frustration. So I would presume that it is possible for people to get stuck in that particular phase for a long time.
Maybe it's the programmer equivalent of being 'tone deaf'?
No amount of effort would have made me run the 100 meters within 11 seconds. Sure, there is a level I could have reached, and one could call that running, but I couldn't have made a living from it.
Qualitatively, I think programming is similar. Quantitatively, it is different; many more people can get a job as a 'programmer'. Nevertheless, I still think there are people who couldn't work hard enough to compensate their lack of talent to get one of those jobs.
And of course, the number of programmer jobs in the world depends on one's definition of programmer. At one extreme, HTML and Excel are programming languages. At the other end, there are maybe a couple of thousands of programmer jobs in the world.
Excavator jockeys hold egg peeling contests, and of course you need to be really good at that to be able to even begin to control a 30 ton excavator to peel an egg without squashing it.
The only reason you can earn money with running is because:
(a) everybody can do it (so we can all appreciate a good runner)
(b) we can judge your expertise by the clock (in 1/100th of a second, as if that matters)
But in the end that's very likely a large amount of innate ability and an even larger amount of training. Setting aside your life to be able to run a world record is in itself not worth anything to anybody - if you fail. But if you succeed we will place an inordinate amount of value on that because of media exposure and national prestige.
Running by itself has little to no value, even very fast running (unless you're trying to get away from that cheetah).
Programming is a useful thing, at almost every level of skill and the more you do it the better you become.
There are many people in this world that don't use analysis and logic in the same way that programmers do. That doesn't mean they can't learn, but the fact remains that many non-programmers currently do not think the same way.
I do think most people are capable of programming, but I think it is misleading to say that "programmer thinking" is something everyone already does.
You can "teach" anyone to play the piano. But only a small % of them will be able to play it well.
Difference is, anyone can tell if someone is a great pianist, but being a great programmer is much harder to measure.
People who can't learn programming will quickly decide it's not worth putting their time in--this criteria will select out those people you are looking for...
I mean isn't it basically a fluke that we all ended up as programmers? I don't I'd think be half as interested in computers as I am if my dad didn't bring us home a computer when I was 3 or 4, or if my grandmother didn't randomly get me a book about "How to make your own website" for my tenth birthday. She didn't get me this because I'd shown a particular interest in computers, it was just one book among a bunch of books "for boys", most of the rest of which were about football. So the relationship between the society in which I grew up and the gender it assigned me at birth also contributed to my becoming a programmer, and definitely in more ways than just being the reason I got that book. I also happened to be lucky enough to participate in a programme for "talented" kids, and one of the courses they offered was in programming (they taught me Java when I was 13), and I was able to use the skills I learnt from that to pick up Javascript and PHP (for my website). Then one of my older cousins introduced me to Linux, and that kind of paved the way for me becomming a "real" programmer, when I started writing little programs to make my life easier in Linux.
And it was basically luck that all of those things happened, and happened at the right times in my life so that they all had the effect that they did. I might have ended up doing something completely different if, for example, my parents weren't able to afford to send me on that course at which I learnt how to program properly. I became a programmer because certain things happened at certain times in my life to make me interested in programming and to give me to means to pursue that interest. Luck was the reason that those things happened to me, not the way I think or because I somehow have a magical programmer brain that made me destined to program. That's obviously absurd. Those things could have happened to anybody. Everybody can be a programmer. We're not better than everybody else.
Since this behavior is not conducive to maintaining a relationship, we have developed a flag system to let me know when I need to take some time out to talk normal to her.
Oops. There it goes again (flag system). At least I didn't say boolean.
In my experience most people (even students in intro to programming classes) are really unwilling to drop some mental habits and build the other ones that are necessary for programming. Some other people are just profoundly bored by controlling every little thing that happens in a computer, and would just rather have someone else do it for them. Even these people, I've found out, can be turned on to programming if exposed to it in the appropriate setting and with a bit of help to get them unstuck from the hard parts.
With that, everybody should be willing to agree, as long as you do not give a definition for 'sufficiently smart' and 'programming'.
I know that may sound mean, but without attempting to define these, any counterargument to that claim can be rebutted with either "but he's not sufficiently smart" or "but x is also a form of programming"
Maybe we could focus on kinds of thinking that help you program well. There is nothing you can't learn eventually. However, we might find some common ground by looking at how good programmers have trained their minds.
We can list some desirable skills for a programmer that reach across languages and tools. There is an old saw by Joel on Software that some people just can't understand pointers and recursion. Or on the next level, that some people can't understand multithreaded/parallel programming. I think I'd say that an instinct for simplicity or mathematical beauty and symmetry also plays a role in making good designs. In other words, making not just consistent mental models that you can simulate in your head (as another comment says), but making beautiful ones.
I was sitting with my manager yesterday. He was giving me requirements for a system I'll have to build over the next two weeks. Along the way we came across a problem where we need to take a bunch of multidimensional values and combine them together.
Instead of leaving it to me, he wanted to design it on the spot. He thought of this like voting where each value makes some contribution, but then the requirements dictated that we needed to add things like "some values have more votes than others", and "some votes have veto power".
As he was describing this pseudo-consensus algorithm with weights and vetos, I was surprised he didn't know how ugly this design sounded. It is hard to set up the contribution of each value, hard to predict the behavior, and hard to make intuitive.
It's not that this is a bad, uncreative idea. Voting is an interesting analogy for the problem, and intuition is a good way to take a stab at a problem. It's that when he started working it out he didn't see the multiplying problems, or the counterexamples that would cause trouble for his system. And I do think this is something that good programmers and system designers do well, even without much conscious thinking. They find the attack surface, figure out where their abstraction leaks, jump immediately to edge cases.
I'm going to have to pull him back early next week. :oD
You don't have to say that the programmer has a magic switch in their brain that enabled them to be a genius while everyone else is left out. Anyone Can Cook!
edit: wwhere => where
To a computer user, their approach to solving a problem may be different than a programmer's (want to be able to do this, write program to do it) but the same traits that commonly exist in competent programmers also exist in other professions. Am I a programmer? I program, I write software that I earn money from, but it's not the main part of my profession, so perhaps I'm not qualified to talk about this.
Many lawyers see the world in a different way to the rest of us. Marketers often see the world differently. I can't really speak for them though as I'm definitely not a lawyer or marketer.
What I can tell you about are penetration testers. When you look at a building, you probably look at the shape, admire the architecture, maybe look around to see if it fits in with it's surroundings. A penetration tester (a seasoned one anyway) doesn't do that. They're looking at entrances, exits, security guards, windows. It's automatic. The other stuff comes too, but experienced pentesters who enjoy their job see the world in a completely different way to a lot of people. When you see a shiny new piece of tech, a pentester's already thinking about how to jailbreak it and what they want to do with it afterwards. There's a specific mindset for a good pentester. Not all penetration testers have it, but you can spot the ones that do a mile off.
I dare say that this mindset exists amongst programmers too, particularly those that have done a lot of debugging or TDD. I'm just more familiar with the penetration tester mindset given my experiences.
I agree with his point that almost anyone could learn to program, but what I don't agree with is that a programmer(expert) and a non-programmer thinks the same.
I think your brain re-wires itself to be more efficient for the task and recruits the right hemisphere of your brain to make intuitive jumps to solve problems. I don't have solid proof, but I think a similar transformation happens in a programmers(expert) brain as what happens in a grandmaster brain.
At the same time, I have worked as a programming tutor and there are some people who suck really hard at programming. They're probably just stupid though. For example, I tutored a kid who absolutely couldn't program for beans but did well in a physics class we took together. But I think it's likely that he did well through pattern recognition, aping example problems and so on. In programming, you really have to understand what's going on.
Every couple of weeks, I get into the zone while driving my car. For this the situation needs to be just right, i.e. the road can't be empty, but it can't be full of cars either. Basically the ideal situation is that there's just enough cars that you can't stay in the same line while maintaining your preferred speed, but there's enough switching lanes is viable.
On those days I might get 'in the zone' and have intensely heightened situational awareness. I 'feel' the cars around me and can easily navigate the road like I was flowing through a river (aside: 'flow' is a synonym for 'zone').
Situational awareness is also a key trait in becoming proficient in an FPS. In fact, almost anytime a video gamer goes on a kill streak it's because they were able to tap into heightened situational awareness (e.g. you 'feel' your enemies, know where they're going to come from, so you take them out before they take you out). The only difference is that since it's front of a computer screen it's easy to be misled that you are ignoring everything.
You are just ignoring everything irrelevant.
If he is saying programmers are born no different from other math/science/engineering types then I mostly agree. Of course if you compare those to the general population there are a lot of poet types who can't really learn math or symbolic systems so programmers are born somewhat different from the population as a whole.
But when considering programmer to be someone who is comfortable:
- operating on multiple planes of abstraction
- using recursion/pointers
- 'seeing' the concepts embodied under computer languages
- 'seeing' the code flow
Then, yes, the programmer does think differently. Because it's his job to think this way to communicate correctly to the computer. Not that it's unattainable by someone outside of the field, but by the act of becoming competent, it changes the one coming in.
Outside of math I think you'll have a hard time explaining what recursion is to someone that does not already know how to code at a basic level (a subroutine that calls itself! wow!), seeing the concepts 'under' computer languages may be something you could discuss with linguists and/or mathematicians again but not with others and 'seeing the code flow' you might be able to talk over with a laywer or someone in to electronics (who can 'see' the currents flow when looking at a schematic).