views:

304

answers:

11

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.

A: 

writing a complete program from scratch makes me sweat. So, how do I learn programming?

By starting on very simple problems. Write a program that asks the user for his name and then reverses that name. Calculate fibonacci numbers. Write simple sorting algorithms. Then write tic tac toe or something. You must program "in the small" before diving into programming "in the large".

Your virtual mentor will probably be a beginner's book. They are normally quite good at asking questions ;-) Have you settled on a particular language to learn programming in?

FredOverflow
[Project Euler](http://projecteuler.net) is an excellent place to start.
Greg Hewgill
@Greg: I agree, Project Euler is awesome to learn problem solving.
FredOverflow
@Greg I also agree, project euler is nice. But, its not only related on programming but also on math afaik.
InsertNickHere
+1  A: 

Start simple project which will be very interesting and passionating for you. It might be your website, simple online game, some simple application like another twitter clone or something you think is interesting. This is the best way to get motivation for learning programming!

I not advice books if you are not self motivated enough. Putting your hands into practice it is the most natural way to learn something new and it gives a lot of satisfaction!

Another thing is to find some programming 'guru'. It doesn't have to be real guru but at least someone better than you so you can ask him and get some useful advices.

EDIT: I recommend Django tutorial, it takes about hour (don't remember exactly) and it gives you a lot of knowledge that is enough to start your won web project. (Django is a web framework based on Python language).

Lukasz Dziedzia
A: 

Just get you a well defined (small) problem what you want to solve. If you want to do web dev, it could be interesting to get started with GWT. They have some nice "how tos". Its not the language you told, but I think it will help.

InsertNickHere
+1  A: 

Hi AspiringGuru,

Great question. The best place to start is to buy a couple of really good books that do not make programming look like rocket science. I would strongly recommend The Algorithm Design Manual by Skiena as the book of choice for learning data structures and algorithms.

Once you have your basics in sight, you may want to look into one of the several available open source projects. You are familiar with ANT, Maven etc and I am guessing you would know SVN or Git too. Why not begin by signing up for small bug fixes and developments of these software that you already understand a fair bit? You could even suggest enhancements since over time you perhaps know of what these pieces can do better.

Good luck.

Fanatic23
+2  A: 

The easiest solution (in my opinion), is to buy a decent programming book.

Speaking from my own experience,

Most of the books for Object Oriented languages have step by step examples of building fully functional applications, and will quickly help you turn that blank document into a program.

After you've read one or more of those books programming will get a lot easier and you will even pick up new languages more easily. It's not about the examples in the book being 'pointless' it's about how a problem is approached and solved, if you understand those principles building applications gets a lot easier. good luck.

Mervin
+1  A: 

In my experience, the only way to learn to program is to do it. Find small things you want to do and figure out how to write programs to do them. Find people who can critique those programs. Rinse, wash, repeat.

People can tell you good books to learn things, and they will definitely be useful. But they are no substitute for actually writing programs. In fact, the best books will encourage you to write your own programs and experiment with what they're teaching you.

In my opinion, most universities completely fall down in teaching people to program. They almost all treat programming as a science/engineering discipline. And it is, in a way. But it's also an art. Things that are both an art and engineering tend to get called a craft. And that's what I think programming is. Good programming is good craftsmanship.

It sounds like you're aware of this already though. :-)

I remember SourceForge having an area where projects could advertise for the kind of help they needed. You might look there. Also, if you're a student, you might qualify to be a Google Summer of Code intern. They insist on having a project mentor for their interns, and so that might also get you what you need.

In general, picking an Open Source project with a good community and making significant contributions (i.e. not little bugfixes, but serious new features) is a really great way to get the kind of feedback that will improve your programming.

Omnifarious
+2  A: 

My recommendation is to come up with a significant program you want to make, something a bit more in-depth than solving Project Euler problems. Once you have a goal in mind, then you can start learning how to apply the specific language knowledge you have into building software, which is a skill unto itself. Keep it fun and interesting to you.

JimDaniel
+1  A: 

I would thoroughly recommend reading Code Complete. It teaches you all the ins and outs of how to actually write good code, confidently. Once you've read it you won't look at a blank text file in the same way, I promise!

Skilldrick
+1  A: 

Try Dive Into Python. You can get it for free. It is not for beginners but for "experienced programmers". It seems you fit the bill. I think the examples are very nice. For instance, this example parse a directory with MP3 files, and output the metadata of each file.

Alejandro
A: 

Let's write a very simple CM system. The specification goes here. I prefer PHP, because it's accessible near everywhere, and it has C-like syntax, like other pouplar languages, as C/C++, JAVA, or JavaScript. Also, it has good documentation on-line available (you'll find it).


So, this "project" is a usual 5-page corporate static site. The content is stored in text files, the HTML code (template) is separated from the code.

1. The design file contains the HTML code:

> <HTML>
>   <BODY>
>     some design...
>     #kontent
>     ...some design...
>     <hr> Link section: <br>
>     #links
>     ...some design
>   </BODY>
> </HTML>

2. There are a folder, with content files. They are simple text files, e.g.:

  • welcome.txt
  • about.txt
  • jokes.txt

    Fill them with some content.

3. The "CM sytem" is the index.php, which performs the following tasks:

  • loads the design.html template from a file,
  • checks URL paramter "page" and determines, which page to "show", if the URL parameter is empty, or the file does not exist, the default page is "welcome.txt"
  • replace the "#kontent" in the template with the text file read,
  • scan the folder, where txt files are,
  • make a link with each of them, where "jokes.txt" is the name of the file:

    <a href="index.php?page=jokes.txt"> jokes.txt </a> <br>

  • join them,
  • then replace the "#links" in the template with joined links made,
  • display the result.

I recommend it, because:

  • It requires no special things, like SQL server. Even a free hosting with PHP support will be enough.
  • You'll have to look after: how to read a directory, how to read a parameter, how to run a PHP program. Later, if you became a real programmer, this will be an everyday routine.
  • If you pick up a free template somewhere, your "site" will be professional looking.
  • Later you can enhance your system: e.g. you should change two line feeds int the txt files to <br> and "--" to <hr> or you can use more sophisticated HTML snipplets, so you can format the content without using HTML tags in the txt (this is about how WIKI-like systems work).
  • You should implement template change function.
  • It's a real-life problem. This small site runs on a very same "engine" I've described above http://szepitohaz.hu/
ern0
+1  A: 

We do free Ruby beginner courses (8 weeks) at RubyLearning.org, where you learn together with other students and us mentors:

http://rubylearning.org

The next course starts this weekend, but you also can join at a later stage, the forums stay open for 30 days after the course finishes :-)

Michael Kohl