I know some programming. I know little bit of Java, I know some C#, I know some GW Basic. I've followed those 30 minute Ruby, Python tutorials and so on. I took some computer courses in college but didn't take them very seriously at that time. After I finished school, I got an IT job but my luck (or bad luck) I ended up doing non-coding work (requirements analysis, business analysis, project management etc.). I changed jobs and I now work in a "software configuration management" so although the job is technical, I don't really have to code. I just debug people's build files (ant, maven), help people with check-in/check-outs and make sure their project builds on our build-box. I've been doing this for 4 years now and my official title has been "Senior Developer" all this while. So, I kind of feel like an imbecile because I am not really a developer. I haven't yet learned the art of programming.
So, I'd like to get started and teach myself some real world programming. Right now, I can read and understand overall code and make small hacks. But I start sweating when I click "new" in text editor and it opens an empty file. I don't know how to begin programming, how to approach problems? I don't even know syntax of the top of my head. When I am hacking someone else's code, it's easy to change values, modify loops, throw some if/else statements and make whatever changes are required. But writing a complete program from scratch makes me sweat.
So, how do I learn programming? Ideally, it'd be nice to just start working as a junior programmer under a senior programmer but that's not the choice I've right now. Is there a site or some place where I can volunteer and do small work for a proficient/expert programmer for free? Somewhere I can get myself paired as a virtual apprentice (sort of) to a virtual coding-mentor? The mentor can throw some work at me every day and I'd complete it during the day and email the results in the evening. First few weeks, I would not be very productive. I would probably email my coding-mentor a lot of times throughout the day to ask questions/clarifications. But as I learn and absorb more knowledge from my coding-mentor, I'd get more productive and my work would be more and more valuable to my mentor.
This way, I would learn good coding habits/style, some good pointers on how to approach a problem, and I would be helping me mentor in real-world problems so I'd get real-world exposure. Eventually, I'd develop my own style.
I'd prefer to start in Ruby or Python and I'd prefer web-development track. But I will take whatever I can get. The idea is to become better at programming in general. Preference is web development though. I am not really a novice in the world of programming. I am , well, I don't know the word for my skill level.
EDIT: I've followed some beginner books. I've written basic Fibonacci series programs, small games, created to do lists etc. That's what I meant when I said I know some programming. But I can't seem to be able to go further than this. I've done beginner tutorials for several languages But these books/tutorials get boring after a while. Probably because a) it seems pointless to do problems in the book because it's not real-world code, and b) I don't get to pick brains of an expert in real-time -- I mean, the book is not interactive. The questions/doubts that popup in my head at the time of reading the book are usually not answered by the author as such.
I guess I learn better when I am shadowing an expert. Asking questions in real time. I like it when someone catches a rookie mistake in my code and then tells me why it is rookie and how I should/could have thought about the problem.
As for language: I don't mind any language. Ruby is fine, Python is fine, C# is fine, Java is fine. But I'd prefer to learn web-development track. So, Ruby/Python both are preferred. Java/C# not so much. I don't mind doing C++ either but I'd prefer to stay in garbage-collected OO world. Whatever my virtual-mentor (if I find one) decides to use is good for me. The idea is to get better at programming and to develop a programming mindset.