Now I'm much older yet my old habits are still here and I've realized that I, frankly, am a bad programmer. Which is kind of sad since I'm still very curious about software development and read the literature, keep myself updates with new languages, development methods, tools and libraries. I find pretty much everything from algorithms to interface design to be interesting, so it's not like I don't care - quite the opposite. With "bad programmer" I mean that it's difficult for me to even analyze basic problems and implement them in code. I often find myself going back to basics and looking up trivial information.
Should I just quit being a software developer? I find being a talentless hack far worse than being unemployed, but it kills me to think that I will never become a great or even good programmer.
I've been coding professionally for about a year now.
Addendum: I've received a lot of incredibly uplifting feedback in this thread and I just wanted to say to you all how much I value it and that I will take your advice about perseverance, getting more formal education, and having fun while programming to heart. Again, thank you very much Stack Overflow.
Sounds like you need someone that can be a good mentor to guide you to the correct way of looking at problems. Figuring out the best way to look at issues is something you get from experience working with people who can already do it. It is not something that is easy to learn out of a book. If you can't find a mentor at the company you are working for then try getting a new job. You say you have been coding professionally for only a year, this is not very long it normally takes at least five years to get proficient. If your boss is not taking your junior status into account when dishing out work, that is another good reason to find another job, but I would hang onto the one you have until you have found a good replacement.
I'd suggest the mere fact that you're self aware enough to question your own ability makes you a better than average programmer. Time will flesh out the details; the basics are already there.
Ok, seriously. If you don't enjoy it, then you shouldn't do it (unless you're really really spooky good at it and you suck at everything else). But if you do enjoy it, then live by the eternal words "If you enjoy what you do, you never have to "work" a day in your life".
If you enjoy it, practice. You'll get better. Talk to other programmers. Read blogs. Immerse yourself in it. Find your Mr. Miagi. Wax on, Wax off.
As a corollary, I love playing guitar. But, I don't do it enough to gain any real proficiency in it. So every time I pick up the guitar, i have to relearn everything I learned last time. If I did it more often, then I wouldn't have to do that.
Also, don't worry about looking stuff up. There's WAY too much info for anyone to expect you to keep it in your head. In fact, I gave up trying a long time ago. Instead, my brain has become an indexing engine. I read something and remember where I read it (or something unique about it that lets me google it later). In my opinion, it's a waste of brain capacity to memorize stuff you seldom use.
P.S. I've been playing guitar for 20 years, and I still suck.
Aw, this question made me want to cry! How awful to realise you're never going to make it!
... But then I read the last sentence: a year!? That's nothing! You'll be fine!
The worst programmer is the one who thinks he's good but isn't. Knowing you need to improve puts you in a better position than many "experienced" programmer I've worked with.
Don't worry that you keep going back to the basics: you're learning a lot in a short space of time so it'll take a while to stick.
Give it another year, at least!
Only a year? Give yourself some time -- Peter Norvig suggests it takes about 10 years to get really good at programming . If you really feel that the nitty gritty of programming isn't your thing, but you're still intensely interested in the industry, I'd say you're a good candidate for a more administrative role, such as program or project manager, or maybe you might enjoy a QA/testing role. There's plenty of options that don't involve cutting lots of code while still working in the development industry. http://norvig.com/21-days.html
Programming and indeed computing as a whole can often feel demoralising. The sheer vastness of it all can have even the best programmers thinking, lord I'm never going to know enough to be brilliant.
The mere fact that you're thinking that you're bad will probably mean you have some programmers around you who think they're very good and like to tell everybody.
That is normal, in my experience programmers have very big egos, but underneath they are still nervous book worms continually adding to their knowledge.
One thing I would suggest is to narrow your field, really concentrate on one area, and as previously stated perhaps that should be the basic concepts, so when you're copying and pasting things make sense.
Remembering syntax and libraries doesn't make you a good programmer alone, understanding the concepts is just as.... if not more important.
It takes a lot of time to not have to look up basic stuff. You have to spend a lot time with a single library to become proficient enough to use more than strings without looking it up all the time.
If you're thinking like this already, maybe it isn't for you, but:
A year is no time at all.
There's a lot worse ways earn a living, and things'll pick up.
Being unemployed right now is a terrible idea.
Being unemployed very quickly becomes worse than any job.
I often find myself going back to basics and looking up trivial information.
This doesn't sound like a bad thing to me. I am always looking up stuff in APIs. Even stuff I use over and over again. I guess knowing the API docs are there is a crutch that means I don't have to remember it all.
Programming is a struggle. But the feeling of satisfaction you get when you crack a problem, or do something especially elegantly, is what should keep you coming back. Do you ever get that feeling? If so, I think you are just a normal programmer. If not, then maybe programming is not for you...but then who knows if it is not better for you than any given alternative?
Develoeprs come in many flavours.
Having had some experience leading developers I can tell you that each is different and has different strengths, weaknesses and motivations. Some of them are aware of them, some aren't. You at least are aware of your shortcomings (and everyone has shortcomings). That's a positive.
What you need to do is find an environment that fits your strengths and weaknesses. The one that springs to mind is that you probably need to be in a relatively large development team (say 20+ developers minimum) and the environment should be relatively well structured but not oppressive.
In this kind of environment you'll have (hopefully meaningful) performance reviews, you'll be told what you need to accomplish and how you need to do it. Hopefully you'll also get training and constant feedback on what you're doing. That's where you'll thrive I'd say.
Other posters are right in that you need a mentor. The best way to achieve that is to work with good people and attach yourself to one.
In smaller environments you'll find less structure and often little to no supervision. In such an environment you need to be more of a generalist, definitely self-motivated and you'll have to define your own role. Some people thrive in such environments (it's my preferred environment these days) but that doesn't sound like you, at least not yet anyway.
As for having only worked a year, that's not an issue. I don't mean this as an insult (to you or anyone reading this) but I'm of the opinion that developers are a lot like many other professions: useless for the first three years (if not longer). That's because you learn theory in college/university (hopefully), you learn some practical stuff there too, you learn some basic coding outside of that (most programmers learn programming long before they get to uni) but then you are thrust into the working world and you have to learn to be a professional programmer.
This isn't so much about the technical stuff (well it's that too) but it's really everything that goes around it: debugging problems, dealing with business people, dealing with other people period, getting requirements, designing solutions, making estimates and generally knowing the right way to get things done. Your first 3-4 years of working is really your apprenticeship.
To give you some idea, I came across an article in Slashdot a few weeks ago that showed (by one metric) that senior developers tend to be about ten times more productive than junior ones. I can believe it too. It's not just about turning ideas into code and fixing that code. It's about knowing the how, why and when to do something. That takes time to learn.
The fact that you actually care and are motivated to learn new stuff makes you a better developer than lot's of people I worked with. Looking up trivial things is something we all do, the amount of information on any programming subject is too big to remember. One year is a very short time to become a good developer. It took me 10 years and I'm still learning.
I'd say try to broaden your focus a bit. Its easy to get stuck learning technical stuff with all the new technologies being released. For me learning to be a programmer took off when I started learning more about architecture, methodologies, patterns, language design etc.
If you're still struggling in 5 years it might be time to reconsider.
That you have to look for information on how to do things does not make you a bad programmer. I think it is better to look up a function/class in the API docs than to roll your own buggy functions.
The important thing is to know where to look and what for, so you don't spend too much time and effort searching for solutions.
And about copy & pasting: It is always good to learn from code written by good programmers. So the next time you copy code, read through it, try to understand it and maybe compare it with your own solution or another one from a different programmer. IMHO reading (incl. understanding) good code will improve your skills far more than you might think.
You need to learn the theory behind programming. All you do now is apply it in practice with copy and paste. Learn to do programming without the Web.
I recommend you pick one language and work through these problems on your own: http://projecteuler.net/
If you want to be good, there is really only 2 things that you need to do.
You also need to have a passion, but it does come easier once you have achieved something that you can be proud of.
Don't give up. It's takes years to become good. And don't forget the 3 P's:
You don't grow muscles without lifting weights and eating right. Becoming a good programmer is the same, except you need to "eat right" by reading books and "lift weights" by writing lots of code.
I had the same question a year into my current job. I had never done well academically, and after reading a famous book on software, was convinced that the writer would never hire me...so I must be a crappy programmer. And I found out my former boss wanted to fire me. (He was let go instead). I was a go-to guy in my former job in the Marines, and had a strong entrepreneurial sense. But I started this programmer thing late in life.
I had failed the Sun Certified Programmer test. I went online and looked for others that had failed the test, and followed some recommendations. I studied for months. I bought a test simulator. I learned the language well. I passed the test. The other programmer’s started to come to me for advice.
Also…when I had a programming success, which was rare…I really liked it. So I started to analyze WHY I wasn’t doing well in some things. I didn’t know the language well. I didn’t know my TO weapon well (Marine speak here). I learned more about the machine and tools to use it. I recommend reading Neal Ford’s The Productive Programmer. This is really a bible of how to improve your basic skill set and really know your TO weapon. Not just your programming language but HOW you program. Your developer’s box and what you put on it, and how you use those tools.
We judge our lives on successes and failures. But it’s not a failure if you don’t give up…and succeed later. Then it’s a greater success. Much better than those who everything comes easy to. We don’t celebrate the guys who never make a mistake and walk on water throughout their lives as much as we celebrate the average guys who struggle and fail and try again, until they get it. Cause that’s who most of us are.
My plan is to get Java certs up to the architect level, and then switch over and learn the .net framework well. Maybe not get certified on it…but I probably will. Just for fun. And I get to learn something every day. How cool is that?!
Many on this site have said that a certification is worthless…and doesn’t mean anything. I have seen programmers come through here with architect certs, and they were completely worthless…not because of their cert though. They had a listening disorder…they didn’t listen, they stopped learning, and they didn’t work. Their certs weren’t worthless, it was their mindset that was.
I consider myself a below average programmer now, but I really like the job now. I was tinkering with a date problem this morning that would have had me really frustrated a year ago. Today I dissected it and was really having fun.
So my answer to your question is: make this your own story. Don’t give up…work hard, learn your TO weapon.
I have hired many programmers. I have very high expectations from programmers. I had two key filter tests to judge candidates:
1) Entry condition: a typical text book example about polymorphism If the candidate could solve the question with ease and looked at his eyes tell me the message of "why am I asking such a trivial thing", that means to me that he is worth for a deeper check. My experience shows that about 60-75% of candidates could be filtered out by this alone.
2) Testing on knowledge about Reflection. If the person gets excited by the possiblities that Reflection opens than I consider him as worthy candidate.
You sound very depressive which makes your judgement biased. This is how I rank developers, I believe it is more objective than your selfimposed standard of looking up trivial things regularly.
Go to school.
That's not intended as a smart-alec, dismissive answer, but as a serious suggestion from someone who's learnd both in the classroom and on the job. Learning-by-doing is important, especially in programming. However, speaking from personal experience, it's easy to end up with very spotty coverage of the field. The value of a good educational program is that it forces you to see aspects of the discipline you might not encounter on your own, and presents a more systematic view of the field.
In my experience, some people learn more effectively "bottom-up" or "inductively", by taking lots of specifics and gradually forming their own higher concepts. Others learn more effectively "top-down" or "deductively", starting with a set of basic principles from which the specific details can be worked out. Neither is right or wrong, they're just different styles of learning and thinking.
It sounds to me as if your learning style and your experience to-date don't fit together well. You might very well benefit from putting yourself in a situation where experienced teachers may be able to present the material differently than you've encountered it before on your own.
But keep your head up and your eyes open. Not all teachers are equally good, nor equally good at working flexibly with different student's aptitudes. The first year will proabably be the hardest, because of the unfavorable student/teacher ratios. But as you progress through the curriculum, that problem will solve itself. Talk to students a year or two ahead of yourself to find out which teachers to seek or avoid -- not because they're hard or easy graders, but because they understand their material and their students well (even if they work you hard!)
And good luck! The self-awareness reflected in your question is a great asset; don't lose it!
Brave of you to post this!
I've been working professionally with software development since forever (or a least since 1996). :-)
First trust me when I say that a year is nothing. With your open mind you will pick up things soon enough. Also, creating great software is not just about the code. Social and communication skills are equally important. The customer will be pleased with software that does what he needs, even if the code is not perfect. Since you are interested in many areas, it will make you a much better software creator than many of your peers. And since you say you enjoy coding, you should keep it up. From what I can tell from your post, you have a humble approach to life and all the right properties for making a great software developer!
Just cut yourself some slack!
Only you can answer this one.
Without knowing you better, it's impossible to tell where you fall on Jeff Atwood's "two humps" . Maybe you're just being too hard on yourself.
"keep myself updates with new languages, development methods, tools and libraries" - that's a lot of work. Are you cutting and pasting with each one?
A year of "professional" (paid?) programming isn't a very long time at all. Peter Norvig would tell you that it'll take ten years  to be proficient.
You shouldn't focus on "programming". Better to combine software development with deep knowledge of some domain - modeling in finance, biology, engineering, etc. Diversify your efforts and start learning a domain well.
What alternative do you have? If you're employed as a programmer in this economy, I'd say that you shouldn't give it up until you have something relatively solid to replace it. http://www.codinghorror.com/blog/archives/000635.html
It depends, everbody needs something different from their work/career.
If you don't enjoy programming, that would be a more valid reason (to me).
I've been a professional developer for forty-odd years, now (on and off, but mostly on); my peers seem to think I'm OK (good, even); but I still can pick up stuff I wrote three months ago and say "Did I write this cr
If you think you're enjoying yourself, keep at it!
As you mentioned you only have 1 year of professional experience, it was mentioned in the comments that 1 year isn't really enough to develop into a good programmer.
Joel and Jeff on a recent Stackoverflow podcast hold a theory that there are two types of programmers:
The better programmer is #1, as you have 1 year of professional experience (I am speaking from experience), it isn't enough time to get things figured out. I have over 7 years of experience professionally, but when I was at 1 year, I was searching forums, copying code, using these habits that you mentioned (even though I have been doing HTML, CSS, JS, PHP casually before that).
The difference was I learned how to:
The most helpful thing that I did for my professional development was to refrain from copy-paste and hand coding what I would have copy-pasted, maybe with a couple different changes. Also, read! Read blogs, listen to pod casts, give yourself a pet project in which to practice your new-found information.
It wasn't until about 4 years that I can really rattle off code without finding a lot of examples. I would still have to lookup syntax and APIs in order to do what I wanted, mainly because I have been working across a large set of programming languages and frameworks (C#, VB, VB.NET, Python, Perl (yuck!), PHP, Django, Ruby, Rails, etc). The wider you cast your net of 'known languages', the more you will find yourself looking up API references to implement XYZ feature in ABC language, but you will have in your mind an overall way of doing something, but you'll have to look up the syntax to get it done.
Hey it's me on the long tail of this conversation, but since I found it (and read it all) maybe others will too.
If you study the history and works of great artists you will find them all wracked by self-doubt and by the idea that they shouldn't even be painting/composing, etc. The difference between the ones who succeed and the ones who don't was the passion to keep trying, even when it wasn't fun, no one liked it, and it look like it was going nowhere. I am sure that this is pretty rare book recommendation on this board but I would recommend "The Creative Habit" by Twyla Tharp. (not 'instead of' the other programming books, but in addition too, and it can be a real uplifting read)
Van Gogh is often portrayed as a brilliant flash of madness, when in fact it took years of methodical study and failure till he reached his first significant work. He started out sucking and continue sucking for a long time, more than 10 years.
The most important skill you need is to be willing to hunker down and learn, and practice, and learn, and fail. It's hard, it sucks, and it doesn't pay off tomorrow or the next day (well sometimes it does). Start marking the things you look up often and set them aside for memorization, or if is an abstract concept, developing some practice exercises around it. Programming is not the only thing you need to be creative about; learning about programming takes learning your weaknesses and strength and discovering the types of learning that suit you best. (Do some research into learning theory) Personal Wiki's, MindMaps, Flashcards, whatever it takes to make it possible.
I think looking up simple things is not about level of skills whatsoever, it's about taking the time to memorize them. Because if you can't internalize these basics, you can never progress. World class violinists are the ones who practice, and they practice scales and the basics through every level of their career and practice at a high level of self-evaluation.
I really, really, feel where you are. But I believe that anybody with a rudimentary set of skills and drive can become a good programmer. It might be harder for you than some people, but it's also easier for you than some.
And lastly, as the "warm, fuzzy" post on this question (which is one I have posed to myself recently), I would add, what do you want out of life? Even great programmers die, but they enjoyed the journey and I am sure many of them did not expect to be the titans they were. Embrace your struggle to be good. Don't look for quick wins or peer recognition (unless you want the constructive feedback) There are no prizes awarded when you die for best programmer. What you need to do is find peace with the struggle and embrace it and enjoy it. It does get fun.
Being a struggling to be good programmer seems like a pretty good slot. Could be worse, you could love being a clown.
The most important thing about programming is to never give up. It's okay and sometimes the best idea to just go to bed or make a long coffee brake - But make sure to get back to solve the problem the next morning.
It's okay to look things up. Everyone here does it.
Try to learn a language that is fun to you (I recommend Ruby ;)) and start a project that is interesting and keeps you motivated. All you need is some more experience I think.
Listen Friend, I had the same intuition about myself some years ago, today i am not too old but i do provide sufficient help and support to my clients in the way and time line they expect.
I have learned a simple lesson from my experience Never Give Up, if you like you will learn and if you learn you can do it best. so basically identify your interest don't mess up your mind with lot of good things, everything is useful and of equal importance in the world of computer science. so my suggestion choose the very interest of programming you like. start with it, and after some days you will find yourself very comfortable with it.
learning and working are two interdependent processes so they must go hand-in-hand.
so cheer up, reply me back when you are done with your homework and build up with good skill set, possibly this must be soon.
In addition to the many points about one year not being long, going back to docs being a good thing in many ways and that the very fact that you are trying to better yourself, and see lots of room for improvement is a good thing, I'd say an area you can really make progress on is to work with other people.
Ideally get a job working with a good team who have a collaborative spirit - if they do pair programming all the better!
Whether or not that's possible, get involved in communities like this one. Oh you already are :-) - keep at it! Join the ACCU (or at least the accu-general mailing list, which is open to non-members). While they have a focus on C++ and other C based languages, that's just a historical bias and anyone is welcome. The emphasis is on "professionalism in programming". www.accu.org
I'll also echo what at least one other person here has said - the fact that you are motivated to learn and try to keep current puts you above average - way above, if the people I have interviewed are anything to go by!
A year doesn't sound that long to me.
Actually you understand quite a lot within just one year. At start, you need to convince yourself that being able to solve problems by programming. This builds up your confidence. Come back to this thread in two years, I am sure you will be cool.
A year is nothing in IT world. Over time, you will learn more. In professional life, you gain much more experience than you would coding on your own (in my opinion), so as long as you enjoy coding, keep going. One tip: keep some kind of sample code for each new problem/technology you encounter. Go though them once in awhile to see if you can update/improve them. that way, you can see your competence is actually growing and you have a nice reference.
My experience is: read code, copy-modify code, make code and loop ad infinitum
I'm not a programmer, I've no computer science studies, and I've been programming with python 7 years now (5 really, two of them were spent reading code and not coding), I can tell you I can't reach the feet of a regular python programmer, but I love it, I enjoy every second I spend looking for documentation, reading code, and trying to understand why someone did something (which in my case is a bit hard sometimes).
Even if I'm not too good at it, I raise my level bar from time to time, and try to learn new frameworks, libraries, etc. to get experience. By the way, as some people already said, don't expect to know everything, even the most basic stuff is susceptible to be forgotten, specially when you work with higher level tools/frameworks which provide you with wrappers.
Did I said I hate giving up? ;)
Since you have an interest in "everything from algorithms to interface design" - why give up? And why give up on becoming a good programmer - even if you don't think you'll be a great one? I am not a great programmer but I strive to be a good one, or at least a competent one. One thing that's helped me a lot is the correct-by-construction approach. I try to avoid just flinging code around in hopes I'll stumble across the correct solution. Instead I think carefully about solving the problem, write down the solution in pseudocode, check it over to be sure that it is correct, and then start to type. Project Euler is a great resource, I've learned a lot from solving those problems. Also the writings of Edsger Dijkstra, especially A Method of Programming, A Discipline of Programming, and Structured Programming. It's too soon to write yourself off as not good, even if you know you won't be great. A year of professional coding is hardly enough time to learn any skill that is worth having, it's just human nature to be impatient and want to be highly skilled in a short time. Rather than writing yourself off as a hack, work to improve yourself! And don't give up, you seem to have a genuine interest in programming and that's one sign of someone who might be good at it, or at least has the potential to be.
I would recommend if you dream about programming then try to not measure yourself against how good you if other folks are, incidentlly they likely are not that good really, and just focus on realising your dream. Reading books and staying up to date is necessary and good, but you need to make a point of implementing some of the new things you learn routinely otherwise you just overload on theory and then get intimidated by it all.
Starting out professionally in most careers is tough but if you stick with it as long as it is what you want to do then you will get there. I would suggest you take stock of the type of programming you are doing then look at the whole range of possibilities to see if you are in the right area of the business. For example apart from Web Development and corporate enterprise coding there are all sorts of programming opportunities in technology infrastructure from data center utilities, network programming, security etc etc. Not to mention embedded development for robotics, CNC machines. The diversity of programming challenges is enormous so take a fresh look at all possibilities and just confirm you are in the area of the business you think you will enjoy the most.
If you love it, then keep doing it. I reccomend that you take some classes on computer science, because you kind of sound like me, self-educated in the ways of programming.
If you love to do it, then keep trying, and get educated.
But, if not, then try something else. It's not like the programming community will hate you for it. Seriously.
As a general rule in life, you should never give up on something you are interested in or care about. The way I see it, if there is a long road ahead to get to where you want to be (becoming a "good" programmer), then that's a positive thing. It means you have so much more interesting things to learn and the best part about accomplishing your goals in life is the journey getting there, not just the end result. Strive to improve you abilities and knowledge everyday, never give up, and enjoy the ride! =)
If giving up or being a hack are the only choices you can see, perhaps you should give up. Personally, I see spending a bit of time and using your own assessment as constructive criticism a good step in the right direction. As I understand it, the first step, in a twelve step program, is to admit you have a problem. You have publicly admitted it, which means you may have gotten through many more steps.
You have the option of improving. You do it one step at a time.
By the way, a great number of programmers, professional and otherwise, are hacks. I try to fight this trend, one programmer at a time, and would love you to join me. If I can just ge a big enough army, we can stamp out this problem.
Oh, another thing, most manangement is clueless most are hacks, as long as the problem gets solve some time. So don't beat yourself up. Just make the effort to improve.
The fact that you have learned so many languages and other software literature says everything about your passion towards programming. BUT we all have to accept that we cannot always be good at what we love. I love mathematics, I mean REALLY love; but I suck big time when it comes to solving even the trivial of problems. But I enjoy it nevertheless.
If you can take some different career in which you are good and keep software development as a side work than well and good. Not everything you love has to be made into a career. You can take small projects for which your skill levels are appropriate and simultaneously keep practicing programming till you start to become competent. But be on guard; after a year or so if you still think that you are not good at it than better take a different career and keep software development as a hobby.
Find yourself a friend who can discuss new technologies and languages with you. That's will help you to find a confidence in yourself, and that's what you need most.
Don't be afraid of others being better than you even if they younger, that happens. You might never be the best one but you could become one of the bests through experience and practice.
Remember, everyone, even bests of us create crappy copy-paste code once in a while. In fact, most of the time. But we learn from our mistakes and we make a better code each time we try. Not better for much but still better. That's how things work.
You like to learn, that's the basic skill that already makes you better then most of developers out there automatically.
Decision is up to you of course but that's basically the best possible job out there. And you can always become manager later. That's escape path a lot of people take.
Looking at the stuff you've done in a year, you seem to be doing pretty well. Considering your love for programming I'd suggest you carry on.
And if you have problems with your basics, you still should have plenty of years ahead for learning things again. Learning is a continuous process. It never stops.
But, If you think you cannot or do not have time to or do not want to learn the basics, I'd suggest otherwise.
or 1 followed by 2 and 3.
Did you note the point about the continual learning? The rug will be pulled out from under you every 18 months - 3 years in terms of specific languages/technologies/libraries. If and when you get good, you will have to run very fast interms of learning (and a lot of it in your own time) to just stay 'as good'. If you do not like this concept, then development is NOT for you.
I read somewhere recently that it takes ten years to become highly proficient at anything that requires skill. Whether its playing tennis, playing the piano, or programming. Like you, I've just made the move from my hobby to my profession, and I'm learning an enormous amount every day. In 6 months, I'm much better than I was when I started, and I can see myself improving everyday. I get the feeling you may not have an idea if you're improving or not. I suggest you take a look at your code from 1 year ago. If you look at it, and you can see the mistakes you've made and how you would do it differently, then you are on the right path. If you look at it and think "that's how I would do it again" AND you have external verification that the code is not good (by more than 2 people), perhaps you really are having trouble. I would suggest finding an open source project that is interesting to you and trying to fix a bug, or add something to the project.
Quitting is an option, but not a solution to your problem.
And you share the same problem with many people whether or not they are willing to admit it. How do you rank yourself as a bad programmer? Do your projects meet the specs and function as expected? All programming is simplistic if you break down the parts into the smallest pieces possible. It might be tedious at times, especially if you have to go and look things up.
My answer, no you shouldn't quit.
I spent a two year course at school not 'getting' programming, then it all clicked into place over a couple of weeks. If your block is similar to mine I'd suggest forgetting all the clever high level languages and try to do some C programming (just don't distract yourself with pointers, it's what most people find hard but will be mostly useless when you get back to high level languages).
If it helps my revelation was that a computer does exactly what you tell it to and nothing more (at all). Low level languages may make the link more explicit to you.
After more than 6 years programming in Java I still have to look up on how to read a buffer. I don't think I am bad programmer, actually I think I am quite good. More important than actual copying and time you need to resolve something (time can be more than relative!), you should take a look at your code.
Does your code suck? Is it messy? Is it hard to understand? Does your code contains a lot of duplication? Do you understand basic OO principles and can you apply them? Have you for example used polymorphism successfully in your application and thus managed to reduce duplication?
Let's start by analysing how bad programmer you really are! By what you said, you did not really convince me that you are a bad programmer.
Very few people can or should write new code, professionally, within the first year or two.
If you find your skills continuing to grow, but your ability to write new code does not develop as you want, maintenance work might be the job for you.
Of course, it takes a better programmer to maintain than to create, but given what you've already figured out in a year, that might be you!
I've been coding 25 years now and I still get that doubt fairly regularly when I pick up some complex code that's got a tricky bug in it that says - "Am I capable of understanding and fixing this?"
Of course I always manage it in the end - it amazing how things can be understood once focused that seem intractable at a glance.
Same applies elsewhere too. The one that really used to bother me was when doing systems analysis where initially there's that sinking feeling that you haven't the faintest grasp of how things fit and you're going to make a complete fool of yourself by asking stupid questions. Generally compounded by some smart-alec manager who waffles away with confidence. What cracked that one again was realising that I would always manage to grasp the system and the smart-alec manager was nearly always spouting bullshit.
Just stick in there - self-doubt is good if controlled, it keeps you sharp.
Software development is not only about programming. It seems you have good attitude toward the subject and asking this question here shows your straight attitude. So, I'll recommend you get some more experience and start looking for satellite options ranging from technical writing, testing, marketing, program management, etc.
This reminds me of Brooks' Surgical Team:
it seems reasonable to have a "good" programmer develop critical system components while the rest of a team provides what is needed at the right time
Presumably during the years spent as a fledgling nerd you learned to code by coding projects that you were personally inspired or excited by. I didn't learn to code because I wanted to write a better accounting package.
Could it be that now you're 'professionaly' writing code you're mired in professional specifications and obligations that are so far from your personal interests you can't work up any enthusiasm for them, and that lack of enthusiasm for the code you're writing is tainting your perception of your ability to code? Hopefully when you started coding professionaly you didn't just ditch the coding you were doing for fun.
To jump on someone else's analogy, I've sucked at playing guitar for 15 years now but I enjoy sucking at it because I enjoy playing folk and never expect to get paid for it. If someone told me I could only play flamenco and only when I was being paid for it I'd stop tomorrow. If I did both I'd be happy, and probably learn a lot more (except obviously I'm a code weasel, not a rock star).
You sound like you should go to project management :)
Ok more seriously, you should really consider it. If what you're saying it's true, then you have a good overview on the development process. Maybe you're not so good coding but you're good on guiding others to code. "... so we need to do this... oh yeah yesterday i saw this lib seems very good give it a try"
Don't be discouraged--with your interest level and appetite for learning you'll quickly put this "struggling" phase behind you.
In my experience, programming skill has a highly non-linear curve. You'll plod along for a while not really understanding what you're doing (or seeing others do), and at some point you'll have an "aha!" moment and you'll make a giant stride in your comprehension. The more of these you have, the more you'll be able to learn and the more confidence you'll get. Once you really understand a concept (e.g. pointers), you'll no longer be distracted by the syntax used to express that concept and can start to see the bigger picture. Each concept learned becomes a new tool on your workbench.
Furthermore, although you have been doing "programming-related" things for a long time, I would submit that time spent (just) writing HTML & CSS code isn't really programming (flame shield ON!)--it's more layout than anything else. It's not something that will help you understand algorithms, idioms, hardware or software architecture, etc. The only reason I bring this up is to give you a new way to look at your experience level--knock off the time spent doing layout & reevaluate how long you've really been "programming" (i.e. problem solving). I think you'll find yourself much happier with your progress.
Finally, as for the "cut & paste" business, remember that you obviously know enough to know which code to cut & paste to achieve a particular effect. Now take it a step further and really take some time to understand how that "borrowed" code achieves the desired effect. If you're really studying it, you'll soon find that you won't need to borrow as much. Voila--progress!
What makes you think that you're a hack? Do your programs not compile? Do they not work?
There's no such thing as perfect code. If your code accomplishes its goals (as in meets the requirements), then there's no reason to leave the field. Your code will get more elegant as you continue to learn and gain more experience.
Why not become a bad project manager?
Stop admitting you don't know anything; you'll be a perfect candidate for upper-management, promotion, raise, etc.
Read a post by Jeff Atwood (man behind the StackOverflow.com) "Programming: Love It or Leave It" http://www.codinghorror.com/blog/archives/001202.html
And know thet on some point every softwre developer has doubts about his/hers skills or attitude.
Do it as long as you love it and work on your skills and attitude.
If you need a mentor I would suggest you start helping out on an open source project. There is a wealth of good developers that will review your submissions and give you feedback.
If you pick a mature project you will find the bar high and that will improve your coding.
In my opinion, one year is not a long enough time to become truly proficient in any profession. Your question indicates a level of self-awareness that is all too rare in our society and I applaud you for it.
Many have suggested that you need to find a mentor and while I agree that would be great, it may not be practical or possible depending on where you work. I suggest that you become your own mentor.
Start working on developing some good habits like using source control, documenting your work and maintaining your own code repository. Joel Spolsky has some excellent advice for developers and I recommend you review some of his articles. I would start with his infamous "Joel Test" which was intended to be a way to evaluate software development organizations, but I find many of his questions apply to developers themselves (http://www.joelonsoftware.com/articles/fog0000000043.html).
You mentioned that you find you have to "go back to basics" and have to look up "trivial information". I suggest that is a sign that you have not taken the time to completely absorb some of these key concepts. Give yourself a chance to learn. When you read, try not to read passively, but actually study the material. Take notes. Ask "why?" when you read about a new concept. And please take the time to document your code. That way when you return to your previous projects, you will be able to discern why you chose to write the code the way you did.
Finally, I would respectfully suggest that you need to identify a single language and take the time to become truly proficient in that language. From the list of languages you listed (very familiar by the way as I too am a language dabbler) I would suggest you focus on a single object oriented language such as C#, provided that lines up with your work responsibilities.
I wish you all the best and I hope you don't let a lack of experience discourage you from pursuing your career.
I use to have a simliar problem i would copy and paste code but until I took a computer science course I started to think about concepts of programming when the course was over I started to challenge myself look at other code and ask why and try to figure it out and ask how can I change it so I can understand it better or make it better.
I guess what I am trying to say is challenge yourself its ok to ask questions but with only one year under your belt just keep at it.
Like someone in Stack Over flow told me Practice, Practice, Practice.
No, if it's fun and if it brings money then I will kick you in the nuts if you quit -- many people don't have jobs at all. Also, majority of those who do hate their jobs.
Instead, try studying basic math like calculus and get your hands on a book on algorithms like Cormenetal . I began coding before I even knew how to solve a system of equations and my big discrete "jumps" in programming were: when I learned quadratic equations, when I learned basic calculus, when I learned how to write (without sucking a lot), and when I learned what red black trees were and perused a code for manipulating one.
These tasks might be harder than your everyday tasks but you have to expand your brain with math, computer science, and writing. It's like this. I remember when I was hardly able to run through 4 miles. Then, I overdistanced myself by forcing through 10 milers and voila, soon, I could run 4 miles day after day and I didn't feel any fatigue at all.
See, I think that programming is much like performance: what an athlete or actor does. You have to practice harder problems so you can solve easier problems faster, in a more elegant and readable way, and be entertained. When you have control over a problem you produce quality and enjoy your work.
That's why you need to practice your brain with solving harder problems.
Also, much like an athlete you must let your working muscle (brain) rest. Otherwise, your performance will drop.
But hey, what do I know, I'm just rebellious, dumb teenager who hasn't even finished high school yet. Maybe you must leave programming and start writing novels or begging for change at the light stops.
PS. I was joking in the first line. Everyone knows programming can't be fun :( http://en.wikipedia.org/wiki/Introduction_to_Algorithms
It's hard to get a read on where you really at right now. Are you/did you get negative feedback at work? Are you working? How did you learn all those technologies, but have only worked a year? What were you doing previously?
Cutting an pasting isn't necessarily a bad thing. In fact, the ability to identify a good solution and implement it can save a lot of time, rather than writing from scratch, as far to many developers often do. Going to the docs is normal. If you are curious about it, and want to be good at it, those are both good signs.
The big danger is if you really don't have an aptitude for it. Then you will be throwing good time after bad. One idea is to take some kind aptitude test for programming. It will probably ask a lot of logical questions, like select the next item in this series of diagrams. Not mathematical stuff, just logic. If you do ok on that, then I would stick with it.
Learn C, that will help a lot. You started out as a script kiddie and don't seem to have grasped the basics. Dig deep. That should give you a new perspective.
To not like an activity is no sign to stay out of it. The question is whether or not you like the results, the purpose for the work. Think of other professionals, some of whom are brilliant and well respected. Do dentists thrill at having their fingers in strangers' mouths all day? But everyone is pleased to have good looking, functioning teeth.
You've only been doing it for a year - you're not going to be very good. Wait until you've been doing it for 10 years, then you can start to make some judgments about your skill.
But, if you love it, stick with it. Would you prefer to be in a job that you didn't like but were good at?
The approach you take to learning is critical. Don't dilute your attention and efforts by trying to learn too much at once. Concentrate on one language/technology and write a program/app from scratch. Go slow at first and make sure you understand everything you do. Start with the basics and go from there. Then look at other other people's code. Concentrate on understanding.
Once you have a solid grasp of the foundations and features of a language you will be able to much more easily gain proficiency in other languages and also to ask the right questions which will lead you to understanding.
You're only a year in? That's nothing. If you're truly interested, then don't give up yet... it's just too early. But if you feel that you haven't improved since day one, then maybe it's better to cut your losses now and move on to something else.
I'm just like you! Though I wouldn't think about stopping now. Sincerely, I agree with thenduks. I think you ought try to have a girlfriend, something like ruby, python, emacs, or a lisp is for some people. Something that will suddenly ignite again your passion for software.
It takes roughly 2 years to become able to really sit down and write programs from scratch. 1 year for the gifted, 3 for the slow, 1.5, 2 for regular people, e.g., me.
I've seen a lot of people in college pass through the "???" to "hmm" to "ok" to "yeah, no sweat". It's not fast. Do you play an instrument? It takes about 4 years to become able to play well unless you're really gifted. Same concept with programming.
Self-consciousness costs 30 IQ points.
If you want to hit a bird on the wing, you must have all your will in focus, you must not be thinking about yourself, and equally, you must not be thinking about your neighbor: you must be living in your eye on that bird. Every achievement is a bird on the wing. - Oliver Wendell Holmes
Wow, one year is really short time of experience. I know a guy who does develop websites for like seven years (!!!). And he sucks hard at it. Yet somehow, he manages to finish all of his projects and earns quite some money from it. So if you really want to be a programmer, you can.
Yep during the first year you will be surrounded by people who make themselves feel better by putting you down in some way. Its not just in programming its most areas of IT. This maybe a source of your anxiety.
As for the programming aspect what really helps me is writing down my objective. Then writing down the steps i need to take to do my objective IN SIMPLE ENGLISH. Break down the problem and then look at ways you can do each step in your programming language. (There are structured ways of doing this like UML but this is just the way i learned).
EG Primary Objective: Display a list of contacts for a phonebook user.
To fulfil primary objective I need to: 1 Get a list of contacts from a database 2 Display on a page/UI
To fulfil objective 1 1.1 Recognise who the user is 1.2 pass the user details to the sql query engine 1.3 bring back the contact for the user.
To fulfill 1.1 1 Maybe the user can login. Maybe i can just recognise the user using Active X controls. (If you cant think of anything, google an answer. You can then start looking at the pros and cons of each and implement best solution).
To fulfil 1.2 Look at ways to communicate in your environment. Webservices, http, xml (If you cant think of anything, google an answer. You can then start looking at the pros and cons of each and implement best solution).
You get the jist. You can then figure out a way to work out each of the steps. In no time you will be doing these steps in your mind without much effort. You wont have to think of the answers to each step, you will know. At this point you can then start looking at your code and figure out ways to reuse it in the future. and ways to make code easy to maintain, ie i can change it in one place and not a million. Then as you get better, you can look at design patterns, OO principles and so much more! Look up UML use case, orm diagrams, write down good functional, user, business and quality requirements. all these things will help you.
Soon you will be a top programmer!
I have had the same things 6 years later when I started programming; the problem is that you want to create something useful NOW while you don't know how, so you try to burn steps. This happen, try to convince yourself to learn, the solution is a BOOK. Some books introduce programming on a cool and attractive way. Now I'm a good programmer and about to take Microsoft Certificates. Good Luck :)
One year of professional experience only?
Your journey has just begun and it will get better :)
I have been writing code professionally for over ten years, I have professional training, I have/and still learn from some fantastic people and I still think I am a hack. But I love every minute of it.
Don't get me wrong. Developing software is HARD. You will come across unrealistic deadlines, unrealistic people, temperamental development tools. etc. You will burn out and you will bounce back. As one of my professors in college put it "it is a ride".
But at the same time you have the opportunity to solve problems and make peoples lives a little bit easier through software.
As high school coach turned minor league player Jimmy Morris in the film The Rookie  said to a teammate "you know what we get to do today, we get to play BASEBALL!"
You know what you get to do today (and get paid for it) you get to write software! http://www.imdb.com/title/tt0265662/
One question, do you still code in your spare time? If not...you may be right. Your "job" should be what you enjoy doing. If you are still enjoying coding and (did I understand you right...you are getting PAID?) why would you stop? If you were doing any other job for a year, enjoying yourself and had the potential to keep improving you skills I think your decision would be easy. It is so easy to think of coding like a art, and although it certainly takes a certain mind set, very few people are just born to it. Most good coders becore that way shrough simple time in front of a keyboard. It is simply the fact that they enjoy it so much that they spend a lot of time doing it - hence improving.
I say relax, I remember spending two days to get a dot to bounce around the screen. Not exactly high power...but I spent the time because, uhhh...hmmmm....actually....come to think of it...that damn dot was not that impressive after all!
Programming is about persistence and solving problems, not giving up and breaking down and looking for emotional support on the internet.
Go to sleep.
Rationally assess the situation in the morning and if you really doubt yourself as a programmer and want to give up then figure out your next move.