As a newbie, I am overwhelmed by the amount of information out there and the amount of self-direction that one needs to develop as a programmer. How did you get oriented in the programming world? Are textbooks really the way to go? Or is it best to find a mentor? Was there some sort of guide or should there be some sort of universal guide to follow when trying to improve programming skills?
It needs to be a labor of love. Why do you want to be a programmer? Do you want to make cool video games? You have a great idea for a mobile app? You want to be able to build amazing web applications? Dive deep into math?
If you don't know the answer, then give it some thought and then explore how to make it happen. Books, blogs, etc are great, but there's no substitution for reading and writing code. Create a GitHub account and look for projects in the domains you're interested in. Try to learn from that code. Then try to write some code yourself.
If the reason you want to program is to get a good job or make good money, stop now and reassess, because without a love for it, you'll probably never have either. The majority of professionals who got in it because it was a solid career path but without any love for software in general are not particularly happy with their work or particularly good at their jobs. Becoming a good programmer takes effort at your job and in your spare time - it has to be the thing you like to do whether you're getting paid for it or not. If it's not that thing for you, then think about doing something else.
There are so many problems to be solved in computer science that there really isn't such thing as an excellent general programmer across all domains. I know guys who write cutting-edge graphics software but have no idea how to write a web application.
Why did you get interested in the first place? Focus on that and start writing some software, no matter how trivial, as soon as possible, and you'll be on the right track.
As a self taught programmer I went through a similar period. There is way too much out there to master everything. Find an area that you enjoy and start at the beginning. Eventually you will learn quite a bit purely out of necessity if you are motivated and stick with it.
Nothing worth doing is easy, and becoming a competent anything takes a lot of time and practice. Take it slow and spend the time to learn each concept you come across at a deep level before moving on and soon enough you'll come to find that you actually know quite a bit.
I feel for you :-) We old farts had it much easier
However, you have a tremendous advantage that we did not have: Amazon and the WWW. In the old days information was hard to come by. It came in books, and you had to look hard for them. Compuserve helped a little later on. Now any book in the Amazon bookstore can be at your doorstep the next day.
Software was not free back then. Now you can download any number of development IDEs and compilers for free (Visual Studio, Eclipse, NetBeans for instance). You can download and install dozens of database servers (Oracle, MySQl, SqlServer, Postgres, etc...)
And the WWW has tons (too much perhaps) of information and resources such as stackoverflow, where you can get questions answered from someone halfway around the world.
At this stage, and assuming you want to eventually monetize your knowledge, you have to specialize (breadth will come later with experience):
desktop client or web application?
C# or Java?
MS SQLServer or Oracle?
Once you decide on these questions (and you can always change later), then you can then intelligently ask how do I get started with "web application development with C# and SQL server"?
If the beginner has a good "preface statement" before opening a tool, they can often eliminate overwhelm by nipping it in the bud.
I was hired as an instructor for company teaching programming to complete noobs. (I use "noobs" as a term of endearment, aren't we all, in more areas than not?) When I say complete noobs, I'm serious. One first question I got was: "when you say Right Click, what do you mean?"
One of the first things I learned, was to keep the tone of my voice exactly the same, regardless of how often that question had been asked, and regardless of how noobish it was. I learned to answer each question, as if it were equally valid, equally exciting, and equally valuable -- and as if it were the first time that question had ever been asked.
The Overwhelm-Eliminating preface statement I use, for any tool, goes like this: There is only one icon you will click on the opening screen -- at least for now. This tool you are about to open, wasn't built just for you, nor just for this task we are about to accomplish. The developers of this tool had to build it for a lot of people, who wanted to do a lot of things, and they had to include capability you will never use. That clutters things up. So you'll see a plethora of buttons and menu items, and anything you click may give you a new plethora of options. But every time you open this tool, in three clicks you can be doing what you want. I'm going to show you that easy secret path through the jungle of useless options."
Unfortunately, I didn't always get to say any kind of preface before one of my students opened something that looked complicated. I could tell, because statements would start to come out of that student's mouth, like: "I just wasn't cut out for SQL" or "I just don't have what it takes to be a Java programmer," or my one of my favorite lies: "Crystal Reports is just too hard for me to learn." What a crock! Lies, decided (and believed) in a moment of frustration, because they thought the tool was a huge forest, when really all they needed was to get to one of the treehouses, in one of the trees.
Here are a few of my preface statements I have used over the years:
There are only 9 basic concepts you need to know, to be a programmer. They are each easy to learn. Every programming language allows you to implement these 9 concepts using a slightly different syntax. As you learn these concepts, and play with some different languages, you don't just become a C++ programmer, you become Programmer, who can program in any language, including (but not limited to) C++.
Every task you want to do, can be broken down into single steps. Even those long complex lines of code, or complicated-looking command lines, are just made up of very easy to understand single steps. If you have a complicated task, just prove one step at a time, verifying each result, then start putting them together, one combination at a time, verifying each combination, until it is complete.
Excellent programmers aren't really excellent programmers. They are excellent debuggers. If you don't get an error when you first compile, you should be worried. If you do, you're on the right path; you can start doing what you love.
Find your "heierarchy of resources" and use it. Mine looks like this: If I need to do something, I try it. If it doesn't work, I experiment for a few minutes. If that doesn't work I use the Help file. If that doesn't work I use a web search. If that doesn't work I turn to the closest programmer next to me, and bounce it off them. If that doesn't work I call one of my friends, who is (or knows) and expert. If that doesn't work I hire somebody on one of those freelance sites, to teach me how to do it. I've only gotten to that last step twice in my life. [Learning this skill, kept the students from assigning me as their primary source for solutions.]
Learning to learn, is more important than learning any subject. Learning to love learning is more important than learning any subject. If it takes you awhile to find your answers on the web, find a good tutorial on the web that teaches you how to do excellent web searches.
Because Visual Studio Express is free, and you can drop a button on a window, and make it say "Hello World" in just a few moments, many Windows programmers start there. When you are learning, if you start with VB, at least also write the same program in C# at the same time. Preferably also Java and a couple of other languages as well. And it would be smart to also write it in at least one language that is command line based, like TCC (Tiny C Compiler.) I highly recommend using multiple languages, for each learning project, until you realize it's not the language you are learning, it's the programming. Otherwise you can end up limiting yourself and getting stuck in a mindset that isn't true.
When asked if you can do something, the answer is unequivocally "yes." Learn to trust your learning skills enough to be able to say "yes" and mean it -- Then start learning.
If you're not making mistakes, you aren't learning. Celebrate them. Then fix them.
Enjoy the full process of learning. Enjoy working out the bugs. Become an expert.
I have many more of them, but it may be enough to know that, if you are frustrated, it's not the subject matter, nor the concepts, nor the tools, that are the problem. And it's not you, nor your intelligence, nor your ability, that is the problem. The problem is simply the way you are looking at it.
With the right perspective, nothing is overwhelming.
My suggestion for a couple of patterns to get to know that may help you a great deal:
There isn't a universal guide to being a programmer as each person has their own way of putting together all the pieces of how to program and how to make it work well for them. Some people may like a top-down approach and others may be more bottom-up. Which works better for you is something you have to figure out for yourself.
Of textbooks or mentors, you have to find what works for you. Multiple intelligences may be worth exploring if you want help figuring out how you learn. Mypersonality.info has tests that may help get to know how you learn that is really the secret sauce from my view on what is probably my top tip about surviving in the programming world.
A key point to remember is what are you trying to learn now. Are you trying to learn everything? That is a fruitless endeavor as I see it but if you want to try to go down that road, good luck. There is also the question of where are you now and what kinds of steps may make sense depends a lot on where you are. For example, if you are in Canada or the U.S. and not even in high school, I'd argue suggestions are likely to be quite different than someone who already has a Ph.D. and wants to get into the field just to take a couple of different extremes.
If that doesn't help a lot, you may need to supply more details to help us narrow down what advice to give as what you ask is a rather general question with tons of different possible answers, many of which may not be appropriate in your case.
You're right, there is a lot to learn, and because of it there's not really an 'guides' that I'm aware of or anything of the sort. For me it was (and still is, 3 years later): sink or swim learning. Coming out of school, I knew less than what I would now consider the bare minimum... so I figured out what I had to do in order to complete the goals set forth by the company that I worked for and I hauled ass to get up to speed on everything I had to get done and the tools/technologies involved.
Now, I still do the same thing... it's just a bit easier because my knowledge/skill baseline is a wee bit higher.
If you're asking what particular resource to use when learning new things... it totally depends on what you're trying to learn. That said, teamwork and mentoring have been the best help I've received so far for every day and 'undocumented features' kinds of things. In depth knowledge comes from books, and 'gotcha' type stuff is usually googled.
A mentor is probably good but it's also overkill I think. There are many guides and ways to get started, as I'm sure you know.
I've been recommending this book to people who want to get started but aren't sure on where to start.
Hopefully it will help you also.
1. Have goals.
Our brains are smart. They don't want to waste energy learning pointless things. If you don't have goals, you won't have a drive to program. You have to want to do something that there is no existing software to build. This will give you the incentive to learn. If you don't have goals, the rest is a waste.
2. Migrate to a developer friendly operating system.
IME Windows is not developer friendly. It is designed to cocoon the user in a gui that hides the underlying mechanism of how things work. So if you use Windows, it is best to learn a Unix based operating system. For example, Ubuntu or other Linux, Mac OSX, or a BSD (e.g. FreeBSD).
All the programming wizards I knew in college used Linux on their home PC, without exception. This was back in the late 1990s, so it was no small feat. I wanted to be like them, and eventually Ubuntu made it easy enough that I could overcome my own Windows induced laziness. So I recommend migrating to Ubuntu, and hanging out on ubuntuforums. Likely, you will need to migrate fully. If you must run Windows, have it be from VM in your Ubuntu box (e.g. Virtualbox).
In getting your Ubuntu box setup the way you want it, make google site:ubuntuforums.org your friend. Often the answer involves the command line or scripting. Scripting is a valid form of programming, and often the best choice in the systems administration domain. This will give you more familiarity with getting your hands dirty. If you hang out on those forums, you will also read tips on how to solve particular problems, so it seems less daunting.
The other reason why something like Ubuntu is developer friendly, is that you can easily and automatically download and install pretty much any tools (e.g. compiler, interpreter) for any language you want, for free, and probably not even costing any bandwidth if your ISP hosts an Ubuntu mirror. Bang. You're programming. Don't like it? Try another language.
Running Unix on all my computers forces me to get my hands dirty, which gave me confidence to try more, gives me more power, and hence has vastly increased my ability as a programmer.
3. Learn the tools
Learning to use an editor such as vim will give you knowledge to use vi, which is present on every Unix install, and over ssh. This is reason enough to learn it. Additionally, vim is an extremely popular and powerful editor with in-built syntax highlighting for many, many languages. This lowers the barrier to trying new things.
If you have a job programming, that may be the best foundation to build on. If you love to code, it almost doesn't matter what domain you are working in - you simply want a job that allows you to code. Your job will necessarily be one of the main focuses of your life, and you will be accountable for the quality of your work. The job will provide the focus and discipline you are looking for, meaning that out of the uncountable languages, frameworks, libraries, and tools, you will only be using a subset on your job. Master that subset.
Learn the best practices of the languages and frameworks you use on the job. Learn the internals of the OSes. Learn the the tools, learn how to customize them. Learn their keyboard shortcuts. Learn a little, apply it, learn a little more, apply it. A lot (most?) of this learning and experimenting will take place on your own time. Good! You want to have a work/life balance, but if you have a profession that you love, you will want to be learning and getting better at it, and spending your own time learning will seem natural.
Also, ask questions of more experienced developers, the best question being "why?" Ask what tools they use, and what they did to customize them.
As time goes on, you will master your current job, and then you will seek out new challenges; your base of knowledge will grow even more. And so forth. Growing your skill and career is an iterative process.
If your job doesn't allow you to write the sort of programs you want to write, then you probably need to look for a position that will. If you can't change jobs, try joining an open-source project, or create your own labor-of-love.
Books, blogs, and periodicals can help - I've learned a lot from all those sources. But as someone else mentioned, you need to write code to learn to write better code. And that's where either a job or your own "labor-of-love" project comes in. "Toy" programs that scratch the surface of a language/framework are easy to create, but the real learning comes when things get hard and you have to stretch. I find having a project that I am accountable for provides the motivation to keep going when things get hard. Everyone is different, though, so just find something that keeps you at the keyboard when you seem to hit a wall and Google isn't helping.
I've always found it helps to have a list of several projects I want to implement, and to be working on one of them at all times. In general, doing any kind of moderately complex project will force you to learn new things, exercise the things you already know, and sometimes teach you that something you "knew" was wrong.
I've gotta be honest, I left University with a Business and Language degree, and now I'm a professional Web Developer. The honest truth about what I used? Well, I'm extremely visual, and I read a lot, but for some reason I just can't stand textbooks.
Now don't get me wrong, I've tried. I've tried really, really hard. But if textbooks were the only way, I wouldn't be doing what I'm doing right now. That's not to say I've not read books since, but they generally don't tend to be about a specific language, but more about programming in general (e.g. Mythical man month, SICP), or Design in general (e.g. The Smashing Book), and finally, programming culture.
To learn a language, I decided to go with what I knew well. I know Microsoft stuff, and part of my degree did get me building advanced macros using VBA. So I went down the Microsoft route. Head on over to asp.net, and you will find more resources than you may ever need, and constantly expanding.
Head over to Channel 9 (Google Microsoft Channel 9) and you will get a deeper insight into programming today, the current culture... also watch the MIX videos, they tend to be a bit lighter. When you have a good idea, THEN pick up books. Grab language-specific development books (not learn X in 24 hours) and see what you've missed. Grab more in-depth books (e.g. Code Complete) and really, really get into it.
But don't just hold yourself to backend stuff. Head on over to sitepoint, nettuts+ and smashing magazine to get a better idea of what's going on in the frontend. Visit JQuery 4 Designers to really get in-depth on the front end. Once you have a fairly good idea of what's going on, you've followed videos and tutorials, and you understand each stage of the development cycle that suits you, then (if you haven't already), get out there!
Look for local Web Dev meetups. One of the greatest things I can recommend is looking at the small businesses around you. Does a relative, close friend or someone you meet frequently with own a business that uses Excel or even Access to do their work, but inefficiently, and wouldn't mind a hand building something to lighten the load, or automating one of their processes, or setting up a web presence? Do you attend a religious institution? Look into doing some web development or design for them.
Basically, what it boils down to is learning to program is like learning a foreign language. Learning from a textbook will barely teach the basics. Learning from other people will give you a much greater grasp and understanding. People will talk about things like methods or functions, variables, inheritance, encapsulation and generics. You will too, when you hear it enough and understand it. Just learn, then go back and find out what you missed from the textbooks later.
Lastly, make sure you learn about standards once you get a good grip of things. It's difficult to unlearn your own bad habits, but for most people that's how they learn, through habit. You can unlearn a bad habit, but if something is too difficult to understand through standards, you'll never get it.
Finally, don't give up. Read plenty of blogs, and keep the inspiration and fun. Watch inspirational videos on MIX, TED and SXSW. Read Coding Horror, Joel on Software and Steve Yegge (from the beginning if possible for these three), as well as Hacker News and Daily WTF. Even add Ted Dziuba if that's your game. The common advice though is just play, take it all in, and have fun. You don't need to be a massive contributor the whole way. Kids aren't professional footballers within 2 years, and nor will you be. But that doesn't stop them playing football. Learn from that and play! That's the only way you'll get good.
1) Appreciate that you can't know everything but you can learn anything.
2) Trust that what you are coding will guide you in what you should be learning.
3) Talk to others but don't feel intimidated by their knowledge. Be confident in your ability to learn.
4) There is always a new thing, but most new things in development are old things re-envisioned. ASP.NET MVC V3 is new, MVC itself was first used in the 70's. You don't need to catch up, just catch it the next time around.