views:

271

answers:

12

I'm really interested in becoming a serious programmer, the type that people admire for hacker chops, as opposed to a corporate drone who can't even complete FizzBuzz.

Currently I've dabbled in a few languages, most of my experience is in Perl and Shell, and I've dabbled slightly in Ruby.

However, I can't help but feel that although I know bits and pieces of languages, I don't know how to program.

I'm really in no huge rush to immediately learn a language that can land me a job (though I'd like to do it soon), and I'm considering using PLT Scheme (now called Racket) to work through How to Design Programs or Structure and Interpretation of Computer Programs, essentially, one of the Scheme classics, because I have always heard that they teach people how to write high-quality, usable, readable code.

However, even MIT changed its introductory course from using SICP and Scheme to one in Python.

So, I ask for the sage advice of the many experienced programmers here regarding the following:

  • Does Scheme (and do those books) really teach one how to program well? If so, which of the two books do you recommend?
  • Is this approach to learning still relevant and applicable? Am I on the right track?
  • Am I better off spending my time learning a more practical/common language like Python?
  • Is Scheme (or lisp in general) really a language that one learns, only to never use? Or do those of you who know a lisp code in it often?

Thanks, and sorry for the rambling.

A: 

Asking whether an approach to learning is relevant and applicable is tricky - there are many different learning styles, and it's a matter of finding out which ones apply to you personally. Bear in mind that the style you like best might not be the one that actually works best for you :-)

You've got plenty of time and it sounds like you have enthusiasm to spare, so it's not a matter of which language you should learn, but which one you should learn first. personally, I'd look at what you've learnt so far, what types of languages and paradigms you've got under your belt, and then go off on a wild tangent and chose one completely different.

Andy
A: 

I started programming at a very very young age. When I was in high school, I thought I was a good programmer. That's when I started learning about HOW and WHY the languages work rather than just the syntax.

Before learning the how and why, switching to a new language would have been hell. I had learned a language, but I hadn't learned to program. Now that I know the fundamental concepts well, I can apply them to virtually any language and pick it up with ease.

I would highly recommend a book (or even a school coarse, if you can afford it) that takes you through the processes of coding without relying on a specific language.

Unfortunately I don't have any books to recommend, but if others agree with me and know of any, maybe they can offer a suggestion.

//Edit: After re-reading your question, I realize that I may have not actually answered any of them... Sorry about that. I think picking up a book that will take you in-depth with best-practices would be extremely helpful, regardless of the language you choose.

Eclyps19
+11  A: 

If you want to learn to really program, start doing it. Quit dabbling and write code. Pick a language and write code. Solve problems and release applications. Work with experienced programmers on open source projects, but get doing. A lot.

Adam Crossland
+1, How do people get good at the guitar? Dancing? Pole vaulting? Anything? They do it, a lot. Programming is no different.
Matt Greer
Exactly. They say "[area code ninja knows well] is language-agnostic", and it's true. I may have learnt more from programming in that severely limited Pascal-spinoff XForce (an open source game I contribute scripts etc to) uses as scripting language than from any other language, excluding Haskell/ML - not very pleasant to use, but hey, if I you can build a challenging AI in that language (I can't :D), you can do in other languages as well.
delnan
A: 

There are basic programming concepts (logic flow, data structures), which are easily taught by using languages like Python. However, there are much more complex programming concepts (design patterns, optimization, threading, etc.) which the classic languages don't abstract away for you.

If your search for knowledge leans more toward algorithm development and the science of programming, start with C. If your search is more for a practical ends, I hear Ruby is a good starting point.

TreDubZedd
A: 

Start coding in C. It should be a horror for you at first, but this teaches you most important stuff like: pointers, recurrence, memory management. Try reading some classic books about programming like The Art of Computer Programming by Donald Knuth. After you master that, you can think about learning object oriented programming or functional programming. First basics. If fou manage to learn them, nothing will be hard for you ever again.

gruszczy
This is horrible advice! Most people can't get through 1 chapter of AOCP, let alone master all the content.
kirk.burleson
Yeah, well, I wouldn't hire such person really, neither we do at my company :-)
gruszczy
Luckily, reasonable people can differ on what they consider to be 'the important stuff'.
Gregg Lind
+1  A: 

I agree with gruszczy. I'd start programming with C.

It may be kind of scary at first (at least for me :S ) but in the long run you'd be grateful it. I mean I love Python, but because I learned C first, the learning curve for other languages wasn't very steep at all.

Start with C and make it so.

Just remember to practice, because you'll never improve at something by doing nothing. ;)

townsean
+6  A: 
  • Does Scheme (and do those books) really teach one how to program well? If so, which of the two books do you recommend?

Probably. Probably better than any of the Learn X in Y Timespan books.

  • Is this approach to learning still relevant and applicable? Am I on the right track?

Yes.

  • Am I better off spending my time learning a more practical/common language like Python?

Only if you plan to get a job in it. Scheme will give you a better foundation though.

  • Is Scheme (or lisp in general) really a language that one learns, only to never use? Or do those of you who know a lisp code in it often?

I do emacs elisp fiddling to adjust my emacs. I also work with functional languages on the side to try to keep my mind flexible.

My personal opinion is that there are essentially two tracks that need to be walked before the student can claim to know something about programming. Track one is the machine itself, the computer. You should start with assembly here and learn how the computer works. After some work and understanding there - don't skimp - you should learn C and then C++; really getting the understanding of resource management and what really happens. Track two is the very high level language track - Scheme, Prolog, Haskell, Perl, Python, C#, Java, and others that execute on a VM or interpreter lie in this area. These, too, need to be studied to learn how problems can be abstracted and thought about in different ways that do not involve the fiddly bits of a real computer.

However, what will not work is being a language dilettante when learning to program. You will need to find a language - Scheme is acceptable, although I'd recommend starting at the low level first - and then stick with that language for a good year at least.

Paul Nathan
I'll second this: I learned a huge amount from Scheme, Emacs Lisp and Perl about best practices and abstraction, but spending a lot of time doing a real project in C really helped me know how the computer works and why things are the way they are. Now I'm better at both kinds of programming. I'm a better C programmer for having learned a lot with Scheme, and a better Scheme programmer for learning a lot with C. Also hugely important is having a real project: you must have the right motivation.
Joel J. Adamson
I don't know, I found it more useful to learn programming paradigms and abstractions earlier than low level things like C. I mean I've done both and felt they both helped me tremendously, but I think you don't appreciate all the low level implementations until you learn how to think of a problem analytically. When you're learning C first, it seems like you are just learning about the machine for the sakes of learning about the machine, but when you learn the abstractions first, you are learning about the machine in order to solve a **problem**. That always made it better for me
Xzhsh
+1  A: 

I'd say it depends on what you want to do.

If you want to get into programming, Python is probably better. It's an excellent first language, resembles most common programming languages, and is widely available. You'll find more libraries handy, and will be able to make things more easily.

If you want to get into computer science, I'd recommend Scheme along with SICP.

In either case, I'd recommend learning several very different languages eventually, to give you more ways to look at and solve problems. Getting reasonably proficient in Common Lisp, for example, will make you a better Java programmer. I'd take them one at a time, though.

David Thornley
+1  A: 

The best languages to start with are probably:

  • a language you want to play/learn in
  • a language you want to work in

And probably in that order, too, unless the most urgent need is to feed yourself.

Here's the thing: the way to learn to program is to do it a lot. In order to do it a lot, you're going to need a lot of patience and more than a little bit of enthusiasm. This is more important than the specific language you pick.... but picking a language that you like working in (whether because you like the features or because you feel it'll teach you something) can be a big boost.

That said, here's a couple of comments on Scheme:

Does Scheme (and do those books) really teach one how to program well?

The thing about Scheme (or something like it) is that if you learn it, it'll teach you some very useful abstractions that a lot of programmers who don't ever really come to grips with a functional programming language never learn. You'll think differently The substance of programming languages and computing will look more fluid to you. You'll have a better idea of how to compose your own quasi-primitives out of a very small set of primitives rather than relying on the generally static set of primitives offered in some other languages.

The problem is that a lot of what I'm saying might not mean much to you at the moment, and it's a bit more of a mind-bending road than coming into a common dynamic language like Perl, Python, or Ruby... or even a language like C which is close to the Von Neumann mechanics of the machine.

This doesn't mean it's necessarily a bad idea to start there: I've been part of an experiment where we taught Prolog of all things to first-time programmers, and it worked surprisingly well. Sometimes beginner's mind actually helps. :) But Scheme as a first language is definitely an unconventional path. I suspect Ruby or Python would be a gentler road.

Is Scheme (or lisp in general) really a language that one learns, only to never use?

It's a language that you're unlikely to be hired to program in. However, while you're learning to program, and after you've learned and are doing it in your free time, you can write code in whatever you want, and because of the Internet, you'll probably be able to find people working on open source projects in whatever language you want. :)

Weston C
+4  A: 

The most important parts of Scheme are the programming-language concepts you can pick up that modern languages are now just adopting or adding support for.

Lisp and Scheme have supported, before most other languages, features that were often revolutionary for the time: closures and first-order functions, continuations, hygienic macros, and others. C has none of these.

But they're appearing more and more often in programming languages that Get Stuff Done today. Why can you just declare functions seemingly anywhere in JavaScript? What happens to outside variables you reference from within a function? What are these new "closures" that PHP 5.3 is just now getting? What are "side effects" and why can they be bad for parallel computing? What are "continuations" in Ruby? How do LINQ functions work? What's a "lambda" in Python? What's the big deal with F#?

These are all questions that learning Scheme will answer but C won't.

erjiang
+1  A: 

I hate to tell ya, but nobody admires programmers for their "hacker chops". There's people who get shit done, then there's everyone else. A great many of the former types are the "corporate drones" you appear to hold in contempt.

Now, for your question, I personally love Lisp (and Scheme), but if you want something you're more likely to use in industry "Beginning Python" might be better material for you as Python is found more often in the wild. Or if you enjoy Ruby, find some good Ruby material and start producing working solutions (same with Java or .Net or whatever).

Really, either route will serve you well. The trick is to stick with it until you've internalized the concepts being taught.

Shaun
A: 

To a specific point in your question, the "classics" you mention will help you with exactly what the titles say. SICP is about the structure and interpretation of computer programs. It is not about learning Scheme (though you will learn Scheme). HtDP is about how to design programs, it is not about learning Scheme (though you will learn Scheme).

Scheme, in principle, is a very small and concise language with almost no gotchas. This makes it excellent for moving on to learning how to structure and interpret programs, or how to design them. More traditional "practical" languages like C, C++, Python, or Java do not have this quality. They are rife with syntax. Learning with these languages means you must simultaneously learn syntactical quirks while learning to think like a programmer. In my opinion, this is unfortunate. In some cases the quirks are good, in others they are accidents of history, but in all cases it is unfortunate.

anonymous