As I've progressed as a programmer, I noticed more nuance and areas I could study in depth. In part, I've come to think of myself from, at one point, a "guru" to now much less, even mediocre or inadequate.
Is this normal, or is it a sign of a destructive excessive ambition?
I started to program when I was still a kid, I had about 10 or 11 years. I really enjoy my work and never get bored from it. It's amazing how somebody could be paid for what he really likes to do and would be doing it anyway even for free.
When I first started to program, I was feeling proud of what I was doing, each application I built was for me a success and after 2-3 year I had a feeling that I'm a coding guru. It was a nice feeling. ;-)
But the more I was in the field and the more types of software I started to develop, I was starting to have a feeling that I'm completely wrong in thinking I'm a guru. I felt that I'm not even a mediocre developer. Each new field I start to work on is giving me this feeling. Like when I once developed a device driver for a client, I saw how much I need to learn about device drivers. When I developed a video filter for an application, I saw how much do I still need to learn about DirectShow, Color Spaces, and all the theory behind that.
The worst thing was when I started to learn algorithms. It was several years ago. I knew then the basic structures and algorithms like the sorting, some types of trees, some hashtables, strings, etc. and when I really wanted to learn a group of structures I learned about 5-6 new types and saw that in fact even this small group has several hundred subtypes of structures. It's depressing how little time people have in their lives to learn all this stuff.
I'm now a software developer with about 10 years of experience and I still feel that I'm not a proficient developer when I think about things that others do in the industry.
The fact that you're continually learning says a lot in your favor. Very few people, if any, can be masters of multiple domains. I think you're doing all right.
In my experience, programmers (and many other professions) usually go through a few stages, roughly like this:
You suck and you know it. You're just starting out and constantly stumbling over every little thing.
You get past the first stage and start getting reasonably comfortable within the small world you've been working in. You start to think you're pretty good, but really you still pretty much suck. You just haven't been exposed to much outside your little world, so you don't realize all the important things you don't know. Many college graduates are like this, and some stay here through their whole career.
You get exposed to new things - languages, technologies, complex systems, other programmers who are way better than you, etc. and realize once again that you suck. Every new system you encounter reminds you once again how much you suck. You look back at all the old programs you wrote and realize how much they suck (including that program you just wrote last week).
Unfortunately I don't think you ever really get past step 3. But if you've been there for a while, you're probably pretty good, even if you don't believe it yourself.
Your error is in thinking that there is such thing as a "guru developer." You don't hear about someone being an "expert doctor," you hear about them being an "expert gastoenterologist" or some other ridiculously specific title. Why are you setting a double standard for yourself? There is no such thing as a guru developer. Software development is far too broad of a discipline.
Software developers, just like doctors, start out by building a foundation of knowledge (usually through post-secondary education) and then specialize as they progress through their career. Switching specializations is an expensive thing that takes time. I don't expect my gastoenterologist to be a good cardiovascular surgeon, but I would expect him to be able to pick it up faster than me.
It's not an uncommon feeling.
There's absolutely no possible way to be an expert in everything; you can't do deep operating systems work, deep networking, deep graphics, deep work in AI, and do it all well. It's much like we don't expect you to be a medical doctor, a world class lawyer, stunt helicopter pilot, mountain climber, and four star chef. You might be able to do one of those, even two, but no one expects that even from the best of the best.
Pick one area of development that you enjoy and that isn't going away any time soon. Focus on it, get good at it, and compare yourself against the people in that specialty, not against the entire field of developers.
As Donald Rumsfeld would say [1]:-
"... There are known knowns. These are things we know that we know. There are known unknowns. That is to say, there are things that we know we don't know. But there are also unknown unknowns. There are things we don't know we don't know..."
If you read the "Pragmatic Thinking and Learning: Refactor Your Wetware", Andy Hunt discussed about the Dreyfus Model where experts always think they know the least and there are more to learn, whereas novices tend to think they know everything yet they know nothing.
You are certainly heading the right direction, so to speak. :)
[1] http://www.brainyquote.com/quotes/quotes/d/donaldrums148142.htmlThe best coders are the ones who realize how terrible they are [1].
(of course, that doesn't mean realizing you're terrible makes you good, but it's a good sign)
[1] http://www.codinghorror.com/blog/2004/08/why-im-the-best-programmer-in-the-world.htmlI had the same feeling right at about 10 years into it too. I think it is just natural.
Here is the best therapy: The Daily WTF - Curious Perversions in Information Technology [1]
Read a few articles here and it will do wonders for your self-esteem.
[1] http://thedailywtf.com/Default.aspxThis is true for all professions. Look at medicine (I'm a doctor by training) - by now even the general family practitioners are subspecializing because there is much more knowledge than any one person can hold.
Read Unskilled and Unaware of it [1] and feel better about yourself. The fact that you are doubting is a good sign.
And, to quote from a different field:
"There are two kinds of geniuses: the 'ordinary' and the 'magicians'. An ordinary genius is a fellow whom you and I would be just as good as, if we were only many times better. There is no mystery as to how his mind works. Once we understand what they've done, we feel certain that we, too, could have done it. It is different with the magicians. Even after we understand what they have done it is completely dark. Richard Feynman is a magician of the highest calibre." - Mark Kac
Not everyone has to be a magician. But it's great to have them around and be inspired by them.
[1] http://gagne.homedns.org/~tgagne/contrib/unskilled.htmlIf you want a more concrete target to shoot for, check out The Programmer Competency Matrix [1] -- I've had this page bookmarked for a while now and come back to it every once in a while to see how I'm doing.
Naturally, as VirtuosiMedia and others have pointed out already, you cannot possibly be a master in all of these categories, but it should give you an idea of where you stand and what things you could brush up on or read more about.
[1] http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htmIs this normal what I'm experiencing.
Yes. Plato wrote about it at length :-)
You might also like to read about impostor syndrome [1]. Very common.
[1] http://en.wikipedia.org/wiki/Impostor_syndromeI think the major point here is that you are just beginning to understand how many different programming domains actually exist. Yes! business programming is totally different than device driver programming.
I'm not arguing that a guru programmer won't be able to quickly dive into different domains easily. I am arguing that having that skillset is uncommon. It is perfectly normal for a good programmer to need some time to become fluent in a new domain.
Don't be confused with the mass amount of theoretical knowledge that is out there. A programmer must know the basics: hash tables, trees, lists, etc. But do you really think a "guru" programmer knows, off the top of his head, what the difference is between a k-dimensional tree and a BSP tree? I assure you no one knows that stuff, except in the academia (and I safely assume you are not in that set).
Bottom line, there are many different domains, and don't assume you can be good in all of them. If you have a good grasp of the basics and aren't afraid of confronting a new domain, even if it will take some time to comprehend - you have nothing to worry about.
You are not alone in feeling this way! The positive thing is that you say that you are learning. One thing I've realized is that in software engineering, you never stop learning. You have to keep learning or risk becoming obsolete or behind the curve. This is fine by me because I absolutely love what I do and I love learning new things. I would say that you are doing ok and that you're on the right path!
Sounds pretty normal to me. Your examples are quite diverse and that often means having to learn from the ground up a new technology/library/etc....
It's great to see you are really inward looking and judging yourself. This is a great sign that you want to be better and have the makings of someone who can be because you are willing to look at yourself and work to improve.
Mastery doesn't happen quickly. In fact, it can take a really long time. Check out this presentation [1] from Mary Poppendieck on the subject of mastery.
[1] http://www.infoq.com/presentations/poppendieck-deliberate-practice-in-software-developmentThis is so absolutely true. I've been programming since age 11, first in BASIC, then in Quick C, then VB, then some C++ in college. I thought I knew a lot until I began working with the web. It's a whole new ball game. It's kind of depressing in a sense. I personally tend to grossly undervalue my skills due to this paradigm.
It's also difficult as there's hundreds of ways of doing the same thing. There are areas of PHP I never touch and recently felt like a total idiot while taking a PHP test for an agency. I scored low even though I've been working in PHP for a decade. It's impossible to know everything, even about a single language!
I also tend to question the speed at which I complete projects. If I have so much experience, should I be working faster? But that's more of a quality control issue. Being meticulous is sometimes more desirable I think.
From the Tao te Ching #71
Not-knowing is true knowledge. Presuming to know is a disease. First realize that you are sick; then you can move toward health.
The Master is his own physician. He has healed himself of all knowing. Thus sh is truly whole.
and another interpretation
Who recognizes his limitations is healthy; Who ignores his limitations is sick. The sage recognizes this sickness as a limitation. And so becomes immune.
Nobody is perfect. Nobody can know it all. Everyday new tecnologies and developments are made. What you knew yesterday today maybe obsolete. It's hard to keep up. For what you say, you already know a lot of stuff. Cheer up. There's also life out there :-)
Now it is time to go into management....
I say that in seriousness. Fighting soldiers are young and charge the hills; distinguished military leaders are older and wise and probably could not charge as hard. But they take care of the strategy -- which hills to charge.
Young engineers and programmers are newly minted with the latest technics and knowledge; older engineers can manage that youthful, perhaps misdirected, enthusiasm into a strategic direction.
Older gurus may not tweak the bits the way they used to, but the older gurus can get the youthful gurus to do that and keep them all going in a good direction.
Not all feelings of inferiority are rational. For one extreme example, people with annorexia nervosa think that they're too fat even if they're dangerously thin.
Go to 5 stages of programmer incompetence [1], make a self test and don't forget to take the poll.
I would say you are either 4 or 5.
[1] http://coderoom.wordpress.com/2010/03/19/5-stages-of-programmer-incompetence/When I was near completion of my bachelor's degree, I went to see a teacher with whom I was on good terms with to talk about maybe doing some post-graduate studies. We had a long chat about it and somewhere in there, he dropped this line that made me think about what you described:
There's a saying; When you finish your bachelor's, you think you know everything; When you finish your master's, you realize you know nothing; When you finish your doctorate, you realize nobody knows anything, including whether or not you needed to finish a doctorate to realize that.
I think it is a good thing that you can stand up and rightfully say that you lack knowledge, I mean, everybody lacks knowledge of some sort. It probably is what makes people who are capable of continuously try to surpass themselves and always learn more such rich individuals.
I don't think lack of knowledge makes you a bad programmer, it's all about being smart and motivated to learn what you lack.
First and foremost, thank you for asking this question. Like you, I've been asking myself some of the same questions about my abilities and skill levels, and really wondering if I will ever again feel like what I am doing is good enough.
Software developers are an interesting bunch, and it requires a very unique mindset to be good at what we do. It requires a never-ending desire to improve oneself and the world around them. It involves a constant search for the best way to solve a problem, and even when you do finally solve it, you'll look at it and try to figure out ways to improve it.
Picture Sisyphus spending every day rolling a huge boulder up a steep hill that is just a little too high to scale before he has to stop and rest for the night. Unfortunately for him, while he sleeps, the rock rolls back down to the bottom of the hill and the next day, he must start again from the beginning. Our "boulder" is technology...always advancing, always changing, always improving upon itself.
The simple fact that you question your abilities speaks more to your skill level than you realize. Satisfaction leads to complacency in this industry, which leads to the death of innovation. I've been doing this for 26 years, and doubting myself for almost as long. You have worked on projects that, on the outside, would completely intimidate me. I'm also confident that I've worked on projects that you would pass on without hesitation. But, in both cases, I'm sure that it would only take about fifteen minutes worth of conversation to change our minds, because we love the challenge of solving problems...especially those problems that not everyone can solve.
Take comfort in your self-doubt...it means you still love what you do.
I was feeling proud of what I was doing, each application I built was for me a success and after 2-3 year I had a feeling that I'm a coding guru.
Yeah I know this sensation, losing the "guru" image of myself just because I saw another requirements, another people, because people didn't like my work and so on.
But I have to tell you one thing.
You should be proud - not because you write the best device driver on Earth, one that's so elegant it should be taught and kept in museum.
You should be proud because you've faced that you're not that good. And kept going forward.
It's so terrible that a whole lot of people - including myself - feel that they're not good enough. Each of us has a completely different background so we should do our best to compensate ourself for that bad feeling of our ego.
Being humble is one sign of greatness. If you're humble and you know that it could be done better and try to do your best, asking other people if needed - then you're a professional. I'm not talking about a professional people here, but a professional human.
I don't think it is normal, but I do believe it is a good feeling to have. Having humility on the scale you describe is something I can understand and say that I have been there. I'd likely consider it a good sign of maturity that you accept your limitations.
My reason for thinking it isn't normal is that there seem to be a lot of bad programmers out there that I'm not sure they would share the same assessment as what you gave unless they are repeating those first few years you had. I can remember writing code back when I was about 8 years old with my Commodore 64 and feeling the power, ah what a feeling it was back then.
Interesting question. I say it depends on what sort of environment you put yourself into. I mean if you're in an environment that doesn't allow you to grow or learn, then you'll feel worthless. I mean a good example of it would be when I was working at McD as a teen. I've been told repeatedly by my manager that she's going to go places and I got all the wrong attitudes in life and not a very good worker. I mean it felt horrible. Little did I know I graduated college, got a job, and now working. A few years ago, I spotted the same manager at Pizza Hut working under a manager. I suppose to her, going a long ways mean getting hired at Pizza Hut.
Anyway, the point is, that if the environment you're in isn't a good one, you shouldn't let it bring you down. Of course you won't be an expert at every single field you know, and you should never base how well you're doing off what someone else tells you because they probably don't do it as well.
So in all, don't mind what others say, and if you do well, then you're doing well.
The more you learn, the more you realize you don't know. Whenever you think you know everything about a subject, you're wrong. Even people with ph.d.s don't know everything about their specialty.
One of the worst developers I have known have all thought that they knew everything or at least "a lot" or "enough." Your question gives me the impression that you can't be that bad in practice, no matter how much or how little you might actually know. The attitude makes all the difference.
Not being a guru is not that bad... In most situations, it is more useful and you can do a better job if you know (or is willing to learn) more things decently than knowing one perfectly. Only a very few situations require the best knowledge of the world on the subject to do the job (even if the contractor thinks he needs the best man of the world, it is not true usually).
Anyways, as answered by a lot of people already, you can have a guru in some small specialization but I don't think it is possible to be a guru on everything in fields as wide as software. This is true also for medical, engineering, psychology or any of the big areas of knowledge.
No activity is as simple as it looks. I've worked a long time in industry and when you look at a guy feeding a CNC machine to produce a part, it looks very easy... try it... and you'll produce scrap parts without the experience he has. This to say that even if you are the guy who developped the process for the machine and you trained the guy on the process, you probably couldn't do his job with the same results. Everyone has his importance and there is no total guru and I think this is better this way!
You appear to have good experience in many areas of software already and every new challenge makes you earn a little more. I think this is a lot better than knowing perfectly how to code drivers or video filters only.
I think as programmers we should aim to see detail and overview simultaneously, not be blind to the trees because of the wood.
Thank you to everybody on this page, asker and answerers.
I felt pretty alone with this feeling over the last two weeks, but I'm going to turn things around now.
This isn't really an answer, but what you say reminds me of a Sanskrit verse:
(Read it out loud if you're at work :p )
Yadaa kinchignoham dwipa iva madaandaha samabhavam
Tadaa sarvagnyosmityabhadavaliptam mama manaha
Yadaa kinchit-kinchit budhajanasakaashaatavagatam
Tadaa jwara iva mado me vyapagataha
Rough translation:
When I knew a little, I was blinded in pride like a rogue elephant
At that time my mind thought I was omniscient
But little-by-little, when I started dealing with wise men
My intoxicating pride left me, making me feel better
BTW Karim, I'm not saying you were blinded in pride like a rogue elephant!