views:

749

answers:

14

Sorry for the "hippie" question, but I've noticed recently in working with my more experienced colleagues that they will work on 3 simultaneous projects and be able to pickup where they left off and explain minute details to others, whereas I will work on 1-2 things and have trouble remembering basic details. In these cases we are talking about algorithms and how the architecture of enterprise software works.

I've been asking around about this and its frustrating seeing people just pickup things much, much faster and more deeply. I have tried different things, visualizing them, thinking in patterns, coding bits and pieces but I'm at my wits end. I know some people will respond "hard work, and experience" but I've also seen guys much more senior than me who are still struggling as much as I am but some guys younger than me who are kicking my ass.

Any thoughts, advice, input will be greatly appreciated.

+7  A: 

I don't know where you are in your career, but you had better figure this out. I'm over 25 years in the software industry and the reason I have advanced to the level that I have is because I can keep multiple balls in the air without dropping a single one. If you want to be a leader, learn to keep it all straight.

Sorry if this sounds harsh, but its true. Don't be afraid to keep notes. I have a Moleskine in my back pocket that I can pull out at any moment for the details if they are not easily remembered. Just writing them down helps me remember. No one cares if you have to refer to it.

dacracot
Great answer. I really hate it when a coworker asks the same question again and again because they "forgot" to write it down.
Gamecat
+1  A: 

During the course of your normal work, stop to consider the theoretical underpinnings of what you are doing. Don't just hacking the code until it works. By figuring out something on your own, I believe you get a much better understanding of it than you do by having someone else tell you.

recursive
A: 

I find that metaphor helps with this. Relate the concept to something you already know. When someone explains something to you, find a metaphor and repeat it back to the person to see if you are on the right track. Metaphor can also be dangerous if taken too far so you need to be careful.

I try to use metaphor when explaining things to non-technical folks. Again, you need to be careful that they understand the limitations of the metaphor, but I find that it helps.

tvanfosson
i found metaphors to be a barrier to understanding. at most, use it to drive a specific point, and immediately discard it. especially, DO NOT try to use any analogy for inference. in fact, when i'm explaining something and he/she proposes an analogy, i immediately point the differences.
Javier
+4  A: 

I really think this is an aptitude. Some people are better than others. Part of it is expierence. You have to train yourself to think in those concepts. There is no book on how to do it. It's like playing the piano. Everyone can learn to do it, but there will be people who truly excel at it.

Kevin
Practice make perfect, but at some point you reach your peak. The piano analogy is true.
dacracot
+2  A: 

I'm really no expert, but perhaps try some memory-improving exercises? Joel once stated that programming is all about juggling 1000 details in your short-term memory at once. If you have a better memory, you can keep more things in mind at once and "see a larger picture".

Vilx-
A: 

Part of it may be down to innate ability, but I believe I've noticed I've grown better at internalising abstract concepts by working at internalising abstract concepts. The more I learn how to do that, the easier it gets (and I have a richer body of already-internalised abstract concepts to root my understanding of any new one). It probably doesn't hurt that I started down that route in my teens.

Vatine
+1  A: 

Pretty pictures.

I've noticed a considerable jump in my ability to "see" since I took the time to start reading up and practising with design patterns, anti-patterns and UML. Working with many different languages and language types at the same time (hello web developers) really helps too because you're constantly exposed to these different flavours of doing the same things.

After all, your code is just the language you solve your problems in, recognising the problems in the first place is what's important.

annakata
A: 

Everyone is different.

Some people have absolutely no problems keeping track of a hundred different little details. Other people are more focused on keeping the big picture together.

I've seen people who have difficulty verbally explaining the page they are working on, but have no issues following the spec and building it appropriately. I've also seen people who can almost tell you the line number of a bit of code they worked on 3 months ago.

Just realize your own potential and what you bring to the table and don't worry about it.

Chris Lively
+2  A: 

If you don't do this naturally, I suggest you keep a notepad next to you and take copius notes. When you are pulled from one project to another, jot down where you were before moving on.

Meaningful data is easier for me to remember, so try to fit each detail into your picture of the whole. Deliberately consider why the detail is important and who else might need to know about it.

HLGEM
+4  A: 

In my case, I've found that deep familiarity with the core concepts is essential. In other words, I know the algorithms, patterns, APIs etcetera fairly deeply. I would recommend making sure you know your core subject inside and out.

Then, when it comes to working on a new app or three, the only thing I have to remember are the business rules specific to that app, and any little implementation wrinkles.

This kind of in-depth knowledge can only really be got by study - not just reading, but doing too. I'm sure you've got pet projects that you work on yourself... Use them as learning opportunities to build on your core knowledge.

In some ways it's like driving... When you first learn to drive, you're constantly thinking about the mechanical actions of steering, changing gears and operating the controls. When you get in a different car, you will find it tricky and strange at first if you're an inexperienced driver.

However when you've been driving for a few years, the process of operating the car becomes second nature, and you can switch cars with little or no effort.

Good luck :)

ADDENDUM:

This part may be specific to me and the way I learn, but I find it much easier to grok an abstract concept if I can see a practical application for it. As an example, I'm currently looking into functional programming. I've just bought myself the "Expert F#" book and am planning to read it over the Xmas break.

However, currently, I can't see anything "better" about functional programming that I can't solve adequately in C# (even if it is a little more verbose). This doesn't mean that there isn't anything "better" but I'm hoping that reading the book will give me some good practical applications of where F# would be more applicable than C#. I find C# more readable than F#, so that's one strike against it, but other than the obvious ease of parallelization with F# and functional programming, I'm currently slightly suspicious that it's just another flavour of the month 'fad' that will undoubtedly be useful in some small fields, but won't be the game changer that it's made out to be.

Still, that's just my initial impression, and is very likely to be incorrect. I'm hoping that a little study will prove otherwise.

Which brings me to my point: An open mind and a willingness to learn new and unfamiliar things (even when you can't see an immediate need) is an extremely helpful attribute.

Andrew Rollings
Upvoted for "An open mind and a willingness to learn new and unfamiliar things (even when you can't see an immediate need) is an extremely helpful attribute."
tgamblin
upvoted for "tell me about it when you're done reading"
Steven A. Lowe
+1  A: 

Thanks for all the replies, however the notion that a truly great developer/pianist/dancer is born and not made is becoming increasingly debunked.

http://www.sciam.com/article.cfm?id=the-expert-mind

maybe its just wishful thinking on my part but I truly believe hard work >> innate talent.

Now can someone tell me what it is the geniuses do?

eviljack
I just did :) (See my answer above) :D
Andrew Rollings
I read the article, and I think that your conclusion of "debunked" is a bit excessive--we simply don't know, but we are happy to hypothesize. Certainly http://c2.com/cgi/wiki?ProgrammingIsInTheMind, and I think that my abilities are greatly shaped by a lifetime of Legos (hence training).
Rob Williams
A: 

It's tough to answer a question like this without fully understanding your situation, your personality, your training/education, etc. But, I can say that being able to effectively juggle tasks should improve with practice. For some people, I think it does not for whatever reason.

To give yourself the best shot, I would say that you thoroughly need to understand the underpinnings of the software down to a very low level -- not in excruciating detail, but with some degree of understanding. Again, I don't know what kind of background you have, but I've seen patterns with many programmers -- young and old alike. In both cases, I see a common thread of a lack of education about core computer science concepts -- things like data structures, algorithms. Experience with C and assembler or any language that gets you closer to the metal of the computer. What's this got to do with algorithms and enterprise architecture? Well, what I think it does is give you foundations on which you learn abstract building blocks.

I still remember an aha moment in college. I was taking a Microcomputer Architecture class which was a class that more EE majors would probably take. We learned about computer electronics -- flip-flops, logic gates, the magic of the transistor, etc. I was lost all semester. Then towards the end, things wrapped up -- we learned about instruction sets and opcodes and how these flowed through a mini-computer's electronics, so to speak.

For some reason, things fell together -- assembly language down to the metal of the computer. I had this physical basis all of a sudden that underpinned all this abstractstuff I learned in ahem Pascal and Modula2 ... (younger programmers, refer to wikipedia) ... anyway, I think that all this has helped me through the years have a better ability to build abstract concepts on top of that. Maybe you don't need to go down to flip-flops and gates, but understanding basic data structures and patterns can start to go a long way.

I said above that I saw this lacking younger and older programmers alike. In younger cases, they've lacked education in these underpinnings. In older cases, they may have a good knowledge of these underpinnings, but have failed to continually educate themselves and newer techniques and practices.

To be sure, there is no silver bullet answer that can get you where you want to be. Educate yourself, practice, and continue asking questions.

Peter Meyer
+1  A: 

In response to your own answer and link to the article: http://www.sciam.com/article.cfm?id=the-expert-mind

I liked the article. It put into words some ideas that I already had before and strenghtened them with facts.

What I understand then is this: Experts are indeed made, not born. But there is such a thing as "talent" as well. However this is not a natural aptitude towards a subject. Instead, it's a natural liking of a subject. A matter or taste and preference. It's like with foods - for each of us there are things we find delicious, and things that we don't even want to think about. But for each of us they are different, sometimes even diametrically opposite.

What really makes an expert in field is that they are able to learn the subject more than others. They build larger "libraries of patterns" in their minds, and this makes them better.

Now, learning is a difficult process and you need to be sufficiently motivated to inflict this pain upon yourself. And the best motivation is when you like the subject. This is where "talent" comes in. Liking a subject can compensate for almost any pain learning it brings and there will still be a bit of it left over too make you even feel good. And people like feeling good. In fact, feeling good is the strongest motivator we have. It's hardwired into our DNA and it takes a lot of willpower to refuse something that makes you feel good (hence many addictions).

But liking goes only that far. For every thing that we like, there is also a limit of how much we like it. If we cross that treshold, then learning will no longer be pleasant, but instead will start to bring pain. And this is where we stop learning, so to avoid the pain. This is the "pinnacle of one's achievments". After that, it only goes downhill, because you don't gain any more knowledge (aka patterns), you only forget them.

It's also been noticed, that for older people it's more difficult to learn. Hence I believe comes the fact that most brightest stars are still pretty young. Now, why exactly this is, I'm not so sure. But I think it has something to do with getting less passionate. Less passion = less strong liking of something. Less strong liking = less capacity for learning.

I think this is all I can say with certainty. There are also other motivators, of course. Liking is not the only one - it's just one of the strongest. Perhaps this will give you something more to think about.

Vilx-
A: 

I think part of the answer is to know how you learn: Is it visual, oral, written language, or something else? This may be what some around you know and use to their advantage, I think. Some people can read the instructions and follow them and adjust them as needed easily while others may have to do a few examples to develop an understanding of a concept. One of the easiest examples of this to my mind is grade school Mathematics. How did you handle learning concepts like Trignometry, Algebra and Calculus? Could you read the textbook and then do well on the exercises right off the bat? Did you need to practice on a few and then it became easy? Did you need to have the information presented in a different format for your mind to digest and get?

To apply this to programming, just think of some basic yet still abstract data structures:

List: A collection of many items stored either in an array or linked list structure. Stack: List with the property of last in, first out property. Queue: List with the property of first in, first out or last in, last out property.

Just some thoughts on what may be happening around you. Note that this is merely a skill which can be developed with practice over time and is something that some elementary students get that can be leveraged over the years that one is in school. While the style you find the easiest may be with something you are born, developing the skill is practice and work.

JB King