views:

1753

answers:

24

I've had several false starts in the past with teaching myself how to program. I've worked through several books (mostly C and Python), and end up just learning the syntax without feeling as though I could sit down and actually write a program for myself. When I try to look through the source trees of a project on Codeplex or Sourceforge, I never seem to know where to start reading the code -- the dependencies seem to go in all directions.

I feel as though I'm not learning programming the way it's done "on the street," so I figured I'd take a different approach to asking how a newbie should learn how to code. If you had to learn programming all over again, what are the things you wouldn't do? What did you spend time doing that you now know wasted you weeks or months?

A: 

Standard answer is to make something; picking an easy language to do it in is good, but not essential. It's more the working out stuff in your own head, fixing it because it won't work, that really teaches you. For me, this always happens when I try my eternal dream projects (games) which I never finish but always learn from.

J Cooper
A: 

I think the thing I would avoid is learning a language in isolated snippets that don't really hang together but just teach various facets of a particular language. As others have said, the really hard and important thing is to learn design. I think the best way to do this is through a tutorial that walks you through creating an actual application, teaching design along the way. That way you can learn why certain decisions are made and learn how to accomplish what's needed to implement the design choices.

For example, I found Agile Web Development with Rails to be a really easy way to learn Ruby on Rails, much better than simply reading a Ruby manual or even poking my way around scattered web tutorials.

tvanfosson
+6  A: 

The only way to learn how to program is to write more code. Reading books is great, but writing / fixing code is the best way to learn. You can't learn anything without doing.

Ed Swangren
A: 

After basic language syntax, you need to learn design. Which is hard. This book may help.

S.Lott
Advertising own book, huh?
Wojciech Kaczmarek
I think it's only advertising if there's revenue involved.
S.Lott
+39  A: 

Where I see beginners wasting weeks or months is typing at the keyboard. The computer is very responsive and will cheerfully chew up hours of your time in the edit-compile-run cycle. If you are learning you will save many hours if

  • You plan out your design on paper before you approach a computer. It doesn't matter what design method you pick or if you have never heard of a design method. Just write down a plan while your brain is fully engaged and not distracted by the computer.

  • When code will not compile or will not produce the right answer, if you can't fix it in five minutes, walk away from the computer. Go think about what's happening. Print out your code and scribble on it until you believe it's right.

These are just devices for helping to implement the simple but difficult old advice to think before you code.

When I was learning, I solved countless problems on the 15-minute walk from the computing center to my home. Sadly, with modern PCs we don't get that 15 minutes :-) If you can learn to take it anyway, you will become a better programmer, faster.

Norman Ramsey
+1 for finding bugs on the way to (or in) the restroom.
Jared Updike
...and realizing what the problem was as soon as the computer is off and you're in bed.
Factor Mystic
+3  A: 

You might also want to look at this book, How to Design Programs, for more of a perspective on design than details of syntax.

joel.neely
+21  A: 

I certainly wouldn't start by looking at "real" software projects. Like you say, it's too hard to know where to start. That's largely because large projects are more about their large-scale design than about the individual algorithms or about program flow; for one thing, you're probably looking at a complex GUI application with multi-threading, etc. There isn't really anywhere to "start" looking at the code.

The best way to learn programming is to have a problem you want (need) to solve, and then going about solving it. But most importantly, WRITE CODE. When you read programming books, do ALL the exercises. Make sure you did them right. There's no substitute for writing code. No substitute for screwing up and then fixing it.

Phil
Perfect... No Substitute for screwing up and then fixing it.. I'm still learning that way.. only thing is it costs many sleepless nights :-)
The King
+9  A: 

I just noticed you talked about reading through source trees of other people's projects. Reading other people's code is a wonderful idea, but you must read more selectively. A lot of open-source code is hard to read and not stuff you should emulate anyway. So avoid reading any code that hasn't been recommended by a programmer you respect.

Hint: Jon Bentley, Brian Kernighan, Rob Pike, and P. J. Plauger, who are all programmers I respect, have published a lot of code worth reading. In books.

Norman Ramsey
I prefer READING OTHERS 'bugfixing code'(diff the svn). Then I know what's wrong and what's better.
Dennis Cheung
+3  A: 

The only thing that I did that wasted weeks or months was worry about whether or not my designs were the best way to implement a particular solution. I know now that this is known as "premature optimization" and we all suffer from it to one degree or another. The right way to learn programming is to solve a problem, measure your solution to make sure it performs good enough, then move on to the next problem. After some time you'll have a pile of problems you've solved, but more importantly, you'll know a programming language.

Bill the Lizard
A: 

Another thing that I would avoid is developing code in isolation, that is, not having people look at it as I go along. Getting feedback from a mentor will help keep you on the right track with respect to the choices you are making and the correct use of language idioms.

tvanfosson
A: 

Find a problem in your life or something you do that you just feel could be more efficient and write a small solution to it. It might just be a single script but you will gain much more confidence in your abilities when you start to see useful results of your work. You will also be more motivated to finish it as you are interested in using the solution. Start simple and small and then gradually move up to bigger projects.

And as your working on a small project, focus on building everything with quality. I think this is lost on some programmers who feel that their software is more impressive if it contains a ton of features but usually those features aren't well done or usable. If you focus on building quality solutions to real problems you'll be a fantastic programmer.

Good luck!

Rahul Malik
+1  A: 

Do not learn how to use pointers and how to manually manage memory. You mentioned C, and I spent plenty of time trying to fix bugs that were caused by mixing *x and &x. This is evil...

Find some problem to solve, write or draw a sketch of an algorithm solving the problem, then try to write it. Either use Python (which is much more friendly for beginners) or use C with statically allocated memory only. And use books/tutorials. They offer multiple excercises with solutions, so you can compare yours with them and see other approaches.

Once you'll feel that you can actually write something simple, see some book/tutorial for Object Oriented Design. It's not the best the world has to offer, but it might turn out to be intuitive. If not, check the functional programming (like LISP, Scheme or Haskell languages), or programming in logic (like Prolog). Maybe those will suit you better.

Also - find some mate. A person you can talk to about coding, code maintenance and design. Such person is worth even more than a book.

To all C fans: The C language is great, really. It allows memory usage optimization to the extent impossible in high-level languages as Python or Ruby. The compiled code is also very fast, and is the only choice for RTOS, or modern 3D games engine. But this is not a good entry point for a beginner, that's what I believe.

Oh, and good luck to you! And don't be ashamed to ask! If you don't ask, the answer is much harder to find.

Abgan
Wrong, wrong, WRONG! Please don't go saying things like "don't learn how to use pointers and manage memory." Memory management is a fundamental part of any non-trivial program, even if it's garbage-collected, and remaining ignorant of how it works leads to bloat and memory leaks.
Mason Wheeler
Sure thing. But the beginner will write only programs that you'll call 'trivial'. So let him use plain arrays, and local variables, so he can become familiar with few most common algorithms and THEN he can go and create optimized code with eliminated tail recursion, bitwise operations, inline functions, macros, references, pointers and all that stuff which makes C code so fast. But starting from full-powered-C-code might be compared to 'premature optimization'.But after all - that's just my personal opinion
Abgan
A: 

Work on projects/problems that you already know how to solve partially

Demur Rumed
+1  A: 

I think you should stop thinking you've wasted time so far-- instead I think you're education is just incomplete, and you've taken a step you're not really ready for. It sounds like the books you've read are useful, you're learning the intricacies of the language. It sounds like you're just not accustomed to the tools you'd use then to package that code together so it runs. Some books cover that focus on topics like language syntax, design patterns, algorithms and data structures will never mention the tools you need to actual apply that information. These books are great but if its all you've touched I think it would explain your situation.

What development environment are you using? If you're developing for windows you really should be proficient with creating projects, adding code, running and debugging in Visual Studio. You can download Visual Studio Express for free from Microsoft.

I recommend looking for tutorial like books that actually step you through the UI of development environment you are using. Look for actual screenshots with dropdown menus. Look at what the tutorials walk you through, and if its something you don't know how to do consider buying that book. Preferably it will have code you can copy'n'paste in, not code you write yourself.

I personally don't like these books as I can anticipate how to do new things in VS based on how I'd do other things. But if you're training is incomplete from a tools-usage perspective this could move you in the right direction.

It is probably harder to find these types of tutorial books for Python or C development. There is an overabundance of them for .Net development though.

Frank Schwieterman
And to answer your question directly, my biggest time waster is browsing stackoverflow :)
Frank Schwieterman
I second that, but I can't resist :)
Otávio Décio
+16  A: 

Stack Over F.. wait no, heh.

The biggest time-sinks for me are generally in respect to "finding the right answer." I often find that I will run into a problem that I know how to solve, but feel that there is a better solution and go on the hunt for it. It is only hours/days later that I come to my senses and realize that I have 7 instances of Firefox, each containing at least 5 tabs sprawled out across 46" of monitor space that I realize that I've been caught in the black hole that is the pursuit of endless knowledge.

My advice to you, and myself for that matter, is to become comfortable with notion of refractoring. Essentially what this means (incase you are unaware) is you come up with a solution for a problem and go with it, even if there is quite likely a better way of doing it. Once you have finished the problem, or even the program, you can then revisit your methodology, study it, and figure out where you can make changes to improve it.

This notion is hard for me to swallow, as I was always one to write a paper once, print, and turn it in. However, in reality, writing code can be thought of very similarly to writing a paper. Simply putting the pen to the pad and pushing out whats on your mind may work - but when you look back over it with a fresh pair of eyes, you will always see something you will want to change, guaranteed.

Chance
+6 if I could. An excellent point. The same thing applies to writing stuff for humans to read: Write write write! Don't start to modify until the entire thing is written.
Artelius
+1  A: 

As someone who has only been working as a programmer for 6 months, I might not be the best person to help you get going, but since it wasn't that long ago when I knew next to nothing, its quite fresh in my mind.

When I started my current job programming wasn't going to be part of my job description but when the opportunity came up to do some programming on the side, I couldn't pass it up.

I spent about 1 month doing tutorials on About.com's Delphi section. As much as people diss about.com, Zarko Gajic's tutorials were simple to understand and easy to follow. Once I had a basic knack of the language and the IDE, I jumped straight into a project exporting accounting data for a program called "Adept". Took me a while but I got there...

The biggest help for me was taking on a personal project. I developed an IRC bot in Java for a crappy 2D game called Soldat. I learnt a lot by planning out and coding my own project.

Now I'm pretty comfortable with Delphi Pascal, SQL, C# and Java. I think, once you get the hang of one OOP language, you can learn the syntax of another language, and it gets a lot easier to catch on.

Simon Hartcher
+2  A: 

There is excellent advice here, in other posts. Here are my thoughts:

1) Learn to type, the reasons are explained in this article by Steve Yegge. It will help more than you can imagine.

2) Reading code is generally considered a hard task. So, it is better to get an open source project, compile it, and start changing it and learn that way, rather than reading and trying to understand.

omermuhammed
A: 

Assuming you have decent math skills try http://projecteuler.net/ It presents a series of problems to solve of increasing dificulty that should be solvible by writing short programs. This should give you experience in solving specific problems with out getting lost in the details of open source projects.

Jared
+3  A: 

Hello,

I can understand the situation you're in. Reading through books, even many will not make you programmer. What you need to do is START PROGRAMMING.

Actually programming is a lot like swimming in my opinion, even if you know only a little syntax and even lesser amount of coding techniques, start coding anyway. Make a small application, a home inventory, an expense catalog, a datesheet, a cd cataloger, anything you fancy.

The idea is to get into the nitty-gritties of it. Once you start programming you'll run into real-world problems and your problem solving skills will develop as you combat them. That's how you become a better programmer everyday.

So get into the thick of it, and swim right through... That's how you'll make it.

Good luck

Cyril Gupta
+2  A: 

I think this question will have wildly different answers for different people.

For myself, I tried C++ at one point (I was about ten and had already been programming for a while), with a click-and-drag UI builder. I think this was a mistake, and I should have gone straight to C and pointers and such. Because I'm just that kind of person.

In your case, it sounds like you want to be led down the right path by someone and feel a bit timid about jumping in and doing something by yourself. (You've read several books and now you're asking what not to do.)

I'll tell you how I learned: by doing plenty of fun, relatively short projects, steadily growing in difficulty. I began with QBasic (which I think is still a great learning tool) and it was there where I developed most of my programming skills. They have of course been expanded and refined since that time but I was already capable of good design back in those days.

The sorts of projects you could take on depend on your interests; if you're mathematically inclined you might want to try a prime number generator or projecting 3D points onto the screen; if you're interested in game design then you could try cloning pong (easy) or minesweeper (harder); or if you're more of a hacker you might want to make a simple chat program or file encryption software.

Work on these projects on your own, and don't worry about whether you're doing things the "right" way. As long as you get it to work, you've learned many things. Some time after you've completed a project you may want to revisit it and try to do it better, or just see how other people have done that sort of thing.

Given the way you seem to want to be led along, perhaps you should find yourself a mentor.

Artelius
+1  A: 

These are some great answers -- especially the advice to learn program design and IDE specifics. Mainly I've been using a text editor for C and IDLE for Python (but switching to IronPython Studio).

My problem has less to do with doing something on my own than with mentally connecting up my understanding of isolated code snippets in books with real-world projects spanning multiple files. The last book I read, Hetland's Practical Python, actually does have some projects in it that I'm working through, and unlike most of the language tutorials I've come across, actually deals with design and testing as much as syntax. So I am making progress (especially through debugging), but I wanted to get some street smart insights into best and worst practices. Thanks to everyone.

This is not an answer. This is clarification of your question. Please put additional details into the question.
S.Lott
A: 

Perhaps start with a small existing project, and find some thing within it that handles some core part of what it does - then with a debugger, step through it and follow what it's doing from the point where you ask it to do that thing for you.

This helps you in a number of ways. You start to better grasp all of the various things that are touched by the code as it attempts to complete its request. Also, you learn invaluable debugging techniques which it seems like far too many developers lack - while you can often eventually discover what is wrong either with repeated printf() (or equivalent) calls, if you can debug you can solve issues an order of magnitude faster.

I have found that conceptually, a great mental model for understanding programming in the abstract is a pattern of data flow. When a user manipulates data, how is it altered by a program for digestion and storage? How is it transformed to re-present to the user in a form that makes sense to them? Fundamentally code is about transformation of data, and all code can be broken down into constructs of various sizes whose purpose is to alter data in one way or another, bugs forming around the mismatch between what the programmer was expecting from the data, how high level libraries the coder is using treat the data, and how the data actually arrives. Following code with a debugger helps you fully understand this transformation in action by observing changes as they occur.

Kendall Helmstetter Gelner
A: 

You should read Mike clark's article : How I Learned Ruby. Essentially, he used the test framework for Ruby to exercise different elemnents of the languages.

I used this technique to learn python and it was very, very helpful. Not only did i learn the language, but I was very proficient in the test framework for Python at the end of the excercise. Once you have the basics you can start reading code and then working on building some larger project.

MikeJ
A: 
  1. Go after the function named main
  2. insert a printf("Yehaa!\n");
  3. look for next function.
  4. goto 2.
Flinkman